Ajoute l'application de Brice et sa mise a jour automatique

This commit is contained in:
2026-04-13 21:42:04 +02:00
parent 90f17c9c89
commit 989b61e772
25 changed files with 2149 additions and 6 deletions

View File

@@ -23,6 +23,7 @@
<Content Include="..\ChessCubing_Time_Reglement_Officiel_V1-1.pdf" Link="wwwroot/ChessCubing_Time_Reglement_Officiel_V1-1.pdf" CopyToOutputDirectory="PreserveNewest" CopyToPublishDirectory="PreserveNewest" /> <Content Include="..\ChessCubing_Time_Reglement_Officiel_V1-1.pdf" Link="wwwroot/ChessCubing_Time_Reglement_Officiel_V1-1.pdf" CopyToOutputDirectory="PreserveNewest" CopyToPublishDirectory="PreserveNewest" />
<Content Include="..\ChessCubing_Twice_Reglement_Officiel_V2-1.pdf" Link="wwwroot/ChessCubing_Twice_Reglement_Officiel_V2-1.pdf" CopyToOutputDirectory="PreserveNewest" CopyToPublishDirectory="PreserveNewest" /> <Content Include="..\ChessCubing_Twice_Reglement_Officiel_V2-1.pdf" Link="wwwroot/ChessCubing_Twice_Reglement_Officiel_V2-1.pdf" CopyToOutputDirectory="PreserveNewest" CopyToPublishDirectory="PreserveNewest" />
<Content Include="..\ethan\**" Link="wwwroot/ethan/%(RecursiveDir)%(Filename)%(Extension)" CopyToOutputDirectory="PreserveNewest" CopyToPublishDirectory="PreserveNewest" /> <Content Include="..\ethan\**" Link="wwwroot/ethan/%(RecursiveDir)%(Filename)%(Extension)" CopyToOutputDirectory="PreserveNewest" CopyToPublishDirectory="PreserveNewest" />
<Content Include="..\brice\www\**" Link="wwwroot/brice/%(RecursiveDir)%(Filename)%(Extension)" CopyToOutputDirectory="PreserveNewest" CopyToPublishDirectory="PreserveNewest" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@@ -26,6 +26,7 @@
<a class="button primary" href="application.html">Ouvrir l'application</a> <a class="button primary" href="application.html">Ouvrir l'application</a>
<a class="button secondary" href="reglement.html">Lire le reglement</a> <a class="button secondary" href="reglement.html">Lire le reglement</a>
<a class="button ghost" href="/ethan/">Ouvrir l'appli d'Ethan</a> <a class="button ghost" href="/ethan/">Ouvrir l'appli d'Ethan</a>
<a class="button ghost" href="/brice/">Ouvrir l'appli de Brice</a>
</div> </div>
</div> </div>

View File

@@ -6,6 +6,7 @@ RUN dotnet restore ChessCubing.App/ChessCubing.App.csproj
COPY ChessCubing.App/ ChessCubing.App/ COPY ChessCubing.App/ ChessCubing.App/
COPY ethan/ ethan/ 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 ./ 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 RUN dotnet publish ChessCubing.App/ChessCubing.App.csproj -c Release -o /app/publish

25
brice/.gitignore vendored Normal file
View File

@@ -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/

13
brice/config.xml Normal file
View File

@@ -0,0 +1,13 @@
<?xml version='1.0' encoding='utf-8'?>
<widget id="org.apache.cordova.hellocordova" version="1.0.0" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
<name>Hello Cordova</name>
<description>
A sample Apache Cordova application that responds to the deviceready event.
</description>
<author email="dev@cordova.apache.org" href="https://cordova.apache.org">
Apache Cordova Team
</author>
<content src="index.html" />
<allow-intent href="http://*/*" />
<allow-intent href="https://*/*" />
</widget>

897
brice/package-lock.json generated Normal file
View File

@@ -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"
}
}
}
}

23
brice/package.json Normal file
View File

@@ -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"
]
}
}

1
brice/www/cordova.js vendored Normal file
View File

@@ -0,0 +1 @@
// Browser stub for Cordova builds.

View File

@@ -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;
}
}

View File

@@ -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;
}
}

94
brice/www/css/style.css Normal file
View File

@@ -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;
}

BIN
brice/www/img/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

91
brice/www/index.html Normal file
View File

@@ -0,0 +1,91 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="js/scene.js"></script>
<script src="cordova.js"></script>
<link rel="manifest" href="manifest.json">
<meta name="theme-color" content="#000000">
<link rel="stylesheet" href="css/style.css">
<link rel="stylesheet" href="css/clock-scene.css">
<link rel="stylesheet" href="css/cube-scene.css">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Cormorant+Garamond:wght@400;500;600;700&family=Cinzel:wght@400;500;600&display=swap" rel="stylesheet">
</head>
<body>
<div id="sceneClock" class="scene scene-clock">
<div class="clock-shell">
<div class="clock-topbar">
<h1 id="BlockTime" class="TextClock clock-status">Temps restant Block : 3:00</h1>
<h1 id="BlockType" class="TextClock clock-mode">Block -</h1>
</div>
<div class="clock-board">
<section class="player-zone player-zone-white">
<div class="player-badge">BLANC</div>
<div class="clock-panel clock-panel-white">
<div class="button" id="white_button" aria-label="White clock button"></div>
<div class="panel-light"></div>
<h1 id="TimeWhite" class="TextClock clock-time">10:00</h1>
<h1 id="MoveLeftWhite" class="TextClock clock-moves">Coup restant Blanc : 8</h1>
</div>
</section>
<div class="clock-divider"></div>
<section class="player-zone player-zone-black">
<div class="player-badge player-badge-dark">NOIR</div>
<div class="clock-panel clock-panel-black">
<div class="button" id="black_button" aria-label="Black clock button"></div>
<div class="panel-light"></div>
<h1 id="TimeBlack" class="TextClock clock-time">10:00</h1>
<h1 id="MoveLeftBlack" class="TextClock clock-moves">Coup restant Noir : 8</h1>
</div>
</section>
</div>
</div>
</div>
<div class="scene scene-cube" id="sceneCube">
<div class="cube-shell">
<div class="cube-topbar">
<h1 class="TimerText cube-title">Phase Cube</h1>
<h1 class="TimerText" id="BlockTypeTimer">Block -</h1>
<p class="cube-subtitle">Maintiens 2 secondes pour lancer le timer, puis touche de nouveau quand le cube est termine.</p>
</div>
<div class="cube-board">
<section class="cube-lane cube-lane-white">
<div class="cube-badge">BLANC</div>
<div class="TimerCube cube-pad" id="TimerWhite">
<div class="cube-grid"></div>
<h1 class="TimerText" id="TextWhite">Temps au cube Blanc : 0:00</h1>
<p class="cube-hint">Appui long pour demarrer</p>
</div>
</section>
<div class="cube-divider"></div>
<section class="cube-lane cube-lane-black">
<div class="cube-badge cube-badge-dark">NOIR</div>
<div class="TimerCube cube-pad cube-pad-dark" id="TimerBlack">
<div class="cube-grid"></div>
<h1 class="TimerText" id="TextBlack">Temps au cube Noir : 0:00</h1>
<p class="cube-hint">Touchez quand le cube est fini</p>
</div>
</section>
</div>
</div>
</div>
<script src="js/ClockFrontEnd.js"></script>
<script src="js/TimerFrontEnd.js"></script>
<script src="js/backend.js"></script>
<script src="js/appload.js"></script>
</body>
</html>

View File

@@ -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");
}

View File

@@ -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();
});

3
brice/www/js/appload.js Normal file
View File

@@ -0,0 +1,3 @@
load_Clock_scene()
update()

239
brice/www/js/backend.js Normal file
View File

@@ -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);
}

13
brice/www/js/scene.js Normal file
View File

@@ -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";
}

15
brice/www/manifest.json Normal file
View File

@@ -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"
}
]
}

View File

@@ -43,6 +43,7 @@
<a class="button primary" href="application.html">Ouvrir l'application</a> <a class="button primary" href="application.html">Ouvrir l'application</a>
<a class="button secondary" href="reglement.html">Lire le règlement</a> <a class="button secondary" href="reglement.html">Lire le règlement</a>
<a class="button ghost" href="/ethan/">Ouvrir l'appli d'Ethan</a> <a class="button ghost" href="/ethan/">Ouvrir l'appli d'Ethan</a>
<a class="button ghost" href="/brice/">Ouvrir l'appli de Brice</a>
</div> </div>
</div> </div>

View File

@@ -35,6 +35,8 @@ Variables d'environnement reconnues :
CHESSCUBING_GIT_BRANCH CHESSCUBING_GIT_BRANCH
CHESSCUBING_ETHAN_REPO_URL CHESSCUBING_ETHAN_REPO_URL
CHESSCUBING_ETHAN_GIT_BRANCH CHESSCUBING_ETHAN_GIT_BRANCH
CHESSCUBING_BRICE_REPO_URL
CHESSCUBING_BRICE_GIT_BRANCH
EOF EOF
} }
@@ -111,6 +113,8 @@ ROOTFS_STORAGE="${CHESSCUBING_ROOTFS_STORAGE:-}"
LXC_PASSWORD="${CHESSCUBING_LXC_PASSWORD:-}" LXC_PASSWORD="${CHESSCUBING_LXC_PASSWORD:-}"
ETHAN_REPO_URL="${CHESSCUBING_ETHAN_REPO_URL:-https://git.jeannerot.fr/Mineloulou/Chesscubing.git}" ETHAN_REPO_URL="${CHESSCUBING_ETHAN_REPO_URL:-https://git.jeannerot.fr/Mineloulou/Chesscubing.git}"
ETHAN_REPO_BRANCH="${CHESSCUBING_ETHAN_GIT_BRANCH:-main}" 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 [[ -z "$LOCAL_MODE" && -z "$PROXMOX_HOST" ]]; then
if have_cmd pct && have_cmd pveam; then if have_cmd pct && have_cmd pveam; then
@@ -165,6 +169,8 @@ cmd=(
--branch "$REPO_BRANCH" --branch "$REPO_BRANCH"
--ethan-repo-url "$ETHAN_REPO_URL" --ethan-repo-url "$ETHAN_REPO_URL"
--ethan-branch "$ETHAN_REPO_BRANCH" --ethan-branch "$ETHAN_REPO_BRANCH"
--brice-repo-url "$BRICE_REPO_URL"
--brice-branch "$BRICE_REPO_BRANCH"
) )
if [[ "$LOCAL_MODE" == "1" ]]; then if [[ "$LOCAL_MODE" == "1" ]]; then

View File

@@ -13,6 +13,14 @@ server {
try_files $uri $uri/ /ethan/index.html; 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 / { location / {
try_files $uri $uri/ /index.html; try_files $uri $uri/ /index.html;
} }

View File

@@ -34,6 +34,8 @@ Options principales:
--branch Branche Git a deployer (defaut: main) --branch Branche Git a deployer (defaut: main)
--ethan-repo-url Depot Git de l'application Ethan --ethan-repo-url Depot Git de l'application Ethan
--ethan-branch Branche Git de l'application Ethan (defaut: main) --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 --lxc-password Mot de passe root du LXC. Genere si absent
-h, --help Affiche cette aide -h, --help Affiche cette aide
@@ -75,6 +77,8 @@ REPO_URL="https://git.jeannerot.fr/christophe/chesscubing.git"
REPO_BRANCH="main" REPO_BRANCH="main"
ETHAN_REPO_URL="https://git.jeannerot.fr/Mineloulou/Chesscubing.git" ETHAN_REPO_URL="https://git.jeannerot.fr/Mineloulou/Chesscubing.git"
ETHAN_REPO_BRANCH="main" ETHAN_REPO_BRANCH="main"
BRICE_REPO_URL="https://git.jeannerot.fr/Lescratcheur/ChessCubing.git"
BRICE_REPO_BRANCH="main"
LXC_PASSWORD="" LXC_PASSWORD=""
while [[ $# -gt 0 ]]; do while [[ $# -gt 0 ]]; do
@@ -159,6 +163,14 @@ while [[ $# -gt 0 ]]; do
ETHAN_REPO_BRANCH="${2:-}" ETHAN_REPO_BRANCH="${2:-}"
shift 2 shift 2
;; ;;
--brice-repo-url)
BRICE_REPO_URL="${2:-}"
shift 2
;;
--brice-branch)
BRICE_REPO_BRANCH="${2:-}"
shift 2
;;
--lxc-password) --lxc-password)
LXC_PASSWORD="${2:-}" LXC_PASSWORD="${2:-}"
shift 2 shift 2
@@ -206,7 +218,9 @@ repo_url="$3"
repo_branch="$4" repo_branch="$4"
ethan_repo_url="$5" ethan_repo_url="$5"
ethan_repo_branch="$6" ethan_repo_branch="$6"
lxc_password="$7" brice_repo_url="$7"
brice_repo_branch="$8"
lxc_password="$9"
die() { die() {
printf 'Erreur: %s\n' "$*" >&2 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' 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 "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" printf 'Clonage du depot %s...\n' "$repo_url"
ct_exec "if [ ! -d /opt/chesscubing/repo/.git ]; then \ 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' main_repo_dir='/opt/chesscubing/repo'
ethan_repo_dir='/opt/chesscubing/ethan-repo' ethan_repo_dir='/opt/chesscubing/ethan-repo'
brice_repo_dir='/opt/chesscubing/brice-repo'
publish_root='/opt/chesscubing/publish' publish_root='/opt/chesscubing/publish'
web_root='/var/www/chesscubing/current' web_root='/var/www/chesscubing/current'
main_branch=\"\${1:-${repo_branch}}\" main_branch=\"\${1:-${repo_branch}}\"
ethan_repo_url='${ethan_repo_url}' ethan_repo_url='${ethan_repo_url}'
ethan_branch='${ethan_repo_branch}' ethan_branch='${ethan_repo_branch}'
brice_repo_url='${brice_repo_url}'
brice_branch='${brice_repo_branch}'
ensure_dotnet_sdk() { ensure_dotnet_sdk() {
if command -v dotnet >/dev/null 2>&1; then if command -v dotnet >/dev/null 2>&1; then
@@ -448,19 +465,32 @@ publish_static_tree() {
--include='*.webp' \ --include='*.webp' \
--include='*.ico' \ --include='*.ico' \
--include='*.pdf' \ --include='*.pdf' \
--include='*.json' \
--include='*.webmanifest' \ --include='*.webmanifest' \
--exclude='*' \ --exclude='*' \
\"\$source_dir/\" \"\$destination_dir/\" \"\$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 \"\$main_repo_dir\" '${repo_url}' \"\$main_branch\" 'principal'
sync_git_repo \"\$ethan_repo_dir\" \"\$ethan_repo_url\" \"\$ethan_branch\" 'Ethan' 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\" install -d -m 0755 \"\$web_root\" \"\$publish_root\"
publish_blazor_app \"\$main_repo_dir\" \"\$publish_root/main\" publish_blazor_app \"\$main_repo_dir\" \"\$publish_root/main\"
rsync -a --delete \"\$publish_root/main/wwwroot/\" \"\$web_root/\" rsync -a --delete \"\$publish_root/main/wwwroot/\" \"\$web_root/\"
publish_static_tree \"\$ethan_repo_dir\" \"\$web_root/ethan\" 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\" chown -R www-data:www-data \"\$web_root\"
@@ -486,11 +516,19 @@ server {
try_files \$uri \$uri/ /ethan/index.html; 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 / { location / {
try_files \$uri \$uri/ /index.html; 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; expires -1;
add_header Cache-Control 'no-cache, no-store, must-revalidate'; add_header Cache-Control 'no-cache, no-store, must-revalidate';
} }
@@ -536,6 +574,8 @@ if [[ "$LOCAL_MODE" == "1" ]]; then
"$REPO_BRANCH" \ "$REPO_BRANCH" \
"$ETHAN_REPO_URL" \ "$ETHAN_REPO_URL" \
"$ETHAN_REPO_BRANCH" \ "$ETHAN_REPO_BRANCH" \
"$BRICE_REPO_URL" \
"$BRICE_REPO_BRANCH" \
"$LXC_PASSWORD" "$LXC_PASSWORD"
exit 0 exit 0
fi fi
@@ -576,4 +616,6 @@ sshpass -p "$PROXMOX_PASSWORD" \
"$REPO_BRANCH" \ "$REPO_BRANCH" \
"$ETHAN_REPO_URL" \ "$ETHAN_REPO_URL" \
"$ETHAN_REPO_BRANCH" \ "$ETHAN_REPO_BRANCH" \
"$BRICE_REPO_URL" \
"$BRICE_REPO_BRANCH" \
"$LXC_PASSWORD" < "$payload_script" "$LXC_PASSWORD" < "$payload_script"

View File

@@ -25,6 +25,8 @@ Options principales:
--branch Branche Git a deployer (defaut: main) --branch Branche Git a deployer (defaut: main)
--ethan-repo-url Depot Git de l'application Ethan --ethan-repo-url Depot Git de l'application Ethan
--ethan-branch Branche Git de l'application Ethan (defaut: main) --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 -h, --help Affiche cette aide
EOF EOF
} }
@@ -49,6 +51,8 @@ LXC_HOSTNAME="chesscubing-web"
REPO_BRANCH="main" REPO_BRANCH="main"
ETHAN_REPO_URL="https://git.jeannerot.fr/Mineloulou/Chesscubing.git" ETHAN_REPO_URL="https://git.jeannerot.fr/Mineloulou/Chesscubing.git"
ETHAN_REPO_BRANCH="main" ETHAN_REPO_BRANCH="main"
BRICE_REPO_URL="https://git.jeannerot.fr/Lescratcheur/ChessCubing.git"
BRICE_REPO_BRANCH="main"
while [[ $# -gt 0 ]]; do while [[ $# -gt 0 ]]; do
case "$1" in case "$1" in
@@ -92,6 +96,14 @@ while [[ $# -gt 0 ]]; do
ETHAN_REPO_BRANCH="${2:-}" ETHAN_REPO_BRANCH="${2:-}"
shift 2 shift 2
;; ;;
--brice-repo-url)
BRICE_REPO_URL="${2:-}"
shift 2
;;
--brice-branch)
BRICE_REPO_BRANCH="${2:-}"
shift 2
;;
-h | --help) -h | --help)
usage usage
exit 0 exit 0
@@ -124,6 +136,8 @@ lxc_hostname="$2"
repo_branch="$3" repo_branch="$3"
ethan_repo_url="$4" ethan_repo_url="$4"
ethan_repo_branch="$5" ethan_repo_branch="$5"
brice_repo_url="$6"
brice_repo_branch="$7"
die() { die() {
printf 'Erreur: %s\n' "$*" >&2 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' main_repo_dir='/opt/chesscubing/repo'
ethan_repo_dir='/opt/chesscubing/ethan-repo' ethan_repo_dir='/opt/chesscubing/ethan-repo'
brice_repo_dir='/opt/chesscubing/brice-repo'
publish_root='/opt/chesscubing/publish' publish_root='/opt/chesscubing/publish'
web_root='/var/www/chesscubing/current' web_root='/var/www/chesscubing/current'
main_branch=\"\${1:-${repo_branch}}\" main_branch=\"\${1:-${repo_branch}}\"
ethan_repo_url='${ethan_repo_url}' ethan_repo_url='${ethan_repo_url}'
ethan_branch='${ethan_repo_branch}' ethan_branch='${ethan_repo_branch}'
brice_repo_url='${brice_repo_url}'
brice_branch='${brice_repo_branch}'
ensure_dotnet_sdk() { ensure_dotnet_sdk() {
if command -v dotnet >/dev/null 2>&1; then if command -v dotnet >/dev/null 2>&1; then
@@ -266,19 +283,32 @@ publish_static_tree() {
--include='*.webp' \ --include='*.webp' \
--include='*.ico' \ --include='*.ico' \
--include='*.pdf' \ --include='*.pdf' \
--include='*.json' \
--include='*.webmanifest' \ --include='*.webmanifest' \
--exclude='*' \ --exclude='*' \
\"\$source_dir/\" \"\$destination_dir/\" \"\$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 \"\$main_repo_dir\" '' \"\$main_branch\" 'principal'
sync_git_repo \"\$ethan_repo_dir\" \"\$ethan_repo_url\" \"\$ethan_branch\" 'Ethan' 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\" install -d -m 0755 \"\$web_root\" \"\$publish_root\"
publish_blazor_app \"\$main_repo_dir\" \"\$publish_root/main\" publish_blazor_app \"\$main_repo_dir\" \"\$publish_root/main\"
rsync -a --delete \"\$publish_root/main/wwwroot/\" \"\$web_root/\" rsync -a --delete \"\$publish_root/main/wwwroot/\" \"\$web_root/\"
publish_static_tree \"\$ethan_repo_dir\" \"\$web_root/ethan\" 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\" chown -R www-data:www-data \"\$web_root\"
@@ -304,11 +334,19 @@ server {
try_files \$uri \$uri/ /ethan/index.html; 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 / { location / {
try_files \$uri \$uri/ /index.html; 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; expires -1;
add_header Cache-Control 'no-cache, no-store, must-revalidate'; add_header Cache-Control 'no-cache, no-store, must-revalidate';
} }
@@ -337,7 +375,9 @@ if [[ "$LOCAL_MODE" == "1" ]]; then
"$LXC_HOSTNAME" \ "$LXC_HOSTNAME" \
"$REPO_BRANCH" \ "$REPO_BRANCH" \
"$ETHAN_REPO_URL" \ "$ETHAN_REPO_URL" \
"$ETHAN_REPO_BRANCH" "$ETHAN_REPO_BRANCH" \
"$BRICE_REPO_URL" \
"$BRICE_REPO_BRANCH"
exit 0 exit 0
fi fi
@@ -366,4 +406,6 @@ sshpass -p "$PROXMOX_PASSWORD" \
"$LXC_HOSTNAME" \ "$LXC_HOSTNAME" \
"$REPO_BRANCH" \ "$REPO_BRANCH" \
"$ETHAN_REPO_URL" \ "$ETHAN_REPO_URL" \
"$ETHAN_REPO_BRANCH" < "$payload_script" "$ETHAN_REPO_BRANCH" \
"$BRICE_REPO_URL" \
"$BRICE_REPO_BRANCH" < "$payload_script"

View File

@@ -25,6 +25,8 @@ Variables d'environnement reconnues :
CHESSCUBING_GIT_BRANCH CHESSCUBING_GIT_BRANCH
CHESSCUBING_ETHAN_REPO_URL CHESSCUBING_ETHAN_REPO_URL
CHESSCUBING_ETHAN_GIT_BRANCH CHESSCUBING_ETHAN_GIT_BRANCH
CHESSCUBING_BRICE_REPO_URL
CHESSCUBING_BRICE_GIT_BRANCH
EOF EOF
} }
@@ -91,6 +93,8 @@ CTID="${CHESSCUBING_CTID:-}"
LXC_HOSTNAME="${CHESSCUBING_LXC_HOSTNAME:-chesscubing-web}" LXC_HOSTNAME="${CHESSCUBING_LXC_HOSTNAME:-chesscubing-web}"
ETHAN_REPO_URL="${CHESSCUBING_ETHAN_REPO_URL:-https://git.jeannerot.fr/Mineloulou/Chesscubing.git}" ETHAN_REPO_URL="${CHESSCUBING_ETHAN_REPO_URL:-https://git.jeannerot.fr/Mineloulou/Chesscubing.git}"
ETHAN_REPO_BRANCH="${CHESSCUBING_ETHAN_GIT_BRANCH:-main}" 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 [[ -z "$LOCAL_MODE" && -z "$PROXMOX_HOST" ]]; then
if have_cmd pct && have_cmd pveam; then if have_cmd pct && have_cmd pveam; then
@@ -130,6 +134,8 @@ cmd=(
--branch "$REPO_BRANCH" --branch "$REPO_BRANCH"
--ethan-repo-url "$ETHAN_REPO_URL" --ethan-repo-url "$ETHAN_REPO_URL"
--ethan-branch "$ETHAN_REPO_BRANCH" --ethan-branch "$ETHAN_REPO_BRANCH"
--brice-repo-url "$BRICE_REPO_URL"
--brice-branch "$BRICE_REPO_BRANCH"
) )
if [[ "$LOCAL_MODE" == "1" ]]; then if [[ "$LOCAL_MODE" == "1" ]]; then