diff --git a/ChessCubing.App/ChessCubing.App.csproj b/ChessCubing.App/ChessCubing.App.csproj
index f9e59d9..dbbd2f6 100644
--- a/ChessCubing.App/ChessCubing.App.csproj
+++ b/ChessCubing.App/ChessCubing.App.csproj
@@ -23,6 +23,7 @@
+
diff --git a/ChessCubing.App/Pages/Home.razor b/ChessCubing.App/Pages/Home.razor
index 95d8a00..7e8f7ee 100644
--- a/ChessCubing.App/Pages/Home.razor
+++ b/ChessCubing.App/Pages/Home.razor
@@ -26,6 +26,7 @@
Ouvrir l'application
Lire le reglement
Ouvrir l'appli d'Ethan
+ Ouvrir l'appli de Brice
diff --git a/Dockerfile b/Dockerfile
index a6b54c8..bf922ee 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -6,6 +6,7 @@ RUN dotnet restore ChessCubing.App/ChessCubing.App.csproj
COPY ChessCubing.App/ ChessCubing.App/
COPY ethan/ ethan/
+COPY brice/ brice/
COPY favicon.png logo.png transparent.png styles.css site.webmanifest ChessCubing_Time_Reglement_Officiel_V1-1.pdf ChessCubing_Twice_Reglement_Officiel_V2-1.pdf ./
RUN dotnet publish ChessCubing.App/ChessCubing.App.csproj -c Release -o /app/publish
diff --git a/brice/.gitignore b/brice/.gitignore
new file mode 100644
index 0000000..3609bb4
--- /dev/null
+++ b/brice/.gitignore
@@ -0,0 +1,25 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+.DS_Store
+
+# Generated by package manager
+node_modules/
+
+# Generated by Cordova
+/plugins/
+/platforms/
diff --git a/brice/config.xml b/brice/config.xml
new file mode 100644
index 0000000..b7bb4d0
--- /dev/null
+++ b/brice/config.xml
@@ -0,0 +1,13 @@
+
+
+ Hello Cordova
+
+ A sample Apache Cordova application that responds to the deviceready event.
+
+
+ Apache Cordova Team
+
+
+
+
+
diff --git a/brice/package-lock.json b/brice/package-lock.json
new file mode 100644
index 0000000..eed1cce
--- /dev/null
+++ b/brice/package-lock.json
@@ -0,0 +1,897 @@
+{
+ "name": "org.apache.cordova.hellocordova",
+ "version": "1.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "org.apache.cordova.hellocordova",
+ "version": "1.0.0",
+ "license": "Apache-2.0",
+ "devDependencies": {
+ "cordova-android": "^14.0.1"
+ }
+ },
+ "node_modules/@netflix/nerror": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@netflix/nerror/-/nerror-1.1.3.tgz",
+ "integrity": "sha512-b+MGNyP9/LXkapreJzNUzcvuzZslj/RGgdVVJ16P2wSlYatfLycPObImqVJSmNAdyeShvNeM/pl3sVZsObFueg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "assert-plus": "^1.0.0",
+ "extsprintf": "^1.4.0",
+ "lodash": "^4.17.15"
+ }
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@xmldom/xmldom": {
+ "version": "0.8.11",
+ "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz",
+ "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/abbrev": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz",
+ "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/android-versions": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/android-versions/-/android-versions-2.1.0.tgz",
+ "integrity": "sha512-oCBvVs2uaL8ohQtesGs78/X7QvFDLbKgTosBRiOIBCss1a/yiakQm/ADuoG2k/AUaI0FfrsFeMl/a+GtEtjEeA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "semver": "^7.5.2"
+ }
+ },
+ "node_modules/ansi": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.1.tgz",
+ "integrity": "sha512-iFY7JCgHbepc0b82yLaw4IMortylNb6wG4kL+4R0C3iv6i+RHGHux/yUX5BTiRvSX/shMnngjR1YyNMnXEFh5A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/big-integer": {
+ "version": "1.6.52",
+ "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz",
+ "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==",
+ "dev": true,
+ "license": "Unlicense",
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/bplist-parser": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz",
+ "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "big-integer": "1.6.x"
+ },
+ "engines": {
+ "node": ">= 5.10.0"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cordova-android": {
+ "version": "14.0.1",
+ "resolved": "https://registry.npmjs.org/cordova-android/-/cordova-android-14.0.1.tgz",
+ "integrity": "sha512-HMBMdGu/JlSQtmBuDEpKWf/pE75SpF3FksxZ+mqYuL3qSIN8lN/QsNurwYaPAP7zWXN2DNpvwlpOJItS5VhdLg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "android-versions": "^2.1.0",
+ "cordova-common": "^5.0.1",
+ "dedent": "^1.5.3",
+ "execa": "^5.1.1",
+ "fast-glob": "^3.3.3",
+ "is-path-inside": "^3.0.3",
+ "nopt": "^8.1.0",
+ "properties-parser": "^0.6.0",
+ "semver": "^7.7.1",
+ "string-argv": "^0.3.1",
+ "untildify": "^4.0.0",
+ "which": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=20.5.0"
+ }
+ },
+ "node_modules/cordova-common": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/cordova-common/-/cordova-common-5.0.1.tgz",
+ "integrity": "sha512-OA2NQ6wvhNz4GytPYwTdlA9xfG7Yf7ufkj4u97m3rUfoL/AECwwj0GVT2CYpk/0Fk6HyuHA3QYCxfDPYsKzI1A==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@netflix/nerror": "^1.1.3",
+ "ansi": "^0.3.1",
+ "bplist-parser": "^0.3.2",
+ "cross-spawn": "^7.0.6",
+ "elementtree": "^0.1.7",
+ "endent": "^2.1.0",
+ "fast-glob": "^3.3.3",
+ "lodash.zip": "^4.2.0",
+ "plist": "^3.1.0",
+ "q": "^1.5.1",
+ "read-chunk": "^3.2.0",
+ "strip-bom": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/cross-spawn/node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/cross-spawn/node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/dedent": {
+ "version": "1.7.1",
+ "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.1.tgz",
+ "integrity": "sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "babel-plugin-macros": "^3.1.0"
+ },
+ "peerDependenciesMeta": {
+ "babel-plugin-macros": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/elementtree": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/elementtree/-/elementtree-0.1.7.tgz",
+ "integrity": "sha512-wkgGT6kugeQk/P6VZ/f4T+4HB41BVgNBq5CDIZVbQ02nvTVqAiVTbskxxu3eA/X96lMlfYOwnLQpN2v5E1zDEg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "sax": "1.1.4"
+ },
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/endent": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/endent/-/endent-2.1.0.tgz",
+ "integrity": "sha512-r8VyPX7XL8U01Xgnb1CjZ3XV+z90cXIJ9JPE/R9SEC9vpw2P6CfsRPJmp20DppC5N7ZAMCmjYkJIa744Iyg96w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dedent": "^0.7.0",
+ "fast-json-parse": "^1.0.3",
+ "objectorarray": "^1.0.5"
+ }
+ },
+ "node_modules/endent/node_modules/dedent": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
+ "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/execa": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+ "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^6.0.0",
+ "human-signals": "^2.1.0",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.1",
+ "onetime": "^5.1.2",
+ "signal-exit": "^3.0.3",
+ "strip-final-newline": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ }
+ },
+ "node_modules/extsprintf": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz",
+ "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==",
+ "dev": true,
+ "engines": [
+ "node >=0.6.0"
+ ],
+ "license": "MIT"
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.8"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-json-parse": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/fast-json-parse/-/fast-json-parse-1.0.3.tgz",
+ "integrity": "sha512-FRWsaZRWEJ1ESVNbDWmsAlqDk96gPQezzLghafp5J4GUKjbCz3OkAHuZs5TuPEtkbVQERysLp9xv6c24fBm8Aw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fastq": {
+ "version": "1.20.1",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz",
+ "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/get-stream": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/human-signals": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=10.17.0"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-path-inside": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz",
+ "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.17.23",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz",
+ "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lodash.zip": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz",
+ "integrity": "sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/nopt": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz",
+ "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "abbrev": "^3.0.0"
+ },
+ "bin": {
+ "nopt": "bin/nopt.js"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm-run-path": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+ "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/objectorarray": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/objectorarray/-/objectorarray-1.0.5.tgz",
+ "integrity": "sha512-eJJDYkhJFFbBBAxeh8xW+weHlkI28n2ZdQV/J/DNfWfSKlGEf2xcfAbZTv3riEXHAhL9SVOTs2pRmXiSTf78xg==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mimic-fn": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-finally": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+ "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pify": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/plist": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz",
+ "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@xmldom/xmldom": "^0.8.8",
+ "base64-js": "^1.5.1",
+ "xmlbuilder": "^15.1.1"
+ },
+ "engines": {
+ "node": ">=10.4.0"
+ }
+ },
+ "node_modules/properties-parser": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/properties-parser/-/properties-parser-0.6.0.tgz",
+ "integrity": "sha512-qvr2cSmoA0dln0MARAKwBzPkkXn7FqwX+RVVNpMdMJc7rt9mqO2cXwluxtux9fHrLhjnPFaQkS8BM0kFrTCnSw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.3.1"
+ }
+ },
+ "node_modules/q": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
+ "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==",
+ "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.6.0",
+ "teleport": ">=0.2.0"
+ }
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/read-chunk": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-3.2.0.tgz",
+ "integrity": "sha512-CEjy9LCzhmD7nUpJ1oVOE6s/hBkejlcJEgLQHVnQznOSilOPb+kpKktlLfFDK3/WP43+F80xkUTM2VOkYoSYvQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "pify": "^4.0.1",
+ "with-open-file": "^0.1.6"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
+ "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/sax": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.1.4.tgz",
+ "integrity": "sha512-5f3k2PbGGp+YtKJjOItpg3P99IMD84E4HOvcfleTb5joCHNXYLsR9yWFPOYGgaeMPDubQILTCMdsFb2OMeOjtg==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/semver": {
+ "version": "7.7.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
+ "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/string-argv": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz",
+ "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.6.19"
+ }
+ },
+ "node_modules/strip-bom": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
+ "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-final-newline": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/untildify": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz",
+ "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/which": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz",
+ "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^3.1.1"
+ },
+ "bin": {
+ "node-which": "bin/which.js"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/with-open-file": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/with-open-file/-/with-open-file-0.1.7.tgz",
+ "integrity": "sha512-ecJS2/oHtESJ1t3ZfMI3B7KIDKyfN0O16miWxdn30zdh66Yd3LsRFebXZXq6GU4xfxLf6nVxp9kIqElb5fqczA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-finally": "^1.0.0",
+ "p-try": "^2.1.0",
+ "pify": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/xmlbuilder": {
+ "version": "15.1.1",
+ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz",
+ "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.0"
+ }
+ }
+ }
+}
diff --git a/brice/package.json b/brice/package.json
new file mode 100644
index 0000000..f280a92
--- /dev/null
+++ b/brice/package.json
@@ -0,0 +1,23 @@
+{
+ "name": "org.apache.cordova.hellocordova",
+ "displayName": "Hello Cordova",
+ "version": "1.0.0",
+ "description": "A sample Apache Cordova application that responds to the deviceready event.",
+ "main": "index.js",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "keywords": [
+ "ecosystem:cordova"
+ ],
+ "author": "Apache Cordova Team",
+ "license": "Apache-2.0",
+ "devDependencies": {
+ "cordova-android": "^14.0.1"
+ },
+ "cordova": {
+ "platforms": [
+ "android"
+ ]
+ }
+}
diff --git a/brice/www/cordova.js b/brice/www/cordova.js
new file mode 100644
index 0000000..a8284b7
--- /dev/null
+++ b/brice/www/cordova.js
@@ -0,0 +1 @@
+// Browser stub for Cordova builds.
diff --git a/brice/www/css/clock-scene.css b/brice/www/css/clock-scene.css
new file mode 100644
index 0000000..46da384
--- /dev/null
+++ b/brice/www/css/clock-scene.css
@@ -0,0 +1,269 @@
+html,
+body {
+ height: 100%;
+}
+
+body {
+ overflow: hidden;
+ background: #c89d70;
+}
+
+.scene-clock {
+ position: relative;
+ overflow: hidden;
+ min-height: 100vh;
+ background:
+ radial-gradient(circle at top center, rgba(255, 235, 200, 0.5), transparent 24%),
+ linear-gradient(180deg, rgba(255, 255, 255, 0.12), rgba(112, 68, 21, 0.18)),
+ repeating-linear-gradient(
+ 0deg,
+ #d8b186 0,
+ #d8b186 2px,
+ #c99d71 2px,
+ #c99d71 5px,
+ #bc8f65 5px,
+ #bc8f65 7px
+ );
+}
+
+.scene-clock::before {
+ content: "";
+ position: absolute;
+ inset: 0;
+ background:
+ radial-gradient(circle at 50% 39%, rgba(255, 217, 122, 0.75), transparent 8%),
+ radial-gradient(circle at 50% 47%, rgba(255, 221, 143, 0.42), transparent 18%);
+ pointer-events: none;
+}
+
+.clock-shell {
+ position: relative;
+ z-index: 1;
+ box-sizing: border-box;
+ min-height: 100vh;
+ padding: 4vh 5vw 6vh;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: flex-start;
+ gap: 5vh;
+}
+
+.clock-topbar {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 1.8vh;
+}
+
+.clock-board {
+ width: min(1100px, 100%);
+ display: grid;
+ grid-template-columns: minmax(0, 1fr) 12px minmax(0, 1fr);
+ align-items: center;
+ gap: clamp(18px, 3vw, 40px);
+}
+
+.player-zone {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 2.4vh;
+}
+
+.player-badge {
+ min-width: 190px;
+ padding: 0.45em 1.4em;
+ border-radius: 18px;
+ border: 1px solid rgba(110, 72, 34, 0.22);
+ background: linear-gradient(180deg, rgba(255, 246, 231, 0.96), rgba(232, 207, 171, 0.92));
+ color: #352112;
+ text-align: center;
+ font-family: "Cinzel", serif;
+ font-size: clamp(1.6rem, 2vw, 2.4rem);
+ letter-spacing: 0.05em;
+ box-shadow:
+ 0 4px 14px rgba(80, 43, 8, 0.15),
+ inset 0 1px 0 rgba(255, 255, 255, 0.8);
+}
+
+.player-badge-dark {
+ border-color: rgba(42, 24, 14, 0.5);
+ background: linear-gradient(180deg, rgba(63, 39, 22, 0.96), rgba(37, 22, 13, 0.98));
+ color: #f6ead7;
+ box-shadow:
+ 0 4px 18px rgba(37, 16, 7, 0.28),
+ inset 0 1px 0 rgba(255, 235, 214, 0.14);
+}
+
+.clock-panel {
+ position: relative;
+ width: min(100%, 460px);
+ min-height: clamp(280px, 48vh, 420px);
+ border-radius: 38px;
+ padding: clamp(28px, 4vh, 42px) clamp(24px, 3vw, 34px);
+ box-sizing: border-box;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ gap: 2.4vh;
+ box-shadow:
+ 0 20px 30px rgba(74, 45, 20, 0.18),
+ inset 0 0 0 1px rgba(255, 255, 255, 0.08);
+}
+
+.clock-panel-white {
+ background: linear-gradient(180deg, rgba(255, 246, 228, 0.98), rgba(241, 215, 171, 0.98));
+ border: 2px solid rgba(255, 211, 94, 0.75);
+ color: #2c1d14;
+}
+
+.clock-panel-black {
+ background: linear-gradient(180deg, rgba(77, 53, 37, 0.96), rgba(43, 29, 21, 0.98));
+ border: 2px solid rgba(46, 28, 20, 0.78);
+ color: #f0e1cf;
+}
+
+.panel-light {
+ display: none;
+}
+
+.clock-divider {
+ width: 100%;
+ height: min(48vh, 420px);
+ border-radius: 999px;
+ background: linear-gradient(180deg, rgba(183, 131, 68, 0), rgba(183, 131, 68, 0.9), rgba(183, 131, 68, 0));
+ box-shadow: 0 0 22px rgba(255, 211, 119, 0.7);
+}
+
+.scene-clock .button {
+ position: absolute;
+ inset: 0;
+ width: auto;
+ height: auto;
+ top: auto;
+ right: auto;
+ border-radius: inherit;
+ cursor: pointer;
+ z-index: 2;
+ background: transparent;
+ -webkit-tap-highlight-color: transparent;
+}
+
+.scene-clock #white_button,
+.scene-clock #black_button {
+ inset: 0;
+ width: 100%;
+ height: 100%;
+ background: transparent;
+}
+
+.scene-clock .click {
+ transform: scale(0.985);
+ filter: brightness(0.96);
+}
+
+.scene-clock .TextClock {
+ margin: 0;
+ position: relative;
+ z-index: 1;
+ text-align: center;
+ font-family: "Cormorant Garamond", serif;
+ font-weight: 500;
+}
+
+.scene-clock #TimeWhite,
+.scene-clock #TimeBlack,
+.scene-clock #BlockTime,
+.scene-clock #MoveLeftWhite,
+.scene-clock #MoveLeftBlack,
+.scene-clock #BlockType {
+ top: auto;
+ left: auto;
+}
+
+.clock-status {
+ color: #2f1d13;
+ font-size: clamp(2rem, 2.6vw, 3.4rem);
+}
+
+.clock-mode {
+ min-width: 220px;
+ padding: 0.28em 1.2em;
+ border-radius: 999px;
+ border: 1px solid rgba(112, 76, 41, 0.3);
+ background: linear-gradient(180deg, rgba(251, 242, 228, 0.98), rgba(232, 208, 178, 0.94));
+ color: #342012;
+ font-size: clamp(1.8rem, 2.2vw, 3rem);
+ box-shadow:
+ 0 5px 16px rgba(111, 70, 28, 0.12),
+ inset 0 1px 0 rgba(255, 255, 255, 0.8);
+}
+
+.clock-time {
+ font-size: clamp(4.8rem, 9vw, 8.4rem);
+ line-height: 0.95;
+ letter-spacing: 0.02em;
+}
+
+.clock-moves {
+ max-width: 82%;
+ font-size: clamp(2rem, 3.2vw, 3.6rem);
+ line-height: 1.02;
+}
+
+body::before {
+ content: "";
+ position: fixed;
+ inset: 0;
+ pointer-events: none;
+ opacity: 0;
+ transition: opacity 0.25s ease;
+}
+
+.glow-left::before {
+ opacity: 1;
+ background: radial-gradient(circle at 24% 58%, rgba(255, 214, 115, 0.35), transparent 22%);
+}
+
+.glow-right::before {
+ opacity: 1;
+ background: radial-gradient(circle at 76% 58%, rgba(255, 196, 92, 0.22), transparent 22%);
+}
+
+.glow-left #white_button {
+ box-shadow:
+ 0 0 0 2px rgba(255, 220, 113, 0.8),
+ 0 0 38px rgba(255, 205, 95, 0.55),
+ 0 0 70px rgba(255, 202, 93, 0.35);
+}
+
+.glow-right #black_button {
+ box-shadow:
+ 0 0 0 2px rgba(255, 196, 102, 0.72),
+ 0 0 34px rgba(255, 179, 82, 0.3),
+ 0 0 62px rgba(255, 179, 82, 0.16);
+}
+
+@media (max-width: 900px) {
+ .clock-shell {
+ padding: 3vh 4vw 5vh;
+ gap: 3vh;
+ }
+
+ .clock-board {
+ grid-template-columns: 1fr;
+ gap: 20px;
+ }
+
+ .clock-divider {
+ width: 72%;
+ height: 8px;
+ justify-self: center;
+ }
+
+ .clock-panel {
+ min-height: 250px;
+ }
+}
diff --git a/brice/www/css/cube-scene.css b/brice/www/css/cube-scene.css
new file mode 100644
index 0000000..393af9e
--- /dev/null
+++ b/brice/www/css/cube-scene.css
@@ -0,0 +1,230 @@
+.scene-cube {
+ position: relative;
+ overflow: hidden;
+ min-height: 100vh;
+ background:
+ radial-gradient(circle at 50% 18%, rgba(255, 236, 196, 0.28), transparent 26%),
+ linear-gradient(180deg, rgba(255, 255, 255, 0.06), rgba(41, 28, 18, 0.16)),
+ repeating-linear-gradient(
+ 0deg,
+ #d3ae84 0,
+ #d3ae84 2px,
+ #c39a70 2px,
+ #c39a70 5px,
+ #b78760 5px,
+ #b78760 7px
+ );
+}
+
+.cube-shell {
+ position: relative;
+ z-index: 1;
+ box-sizing: border-box;
+ min-height: 100vh;
+ padding: 4vh 5vw 6vh;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 4vh;
+}
+
+.cube-topbar {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 1.4vh;
+ max-width: 720px;
+ text-align: center;
+}
+
+.cube-title {
+ position: relative;
+ margin: 0;
+ color: #2f1d13;
+ font-family: "Cinzel", serif;
+ font-size: clamp(2.1rem, 2.6vw, 3.6rem);
+ letter-spacing: 0.06em;
+ text-transform: uppercase;
+}
+
+#BlockTypeTimer {
+ position: relative;
+ margin: 0;
+ min-width: 220px;
+ padding: 0.3em 1.2em;
+ border-radius: 999px;
+ border: 1px solid rgba(105, 70, 35, 0.28);
+ background: linear-gradient(180deg, rgba(251, 242, 228, 0.97), rgba(230, 205, 174, 0.92));
+ color: #372315;
+ text-align: center;
+ box-shadow:
+ 0 6px 18px rgba(93, 57, 25, 0.14),
+ inset 0 1px 0 rgba(255, 255, 255, 0.8);
+}
+
+.cube-subtitle {
+ margin: 0;
+ color: rgba(60, 37, 24, 0.86);
+ font-family: "Cormorant Garamond", serif;
+ font-size: clamp(1.3rem, 1.7vw, 2rem);
+}
+
+.cube-board {
+ width: min(1120px, 100%);
+ display: grid;
+ grid-template-columns: minmax(0, 1fr) 14px minmax(0, 1fr);
+ align-items: stretch;
+ gap: clamp(18px, 3vw, 42px);
+}
+
+.cube-lane {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 2.2vh;
+}
+
+.cube-badge {
+ min-width: 190px;
+ padding: 0.45em 1.4em;
+ border-radius: 18px;
+ border: 1px solid rgba(110, 72, 34, 0.22);
+ background: linear-gradient(180deg, rgba(255, 246, 231, 0.96), rgba(232, 207, 171, 0.92));
+ color: #352112;
+ text-align: center;
+ font-family: "Cinzel", serif;
+ font-size: clamp(1.6rem, 2vw, 2.4rem);
+ letter-spacing: 0.05em;
+ box-shadow:
+ 0 4px 14px rgba(80, 43, 8, 0.15),
+ inset 0 1px 0 rgba(255, 255, 255, 0.8);
+}
+
+.cube-badge-dark {
+ border-color: rgba(42, 24, 14, 0.5);
+ background: linear-gradient(180deg, rgba(63, 39, 22, 0.96), rgba(37, 22, 13, 0.98));
+ color: #f6ead7;
+}
+
+.cube-divider {
+ width: 100%;
+ border-radius: 999px;
+ background: linear-gradient(180deg, rgba(183, 131, 68, 0), rgba(183, 131, 68, 0.9), rgba(183, 131, 68, 0));
+ box-shadow: 0 0 22px rgba(255, 211, 119, 0.55);
+}
+
+.TimerCube {
+ position: relative;
+ width: min(100%, 470px);
+ min-height: clamp(320px, 52vh, 470px);
+ box-sizing: border-box;
+ padding: clamp(24px, 4vh, 38px);
+ border-radius: 40px;
+ overflow: hidden;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ gap: 2.6vh;
+ cursor: pointer;
+ transition: transform 0.18s ease, box-shadow 0.18s ease, filter 0.18s ease;
+ -webkit-tap-highlight-color: transparent;
+}
+
+.cube-pad {
+ background: linear-gradient(180deg, rgba(248, 233, 207, 0.98), rgba(223, 190, 149, 0.98));
+ border: 2px solid rgba(235, 202, 120, 0.72);
+ color: #2a1b12;
+ box-shadow:
+ 0 18px 28px rgba(88, 52, 21, 0.16),
+ inset 0 0 0 1px rgba(255, 255, 255, 0.24);
+}
+
+.cube-pad-dark {
+ background: linear-gradient(180deg, rgba(86, 58, 39, 0.98), rgba(53, 35, 24, 0.98));
+ border: 2px solid rgba(74, 47, 30, 0.96);
+ color: #f3e4d2;
+ box-shadow:
+ 0 18px 30px rgba(29, 18, 11, 0.3),
+ inset 0 0 0 1px rgba(255, 255, 255, 0.06);
+}
+
+.cube-grid {
+ position: absolute;
+ inset: 0;
+ background-image:
+ linear-gradient(rgba(255, 255, 255, 0.12) 1px, transparent 1px),
+ linear-gradient(90deg, rgba(255, 255, 255, 0.12) 1px, transparent 1px);
+ background-size: 33.333% 33.333%;
+ opacity: 0.15;
+ pointer-events: none;
+}
+
+.cube-pad-dark .cube-grid {
+ opacity: 0.08;
+}
+
+.TimerText {
+ position: relative;
+ margin: 0;
+ z-index: 1;
+ font-family: "Cormorant Garamond", serif;
+ font-size: clamp(2rem, 3vw, 3.5rem);
+ text-align: center;
+}
+
+#TextWhite,
+#TextBlack {
+ color: inherit;
+}
+
+.cube-hint {
+ position: relative;
+ z-index: 1;
+ margin: 0;
+ font-family: "Cormorant Garamond", serif;
+ font-size: clamp(1.3rem, 1.8vw, 2rem);
+ letter-spacing: 0.03em;
+ opacity: 0.84;
+}
+
+.TimerCube.RedClick {
+ background: linear-gradient(180deg, rgba(237, 92, 81, 0.98), rgba(148, 26, 23, 0.98));
+ border-color: rgba(122, 12, 12, 0.85);
+ color: #fff1ec;
+ box-shadow:
+ 0 0 0 2px rgba(255, 133, 116, 0.32),
+ 0 22px 34px rgba(111, 21, 16, 0.3);
+}
+
+.TimerCube.GreenClick {
+ background: linear-gradient(180deg, rgba(124, 223, 87, 0.98), rgba(38, 121, 40, 0.98));
+ border-color: rgba(39, 96, 41, 0.88);
+ color: #effde9;
+ box-shadow:
+ 0 0 0 2px rgba(151, 255, 134, 0.28),
+ 0 22px 34px rgba(25, 84, 28, 0.28);
+}
+
+.TimerCube:active {
+ transform: scale(0.988);
+}
+
+@media (max-width: 900px) {
+ .cube-shell {
+ padding: 3vh 4vw 5vh;
+ }
+
+ .cube-board {
+ grid-template-columns: 1fr;
+ }
+
+ .cube-divider {
+ width: 72%;
+ min-height: 8px;
+ }
+
+ .TimerCube {
+ min-height: 260px;
+ }
+}
diff --git a/brice/www/css/style.css b/brice/www/css/style.css
new file mode 100644
index 0000000..d9ae3ff
--- /dev/null
+++ b/brice/www/css/style.css
@@ -0,0 +1,94 @@
+html, body {
+ height: 100%;
+ margin: 0;
+}
+
+
+.scene{
+ display: none;
+ width: 100%;
+ height: 100vh;
+ background: linear-gradient(to right, #583305,#8A5009 );
+ box-shadow: 0 4px 12px rgba(0,0,0,0.2);
+
+}
+
+.button{
+ position: absolute;
+ width: 50%;
+ height: 50vh;
+ top: 50%;
+}
+
+#black_button{
+ right: 0%;
+ background: linear-gradient(to top, #A55B00, #583305);
+}
+
+#white_button{
+ right: 50%;
+ background: linear-gradient(to top , #E9BB82, #583305);
+}
+.click{
+ filter:brightness(0.9);
+}
+.TextClock{
+ position: absolute;
+ font-family: "Dancing Script", cursive;
+ font-optical-sizing: auto;
+ font-weight: 0;
+ font-style: normal;
+ font-size: 3vw;
+}
+#TimeBlack{
+ left: 70%;
+ top: 35%;
+}
+#TimeWhite{
+ top: 35%;
+ left: 20%;
+}
+#BlockTime{
+ top:5%;
+ left: 35%;
+}
+#MoveLeftWhite{
+ left: 13%;
+ top: 25%
+}
+#MoveLeftBlack{
+ left: 63%;
+ top: 25%;
+}
+#BlockType{
+ top:15%;
+ left: 48%;
+}
+
+body::before {
+ content: "";
+ position: fixed;
+ top: 0;
+ width: 50%;
+ height: 100%;
+ pointer-events: none;
+ opacity: 0;
+ transition: opacity 0.3s ease, left 1s ease, right 1s ease;
+ background: radial-gradient(
+ circle at center,
+ rgba(255, 255, 0, 0.6),
+ transparent 50%
+ );
+}
+
+/* Glow à gauche */
+.glow-left::before {
+ left: 0;
+ opacity: 1;
+}
+
+/* Glow à droite */
+.glow-right::before {
+ right: 0;
+ opacity: 1;
+}
diff --git a/brice/www/img/logo.png b/brice/www/img/logo.png
new file mode 100644
index 0000000..6f02567
Binary files /dev/null and b/brice/www/img/logo.png differ
diff --git a/brice/www/index.html b/brice/www/index.html
new file mode 100644
index 0000000..04adc6a
--- /dev/null
+++ b/brice/www/index.html
@@ -0,0 +1,91 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Temps restant Block : 3:00
+ Block -
+
+
+
+
+ BLANC
+
+
+
+
10:00
+
Coup restant Blanc : 8
+
+
+
+
+
+
+ NOIR
+
+
+
+
10:00
+
Coup restant Noir : 8
+
+
+
+
+
+
+
+
+
+
Phase Cube
+
Block -
+
Maintiens 2 secondes pour lancer le timer, puis touche de nouveau quand le cube est termine.
+
+
+
+
+ BLANC
+
+
+
Temps au cube Blanc : 0:00
+
Appui long pour demarrer
+
+
+
+
+
+
+ NOIR
+
+
+
Temps au cube Noir : 0:00
+
Touchez quand le cube est fini
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/brice/www/js/ClockFrontEnd.js b/brice/www/js/ClockFrontEnd.js
new file mode 100644
index 0000000..45ae9f0
--- /dev/null
+++ b/brice/www/js/ClockFrontEnd.js
@@ -0,0 +1,87 @@
+let white = document.getElementById("white_button");
+let black = document.getElementById("black_button");
+let white_time = document.getElementById("TimeWhite")
+let black_time = document.getElementById("TimeBlack")
+let black_move_left = document.getElementById("MoveLeftBlack")
+let white_move_left = document.getElementById("MoveLeftWhite")
+let BlockType = document.getElementById("BlockType")
+let BlockTime = document.getElementById("BlockTime")
+let trais = true
+
+
+function msToMinSec(ms) {
+ const totalSeconds = Math.floor(ms / 1000);
+ const minutes = Math.floor(totalSeconds / 60);
+ const seconds = totalSeconds % 60;
+
+ return `${minutes}:${seconds.toString().padStart(2, '0')}`;
+}
+
+function toggle_trais(){
+ trais = !trais
+ if (trais){
+ showGlowRight()
+ }else{
+ showGlowLeft()
+ }
+}
+
+function change_move_left_white(number){
+ white_move_left.innerText = `Coup restant Blanc : ${number}`
+}
+
+function change_move_left_black(number){
+ black_move_left.innerText = `Coup restant Noir : ${number}`
+}
+
+function change_time_block(Time){
+ BlockTime.innerText = `Temps restant Block : ${msToMinSec(Time)}`
+}
+
+function set_block_type(type){
+ // true = +
+ // false = -
+ if (type){
+ BlockType.innerText = "Block +"
+ }else{
+ BlockType.innerText = "Block -"
+ }
+}
+
+function change_time_white(Time){
+ white_time.innerText = msToMinSec(Time)
+}
+
+function change_time_black(Time){
+ black_time.innerText = msToMinSec(Time)
+}
+white.addEventListener("pointerdown", () => {
+ if (!trais) white.classList.add("click");
+ if (!has_start) start()
+ else white_touch()
+});
+white.addEventListener("pointerup", () => {
+ white.classList.remove("click");
+});
+
+black.addEventListener("pointerdown", () => {
+ if (trais )black.classList.add("click");
+ black_touch()
+});
+black.addEventListener("pointerup", () => {
+ black.classList.remove("click");
+});
+
+function showGlowLeft() {
+ document.body.classList.remove("glow-right");
+ document.body.classList.add("glow-left");
+}
+
+function showGlowRight() {
+ document.body.classList.remove("glow-left");
+ document.body.classList.add("glow-right");
+}
+
+function hideGlow() {
+ document.body.classList.remove("glow-left", "glow-right");
+}
diff --git a/brice/www/js/TimerFrontEnd.js b/brice/www/js/TimerFrontEnd.js
new file mode 100644
index 0000000..223cb3e
--- /dev/null
+++ b/brice/www/js/TimerFrontEnd.js
@@ -0,0 +1,35 @@
+let white_Timer = document.getElementById("TimerWhite")
+let black_Timer = document.getElementById("TimerBlack")
+let white_Time_Timer = document.getElementById("TextWhite")
+let black_Time_Timer = document.getElementById("TextBlack")
+let TimerBlockType = document.getElementById("BlockTypeTimer")
+
+function Set_block_type_Timer(type){
+ if (type){
+ TimerBlockType.innerText = "Block +"
+ }else{
+ TimerBlockType.innerText = "Block -"
+ }
+}
+
+function Set_White_Time_Cube(Time){
+ white_Time_Timer.innerText = `Temps au cube Blanc : ${msToMinSec(Time)}`
+}
+
+function Set_Black_Time_Cube(Time){
+ black_Time_Timer.innerText = `Temps au cube Noir : ${msToMinSec(Time)}`
+}
+
+white_Timer.addEventListener("pointerdown", () => {
+ white_timer_touch();
+});
+white_Timer.addEventListener("pointerup", () => {
+ white_timer_release();
+});
+
+black_Timer.addEventListener("pointerdown", () => {
+ black_timer_touch();
+});
+black_Timer.addEventListener("pointerup", () => {
+ black_timer_release();
+});
diff --git a/brice/www/js/appload.js b/brice/www/js/appload.js
new file mode 100644
index 0000000..7398c33
--- /dev/null
+++ b/brice/www/js/appload.js
@@ -0,0 +1,3 @@
+
+load_Clock_scene()
+update()
\ No newline at end of file
diff --git a/brice/www/js/backend.js b/brice/www/js/backend.js
new file mode 100644
index 0000000..be89a51
--- /dev/null
+++ b/brice/www/js/backend.js
@@ -0,0 +1,239 @@
+
+let White = {
+ moveLeft : 0,
+ Time : 0,
+ TimeStartMove : 0
+}
+
+let Black = {
+ moveLeft : 0,
+ Time : 0,
+ TimeStartMove : 0
+}
+let has_start = false
+
+Block = {
+ Type : false,
+ Time : 0,
+ last_time : 0
+}
+
+Timer = {
+ White_Has_started : false,
+ Black_Has_started : false,
+ Black_time : 0,
+ White_time : 0,
+ White_start_time : 0,
+ Black_start_time : 0,
+ coldown_White : 0,
+ coldown_Black : 0,
+ coldown_Start_White : 0,
+ coldown_Start_Black : 0,
+ White_Has_Finish : false,
+ Black_Has_Finish : false
+}
+
+config = {
+ StartTimeWhite : 600000,
+ StartTimeBlack:600000,
+ StartMoveLeft : 8,
+ BlockTime : 180000,
+ last_block : true,
+ trais : false,
+ MaxIncrement : 120000
+}
+
+
+function load_Clock_scene(){
+ has_start = false
+ hide_scene("Cube")
+ inizalize_clock()
+ show_scene("Clock")
+ inizalize_clock()
+}
+
+function inizalize_clock(){
+ trais = !config.trais
+ toggle_trais()
+ White.Time = config.StartTimeWhite
+ White.moveLeft = config.StartMoveLeft
+ Black.Time = config.StartTimeBlack
+ Black.moveLeft = config.StartMoveLeft
+ Block.Time = config.BlockTime
+ Block.Type = !config.last_block
+
+ change_move_left_black(Black.moveLeft)
+ change_move_left_white(White.moveLeft)
+ change_time_black(Black.Time)
+ change_time_white(White.Time)
+ change_time_block(Block.Time)
+ set_block_type(Block.Type)
+}
+
+function start(){
+ White.TimeStartMove = Date.now()
+ Black.TimeStartMove = Date.now()
+ Block.last_time = Date.now()
+ has_start = true
+}
+
+function load_cube_scene(){
+ has_start = false
+
+ config.StartTimeWhite = White.Time
+ config.StartTimeBlack = Black.Time
+ config.last_block = Block.Type
+
+ Timer = {
+ White_Has_started : false,
+ Black_Has_started : false,
+ Black_time : 0,
+ White_time : 0,
+ White_start_time : 0,
+ Black_start_time : 0,
+ coldown_White : 0,
+ coldown_Black : 0,
+ coldown_Start_White : 0,
+ coldown_Start_Black : 0,
+ White_Has_Finish : false,
+ Black_Has_Finish : false
+}
+ Set_block_type_Timer(config.last_block)
+ Set_White_Time_Cube(0)
+ Set_Black_Time_Cube(0)
+ hide_scene("Clock")
+ hideGlow()
+ show_scene("Cube")
+
+}
+
+function black_timer_touch(){
+ if (!Timer.Black_Has_started){
+ Timer.coldown_Start_Black = Date.now()
+ black_Timer.classList.add("RedClick")
+ }else if(!Timer.Black_Has_Finish){
+ Timer.Black_Has_Finish = true
+ black_Timer.classList.add("GreenClick")
+ }
+}
+
+function black_timer_release(){
+ if (Timer.coldown_Black > 2000) {
+ Timer.Black_Has_started = true
+ Timer.Black_start_time = Date.now()
+ black_Timer.classList.remove("GreenClick")
+ }else{
+ black_Timer.classList.remove("RedClick")
+ Timer.coldown_Start_Black = 0;
+ }
+}
+
+
+function white_timer_touch(){
+ if (!Timer.White_Has_started){
+ Timer.coldown_Start_White = Date.now()
+ white_Timer.classList.add("RedClick")
+ }else if(!Timer.White_Has_Finish){
+ Timer.White_Has_Finish = true
+ white_Timer.classList.add("GreenClick")
+ }
+}
+
+function white_timer_release(){
+ if (Timer.coldown_White > 2000) {
+ Timer.White_Has_started = true
+ Timer.White_start_time = Date.now()
+ white_Timer.classList.remove("GreenClick")
+ }else{
+ white_Timer.classList.remove("RedClick")
+ Timer.coldown_Start_White = 0;
+ }
+}
+
+
+function white_touch(){
+ if (trais) return null
+ if (!has_start) return null
+ toggle_trais()
+ Black.TimeStartMove = Date.now()
+ White.moveLeft -= 1
+ change_move_left_white(White.moveLeft)
+}
+
+function black_touch(){
+ if (!trais) return null
+ if (!has_start) return null
+ Black.moveLeft -= 1
+ if (Black.moveLeft == 0){
+ load_cube_scene()
+ }else{
+ toggle_trais()
+ White.TimeStartMove = Date.now()
+ change_move_left_black(Black.moveLeft)
+ }
+}
+function update() {
+ if (last_scene == "Clock" && has_start){
+ if (!trais) {// trais au blanc
+ White.Time -= (Date.now() - White.TimeStartMove)
+ White.TimeStartMove = Date.now()
+ }else{
+ Black.Time -= (Date.now() - Black.TimeStartMove)
+ Black.TimeStartMove = Date.now()
+ }
+ Block.Time -= (Date.now() - Block.last_time)
+ Block.last_time = Date.now()
+ if (Block.Time <= 0){
+ load_cube_scene()
+ }
+
+ change_time_white(White.Time)
+ change_time_black(Black.Time)
+ change_time_block(Block.Time)
+ }else if(last_scene == "Cube"){
+ if (!Timer.Black_Has_started){ // noire a pas commencer le cube
+ if (Timer.coldown_Start_Black != 0){ // coldown lancer
+ Timer.coldown_Black = Date.now() - Timer.coldown_Start_Black
+ if (Timer.coldown_Black > 2000){
+ black_Timer.classList.remove("RedClick")
+ black_Timer.classList.add("GreenClick")
+ }
+ }
+ }else if(!Timer.Black_Has_Finish){
+
+ Timer.Black_time = Date.now() - Timer.Black_start_time
+ Set_Black_Time_Cube(Timer.Black_time)
+
+ }
+
+ if (!Timer.White_Has_started){ // blanc a pas commencer le cube
+ if (Timer.coldown_Start_White != 0){ // coldown lancer
+ Timer.coldown_White = Date.now() - Timer.coldown_Start_White
+ if (Timer.coldown_White > 2000){
+ white_Timer.classList.remove("RedClick")
+ white_Timer.classList.add("GreenClick")
+ }
+ }
+ }else if (!Timer.White_Has_Finish){
+
+ Timer.White_time = Date.now() - Timer.White_start_time
+ Set_White_Time_Cube(Timer.White_time)
+
+ }
+
+
+ if (Timer.Black_Has_Finish && Timer.White_Has_Finish){
+ if (config.last_block){
+ config.StartTimeWhite += Timer.Black_time
+ config.StartTimeBlack += Timer.Black_time
+ }else{
+ config.StartTimeWhite -= Timer.White_time
+ config.StartTimeBlack -= Timer.Black_time
+ }
+
+ load_Clock_scene()
+ }
+
+ }
+ requestAnimationFrame(update);
+}
diff --git a/brice/www/js/scene.js b/brice/www/js/scene.js
new file mode 100644
index 0000000..ece9320
--- /dev/null
+++ b/brice/www/js/scene.js
@@ -0,0 +1,13 @@
+let last_scene = ""
+
+function show_scene(name){
+ scene = document.getElementById("scene" + name);
+ console.log(scene)
+ last_scene = name
+ scene.style.display = "block";
+}
+
+function hide_scene(name){
+ scene = document.getElementById("scene" + name);
+ scene.style.display = "none";
+}
\ No newline at end of file
diff --git a/brice/www/manifest.json b/brice/www/manifest.json
new file mode 100644
index 0000000..79224fc
--- /dev/null
+++ b/brice/www/manifest.json
@@ -0,0 +1,15 @@
+{
+ "name": "Mon Timer",
+ "short_name": "ChessCubingClock",
+ "start_url": "index.html",
+ "display": "standalone",
+ "background_color": "#000000",
+ "theme_color": "#000000",
+ "icons": [
+ {
+ "src": "img/logo.png",
+ "sizes": "192x192",
+ "type": "image/png"
+ }
+ ]
+}
diff --git a/index.html b/index.html
index 66cfcf3..025e7ab 100644
--- a/index.html
+++ b/index.html
@@ -43,6 +43,7 @@
Ouvrir l'application
Lire le règlement
Ouvrir l'appli d'Ethan
+ Ouvrir l'appli de Brice
diff --git a/install-chesscubing-proxmox.sh b/install-chesscubing-proxmox.sh
index 3077c4d..fcb3807 100755
--- a/install-chesscubing-proxmox.sh
+++ b/install-chesscubing-proxmox.sh
@@ -35,6 +35,8 @@ Variables d'environnement reconnues :
CHESSCUBING_GIT_BRANCH
CHESSCUBING_ETHAN_REPO_URL
CHESSCUBING_ETHAN_GIT_BRANCH
+ CHESSCUBING_BRICE_REPO_URL
+ CHESSCUBING_BRICE_GIT_BRANCH
EOF
}
@@ -111,6 +113,8 @@ ROOTFS_STORAGE="${CHESSCUBING_ROOTFS_STORAGE:-}"
LXC_PASSWORD="${CHESSCUBING_LXC_PASSWORD:-}"
ETHAN_REPO_URL="${CHESSCUBING_ETHAN_REPO_URL:-https://git.jeannerot.fr/Mineloulou/Chesscubing.git}"
ETHAN_REPO_BRANCH="${CHESSCUBING_ETHAN_GIT_BRANCH:-main}"
+BRICE_REPO_URL="${CHESSCUBING_BRICE_REPO_URL:-https://git.jeannerot.fr/Lescratcheur/ChessCubing.git}"
+BRICE_REPO_BRANCH="${CHESSCUBING_BRICE_GIT_BRANCH:-main}"
if [[ -z "$LOCAL_MODE" && -z "$PROXMOX_HOST" ]]; then
if have_cmd pct && have_cmd pveam; then
@@ -165,6 +169,8 @@ cmd=(
--branch "$REPO_BRANCH"
--ethan-repo-url "$ETHAN_REPO_URL"
--ethan-branch "$ETHAN_REPO_BRANCH"
+ --brice-repo-url "$BRICE_REPO_URL"
+ --brice-branch "$BRICE_REPO_BRANCH"
)
if [[ "$LOCAL_MODE" == "1" ]]; then
diff --git a/nginx.conf b/nginx.conf
index 94c7b82..7e2d0dc 100644
--- a/nginx.conf
+++ b/nginx.conf
@@ -13,6 +13,14 @@ server {
try_files $uri $uri/ /ethan/index.html;
}
+ location = /brice {
+ return 301 $scheme://$http_host/brice/;
+ }
+
+ location /brice/ {
+ try_files $uri $uri/ /brice/index.html;
+ }
+
location / {
try_files $uri $uri/ /index.html;
}
diff --git a/scripts/install-proxmox-lxc.sh b/scripts/install-proxmox-lxc.sh
index ba7b6c1..4c836e4 100755
--- a/scripts/install-proxmox-lxc.sh
+++ b/scripts/install-proxmox-lxc.sh
@@ -34,6 +34,8 @@ Options principales:
--branch Branche Git a deployer (defaut: main)
--ethan-repo-url Depot Git de l'application Ethan
--ethan-branch Branche Git de l'application Ethan (defaut: main)
+ --brice-repo-url Depot Git de l'application Brice
+ --brice-branch Branche Git de l'application Brice (defaut: main)
--lxc-password Mot de passe root du LXC. Genere si absent
-h, --help Affiche cette aide
@@ -75,6 +77,8 @@ REPO_URL="https://git.jeannerot.fr/christophe/chesscubing.git"
REPO_BRANCH="main"
ETHAN_REPO_URL="https://git.jeannerot.fr/Mineloulou/Chesscubing.git"
ETHAN_REPO_BRANCH="main"
+BRICE_REPO_URL="https://git.jeannerot.fr/Lescratcheur/ChessCubing.git"
+BRICE_REPO_BRANCH="main"
LXC_PASSWORD=""
while [[ $# -gt 0 ]]; do
@@ -159,6 +163,14 @@ while [[ $# -gt 0 ]]; do
ETHAN_REPO_BRANCH="${2:-}"
shift 2
;;
+ --brice-repo-url)
+ BRICE_REPO_URL="${2:-}"
+ shift 2
+ ;;
+ --brice-branch)
+ BRICE_REPO_BRANCH="${2:-}"
+ shift 2
+ ;;
--lxc-password)
LXC_PASSWORD="${2:-}"
shift 2
@@ -206,7 +218,9 @@ repo_url="$3"
repo_branch="$4"
ethan_repo_url="$5"
ethan_repo_branch="$6"
-lxc_password="$7"
+brice_repo_url="$7"
+brice_repo_branch="$8"
+lxc_password="$9"
die() {
printf 'Erreur: %s\n' "$*" >&2
@@ -342,7 +356,7 @@ pct exec "$ctid" -- true >/dev/null 2>&1 || die "Le LXC n'est pas joignable apre
printf 'Installation de nginx, git, rsync et des prerequis de build dans le conteneur...\n'
ct_exec "apt-get update && apt-get install -y ca-certificates curl gpg git nginx rsync"
-ct_exec "install -d -m 0755 /opt/chesscubing/repo /opt/chesscubing/ethan-repo /opt/chesscubing/publish /var/www/chesscubing/current"
+ct_exec "install -d -m 0755 /opt/chesscubing/repo /opt/chesscubing/ethan-repo /opt/chesscubing/brice-repo /opt/chesscubing/publish /var/www/chesscubing/current"
printf 'Clonage du depot %s...\n' "$repo_url"
ct_exec "if [ ! -d /opt/chesscubing/repo/.git ]; then \
@@ -363,11 +377,14 @@ trap 'printf \"Erreur: echec de la commande [%s] a la ligne %s.\\n\" \"\$BASH_CO
main_repo_dir='/opt/chesscubing/repo'
ethan_repo_dir='/opt/chesscubing/ethan-repo'
+brice_repo_dir='/opt/chesscubing/brice-repo'
publish_root='/opt/chesscubing/publish'
web_root='/var/www/chesscubing/current'
main_branch=\"\${1:-${repo_branch}}\"
ethan_repo_url='${ethan_repo_url}'
ethan_branch='${ethan_repo_branch}'
+brice_repo_url='${brice_repo_url}'
+brice_branch='${brice_repo_branch}'
ensure_dotnet_sdk() {
if command -v dotnet >/dev/null 2>&1; then
@@ -448,19 +465,32 @@ publish_static_tree() {
--include='*.webp' \
--include='*.ico' \
--include='*.pdf' \
+ --include='*.json' \
--include='*.webmanifest' \
--exclude='*' \
\"\$source_dir/\" \"\$destination_dir/\"
}
+ensure_browser_stub() {
+ local destination_dir=\"\$1\"
+ local stub_path=\"\$destination_dir/cordova.js\"
+
+ if [[ ! -f \"\$stub_path\" ]]; then
+ printf '%s\n' '// Browser stub for Cordova builds.' > \"\$stub_path\"
+ fi
+}
+
sync_git_repo \"\$main_repo_dir\" '${repo_url}' \"\$main_branch\" 'principal'
sync_git_repo \"\$ethan_repo_dir\" \"\$ethan_repo_url\" \"\$ethan_branch\" 'Ethan'
+sync_git_repo \"\$brice_repo_dir\" \"\$brice_repo_url\" \"\$brice_branch\" 'Brice'
install -d -m 0755 \"\$web_root\" \"\$publish_root\"
publish_blazor_app \"\$main_repo_dir\" \"\$publish_root/main\"
rsync -a --delete \"\$publish_root/main/wwwroot/\" \"\$web_root/\"
publish_static_tree \"\$ethan_repo_dir\" \"\$web_root/ethan\"
+publish_static_tree \"\$brice_repo_dir/www\" \"\$web_root/brice\"
+ensure_browser_stub \"\$web_root/brice\"
chown -R www-data:www-data \"\$web_root\"
@@ -486,11 +516,19 @@ server {
try_files \$uri \$uri/ /ethan/index.html;
}
+ location = /brice {
+ return 301 \$scheme://\$http_host/brice/;
+ }
+
+ location /brice/ {
+ try_files \$uri \$uri/ /brice/index.html;
+ }
+
location / {
try_files \$uri \$uri/ /index.html;
}
- location ~* \.(?:css|js|mjs|png|jpg|jpeg|svg|webp|ico|pdf|webmanifest)$ {
+ location ~* \.(?:css|js|json|mjs|png|jpg|jpeg|svg|webp|ico|pdf|webmanifest)$ {
expires -1;
add_header Cache-Control 'no-cache, no-store, must-revalidate';
}
@@ -536,6 +574,8 @@ if [[ "$LOCAL_MODE" == "1" ]]; then
"$REPO_BRANCH" \
"$ETHAN_REPO_URL" \
"$ETHAN_REPO_BRANCH" \
+ "$BRICE_REPO_URL" \
+ "$BRICE_REPO_BRANCH" \
"$LXC_PASSWORD"
exit 0
fi
@@ -576,4 +616,6 @@ sshpass -p "$PROXMOX_PASSWORD" \
"$REPO_BRANCH" \
"$ETHAN_REPO_URL" \
"$ETHAN_REPO_BRANCH" \
+ "$BRICE_REPO_URL" \
+ "$BRICE_REPO_BRANCH" \
"$LXC_PASSWORD" < "$payload_script"
diff --git a/scripts/update-proxmox-lxc.sh b/scripts/update-proxmox-lxc.sh
index 7669cbd..243745e 100755
--- a/scripts/update-proxmox-lxc.sh
+++ b/scripts/update-proxmox-lxc.sh
@@ -25,6 +25,8 @@ Options principales:
--branch Branche Git a deployer (defaut: main)
--ethan-repo-url Depot Git de l'application Ethan
--ethan-branch Branche Git de l'application Ethan (defaut: main)
+ --brice-repo-url Depot Git de l'application Brice
+ --brice-branch Branche Git de l'application Brice (defaut: main)
-h, --help Affiche cette aide
EOF
}
@@ -49,6 +51,8 @@ LXC_HOSTNAME="chesscubing-web"
REPO_BRANCH="main"
ETHAN_REPO_URL="https://git.jeannerot.fr/Mineloulou/Chesscubing.git"
ETHAN_REPO_BRANCH="main"
+BRICE_REPO_URL="https://git.jeannerot.fr/Lescratcheur/ChessCubing.git"
+BRICE_REPO_BRANCH="main"
while [[ $# -gt 0 ]]; do
case "$1" in
@@ -92,6 +96,14 @@ while [[ $# -gt 0 ]]; do
ETHAN_REPO_BRANCH="${2:-}"
shift 2
;;
+ --brice-repo-url)
+ BRICE_REPO_URL="${2:-}"
+ shift 2
+ ;;
+ --brice-branch)
+ BRICE_REPO_BRANCH="${2:-}"
+ shift 2
+ ;;
-h | --help)
usage
exit 0
@@ -124,6 +136,8 @@ lxc_hostname="$2"
repo_branch="$3"
ethan_repo_url="$4"
ethan_repo_branch="$5"
+brice_repo_url="$6"
+brice_repo_branch="$7"
die() {
printf 'Erreur: %s\n' "$*" >&2
@@ -181,11 +195,14 @@ trap 'printf \"Erreur: echec de la commande [%s] a la ligne %s.\\n\" \"\$BASH_CO
main_repo_dir='/opt/chesscubing/repo'
ethan_repo_dir='/opt/chesscubing/ethan-repo'
+brice_repo_dir='/opt/chesscubing/brice-repo'
publish_root='/opt/chesscubing/publish'
web_root='/var/www/chesscubing/current'
main_branch=\"\${1:-${repo_branch}}\"
ethan_repo_url='${ethan_repo_url}'
ethan_branch='${ethan_repo_branch}'
+brice_repo_url='${brice_repo_url}'
+brice_branch='${brice_repo_branch}'
ensure_dotnet_sdk() {
if command -v dotnet >/dev/null 2>&1; then
@@ -266,19 +283,32 @@ publish_static_tree() {
--include='*.webp' \
--include='*.ico' \
--include='*.pdf' \
+ --include='*.json' \
--include='*.webmanifest' \
--exclude='*' \
\"\$source_dir/\" \"\$destination_dir/\"
}
+ensure_browser_stub() {
+ local destination_dir=\"\$1\"
+ local stub_path=\"\$destination_dir/cordova.js\"
+
+ if [[ ! -f \"\$stub_path\" ]]; then
+ printf '%s\n' '// Browser stub for Cordova builds.' > \"\$stub_path\"
+ fi
+}
+
sync_git_repo \"\$main_repo_dir\" '' \"\$main_branch\" 'principal'
sync_git_repo \"\$ethan_repo_dir\" \"\$ethan_repo_url\" \"\$ethan_branch\" 'Ethan'
+sync_git_repo \"\$brice_repo_dir\" \"\$brice_repo_url\" \"\$brice_branch\" 'Brice'
install -d -m 0755 \"\$web_root\" \"\$publish_root\"
publish_blazor_app \"\$main_repo_dir\" \"\$publish_root/main\"
rsync -a --delete \"\$publish_root/main/wwwroot/\" \"\$web_root/\"
publish_static_tree \"\$ethan_repo_dir\" \"\$web_root/ethan\"
+publish_static_tree \"\$brice_repo_dir/www\" \"\$web_root/brice\"
+ensure_browser_stub \"\$web_root/brice\"
chown -R www-data:www-data \"\$web_root\"
@@ -304,11 +334,19 @@ server {
try_files \$uri \$uri/ /ethan/index.html;
}
+ location = /brice {
+ return 301 \$scheme://\$http_host/brice/;
+ }
+
+ location /brice/ {
+ try_files \$uri \$uri/ /brice/index.html;
+ }
+
location / {
try_files \$uri \$uri/ /index.html;
}
- location ~* \.(?:css|js|mjs|png|jpg|jpeg|svg|webp|ico|pdf|webmanifest)$ {
+ location ~* \.(?:css|js|json|mjs|png|jpg|jpeg|svg|webp|ico|pdf|webmanifest)$ {
expires -1;
add_header Cache-Control 'no-cache, no-store, must-revalidate';
}
@@ -337,7 +375,9 @@ if [[ "$LOCAL_MODE" == "1" ]]; then
"$LXC_HOSTNAME" \
"$REPO_BRANCH" \
"$ETHAN_REPO_URL" \
- "$ETHAN_REPO_BRANCH"
+ "$ETHAN_REPO_BRANCH" \
+ "$BRICE_REPO_URL" \
+ "$BRICE_REPO_BRANCH"
exit 0
fi
@@ -366,4 +406,6 @@ sshpass -p "$PROXMOX_PASSWORD" \
"$LXC_HOSTNAME" \
"$REPO_BRANCH" \
"$ETHAN_REPO_URL" \
- "$ETHAN_REPO_BRANCH" < "$payload_script"
+ "$ETHAN_REPO_BRANCH" \
+ "$BRICE_REPO_URL" \
+ "$BRICE_REPO_BRANCH" < "$payload_script"
diff --git a/update-chesscubing-proxmox.sh b/update-chesscubing-proxmox.sh
index de10c59..e714503 100755
--- a/update-chesscubing-proxmox.sh
+++ b/update-chesscubing-proxmox.sh
@@ -25,6 +25,8 @@ Variables d'environnement reconnues :
CHESSCUBING_GIT_BRANCH
CHESSCUBING_ETHAN_REPO_URL
CHESSCUBING_ETHAN_GIT_BRANCH
+ CHESSCUBING_BRICE_REPO_URL
+ CHESSCUBING_BRICE_GIT_BRANCH
EOF
}
@@ -91,6 +93,8 @@ CTID="${CHESSCUBING_CTID:-}"
LXC_HOSTNAME="${CHESSCUBING_LXC_HOSTNAME:-chesscubing-web}"
ETHAN_REPO_URL="${CHESSCUBING_ETHAN_REPO_URL:-https://git.jeannerot.fr/Mineloulou/Chesscubing.git}"
ETHAN_REPO_BRANCH="${CHESSCUBING_ETHAN_GIT_BRANCH:-main}"
+BRICE_REPO_URL="${CHESSCUBING_BRICE_REPO_URL:-https://git.jeannerot.fr/Lescratcheur/ChessCubing.git}"
+BRICE_REPO_BRANCH="${CHESSCUBING_BRICE_GIT_BRANCH:-main}"
if [[ -z "$LOCAL_MODE" && -z "$PROXMOX_HOST" ]]; then
if have_cmd pct && have_cmd pveam; then
@@ -130,6 +134,8 @@ cmd=(
--branch "$REPO_BRANCH"
--ethan-repo-url "$ETHAN_REPO_URL"
--ethan-branch "$ETHAN_REPO_BRANCH"
+ --brice-repo-url "$BRICE_REPO_URL"
+ --brice-branch "$BRICE_REPO_BRANCH"
)
if [[ "$LOCAL_MODE" == "1" ]]; then