2024-09-07

This commit is contained in:
gcch 2024-09-07 11:09:46 +02:00
commit 3ae978e4e8
547 changed files with 3766 additions and 813 deletions

View file

@ -743,8 +743,10 @@ ul.avec-puce-cercle a {
.informations-produit .actions-produit {
overflow: hidden;
background: var(--couleur-jaune);
transition: 0.2s background;
/* Indique que le Bouton est désactivé en utilisant un fond gris */
}
.informations-produit .actions-produit.desactive {
.informations-produit .actions-produit:has(button[disabled]) {
background: rgba(236, 234, 235, 0.9);
}
.informations-produit .actions-produit button {
@ -753,9 +755,10 @@ ul.avec-puce-cercle a {
text-transform: uppercase;
letter-spacing: 1px;
transition: 0.2s font-variation-settings;
/* Change la casse de la police au survol quand le Bouton n'est pas désactivé */
}
@media (hover: hover) {
.informations-produit .actions-produit button :not([disabled]):hover {
.informations-produit .actions-produit button:not([disabled]):hover {
font-variation-settings: "wght" 500;
}
}

View file

@ -1 +1 @@
{"version":3,"sourceRoot":"","sources":["../../src/sass/base/polices/_lato.scss","../../src/sass/base/polices/_myriad.scss","../../src/sass/abstracts/_variables.scss","../../src/sass/base/_base.scss","../../src/sass/base/_typographie.scss","../../src/sass/base/elements/_boutons.scss","../../src/sass/base/elements/_images.scss","../../src/sass/base/elements/_liens.scss","../../src/sass/base/elements/_listes.scss","../../src/sass/layouts/_en-tete.scss","../../src/sass/layouts/_menu-categories-produits.scss","../../src/sass/layouts/_colonnes-photos.scss","../../src/sass/layouts/_grille-produits.scss","../../src/sass/layouts/_informations-produit.scss","../../src/sass/layouts/_produits-similaires.scss","../../src/sass/layouts/_pied-de-page.scss"],"names":[],"mappings":";AAAA;EACE;EACA;EACA;EACA;EACA,KACE;;AAIJ;EACE;EACA;EACA;EACA;EACA,KACE;;AAIJ;EACE;EACA;EACA;EACA;EACA,KACE;;AAIJ;EACE;EACA;EACA;EACA;EACA,KACE;;AAIJ;EACE;EACA;EACA;EACA;EACA,KACE;;AAIJ;EACE;EACA;EACA;EACA;EACA,KACE;;AAIJ;EACE;EACA;EACA;EACA;EACA,KACE;;AAIJ;EACE;EACA;EACA;EACA;EACA,KACE;;AAIJ;EACE;EACA;EACA;EACA;EACA,KACE;;AAIJ;EACE;EACA;EACA;EACA;EACA,KACE;;AChGJ;EACE;EACA;EACA;EACA;EACA;EACA,KACE;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA,KACE;;AChBJ;AACE;EACA;EACA;EACA;EACA;AAEA;EACA;EACA;AAEA;EACA;EACA;AAEA;EACA;EACA;EACA;EACA;EACA;;;AClBF;AAAA;AAAA;AAAA;AAAA;AAKA;EACE;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA;AAAA;AAAA;EAGE;EACA;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;AAIA;EACE;EACA;;;AAGF;AAAA;AAAA;AAGA;AAAA;AAAA;AAAA;EAIE;;;AAGF;AAAA;AAAA;AAGA;EACE;;;ACtDF;EACE;EACA;EACA;;;ACHF;AAAA;AAAA;AAGA;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAGF;EACE;;;ACfJ;AAAA;AAAA;AAAA;AAAA;AAKA;AAAA;EAEE;EACA;;;AAGF;EACE;EACA;;;ACbF;AAAA;AAAA;AAAA;AAAA;AAKA;AACE;EACA;EAEA;EACA;EACA;EACA;EACA;EACA,YACE,kHAK4B;EAE9B;AAEA;AAMA;AAAA;AAAA;;AALA;EAEE;;AAMF;AACE;EACA;EACA;AAEA;EACA;EAEA;EACA;AAEA;AAMA;AAKA;;AAVA;EAEE;;AAIF;EACE;;AAIF;EACE;IACE;;;AAMJ;EACE;IACE;;;;AClER;AAAA;AAAA;AAAA;AAAA;AAKA;EACE;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAMA;AACE;EACA;AAEA;EACA;AAEA;EACA;;AAEA;EACE;EACA,qLAEkE;;;AC5BxE;AACE;EACA;EACA;AAEA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAWA;;AATA;EACE;;AAEA;AAAA;EAEE;;AAKJ;EACE;EACA;EACA;EACA;EACA;AAUA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AARA;EACE;EACA;EACA;EACA;EACA;;AAYF;AACE;EACA;AAEA;EACA;EACA;EACA;AAEA;EACA;EAEA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;IACE;;;AAMR;EACE;EACA;EACA;EACA;EACA;AAEA;AAAA;AAAA;;AAGA;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;ACvGR;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA;AACE;EACA;EACA;AAEA;EACA;EACA;EAEA;EACA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAOA;EACE;EACA;EACA;AAEA;AAAA;AAAA;;AAGA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAMA;AAAA;AAAA;AAAA;AAAA;;AAJA;EACE;;AAQF;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EAEE;EACA;;AAGF;EACE;IACE;IACA;;;AAKN;EACE;;AAGF;EACE;;;AC/ER;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA;AACE;EACA;AAEA;EACA;EACA;AAAA;AAAA;AAIA;EACA;EAEA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAGA;EACE;;AAMF;EACE;;;AC5CR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYA;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAEA;EACE;EACA;EACA;EACA;;AAEA;EACE;;AAEA;EAEI;IACE;IACA;IACA;;;AAMR;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAGF;EACE;EACA;;;AC9EV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA;AACE;EAEA;EAGA;EACA;EAGA;EAEA;EACA;EACA;EACA;EACA;AAuGA;AAyGA;;AA9MA;EACE;EACA;EACA;EACA;EACA;AAEA;AAAA;AAAA;;AAGA;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAKN;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;;AAGF;EACE;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAEA;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;;AACA;EACE;;AAGF;EACE;;AAMR;EACE;;AAEA;EACE;;AAMN;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;EACA;EACA;AAEA;AAMA;AAwCA;AAqBA;;AAlEA;EACE;EACA;;AAIF;EACE;AAEA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EAEI;IACE;IACA;;;AAKN;EAEI;IACE;IACA;;;AAOR;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;IACE;;;AAKN;EACE;;AAeJ;EACE;;AAKJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGE;EACE;IACE;;;;AAQZ;EACE;IACE;;EAGF;IACE;;;ACxQJ;EACE;EACA;EACA;EACA,qBACE;EAEF;EACA;AAEA;;AACA;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAEA;EACE;EACA;EACA;EACA;;AAEA;EACE;;AAEA;EAEI;IACE;IACA;IACA;;;AAMR;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAGF;EACE;EACA;;;AC7FZ;AAAA;AAAA;AAGA;AACE;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA","file":"main.css"}
{"version":3,"sourceRoot":"","sources":["../../src/sass/base/polices/_lato.scss","../../src/sass/base/polices/_myriad.scss","../../src/sass/abstracts/_variables.scss","../../src/sass/base/_base.scss","../../src/sass/base/_typographie.scss","../../src/sass/base/elements/_boutons.scss","../../src/sass/base/elements/_images.scss","../../src/sass/base/elements/_liens.scss","../../src/sass/base/elements/_listes.scss","../../src/sass/layouts/_en-tete.scss","../../src/sass/layouts/_menu-categories-produits.scss","../../src/sass/layouts/_colonnes-photos.scss","../../src/sass/layouts/_grille-produits.scss","../../src/sass/layouts/_informations-produit.scss","../../src/sass/layouts/_produits-similaires.scss","../../src/sass/layouts/_pied-de-page.scss"],"names":[],"mappings":";AAAA;EACE;EACA;EACA;EACA;EACA,KACE;;AAIJ;EACE;EACA;EACA;EACA;EACA,KACE;;AAIJ;EACE;EACA;EACA;EACA;EACA,KACE;;AAIJ;EACE;EACA;EACA;EACA;EACA,KACE;;AAIJ;EACE;EACA;EACA;EACA;EACA,KACE;;AAIJ;EACE;EACA;EACA;EACA;EACA,KACE;;AAIJ;EACE;EACA;EACA;EACA;EACA,KACE;;AAIJ;EACE;EACA;EACA;EACA;EACA,KACE;;AAIJ;EACE;EACA;EACA;EACA;EACA,KACE;;AAIJ;EACE;EACA;EACA;EACA;EACA,KACE;;AChGJ;EACE;EACA;EACA;EACA;EACA;EACA,KACE;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA,KACE;;AChBJ;AACE;EACA;EACA;EACA;EACA;AAEA;EACA;EACA;AAEA;EACA;EACA;AAEA;EACA;EACA;EACA;EACA;EACA;;;AClBF;AAAA;AAAA;AAAA;AAAA;AAKA;EACE;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA;AAAA;AAAA;EAGE;EACA;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;AAIA;EACE;EACA;;;AAGF;AAAA;AAAA;AAGA;AAAA;AAAA;AAAA;EAIE;;;AAGF;AAAA;AAAA;AAGA;EACE;;;ACtDF;EACE;EACA;EACA;;;ACHF;AAAA;AAAA;AAGA;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAGF;EACE;;;ACfJ;AAAA;AAAA;AAAA;AAAA;AAKA;AAAA;EAEE;EACA;;;AAGF;EACE;EACA;;;ACbF;AAAA;AAAA;AAAA;AAAA;AAKA;AACE;EACA;EAEA;EACA;EACA;EACA;EACA;EACA,YACE,kHAK4B;EAE9B;AAEA;AAMA;AAAA;AAAA;;AALA;EAEE;;AAMF;AACE;EACA;EACA;AAEA;EACA;EAEA;EACA;AAEA;AAMA;AAKA;;AAVA;EAEE;;AAIF;EACE;;AAIF;EACE;IACE;;;AAMJ;EACE;IACE;;;;AClER;AAAA;AAAA;AAAA;AAAA;AAKA;EACE;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAMA;AACE;EACA;AAEA;EACA;AAEA;EACA;;AAEA;EACE;EACA,qLAEkE;;;AC5BxE;AACE;EACA;EACA;AAEA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAWA;;AATA;EACE;;AAEA;AAAA;EAEE;;AAKJ;EACE;EACA;EACA;EACA;EACA;AAUA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AARA;EACE;EACA;EACA;EACA;EACA;;AAYF;AACE;EACA;AAEA;EACA;EACA;EACA;AAEA;EACA;EAEA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;IACE;;;AAMR;EACE;EACA;EACA;EACA;EACA;AAEA;AAAA;AAAA;;AAGA;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;ACvGR;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA;AACE;EACA;EACA;AAEA;EACA;EACA;EAEA;EACA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAOA;EACE;EACA;EACA;AAEA;AAAA;AAAA;;AAGA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAMA;AAAA;AAAA;AAAA;AAAA;;AAJA;EACE;;AAQF;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EAEE;EACA;;AAGF;EACE;IACE;IACA;;;AAKN;EACE;;AAGF;EACE;;;AC/ER;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA;AACE;EACA;AAEA;EACA;EACA;AAAA;AAAA;AAIA;EACA;EAEA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAGA;EACE;;AAMF;EACE;;;AC5CR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYA;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAEA;EACE;EACA;EACA;EACA;;AAEA;EACE;;AAEA;EAEI;IACE;IACA;IACA;;;AAMR;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAGF;EACE;EACA;;;AC9EV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA;AACE;EAEA;EAGA;EACA;EAGA;EAEA;EACA;EACA;EACA;EACA;AAuGA;AAyGA;;AA9MA;EACE;EACA;EACA;EACA;EACA;AAEA;AAAA;AAAA;;AAGA;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAKN;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;;AAGF;EACE;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAEA;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;;AACA;EACE;;AAGF;EACE;;AAMR;EACE;;AAEA;EACE;;AAMN;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;EACA;EACA;AAEA;AAMA;AAwCA;AAqBA;;AAlEA;EACE;EACA;;AAIF;EACE;AAEA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EAEI;IACE;IACA;;;AAKN;EAEI;IACE;IACA;;;AAOR;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;IACE;;;AAKN;EACE;;AAeJ;EACE;;AAKJ;EACE;EACA;EACA;AAEA;;AACA;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;AAEA;;AAEE;EACE;IACE;;;;AAQZ;EACE;IACE;;EAGF;IACE;;;AC3QJ;EACE;EACA;EACA;EACA,qBACE;EAEF;EACA;AAEA;;AACA;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAEA;EACE;EACA;EACA;EACA;;AAEA;EACE;;AAEA;EAEI;IACE;IACA;IACA;;;AAMR;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAGF;EACE;EACA;;;AC7FZ;AAAA;AAAA;AAGA;AACE;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA","file":"main.css"}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -3,42 +3,72 @@
"file": "Either.js",
"name": "Either"
},
"_chunk-7BKSRZNG.js": {
"file": "chunk-7BKSRZNG.js",
"name": "chunk-7BKSRZNG"
},
"_exports.js": {
"file": "exports.js",
"name": "exports"
},
"web/app/themes/haiku-atelier-2024/src/scripts/constantes/api.ts": {
"file": "api.js",
"name": "api",
"src": "web/app/themes/haiku-atelier-2024/src/scripts/constantes/api.ts",
"isEntry": true
},
"web/app/themes/haiku-atelier-2024/src/scripts/constantes/dom.ts": {
"file": "dom.js",
"name": "dom",
"src": "web/app/themes/haiku-atelier-2024/src/scripts/constantes/dom.ts",
"isEntry": true
},
"web/app/themes/haiku-atelier-2024/src/scripts/gaffe.ts": {
"file": "gaffe.js",
"name": "gaffe",
"src": "web/app/themes/haiku-atelier-2024/src/scripts/gaffe.ts",
"isEntry": true
"isEntry": true,
"imports": [
"_chunk-7BKSRZNG.js",
"web/app/themes/haiku-atelier-2024/src/scripts/constantes/api.ts",
"_exports.js"
]
},
"web/app/themes/haiku-atelier-2024/src/scripts/lib/api.ts": {
"file": "api.js",
"file": "api2.js",
"name": "api",
"src": "web/app/themes/haiku-atelier-2024/src/scripts/lib/api.ts",
"isEntry": true,
"imports": [
"web/app/themes/haiku-atelier-2024/src/scripts/lib/constantes.ts",
"web/app/themes/haiku-atelier-2024/src/scripts/constantes/api.ts",
"_Either.js"
]
},
"web/app/themes/haiku-atelier-2024/src/scripts/lib/constantes.ts": {
"file": "constantes.js",
"name": "constantes",
"src": "web/app/themes/haiku-atelier-2024/src/scripts/lib/constantes.ts",
"isEntry": true
},
"web/app/themes/haiku-atelier-2024/src/scripts/lib/dom.ts": {
"file": "dom.js",
"file": "dom2.js",
"name": "dom",
"src": "web/app/themes/haiku-atelier-2024/src/scripts/lib/dom.ts",
"isEntry": true,
"imports": [
"_chunk-7BKSRZNG.js",
"web/app/themes/haiku-atelier-2024/src/scripts/lib/erreurs.ts",
"_Either.js"
"_Either.js",
"_exports.js"
]
},
"web/app/themes/haiku-atelier-2024/src/scripts/lib/erreurs.ts": {
"file": "erreurs.js",
"name": "erreurs",
"src": "web/app/themes/haiku-atelier-2024/src/scripts/lib/erreurs.ts",
"isEntry": true,
"imports": [
"_exports.js"
]
},
"web/app/themes/haiku-atelier-2024/src/scripts/lib/gardes.ts": {
"file": "gardes.js",
"name": "gardes",
"src": "web/app/themes/haiku-atelier-2024/src/scripts/lib/gardes.ts",
"isEntry": true
},
"web/app/themes/haiku-atelier-2024/src/scripts/lib/gestion-panier.ts": {
@ -47,7 +77,7 @@
"src": "web/app/themes/haiku-atelier-2024/src/scripts/lib/gestion-panier.ts",
"isEntry": true,
"imports": [
"web/app/themes/haiku-atelier-2024/src/scripts/lib/constantes.ts",
"web/app/themes/haiku-atelier-2024/src/scripts/constantes/api.ts",
"_Either.js"
]
},
@ -58,7 +88,9 @@
"isEntry": true,
"imports": [
"web/app/themes/haiku-atelier-2024/src/scripts/lib/dom.ts",
"_chunk-7BKSRZNG.js",
"web/app/themes/haiku-atelier-2024/src/scripts/lib/erreurs.ts",
"_exports.js",
"_Either.js"
]
},
@ -68,30 +100,28 @@
"src": "web/app/themes/haiku-atelier-2024/src/scripts/scripts-page-produit.ts",
"isEntry": true,
"imports": [
"web/app/themes/haiku-atelier-2024/src/scripts/lib/constantes.ts",
"_chunk-7BKSRZNG.js",
"web/app/themes/haiku-atelier-2024/src/scripts/constantes/api.ts",
"web/app/themes/haiku-atelier-2024/src/scripts/constantes/dom.ts",
"web/app/themes/haiku-atelier-2024/src/scripts/lib/dom.ts",
"web/app/themes/haiku-atelier-2024/src/scripts/lib/erreurs.ts",
"web/app/themes/haiku-atelier-2024/src/scripts/lib/gardes.ts",
"web/app/themes/haiku-atelier-2024/src/scripts/lib/utils.ts",
"web/app/themes/haiku-atelier-2024/src/scripts/types/cart-add-item.ts",
"web/app/themes/haiku-atelier-2024/src/scripts/types/api/cart-add-item.ts",
"_Either.js",
"web/app/themes/haiku-atelier-2024/src/scripts/lib/dom.ts"
"_exports.js"
]
},
"web/app/themes/haiku-atelier-2024/src/scripts/types/cart-add-item.ts": {
"web/app/themes/haiku-atelier-2024/src/scripts/types/api/cart-add-item.ts": {
"file": "cart-add-item.js",
"name": "cart-add-item",
"src": "web/app/themes/haiku-atelier-2024/src/scripts/types/cart-add-item.ts",
"src": "web/app/themes/haiku-atelier-2024/src/scripts/types/api/cart-add-item.ts",
"isEntry": true
},
"web/app/themes/haiku-atelier-2024/src/scripts/types/cart.ts": {
"web/app/themes/haiku-atelier-2024/src/scripts/types/api/cart.ts": {
"file": "cart.js",
"name": "cart",
"src": "web/app/themes/haiku-atelier-2024/src/scripts/types/cart.ts",
"isEntry": true
},
"web/app/themes/haiku-atelier-2024/src/scripts/vite.env.d.ts": {
"file": "vite.env.d.js",
"name": "vite.env.d",
"src": "web/app/themes/haiku-atelier-2024/src/scripts/vite.env.d.ts",
"src": "web/app/themes/haiku-atelier-2024/src/scripts/types/api/cart.ts",
"isEntry": true
}
}

View file

@ -1,3 +1,2 @@
import{d as S}from"./constantes.js";import{r as F}from"./Either.js";const H="application/json",w="Content-Type",_=Symbol(),P=Symbol();function O(t={}){var e;return(e=Object.entries(t).find(([o])=>o.toLowerCase()===w.toLowerCase()))===null||e===void 0?void 0:e[1]}function R(t){return/^application\/.*json.*/.test(t)}const f=function(t,e,o=!1){return Object.entries(e).reduce((n,[i,l])=>{const h=t[i];return Array.isArray(h)&&Array.isArray(l)?n[i]=o?[...h,...l]:l:typeof h=="object"&&typeof l=="object"?n[i]=f(h,l,o):n[i]=l,n},{...t})},y={options:{},errorType:"text",polyfills:{},polyfill(t,e=!0,o=!1,...n){const i=this.polyfills[t]||(typeof self<"u"?self[t]:null)||(typeof global<"u"?global[t]:null);if(e&&!i)throw new Error(t+" is not defined");return o&&i?new i(...n):i}};function L(t,e=!1){y.options=e?t:f(y.options,t)}function N(t,e=!1){y.polyfills=e?t:f(y.polyfills,t)}function I(t){y.errorType=t}const J=t=>e=>t.reduceRight((o,n)=>n(o),e)||e;class x extends Error{}const U=t=>{const e=Object.create(null);t=t._addons.reduce((r,s)=>s.beforeRequest&&s.beforeRequest(r,t._options,e)||r,t);const{_url:o,_options:n,_config:i,_catchers:l,_resolvers:h,_middlewares:g,_addons:m}=t,p=new Map(l),D=f(i.options,n);let T=o;const j=J(g)((r,s)=>(T=r,i.polyfill("fetch")(r,s)))(o,D),b=new Error,v=j.catch(r=>{throw{[_]:r}}).then(r=>{if(!r.ok){const s=new x;if(s.cause=b,s.stack=s.stack+`
CAUSE: `+b.stack,s.response=r,s.url=T,r.type==="opaque")throw s;return r.text().then(a=>{var c;if(s.message=a,i.errorType==="json"||((c=r.headers.get("Content-Type"))===null||c===void 0?void 0:c.split(";")[0])==="application/json")try{s.json=JSON.parse(a)}catch{}throw s.text=a,s.status=r.status,s})}return r}),A=r=>r.catch(s=>{const a=s.hasOwnProperty(_),c=a?s[_]:s,E=c?.status&&p.get(c.status)||p.get(c?.name)||a&&p.has(_)&&p.get(_);if(E)return E(c,t);const C=p.get(P);if(C)return C(c,t);throw c}),d=r=>s=>A(r?v.then(a=>a&&a[r]()).then(a=>s?s(a):a):v.then(a=>s?s(a):a)),M={_wretchReq:t,_fetchReq:j,_sharedState:e,res:d(null),json:d("json"),blob:d("blob"),formData:d("formData"),arrayBuffer:d("arrayBuffer"),text:d("text"),error(r,s){return p.set(r,s),this},badRequest(r){return this.error(400,r)},unauthorized(r){return this.error(401,r)},forbidden(r){return this.error(403,r)},notFound(r){return this.error(404,r)},timeout(r){return this.error(408,r)},internalError(r){return this.error(500,r)},fetchError(r){return this.error(_,r)}},q=m.reduce((r,s)=>({...r,...typeof s.resolver=="function"?s.resolver(r):s.resolver}),M);return h.reduce((r,s)=>s(r,t),q)},k={_url:"",_options:{},_config:y,_catchers:new Map,_resolvers:[],_deferred:[],_middlewares:[],_addons:[],addon(t){return{...this,_addons:[...this._addons,t],...t.wretch}},errorType(t){return{...this,_config:{...this._config,errorType:t}}},polyfills(t,e=!1){return{...this,_config:{...this._config,polyfills:e?t:f(this._config.polyfills,t)}}},url(t,e=!1){if(e)return{...this,_url:t};const o=this._url.split("?");return{...this,_url:o.length>1?o[0]+t+"?"+o[1]:this._url+t}},options(t,e=!1){return{...this,_options:e?t:f(this._options,t)}},headers(t){const e=t?Array.isArray(t)?Object.fromEntries(t):"entries"in t?Object.fromEntries(t.entries()):t:{};return{...this,_options:f(this._options,{headers:e})}},accept(t){return this.headers({Accept:t})},content(t){return this.headers({[w]:t})},auth(t){return this.headers({Authorization:t})},catcher(t,e){const o=new Map(this._catchers);return o.set(t,e),{...this,_catchers:o}},catcherFallback(t){return this.catcher(P,t)},resolve(t,e=!1){return{...this,_resolvers:e?[t]:[...this._resolvers,t]}},defer(t,e=!1){return{...this,_deferred:e?[t]:[...this._deferred,t]}},middlewares(t,e=!1){return{...this,_middlewares:e?t:[...this._middlewares,...t]}},fetch(t=this._options.method,e="",o=null){let n=this.url(e).options({method:t});const i=O(n._options.headers),l=this._config.polyfill("FormData",!1),h=typeof o=="object"&&!(l&&o instanceof l)&&(!n._options.headers||!i||R(i));return n=o?h?n.json(o,i):n.body(o):n,U(n._deferred.reduce((g,m)=>m(g,g._url,g._options),n))},get(t=""){return this.fetch("GET",t)},delete(t=""){return this.fetch("DELETE",t)},put(t,e=""){return this.fetch("PUT",e,t)},post(t,e=""){return this.fetch("POST",e,t)},patch(t,e=""){return this.fetch("PATCH",e,t)},head(t=""){return this.fetch("HEAD",t)},opts(t=""){return this.fetch("OPTIONS",t)},body(t){return{...this,_options:{...this._options,body:t}}},json(t,e){const o=O(this._options.headers);return this.content(e||R(o)&&o||H).body(JSON.stringify(t))}};function u(t="",e={}){return{...k,_url:t,_options:e}}u.default=u;u.options=L;u.errorType=I;u.polyfills=N;u.WretchError=x;fetch(S,{credentials:"same-origin",headers:{"Content-Type":"application/json"},method:"GET",mode:"same-origin",signal:AbortSignal.timeout(5e3)}).then(F);u(S).content("application/json").options({credentials:"same-origin",mode:"same-origin",signal:AbortSignal.timeout(5e3)}).get().json().catch();
const E="wp-json",T=`/${E}/wc/store/cart`,t=`/${E}/wc/store/cart/add-item`,s="Nonce",_="retry-after",I="x-sentry-rate-limits";export{s as E,t as R,T as a,I as b,_ as c};
//# sourceMappingURL=api.js.map

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,3 @@
import{a as R}from"./api.js";import{r as F}from"./Either.js";const H="application/json",S="Content-Type",y=Symbol(),w=Symbol();function C(t={}){var e;return(e=Object.entries(t).find(([o])=>o.toLowerCase()===S.toLowerCase()))===null||e===void 0?void 0:e[1]}function P(t){return/^application\/.*json.*/.test(t)}const u=function(t,e,o=!1){return Object.entries(e).reduce((a,[i,l])=>{const f=t[i];return Array.isArray(f)&&Array.isArray(l)?a[i]=o?[...f,...l]:l:typeof f=="object"&&typeof l=="object"?a[i]=u(f,l,o):a[i]=l,a},{...t})},g={options:{},errorType:"text",polyfills:{},polyfill(t,e=!0,o=!1,...a){const i=this.polyfills[t]||(typeof self<"u"?self[t]:null)||(typeof global<"u"?global[t]:null);if(e&&!i)throw new Error(t+" is not defined");return o&&i?new i(...a):i}};function L(t,e=!1){g.options=e?t:u(g.options,t)}function N(t,e=!1){g.polyfills=e?t:u(g.polyfills,t)}function I(t){g.errorType=t}const J=t=>e=>t.reduceRight((o,a)=>a(o),e)||e;class x extends Error{}const U=t=>{const e=Object.create(null);t=t._addons.reduce((r,s)=>s.beforeRequest&&s.beforeRequest(r,t._options,e)||r,t);const{_url:o,_options:a,_config:i,_catchers:l,_resolvers:f,_middlewares:m,_addons:E}=t,d=new Map(l),D=u(i.options,a);let j=o;const v=J(m)((r,s)=>(j=r,i.polyfill("fetch")(r,s)))(o,D),b=new Error,A=v.catch(r=>{throw{[y]:r}}).then(r=>{var s;if(!r.ok){const n=new x;if(n.cause=b,n.stack=n.stack+`
CAUSE: `+b.stack,n.response=r,n.status=r.status,n.url=j,r.type==="opaque")throw n;const c=i.errorType==="json"||((s=r.headers.get("Content-Type"))===null||s===void 0?void 0:s.split(";")[0])==="application/json";return(i.errorType?c?r.text():r[i.errorType]():Promise.resolve(r.body)).then(h=>{throw n.message=typeof h=="string"?h:r.statusText,h&&(c&&typeof h=="string"?(n.text=h,n.json=JSON.parse(h)):n[i.errorType]=h),n})}return r}),O=r=>r.catch(s=>{const n=Object.prototype.hasOwnProperty.call(s,y),c=n?s[y]:s,T=c?.status&&d.get(c.status)||d.get(c?.name)||n&&d.has(y)&&d.get(y);if(T)return T(c,t);const h=d.get(w);if(h)return h(c,t);throw c}),_=r=>s=>O(r?A.then(n=>n&&n[r]()).then(n=>s?s(n):n):A.then(n=>s?s(n):n)),M={_wretchReq:t,_fetchReq:v,_sharedState:e,res:_(null),json:_("json"),blob:_("blob"),formData:_("formData"),arrayBuffer:_("arrayBuffer"),text:_("text"),error(r,s){return d.set(r,s),this},badRequest(r){return this.error(400,r)},unauthorized(r){return this.error(401,r)},forbidden(r){return this.error(403,r)},notFound(r){return this.error(404,r)},timeout(r){return this.error(408,r)},internalError(r){return this.error(500,r)},fetchError(r){return this.error(y,r)}},q=E.reduce((r,s)=>({...r,...typeof s.resolver=="function"?s.resolver(r):s.resolver}),M);return f.reduce((r,s)=>s(r,t),q)},k={_url:"",_options:{},_config:g,_catchers:new Map,_resolvers:[],_deferred:[],_middlewares:[],_addons:[],addon(t){return{...this,_addons:[...this._addons,t],...t.wretch}},errorType(t){return{...this,_config:{...this._config,errorType:t}}},polyfills(t,e=!1){return{...this,_config:{...this._config,polyfills:e?t:u(this._config.polyfills,t)}}},url(t,e=!1){if(e)return{...this,_url:t};const o=this._url.split("?");return{...this,_url:o.length>1?o[0]+t+"?"+o[1]:this._url+t}},options(t,e=!1){return{...this,_options:e?t:u(this._options,t)}},headers(t){const e=t?Array.isArray(t)?Object.fromEntries(t):"entries"in t?Object.fromEntries(t.entries()):t:{};return{...this,_options:u(this._options,{headers:e})}},accept(t){return this.headers({Accept:t})},content(t){return this.headers({[S]:t})},auth(t){return this.headers({Authorization:t})},catcher(t,e){const o=new Map(this._catchers);return o.set(t,e),{...this,_catchers:o}},catcherFallback(t){return this.catcher(w,t)},resolve(t,e=!1){return{...this,_resolvers:e?[t]:[...this._resolvers,t]}},defer(t,e=!1){return{...this,_deferred:e?[t]:[...this._deferred,t]}},middlewares(t,e=!1){return{...this,_middlewares:e?t:[...this._middlewares,...t]}},fetch(t=this._options.method,e="",o=null){let a=this.url(e).options({method:t});const i=C(a._options.headers),l=this._config.polyfill("FormData",!1),f=typeof o=="object"&&!(l&&o instanceof l)&&(!a._options.headers||!i||P(i));return a=o?f?a.json(o,i):a.body(o):a,U(a._deferred.reduce((m,E)=>E(m,m._url,m._options),a))},get(t=""){return this.fetch("GET",t)},delete(t=""){return this.fetch("DELETE",t)},put(t,e=""){return this.fetch("PUT",e,t)},post(t,e=""){return this.fetch("POST",e,t)},patch(t,e=""){return this.fetch("PATCH",e,t)},head(t=""){return this.fetch("HEAD",t)},opts(t=""){return this.fetch("OPTIONS",t)},body(t){return{...this,_options:{...this._options,body:t}}},json(t,e){const o=C(this._options.headers);return this.content(e||P(o)&&o||H).body(JSON.stringify(t))}};function p(t="",e={}){return{...k,_url:t,_options:e}}p.default=p;p.options=L;p.errorType=I;p.polyfills=N;p.WretchError=x;fetch(R,{credentials:"same-origin",headers:{"Content-Type":"application/json"},method:"GET",mode:"same-origin",signal:AbortSignal.timeout(5e3)}).then(F);p(R).content("application/json").options({credentials:"same-origin",mode:"same-origin",signal:AbortSignal.timeout(5e3)}).get().json().catch();
//# sourceMappingURL=api2.js.map

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,2 @@
var g={done:!1,hasNext:!1};function y(i,...n){let t=i,l=n.map(r=>"lazy"in r?x(r):void 0),e=0;for(;e<n.length;){if(l[e]===void 0||!p(t)){let f=n[e];t=f(t),e+=1;continue}let r=[];for(let f=e;f<n.length;f++){let s=l[f];if(s===void 0||(r.push(s),s.isSingle))break}let o=[];for(let f of t)if(a(f,o,r))break;let{isSingle:u}=r.at(-1);t=u?o[0]:o,e+=r.length}return t}function a(i,n,t){if(t.length===0)return n.push(i),!1;let l=i,e=g,r=!1;for(let[o,u]of t.entries()){let{index:f,items:s}=u;if(s.push(l),e=u(l,f,s),u.index+=1,e.hasNext){if(e.hasMany??!1){for(let h of e.next)if(a(h,n,t.slice(o+1)))return!0;return r}l=e.next}if(!e.hasNext)break;e.done&&(r=!0)}return e.hasNext&&n.push(l),r}function x(i){let{lazy:n,lazyArgs:t}=i,l=n(...t);return Object.assign(l,{isSingle:n.single??!1,index:0,items:[]})}function p(i){return typeof i=="string"||typeof i=="object"&&i!==null&&Symbol.iterator in i}export{y as x};
//# sourceMappingURL=chunk-7BKSRZNG.js.map

View file

@ -0,0 +1 @@
{"version":3,"file":"chunk-7BKSRZNG.js","sources":["../../../../../../node_modules/.pnpm/remeda@2.12.0/node_modules/remeda/dist/chunk-ANXBDSUI.js","../../../../../../node_modules/.pnpm/remeda@2.12.0/node_modules/remeda/dist/chunk-7BKSRZNG.js"],"sourcesContent":["var e={done:!0,hasNext:!1},s={done:!1,hasNext:!1},a=()=>e,o=t=>({hasNext:!0,next:t,done:!1});export{s as a,a as b,o as c};\n","import{a as s}from\"./chunk-ANXBDSUI.js\";function x(t,...o){let n=t,u=o.map(e=>\"lazy\"in e?f(e):void 0),p=0;for(;p<o.length;){if(u[p]===void 0||!B(n)){let i=o[p];n=i(n),p+=1;continue}let r=[];for(let i=p;i<o.length;i++){let l=u[i];if(l===void 0||(r.push(l),l.isSingle))break}let a=[];for(let i of n)if(A(i,a,r))break;let{isSingle:y}=r.at(-1);n=y?a[0]:a,p+=r.length}return n}function A(t,o,n){if(n.length===0)return o.push(t),!1;let u=t,p=s,e=!1;for(let[r,a]of n.entries()){let{index:y,items:i}=a;if(i.push(u),p=a(u,y,i),a.index+=1,p.hasNext){if(p.hasMany??!1){for(let l of p.next)if(A(l,o,n.slice(r+1)))return!0;return e}u=p.next}if(!p.hasNext)break;p.done&&(e=!0)}return p.hasNext&&o.push(u),e}function f(t){let{lazy:o,lazyArgs:n}=t,u=o(...n);return Object.assign(u,{isSingle:o.single??!1,index:0,items:[]})}function B(t){return typeof t==\"string\"||typeof t==\"object\"&&t!==null&&Symbol.iterator in t}export{x as a};\n"],"names":["s","x","t","o","n","u","e","f","p","B","i","l","a","A","y","r"],"mappings":"AAAG,IAAwBA,EAAE,CAAC,KAAK,GAAG,QAAQ,EAAE,ECAR,SAASC,EAAEC,KAAKC,EAAE,CAAC,IAAIC,EAAEF,EAAEG,EAAEF,EAAE,IAAIG,GAAG,SAASA,EAAEC,EAAED,CAAC,EAAE,MAAM,EAAEE,EAAE,EAAE,KAAKA,EAAEL,EAAE,QAAQ,CAAC,GAAGE,EAAEG,CAAC,IAAI,QAAQ,CAACC,EAAEL,CAAC,EAAE,CAAC,IAAIM,EAAEP,EAAEK,CAAC,EAAEJ,EAAEM,EAAEN,CAAC,EAAEI,GAAG,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAA,EAAG,QAAQE,EAAEF,EAAEE,EAAEP,EAAE,OAAOO,IAAI,CAAC,IAAIC,EAAEN,EAAEK,CAAC,EAAE,GAAGC,IAAI,SAAS,EAAE,KAAKA,CAAC,EAAEA,EAAE,UAAU,KAAK,CAAC,IAAIC,EAAE,GAAG,QAAQF,KAAKN,EAAE,GAAGS,EAAEH,EAAEE,EAAE,CAAC,EAAE,MAAM,GAAG,CAAC,SAASE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAEV,EAAEU,EAAEF,EAAE,CAAC,EAAEA,EAAEJ,GAAG,EAAE,MAAM,CAAC,OAAOJ,CAAC,CAAC,SAASS,EAAEX,EAAEC,EAAEC,EAAE,CAAC,GAAGA,EAAE,SAAS,EAAE,OAAOD,EAAE,KAAKD,CAAC,EAAE,GAAG,IAAIG,EAAEH,EAAEM,EAAER,EAAEM,EAAE,GAAG,OAAO,CAACS,EAAEH,CAAC,IAAIR,EAAE,QAAS,EAAC,CAAC,GAAG,CAAC,MAAMU,EAAE,MAAMJ,CAAC,EAAEE,EAAE,GAAGF,EAAE,KAAKL,CAAC,EAAEG,EAAEI,EAAEP,EAAES,EAAEJ,CAAC,EAAEE,EAAE,OAAO,EAAEJ,EAAE,QAAQ,CAAC,GAAGA,EAAE,SAAS,GAAG,CAAC,QAAQG,KAAKH,EAAE,KAAK,GAAGK,EAAEF,EAAER,EAAEC,EAAE,MAAMW,EAAE,CAAC,CAAC,EAAE,MAAM,GAAG,OAAOT,CAAC,CAACD,EAAEG,EAAE,IAAI,CAAC,GAAG,CAACA,EAAE,QAAQ,MAAMA,EAAE,OAAOF,EAAE,GAAG,CAAC,OAAOE,EAAE,SAASL,EAAE,KAAKE,CAAC,EAAEC,CAAC,CAAC,SAASC,EAAEL,EAAE,CAAC,GAAG,CAAC,KAAKC,EAAE,SAASC,CAAC,EAAEF,EAAEG,EAAEF,EAAE,GAAGC,CAAC,EAAE,OAAO,OAAO,OAAOC,EAAE,CAAC,SAASF,EAAE,QAAQ,GAAG,MAAM,EAAE,MAAM,CAAE,CAAA,CAAC,CAAC,CAAC,SAASM,EAAEP,EAAE,CAAC,OAAO,OAAOA,GAAG,UAAU,OAAOA,GAAG,UAAUA,IAAI,MAAM,OAAO,YAAYA,CAAC","x_google_ignoreList":[0,1]}

View file

@ -1,2 +0,0 @@
const t="aria-selected",T="hidden",a=".compte-panier a[rel='cart']",s="#selecteur-variation",_="#bouton-ajout-panier",E="wp-json",c=`/${E}/wc/store/cart`,o=`/${E}/wc/store/cart/add-item`;export{t as A,o as R,a as S,s as a,_ as b,T as c,c as d};
//# sourceMappingURL=constantes.js.map

View file

@ -1 +0,0 @@
{"version":3,"file":"constantes.js","sources":["../../src/scripts/lib/constantes.ts"],"sourcesContent":["export const ATTRIBUT_ARIA_SELECTED = \"aria-selected\";\nexport const ATTRIBUT_ARIA_HIDDEN = \"aria-hidden\";\nexport const ATTRIBUT_HIDDEN = \"hidden\";\n\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\";\n\nexport const CHEMIN_API_REST = \"wp-json\";\nexport const ROUTE_API_PANIER = `/${CHEMIN_API_REST}/wc/store/cart`;\nexport const ROUTE_API_AJOUTE_ARTICLE_PANIER = `/${CHEMIN_API_REST}/wc/store/cart/add-item`;\n"],"names":["ATTRIBUT_ARIA_SELECTED","ATTRIBUT_HIDDEN","SELECTEUR_BOUTON_PANIER","SELECTEUR_SELECTEUR_QUANTITE","SELECTEUR_BOUTON_AJOUT_PANIER","CHEMIN_API_REST","ROUTE_API_PANIER","ROUTE_API_AJOUTE_ARTICLE_PANIER"],"mappings":"AAAO,MAAMA,EAAyB,gBAEzBC,EAAkB,SAElBC,EAA0B,+BAC1BC,EAA+B,uBAC/BC,EAAgC,uBAEhCC,EAAkB,UAClBC,EAAmB,IAAID,CAAe,iBACtCE,EAAkC,IAAIF,CAAe"}

View file

@ -1,2 +1,2 @@
import{c as u,E as c,a as h}from"./erreurs.js";import{E as p,r as y,l as E}from"./Either.js";var x={done:!1,hasNext:!1};function S(e,...r){let t=e,l=r.map(i=>"lazy"in i?A(i):void 0),n=0;for(;n<r.length;){if(l[n]===void 0||!d(t)){let a=r[n];t=a(t),n+=1;continue}let i=[];for(let a=n;a<r.length;a++){let o=l[a];if(o===void 0||(i.push(o),o.isSingle))break}let s=[];for(let a of t)if(g(a,s,i))break;let{isSingle:f}=i.at(-1);t=f?s[0]:s,n+=i.length}return t}function g(e,r,t){if(t.length===0)return r.push(e),!1;let l=e,n=x,i=!1;for(let[s,f]of t.entries()){let{index:a,items:o}=f;if(o.push(l),n=f(l,a,o),f.index+=1,n.hasNext){if(n.hasMany??!1){for(let m of n.next)if(g(m,r,t.slice(s+1)))return!0;return i}l=n.next}if(!n.hasNext)break;n.done&&(i=!0)}return n.hasNext&&r.push(l),i}function A(e){let{lazy:r,lazyArgs:t}=e,l=r(...t);return Object.assign(l,{isSingle:r.single??!1,index:0,items:[]})}function d(e){return typeof e=="string"||typeof e=="object"&&e!==null&&Symbol.iterator in e}function N(e){return e!==null}function b(e){return e===void 0?!0:typeof e=="string"||Array.isArray(e)?e.length===0:Object.keys(e).length===0}const _=e=>r=>p.encase(()=>e.querySelector(r)).mapLeft(t=>u(c(r))).chain(t=>N(t)?y(t):E(u(h(r)))),k=e=>r=>p.encase(()=>S(e.querySelectorAll(r),Array.from)).mapLeft(t=>u(c(r))).chain(t=>b(t)?E(u(h(r))):y(t));export{k as a,_ as r};
const E="aria-selected",T="hidden",a="data-contient-articles",t="disabled",s=".compte-panier a[rel='cart']",e="#selecteur-variation",o="#bouton-ajout-panier",n="a[role='tab']",c="section[role='tabpanel']";export{E as A,s as S,o as a,e as b,n as c,c as d,T as e,t as f,a as g};
//# sourceMappingURL=dom.js.map

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,2 @@
import{x as m}from"./chunk-7BKSRZNG.js";import{c as n,r as a,E as c,a as o}from"./erreurs.js";import{E as s,r as E,l as i}from"./Either.js";import"./exports.js";function p(e){return e!==null}function l(e){return e===void 0?!0:typeof e=="string"||Array.isArray(e)?e.length===0:Object.keys(e).length===0}const f=e=>e,R=e=>r=>s.encase(()=>e.querySelector(r)).mapLeft(t=>n(c(r))).chain(t=>p(t)?E(t):i(n(o(r)))),h=e=>r=>s.encase(()=>m(e.querySelectorAll(r),Array.from)).mapLeft(t=>n(c(r))).chain(t=>l(t)?i(n(o(r))):E(t)),S=e=>e.caseOf({Left:a,Right:f}),g=e=>e.caseOf({Left:a,Right:f});export{g as a,h as b,R as c,S as r};
//# sourceMappingURL=dom2.js.map

File diff suppressed because one or more lines are too long

View file

@ -1,2 +1,2 @@
const r=e=>`Le selecteur "${e}" est invalide`,E=e=>`La requête "${e}" n'a retourné aucun Élément.`,t=e=>new SyntaxError(e),n=e=>{throw e};export{r as E,E as a,t as c,n as l};
import{c as r}from"./exports.js";const E=e=>`Le selecteur "${e}" est invalide`,a=e=>`La requête "${e}" n'a retourné aucun Élément.`,n=e=>new SyntaxError(e),o=e=>{throw r(e),e};export{E,a,n as c,o as r};
//# sourceMappingURL=erreurs.js.map

View file

@ -1 +1 @@
{"version":3,"file":"erreurs.js","sources":["../../src/scripts/lib/erreurs.ts"],"sourcesContent":["/**\n * Fonctions pour la création d'Erreurs.\n */\n\n/* Messages d'erreur */\nexport const ERREUR_SYNTAXE_INVALIDE: (selecteur: string) => string = (selecteur) =>\n `Le selecteur \"${selecteur}\" est invalide`;\nexport const ERREUR_SELECTEUR_INEXISTANT: (selecteur: string) => string = (selecteur) =>\n `La requête \"${selecteur}\" n'a retourné aucun Élément.`;\n\n/* Création d'erreurs */\nexport const creeSyntaxError: (message: string) => SyntaxError = (message) => new SyntaxError(message);\n\nexport const leveErreur: (erreur: Error) => never = (erreur) => {\n throw erreur;\n};\n"],"names":["ERREUR_SYNTAXE_INVALIDE","selecteur","ERREUR_SELECTEUR_INEXISTANT","creeSyntaxError","message","leveErreur","erreur"],"mappings":"AAKO,MAAMA,EAA0DC,GACrE,iBAAiBA,CAAS,iBACfC,EAA8DD,GACzE,eAAeA,CAAS,gCAGbE,EAAqDC,GAAY,IAAI,YAAYA,CAAO,EAExFC,EAAwCC,GAAW,CACxD,MAAAA,CACR"}
{"version":3,"file":"erreurs.js","sources":["../../src/scripts/lib/erreurs.ts"],"sourcesContent":["/**\n * Fonctions pour la création d'Erreurs.\n */\n\nimport { captureException } from \"@sentry/browser\";\n\n/* Messages d'erreur */\nexport const ERREUR_SYNTAXE_INVALIDE: (selecteur: string) => string = (selecteur) =>\n `Le selecteur \"${selecteur}\" est invalide`;\nexport const ERREUR_SELECTEUR_INEXISTANT: (selecteur: string) => string = (selecteur) =>\n `La requête \"${selecteur}\" n'a retourné aucun Élément.`;\n\n/* Création d'erreurs */\nexport const creeSyntaxError: (message: string) => SyntaxError = (message) => new SyntaxError(message);\n\n/* Fonction utilitaire pour lever une Error */\nexport const leveErreur = (erreur: Error): never => {\n throw erreur;\n};\n\n/* eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- Permet d'indiquer\n le type d'Erreur à l'appel de la fonction. */\nexport const reporteEtLeveErreur = <E extends Error>(erreur: E): never => {\n captureException(erreur);\n throw erreur;\n};\n"],"names":["ERREUR_SYNTAXE_INVALIDE","selecteur","ERREUR_SELECTEUR_INEXISTANT","creeSyntaxError","message","reporteEtLeveErreur","erreur","captureException"],"mappings":"iCAOO,MAAMA,EAA0DC,GACrE,iBAAiBA,CAAS,iBACfC,EAA8DD,GACzE,eAAeA,CAAS,gCAGbE,EAAqDC,GAAY,IAAI,YAAYA,CAAO,EASxFC,EAAwCC,GAAqB,CACxE,MAAAC,EAAiBD,CAAM,EACjBA,CACR"}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,2 @@
const n=e=>t=>t instanceof e,s=n(HTMLSelectElement);export{s as e};
//# sourceMappingURL=gardes.js.map

View file

@ -0,0 +1 @@
{"version":3,"file":"gardes.js","sources":["../../src/scripts/lib/gardes.ts"],"sourcesContent":["type Constructor<T> = new(...args: unknown[]) => T;\n\nconst estElement = <T extends HTMLElement>(typeElement: Constructor<T>) => (element: unknown): element is T =>\n element instanceof typeElement;\n\nexport const estHTMLSelectElement = estElement<HTMLSelectElement>(HTMLSelectElement);\n"],"names":["estElement","typeElement","element","estHTMLSelectElement"],"mappings":"AAEA,MAAMA,EAAqCC,GAAiCC,GAC1EA,aAAmBD,EAERE,EAAuBH,EAA8B,iBAAiB"}

View file

@ -1,2 +1,2 @@
import{d as g}from"./constantes.js";import{E as h,r as o,l as f,M,n as u,j as c}from"./Either.js";var l;const y={liftEither(i){if(i.isRight())return Promise.resolve(i.extract());throw i.extract()},fromPromise(i){return i.then(y.liftEither)},throwE(i){throw i}};class m{constructor(t){this.runPromise=t,this[l]="EitherAsync",this["fantasy-land/chain"]=this.chain,this["fantasy-land/alt"]=this.alt,this.then=(r,e)=>this.run().then(r,e)}leftOrDefault(t){return this.run().then(r=>r.leftOrDefault(t))}orDefault(t){return this.run().then(r=>r.orDefault(t))}join(){return n(async t=>{const r=await this;if(r.isRight()){const e=await r.extract();return t.liftEither(e)}return t.liftEither(r)})}ap(t){return n(async r=>{const e=await t;if(e.isRight()){const a=await this.run();return a.isRight()?e.extract()(a.extract()):r.liftEither(a)}return r.liftEither(e)})}alt(t){return n(async r=>{const e=await this.run();if(e.isRight())return e.extract();{const a=await t;return r.liftEither(a)}})}extend(t){return n(async r=>{const e=await this.run();if(e.isRight()){const a=n.liftEither(e);return r.liftEither(o(t(a)))}return r.liftEither(e)})}async run(){try{return o(await this.runPromise(y))}catch(t){return f(t)}}bimap(t,r){return n(async e=>{const a=await this.run();try{return await e.liftEither(a.bimap(t,r))}catch(P){throw await P}})}map(t){return n(r=>this.runPromise(r).then(t))}mapLeft(t){return n(async r=>{try{return await this.runPromise(r)}catch(e){throw await t(e)}})}chain(t){return n(async r=>{const e=await this.runPromise(r);return r.fromPromise(t(e))})}chainLeft(t){return n(async r=>{try{return await this.runPromise(r)}catch(e){return r.fromPromise(t(e))}})}toMaybeAsync(){return s(async({liftMaybe:t})=>{const r=await this.run();return t(r.toMaybe())})}swap(){return n(async t=>{const r=await this.run();return r.isRight()&&t.throwE(r.extract()),t.liftEither(o(r.extract()))})}ifLeft(t){return n(async r=>{const e=await this.run();return e.ifLeft(t),r.liftEither(e)})}ifRight(t){return n(async r=>{const e=await this.run();return e.ifRight(t),r.liftEither(e)})}void(){return this.map(t=>{})}caseOf(t){return this.run().then(r=>r.caseOf(t))}finally(t){return n(({fromPromise:r})=>r(this.run().finally(t)))}}l=Symbol.toStringTag;const n=Object.assign(i=>new m(i),{fromPromise:i=>n(({fromPromise:t})=>t(i())),liftEither:i=>n(({liftEither:t})=>t(i)),lefts:i=>Promise.all(i.map(t=>t.run())).then(h.lefts),rights:i=>Promise.all(i.map(t=>t.run())).then(h.rights),sequence:i=>n(async t=>{let r=[];for await(const e of i){if(e.isLeft())return t.liftEither(e);r.push(e.extract())}return t.liftEither(o(r))}),all:i=>n.fromPromise(async()=>Promise.all(i).then(h.sequence))});m.prototype.constructor=n;var w;const b={liftMaybe(i){if(i.isJust())return Promise.resolve(i.extract());throw u},fromPromise(i){return i.then(b.liftMaybe)}};class E{constructor(t){this.runPromise=t,this[w]="MaybeAsync",this["fantasy-land/chain"]=this.chain,this["fantasy-land/filter"]=this.filter,this["fantasy-land/alt"]=this.alt}orDefault(t){return this.run().then(r=>r.orDefault(t))}join(){return s(async t=>{const r=await this.run();if(r.isJust()){const e=await r.extract();return t.liftMaybe(e)}return t.liftMaybe(u)})}ap(t){return s(async r=>{const e=await t;if(e.isJust()){const a=await this.run();return a.isJust()?e.extract()(a.extract()):r.liftMaybe(u)}return r.liftMaybe(u)})}alt(t){return s(async r=>{const e=await this.run();if(e.isJust())return e.extract();{const a=await t;return r.liftMaybe(a)}})}extend(t){return s(async r=>{const e=await this.run();if(e.isJust()){const a=s.liftMaybe(e);return r.liftMaybe(c(t(a)))}return r.liftMaybe(u)})}filter(t){return s(async r=>{const e=await this.run();return r.liftMaybe(e.filter(t))})}async run(){try{return c(await this.runPromise(b))}catch{return u}}map(t){return s(r=>this.runPromise(r).then(t))}chain(t){return s(async r=>{const e=await this.runPromise(r);return r.fromPromise(t(e))})}toEitherAsync(t){return n(async({liftEither:r})=>{const e=await this.run();return r(e.toEither(t))})}ifJust(t){return s(async r=>{const e=await this.run();return e.ifJust(t),r.liftMaybe(e)})}ifNothing(t){return s(async r=>{const e=await this.run();return e.ifNothing(t),r.liftMaybe(e)})}void(){return this.map(t=>{})}caseOf(t){return this.run().then(r=>r.caseOf(t))}finally(t){return s(({fromPromise:r})=>r(this.run().finally(t)))}then(t,r){return this.run().then(t,r)}}w=Symbol.toStringTag;const s=Object.assign(i=>new E(i),{catMaybes:i=>Promise.all(i).then(M.catMaybes),fromPromise:i=>s(({fromPromise:t})=>t(i())),liftMaybe:i=>s(({liftMaybe:t})=>t(i))});E.prototype.constructor=s;const p=_etats,d=()=>fetch(g,{credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json","X-WC-Store-API-Nonce":p.nonce},method:"GET",mode:"same-origin",signal:AbortSignal.timeout(5e3)}).then(o).catch(f);n.fromPromise(d).map(i=>i.json()).ifLeft(i=>console.error(i));
import{a as g,E as M}from"./api.js";import{E as h,r as o,l as f,M as p,n as u,j as c}from"./Either.js";var l;const y={liftEither(i){if(i.isRight())return Promise.resolve(i.extract());throw i.extract()},fromPromise(i){return i.then(y.liftEither)},throwE(i){throw i}};class m{constructor(t){this.runPromise=t,this[l]="EitherAsync",this["fantasy-land/chain"]=this.chain,this["fantasy-land/alt"]=this.alt,this.then=(r,e)=>this.run().then(r,e)}leftOrDefault(t){return this.run().then(r=>r.leftOrDefault(t))}orDefault(t){return this.run().then(r=>r.orDefault(t))}join(){return n(async t=>{const r=await this;if(r.isRight()){const e=await r.extract();return t.liftEither(e)}return t.liftEither(r)})}ap(t){return n(async r=>{const e=await t;if(e.isRight()){const a=await this.run();return a.isRight()?e.extract()(a.extract()):r.liftEither(a)}return r.liftEither(e)})}alt(t){return n(async r=>{const e=await this.run();if(e.isRight())return e.extract();{const a=await t;return r.liftEither(a)}})}extend(t){return n(async r=>{const e=await this.run();if(e.isRight()){const a=n.liftEither(e);return r.liftEither(o(t(a)))}return r.liftEither(e)})}async run(){try{return o(await this.runPromise(y))}catch(t){return f(t)}}bimap(t,r){return n(async e=>{const a=await this.run();try{return await e.liftEither(a.bimap(t,r))}catch(P){throw await P}})}map(t){return n(r=>this.runPromise(r).then(t))}mapLeft(t){return n(async r=>{try{return await this.runPromise(r)}catch(e){throw await t(e)}})}chain(t){return n(async r=>{const e=await this.runPromise(r);return r.fromPromise(t(e))})}chainLeft(t){return n(async r=>{try{return await this.runPromise(r)}catch(e){return r.fromPromise(t(e))}})}toMaybeAsync(){return s(async({liftMaybe:t})=>{const r=await this.run();return t(r.toMaybe())})}swap(){return n(async t=>{const r=await this.run();return r.isRight()&&t.throwE(r.extract()),t.liftEither(o(r.extract()))})}ifLeft(t){return n(async r=>{const e=await this.run();return e.ifLeft(t),r.liftEither(e)})}ifRight(t){return n(async r=>{const e=await this.run();return e.ifRight(t),r.liftEither(e)})}void(){return this.map(t=>{})}caseOf(t){return this.run().then(r=>r.caseOf(t))}finally(t){return n(({fromPromise:r})=>r(this.run().finally(t)))}}l=Symbol.toStringTag;const n=Object.assign(i=>new m(i),{fromPromise:i=>n(({fromPromise:t})=>t(i())),liftEither:i=>n(({liftEither:t})=>t(i)),lefts:i=>Promise.all(i.map(t=>t.run())).then(h.lefts),rights:i=>Promise.all(i.map(t=>t.run())).then(h.rights),sequence:i=>n(async t=>{let r=[];for await(const e of i){if(e.isLeft())return t.liftEither(e);r.push(e.extract())}return t.liftEither(o(r))}),all:i=>n.fromPromise(async()=>Promise.all(i).then(h.sequence))});m.prototype.constructor=n;var w;const E={liftMaybe(i){if(i.isJust())return Promise.resolve(i.extract());throw u},fromPromise(i){return i.then(E.liftMaybe)}};class b{constructor(t){this.runPromise=t,this[w]="MaybeAsync",this["fantasy-land/chain"]=this.chain,this["fantasy-land/filter"]=this.filter,this["fantasy-land/alt"]=this.alt}orDefault(t){return this.run().then(r=>r.orDefault(t))}join(){return s(async t=>{const r=await this.run();if(r.isJust()){const e=await r.extract();return t.liftMaybe(e)}return t.liftMaybe(u)})}ap(t){return s(async r=>{const e=await t;if(e.isJust()){const a=await this.run();return a.isJust()?e.extract()(a.extract()):r.liftMaybe(u)}return r.liftMaybe(u)})}alt(t){return s(async r=>{const e=await this.run();if(e.isJust())return e.extract();{const a=await t;return r.liftMaybe(a)}})}extend(t){return s(async r=>{const e=await this.run();if(e.isJust()){const a=s.liftMaybe(e);return r.liftMaybe(c(t(a)))}return r.liftMaybe(u)})}filter(t){return s(async r=>{const e=await this.run();return r.liftMaybe(e.filter(t))})}async run(){try{return c(await this.runPromise(E))}catch{return u}}map(t){return s(r=>this.runPromise(r).then(t))}chain(t){return s(async r=>{const e=await this.runPromise(r);return r.fromPromise(t(e))})}toEitherAsync(t){return n(async({liftEither:r})=>{const e=await this.run();return r(e.toEither(t))})}ifJust(t){return s(async r=>{const e=await this.run();return e.ifJust(t),r.liftMaybe(e)})}ifNothing(t){return s(async r=>{const e=await this.run();return e.ifNothing(t),r.liftMaybe(e)})}void(){return this.map(t=>{})}caseOf(t){return this.run().then(r=>r.caseOf(t))}finally(t){return s(({fromPromise:r})=>r(this.run().finally(t)))}then(t,r){return this.run().then(t,r)}}w=Symbol.toStringTag;const s=Object.assign(i=>new b(i),{catMaybes:i=>Promise.all(i).then(p.catMaybes),fromPromise:i=>s(({fromPromise:t})=>t(i())),liftMaybe:i=>s(({liftMaybe:t})=>t(i))});b.prototype.constructor=s;const x=_etats,d=()=>fetch(g,{credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json",[M]:x.nonce},method:"GET",mode:"same-origin",signal:AbortSignal.timeout(5e3)}).then(o).catch(f);n.fromPromise(d).map(i=>i.json()).ifLeft(i=>{console.error(i)});
//# sourceMappingURL=gestion-panier.js.map

File diff suppressed because one or more lines are too long

View file

@ -1,2 +1,2 @@
import{S as p,a as T,b as g,A as E,c as m,R as L}from"./constantes.js";import{l as a}from"./erreurs.js";import{r as d,a as f}from"./utils.js";import{W as O}from"./cart-add-item.js";import{E as h}from"./Either.js";import"./dom.js";const c=n=>n,A=_etats,R=n=>{n.forEach(t=>{t[0].setAttribute(E,"false"),t[1].setAttribute(m,"true")})},I=d(p),_=()=>{const n=f("a[role='tab']").caseOf({Left:a,Right:c}),t=f("section[role='tabpanel']").caseOf({Left:a,Right:c}),o=d(T).caseOf({Left:a,Right:c}),r=d(g).caseOf({Left:a,Right:c}),s=new Map;n.forEach((e,u)=>{const i=e.getAttribute("id"),l=t[u];if(!i)throw new Error("Le lien ne dispose pas d'ID !");if(!l)throw new Error("Le lien ne dispose pas de section correspondante !");s.set(i,[e,l])}),Array.from(s.values()).forEach(e=>{e[0].addEventListener("click",u=>{u.preventDefault();const i=e[0].getAttribute(E)==="true";R(Array.from(s.values())),!i&&(e[0].setAttribute(E,"true"),e[1].removeAttribute(m))})}),o.addEventListener("change",e=>{console.debug(o.value,e)}),r.addEventListener("click",e=>{e.preventDefault(),b()}),console.debug(s)},b=()=>{const n={quantity:1,id:A.idProduit};h.encase(()=>O(n)).ifLeft(t=>console.error(t)).map(t=>{fetch(L,{body:JSON.stringify(t),credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json","X-WC-Store-API-Nonce":A.nonce},method:"POST",mode:"same-origin",signal:AbortSignal.timeout(5e3)}).then(o=>o.json()).then(o=>{I.caseOf({Left:r=>console.error("Le bouton du Panier n'existe pas !",r),Right:r=>{console.debug(r),r.textContent=`cart ${o.items.length}`}})}).catch(o=>console.error(o))})};document.addEventListener("DOMContentLoaded",()=>{_()});
import{x as r}from"./chunk-7BKSRZNG.js";import{R as S,E as C}from"./api.js";import{S as O,a as I,b as f,c as L,d as g,A as a,e as m,f as u,g as R}from"./dom.js";import{r as T,a as p}from"./dom2.js";import{r as U}from"./erreurs.js";import{e as v}from"./gardes.js";import{r as c,a as _}from"./utils.js";import{W as h}from"./cart-add-item.js";import{M as b,E as P}from"./Either.js";import"./exports.js";const d=_etats,B=o=>{o.forEach(t=>{t[0].setAttribute(a,"false"),t[1].setAttribute(m,"true")})},A=r(c(O),T),s=r(c(I),T),E=r(c(f),T),D=r(_(L),p),y=r(_(g),p),w=()=>{const o=new Map;D.forEach((t,e)=>{const n=t.getAttribute("id"),i=y[e];if(!n)throw new Error("Le lien ne dispose pas d'ID !");if(!i)throw new Error("Le lien ne dispose pas de section correspondante !");o.set(n,[t,i]),t.addEventListener("click",l=>{l.preventDefault();const N=t.getAttribute(a)==="true";B(r(o.values(),Array.from)),!N&&(t.setAttribute(a,"true"),i.removeAttribute(m))})}),E.addEventListener("change",t=>{r(t.target,b.fromNullable,e=>e.filter(v),e=>e.map(n=>n.validity.valid),e=>e.ifJust(n=>s.toggleAttribute(u,!n)))}),s.addEventListener("click",t=>x())},x=()=>{const o={id:d.idProduit,quantity:1};s.textContent="Adding...",P.encase(()=>h(o)).ifLeft(t=>console.error(t)).map(t=>{fetch(S,{body:JSON.stringify(t),credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json",[C]:d.nonce},method:"POST",mode:"same-origin",signal:AbortSignal.timeout(5e3)}).then(e=>e.json()).then(e=>{A.textContent=`cart (${e.items.length})`,A.setAttribute(R,String(e.items.length>0)),s.textContent="Added to cart!",setTimeout(()=>{E.value=E.options.item(0)?.value??"--",s.textContent="Add to cart",s.toggleAttribute(u,!0)},3e3)}).catch(U)})};document.addEventListener("DOMContentLoaded",()=>{w()});
//# sourceMappingURL=scripts-page-produit.js.map

File diff suppressed because one or more lines are too long

View file

@ -1,2 +1,2 @@
import{r as e,a as r}from"./dom.js";import"./erreurs.js";import"./Either.js";const o=r(document),n=e(document);export{o as a,n as r};
import{b as e,c as r}from"./dom2.js";import"./chunk-7BKSRZNG.js";import"./erreurs.js";import"./exports.js";import"./Either.js";const p=e(document),u=r(document);export{p as a,u as r};
//# sourceMappingURL=utils.js.map

View file

@ -1 +1 @@
{"version":3,"file":"utils.js","sources":["../../src/scripts/lib/utils.ts"],"sourcesContent":["import type { Either } from \"purify-ts\";\nimport { recupereElementAvecSelecteur, recupereElementsAvecSelecteur } from \"./dom\";\n\nexport const recupereElementsDocument: (selecteur: string) => Either<SyntaxError, Element[]> =\n recupereElementsAvecSelecteur(document);\n\nexport const recupereElementDocument: <E extends Element = Element>(selecteur: string) => Either<SyntaxError, E> =\n recupereElementAvecSelecteur(document);\n"],"names":["recupereElementAvecSelecteur","recupereElementsAvecSelecteur","recupereElementsDocument","recupereElementDocument"],"mappings":"AAGa,OAAA,KAAAA,EAAA,KAAAC,MAAA,WAAA,MAAA,eAAA,MAAA,cAAA,MAAAC,EACXD,EAA8B,QAAQ,EAE3BE,EACXH,EAA6B,QAAQ"}
{"version":3,"file":"utils.js","sources":["../../src/scripts/lib/utils.ts"],"sourcesContent":["import type { Either } from \"purify-ts\";\n\nimport { recupereElementAvecSelecteur, recupereElementsAvecSelecteur } from \"./dom\";\n\nexport const recupereElementsDocument: <E extends Element = Element>(\n selecteur: string,\n) => Either<SyntaxError, Array<E>> = recupereElementsAvecSelecteur(document);\n\nexport const recupereElementDocument: <E extends Element = Element>(selecteur: string) => Either<SyntaxError, E> =\n recupereElementAvecSelecteur(document);\n"],"names":["recupereElementsAvecSelecteur","recupereElementAvecSelecteur","recupereElementsDocument","recupereElementDocument"],"mappings":"AAIa,OAAA,KAAAA,EAAA,KAAAC,MAAA,YAAA,MAAA,sBAAA,MAAA,eAAA,MAAA,eAAA,MAAA,cAAA,MAAAC,EAEwBF,EAA8B,QAAQ,EAE9DG,EACXF,EAA6B,QAAQ"}

View file

@ -1 +0,0 @@
//# sourceMappingURL=vite.env.d.js.map

View file

@ -1 +0,0 @@
{"version":3,"file":"vite.env.d.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}

View file

@ -22,14 +22,25 @@ Timber::init();
// Sélectionne le répertoire contenant les modèles Twig
Timber::$dirname = ["views"];
// Charge les Scripts du thème (report d'erreurs)
function charge_scripts_haiku_atelier_2024(): void {
wp_enqueue_script_module(
id: "haiku-atelier-2024-gaffe",
deps: [],
src: get_template_directory_uri() . "/assets/js/gaffe.js",
version: filemtime(get_template_directory() . "/assets/js/gaffe.js"),
);
}
add_action("wp_enqueue_scripts", "charge_scripts_haiku_atelier_2024");
// Charge les styles du thème
function charge_styles_haiku_atelier_2024() {
function charge_styles_haiku_atelier_2024(): void {
wp_enqueue_style(
$handle = "haiku-atelier-2024-styles",
$src = get_template_directory_uri() . "/assets/css/main.css",
$deps = [],
$ver = filemtime(get_template_directory() . "/assets/css/main.min.css"),
$media = false,
handle: "haiku-atelier-2024-styles",
src: get_template_directory_uri() . "/assets/css/main.css",
deps: [],
ver: filemtime(get_template_directory() . "/assets/css/main.min.css"),
media: false,
);
}
add_action("wp_enqueue_scripts", "charge_styles_haiku_atelier_2024");

View file

@ -97,7 +97,7 @@ class StarterSite extends Site {
// Récupère le Panier de l'Utilisateur
$panier = WC()->cart->get_cart();
$quantite_articles = sizeof($panier);
$articles_presents = $quantite_articles > 0 ? "oui" : "non";
$articles_presents = $quantite_articles > 0 ? "true" : "false";
$context["panier"] = $panier;
$context["quantite_articles"] = $quantite_articles;

View file

@ -1 +0,0 @@
import "./sass/main";

View file

@ -235,8 +235,10 @@
.actions-produit {
overflow: hidden;
background: var(--couleur-jaune);
transition: 0.2s background;
&.desactive {
/* Indique que le Bouton est désactivé en utilisant un fond gris */
&:has(button[disabled]) {
background: rgb(236 234 235 / 90%);
}
@ -247,7 +249,8 @@
letter-spacing: 1px;
transition: 0.2s font-variation-settings;
:not([disabled]) {
/* Change la casse de la police au survol quand le Bouton n'est pas désactivé */
&:not([disabled]) {
@media (hover: hover) {
&:hover {
font-variation-settings: "wght" 500;

View file

@ -0,0 +1,9 @@
// Chemins et Routes pour l'API WordPress
export const CHEMIN_API_REST = "wp-json";
export const ROUTE_API_PANIER = `/${CHEMIN_API_REST}/wc/store/cart`;
export const ROUTE_API_AJOUTE_ARTICLE_PANIER = `/${CHEMIN_API_REST}/wc/store/cart/add-item`;
// En-têtes
export const ENTETE_WC_NONCE = "Nonce";
export const ENTETE_GLITCHTIP_RETRY_AFTER = "retry-after";
export const ENTETE_GLITCHTIP_RATE_LIMITS = "x-sentry-rate-limits";

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_CONTIENT_ARTICLES = "data-contient-articles";
export const ATTRIBUT_DESACTIVE = "disabled";
export const SELECTEUR_BOUTON_PANIER = ".compte-panier a[rel='cart']";
export const SELECTEUR_SELECTEUR_QUANTITE = "#selecteur-variation";
export const SELECTEUR_BOUTON_AJOUT_PANIER = "#bouton-ajout-panier";
export const CHEMIN_API_REST = "wp-json";
export const ROUTE_API_PANIER = `/${CHEMIN_API_REST}/wc/store/cart`;
export const ROUTE_API_AJOUTE_ARTICLE_PANIER = `/${CHEMIN_API_REST}/wc/store/cart/add-item`;
export const SELECTEUR_LIENS_ONGLETS = "a[role='tab']";
export const SELECTEUR_SECTIONS_CONTENUS = "section[role='tabpanel']";

View file

@ -2,6 +2,8 @@
* Initialise GlitchTip.
*/
import type { Transport, TransportMakeRequestResponse, TransportRequest } from "@sentry/types";
import {
breadcrumbsIntegration,
BrowserClient,
@ -14,30 +16,37 @@ import {
httpContextIntegration,
linkedErrorsIntegration,
} from "@sentry/browser";
import type { Transport } from "@sentry/types";
import { pipe } from "remeda";
const makeFetchTransport = (options): Transport => {
const makeRequest = async (request) => {
const requestOptions: RequestInit = {
import type { BrowserTransportOptions } from "./types/sentry";
import { ENTETE_GLITCHTIP_RATE_LIMITS, ENTETE_GLITCHTIP_RETRY_AFTER } from "./constantes/api";
/* Créé la fonction génératrice de la requête auprès de GlitchTip */
const creeTransportFetch = (options: BrowserTransportOptions): Transport => {
const creeRequete = async (request: TransportRequest): Promise<TransportMakeRequestResponse> => {
const optionsRequete: RequestInit = {
body: request.body,
headers: options.headers,
headers: options.headers ?? {},
method: "POST",
mode: "no-cors",
referrerPolicy: "no-referrer",
...options.fetchOptions,
};
const response = await fetch(options.url, requestOptions);
return ({
headers: {
"x-sentry-rate-limits": response.headers.get("X-Sentry-Rate-Limits"),
"retry-after": response.headers.get("Retry-After"),
},
statusCode: response.status,
});
return pipe(
await fetch(options.url, optionsRequete),
(reponse: Response) => ({
headers: {
[ENTETE_GLITCHTIP_RATE_LIMITS]: reponse.headers.get(ENTETE_GLITCHTIP_RATE_LIMITS),
[ENTETE_GLITCHTIP_RETRY_AFTER]: reponse.headers.get(ENTETE_GLITCHTIP_RETRY_AFTER),
},
statusCode: reponse.status,
}),
);
};
return createTransport(options, makeRequest);
return createTransport(options, creeRequete);
};
/* Créé la configuration Sentry */
@ -54,14 +63,9 @@ const client = new BrowserClient({
],
stackParser: defaultStackParser,
tracesSampleRate: 0.01,
transport: makeFetchTransport,
transport: creeTransportFetch,
});
/* Initialise la configuration */
getCurrentScope().setClient(client);
client.init();
/* TODO: Retirer une fois les tests réalisés */
setTimeout(() => {
throw new Error("Test GlitchTip !");
}, 3000);

View file

@ -1,6 +1,7 @@
import { Right } from "purify-ts";
import wretch from "wretch";
import { ROUTE_API_PANIER } from "./constantes";
import { ROUTE_API_PANIER } from "../constantes/api";
export const get = async (
url: string,
@ -16,8 +17,8 @@ export const post = async (
input: Record<string, string>,
) => {
return fetch(url, {
method: "POST",
body: JSON.stringify(input),
method: "POST",
});
};
@ -25,8 +26,8 @@ type CreateAPIMethod = <
Input extends Record<string, string>,
Output,
>(opts: {
url: string;
method: "GET" | "POST";
url: string;
}) => (input: Input) => Promise<Output>;
const createAPIMethod: CreateAPIMethod = (opts) => (input) => {

View file

@ -1,9 +1,9 @@
import { Either, Left, Right } from "purify-ts";
import { isEmpty, isNonNull, isNullish, pipe } from "remeda";
import { creeSyntaxError, ERREUR_SELECTEUR_INEXISTANT, ERREUR_SYNTAXE_INVALIDE } from "./erreurs";
import { Either, identity, Left, Right } from "purify-ts";
import { isEmpty, isNonNull, pipe } from "remeda";
/** Type union des parents possible pour un `querySelector`. */
type ElementParent = Document | Element;
import type { ElementParent } from "../types/dom";
import { creeSyntaxError, ERREUR_SELECTEUR_INEXISTANT, ERREUR_SYNTAXE_INVALIDE, reporteEtLeveErreur } from "./erreurs";
/**
* @param parent L'Élément parent dans lequel l'Élément souhaité sera recherché.
@ -25,9 +25,9 @@ export const safeQuerySelector: (parent: ElementParent) => (selecteur: string) =
*
* @returns Un tableau pouvant être vide d'Éléments.
*/
export const safeQuerySelectorAll: (parent: ElementParent) => (selecteur: string) => Element[] =
export const safeQuerySelectorAll: (parent: ElementParent) => (selecteur: string) => Array<Element> =
(parent) => (selecteur) => {
const elements: Element[] = Array.from(parent.querySelectorAll(selecteur));
const elements: Array<Element> = Array.from(parent.querySelectorAll(selecteur));
if (isEmpty(elements)) {
throw new DOMException(ERREUR_SELECTEUR_INEXISTANT(selecteur));
@ -35,9 +35,6 @@ export const safeQuerySelectorAll: (parent: ElementParent) => (selecteur: string
return elements;
};
// export const recupereElementAvecSelecteur: (
// parent: ElementParent,
// ) => <T extends Element = Element>(selecteur: string) => Either<SyntaxError, T> = (parent) => (selecteur) =>
export const recupereElementAvecSelecteur =
(parent: ElementParent) => <E extends Element = Element>(selecteur: string): Either<SyntaxError, E> =>
Either
@ -48,16 +45,15 @@ export const recupereElementAvecSelecteur =
// Retourne une SyntaxError si l'Élément est null
.chain((e: E | null) => isNonNull(e) ? Right(e) : Left(creeSyntaxError(ERREUR_SELECTEUR_INEXISTANT(selecteur))));
export const recupereElementsAvecSelecteur: (
parent: ElementParent,
) => (selecteur: string) => Either<SyntaxError, Element[]> = (parent) => (selecteur) =>
Either
// Retourne une SyntaxError dans un Left si le sélecteur est invalide
.encase(() => pipe(parent.querySelectorAll(selecteur), Array.from<Element>))
// Transforme le Left en une erreur plus sympathique
.mapLeft(_ => creeSyntaxError(ERREUR_SYNTAXE_INVALIDE(selecteur)))
// Retourne une SyntaxError si le tableau est vide
.chain(e => isEmpty(e) ? Left(creeSyntaxError(ERREUR_SELECTEUR_INEXISTANT(selecteur))) : Right(e));
export const recupereElementsAvecSelecteur =
(parent: ElementParent) => <E extends Element = Element>(selecteur: string): Either<SyntaxError, Array<E>> =>
Either
// Retourne une SyntaxError dans un Left si le sélecteur est invalide
.encase(() => pipe(parent.querySelectorAll<E>(selecteur), Array.from<E>))
// Transforme le Left en une erreur plus sympathique
.mapLeft(_ => creeSyntaxError(ERREUR_SYNTAXE_INVALIDE(selecteur)))
// Retourne une SyntaxError si le tableau est vide
.chain((e: Array<E>) => isEmpty(e) ? Left(creeSyntaxError(ERREUR_SELECTEUR_INEXISTANT(selecteur))) : Right(e));
/**
* @param element
@ -73,3 +69,17 @@ export const estDansLaVue: (element: Element) => boolean = (element) => {
&& rect.right <= (window.innerWidth || document.documentElement.clientWidth)
);
};
export const recupereElementOuLeve = <E extends Element = Element>(elementOuErreur: Either<SyntaxError, E>): E =>
elementOuErreur.caseOf({
Left: reporteEtLeveErreur<SyntaxError>,
Right: identity,
});
export const recupereElementsOuLeve = <E extends Element = Element>(
elementsOuErreur: Either<SyntaxError, Array<E>>,
): Array<E> =>
elementsOuErreur.caseOf({
Left: reporteEtLeveErreur<SyntaxError>,
Right: identity,
});

View file

@ -2,6 +2,8 @@
* Fonctions pour la création d'Erreurs.
*/
import { captureException } from "@sentry/browser";
/* Messages d'erreur */
export const ERREUR_SYNTAXE_INVALIDE: (selecteur: string) => string = (selecteur) =>
`Le selecteur "${selecteur}" est invalide`;
@ -11,6 +13,14 @@ export const ERREUR_SELECTEUR_INEXISTANT: (selecteur: string) => string = (selec
/* Création d'erreurs */
export const creeSyntaxError: (message: string) => SyntaxError = (message) => new SyntaxError(message);
export const leveErreur: (erreur: Error) => never = (erreur) => {
/* Fonction utilitaire pour lever une Error */
export const leveErreur = (erreur: Error): never => {
throw erreur;
};
/* eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- Permet d'indiquer
le type d'Erreur à l'appel de la fonction. */
export const reporteEtLeveErreur = <E extends Error>(erreur: E): never => {
captureException(erreur);
throw erreur;
};

View file

@ -0,0 +1,6 @@
type Constructor<T> = new(...args: Array<unknown>) => T;
const estElement = <T extends HTMLElement>(typeElement: Constructor<T>) => (element: unknown): element is T =>
element instanceof typeElement;
export const estHTMLSelectElement = estElement<HTMLSelectElement>(HTMLSelectElement);

View file

@ -2,16 +2,18 @@
* Fonctions liées à la gestion du Panier.
*/
import { Either, EitherAsync, identity, Left, Right } from "purify-ts";
import { ROUTE_API_PANIER } from "./constantes";
import { type Either, EitherAsync, Left, Right } from "purify-ts";
import { ENTETE_WC_NONCE, ROUTE_API_PANIER } from "../constantes/api";
/** États utiles pour les scripts. */
type Etats = {
interface Etats {
/** Un nonce pour l'authentification de requêtes API */
nonce: string;
};
}
// @ts-expect-error - États injectés par le modèle PHP
// @ts-expect-error -- États injectés par le modèle PHP
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment -- États injectés par le modèle PHP
const ETATS: Etats = _etats;
const requeteRecuperePanier = (): Promise<Either<Error, Response>> =>
@ -22,7 +24,7 @@ const requeteRecuperePanier = (): Promise<Either<Error, Response>> =>
headers: {
"Accept": "application/json",
"Content-Type": "application/json",
"X-WC-Store-API-Nonce": ETATS.nonce,
[ENTETE_WC_NONCE]: ETATS.nonce,
},
method: "GET",
mode: "same-origin",
@ -35,4 +37,6 @@ const requeteRecuperePanier = (): Promise<Either<Error, Response>> =>
export const recuperePanier = EitherAsync
.fromPromise(requeteRecuperePanier)
.map(a => a.json())
.ifLeft(e => console.error(e));
.ifLeft(e => {
console.error(e);
});

View file

@ -1,5 +1,6 @@
import { Either, Left, Right } from "fp-ts/lib/Either";
import { Errors, Type } from "io-ts";
import type { Errors, Type } from "io-ts";
import { type Either, Left, Right } from "fp-ts/lib/Either";
import { reporter } from "io-ts-reporters";
export async function fetchJson<T, O, I>(
@ -77,13 +78,17 @@ const main = async (): Promise<void> => {
const eitherEmail = eitherEmailFromInput.map(validateEmail); // map over the either to validate the email
eitherEmail.caseOf({
Left: (error) => console.log(error.errorReason), // email is invalid
Left: (error) => {
console.log(error.errorReason);
}, // email is invalid
Right: async (email) => {
const eitherSessionId = await getSessionIdFromEmail(email);
eitherSessionId.caseOf({
Left: (error) => console.log(error.errorReason), // getting the sessionId failed
Left: (error) => {
console.log(error.errorReason);
}, // getting the sessionId failed
Right: (sessionId) => {
printInformations({ sessionId, email });
printInformations({ email, sessionId });
},
});
},
@ -91,11 +96,11 @@ const main = async (): Promise<void> => {
};
const flow = EitherAsync<{ errorReason: string }, void>(
async ({ liftEither, fromPromise }) => {
async ({ fromPromise, liftEither }) => {
const emailFromInput = await fromPromise(readMailFromCli());
const email = await liftEither(validateEmail(emailFromInput));
const sessionId = await fromPromise(getSessionIdFromEmail(email));
printInformations({ sessionId, email });
printInformations({ email, sessionId });
},
);
@ -107,3 +112,69 @@ const main2 = async () => {
};
main();
/* setTimeout(() => {
console.debug("Suppression du Panier");
fetch(
"/wp-json/wc/store/cart/items",
{
credentials: "same-origin",
headers: {
"Accept": "application/json",
"Content-Type": "application/json",
"X-WC-Store-API-Nonce": ETATS.nonce,
},
method: "DELETE",
mode: "same-origin",
signal: AbortSignal.timeout(5000),
},
)
.then(a => a.json())
.then(a => console.debug(a))
.catch(b => console.error(b));
}, 5000);
setTimeout(() => {
console.debug("Nouveau Panier");
fetch(
"/wp-json/wc/store/cart",
{
credentials: "same-origin",
headers: {
"Accept": "application/json",
"Content-Type": "application/json",
"X-WC-Store-API-Nonce": ETATS.nonce,
},
method: "GET",
mode: "same-origin",
signal: AbortSignal.timeout(5000),
},
)
.then(a => a.json())
.then(a => console.debug(a))
.catch(b => console.error(b));
}, 7000); */
/* Fonctions utilitaires */
// const creeObservateurIntersection = (element: Element, options: IntersectionObserverInit, classe = "anime") => {
// const observateur = new IntersectionObserver(entrees => {
// for (const entree of entrees) {
// const cible = entree.target;
// /* Enclenchement de l'animation */
// if (entree.isIntersecting || estDansLaVue(cible)) {
// cible.classList.add(classe);
// return;
// }
// /* Empêche que le cycle ne se répète */
// if (cible.classList.contains(classe)) {
// observateur.unobserve(cible);
// }
// }
// }, options || {});
// observateur.observe(element);
// return observateur;
// };

View file

@ -1,8 +1,10 @@
import type { Either } from "purify-ts";
import { recupereElementAvecSelecteur, recupereElementsAvecSelecteur } from "./dom";
export const recupereElementsDocument: (selecteur: string) => Either<SyntaxError, Element[]> =
recupereElementsAvecSelecteur(document);
export const recupereElementsDocument: <E extends Element = Element>(
selecteur: string,
) => Either<SyntaxError, Array<E>> = recupereElementsAvecSelecteur(document);
export const recupereElementDocument: <E extends Element = Element>(selecteur: string) => Either<SyntaxError, E> =
recupereElementAvecSelecteur(document);

View file

@ -1,35 +1,44 @@
// Scripts pour la Page Produit
import { Either, identity } from "purify-ts";
import { Either, Maybe } from "purify-ts";
import { pipe } from "remeda";
import { ENTETE_WC_NONCE, ROUTE_API_AJOUTE_ARTICLE_PANIER } from "./constantes/api";
import {
ATTRIBUT_ARIA_SELECTED,
ATTRIBUT_CONTIENT_ARTICLES,
ATTRIBUT_DESACTIVE,
ATTRIBUT_HIDDEN,
ROUTE_API_AJOUTE_ARTICLE_PANIER,
SELECTEUR_BOUTON_AJOUT_PANIER,
SELECTEUR_BOUTON_PANIER,
SELECTEUR_LIENS_ONGLETS,
SELECTEUR_SECTIONS_CONTENUS,
SELECTEUR_SELECTEUR_QUANTITE,
} from "./lib/constantes";
import { leveErreur } from "./lib/erreurs";
} from "./constantes/dom";
import { recupereElementOuLeve, recupereElementsOuLeve } from "./lib/dom";
import { reporteEtLeveErreur } from "./lib/erreurs";
import { estHTMLSelectElement } from "./lib/gardes";
import { recupereElementDocument, recupereElementsDocument } from "./lib/utils";
import { WCStoreCartAddItemArgs } from "./types/cart-add-item";
import { WCStoreCartAddItemArgs } from "./types/api/cart-add-item";
/** États utiles pour les scripts de la page. */
type Etats = {
type EtatsPage = {
/** L'ID en base de données du Produit. */
idProduit: number;
/** Un nonce pour l'authentification de requêtes API */
/** Un nonce pour l'authentification de requêtes API vers le backend WooCommerce. */
nonce: string;
};
type EnsembleLienContenu = [Element, Element];
type EnsembleLienContenu = [HTMLAnchorElement, HTMLElement];
// @ts-expect-error - États injectés par le modèle PHP
const ETATS: Etats = _etats;
// @ts-expect-error -- États injectés par le modèle PHP
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment -- États injectés par le modèle PHP
const ETATS_PAGE: EtatsPage = _etats;
/**
* Déplie toutes les sections de la Boîte des Informations Produit en ajustant les attributs
* correspondants.
*/
const deplieToutesSections: (ensembleLiensContenus: EnsembleLienContenu[]) => void = (ensembleLiensContenus) => {
const deplieToutesSections = (ensembleLiensContenus: Array<EnsembleLienContenu>): void => {
ensembleLiensContenus.forEach(ensemble => {
ensemble[0].setAttribute(ATTRIBUT_ARIA_SELECTED, "false");
ensemble[1].setAttribute(ATTRIBUT_HIDDEN, "true");
@ -37,146 +46,143 @@ const deplieToutesSections: (ensembleLiensContenus: EnsembleLienContenu[]) => vo
};
// Éléments d'intérêt
// TODO: C'est stupide de conserver des Either, en cas d'absence de ces éléments lever une Error, afficher un message à l'Utilisateur et arrêter le script
/** Le « Bouton » vers le Panier dont le texte est un indicateur du nombre de Produits dedans. */
const BOUTON_PANIER: Either<SyntaxError, HTMLAnchorElement> = recupereElementDocument<HTMLAnchorElement>(
SELECTEUR_BOUTON_PANIER,
const BOUTON_PANIER: HTMLAnchorElement = pipe(
recupereElementDocument<HTMLAnchorElement>(SELECTEUR_BOUTON_PANIER),
recupereElementOuLeve,
);
/** Le Bouton permettant l'ajout d'un Produit dans le Panier. */
const BOUTON_AJOUT_PANIER: HTMLButtonElement = pipe(
recupereElementDocument<HTMLButtonElement>(SELECTEUR_BOUTON_AJOUT_PANIER),
recupereElementOuLeve,
);
/** Le Sélecteur de Variation de Produit. */
const SELECTEUR_VARIATION: HTMLSelectElement = pipe(
recupereElementDocument<HTMLSelectElement>(SELECTEUR_SELECTEUR_QUANTITE),
recupereElementOuLeve,
);
/** */
const LIENS_ONGLETS: Array<HTMLAnchorElement> = pipe(
recupereElementsDocument<HTMLAnchorElement>(SELECTEUR_LIENS_ONGLETS),
recupereElementsOuLeve,
);
/** */
const SECTIONS_CONTENUS: Array<HTMLElement> = pipe(
recupereElementsDocument<HTMLElement>(SELECTEUR_SECTIONS_CONTENUS),
recupereElementsOuLeve,
);
const gereBoiteInformationsProduit = () => {
/* Récupère les Éléments intéressants */
const liensOnglets: Element[] = recupereElementsDocument("a[role='tab']").caseOf({
Left: leveErreur,
Right: identity,
});
const sectionsContenus: Element[] = recupereElementsDocument("section[role='tabpanel']").caseOf({
Left: leveErreur,
Right: identity,
});
const selecteurQuantite: HTMLSelectElement = recupereElementDocument<HTMLSelectElement>(SELECTEUR_SELECTEUR_QUANTITE)
.caseOf({
Left: leveErreur,
Right: identity,
});
const boutonAjoutPanier: HTMLButtonElement = recupereElementDocument<HTMLButtonElement>(SELECTEUR_BOUTON_AJOUT_PANIER)
.caseOf({
Left: leveErreur,
Right: identity,
});
const suitMutationsBoutonAjoutPanier = (boutonAjoutPanier: HTMLButtonElement): void => {
const mutationCallback: MutationCallback = (mutationsList: Array<MutationRecord>) => {
for (const mutation of mutationsList) {
if (mutation.type !== "attributes" || mutation.attributeName !== ATTRIBUT_DESACTIVE) return;
console.log("old:", mutation.oldValue);
console.log("new:", (mutation.target as HTMLButtonElement).getAttribute(ATTRIBUT_DESACTIVE));
}
};
const observer = new MutationObserver(mutationCallback);
observer.observe(boutonAjoutPanier, { attributes: true });
};
const gereBoiteInformationsProduit = () => {
const onglets = new Map<string, EnsembleLienContenu>();
/* Créé la Map avec les ensembles Lien-Contenu */
liensOnglets.forEach((lien, index) => {
const idOnglet: string | null = lien.getAttribute("id");
const sectionCorrespondante: Element | undefined = sectionsContenus[index];
LIENS_ONGLETS.forEach((lien, index) => {
const idOnglet: null | string = lien.getAttribute("id");
const sectionCorrespondante: HTMLElement | undefined = SECTIONS_CONTENUS[index];
if (!idOnglet) throw new Error("Le lien ne dispose pas d'ID !");
if (!sectionCorrespondante) throw new Error("Le lien ne dispose pas de section correspondante !");
onglets.set(idOnglet, [lien, sectionCorrespondante]);
});
// TODO: Déplacer dans la première itération ?
Array.from(onglets.values()).forEach((v) => {
/* Ajout d'un Écouteur d'Événement sur le lien */
v[0].addEventListener("click", (e) => {
lien.addEventListener("click", (e) => {
/* Empêche la pollution de l'historique de navigation */
e.preventDefault();
/* Sauvegarde l'état d'ouverture de la section avant de toutes les fermer */
const estAncienOngletCourant: boolean = v[0].getAttribute(ATTRIBUT_ARIA_SELECTED) === "true";
deplieToutesSections(Array.from(onglets.values()));
const estAncienOngletCourant: boolean = lien.getAttribute(ATTRIBUT_ARIA_SELECTED) === "true";
deplieToutesSections(pipe(onglets.values(), Array.from<EnsembleLienContenu>));
/* Ne fais rien de plus si l'onglet sélectionné était le courant */
if (estAncienOngletCourant) return;
/* Ouvre le nouvel onglet sélectionné */
v[0].setAttribute(ATTRIBUT_ARIA_SELECTED, "true");
v[1].removeAttribute(ATTRIBUT_HIDDEN);
lien.setAttribute(ATTRIBUT_ARIA_SELECTED, "true");
sectionCorrespondante.removeAttribute(ATTRIBUT_HIDDEN);
});
});
/* Ajout des Écouteurs d'Événements */
selecteurQuantite.addEventListener("change", (e) => {
/* e peut être null ou "--" ou autre chose */
console.debug(selecteurQuantite.value, e);
SELECTEUR_VARIATION.addEventListener("change", (evenement) => {
pipe(
evenement.target,
Maybe.fromNullable,
cibleEvenement => cibleEvenement.filter(estHTMLSelectElement),
element => element.map(v => v.validity.valid),
validite => validite.ifJust((v: boolean) => BOUTON_AJOUT_PANIER.toggleAttribute(ATTRIBUT_DESACTIVE, !v)),
);
});
boutonAjoutPanier.addEventListener("click", (e) => {
e.preventDefault();
ajouteProduitAuPanier();
});
console.debug(onglets);
BOUTON_AJOUT_PANIER.addEventListener("click", (_) => ajouteProduitAuPanier());
};
// TODO: Traiter le cas des Produits avec variations
const ajouteProduitAuPanier = () => {
const requeteInvalide: WCStoreCartAddItemArgs = {
id: ETATS_PAGE.idProduit,
quantity: 1,
id: ETATS.idProduit,
};
/* État de chargement */
BOUTON_AJOUT_PANIER.textContent = "Adding...";
// TODO: Traiter les cas d'erreurs avec ts-pattern
/* Exécution de la requête */
Either
.encase<Error, WCStoreCartAddItemArgs>(() => WCStoreCartAddItemArgs(requeteInvalide))
.ifLeft(e => console.error(e))
.map(r => {
.map((args: WCStoreCartAddItemArgs) => {
fetch(
ROUTE_API_AJOUTE_ARTICLE_PANIER,
{
body: JSON.stringify(r),
body: JSON.stringify(args),
credentials: "same-origin",
headers: {
"Accept": "application/json",
"Content-Type": "application/json",
"X-WC-Store-API-Nonce": ETATS.nonce,
[ENTETE_WC_NONCE]: ETATS_PAGE.nonce,
},
method: "POST",
mode: "same-origin",
signal: AbortSignal.timeout(5000),
},
)
.then(a => a.json())
.then(a => {
BOUTON_PANIER
.caseOf({
Left: (e) => console.error("Le bouton du Panier n'existe pas !", e),
Right: (r) => {
console.debug(r);
r.textContent = `cart ${a.items.length}`;
},
});
.then((reponse: Response) => reponse.json())
.then((corps: unknown) => {
// TODO: Validation du corps de la Réponse
/**
* À la réception du nouveau Panier du backend :
* 1. Met à jour la quantité de Produits dans le Bouton du Panier
* 2. Met à jour le Bouton d'ajout au Panier avec un message de succès
* 3. (3 secondes) Réinitialise le Sélecteur de Quantité et le Bouton d'Ajout au Panier
*/
BOUTON_PANIER.textContent = `cart (${corps.items.length})`;
BOUTON_PANIER.setAttribute(ATTRIBUT_CONTIENT_ARTICLES, String(corps.items.length > 0));
BOUTON_AJOUT_PANIER.textContent = "Added to cart!";
setTimeout(() => {
SELECTEUR_VARIATION.value = SELECTEUR_VARIATION.options.item(0)?.value ?? "--";
BOUTON_AJOUT_PANIER.textContent = "Add to cart";
BOUTON_AJOUT_PANIER.toggleAttribute(ATTRIBUT_DESACTIVE, true);
}, 3000);
})
.catch(b => console.error(b));
.catch(reporteEtLeveErreur);
});
};
/* Fonctions utilitaires */
// const creeObservateurIntersection = (element: Element, options: IntersectionObserverInit, classe = "anime") => {
// const observateur = new IntersectionObserver(entrees => {
// for (const entree of entrees) {
// const cible = entree.target;
// /* Enclenchement de l'animation */
// if (entree.isIntersecting || estDansLaVue(cible)) {
// cible.classList.add(classe);
// return;
// }
// /* Empêche que le cycle ne se répète */
// if (cible.classList.contains(classe)) {
// observateur.unobserve(cible);
// }
// }
// }, options || {});
// observateur.observe(element);
// return observateur;
// };
document.addEventListener("DOMContentLoaded", () => {
gereBoiteInformationsProduit();
// recuperePanierUtilisateur();
});

View file

@ -0,0 +1,2 @@
/** Type union des parents possibles pour un `querySelector`. */
export type ElementParent = Document | Element;

View file

@ -0,0 +1,9 @@
import type { BaseTransportOptions } from "@sentry/types";
/* Recréé une Interface non exposé par Sentry */
export interface BrowserTransportOptions extends BaseTransportOptions {
/** Fetch API init parameters. Used by the FetchTransport */
fetchOptions?: RequestInit;
/** Custom headers for the transport. Used by the XHRTransport and FetchTransport */
headers?: Record<string, string>;
}

View file

@ -1,10 +1,10 @@
/// <reference types="vite/client" />
interface ImportMetaEnv {
/** URL du site. */
readonly VITE_URL: string;
/** URL du endpoint pour le report d'Erreurs au service GlitchTip. */
readonly VITE_GLITCHTIP_NSD: string;
/** URL du site. */
readonly VITE_URL: string;
}
interface ImportMeta {

View file

@ -26,6 +26,7 @@
<section class="compte-panier">
<a class="lien-bouton lien-compte" href="#">Account</a>
{# Bouton « Panier » avec l'indicateur de quantité de Produits #}
<a class="lien-bouton" data-contient-articles="{{ articles_presents }}" href="#" rel="cart">
cart ({{ quantite_articles }})
</a>

View file

@ -33,9 +33,7 @@
</section>
<section class="selecteur-produit">
<h3 class="selecteur-produit__nom">
Boroboro Silver Ring
</h3>
<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>
@ -69,7 +67,7 @@
<section class="actions-produit">
{# TODO: Ajouter au Panier sans rafraîchir la Page #}
<button class="bouton-case-pleine desactive" id="bouton-ajout-panier" type="button">Add to cart</button>
<button class="bouton-case-pleine" disabled id="bouton-ajout-panier" type="button">Add to cart</button>
</section>
</div>
</aside>