2024-10-12

This commit is contained in:
gcch 2024-10-12 16:36:04 +02:00
commit ee7c786dbd
77 changed files with 2868 additions and 2779 deletions

View file

@ -106,6 +106,7 @@
/* Dimensions */
--en-tete-hauteur: 60px;
--menu-categories-produits-hauteur: 54.39px;
--pied-de-page-hauteur: calc(var(--espace-m) * 2 + 3lh);
/* Espacements */
--espace-xs: 0.25rem;
--espace-s: 0.5rem;
@ -159,7 +160,7 @@ button, input, select, textarea {
background: var(--couleur-jaune);
}
/* Désaffiche tout élément avec l'attribut hidden */
/* Cache tout élément avec l'attribut hidden */
[hidden] {
display: none;
}
@ -394,6 +395,7 @@ ul.avec-puce-cercle a {
padding: var(--en-tete-marges-internes-bloc) var(--en-tete-marges-internes-ligne);
font-size: 1.1rem;
background: var(--couleur-gris);
border-bottom: 1px solid var(--couleur-noir);
/* TODO: Déplacer au sein d'un Composant ? */
}
#en-tete .logo {
@ -658,7 +660,7 @@ ul.avec-puce-cercle a {
.grille-produits__aucun-produit {
grid-column: span 3;
align-content: center;
min-height: calc(100vh - var(--menu-categories-produits-hauteur) - var(--en-tete-hauteur) - 105px);
min-height: calc(100vh - var(--menu-categories-produits-hauteur) - var(--en-tete-hauteur) - var(--pied-de-page-hauteur));
text-align: center;
}
.grille-produits__aucun-produit p + p {
@ -958,9 +960,6 @@ ul.avec-puce-cercle a {
letter-spacing: -0.5px;
}
/* *
* Le pied de page du site.
*/
#pied-de-page {
/* Marges */
--pied-de-page-marges-internes-bloc: var(--espace-m);
@ -969,8 +968,8 @@ ul.avec-puce-cercle a {
grid-template-columns: 1fr 1fr;
place-items: center;
max-width: 100vw;
height: var(--pied-de-page-hauteur);
padding: var(--pied-de-page-marges-internes-bloc) var(--pied-de-page-marges-internes-ligne);
line-height: var(--hauteur-ligne-classique);
background: var(--couleur-jaune);
border-top: 1px solid var(--couleur-noir);
}

File diff suppressed because one or more lines are too long

View file

@ -112,6 +112,7 @@
--espacement-inter-lettres-etendu-xl: 2px;
--en-tete-hauteur: 60px;
--menu-categories-produits-hauteur: 54.39px;
--pied-de-page-hauteur: calc(var(--espace-m) * 2 + 3lh);
--espace-xs: .25rem;
--espace-s: .5rem;
--espace-m: 1rem;
@ -335,6 +336,7 @@ ul.avec-puce-cercle a {
height: var(--en-tete-hauteur);
padding: var(--en-tete-marges-internes-bloc) var(--en-tete-marges-internes-ligne);
background: var(--couleur-gris);
border-bottom: 1px solid var(--couleur-noir);
flex-flow: row;
justify-content: space-between;
place-items: center;
@ -580,7 +582,7 @@ ul.avec-puce-cercle a {
}
.grille-produits__aucun-produit {
min-height: calc(100vh - var(--menu-categories-produits-hauteur) - var(--en-tete-hauteur) - 105px);
min-height: calc(100vh - var(--menu-categories-produits-hauteur) - var(--en-tete-hauteur) - var(--pied-de-page-hauteur));
text-align: center;
grid-column: span 3;
align-content: center;
@ -902,8 +904,8 @@ ul.avec-puce-cercle a {
#pied-de-page {
--pied-de-page-marges-internes-bloc: var(--espace-m);
--pied-de-page-marges-internes-ligne: var(--espace-xl);
height: var(--pied-de-page-hauteur);
padding: var(--pied-de-page-marges-internes-bloc) var(--pied-de-page-marges-internes-ligne);
line-height: var(--hauteur-ligne-classique);
background: var(--couleur-jaune);
border-top: 1px solid var(--couleur-noir);
grid-template-columns: 1fr 1fr;

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,46 @@
#page-accueil {
/* Dimensions */
--hauteur-conteneur: calc(100vh - var(--en-tete-hauteur) - var(--pied-de-page-hauteur));
/* Marges */
--page-marges-bloc-debut: var(--en-tete-hauteur);
overflow: hidden;
display: flex;
flex-flow: column nowrap;
min-height: var(--hauteur-conteneur);
max-height: var(--hauteur-conteneur);
margin-top: var(--page-marges-bloc-debut);
}
#page-accueil .storytelling {
scrollbar-width: none;
overflow-y: scroll;
place-items: center;
min-height: inherit;
max-height: inherit;
}
#page-accueil .storytelling__conteneur {
display: flex;
flex-flow: column nowrap;
min-height: calc(var(--hauteur-conteneur) * 10);
padding: 0 var(--espace-xl);
}
#page-accueil .storytelling__image {
position: sticky;
top: 0;
align-content: center;
width: 100%;
min-height: var(--hauteur-conteneur);
max-height: var(--hauteur-conteneur);
}
#page-accueil .storytelling__image[data-cache] {
visibility: hidden;
opacity: 0;
}
#page-accueil .storytelling__image img {
scale: 0.9;
max-height: inherit;
margin: auto;
object-fit: contain;
background: transparent;
}
/*# sourceMappingURL=page-accueil.css.map */

View file

@ -0,0 +1 @@
{"version":3,"sourceRoot":"","sources":["../../../src/sass/pages/page-accueil.scss"],"names":[],"mappings":"AAEA;AACE;EACA;AAEA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA","file":"page-accueil.css"}

View file

@ -0,0 +1,49 @@
#page-accueil {
--hauteur-conteneur: calc(100vh - var(--en-tete-hauteur) - var(--pied-de-page-hauteur));
--page-marges-bloc-debut: var(--en-tete-hauteur);
min-height: var(--hauteur-conteneur);
max-height: var(--hauteur-conteneur);
margin-top: var(--page-marges-bloc-debut);
flex-flow: column;
display: flex;
overflow: hidden;
}
#page-accueil .storytelling {
scrollbar-width: none;
min-height: inherit;
max-height: inherit;
place-items: center;
overflow-y: scroll;
}
#page-accueil .storytelling__conteneur {
min-height: calc(var(--hauteur-conteneur) * 10);
padding: 0 var(--espace-xl);
flex-flow: column;
display: flex;
}
#page-accueil .storytelling__image {
min-height: var(--hauteur-conteneur);
max-height: var(--hauteur-conteneur);
align-content: center;
width: 100%;
position: sticky;
top: 0;
}
#page-accueil .storytelling__image[data-cache] {
visibility: hidden;
opacity: 0;
}
#page-accueil .storytelling__image img {
max-height: inherit;
object-fit: contain;
background: none;
margin: auto;
scale: .9;
}
/*# sourceMappingURL=web/app/themes/haiku-atelier-2024/assets/css/pages/page-accueil.min.css.map */

View file

@ -0,0 +1 @@
{"version":3,"mappings":"AAAA;;;;;;;;;;;AAYA;;;;;;;;AAOA;;;;;;;AAMA;;;;;;;;;AAQA;;;;;AAIA","sources":["web/app/themes/haiku-atelier-2024/assets/css/pages/page-accueil.css"],"sourcesContent":["#page-accueil {\n /* Dimensions */\n --hauteur-conteneur: calc(100vh - var(--en-tete-hauteur) - var(--pied-de-page-hauteur));\n /* Marges */\n --page-marges-bloc-debut: var(--en-tete-hauteur);\n overflow: hidden;\n display: flex;\n flex-flow: column nowrap;\n min-height: var(--hauteur-conteneur);\n max-height: var(--hauteur-conteneur);\n margin-top: var(--page-marges-bloc-debut);\n}\n#page-accueil .storytelling {\n scrollbar-width: none;\n overflow-y: scroll;\n place-items: center;\n min-height: inherit;\n max-height: inherit;\n}\n#page-accueil .storytelling__conteneur {\n display: flex;\n flex-flow: column nowrap;\n min-height: calc(var(--hauteur-conteneur) * 10);\n padding: 0 var(--espace-xl);\n}\n#page-accueil .storytelling__image {\n position: sticky;\n top: 0;\n align-content: center;\n width: 100%;\n min-height: var(--hauteur-conteneur);\n max-height: var(--hauteur-conteneur);\n}\n#page-accueil .storytelling__image[data-cache] {\n visibility: hidden;\n opacity: 0;\n}\n#page-accueil .storytelling__image img {\n scale: 0.9;\n max-height: inherit;\n margin: auto;\n object-fit: contain;\n background: transparent;\n}\n\n/*# sourceMappingURL=page-accueil.css.map */\n"],"names":[]}

View file

@ -344,7 +344,7 @@
--menu-section-marges-bloc-debut: var(--en-tete-hauteur); /* 1 */
display: flex;
flex-flow: row wrap;
min-height: calc(100vh - var(--en-tete-hauteur) - 105px);
min-height: calc(100vh - var(--en-tete-hauteur) - var(--pied-de-page-hauteur));
margin-top: var(--menu-section-marges-bloc-debut);
}
#page-panier[data-contient-articles=false] .panneau {
@ -382,7 +382,7 @@
display: none;
flex-basis: 100%;
align-content: center;
min-height: calc(100vh - var(--en-tete-hauteur) - 105px);
min-height: calc(100vh - var(--en-tete-hauteur) - var(--pied-de-page-hauteur));
text-align: center;
}
#page-panier .panier-vide p {

View file

@ -380,7 +380,7 @@
#page-panier {
--menu-section-hauteur: var(--menu-categories-produits-hauteur);
--menu-section-marges-bloc-debut: var(--en-tete-hauteur);
min-height: calc(100vh - var(--en-tete-hauteur) - 105px);
min-height: calc(100vh - var(--en-tete-hauteur) - var(--pied-de-page-hauteur));
margin-top: var(--menu-section-marges-bloc-debut);
flex-flow: wrap;
display: flex;
@ -423,7 +423,7 @@
}
#page-panier .panier-vide {
min-height: calc(100vh - var(--en-tete-hauteur) - 105px);
min-height: calc(100vh - var(--en-tete-hauteur) - var(--pied-de-page-hauteur));
text-align: center;
flex-basis: 100%;
align-content: center;

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 296 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 585 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 627 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 635 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 635 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 353 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 379 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 444 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 462 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 491 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 486 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 554 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 605 KiB

View file

@ -17,10 +17,10 @@
],
"integrity": "sha512-BrOGLIo6Hd2bL9MbCd5YcISzpVZjfEBeq9PVKcKIWza4ycU1qmwPIyE2D/z4wLgps5iNAtHsGUI0JE0FzkdqCw=="
},
"_exports.D-K_zMCo.js": {
"file": "exports.D-K_zMCo.js",
"_exports.DMCTjIlP.js": {
"file": "exports.DMCTjIlP.js",
"name": "exports",
"integrity": "sha512-Ni3hTtCfn0bMn2baSlaQd67X7zSMi5qPb8spnFBQcAh9YmAYVsM91gS6tU0VTsBDLgX+rgPCPKWpd2KX35NjNw=="
"integrity": "sha512-4L1NzKs7XuOMvUiv40ZQLFZJItYzg2xO1M1/o+W9uoqJCevPc0wu43ims0AqUOnFutsTK+5kwQMlOUa82vCTdA=="
},
"_index.CCa5Y_L9.js": {
"file": "index.CCa5Y_L9.js",
@ -51,7 +51,7 @@
"name": "dom",
"src": "web/app/themes/haiku-atelier-2024/src/scripts/constantes/dom.ts",
"isEntry": true,
"integrity": "sha512-l9s8C0IttUY6bsApERfqCuEoZzF9AIHa/D2fMPjvBXOSdChM5oYqLsLyRadUeif51CR6OwNYivTjvw6TN1VRJA=="
"integrity": "sha512-TRKlKpx3Dv5K4Vh0v/dJ+coW8iGh7cI/HVHStw2Un0CaL9qAEGEulyM8wNSQU+j8F4YEjFDkvIe+xdl0zhqK+g=="
},
"web/app/themes/haiku-atelier-2024/src/scripts/constantes/messages.ts": {
"file": "messages3.js",
@ -68,9 +68,9 @@
"imports": [
"_chunk-7BKSRZNG.C39W3Wne.js",
"web/app/themes/haiku-atelier-2024/src/scripts/constantes/api.ts",
"_exports.D-K_zMCo.js"
"_exports.DMCTjIlP.js"
],
"integrity": "sha512-ds59FiRHCNygXUzWjGmbLzhMtYxqEv35F3htG4iYyg/67sZPvPG/Iu2itE/s0JUbnhC5XRUnTJHIe0AkchBGLA=="
"integrity": "sha512-XpGDOLUY4PLP0p/yxZmZCyhkVUtzngnYaxFWRmnOBPxiBhktC2FykJrj8DcMpKOyP9Tl7yBXo57iDJOE1vdg2g=="
},
"web/app/themes/haiku-atelier-2024/src/scripts/lib/dom.ts": {
"file": "dom2.js",
@ -81,9 +81,9 @@
"_chunk-7BKSRZNG.C39W3Wne.js",
"web/app/themes/haiku-atelier-2024/src/scripts/lib/erreurs.ts",
"_Either.wHNxn7Os.js",
"_exports.D-K_zMCo.js"
"_exports.DMCTjIlP.js"
],
"integrity": "sha512-zesUzaLaAzT1XJDxIRrX16Xhfz0jnKRri6HBUt7fopcaV/u1oyD4gkwlvwQ00SBGE8o8x9zb5zfbiSrG+56KAQ=="
"integrity": "sha512-JU7RsVTWPHg2I0WExRth2ruOJ6in7aZjxOXqlfRqnjyoEFqNrLk/+JKVkQw9Vz4CP72h4iLvOu87Ui5e3ENWGg=="
},
"web/app/themes/haiku-atelier-2024/src/scripts/lib/erreurs.ts": {
"file": "erreurs.js",
@ -91,9 +91,9 @@
"src": "web/app/themes/haiku-atelier-2024/src/scripts/lib/erreurs.ts",
"isEntry": true,
"imports": [
"_exports.D-K_zMCo.js"
"_exports.DMCTjIlP.js"
],
"integrity": "sha512-8jx0w9HHaZKMDXlVdNotzMQgSRiEz7kqlBgPNyc350Hj9qNBw+HN59E6S6aE8Cwfavx7bzOlKvjIzw44C/y0Tg=="
"integrity": "sha512-26oIC4zwdy0uZX84KHlJTXu3AXGoKS9rmUjil6crdd7Jxusl6eLnNUbG4uQnK5tB20Yi7y7uiuixytoDBSxZ+g=="
},
"web/app/themes/haiku-atelier-2024/src/scripts/lib/gardes.ts": {
"file": "gardes.js",
@ -124,11 +124,18 @@
"web/app/themes/haiku-atelier-2024/src/scripts/lib/erreurs.ts",
"web/app/themes/haiku-atelier-2024/src/scripts/lib/schemas/messages.ts",
"_Either.wHNxn7Os.js",
"_exports.D-K_zMCo.js",
"_exports.DMCTjIlP.js",
"web/app/themes/haiku-atelier-2024/src/scripts/lib/schemas/cart.ts",
"web/app/themes/haiku-atelier-2024/src/scripts/constantes/cart.ts"
],
"integrity": "sha512-ueOLzf6AclHDqUTAn6d2bKp/rlI6vfXPcH2iz8QoSPhDsh5XgMsHAkyb1RcUJFlbhNMMBz/2IN67UFrjZl3KHQ=="
"integrity": "sha512-txyIVexRgXbPLkSwTFO9si1mvKV1dO2v04q8wozhdn1YHfnCojwbJBciVP6MyGat6TQqNI/hBdpeOnvFcOGc8A=="
},
"web/app/themes/haiku-atelier-2024/src/scripts/lib/nombres.ts": {
"file": "nombres.js",
"name": "nombres",
"src": "web/app/themes/haiku-atelier-2024/src/scripts/lib/nombres.ts",
"isEntry": true,
"integrity": "sha512-XPtMZFCIRf/3zJ6euavv0QyRSKRTSGJfLkC5k2AwiAsDBU/GAhtz2ymHe6y6Ouj494EiO5Mh/vAaAuD1D8i9kg=="
},
"web/app/themes/haiku-atelier-2024/src/scripts/lib/reseau.ts": {
"file": "reseau.js",
@ -142,9 +149,9 @@
"web/app/themes/haiku-atelier-2024/src/scripts/constantes/api.ts",
"web/app/themes/haiku-atelier-2024/src/scripts/lib/erreurs.ts",
"web/app/themes/haiku-atelier-2024/src/scripts/lib/schemas/erreurs.ts",
"_exports.D-K_zMCo.js"
"_exports.DMCTjIlP.js"
],
"integrity": "sha512-OLtCV6IaAkXA3zvwQ3mIh/92DSm3bhEpo+c9UG7Z53+JrSJIPw+qHQYgDh3ev7kfEMGrtdBJsmjbDGc35veeFA=="
"integrity": "sha512-NvN86x4tFNVdlV/fniGzu20tlqfPTk2VaElCMfu+DofDgvceQOh9c6smO+KrrT9G7tXm7Lz6FGUjdSoIoasY2A=="
},
"web/app/themes/haiku-atelier-2024/src/scripts/lib/schemas/adresses.ts": {
"file": "adresses.js",
@ -237,13 +244,13 @@
"src": "web/app/themes/haiku-atelier-2024/src/scripts/lib/utils.ts",
"isEntry": true,
"imports": [
"_chunk-7BKSRZNG.C39W3Wne.js",
"web/app/themes/haiku-atelier-2024/src/scripts/lib/dom.ts",
"web/app/themes/haiku-atelier-2024/src/scripts/lib/erreurs.ts",
"_Either.wHNxn7Os.js",
"_chunk-7BKSRZNG.C39W3Wne.js",
"_exports.D-K_zMCo.js"
"_exports.DMCTjIlP.js"
],
"integrity": "sha512-GbY58x/EIklbx4niIHz9o362sp1OXllGe7k7OEUfPzszYehf81x8haRqwB2TexTLfn81UjowgcIk2GFusmXaiA=="
"integrity": "sha512-b3ureP5fNxOPCzsVZuPzqkEXubSm59zqn4U6WNglZXvaWYGrIWDliBgHwDzR9RwqSqNQU5bmpkZ3JNICJRYRMw=="
},
"web/app/themes/haiku-atelier-2024/src/scripts/scripts-bouton-panier.ts": {
"file": "scripts-bouton-panier.js",
@ -258,14 +265,31 @@
"web/app/themes/haiku-atelier-2024/src/scripts/lib/messages.ts",
"web/app/themes/haiku-atelier-2024/src/scripts/lib/utils.ts",
"web/app/themes/haiku-atelier-2024/src/scripts/lib/erreurs.ts",
"_exports.D-K_zMCo.js",
"_exports.DMCTjIlP.js",
"_Either.wHNxn7Os.js",
"_index.CCa5Y_L9.js",
"web/app/themes/haiku-atelier-2024/src/scripts/lib/schemas/messages.ts",
"web/app/themes/haiku-atelier-2024/src/scripts/lib/schemas/cart.ts",
"web/app/themes/haiku-atelier-2024/src/scripts/constantes/cart.ts"
],
"integrity": "sha512-lanrZj5Z0DqxP6rozyO78F5Wk2pcA6JCgAd6LiVCR3O/+QsdrfGm18QChaA+XMQU9kvb0NCRdJZxuIe3Ha/OKQ=="
"integrity": "sha512-5kXYj+AE5jMTevcUBOZGPCwHBU4dhilcFP9NQe3SvI2VvJIiGzlr/aVh1OLJ6w/X/iNYvf3cl0f+p+lo2BKwoA=="
},
"web/app/themes/haiku-atelier-2024/src/scripts/scripts-page-accueil.ts": {
"file": "scripts-page-accueil.js",
"name": "scripts-page-accueil",
"src": "web/app/themes/haiku-atelier-2024/src/scripts/scripts-page-accueil.ts",
"isEntry": true,
"imports": [
"web/app/themes/haiku-atelier-2024/src/scripts/constantes/dom.ts",
"web/app/themes/haiku-atelier-2024/src/scripts/lib/nombres.ts",
"web/app/themes/haiku-atelier-2024/src/scripts/lib/utils.ts",
"_chunk-7BKSRZNG.C39W3Wne.js",
"web/app/themes/haiku-atelier-2024/src/scripts/lib/dom.ts",
"web/app/themes/haiku-atelier-2024/src/scripts/lib/erreurs.ts",
"_exports.DMCTjIlP.js",
"_Either.wHNxn7Os.js"
],
"integrity": "sha512-FPEzyKVN5yR1bFurSMzgKI+mnFQqWe/VJVWv7ZakzzqicbKDak6yGjbuxV+Em/pffaDttGmNhO7bW83t3dB08A=="
},
"web/app/themes/haiku-atelier-2024/src/scripts/scripts-page-panier.ts": {
"file": "scripts-page-panier.js",
@ -290,14 +314,14 @@
"web/app/themes/haiku-atelier-2024/src/scripts/lib/schemas/cart-update-customer.ts",
"web/app/themes/haiku-atelier-2024/src/scripts/lib/schemas/cart-update-item.ts",
"_Either.wHNxn7Os.js",
"_exports.D-K_zMCo.js",
"_exports.DMCTjIlP.js",
"web/app/themes/haiku-atelier-2024/src/scripts/lib/schemas/messages.ts",
"_index.CeK6pfoJ.js",
"web/app/themes/haiku-atelier-2024/src/scripts/lib/schemas/erreurs.ts",
"web/app/themes/haiku-atelier-2024/src/scripts/constantes/cart.ts",
"web/app/themes/haiku-atelier-2024/src/scripts/lib/schemas/adresses.ts"
],
"integrity": "sha512-YNbhd8qcZTJ/5yIhr6FbJJRb44VdCQlxaEuA2Hbb6UG6dYsh1QwUO4MFvmJj6r+qFGN0p/yftAbEJIptrNbiBQ=="
"integrity": "sha512-8GSJr7ShZETNpEpcyGSYv4uohHCOibRIbWct+4Qppcc5g8W9YmBMxQ6zOFD3mUHWpq/MHcqfeyA00hAAb6+8TQ=="
},
"web/app/themes/haiku-atelier-2024/src/scripts/scripts-page-produit.ts": {
"file": "scripts-page-produit.js",
@ -320,11 +344,11 @@
"web/app/themes/haiku-atelier-2024/src/scripts/lib/schemas/cart-add-item.ts",
"web/app/themes/haiku-atelier-2024/src/scripts/lib/schemas/erreurs.ts",
"_Either.wHNxn7Os.js",
"_exports.D-K_zMCo.js",
"_exports.DMCTjIlP.js",
"web/app/themes/haiku-atelier-2024/src/scripts/constantes/messages.ts",
"web/app/themes/haiku-atelier-2024/src/scripts/lib/schemas/messages.ts",
"web/app/themes/haiku-atelier-2024/src/scripts/constantes/cart.ts"
],
"integrity": "sha512-wmjIbZCeICj0EF00ozg1W3Iso/Mc3kILlndDYLIFu9/t2E4aS9xnD3gdbIXAUyAgokZW1a5P0jShEaNvyd2MAw=="
"integrity": "sha512-nCQjnWYyJKCD6nxZIQHC2S20lpQH3u5DHf4mXHaT+K0/NeltuwhIWs3REhHsFo4XVhp3uInBv9KQMhkTi1nwFQ=="
}
}

View file

@ -1,8 +1,11 @@
const ATTRIBUT_ARIA_HIDDEN = "aria-hidden";
const ATTRIBUT_ARIA_SELECTED = "aria-selected";
const ATTRIBUT_HIDDEN = "hidden";
const ATTRIBUT_CACHE = "data-cache";
const ATTRIBUT_CLE_PANIER = "data-cle-panier";
const ATTRIBUT_CONTIENT_ARTICLES = "data-contient-articles";
const ATTRIBUT_DESACTIVE = "disabled";
const ATTRIBUT_CLE_PANIER = "data-cle-panier";
const ATTRIBUT_HIDDEN = "hidden";
const ATTRIBUT_INDEX = "data-index";
const SELECTEUR_CONTENEUR_PANIER = "#page-panier";
const SELECTEUR_BOUTON_PANIER = ".compte-panier a[rel='cart']";
const SELECTEUR_SELECTEUR_QUANTITE = "#selecteur-variation";
@ -22,30 +25,37 @@ const SELECTEUR_FORMULAIRE_PANIER = "#panneau-informations-client form";
const SELECTEUR_FORMULAIRE_LIVRAISON = "#panneau-informations-client .panneau__formulaires__livraison";
const SELECTEUR_FORMULAIRE_FACTURATION = "#panneau-informations-client .panneau__formulaires__facturation";
const SELECTEUR_BOUTON_ACTIONS_FORMULAIRE = "#panneau-informations-client .panneau__pied-de-page button";
const SELECTEUR_CONTENEUR_STORYTELLING = ".storytelling";
const SELECTEUR_IMAGES_STORYTELLING = ".storytelling__image";
export {
ATTRIBUT_CONTIENT_ARTICLES as A,
ATTRIBUT_ARIA_SELECTED as B,
SELECTEUR_BOUTON_PANIER as S,
SELECTEUR_ENTREES_PANIER as a,
SELECTEUR_CONTENEUR_PANIER as b,
SELECTEUR_SOUS_TOTAL_PANIER as c,
SELECTEUR_TOTAL_PANIER as d,
SELECTEUR_BOUTON_SEPARATION_ADRESSES as e,
SELECTEUR_FORMULAIRE_PANIER as f,
SELECTEUR_FORMULAIRE_LIVRAISON as g,
SELECTEUR_FORMULAIRE_FACTURATION as h,
SELECTEUR_BOUTON_ACTIONS_FORMULAIRE as i,
ATTRIBUT_CLE_PANIER as j,
SELECTEUR_BOUTON_SOUSTRACTION_QUANTITE as k,
SELECTEUR_CHAMP_QUANTITE_LIGNE_PANIER as l,
SELECTEUR_BOUTON_ADDITION_QUANTITE as m,
SELECTEUR_BOUTON_SUPPRESSION_PANIER as n,
SELECTEUR_PRIX_LIGNE_PANIER as o,
ATTRIBUT_HIDDEN as p,
ATTRIBUT_DESACTIVE as q,
SELECTEUR_BOUTON_AJOUT_PANIER as r,
SELECTEUR_SELECTEUR_QUANTITE as s,
SELECTEUR_LIENS_ONGLETS as t,
SELECTEUR_SECTIONS_CONTENUS as u,
ATTRIBUT_ARIA_SELECTED as v
SELECTEUR_CONTENEUR_STORYTELLING as a,
SELECTEUR_IMAGES_STORYTELLING as b,
ATTRIBUT_INDEX as c,
ATTRIBUT_CACHE as d,
ATTRIBUT_ARIA_HIDDEN as e,
SELECTEUR_ENTREES_PANIER as f,
SELECTEUR_CONTENEUR_PANIER as g,
SELECTEUR_SOUS_TOTAL_PANIER as h,
SELECTEUR_TOTAL_PANIER as i,
SELECTEUR_BOUTON_SEPARATION_ADRESSES as j,
SELECTEUR_FORMULAIRE_PANIER as k,
SELECTEUR_FORMULAIRE_LIVRAISON as l,
SELECTEUR_FORMULAIRE_FACTURATION as m,
SELECTEUR_BOUTON_ACTIONS_FORMULAIRE as n,
ATTRIBUT_CLE_PANIER as o,
SELECTEUR_BOUTON_SOUSTRACTION_QUANTITE as p,
SELECTEUR_CHAMP_QUANTITE_LIGNE_PANIER as q,
SELECTEUR_BOUTON_ADDITION_QUANTITE as r,
SELECTEUR_BOUTON_SUPPRESSION_PANIER as s,
SELECTEUR_PRIX_LIGNE_PANIER as t,
ATTRIBUT_HIDDEN as u,
ATTRIBUT_DESACTIVE as v,
SELECTEUR_BOUTON_AJOUT_PANIER as w,
SELECTEUR_SELECTEUR_QUANTITE as x,
SELECTEUR_LIENS_ONGLETS as y,
SELECTEUR_SECTIONS_CONTENUS as z
};
//# sourceMappingURL=dom.js.map

View file

@ -1 +1 @@
{"version":3,"file":"dom.js","sources":["../../src/scripts/constantes/dom.ts"],"sourcesContent":["/** Constantes de valeurs pour la manipulation du DOM : sélecteurs et attributs. */\n\nexport const ATTRIBUT_ARIA_SELECTED = \"aria-selected\";\nexport const ATTRIBUT_ARIA_HIDDEN = \"aria-hidden\";\nexport const ATTRIBUT_HIDDEN = \"hidden\";\nexport const ATTRIBUT_CONTIENT_ARTICLES = \"data-contient-articles\";\nexport const ATTRIBUT_DESACTIVE = \"disabled\";\nexport const ATTRIBUT_CLE_PANIER = \"data-cle-panier\";\n\nexport const SELECTEUR_CONTENEUR_PANIER = \"#page-panier\";\nexport const SELECTEUR_BOUTON_PANIER = \".compte-panier a[rel='cart']\";\nexport const SELECTEUR_SELECTEUR_QUANTITE = \"#selecteur-variation\";\nexport const SELECTEUR_BOUTON_AJOUT_PANIER = \"#bouton-ajout-panier\";\nexport const SELECTEUR_LIENS_ONGLETS = \"a[role='tab']\";\nexport const SELECTEUR_SECTIONS_CONTENUS = \"section[role='tabpanel']\";\n\n// Panier\nexport const SELECTEUR_ENTREES_PANIER = \"article\";\nexport const SELECTEUR_BOUTON_SUPPRESSION_PANIER = \"button.detail-produit__actions__suppression\";\nexport const SELECTEUR_BOUTON_SOUSTRACTION_QUANTITE = \"button.detail-produit__actions__soustraction\";\nexport const SELECTEUR_BOUTON_ADDITION_QUANTITE = \"button.detail-produit__actions__addition\";\nexport const SELECTEUR_CHAMP_QUANTITE_LIGNE_PANIER = \"input\";\nexport const SELECTEUR_PRIX_LIGNE_PANIER = \".detail-produit__nom-prix span\";\nexport const SELECTEUR_SOUS_TOTAL_PANIER = \"#panneau-panier .panneau__sous-totaux__ligne strong\";\nexport const SELECTEUR_TOTAL_PANIER = \"#panneau-panier .panneau__pied-de-page p span\";\nexport const SELECTEUR_BOUTON_SEPARATION_ADRESSES = \"#separation-adresses\";\nexport const SELECTEUR_FORMULAIRE_PANIER = \"#panneau-informations-client form\";\nexport const SELECTEUR_FORMULAIRE_LIVRAISON = \"#panneau-informations-client .panneau__formulaires__livraison\";\nexport const SELECTEUR_FORMULAIRE_FACTURATION = \"#panneau-informations-client .panneau__formulaires__facturation\";\nexport const SELECTEUR_BOUTON_ACTIONS_FORMULAIRE = \"#panneau-informations-client .panneau__pied-de-page button\";\n"],"names":[],"mappings":"AAEO,MAAM,yBAAyB;AAE/B,MAAM,kBAAkB;AACxB,MAAM,6BAA6B;AACnC,MAAM,qBAAqB;AAC3B,MAAM,sBAAsB;AAE5B,MAAM,6BAA6B;AACnC,MAAM,0BAA0B;AAChC,MAAM,+BAA+B;AACrC,MAAM,gCAAgC;AACtC,MAAM,0BAA0B;AAChC,MAAM,8BAA8B;AAGpC,MAAM,2BAA2B;AACjC,MAAM,sCAAsC;AAC5C,MAAM,yCAAyC;AAC/C,MAAM,qCAAqC;AAC3C,MAAM,wCAAwC;AAC9C,MAAM,8BAA8B;AACpC,MAAM,8BAA8B;AACpC,MAAM,yBAAyB;AAC/B,MAAM,uCAAuC;AAC7C,MAAM,8BAA8B;AACpC,MAAM,iCAAiC;AACvC,MAAM,mCAAmC;AACzC,MAAM,sCAAsC;"}
{"version":3,"file":"dom.js","sources":["../../src/scripts/constantes/dom.ts"],"sourcesContent":["/** Constantes de valeurs pour la manipulation du DOM : sélecteurs et attributs. */\n\nexport const ATTRIBUT_ARIA_HIDDEN = \"aria-hidden\";\nexport const ATTRIBUT_ARIA_SELECTED = \"aria-selected\";\nexport const ATTRIBUT_CACHE = \"data-cache\";\nexport const ATTRIBUT_CLE_PANIER = \"data-cle-panier\";\nexport const ATTRIBUT_CONTIENT_ARTICLES = \"data-contient-articles\";\nexport const ATTRIBUT_DESACTIVE = \"disabled\";\nexport const ATTRIBUT_HIDDEN = \"hidden\";\nexport const ATTRIBUT_INDEX = \"data-index\";\n\nexport const SELECTEUR_CONTENEUR_PANIER = \"#page-panier\";\nexport const SELECTEUR_BOUTON_PANIER = \".compte-panier a[rel='cart']\";\nexport const SELECTEUR_SELECTEUR_QUANTITE = \"#selecteur-variation\";\nexport const SELECTEUR_BOUTON_AJOUT_PANIER = \"#bouton-ajout-panier\";\nexport const SELECTEUR_LIENS_ONGLETS = \"a[role='tab']\";\nexport const SELECTEUR_SECTIONS_CONTENUS = \"section[role='tabpanel']\";\n\n// Panier\nexport const SELECTEUR_ENTREES_PANIER = \"article\";\nexport const SELECTEUR_BOUTON_SUPPRESSION_PANIER = \"button.detail-produit__actions__suppression\";\nexport const SELECTEUR_BOUTON_SOUSTRACTION_QUANTITE = \"button.detail-produit__actions__soustraction\";\nexport const SELECTEUR_BOUTON_ADDITION_QUANTITE = \"button.detail-produit__actions__addition\";\nexport const SELECTEUR_CHAMP_QUANTITE_LIGNE_PANIER = \"input\";\nexport const SELECTEUR_PRIX_LIGNE_PANIER = \".detail-produit__nom-prix span\";\nexport const SELECTEUR_SOUS_TOTAL_PANIER = \"#panneau-panier .panneau__sous-totaux__ligne strong\";\nexport const SELECTEUR_TOTAL_PANIER = \"#panneau-panier .panneau__pied-de-page p span\";\nexport const SELECTEUR_BOUTON_SEPARATION_ADRESSES = \"#separation-adresses\";\nexport const SELECTEUR_FORMULAIRE_PANIER = \"#panneau-informations-client form\";\nexport const SELECTEUR_FORMULAIRE_LIVRAISON = \"#panneau-informations-client .panneau__formulaires__livraison\";\nexport const SELECTEUR_FORMULAIRE_FACTURATION = \"#panneau-informations-client .panneau__formulaires__facturation\";\nexport const SELECTEUR_BOUTON_ACTIONS_FORMULAIRE = \"#panneau-informations-client .panneau__pied-de-page button\";\n\n// Accueil\nexport const SELECTEUR_CONTENEUR_STORYTELLING = \".storytelling\";\nexport const SELECTEUR_IMAGES_STORYTELLING = \".storytelling__image\";\n"],"names":[],"mappings":"AAEO,MAAM,uBAAuB;AAC7B,MAAM,yBAAyB;AAC/B,MAAM,iBAAiB;AACvB,MAAM,sBAAsB;AAC5B,MAAM,6BAA6B;AACnC,MAAM,qBAAqB;AAC3B,MAAM,kBAAkB;AACxB,MAAM,iBAAiB;AAEvB,MAAM,6BAA6B;AACnC,MAAM,0BAA0B;AAChC,MAAM,+BAA+B;AACrC,MAAM,gCAAgC;AACtC,MAAM,0BAA0B;AAChC,MAAM,8BAA8B;AAGpC,MAAM,2BAA2B;AACjC,MAAM,sCAAsC;AAC5C,MAAM,yCAAyC;AAC/C,MAAM,qCAAqC;AAC3C,MAAM,wCAAwC;AAC9C,MAAM,8BAA8B;AACpC,MAAM,8BAA8B;AACpC,MAAM,yBAAyB;AAC/B,MAAM,uCAAuC;AAC7C,MAAM,8BAA8B;AACpC,MAAM,iCAAiC;AACvC,MAAM,mCAAmC;AACzC,MAAM,sCAAsC;AAG5C,MAAM,mCAAmC;AACzC,MAAM,gCAAgC;"}

View file

@ -1,7 +1,7 @@
import { x } from "./chunk-7BKSRZNG.C39W3Wne.js";
import { e as creeSyntaxError, f as reporteEtLeveErreur, g as ERREUR_SYNTAXE_INVALIDE, h as ERREUR_SELECTEUR_INEXISTANT } from "./erreurs.js";
import { E as Either, r as right, l as left } from "./Either.wHNxn7Os.js";
import "./exports.D-K_zMCo.js";
import "./exports.DMCTjIlP.js";
function n$1(l) {
return l !== null;
}

View file

@ -1,4 +1,4 @@
import { $ as captureException } from "./exports.D-K_zMCo.js";
import { $ as captureException } from "./exports.DMCTjIlP.js";
const ERREUR_SYNTAXE_INVALIDE = (selecteur) => `Le selecteur "${selecteur}" est invalide`;
const ERREUR_SELECTEUR_INEXISTANT = (selecteur) => `La requête "${selecteur}" n'a retourné aucun Élément.`;
const creeSyntaxError = (message) => new SyntaxError(message);

File diff suppressed because one or more lines are too long

View file

@ -81,7 +81,7 @@ function safeJoin(input, delimiter) {
}
return output.join(delimiter);
}
const SDK_VERSION = "8.34.0-internal.0";
const SDK_VERSION = "8.34.0";
const GLOBAL_OBJ = globalThis;
function getGlobalSingleton(name, creator, obj) {
const gbl = GLOBAL_OBJ;
@ -2169,4 +2169,4 @@ export {
isThenable as y,
isPlainObject as z
};
//# sourceMappingURL=exports.D-K_zMCo.js.map
//# sourceMappingURL=exports.DMCTjIlP.js.map

File diff suppressed because one or more lines are too long

View file

@ -1,6 +1,6 @@
import { x } from "./chunk-7BKSRZNG.C39W3Wne.js";
import { E as ENTETE_GLITCHTIP_RATE_LIMITS, a as ENTETE_GLITCHTIP_RETRY_AFTER } from "./api.js";
import { i as isInstanceOf, t as truncate, c as consoleSandbox, D as DEBUG_BUILD$1, l as logger, g as getFunctionName, G as GLOBAL_OBJ, C as CONSOLE_LEVELS, f as fill, o as originalConsoleMethods, a as timestampInSeconds, b as isError, d as addNonEnumerableProperty, r as rejectedSyncPromise, S as SyncPromise, e as resolvedSyncPromise, h as dropUndefinedKeys, n as normalize, j as dateTimestampInSeconds, k as DEBUG_BUILD$2, u as urlEncode, m as uuid4, p as checkOrSetAlreadyCaught, q as isPrimitive, s as updateSession, v as prepareEvent, w as getDynamicSamplingContextFromClient, x as getIsolationScope, y as isThenable, z as isPlainObject, A as isParameterizedString, B as SDK_VERSION, E as getClient, F as getOriginalFunction, H as getFramesFromEvent, I as addExceptionMechanism, J as isErrorEvent$1, K as isDOMError, L as isDOMException, M as addExceptionTypeValue, N as isEvent, O as normalizeToSize, P as extractExceptionKeysForMessage, Q as isString, R as createStackParser, U as UNKNOWN_FUNCTION, T as getEventDescription, V as htmlTreeAsString, W as safeJoin, X as getComponentName, Y as captureEvent, Z as getLocationHref, _ as getCurrentScope } from "./exports.D-K_zMCo.js";
import { i as isInstanceOf, t as truncate, c as consoleSandbox, D as DEBUG_BUILD$1, l as logger, g as getFunctionName, G as GLOBAL_OBJ, C as CONSOLE_LEVELS, f as fill, o as originalConsoleMethods, a as timestampInSeconds, b as isError, d as addNonEnumerableProperty, r as rejectedSyncPromise, S as SyncPromise, e as resolvedSyncPromise, h as dropUndefinedKeys, n as normalize, j as dateTimestampInSeconds, k as DEBUG_BUILD$2, u as urlEncode, m as uuid4, p as checkOrSetAlreadyCaught, q as isPrimitive, s as updateSession, v as prepareEvent, w as getDynamicSamplingContextFromClient, x as getIsolationScope, y as isThenable, z as isPlainObject, A as isParameterizedString, B as SDK_VERSION, E as getClient, F as getOriginalFunction, H as getFramesFromEvent, I as addExceptionMechanism, J as isErrorEvent$1, K as isDOMError, L as isDOMException, M as addExceptionTypeValue, N as isEvent, O as normalizeToSize, P as extractExceptionKeysForMessage, Q as isString, R as createStackParser, U as UNKNOWN_FUNCTION, T as getEventDescription, V as htmlTreeAsString, W as safeJoin, X as getComponentName, Y as captureEvent, Z as getLocationHref, _ as getCurrentScope } from "./exports.DMCTjIlP.js";
function applyAggregateErrorsToEvent(exceptionFromErrorImplementation, parser, maxValueLimit = 250, key, limit, event, hint) {
if (!event.exception || !event.exception.values || !hint || !isInstanceOf(hint.originalException, Error)) {
return;

File diff suppressed because one or more lines are too long

View file

@ -3,7 +3,7 @@ import { N as NOM_CANAL_BOUTON_PANIER, T as TYPES_MESSAGES, a as NOM_CANAL_CONTE
import { r as reporteErreur } from "./erreurs.js";
import { M as MessageMajBoutonPanierSchema, a as MessageMajContenuPanierSchema } from "./messages2.js";
import { E as Either } from "./Either.wHNxn7Os.js";
import "./exports.D-K_zMCo.js";
import "./exports.DMCTjIlP.js";
import "./cart.js";
import "./cart2.js";
const emetMessageMajBoutonPanier = (args) => {

View file

@ -0,0 +1,29 @@
function _gte(a, b) {
return a >= b;
}
function gte() {
if (arguments.length === 1) {
const args = arguments;
return function fn(data) {
return _gte(data, args[0]);
};
}
return _gte(arguments[0], arguments[1]);
}
function _lt(a, b) {
return a < b;
}
function lt() {
if (arguments.length === 1) {
const args = arguments;
return function fn(data) {
return _lt(data, args[0]);
};
}
return _lt(arguments[0], arguments[1]);
}
const estEntreDeuxNombres = (nombre, min, max) => gte(nombre, min) && lt(nombre, max);
export {
estEntreDeuxNombres as e
};
//# sourceMappingURL=nombres.js.map

View file

@ -0,0 +1 @@
{"version":3,"file":"nombres.js","sources":["../../../../../../node_modules/.pnpm/@mobily+ts-belt@3.13.1/node_modules/@mobily/ts-belt/dist/esm/Number/index.js","../../src/scripts/lib/nombres.ts"],"sourcesContent":["// node_modules/rescript/lib/es6/caml_int32.js\nfunction mod_(x, y) {\n if (y === 0) {\n throw {\n RE_EXN_ID: \"Division_by_zero\",\n Error: new Error()\n };\n }\n return x % y;\n}\n\n// src/Number/Number.bs.js\nfunction placeholder(param) {\n}\nfunction pred(n) {\n return n - 1 | 0;\n}\nfunction succ(n) {\n return n + 1 | 0;\n}\nfunction _add(a, b) {\n return a + b;\n}\nfunction add() {\n if (arguments.length === 1) {\n const args = arguments;\n return function fn(data) {\n return _add(data, args[0]);\n };\n }\n return _add(arguments[0], arguments[1]);\n}\nfunction _subtract(a, b) {\n return a - b;\n}\nfunction subtract() {\n if (arguments.length === 1) {\n const args = arguments;\n return function fn(data) {\n return _subtract(data, args[0]);\n };\n }\n return _subtract(arguments[0], arguments[1]);\n}\nfunction _multiply(a, b) {\n return a * b;\n}\nfunction multiply() {\n if (arguments.length === 1) {\n const args = arguments;\n return function fn(data) {\n return _multiply(data, args[0]);\n };\n }\n return _multiply(arguments[0], arguments[1]);\n}\nfunction _divide(a, b) {\n return a / b;\n}\nfunction divide() {\n if (arguments.length === 1) {\n const args = arguments;\n return function fn(data) {\n return _divide(data, args[0]);\n };\n }\n return _divide(arguments[0], arguments[1]);\n}\nvar _modulo = mod_;\nfunction modulo() {\n if (arguments.length === 1) {\n const args = arguments;\n return function fn(data) {\n return _modulo(data, args[0]);\n };\n }\n return _modulo(arguments[0], arguments[1]);\n}\nfunction _divideWithModulo(a, b) {\n return [\n a / b,\n mod_(a | 0, b | 0)\n ];\n}\nfunction divideWithModulo() {\n if (arguments.length === 1) {\n const args = arguments;\n return function fn(data) {\n return _divideWithModulo(data, args[0]);\n };\n }\n return _divideWithModulo(arguments[0], arguments[1]);\n}\nfunction _gt(a, b) {\n return a > b;\n}\nfunction gt() {\n if (arguments.length === 1) {\n const args = arguments;\n return function fn(data) {\n return _gt(data, args[0]);\n };\n }\n return _gt(arguments[0], arguments[1]);\n}\nfunction _gte(a, b) {\n return a >= b;\n}\nfunction gte() {\n if (arguments.length === 1) {\n const args = arguments;\n return function fn(data) {\n return _gte(data, args[0]);\n };\n }\n return _gte(arguments[0], arguments[1]);\n}\nfunction _lt(a, b) {\n return a < b;\n}\nfunction lt() {\n if (arguments.length === 1) {\n const args = arguments;\n return function fn(data) {\n return _lt(data, args[0]);\n };\n }\n return _lt(arguments[0], arguments[1]);\n}\nfunction _lte(a, b) {\n return a <= b;\n}\nfunction lte() {\n if (arguments.length === 1) {\n const args = arguments;\n return function fn(data) {\n return _lte(data, args[0]);\n };\n }\n return _lte(arguments[0], arguments[1]);\n}\nfunction _clamp(num, min, max) {\n return Math.min(Math.max(num, min), max);\n}\nfunction clamp() {\n if (arguments.length === 2) {\n const args = arguments;\n return function fn(data) {\n return _clamp(data, args[0], args[1]);\n };\n }\n return _clamp(arguments[0], arguments[1], arguments[2]);\n}\nexport {\n add,\n clamp,\n divide,\n divideWithModulo,\n gt,\n gte,\n lt,\n lte,\n modulo,\n multiply,\n placeholder,\n pred,\n subtract,\n succ\n};\n","import { N } from \"@mobily/ts-belt\";\n\nexport const estEntreDeuxNombres = (nombre: number, min: number, max: number): boolean =>\n N.gte(nombre, min) && N.lt(nombre, max);\n"],"names":["N.gte","N.lt"],"mappings":"AAyGA,SAAS,KAAK,GAAG,GAAG;AAClB,SAAO,KAAK;AACd;AACA,SAAS,MAAM;AACb,MAAI,UAAU,WAAW,GAAG;AAC1B,UAAM,OAAO;AACb,WAAO,SAAS,GAAG,MAAM;AACvB,aAAO,KAAK,MAAM,KAAK,CAAC,CAAC;AAAA,IAC/B;AAAA,EACG;AACD,SAAO,KAAK,UAAU,CAAC,GAAG,UAAU,CAAC,CAAC;AACxC;AACA,SAAS,IAAI,GAAG,GAAG;AACjB,SAAO,IAAI;AACb;AACA,SAAS,KAAK;AACZ,MAAI,UAAU,WAAW,GAAG;AAC1B,UAAM,OAAO;AACb,WAAO,SAAS,GAAG,MAAM;AACvB,aAAO,IAAI,MAAM,KAAK,CAAC,CAAC;AAAA,IAC9B;AAAA,EACG;AACD,SAAO,IAAI,UAAU,CAAC,GAAG,UAAU,CAAC,CAAC;AACvC;AC9HO,MAAM,sBAAsB,CAAC,QAAgB,KAAa,QAC/DA,IAAM,QAAQ,GAAG,KAAKC,GAAK,QAAQ,GAAG;","x_google_ignoreList":[0]}

View file

@ -4,7 +4,7 @@ import { p as parse } from "./index.CCa5Y_L9.js";
import { e as ENTETE_WC_NONCE } from "./api.js";
import { a as leveBadRequestError, b as leveUnauthorizedError, c as leveNotFoundError, d as leveErreur, E as ErreurInconnue } from "./erreurs.js";
import { e as estWCError } from "./erreurs2.js";
import "./exports.D-K_zMCo.js";
import "./exports.DMCTjIlP.js";
const postBackend = (args) => fetch(
args.route,
{

View file

@ -5,7 +5,7 @@ import { r as recupereElementOuLeve } from "./dom2.js";
import { v as valideMessageMajBoutonPanier } from "./messages.js";
import { r as recupereElementDocumentEither } from "./utils.js";
import "./erreurs.js";
import "./exports.D-K_zMCo.js";
import "./exports.DMCTjIlP.js";
import "./Either.wHNxn7Os.js";
import "./index.CCa5Y_L9.js";
import "./messages2.js";

View file

@ -0,0 +1,40 @@
import { a as SELECTEUR_CONTENEUR_STORYTELLING, b as SELECTEUR_IMAGES_STORYTELLING, c as ATTRIBUT_INDEX, d as ATTRIBUT_CACHE, e as ATTRIBUT_ARIA_HIDDEN } from "./dom.js";
import { e as estEntreDeuxNombres } from "./nombres.js";
import { a as recupereElementDansDocumentOuLeve, b as recupereElementsDansDocumentOuLeve } from "./utils.js";
import "./chunk-7BKSRZNG.C39W3Wne.js";
import "./dom2.js";
import "./erreurs.js";
import "./exports.DMCTjIlP.js";
import "./Either.wHNxn7Os.js";
const initialiseScrollStorytelling = () => {
const CONTENEUR_STORYTELLING = recupereElementDansDocumentOuLeve(SELECTEUR_CONTENEUR_STORYTELLING);
const IMAGES_STORYTELLING = recupereElementsDansDocumentOuLeve(SELECTEUR_IMAGES_STORYTELLING);
let positionDefilementConteneur = 0;
let aucunRafraichissement = false;
const majImages = () => {
if (!aucunRafraichissement) {
window.requestAnimationFrame(() => {
const changeVisibiliteImage = (image, visible) => {
image.toggleAttribute(ATTRIBUT_CACHE, visible);
image.toggleAttribute(ATTRIBUT_ARIA_HIDDEN, visible);
};
positionDefilementConteneur = CONTENEUR_STORYTELLING.scrollTop;
IMAGES_STORYTELLING.forEach((image) => {
const indexImage = Number(image.getAttribute(ATTRIBUT_INDEX));
const hauteurImage = image.getBoundingClientRect().height;
const debutYImage = hauteurImage * (indexImage - 1);
const finYImage = hauteurImage * indexImage;
estEntreDeuxNombres(positionDefilementConteneur, debutYImage, finYImage) ? changeVisibiliteImage(image, false) : changeVisibiliteImage(image, true);
});
aucunRafraichissement = false;
});
aucunRafraichissement = true;
}
};
new ResizeObserver(() => majImages()).observe(CONTENEUR_STORYTELLING);
CONTENEUR_STORYTELLING.addEventListener("scroll", () => majImages());
};
document.addEventListener("DOMContentLoaded", () => {
initialiseScrollStorytelling();
});
//# sourceMappingURL=scripts-page-accueil.js.map

View file

@ -0,0 +1 @@
{"version":3,"file":"scripts-page-accueil.js","sources":["../../src/scripts/scripts-page-accueil.ts"],"sourcesContent":["// Scripts pour la Page d'accueil\n\nimport {\n ATTRIBUT_ARIA_HIDDEN,\n ATTRIBUT_CACHE,\n ATTRIBUT_INDEX,\n SELECTEUR_CONTENEUR_STORYTELLING,\n SELECTEUR_IMAGES_STORYTELLING,\n} from \"./constantes/dom.ts\";\nimport { estEntreDeuxNombres } from \"./lib/nombres.ts\";\nimport { recupereElementDansDocumentOuLeve, recupereElementsDansDocumentOuLeve } from \"./lib/utils.ts\";\n\nconst initialiseScrollStorytelling = (): void => {\n /** Le Conteneur des images du storytelling. */\n const CONTENEUR_STORYTELLING = recupereElementDansDocumentOuLeve<HTMLElement>(SELECTEUR_CONTENEUR_STORYTELLING);\n /** Les Images du storytelling. */\n const IMAGES_STORYTELLING = recupereElementsDansDocumentOuLeve<HTMLDivElement>(SELECTEUR_IMAGES_STORYTELLING);\n\n // Variables mutables\n /** La position du défilement (en pixels) du Conteneur des images du storytelling. */\n let positionDefilementConteneur = 0;\n /** Booléen permettant de limiter le rafraîchissement des images du storytelling. */\n let aucunRafraichissement = false;\n\n const majImages = (): void => {\n // Limite le rafraîchissement des images\n if (!aucunRafraichissement) {\n window.requestAnimationFrame((): void => {\n const changeVisibiliteImage = (image: HTMLDivElement, visible: boolean) => {\n image.toggleAttribute(ATTRIBUT_CACHE, visible);\n image.toggleAttribute(ATTRIBUT_ARIA_HIDDEN, visible);\n };\n\n // Met à jour la position du défilement dans le Conteneur\n positionDefilementConteneur = CONTENEUR_STORYTELLING.scrollTop;\n\n // Met à jour l'attribut de visibilité des images en fonction du défilement\n IMAGES_STORYTELLING.forEach((image: HTMLDivElement): void => {\n const indexImage = Number(image.getAttribute(ATTRIBUT_INDEX));\n const hauteurImage = image.getBoundingClientRect().height;\n const debutYImage = hauteurImage * (indexImage - 1);\n const finYImage = hauteurImage * indexImage;\n\n estEntreDeuxNombres(positionDefilementConteneur, debutYImage, finYImage)\n ? changeVisibiliteImage(image, false)\n : changeVisibiliteImage(image, true);\n });\n\n aucunRafraichissement = false;\n });\n aucunRafraichissement = true;\n }\n };\n\n // Initialise l'Observateur de Redimensionnement (ResizeObserver)\n new ResizeObserver((): void => majImages()).observe(CONTENEUR_STORYTELLING);\n // Initialise la mise à jour des images au défilement sur le Conteneur\n CONTENEUR_STORYTELLING.addEventListener(\"scroll\", (): void => majImages());\n};\n\ndocument.addEventListener(\"DOMContentLoaded\", (): void => {\n initialiseScrollStorytelling();\n});\n"],"names":[],"mappings":";;;;;;;;AAYA,MAAM,+BAA+B,MAAY;AAEzC,QAAA,yBAAyB,kCAA+C,gCAAgC;AAExG,QAAA,sBAAsB,mCAAmD,6BAA6B;AAI5G,MAAI,8BAA8B;AAElC,MAAI,wBAAwB;AAE5B,QAAM,YAAY,MAAY;AAE5B,QAAI,CAAC,uBAAuB;AAC1B,aAAO,sBAAsB,MAAY;AACjC,cAAA,wBAAwB,CAAC,OAAuB,YAAqB;AACnE,gBAAA,gBAAgB,gBAAgB,OAAO;AACvC,gBAAA,gBAAgB,sBAAsB,OAAO;AAAA,QAAA;AAIrD,sCAA8B,uBAAuB;AAGjC,4BAAA,QAAQ,CAAC,UAAgC;AAC3D,gBAAM,aAAa,OAAO,MAAM,aAAa,cAAc,CAAC;AACtD,gBAAA,eAAe,MAAM,sBAAA,EAAwB;AAC7C,gBAAA,cAAc,gBAAgB,aAAa;AACjD,gBAAM,YAAY,eAAe;AAEb,8BAAA,6BAA6B,aAAa,SAAS,IACnE,sBAAsB,OAAO,KAAK,IAClC,sBAAsB,OAAO,IAAI;AAAA,QAAA,CACtC;AAEuB,gCAAA;AAAA,MAAA,CACzB;AACuB,8BAAA;AAAA,IAC1B;AAAA,EAAA;AAIF,MAAI,eAAe,MAAY,UAAA,CAAW,EAAE,QAAQ,sBAAsB;AAE1E,yBAAuB,iBAAiB,UAAU,MAAY,UAAW,CAAA;AAC3E;AAEA,SAAS,iBAAiB,oBAAoB,MAAY;AAC3B;AAC/B,CAAC;"}

View file

@ -1,9 +1,9 @@
import { r } from "./chunk-RU7WR4KH.D5j7HXCF.js";
import { u, a as recupereElementsDocumentEither, r as recupereElementDocumentEither, p, b as propEither } from "./utils.js";
import { u, c as recupereElementsDocumentEither, r as recupereElementDocumentEither, p, d as propEither } from "./utils.js";
import { x } from "./chunk-7BKSRZNG.C39W3Wne.js";
import { p as parse } from "./index.CCa5Y_L9.js";
import { R as ROUTE_API_RETIRE_ARTICLE_PANIER, b as ROUTE_API_MAJ_ARTICLE_PANIER, c as ROUTE_API_MAJ_CLIENT } from "./api.js";
import { a as SELECTEUR_ENTREES_PANIER, b as SELECTEUR_CONTENEUR_PANIER, c as SELECTEUR_SOUS_TOTAL_PANIER, d as SELECTEUR_TOTAL_PANIER, e as SELECTEUR_BOUTON_SEPARATION_ADRESSES, f as SELECTEUR_FORMULAIRE_PANIER, g as SELECTEUR_FORMULAIRE_LIVRAISON, h as SELECTEUR_FORMULAIRE_FACTURATION, i as SELECTEUR_BOUTON_ACTIONS_FORMULAIRE, j as ATTRIBUT_CLE_PANIER, k as SELECTEUR_BOUTON_SOUSTRACTION_QUANTITE, l as SELECTEUR_CHAMP_QUANTITE_LIGNE_PANIER, m as SELECTEUR_BOUTON_ADDITION_QUANTITE, n as SELECTEUR_BOUTON_SUPPRESSION_PANIER, A as ATTRIBUT_CONTIENT_ARTICLES, o as SELECTEUR_PRIX_LIGNE_PANIER, p as ATTRIBUT_HIDDEN, q as ATTRIBUT_DESACTIVE } from "./dom.js";
import { f as SELECTEUR_ENTREES_PANIER, g as SELECTEUR_CONTENEUR_PANIER, h as SELECTEUR_SOUS_TOTAL_PANIER, i as SELECTEUR_TOTAL_PANIER, j as SELECTEUR_BOUTON_SEPARATION_ADRESSES, k as SELECTEUR_FORMULAIRE_PANIER, l as SELECTEUR_FORMULAIRE_LIVRAISON, m as SELECTEUR_FORMULAIRE_FACTURATION, n as SELECTEUR_BOUTON_ACTIONS_FORMULAIRE, o as ATTRIBUT_CLE_PANIER, p as SELECTEUR_BOUTON_SOUSTRACTION_QUANTITE, q as SELECTEUR_CHAMP_QUANTITE_LIGNE_PANIER, r as SELECTEUR_BOUTON_ADDITION_QUANTITE, s as SELECTEUR_BOUTON_SUPPRESSION_PANIER, A as ATTRIBUT_CONTIENT_ARTICLES, t as SELECTEUR_PRIX_LIGNE_PANIER, u as ATTRIBUT_HIDDEN, v as ATTRIBUT_DESACTIVE } from "./dom.js";
import { N as NOM_CANAL_BOUTON_PANIER, a as NOM_CANAL_CONTENU_PANIER } from "./messages3.js";
import { r as recupereElementOuLeve, a as recupereElementsAvecSelecteur, b as recupereElementAvecSelecteur } from "./dom2.js";
import { l as leveServerError, r as reporteErreur } from "./erreurs.js";
@ -15,7 +15,7 @@ import { W as WCStoreCartRemoveItemArgsSchema } from "./cart-remove-item.js";
import { W as WCStoreCartUpdateCustomerArgsSchema } from "./cart-update-customer.js";
import { W as WCStoreCartUpdateItemArgsSchema } from "./cart-update-item.js";
import { M as Maybe, E as Either } from "./Either.wHNxn7Os.js";
import "./exports.D-K_zMCo.js";
import "./exports.DMCTjIlP.js";
import "./messages2.js";
import "./index.CeK6pfoJ.js";
import "./erreurs2.js";

View file

@ -1,10 +1,10 @@
import { r } from "./chunk-RU7WR4KH.D5j7HXCF.js";
import { r as recupereElementDocumentEither, a as recupereElementsDocumentEither, p } from "./utils.js";
import { r as recupereElementDocumentEither, c as recupereElementsDocumentEither, p } from "./utils.js";
import { x } from "./chunk-7BKSRZNG.C39W3Wne.js";
import { z, N } from "./index.CeK6pfoJ.js";
import { p as parse } from "./index.CCa5Y_L9.js";
import { d as ROUTE_API_AJOUTE_ARTICLE_PANIER, e as ENTETE_WC_NONCE } from "./api.js";
import { r as SELECTEUR_BOUTON_AJOUT_PANIER, s as SELECTEUR_SELECTEUR_QUANTITE, t as SELECTEUR_LIENS_ONGLETS, u as SELECTEUR_SECTIONS_CONTENUS, v as ATTRIBUT_ARIA_SELECTED, p as ATTRIBUT_HIDDEN, q as ATTRIBUT_DESACTIVE } from "./dom.js";
import { w as SELECTEUR_BOUTON_AJOUT_PANIER, x as SELECTEUR_SELECTEUR_QUANTITE, y as SELECTEUR_LIENS_ONGLETS, z as SELECTEUR_SECTIONS_CONTENUS, B as ATTRIBUT_ARIA_SELECTED, u as ATTRIBUT_HIDDEN, v as ATTRIBUT_DESACTIVE } from "./dom.js";
import { r as recupereElementOuLeve, c as recupereElementsOuLeve } from "./dom2.js";
import { l as leveServerError, a as leveBadRequestError, b as leveUnauthorizedError, c as leveNotFoundError, E as ErreurInconnue, d as leveErreur, r as reporteErreur } from "./erreurs.js";
import { b as estHTMLSelectElement, e as estReponse500, a as estError } from "./gardes.js";
@ -13,7 +13,7 @@ import { W as WCStoreCartSchema } from "./cart.js";
import { p as parseWCStoreCartAddItemArgs } from "./cart-add-item.js";
import { e as estWCError } from "./erreurs2.js";
import { M as Maybe, E as Either } from "./Either.wHNxn7Os.js";
import "./exports.D-K_zMCo.js";
import "./exports.DMCTjIlP.js";
import "./messages3.js";
import "./messages2.js";
import "./cart2.js";

View file

@ -1,8 +1,8 @@
import { a as recupereElementsAvecSelecteur, b as recupereElementAvecSelecteur } from "./dom2.js";
import { x } from "./chunk-7BKSRZNG.C39W3Wne.js";
import { a as recupereElementsAvecSelecteur, b as recupereElementAvecSelecteur, r as recupereElementOuLeve, c as recupereElementsOuLeve } from "./dom2.js";
import { C as CleNonTrouveError } from "./erreurs.js";
import { M as Maybe } from "./Either.wHNxn7Os.js";
import "./chunk-7BKSRZNG.C39W3Wne.js";
import "./exports.D-K_zMCo.js";
import "./exports.DMCTjIlP.js";
function u$1(t2, n, a) {
let o = (r) => t2(r, ...n);
return a === void 0 ? o : Object.assign(o, { lazy: a, lazyArgs: n });
@ -20,11 +20,21 @@ var t = (o, e) => o[e];
const recupereElementsDocumentEither = recupereElementsAvecSelecteur(document);
const recupereElementDocumentEither = recupereElementAvecSelecteur(document);
const propEither = (cle) => (donnees) => Maybe.fromNullable(p(donnees, cle)).toEither(
new CleNonTrouveError(`La clé « ${String(cle)} » n'a pas été trouvé dans l'objet.`, { objet: donnees })
new CleNonTrouveError(`La clé « ${String(cle)} » n'a pas été trouvé dans l'objet.`)
);
const recupereElementDansDocumentOuLeve = (selecteur) => x(
recupereElementDocumentEither(selecteur),
recupereElementOuLeve
);
const recupereElementsDansDocumentOuLeve = (selecteur) => x(
recupereElementsDocumentEither(selecteur),
recupereElementsOuLeve
);
export {
recupereElementsDocumentEither as a,
propEither as b,
recupereElementDansDocumentOuLeve as a,
recupereElementsDansDocumentOuLeve as b,
recupereElementsDocumentEither as c,
propEither as d,
p,
recupereElementDocumentEither as r,
u

View file

@ -1 +1 @@
{"version":3,"file":"utils.js","sources":["../../../../../../node_modules/.pnpm/remeda@2.15.0/node_modules/remeda/dist/chunk-K26VP6CL.js","../../../../../../node_modules/.pnpm/remeda@2.15.0/node_modules/remeda/dist/chunk-RAAYCPUM.js","../../../../../../node_modules/.pnpm/remeda@2.15.0/node_modules/remeda/dist/chunk-VROY5Y5B.js","../../src/scripts/lib/utils.ts"],"sourcesContent":["function u(t,n,a){let o=r=>t(r,...n);return a===void 0?o:Object.assign(o,{lazy:a,lazyArgs:n})}export{u as a};\n","import{a as t}from\"./chunk-K26VP6CL.js\";function u(r,n,a){let o=r.length-n.length;if(o===0)return r(...n);if(o===1)return t(r,n,a);throw new Error(\"Wrong number of arguments\")}export{u as a};\n","import{a as n}from\"./chunk-RAAYCPUM.js\";function p(...o){return n(t,o)}var t=(o,e)=>o[e];export{p as a,t as b};\n","import { type Either, Maybe } from \"purify-ts\";\nimport { prop } from \"remeda\";\n\nimport { recupereElementAvecSelecteur, recupereElementsAvecSelecteur } from \"./dom.ts\";\nimport { CleNonTrouveError } from \"./erreurs.ts\";\n\nexport const recupereElementsDocumentEither: <E extends Element = Element>(\n selecteur: string,\n) => Either<SyntaxError, Array<E>> = recupereElementsAvecSelecteur(document);\n\nexport const recupereElementDocumentEither: <E extends Element = Element>(\n selecteur: string,\n) => Either<SyntaxError, E> = recupereElementAvecSelecteur(document);\n\nexport const propEither = <T, K extends keyof T>(cle: K) => (donnees: T): Either<CleNonTrouveError, T[K]> =>\n Maybe\n .fromNullable(prop(donnees, cle))\n .toEither(\n new CleNonTrouveError(`La clé « ${String(cle)} » n'a pas été trouvé dans l'objet.`, { objet: donnees }),\n );\n"],"names":["u","t","n","prop"],"mappings":";;;;;AAAA,SAASA,IAAEC,IAAE,GAAE,GAAE;AAAC,MAAI,IAAE,OAAGA,GAAE,GAAE,GAAG,CAAC;AAAE,SAAO,MAAI,SAAO,IAAE,OAAO,OAAO,GAAE,EAAC,MAAK,GAAE,UAAS,EAAC,CAAC;AAAC;ACArD,SAAS,EAAE,GAAE,GAAE,GAAE;AAAC,MAAI,IAAE,EAAE,SAAO,EAAE;AAAO,MAAG,MAAI,EAAE,QAAO,EAAE,GAAG,CAAC;AAAE,MAAG,MAAI,EAAE,QAAOA,IAAE,GAAE,GAAE,CAAC;AAAE,QAAM,IAAI,MAAM,2BAA2B;AAAC;ACAvI,SAAS,KAAK,GAAE;AAAC,SAAOC,EAAE,GAAE,CAAC;AAAC;AAAC,IAAI,IAAE,CAAC,GAAE,MAAI,EAAE,CAAC;ACM1E,MAAA,iCAEwB,8BAA8B,QAAQ;AAE9D,MAAA,gCAEiB,6BAA6B,QAAQ;AAEtD,MAAA,aAAa,CAAuB,QAAW,CAAC,YAC3D,MACG,aAAaC,EAAK,SAAS,GAAG,CAAC,EAC/B;AAAA,EACC,IAAI,kBAAkB,YAAY,OAAO,GAAG,CAAC,uCAAuC,EAAE,OAAO,SAAS;AACxG;","x_google_ignoreList":[0,1,2]}
{"version":3,"file":"utils.js","sources":["../../../../../../node_modules/.pnpm/remeda@2.15.0/node_modules/remeda/dist/chunk-K26VP6CL.js","../../../../../../node_modules/.pnpm/remeda@2.15.0/node_modules/remeda/dist/chunk-RAAYCPUM.js","../../../../../../node_modules/.pnpm/remeda@2.15.0/node_modules/remeda/dist/chunk-VROY5Y5B.js","../../src/scripts/lib/utils.ts"],"sourcesContent":["function u(t,n,a){let o=r=>t(r,...n);return a===void 0?o:Object.assign(o,{lazy:a,lazyArgs:n})}export{u as a};\n","import{a as t}from\"./chunk-K26VP6CL.js\";function u(r,n,a){let o=r.length-n.length;if(o===0)return r(...n);if(o===1)return t(r,n,a);throw new Error(\"Wrong number of arguments\")}export{u as a};\n","import{a as n}from\"./chunk-RAAYCPUM.js\";function p(...o){return n(t,o)}var t=(o,e)=>o[e];export{p as a,t as b};\n","import { type Either, Maybe } from \"purify-ts\";\nimport { pipe, prop } from \"remeda\";\n\nimport {\n recupereElementAvecSelecteur,\n recupereElementOuLeve,\n recupereElementsAvecSelecteur,\n recupereElementsOuLeve,\n} from \"./dom.ts\";\nimport { CleNonTrouveError } from \"./erreurs.ts\";\n\nexport const recupereElementsDocumentEither: <E extends Element = Element>(\n selecteur: string,\n) => Either<SyntaxError, Array<E>> = recupereElementsAvecSelecteur(document);\n\nexport const recupereElementDocumentEither: <E extends Element = Element>(\n selecteur: string,\n) => Either<SyntaxError, E> = recupereElementAvecSelecteur(document);\n\nexport const propEither = <T, K extends keyof T>(cle: K) => (donnees: T): Either<CleNonTrouveError, T[K]> =>\n Maybe\n .fromNullable(prop(donnees, cle))\n .toEither(\n new CleNonTrouveError(`La clé « ${String(cle)} » n'a pas été trouvé dans l'objet.`),\n );\n\n/**\n * Fonction utilitaire pour récupérer un Élément selon un sélecteur au sein du Document.\n *\n * @param selecteur Le sélecteur de l'Élément recherché.\n * @throws Une SyntaxError si l'Élément n'est pas trouvé.\n * @returns Un Élément.\n */\nexport const recupereElementDansDocumentOuLeve = <E extends Element = Element>(selecteur: string): E =>\n pipe(\n recupereElementDocumentEither<E>(selecteur),\n recupereElementOuLeve,\n );\n\n/**\n * Fonction utilitaire pour récupérer des Éléments selon un sélecteur au sein du Document.\n *\n * @param selecteur Le sélecteur des Éléments recherchés.\n * @throws Une SyntaxError si aucun Élément n'est trouvé.\n * @returns Un tableau d'Éléments.\n */\nexport const recupereElementsDansDocumentOuLeve = <E extends Element = Element>(selecteur: string): Array<E> =>\n pipe(\n recupereElementsDocumentEither<E>(selecteur),\n recupereElementsOuLeve,\n );\n"],"names":["u","t","n","prop","pipe"],"mappings":";;;;;AAAA,SAASA,IAAEC,IAAE,GAAE,GAAE;AAAC,MAAI,IAAE,OAAGA,GAAE,GAAE,GAAG,CAAC;AAAE,SAAO,MAAI,SAAO,IAAE,OAAO,OAAO,GAAE,EAAC,MAAK,GAAE,UAAS,EAAC,CAAC;AAAC;ACArD,SAAS,EAAE,GAAE,GAAE,GAAE;AAAC,MAAI,IAAE,EAAE,SAAO,EAAE;AAAO,MAAG,MAAI,EAAE,QAAO,EAAE,GAAG,CAAC;AAAE,MAAG,MAAI,EAAE,QAAOA,IAAE,GAAE,GAAE,CAAC;AAAE,QAAM,IAAI,MAAM,2BAA2B;AAAC;ACAvI,SAAS,KAAK,GAAE;AAAC,SAAOC,EAAE,GAAE,CAAC;AAAC;AAAC,IAAI,IAAE,CAAC,GAAE,MAAI,EAAE,CAAC;ACW1E,MAAA,iCAEwB,8BAA8B,QAAQ;AAE9D,MAAA,gCAEiB,6BAA6B,QAAQ;AAEtD,MAAA,aAAa,CAAuB,QAAW,CAAC,YAC3D,MACG,aAAaC,EAAK,SAAS,GAAG,CAAC,EAC/B;AAAA,EACC,IAAI,kBAAkB,YAAY,OAAO,GAAG,CAAC,qCAAqC;AACpF;AASS,MAAA,oCAAoC,CAA8B,cAC7EC;AAAAA,EACE,8BAAiC,SAAS;AAAA,EAC1C;AACF;AASW,MAAA,qCAAqC,CAA8B,cAC9EA;AAAAA,EACE,+BAAkC,SAAS;AAAA,EAC3C;AACF;","x_google_ignoreList":[0,1,2]}

View file

@ -11,5 +11,23 @@ use Timber\Timber;
$contexte = Timber::context();
$modeles = ["accueil.twig"];
// Charge les scripts et styles de la page
function charge_scripts_styles_page_accueil(): void {
wp_enqueue_style(
handle: "haiku-atelier-2024-styles-page-accueil",
src: get_template_directory_uri() . "/assets/css/pages/page-accueil.css",
deps: [],
ver: filemtime(get_template_directory() . "/assets/css/pages/page-accueil.css"),
media: "all",
);
wp_enqueue_script_module(
id: "haiku-atelier-2024-scripts-page-accueil",
src: get_template_directory_uri() . "/assets/js/scripts-page-accueil.js",
deps: [],
version: filemtime(get_template_directory() . "/assets/js/scripts-page-accueil.js"),
);
}
add_action("wp_enqueue_scripts", "charge_scripts_styles_page_accueil");
/* Rendu */
Timber::render($filenames = $modeles, $data = $contexte);
Timber::render(filenames: $modeles, data: $contexte);

View file

@ -25,6 +25,7 @@
/* Dimensions */
--en-tete-hauteur: 60px;
--menu-categories-produits-hauteur: 54.39px;
--pied-de-page-hauteur: calc(var(--espace-m) * 2 + 3lh);
/* Espacements */
--espace-xs: 0.25rem; // 4px;

View file

@ -47,7 +47,7 @@ button, input, select, textarea {
background: var(--couleur-jaune);
}
/* Désaffiche tout élément avec l'attribut hidden */
/* Cache tout élément avec l'attribut hidden */
[hidden] {
display: none;
}

View file

@ -22,6 +22,7 @@
padding: var(--en-tete-marges-internes-bloc) var(--en-tete-marges-internes-ligne);
font-size: 1.1rem;
background: var(--couleur-gris);
border-bottom: 1px solid var(--couleur-noir);
.logo {
width: var(--en-tete-logo-longueur);
@ -69,6 +70,7 @@
display: inline-block; /* 1 */
padding: var(--nav-entree-marges-internes-bloc)
var(--nav-entree-marges-internes-ligne); /* 2 */
text-align: center; /* 4 */
}

View file

@ -87,7 +87,8 @@
grid-column: span 3;
align-content: center;
min-height: calc(
100vh - var(--menu-categories-produits-hauteur) - var(--en-tete-hauteur) - 105px
100vh - var(--menu-categories-produits-hauteur) - var(--en-tete-hauteur)
- var(--pied-de-page-hauteur)
);
text-align: center;

View file

@ -1,8 +1,6 @@
// Styles pour le pied de page du site
/* *
* Le pied de page du site.
*/
// Le pied de page du site
#pied-de-page {
/* Marges */
--pied-de-page-marges-internes-bloc: var(--espace-m);
@ -12,11 +10,12 @@
grid-template-columns: 1fr 1fr;
place-items: center;
max-width: 100vw;
height: var(--pied-de-page-hauteur);
padding: var(--pied-de-page-marges-internes-bloc) var(--pied-de-page-marges-internes-ligne);
line-height: var(--hauteur-ligne-classique);
background: var(--couleur-jaune);
border-top: 1px solid var(--couleur-noir);
// Liens vers les pages du site
.zone-menu-navigation-secondaire {
justify-self: start;
width: 100%;
@ -24,6 +23,7 @@
text-transform: lowercase;
}
// Liens vers les réseaux sociaux
.zone-liens-reseaux-sociaux {
justify-items: end;
width: 100%;

View file

@ -0,0 +1,53 @@
// Styles pour la page d'accueil
#page-accueil {
/* Dimensions */
--hauteur-conteneur: calc(100vh - var(--en-tete-hauteur) - var(--pied-de-page-hauteur));
/* Marges */
--page-marges-bloc-debut: var(--en-tete-hauteur);
overflow: hidden;
display: flex;
flex-flow: column nowrap;
min-height: var(--hauteur-conteneur);
max-height: var(--hauteur-conteneur);
margin-top: var(--page-marges-bloc-debut);
.storytelling {
scrollbar-width: none;
overflow-y: scroll;
place-items: center;
min-height: inherit;
max-height: inherit;
&__conteneur {
display: flex;
flex-flow: column nowrap;
min-height: calc(var(--hauteur-conteneur) * 10);
padding: 0 var(--espace-xl);
}
&__image {
position: sticky;
top: 0;
align-content: center;
width: 100%;
min-height: var(--hauteur-conteneur);
max-height: var(--hauteur-conteneur);
&[data-cache] {
visibility: hidden;
opacity: 0;
}
img {
scale: 0.9;
max-height: inherit;
margin: auto;
object-fit: contain;
background: transparent;
}
}
}
}

View file

@ -16,7 +16,7 @@
display: flex;
flex-flow: row wrap;
min-height: calc(100vh - var(--en-tete-hauteur) - 105px);
min-height: calc(100vh - var(--en-tete-hauteur) - var(--pied-de-page-hauteur));
margin-top: var(--menu-section-marges-bloc-debut);
&[data-contient-articles="false"] {
@ -64,7 +64,7 @@
display: none;
flex-basis: 100%;
align-content: center;
min-height: calc(100vh - var(--en-tete-hauteur) - 105px);
min-height: calc(100vh - var(--en-tete-hauteur) - var(--pied-de-page-hauteur));
text-align: center;
p {

View file

@ -1,11 +1,13 @@
/** Constantes de valeurs pour la manipulation du DOM : sélecteurs et attributs. */
export const ATTRIBUT_ARIA_SELECTED = "aria-selected";
export const ATTRIBUT_ARIA_HIDDEN = "aria-hidden";
export const ATTRIBUT_HIDDEN = "hidden";
export const ATTRIBUT_ARIA_SELECTED = "aria-selected";
export const ATTRIBUT_CACHE = "data-cache";
export const ATTRIBUT_CLE_PANIER = "data-cle-panier";
export const ATTRIBUT_CONTIENT_ARTICLES = "data-contient-articles";
export const ATTRIBUT_DESACTIVE = "disabled";
export const ATTRIBUT_CLE_PANIER = "data-cle-panier";
export const ATTRIBUT_HIDDEN = "hidden";
export const ATTRIBUT_INDEX = "data-index";
export const SELECTEUR_CONTENEUR_PANIER = "#page-panier";
export const SELECTEUR_BOUTON_PANIER = ".compte-panier a[rel='cart']";
@ -28,3 +30,7 @@ export const SELECTEUR_FORMULAIRE_PANIER = "#panneau-informations-client form";
export const SELECTEUR_FORMULAIRE_LIVRAISON = "#panneau-informations-client .panneau__formulaires__livraison";
export const SELECTEUR_FORMULAIRE_FACTURATION = "#panneau-informations-client .panneau__formulaires__facturation";
export const SELECTEUR_BOUTON_ACTIONS_FORMULAIRE = "#panneau-informations-client .panneau__pied-de-page button";
// Accueil
export const SELECTEUR_CONTENEUR_STORYTELLING = ".storytelling";
export const SELECTEUR_IMAGES_STORYTELLING = ".storytelling__image";

View file

@ -0,0 +1,4 @@
import { N } from "@mobily/ts-belt";
export const estEntreDeuxNombres = (nombre: number, min: number, max: number): boolean =>
N.gte(nombre, min) && N.lt(nombre, max);

View file

@ -1,7 +1,12 @@
import { type Either, Maybe } from "purify-ts";
import { prop } from "remeda";
import { pipe, prop } from "remeda";
import { recupereElementAvecSelecteur, recupereElementsAvecSelecteur } from "./dom.ts";
import {
recupereElementAvecSelecteur,
recupereElementOuLeve,
recupereElementsAvecSelecteur,
recupereElementsOuLeve,
} from "./dom.ts";
import { CleNonTrouveError } from "./erreurs.ts";
export const recupereElementsDocumentEither: <E extends Element = Element>(
@ -16,5 +21,31 @@ export const propEither = <T, K extends keyof T>(cle: K) => (donnees: T): Either
Maybe
.fromNullable(prop(donnees, cle))
.toEither(
new CleNonTrouveError(`La clé « ${String(cle)} » n'a pas été trouvé dans l'objet.`, { objet: donnees }),
new CleNonTrouveError(`La clé « ${String(cle)} » n'a pas été trouvé dans l'objet.`),
);
/**
* Fonction utilitaire pour récupérer un Élément selon un sélecteur au sein du Document.
*
* @param selecteur Le sélecteur de l'Élément recherché.
* @throws Une SyntaxError si l'Élément n'est pas trouvé.
* @returns Un Élément.
*/
export const recupereElementDansDocumentOuLeve = <E extends Element = Element>(selecteur: string): E =>
pipe(
recupereElementDocumentEither<E>(selecteur),
recupereElementOuLeve,
);
/**
* Fonction utilitaire pour récupérer des Éléments selon un sélecteur au sein du Document.
*
* @param selecteur Le sélecteur des Éléments recherchés.
* @throws Une SyntaxError si aucun Élément n'est trouvé.
* @returns Un tableau d'Éléments.
*/
export const recupereElementsDansDocumentOuLeve = <E extends Element = Element>(selecteur: string): Array<E> =>
pipe(
recupereElementsDocumentEither<E>(selecteur),
recupereElementsOuLeve,
);

View file

@ -0,0 +1,63 @@
// Scripts pour la Page d'accueil
import {
ATTRIBUT_ARIA_HIDDEN,
ATTRIBUT_CACHE,
ATTRIBUT_INDEX,
SELECTEUR_CONTENEUR_STORYTELLING,
SELECTEUR_IMAGES_STORYTELLING,
} from "./constantes/dom.ts";
import { estEntreDeuxNombres } from "./lib/nombres.ts";
import { recupereElementDansDocumentOuLeve, recupereElementsDansDocumentOuLeve } from "./lib/utils.ts";
const initialiseScrollStorytelling = (): void => {
/** Le Conteneur des images du storytelling. */
const CONTENEUR_STORYTELLING = recupereElementDansDocumentOuLeve<HTMLElement>(SELECTEUR_CONTENEUR_STORYTELLING);
/** Les Images du storytelling. */
const IMAGES_STORYTELLING = recupereElementsDansDocumentOuLeve<HTMLDivElement>(SELECTEUR_IMAGES_STORYTELLING);
// Variables mutables
/** La position du défilement (en pixels) du Conteneur des images du storytelling. */
let positionDefilementConteneur = 0;
/** Booléen permettant de limiter le rafraîchissement des images du storytelling. */
let aucunRafraichissement = false;
const majImages = (): void => {
// Limite le rafraîchissement des images
if (!aucunRafraichissement) {
window.requestAnimationFrame((): void => {
const changeVisibiliteImage = (image: HTMLDivElement, visible: boolean) => {
image.toggleAttribute(ATTRIBUT_CACHE, visible);
image.toggleAttribute(ATTRIBUT_ARIA_HIDDEN, visible);
};
// Met à jour la position du défilement dans le Conteneur
positionDefilementConteneur = CONTENEUR_STORYTELLING.scrollTop;
// Met à jour l'attribut de visibilité des images en fonction du défilement
IMAGES_STORYTELLING.forEach((image: HTMLDivElement): void => {
const indexImage = Number(image.getAttribute(ATTRIBUT_INDEX));
const hauteurImage = image.getBoundingClientRect().height;
const debutYImage = hauteurImage * (indexImage - 1);
const finYImage = hauteurImage * indexImage;
estEntreDeuxNombres(positionDefilementConteneur, debutYImage, finYImage)
? changeVisibiliteImage(image, false)
: changeVisibiliteImage(image, true);
});
aucunRafraichissement = false;
});
aucunRafraichissement = true;
}
};
// Initialise l'Observateur de Redimensionnement (ResizeObserver)
new ResizeObserver((): void => majImages()).observe(CONTENEUR_STORYTELLING);
// Initialise la mise à jour des images au défilement sur le Conteneur
CONTENEUR_STORYTELLING.addEventListener("scroll", (): void => majImages());
};
document.addEventListener("DOMContentLoaded", (): void => {
initialiseScrollStorytelling();
});

View file

@ -1,4 +1,203 @@
{% extends "base.twig" %}
{% block contenu %}
<main id="page-accueil">
<div class="storytelling">
<div class="storytelling__conteneur">
<div
class="storytelling__image"
data-index="1"
>
<img
alt=""
decoding="sync"
height="1080"
loading="lazy"
src="{{ site.theme.link }}/assets/img/storytelling/scroll1.jpg"
width="903"
/>
</div>
<div
aria-hidden
class="storytelling__image"
data-cache
data-index="2"
>
<img
alt=""
decoding="sync"
height="1080"
loading="lazy"
src="{{ site.theme.link }}/assets/img/storytelling/scroll2.jpg"
width="903"
/>
</div>
<div
aria-hidden
class="storytelling__image"
data-cache
data-index="3"
>
<img
alt=""
decoding="sync"
height="1080"
loading="lazy"
src="{{ site.theme.link }}/assets/img/storytelling/scroll3.jpg"
width="903"
/>
</div>
<div
aria-hidden
class="storytelling__image"
data-cache
data-index="4"
>
<img
alt=""
decoding="sync"
height="1080"
loading="lazy"
src="{{ site.theme.link }}/assets/img/storytelling/scroll4.jpg"
width="903"
/>
</div>
<div
aria-hidden
class="storytelling__image"
data-cache
data-index="5"
>
<img
alt=""
decoding="sync"
height="1080"
loading="lazy"
src="{{ site.theme.link }}/assets/img/storytelling/scroll5.jpg"
width="903"
/>
</div>
<div
aria-hidden
class="storytelling__image"
data-cache
data-index="6"
>
<img
alt=""
decoding="sync"
height="1080"
loading="lazy"
src="{{ site.theme.link }}/assets/img/storytelling/scroll6.jpg"
width="903"
/>
</div>
<div
aria-hidden
class="storytelling__image"
data-cache
data-index="7"
>
<img
alt=""
decoding="sync"
height="1080"
loading="lazy"
src="{{ site.theme.link }}/assets/img/storytelling/scroll7.jpg"
width="903"
/>
</div>
<div
aria-hidden
class="storytelling__image"
data-cache
data-index="8"
>
<img
alt=""
decoding="sync"
height="1080"
loading="lazy"
src="{{ site.theme.link }}/assets/img/storytelling/scroll8.jpg"
width="903"
/>
</div>
<div
aria-hidden
class="storytelling__image"
data-cache
data-index="9"
>
<img
alt=""
decoding="sync"
height="1080"
loading="lazy"
src="{{ site.theme.link }}/assets/img/storytelling/scroll9.jpg"
width="903"
/>
</div>
<div
aria-hidden
class="storytelling__image"
data-cache
data-index="10"
>
<img
alt=""
decoding="sync"
height="1080"
loading="lazy"
src="{{ site.theme.link }}/assets/img/storytelling/scroll10.jpg"
width="903"
/>
</div>
<div
aria-hidden
class="storytelling__image"
data-cache
data-index="11"
>
<img
alt=""
decoding="sync"
height="1080"
loading="lazy"
src="{{ site.theme.link }}/assets/img/storytelling/scroll11.jpg"
width="903"
/>
</div>
<div
aria-hidden
class="storytelling__image"
data-cache
data-index="12"
>
<img
alt=""
decoding="sync"
height="1080"
loading="lazy"
src="{{ site.theme.link }}/assets/img/storytelling/scroll12.jpg"
width="903"
/>
</div>
<div
aria-hidden
class="storytelling__image"
data-cache
data-index="13"
>
<img
alt=""
decoding="sync"
height="1080"
loading="lazy"
src="{{ site.theme.link }}/assets/img/storytelling/scroll13.jpg"
width="903"
/>
</div>
</div>
</div>
</main>
{% endblock contenu %}

View file

@ -6,7 +6,10 @@
{% endblock head %}
{% endblock conteneur_html_head %}
<body class="{{ body_class }}" data-langue="{{ langue_courante }}">
<body
class="{{ body_class }}"
data-langue="{{ langue_courante }}"
>
{# En-tête #}
{% include "parts/en-tete.twig" %}

View file

@ -17,7 +17,10 @@
{% endblock head %}
{% block contenu %}
<main id="page-panier" data-contient-articles="{{ articles_presents }}">
<main
id="page-panier"
data-contient-articles="{{ articles_presents }}"
>
{# « Your Cart » #}
{% include "parts/pages/panier/panneau-panier.twig" %}
{# Your Info #}
@ -25,7 +28,12 @@
<div class="panier-vide">
<p>Sorry! Your cart is empty.</p>
<a class="lien-bouton" href="{{ pages.shop.lien }}">Go back to the Shop</a>
<a
class="lien-bouton"
href="{{ pages.shop.lien }}"
>
Go back to the Shop
</a>
</div>
</main>
{% endblock contenu %}

View file

@ -3,7 +3,9 @@
<figure>
<picture>
<img
alt="Haiku Atelier's Logo" height="25.6" src="{{ site.theme.link }}/assets/img/logos/logo-lines.svg"
alt="Haiku Atelier's Logo"
height="25.6"
src="{{ site.theme.link }}/assets/img/logos/logo-lines.svg"
width="80"
/>
</picture>
@ -11,34 +13,57 @@
</section>
{# TODO: Utiliser un Menu WordPress #}
<nav class="menu-navigation" id="menu-navigation-en-tete">
<nav
class="menu-navigation"
id="menu-navigation-en-tete"
>
<ul>
<span
class="{{ page_courante == pages.home.lien ? 'menu-navigation__entree menu-navigation__entree--courante' : "menu-navigation__entree" }}"
>
<li>
<a class="lien-menu" href="{{ pages.home.lien }}">{{ pages.home.nom }}</a>
<a
class="lien-menu"
href="{{ pages.home.lien }}"
>
{{ pages.home.nom }}
</a>
</li>
</span>
<span
class="{{ page_courante == pages.about.lien ? 'menu-navigation__entree menu-navigation__entree--courante' : "menu-navigation__entree" }}"
>
<li>
<a class="lien-menu" href="{{ pages.about.lien }}">{{ pages.about.nom }}</a>
<a
class="lien-menu"
href="{{ pages.about.lien }}"
>
{{ pages.about.nom }}
</a>
</li>
</span>
<span
class="{{ est_page_boutique ? 'menu-navigation__entree menu-navigation__entree--courante' : "menu-navigation__entree" }}"
>
<li>
<a class="lien-menu" href="{{ pages.shop.lien }}">{{ pages.shop.nom }}</a>
<a
class="lien-menu"
href="{{ pages.shop.lien }}"
>
{{ pages.shop.nom }}
</a>
</li>
</span>
<span
class="{{ page_courante == pages.contact.lien ? 'menu-navigation__entree menu-navigation__entree--courante' : "menu-navigation__entree" }}"
>
<li>
<a class="lien-menu" href="{{ pages.contact.lien }}">{{ pages.contact.nom }}</a>
<a
class="lien-menu"
href="{{ pages.contact.lien }}"
>
{{ pages.contact.nom }}
</a>
</li>
</span>
</ul>
@ -47,7 +72,9 @@
<section class="compte-panier">
{# Bouton « Panier » avec l'indicateur de quantité de Produits #}
<a
class="lien-bouton" data-contient-articles="{{ articles_presents }}" href="{{ pages.cart.lien }}"
class="lien-bouton"
data-contient-articles="{{ articles_presents }}"
href="{{ pages.cart.lien }}"
rel="cart"
>
cart ({{ quantite_articles }})

View file

@ -1,14 +1,37 @@
<!doctype html>
<head>
<meta charset="{{ site.charset }}" />
<meta name="description" content="{{ site.description }}" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta
name="description"
content="{{ site.description }}"
/>
<meta
http-equiv="Content-Type"
content="text/html; charset=UTF-8"
/>
<meta
name="viewport"
content="width=device-width, initial-scale=1"
/>
<link rel="apple-touch-icon" href="{{site.theme.link}}/assets/img/apple-touch-icon.png" />
<link rel="icon" href="{{site.theme.link}}/assets/img/favicon.ico" sizes="48x48" />
<link rel="icon" href="{{site.theme.link}}/assets/img/favicon.svg" type="image/svg+xml" />
<link rel="manifest" href="{{site.theme.link}}/assets/site.webmanifest" />
<link
rel="apple-touch-icon"
href="{{site.theme.link}}/assets/img/apple-touch-icon.png"
/>
<link
rel="icon"
href="{{site.theme.link}}/assets/img/favicon.ico"
sizes="48x48"
/>
<link
rel="icon"
href="{{site.theme.link}}/assets/img/favicon.svg"
type="image/svg+xml"
/>
<link
rel="manifest"
href="{{site.theme.link}}/assets/site.webmanifest"
/>
{#
<link

View file

@ -1,9 +1,15 @@
<nav id="menu-categories-produits" class="menu-categories-produits">
<nav
id="menu-categories-produits"
class="menu-categories-produits"
>
<ul>
<li {{ est_page_tous_produits ? "class='categorie-courante'" : '' }}><a href="{{ pages.shop.lien }}">All</a></li>
{% for categorie in categories_produits %}
{# TODO: Factoriser l'injection de classe d'une manière plus propre #}
<li {{ categorie.courante ? "class='categorie-courante'" : '' }} id="categorie-{{ categorie.slug|e }}">
<li
{{ categorie.courante ? "class='categorie-courante'" : '' }}
id="categorie-{{ categorie.slug|e }}"
>
<a href="/{{ base_categorie_produit }}/{{ categorie.slug|e }}">{{ categorie.nom|e }}</a>
</li>
{% endfor %}

View file

@ -1,4 +1,7 @@
<section class="panneau" id="panneau-informations-client">
<section
class="panneau"
id="panneau-informations-client"
>
<header class="panneau__en-tete">
<h2>Your info</h2>
</header>
@ -10,20 +13,32 @@
{# Bouton PayPal #}
<button type="button">
<img
alt="PayPal's Logo" height="18" src="{{ site.theme.link }}/assets/img/paypal/logo-paypal.svg"
alt="PayPal's Logo"
height="18"
src="{{ site.theme.link }}/assets/img/paypal/logo-paypal.svg"
width="13.48"
/>
<img
alt="PayPal" height="18" src="{{ site.theme.link }}/assets/img/paypal/titre-paypal.svg"
alt="PayPal"
height="18"
src="{{ site.theme.link }}/assets/img/paypal/titre-paypal.svg"
width="67.69"
/>
</button>
</div>
<form id="formulaire-commande" class="panneau__formulaires" method="post">
<form
id="formulaire-commande"
class="panneau__formulaires"
method="post"
>
{# Formulaires pour la livraison et facturation #}
<div class="panneau__formulaires__separation-adresses">
<input id="separation-adresses" name="separation-adresses" type="checkbox" />
<input
id="separation-adresses"
name="separation-adresses"
type="checkbox"
/>
<label for="separation-adresses">Use a separate billing address</label>
</div>
@ -34,8 +49,12 @@
<div class="formulaire__champs__champ">
<label for="livraison-prenom">First name</label>
<input
autocomplete="given-name" id="livraison-prenom" minlength="2"
name="livraison-prenom" required type="text"
autocomplete="given-name"
id="livraison-prenom"
minlength="2"
name="livraison-prenom"
required
type="text"
value="Gauthier"
/>
</div>
@ -43,8 +62,12 @@
<div class="formulaire__champs__champ">
<label for="livraison-nom">Last name</label>
<input
autocomplete="family-name" id="livraison-nom" name="livraison-nom"
minlength="2" required type="text"
autocomplete="family-name"
id="livraison-nom"
name="livraison-nom"
minlength="2"
required
type="text"
value="COLIN"
/>
</div>
@ -52,16 +75,24 @@
<div class="formulaire__champs__champ">
<label for="livraison-adresse">Address</label>
<input
autocomplete="street-address" id="livraison-adresse" name="livraison-adresse"
required type="text" value="5 rue de la Ville"
autocomplete="street-address"
id="livraison-adresse"
name="livraison-adresse"
required
type="text"
value="5 rue de la Ville"
/>
</div>
<div class="formulaire__champs__champ">
<label for="livraison-code-postal">Postcode</label>
<input
autocomplete="postal-code" id="livraison-code-postal" minlength="3"
name="livraison-code-postal" required type="text"
autocomplete="postal-code"
id="livraison-code-postal"
minlength="3"
name="livraison-code-postal"
required
type="text"
value="57000"
/>
</div>
@ -69,8 +100,12 @@
<div class="formulaire__champs__champ">
<label for="livraison-ville">City</label>
<input
autocomplete="address-level2" id="livraison-ville" minlength="2"
name="livraison-ville" required type="text"
autocomplete="address-level2"
id="livraison-ville"
minlength="2"
name="livraison-ville"
required
type="text"
value="Metz"
/>
</div>
@ -78,44 +113,68 @@
<div class="formulaire__champs__champ">
<label for="livraison-region-etat">Region/State</label>
<input
autocomplete="address-level1" id="livraison-region-etat" name="livraison-region-etat"
placeholder="If applicable" type="text"
autocomplete="address-level1"
id="livraison-region-etat"
name="livraison-region-etat"
placeholder="If applicable"
type="text"
/>
</div>
<div class="formulaire__champs__champ">
<label for="livraison-pays">Country</label> <select id="livraison-pays" name="livraison-pays" />
<label for="livraison-pays">Country</label>
<select
id="livraison-pays"
name="livraison-pays"
></select>
</div>
<div class="formulaire__champs__champ">
<label for="livraison-telephone">Phone</label>
<input
autocomplete="tel" id="livraison-telephone" minlength="6"
name="livraison-telephone" placeholder="+33 6 03 03 03 03" required
type="tel" value="+33 6 03 03 03 03"
autocomplete="tel"
id="livraison-telephone"
minlength="6"
name="livraison-telephone"
placeholder="+33 6 03 03 03 03"
required
type="tel"
value="+33 6 03 03 03 03"
/>
</div>
<div class="formulaire__champs__champ">
<label for="livraison-email">Email Address</label>
<input
autocomplete="email" id="livraison-email" minlength="4"
name="livraison-email" placeholder="moshimoshi@email.com" required
type="email" value="moshimoshi@email.com"
autocomplete="email"
id="livraison-email"
minlength="4"
name="livraison-email"
placeholder="moshimoshi@email.com"
required
type="email"
value="moshimoshi@email.com"
/>
</div>
</div>
</div>
<div class="panneau__formulaires__facturation formulaire" hidden>
<div
class="panneau__formulaires__facturation formulaire"
hidden
>
<h3 class="formulaire__titre">Billing:</h3>
<div class="formulaire__champs">
<div class="formulaire__champs__champ">
<label for="facturation-prenom">First name</label>
<input
autocomplete="given-name" disabled id="facturation-prenom"
name="facturation-prenom" minlength="2" required
autocomplete="given-name"
disabled
id="facturation-prenom"
name="facturation-prenom"
minlength="2"
required
type="text"
/>
</div>
@ -123,8 +182,12 @@
<div class="formulaire__champs__champ">
<label for="facturation-nom">Last name</label>
<input
autocomplete="family-name" disabled id="facturation-nom"
name="facturation-nom" minlength="2" required
autocomplete="family-name"
disabled
id="facturation-nom"
name="facturation-nom"
minlength="2"
required
type="text"
/>
</div>
@ -132,16 +195,24 @@
<div class="formulaire__champs__champ">
<label for="facturation-adresse">Address</label>
<input
autocomplete="street-address" disabled id="facturation-adresse"
name="facturation-adresse" required type="text"
autocomplete="street-address"
disabled
id="facturation-adresse"
name="facturation-adresse"
required
type="text"
/>
</div>
<div class="formulaire__champs__champ">
<label for="facturation-code-postal">Postcode</label>
<input
autocomplete="postal-code" disabled id="facturation-code-postal"
minlength="3" name="facturation-code-postal" required
autocomplete="postal-code"
disabled
id="facturation-code-postal"
minlength="3"
name="facturation-code-postal"
required
type="text"
/>
</div>
@ -149,8 +220,12 @@
<div class="formulaire__champs__champ">
<label for="facturation-ville">City</label>
<input
autocomplete="address-level2" disabled id="facturation-ville"
minlength="2" name="facturation-ville" required
autocomplete="address-level2"
disabled
id="facturation-ville"
minlength="2"
name="facturation-ville"
required
type="text"
/>
</div>
@ -158,31 +233,49 @@
<div class="formulaire__champs__champ">
<label for="facturation-region-etat">Region/State</label>
<input
autocomplete="address-level1" disabled id="facturation-region-etat"
name="facturation-region-etat" placeholder="If applicable" type="text"
autocomplete="address-level1"
disabled
id="facturation-region-etat"
name="facturation-region-etat"
placeholder="If applicable"
type="text"
/>
</div>
<div class="formulaire__champs__champ">
<label for="facturation-pays">Country</label>
<select id="facturation-pays" disabled name="facturation-pays" />
<select
id="facturation-pays"
disabled
name="facturation-pays"
></select>
</div>
<div class="formulaire__champs__champ">
<label for="facturation-telephone">Phone</label>
<input
autocomplete="tel" disabled id="facturation-telephone"
minlength="6" name="facturation-telephone" placeholder="+33 6 03 43 60 16"
required type="tel"
autocomplete="tel"
disabled
id="facturation-telephone"
minlength="6"
name="facturation-telephone"
placeholder="+33 6 03 43 60 16"
required
type="tel"
/>
</div>
<div class="formulaire__champs__champ">
<label for="facturation-email">Email Address</label>
<input
autocomplete="email" disabled id="facturation-email"
minlength="4" name="facturation-email" placeholder="moshimoshi@email.com"
required type="email"
autocomplete="email"
disabled
id="facturation-email"
minlength="4"
name="facturation-email"
placeholder="moshimoshi@email.com"
required
type="email"
/>
</div>
</div>
@ -192,7 +285,7 @@
<h3 class="formulaire__titre">Payment:</h3>
{# Carte de crédit via Stripe #}
<div class="formulaire__paiement" />
{# <div class="formulaire__paiement">&nbsp;</div> #}
{# PayPal #}
<div class="formulaire__paiement">
@ -200,15 +293,27 @@
<p>Please fill out and submit the above form to make payment available.</p>
</div>
<div class="formulaire__paiement__choix" hidden>
<div
class="formulaire__paiement__choix"
hidden
>
<label for="paiement-stripe">Credit card</label>
<input id="paiement-stripe" name="type-paiement" type="radio" />
<input
id="paiement-stripe"
name="type-paiement"
type="radio"
/>
</div>
</div>
</div>
</form>
<footer class="panneau__pied-de-page">
<button form="formulaire-commande" type="submit">Submit</button>
<button
form="formulaire-commande"
type="submit"
>
Submit
</button>
</footer>
</section>

View file

@ -1,11 +1,17 @@
<section class="panneau" id="panneau-panier">
<section
class="panneau"
id="panneau-panier"
>
<header class="panneau__en-tete">
<h2>Your cart</h2>
</header>
<div class="panneau__grille-produits">
{% for produit in produits_panier %}
<article class="panneau__grille-produits__produit" data-cle-panier="{{ produit.cle }}">
<article
class="panneau__grille-produits__produit"
data-cle-panier="{{ produit.cle }}"
>
<div class="panneau__grille-produits__produit__illustratif">
<a href="{{ produit.url }}">{{ produit.image }}</a>
</div>
@ -26,14 +32,30 @@
<div class="detail-produit__actions">
<button
class="detail-produit__actions__soustraction" {{ produit.quantite > 1 ? "" : "disabled" }} type="button"
class="detail-produit__actions__soustraction"
{{ produit.quantite > 1 ? "" : "disabled" }}
type="button"
>
-
</button>
<input min="1" type="number" value="{{ produit.quantite }}" />
<button class="detail-produit__actions__addition" type="button">+</button>
<input
min="1"
type="number"
value="{{ produit.quantite }}"
/>
<button
class="detail-produit__actions__addition"
type="button"
>
+
</button>
<button class="detail-produit__actions__suppression" type="button">Remove</button>
<button
class="detail-produit__actions__suppression"
type="button"
>
Remove
</button>
</div>
</div>
</article>
@ -50,7 +72,9 @@
<div class="panneau__emballages__choix__ligne">
<label for="emballages-tous-produits">To all products</label>
<input
id="emballages-tous-produits" name="emballages" type="radio"
id="emballages-tous-produits"
name="emballages"
type="radio"
value="emballages-tous-produits"
/>
</div>
@ -58,7 +82,9 @@
<div class="panneau__emballages__choix__ligne">
<label for="emballages-produits-specifiques">To specific products</label>
<input
id="emballages-produits-specifiques" name="emballages" type="radio"
id="emballages-produits-specifiques"
name="emballages"
type="radio"
value="emballages-produits-specifiques"
/>
</div>
@ -68,19 +94,32 @@
<div class="panneau__instructions-code-promo">
<textarea
class="panneau__instructions-code-promo__instructions" id="instructions" maxlength="2000"
class="panneau__instructions-code-promo__instructions"
id="instructions"
maxlength="2000"
minlength="10"
name="instructions"
placeholder="Add special instructions for your order: specify the products you want wrapped and how (i.e. all in one bag or separated), a gift message, etc."
resizable="false" rows="3" spellcheck="true"
/>
resizable="false"
rows="3"
spellcheck="true"
></textarea>
<div class="panneau__instructions-code-promo__code-promo">
<input
id="code-promo" name="code-promo" placeholder="Discount code or gift card"
type="text" maxlength="20" minlength="3"
id="code-promo"
name="code-promo"
placeholder="Discount code or gift card"
type="text"
maxlength="20"
minlength="3"
/>
<button for="code-promo" type="button">Apply</button>
<button
for="code-promo"
type="button"
>
Apply
</button>
</div>
</div>

View file

@ -2,26 +2,35 @@
Boîte flottante contenant les informations sur le Produit, en détails, et le sélecteur de quantité/taille pour l'ajout au Panier
#}
<aside aria-label="Product's details, size and quantity selection" class="informations-produit">
<aside
aria-label="Product's details, size and quantity selection"
class="informations-produit"
>
<div class="informations-produit__conteneur">
<section class="onglets-details-produit">
{# Contenus #}
<section
role="tabpanel" id="details-produit" aria-labelledby="label-details-produit"
role="tabpanel"
id="details-produit"
aria-labelledby="label-details-produit"
hidden
>
{{ produit.details }}
</section>
<section
role="tabpanel" id="conditions-livraison" aria-labelledby="label-conditions-livraison"
role="tabpanel"
id="conditions-livraison"
aria-labelledby="label-conditions-livraison"
hidden
>
{{ descriptions_produits.texte_conditions_livraison }}
</section>
<section
role="tabpanel" id="entretien-produit" aria-labelledby="label-entretien-produit"
role="tabpanel"
id="entretien-produit"
aria-labelledby="label-entretien-produit"
hidden
>
{{ descriptions_produits.texte_entretien_produit }}
@ -31,7 +40,9 @@
<ul role="tablist">
<li role="presentation">
<a
role="tab" href="#details-produit" id="label-details-produit"
role="tab"
href="#details-produit"
id="label-details-produit"
aria-selected="false"
>
Details
@ -40,7 +51,9 @@
<li role="presentation">
<a
role="tab" href="#conditions-livraison" id="label-conditions-livraison"
role="tab"
href="#conditions-livraison"
id="label-conditions-livraison"
aria-selected="false"
>
Shipping
@ -49,7 +62,9 @@
<li role="presentation">
<a
role="tab" href="#entretien-produit" id="label-entretien-produit"
role="tab"
href="#entretien-produit"
id="label-entretien-produit"
aria-selected="false"
>
Care
@ -62,13 +77,26 @@
<h3 class="selecteur-produit__nom">{{ produit.nom }}</h3>
<div class="selecteur-produit__selection-variation">
<label id="label-selecteur-variation" for="selecteur-variation">Select size:</label>
<label
id="label-selecteur-variation"
for="selecteur-variation"
>
Select size:
</label>
<div class="selecteur-produit__selection-variation__selecteurs">
<select
aria-labelledby="label-selecteur-variation" class="selecteur-natif" id="selecteur-variation"
aria-labelledby="label-selecteur-variation"
class="selecteur-natif"
id="selecteur-variation"
name="variations"
>
<option disabled selected value="">--</option>
<option
disabled
selected
value=""
>
--
</option>
{% for taille in tailles_produit %}
<option value="{{ produit.variations_ids[loop.index0] }}">{{ taille }}</option>
{% endfor %}
@ -89,7 +117,9 @@
<section class="actions-produit">
<button
class="bouton-case-pleine" disabled id="bouton-ajout-panier"
class="bouton-case-pleine"
disabled
id="bouton-ajout-panier"
type="button"
>
Add to cart

View file

@ -1,5 +1,8 @@
<main class="photos-produit">
<section aria-label="Photo of the Product alone" class="colonne-gauche">
<section
aria-label="Photo of the Product alone"
class="colonne-gauche"
>
{% for photo in produit.photos_colonne_gauche %}
<figure>
<picture>
@ -9,7 +12,10 @@
{% endfor %}
</section>
<section aria-label="Photos of the Product worn" class="colonne-droite">
<section
aria-label="Photos of the Product worn"
class="colonne-droite"
>
{% for photo in produit.photos_colonne_droite %}
<figure>
<picture>

View file

@ -1,4 +1,7 @@
<section aria-label="Products in the same Collection" class="produits-similaires">
<section
aria-label="Products in the same Collection"
class="produits-similaires"
>
<header><h2>From the same Collection</h2></header>
{% include "parts/pages/produit/grille-produits-similaires.twig" %}

View file

@ -1,6 +1,9 @@
<footer id="pied-de-page">
<section class="zone-menu-navigation-secondaire">
<nav class="menu-navigation" id="menu-navigation-secondaire">
<nav
class="menu-navigation"
id="menu-navigation-secondaire"
>
<ul>
<li><a href="/contact">Contact</a></li>
<li><a href="">Terms & Legals</a></li>
@ -10,7 +13,10 @@
</section>
<section class="zone-liens-reseaux-sociaux">
<nav class="menu-navigation" id="liens-reseaux-sociaux">
<nav
class="menu-navigation"
id="liens-reseaux-sociaux"
>
<ul>
{% for lien in liens_reseaux_sociaux %}
{% if lien.url %}