@starterlib/ui 0.7.2 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/LICENCES-TIERCES.md +236 -0
  2. package/README.md +163 -56
  3. package/assets/icones/catalogue.json +3296 -0
  4. package/assets/icones/sprite.svg +235 -35
  5. package/fesm2022/starterlib-ui-arbre.mjs +475 -0
  6. package/fesm2022/starterlib-ui-arbre.mjs.map +1 -0
  7. package/fesm2022/starterlib-ui-donnees.mjs +3561 -0
  8. package/fesm2022/starterlib-ui-donnees.mjs.map +1 -0
  9. package/fesm2022/starterlib-ui-formulaires.mjs +3186 -442
  10. package/fesm2022/starterlib-ui-formulaires.mjs.map +1 -1
  11. package/fesm2022/starterlib-ui-libelles-en.mjs +383 -0
  12. package/fesm2022/starterlib-ui-libelles-en.mjs.map +1 -0
  13. package/fesm2022/starterlib-ui-listes.mjs +5367 -0
  14. package/fesm2022/starterlib-ui-listes.mjs.map +1 -0
  15. package/fesm2022/starterlib-ui-messagerie.mjs +737 -0
  16. package/fesm2022/starterlib-ui-messagerie.mjs.map +1 -0
  17. package/fesm2022/starterlib-ui-navigation.mjs +509 -0
  18. package/fesm2022/starterlib-ui-navigation.mjs.map +1 -0
  19. package/fesm2022/starterlib-ui-onglets.mjs +371 -0
  20. package/fesm2022/starterlib-ui-onglets.mjs.map +1 -0
  21. package/fesm2022/starterlib-ui-parcours.mjs +2449 -0
  22. package/fesm2022/starterlib-ui-parcours.mjs.map +1 -0
  23. package/fesm2022/starterlib-ui-qr.mjs +907 -0
  24. package/fesm2022/starterlib-ui-qr.mjs.map +1 -0
  25. package/fesm2022/starterlib-ui-saisie.mjs +8609 -0
  26. package/fesm2022/starterlib-ui-saisie.mjs.map +1 -0
  27. package/fesm2022/starterlib-ui-selection.mjs +1341 -0
  28. package/fesm2022/starterlib-ui-selection.mjs.map +1 -0
  29. package/fesm2022/starterlib-ui-sens.mjs +59 -0
  30. package/fesm2022/starterlib-ui-sens.mjs.map +1 -0
  31. package/fesm2022/starterlib-ui-surfaces.mjs +5140 -1387
  32. package/fesm2022/starterlib-ui-surfaces.mjs.map +1 -1
  33. package/fesm2022/starterlib-ui.mjs +10729 -5689
  34. package/fesm2022/starterlib-ui.mjs.map +1 -1
  35. package/package.json +58 -17
  36. package/styles/amorce.css +69 -0
  37. package/styles/couches.css +178 -0
  38. package/types/starterlib-ui-arbre.d.ts +225 -0
  39. package/types/starterlib-ui-donnees.d.ts +1489 -0
  40. package/types/starterlib-ui-formulaires.d.ts +1174 -138
  41. package/types/starterlib-ui-libelles-en.d.ts +5 -0
  42. package/types/starterlib-ui-listes.d.ts +2487 -0
  43. package/types/starterlib-ui-messagerie.d.ts +317 -0
  44. package/types/starterlib-ui-navigation.d.ts +242 -0
  45. package/types/starterlib-ui-onglets.d.ts +212 -0
  46. package/types/starterlib-ui-parcours.d.ts +916 -0
  47. package/types/starterlib-ui-qr.d.ts +105 -0
  48. package/types/starterlib-ui-saisie.d.ts +3806 -0
  49. package/types/starterlib-ui-selection.d.ts +488 -0
  50. package/types/starterlib-ui-sens.d.ts +44 -0
  51. package/types/starterlib-ui-surfaces.d.ts +1899 -510
  52. package/types/starterlib-ui.d.ts +4731 -2678
  53. package/fesm2022/starterlib-ui-interactions.mjs +0 -598
  54. package/fesm2022/starterlib-ui-interactions.mjs.map +0 -1
  55. package/types/starterlib-ui-interactions.d.ts +0 -316
@@ -0,0 +1,907 @@
1
+ import * as i0 from "@angular/core";
2
+ import { ChangeDetectionStrategy, Component, afterNextRender, computed, input, isDevMode, viewChild } from "@angular/core";
3
+ const INDICATEUR_DE_MODE = {
4
+ numerique: 1,
5
+ alphanumerique: 2,
6
+ octets: 4
7
+ };
8
+ const BITS_DU_COMPTE = {
9
+ numerique: [
10
+ 10,
11
+ 12,
12
+ 14
13
+ ],
14
+ alphanumerique: [
15
+ 9,
16
+ 11,
17
+ 13
18
+ ],
19
+ octets: [
20
+ 8,
21
+ 16,
22
+ 16
23
+ ]
24
+ };
25
+ const ALPHANUMERIQUE = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:";
26
+ const BITS_DU_NIVEAU = {
27
+ L: 1,
28
+ M: 0,
29
+ Q: 3,
30
+ H: 2
31
+ };
32
+ const CORRECTION_PAR_BLOC = {
33
+ L: [
34
+ -1,
35
+ 7,
36
+ 10,
37
+ 15,
38
+ 20,
39
+ 26,
40
+ 18,
41
+ 20,
42
+ 24,
43
+ 30,
44
+ 18,
45
+ 20,
46
+ 24,
47
+ 26,
48
+ 30,
49
+ 22,
50
+ 24,
51
+ 28,
52
+ 30,
53
+ 28,
54
+ 28,
55
+ 28,
56
+ 28,
57
+ 30,
58
+ 30,
59
+ 26,
60
+ 28,
61
+ 30,
62
+ 30,
63
+ 30,
64
+ 30,
65
+ 30,
66
+ 30,
67
+ 30,
68
+ 30,
69
+ 30,
70
+ 30,
71
+ 30,
72
+ 30,
73
+ 30,
74
+ 30
75
+ ],
76
+ M: [
77
+ -1,
78
+ 10,
79
+ 16,
80
+ 26,
81
+ 18,
82
+ 24,
83
+ 16,
84
+ 18,
85
+ 22,
86
+ 22,
87
+ 26,
88
+ 30,
89
+ 22,
90
+ 22,
91
+ 24,
92
+ 24,
93
+ 28,
94
+ 28,
95
+ 26,
96
+ 26,
97
+ 26,
98
+ 26,
99
+ 28,
100
+ 28,
101
+ 28,
102
+ 28,
103
+ 28,
104
+ 28,
105
+ 28,
106
+ 28,
107
+ 28,
108
+ 28,
109
+ 28,
110
+ 28,
111
+ 28,
112
+ 28,
113
+ 28,
114
+ 28,
115
+ 28,
116
+ 28,
117
+ 28
118
+ ],
119
+ Q: [
120
+ -1,
121
+ 13,
122
+ 22,
123
+ 18,
124
+ 26,
125
+ 18,
126
+ 24,
127
+ 18,
128
+ 22,
129
+ 20,
130
+ 24,
131
+ 28,
132
+ 26,
133
+ 24,
134
+ 20,
135
+ 30,
136
+ 24,
137
+ 28,
138
+ 28,
139
+ 26,
140
+ 30,
141
+ 28,
142
+ 30,
143
+ 30,
144
+ 30,
145
+ 30,
146
+ 28,
147
+ 30,
148
+ 30,
149
+ 30,
150
+ 30,
151
+ 30,
152
+ 30,
153
+ 30,
154
+ 30,
155
+ 30,
156
+ 30,
157
+ 30,
158
+ 30,
159
+ 30,
160
+ 30
161
+ ],
162
+ H: [
163
+ -1,
164
+ 17,
165
+ 28,
166
+ 22,
167
+ 16,
168
+ 22,
169
+ 28,
170
+ 26,
171
+ 26,
172
+ 24,
173
+ 28,
174
+ 24,
175
+ 28,
176
+ 22,
177
+ 24,
178
+ 24,
179
+ 30,
180
+ 28,
181
+ 28,
182
+ 26,
183
+ 28,
184
+ 30,
185
+ 24,
186
+ 30,
187
+ 30,
188
+ 30,
189
+ 30,
190
+ 30,
191
+ 30,
192
+ 30,
193
+ 30,
194
+ 30,
195
+ 30,
196
+ 30,
197
+ 30,
198
+ 30,
199
+ 30,
200
+ 30,
201
+ 30,
202
+ 30,
203
+ 30
204
+ ]
205
+ };
206
+ const BLOCS = {
207
+ L: [
208
+ -1,
209
+ 1,
210
+ 1,
211
+ 1,
212
+ 1,
213
+ 1,
214
+ 2,
215
+ 2,
216
+ 2,
217
+ 2,
218
+ 4,
219
+ 4,
220
+ 4,
221
+ 4,
222
+ 4,
223
+ 6,
224
+ 6,
225
+ 6,
226
+ 6,
227
+ 7,
228
+ 8,
229
+ 8,
230
+ 9,
231
+ 9,
232
+ 10,
233
+ 12,
234
+ 12,
235
+ 12,
236
+ 13,
237
+ 14,
238
+ 15,
239
+ 16,
240
+ 17,
241
+ 18,
242
+ 19,
243
+ 19,
244
+ 20,
245
+ 21,
246
+ 22,
247
+ 24,
248
+ 25
249
+ ],
250
+ M: [
251
+ -1,
252
+ 1,
253
+ 1,
254
+ 1,
255
+ 2,
256
+ 2,
257
+ 4,
258
+ 4,
259
+ 4,
260
+ 5,
261
+ 5,
262
+ 5,
263
+ 8,
264
+ 9,
265
+ 9,
266
+ 10,
267
+ 10,
268
+ 11,
269
+ 13,
270
+ 14,
271
+ 16,
272
+ 17,
273
+ 17,
274
+ 18,
275
+ 20,
276
+ 21,
277
+ 23,
278
+ 25,
279
+ 26,
280
+ 28,
281
+ 29,
282
+ 31,
283
+ 33,
284
+ 35,
285
+ 37,
286
+ 38,
287
+ 40,
288
+ 43,
289
+ 45,
290
+ 47,
291
+ 49
292
+ ],
293
+ Q: [
294
+ -1,
295
+ 1,
296
+ 1,
297
+ 2,
298
+ 2,
299
+ 4,
300
+ 4,
301
+ 6,
302
+ 6,
303
+ 8,
304
+ 8,
305
+ 8,
306
+ 10,
307
+ 12,
308
+ 16,
309
+ 12,
310
+ 17,
311
+ 16,
312
+ 18,
313
+ 21,
314
+ 20,
315
+ 23,
316
+ 23,
317
+ 25,
318
+ 27,
319
+ 29,
320
+ 34,
321
+ 34,
322
+ 35,
323
+ 38,
324
+ 40,
325
+ 43,
326
+ 45,
327
+ 48,
328
+ 51,
329
+ 53,
330
+ 56,
331
+ 59,
332
+ 62,
333
+ 65,
334
+ 68
335
+ ],
336
+ H: [
337
+ -1,
338
+ 1,
339
+ 1,
340
+ 2,
341
+ 4,
342
+ 4,
343
+ 4,
344
+ 5,
345
+ 6,
346
+ 8,
347
+ 8,
348
+ 11,
349
+ 11,
350
+ 16,
351
+ 16,
352
+ 18,
353
+ 16,
354
+ 19,
355
+ 21,
356
+ 25,
357
+ 25,
358
+ 25,
359
+ 34,
360
+ 30,
361
+ 32,
362
+ 35,
363
+ 37,
364
+ 40,
365
+ 42,
366
+ 45,
367
+ 48,
368
+ 51,
369
+ 54,
370
+ 57,
371
+ 60,
372
+ 63,
373
+ 66,
374
+ 70,
375
+ 74,
376
+ 77,
377
+ 81
378
+ ]
379
+ };
380
+ const PENALITE_SUITE = 3;
381
+ const PENALITE_CARRE = 3;
382
+ const PENALITE_REPERE = 40;
383
+ const PENALITE_EQUILIBRE = 10;
384
+ const VERSION_MIN = 1;
385
+ const VERSION_MAX = 40;
386
+ function entree(table, indice) {
387
+ const valeur = table[indice];
388
+ if (valeur === void 0 || valeur < 0) throw new RangeError(`encoderQr : indice ${String(indice)} hors des tables`);
389
+ return valeur;
390
+ }
391
+ function encoderQr(texte, options = {}) {
392
+ const correction = options.correction ?? "M";
393
+ const versionMin = options.versionMin ?? VERSION_MIN;
394
+ const versionMax = options.versionMax ?? VERSION_MAX;
395
+ if (!Number.isInteger(versionMin) || !Number.isInteger(versionMax) || versionMin < VERSION_MIN || versionMax > VERSION_MAX || versionMin > versionMax) throw new RangeError(`encoderQr : versions ${String(versionMin)} a ${String(versionMax)} hors de 1 a 40`);
396
+ const masqueImpose = options.masque ?? null;
397
+ if (masqueImpose !== null && (!Number.isInteger(masqueImpose) || masqueImpose < 0 || masqueImpose > 7)) throw new RangeError(`encoderQr : masque ${String(masqueImpose)} hors de 0 a 7`);
398
+ const segment = segmenter(texte);
399
+ let version = versionMin;
400
+ while (version <= versionMax) {
401
+ const utiles = bitsDuSegment(segment, version);
402
+ if (utiles >= 0 && utiles <= motsDeDonnees(version, correction) * 8) break;
403
+ version++;
404
+ }
405
+ if (version > versionMax) throw new RangeError(`encoderQr : ${String(segment.nombre)} caracteres ne tiennent pas en version ${String(versionMax)} ${correction}`);
406
+ const bits = new Bits();
407
+ bits.ajouter(INDICATEUR_DE_MODE[segment.mode], 4);
408
+ bits.ajouter(segment.nombre, bitsDuCompte(segment.mode, version));
409
+ bits.concatener(segment.donnees);
410
+ const capacite = motsDeDonnees(version, correction) * 8;
411
+ bits.ajouter(0, Math.min(4, capacite - bits.longueur));
412
+ bits.ajouter(0, (8 - bits.longueur % 8) % 8);
413
+ for (let remplissage = 236; bits.longueur < capacite; remplissage ^= 253) bits.ajouter(remplissage, 8);
414
+ const symbole = new Symbole(version, correction);
415
+ symbole.dessinerLesMotifs();
416
+ symbole.placerLesMots(entrelacer(bits.octets(), version, correction));
417
+ symbole.masquer(masqueImpose);
418
+ return {
419
+ version,
420
+ taille: symbole.taille,
421
+ correction,
422
+ masque: symbole.masque,
423
+ modules: symbole.matrice()
424
+ };
425
+ }
426
+ const NUMERIQUE = /^[0-9]*$/;
427
+ const EN_ALPHANUMERIQUE = /^[0-9A-Z $%*+\-./:]*$/;
428
+ function segmenter(texte) {
429
+ const donnees = new Bits();
430
+ if (NUMERIQUE.test(texte)) {
431
+ for (let i = 0; i < texte.length; i += 3) {
432
+ const groupe = texte.slice(i, i + 3);
433
+ donnees.ajouter(Number.parseInt(groupe, 10), groupe.length * 3 + 1);
434
+ }
435
+ return {
436
+ mode: "numerique",
437
+ nombre: texte.length,
438
+ donnees
439
+ };
440
+ }
441
+ if (EN_ALPHANUMERIQUE.test(texte)) {
442
+ const valeur = (i) => ALPHANUMERIQUE.indexOf(texte.charAt(i));
443
+ for (let i = 0; i + 1 < texte.length; i += 2) donnees.ajouter(valeur(i) * 45 + valeur(i + 1), 11);
444
+ if (texte.length % 2 === 1) donnees.ajouter(valeur(texte.length - 1), 6);
445
+ return {
446
+ mode: "alphanumerique",
447
+ nombre: texte.length,
448
+ donnees
449
+ };
450
+ }
451
+ const octets = new TextEncoder().encode(texte);
452
+ for (const octet of octets) donnees.ajouter(octet, 8);
453
+ return {
454
+ mode: "octets",
455
+ nombre: octets.length,
456
+ donnees
457
+ };
458
+ }
459
+ function bitsDuCompte(mode, version) {
460
+ const [petites, moyennes, grandes] = BITS_DU_COMPTE[mode];
461
+ return version <= 9 ? petites : version <= 26 ? moyennes : grandes;
462
+ }
463
+ function bitsDuSegment(segment, version) {
464
+ const bitsDuChamp = bitsDuCompte(segment.mode, version);
465
+ if (segment.nombre >= 2 ** bitsDuChamp) return -1;
466
+ return 4 + bitsDuChamp + segment.donnees.longueur;
467
+ }
468
+ function modulesDeDonnees(version) {
469
+ let resultat = (16 * version + 128) * version + 64;
470
+ if (version >= 2) {
471
+ const alignements = Math.floor(version / 7) + 2;
472
+ resultat -= (25 * alignements - 10) * alignements - 55;
473
+ if (version >= 7) resultat -= 36;
474
+ }
475
+ return resultat;
476
+ }
477
+ function motsDeDonnees(version, correction) {
478
+ return Math.floor(modulesDeDonnees(version) / 8) - entree(CORRECTION_PAR_BLOC[correction], version) * entree(BLOCS[correction], version);
479
+ }
480
+ function produit(x, y) {
481
+ let z = 0;
482
+ for (let i = 7; i >= 0; i--) {
483
+ z = z << 1 ^ (z >>> 7) * 285;
484
+ z ^= (y >>> i & 1) * x;
485
+ }
486
+ return z;
487
+ }
488
+ function generateur(degre) {
489
+ const resultat = new Uint8Array(degre);
490
+ resultat[degre - 1] = 1;
491
+ let racine = 1;
492
+ for (let i = 0; i < degre; i++) {
493
+ for (let j = 0; j < degre; j++) {
494
+ const suivant = j + 1 < degre ? resultat[j + 1] ?? 0 : 0;
495
+ resultat[j] = produit(resultat[j] ?? 0, racine) ^ suivant;
496
+ }
497
+ racine = produit(racine, 2);
498
+ }
499
+ return resultat;
500
+ }
501
+ function reste(donnees, diviseur) {
502
+ const resultat = new Array(diviseur.length).fill(0);
503
+ for (const octet of donnees) {
504
+ const facteur = octet ^ (resultat.shift() ?? 0);
505
+ resultat.push(0);
506
+ diviseur.forEach((coefficient, i) => {
507
+ resultat[i] = (resultat[i] ?? 0) ^ produit(coefficient, facteur);
508
+ });
509
+ }
510
+ return resultat;
511
+ }
512
+ function entrelacer(donnees, version, correction) {
513
+ const nombreDeBlocs = entree(BLOCS[correction], version);
514
+ const correctionParBloc = entree(CORRECTION_PAR_BLOC[correction], version);
515
+ const motsBruts = Math.floor(modulesDeDonnees(version) / 8);
516
+ const blocsCourts = nombreDeBlocs - motsBruts % nombreDeBlocs;
517
+ const longueurCourte = Math.floor(motsBruts / nombreDeBlocs);
518
+ const diviseur = generateur(correctionParBloc);
519
+ const blocs = [];
520
+ for (let i = 0, k = 0; i < nombreDeBlocs; i++) {
521
+ const longueur = longueurCourte - correctionParBloc + (i < blocsCourts ? 0 : 1);
522
+ const bloc = donnees.slice(k, k + longueur);
523
+ k += longueur;
524
+ const code = reste(bloc, diviseur);
525
+ if (i < blocsCourts) bloc.push(0);
526
+ blocs.push([...bloc, ...code]);
527
+ }
528
+ const resultat = [];
529
+ for (let i = 0; i <= longueurCourte; i++) blocs.forEach((bloc, j) => {
530
+ if (i === longueurCourte - correctionParBloc && j < blocsCourts) return;
531
+ resultat.push(bloc[i] ?? 0);
532
+ });
533
+ return resultat;
534
+ }
535
+ var Symbole = class {
536
+ version;
537
+ correction;
538
+ taille;
539
+ masque = 0;
540
+ sombres;
541
+ fonctions;
542
+ constructor(version, correction) {
543
+ this.version = version;
544
+ this.correction = correction;
545
+ this.taille = version * 4 + 17;
546
+ this.sombres = new Uint8Array(this.taille * this.taille);
547
+ this.fonctions = new Uint8Array(this.taille * this.taille);
548
+ }
549
+ matrice() {
550
+ return Array.from({ length: this.taille }, (_, y) => Array.from({ length: this.taille }, (__, x) => this.sombre(x, y)));
551
+ }
552
+ dessinerLesMotifs() {
553
+ for (let i = 0; i < this.taille; i++) {
554
+ this.poser(6, i, i % 2 === 0);
555
+ this.poser(i, 6, i % 2 === 0);
556
+ }
557
+ this.reperage(3, 3);
558
+ this.reperage(this.taille - 4, 3);
559
+ this.reperage(3, this.taille - 4);
560
+ const positions = this.positionsDAlignement();
561
+ const dernier = positions.length - 1;
562
+ positions.forEach((y, i) => {
563
+ positions.forEach((x, j) => {
564
+ if (!(i === 0 && j === 0 || i === 0 && j === dernier || i === dernier && j === 0)) this.alignement(x, y);
565
+ });
566
+ });
567
+ this.dessinerLeFormat(0);
568
+ this.dessinerLaVersion();
569
+ }
570
+ placerLesMots(mots) {
571
+ let i = 0;
572
+ const total = mots.length * 8;
573
+ for (let droite = this.taille - 1; droite >= 1; droite -= 2) {
574
+ if (droite === 6) droite = 5;
575
+ for (let rang = 0; rang < this.taille; rang++) for (let j = 0; j < 2; j++) {
576
+ const x = droite - j;
577
+ const y = (droite + 1 & 2) === 0 ? this.taille - 1 - rang : rang;
578
+ if (!this.estFonction(x, y) && i < total) {
579
+ this.ecrire(x, y, ((mots[i >>> 3] ?? 0) >>> 7 - (i & 7) & 1) === 1);
580
+ i++;
581
+ }
582
+ }
583
+ }
584
+ }
585
+ masquer(impose) {
586
+ let choisi = impose ?? 0;
587
+ if (impose === null) {
588
+ let moindre = Number.POSITIVE_INFINITY;
589
+ for (let masque = 0; masque < 8; masque++) {
590
+ this.appliquer(masque);
591
+ this.dessinerLeFormat(masque);
592
+ const penalite = this.penalite();
593
+ if (penalite < moindre) {
594
+ moindre = penalite;
595
+ choisi = masque;
596
+ }
597
+ this.appliquer(masque);
598
+ }
599
+ }
600
+ this.masque = choisi;
601
+ this.appliquer(choisi);
602
+ this.dessinerLeFormat(choisi);
603
+ }
604
+ sombre(x, y) {
605
+ return this.sombres[y * this.taille + x] === 1;
606
+ }
607
+ estFonction(x, y) {
608
+ return this.fonctions[y * this.taille + x] === 1;
609
+ }
610
+ ecrire(x, y, sombre) {
611
+ this.sombres[y * this.taille + x] = sombre ? 1 : 0;
612
+ }
613
+ poser(x, y, sombre) {
614
+ this.ecrire(x, y, sombre);
615
+ this.fonctions[y * this.taille + x] = 1;
616
+ }
617
+ reperage(cx, cy) {
618
+ for (let dy = -4; dy <= 4; dy++) for (let dx = -4; dx <= 4; dx++) {
619
+ const x = cx + dx;
620
+ const y = cy + dy;
621
+ if (x < 0 || x >= this.taille || y < 0 || y >= this.taille) continue;
622
+ const distance = Math.max(Math.abs(dx), Math.abs(dy));
623
+ this.poser(x, y, distance !== 2 && distance !== 4);
624
+ }
625
+ }
626
+ alignement(cx, cy) {
627
+ for (let dy = -2; dy <= 2; dy++) for (let dx = -2; dx <= 2; dx++) this.poser(cx + dx, cy + dy, Math.max(Math.abs(dx), Math.abs(dy)) !== 1);
628
+ }
629
+ positionsDAlignement() {
630
+ if (this.version === 1) return [];
631
+ const nombre = Math.floor(this.version / 7) + 2;
632
+ const pas = Math.floor((this.version * 8 + nombre * 3 + 5) / (nombre * 4 - 4)) * 2;
633
+ const resultat = [6];
634
+ for (let position = this.taille - 7; resultat.length < nombre; position -= pas) resultat.splice(1, 0, position);
635
+ return resultat;
636
+ }
637
+ dessinerLeFormat(masque) {
638
+ const donnees = BITS_DU_NIVEAU[this.correction] << 3 | masque;
639
+ let bch = donnees;
640
+ for (let i = 0; i < 10; i++) bch = bch << 1 ^ (bch >>> 9) * 1335;
641
+ const bits = (donnees << 10 | bch) ^ 21522;
642
+ const bit = (i) => (bits >>> i & 1) === 1;
643
+ for (let i = 0; i <= 5; i++) this.poser(8, i, bit(i));
644
+ this.poser(8, 7, bit(6));
645
+ this.poser(8, 8, bit(7));
646
+ this.poser(7, 8, bit(8));
647
+ for (let i = 9; i < 15; i++) this.poser(14 - i, 8, bit(i));
648
+ for (let i = 0; i < 8; i++) this.poser(this.taille - 1 - i, 8, bit(i));
649
+ for (let i = 8; i < 15; i++) this.poser(8, this.taille - 15 + i, bit(i));
650
+ this.poser(8, this.taille - 8, true);
651
+ }
652
+ dessinerLaVersion() {
653
+ if (this.version < 7) return;
654
+ let bch = this.version;
655
+ for (let i = 0; i < 12; i++) bch = bch << 1 ^ (bch >>> 11) * 7973;
656
+ const bits = this.version << 12 | bch;
657
+ for (let i = 0; i < 18; i++) {
658
+ const sombre = (bits >>> i & 1) === 1;
659
+ const a = this.taille - 11 + i % 3;
660
+ const b = Math.floor(i / 3);
661
+ this.poser(a, b, sombre);
662
+ this.poser(b, a, sombre);
663
+ }
664
+ }
665
+ appliquer(masque) {
666
+ for (let y = 0; y < this.taille; y++) for (let x = 0; x < this.taille; x++) if (!this.estFonction(x, y) && inverse(masque, x, y)) this.ecrire(x, y, !this.sombre(x, y));
667
+ }
668
+ penalite() {
669
+ let resultat = 0;
670
+ for (let axe = 0; axe < 2; axe++) for (let a = 0; a < this.taille; a++) {
671
+ const lire = (b) => axe === 0 ? this.sombre(b, a) : this.sombre(a, b);
672
+ let couleur = false;
673
+ let longueur = 0;
674
+ const historique = [
675
+ 0,
676
+ 0,
677
+ 0,
678
+ 0,
679
+ 0,
680
+ 0,
681
+ 0
682
+ ];
683
+ for (let b = 0; b < this.taille; b++) if (lire(b) === couleur) {
684
+ longueur++;
685
+ if (longueur === 5) resultat += PENALITE_SUITE;
686
+ else if (longueur > 5) resultat++;
687
+ } else {
688
+ this.ajouterALHistorique(longueur, historique);
689
+ if (!couleur) resultat += compterLesReperes(historique) * PENALITE_REPERE;
690
+ couleur = lire(b);
691
+ longueur = 1;
692
+ }
693
+ resultat += this.terminer(couleur, longueur, historique) * PENALITE_REPERE;
694
+ }
695
+ for (let y = 0; y < this.taille - 1; y++) for (let x = 0; x < this.taille - 1; x++) {
696
+ const couleur = this.sombre(x, y);
697
+ if (couleur === this.sombre(x + 1, y) && couleur === this.sombre(x, y + 1) && couleur === this.sombre(x + 1, y + 1)) resultat += PENALITE_CARRE;
698
+ }
699
+ const sombres = this.sombres.reduce((somme, module) => somme + module, 0);
700
+ const total = this.taille * this.taille;
701
+ const k = Math.ceil(Math.abs(sombres * 20 - total * 10) / total) - 1;
702
+ resultat += k * PENALITE_EQUILIBRE;
703
+ return resultat;
704
+ }
705
+ ajouterALHistorique(longueur, historique) {
706
+ const premiere = historique[0] === 0;
707
+ historique.pop();
708
+ historique.unshift(premiere ? longueur + this.taille : longueur);
709
+ }
710
+ terminer(couleur, longueur, historique) {
711
+ let courante = longueur;
712
+ if (couleur) {
713
+ this.ajouterALHistorique(courante, historique);
714
+ courante = 0;
715
+ }
716
+ this.ajouterALHistorique(courante + this.taille, historique);
717
+ return compterLesReperes(historique);
718
+ }
719
+ };
720
+ function compterLesReperes(historique) {
721
+ const [avant = 0, n = 0, b = 0, c = 0, d = 0, e = 0, apres = 0] = historique;
722
+ const coeur = n > 0 && b === n && c === n * 3 && d === n && e === n;
723
+ return (coeur && avant >= n * 4 && apres >= n ? 1 : 0) + (coeur && apres >= n * 4 && avant >= n ? 1 : 0);
724
+ }
725
+ function inverse(masque, x, y) {
726
+ switch (masque) {
727
+ case 0: return (x + y) % 2 === 0;
728
+ case 1: return y % 2 === 0;
729
+ case 2: return x % 3 === 0;
730
+ case 3: return (x + y) % 3 === 0;
731
+ case 4: return (Math.floor(x / 3) + Math.floor(y / 2)) % 2 === 0;
732
+ case 5: return x * y % 2 + x * y % 3 === 0;
733
+ case 6: return (x * y % 2 + x * y % 3) % 2 === 0;
734
+ default: return ((x + y) % 2 + x * y % 3) % 2 === 0;
735
+ }
736
+ }
737
+ var Bits = class {
738
+ bits = [];
739
+ get longueur() {
740
+ return this.bits.length;
741
+ }
742
+ ajouter(valeur, nombre) {
743
+ for (let i = nombre - 1; i >= 0; i--) this.bits.push(valeur >>> i & 1);
744
+ }
745
+ concatener(autres) {
746
+ this.bits.push(...autres.bits);
747
+ }
748
+ octets() {
749
+ const resultat = new Array(Math.ceil(this.bits.length / 8)).fill(0);
750
+ this.bits.forEach((bit, i) => {
751
+ resultat[i >>> 3] = (resultat[i >>> 3] ?? 0) | bit << 7 - (i & 7);
752
+ });
753
+ return resultat;
754
+ }
755
+ };
756
+ const ZONE_SILENCIEUSE = 4;
757
+ var StQrCode = class StQrCode {
758
+ valeur = input.required(...ngDevMode ? [{ debugName: "valeur" }] : /* istanbul ignore next */ []);
759
+ etiquette = input.required(...ngDevMode ? [{ debugName: "etiquette" }] : /* istanbul ignore next */ []);
760
+ taille = input(200, ...ngDevMode ? [{ debugName: "taille" }] : /* istanbul ignore next */ []);
761
+ correction = input("M", ...ngDevMode ? [{ debugName: "correction" }] : /* istanbul ignore next */ []);
762
+ complement = viewChild.required("complement", ...ngDevMode ? [{ debugName: "complement" }] : /* istanbul ignore next */ []);
763
+ matrice = computed(() => {
764
+ try {
765
+ return encoderQr(this.valeur(), { correction: this.correction() });
766
+ } catch (erreur) {
767
+ if (isDevMode()) console.error("st-qr-code :", erreur);
768
+ return null;
769
+ }
770
+ }, ...ngDevMode ? [{ debugName: "matrice" }] : /* istanbul ignore next */ []);
771
+ cote = computed(() => (this.matrice()?.taille ?? 0) + 2 * ZONE_SILENCIEUSE, ...ngDevMode ? [{ debugName: "cote" }] : /* istanbul ignore next */ []);
772
+ sombres = computed(() => {
773
+ const matrice = this.matrice();
774
+ if (matrice === null) return [];
775
+ const resultat = [];
776
+ matrice.modules.forEach((ligne, y) => {
777
+ ligne.forEach((sombre, x) => {
778
+ if (sombre) resultat.push({
779
+ x: x + ZONE_SILENCIEUSE,
780
+ y: y + ZONE_SILENCIEUSE
781
+ });
782
+ });
783
+ });
784
+ return resultat;
785
+ }, ...ngDevMode ? [{ debugName: "sombres" }] : /* istanbul ignore next */ []);
786
+ constructor() {
787
+ afterNextRender(() => {
788
+ if (!isDevMode()) return;
789
+ if (this.complement().nativeElement.textContent.trim() === "") console.warn("st-qr-code : aucun [complement] ; un code QR ne se lit ni a l oreille ni sur l ecran qui l affiche, projetez la meme information en texte.");
790
+ });
791
+ }
792
+ static ɵfac = i0.ɵɵngDeclareFactory({
793
+ minVersion: "12.0.0",
794
+ version: "22.2.0",
795
+ ngImport: i0,
796
+ type: StQrCode,
797
+ deps: [],
798
+ target: i0.ɵɵFactoryTarget.Component
799
+ });
800
+ static ɵcmp = i0.ɵɵngDeclareComponent({
801
+ minVersion: "17.0.0",
802
+ version: "22.2.0",
803
+ type: StQrCode,
804
+ isStandalone: true,
805
+ selector: "st-qr-code",
806
+ inputs: {
807
+ valeur: {
808
+ classPropertyName: "valeur",
809
+ publicName: "valeur",
810
+ isSignal: true,
811
+ isRequired: true,
812
+ transformFunction: null
813
+ },
814
+ etiquette: {
815
+ classPropertyName: "etiquette",
816
+ publicName: "etiquette",
817
+ isSignal: true,
818
+ isRequired: true,
819
+ transformFunction: null
820
+ },
821
+ taille: {
822
+ classPropertyName: "taille",
823
+ publicName: "taille",
824
+ isSignal: true,
825
+ isRequired: false,
826
+ transformFunction: null
827
+ },
828
+ correction: {
829
+ classPropertyName: "correction",
830
+ publicName: "correction",
831
+ isSignal: true,
832
+ isRequired: false,
833
+ transformFunction: null
834
+ }
835
+ },
836
+ host: { classAttribute: "st-qr-code" },
837
+ viewQueries: [{
838
+ propertyName: "complement",
839
+ first: true,
840
+ predicate: ["complement"],
841
+ descendants: true,
842
+ isSignal: true
843
+ }],
844
+ ngImport: i0,
845
+ template: "@if (matrice(); as symbole) {\n <svg\n class=\"st-qr-code__symbole\"\n role=\"img\"\n xmlns=\"http://www.w3.org/2000/svg\"\n shape-rendering=\"crispEdges\"\n [attr.aria-label]=\"etiquette()\"\n [attr.width]=\"taille()\"\n [attr.height]=\"taille()\"\n [attr.viewBox]=\"'0 0 ' + cote() + ' ' + cote()\"\n [attr.data-version]=\"symbole.version\"\n >\n <rect class=\"st-qr-code__fond\" x=\"0\" y=\"0\" [attr.width]=\"cote()\" [attr.height]=\"cote()\" />\n @for (module of sombres(); track $index) {\n <rect\n class=\"st-qr-code__module\"\n [attr.x]=\"module.x\"\n [attr.y]=\"module.y\"\n width=\"1\"\n height=\"1\"\n />\n }\n </svg>\n}\n<div #complement class=\"st-qr-code__complement\"><ng-content select=\"[complement]\" /></div>\n",
846
+ styles: [".st-vh{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}:host([hidden]){display:none!important}:host{display:inline-flex;flex-direction:column;gap:var(--st-espacement-3);align-items:center;max-inline-size:100%}.st-qr-code__symbole{display:block;max-inline-size:100%;block-size:auto;color-scheme:light;color:var(--st-couleur-texte);-webkit-print-color-adjust:exact;print-color-adjust:exact}.st-qr-code__fond{fill:var(--st-couleur-surface)}.st-qr-code__module{fill:currentColor}.st-qr-code__complement{font-size:var(--st-taille-sm);line-height:var(--st-interligne-sm);font-weight:var(--st-graisse-normale);letter-spacing:var(--st-interlettrage-normal);max-inline-size:36ch;overflow-wrap:anywhere;color:var(--st-couleur-texte-discret);text-align:center}.st-qr-code__complement:empty{display:none}\n"],
847
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
848
+ });
849
+ };
850
+ i0.ɵɵngDeclareClassMetadata({
851
+ minVersion: "12.0.0",
852
+ version: "22.2.0",
853
+ ngImport: i0,
854
+ type: StQrCode,
855
+ decorators: [{
856
+ type: Component,
857
+ args: [{
858
+ selector: "st-qr-code",
859
+ changeDetection: ChangeDetectionStrategy.OnPush,
860
+ host: { class: "st-qr-code" },
861
+ template: "@if (matrice(); as symbole) {\n <svg\n class=\"st-qr-code__symbole\"\n role=\"img\"\n xmlns=\"http://www.w3.org/2000/svg\"\n shape-rendering=\"crispEdges\"\n [attr.aria-label]=\"etiquette()\"\n [attr.width]=\"taille()\"\n [attr.height]=\"taille()\"\n [attr.viewBox]=\"'0 0 ' + cote() + ' ' + cote()\"\n [attr.data-version]=\"symbole.version\"\n >\n <rect class=\"st-qr-code__fond\" x=\"0\" y=\"0\" [attr.width]=\"cote()\" [attr.height]=\"cote()\" />\n @for (module of sombres(); track $index) {\n <rect\n class=\"st-qr-code__module\"\n [attr.x]=\"module.x\"\n [attr.y]=\"module.y\"\n width=\"1\"\n height=\"1\"\n />\n }\n </svg>\n}\n<div #complement class=\"st-qr-code__complement\"><ng-content select=\"[complement]\" /></div>\n",
862
+ styles: [".st-vh{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}:host([hidden]){display:none!important}:host{display:inline-flex;flex-direction:column;gap:var(--st-espacement-3);align-items:center;max-inline-size:100%}.st-qr-code__symbole{display:block;max-inline-size:100%;block-size:auto;color-scheme:light;color:var(--st-couleur-texte);-webkit-print-color-adjust:exact;print-color-adjust:exact}.st-qr-code__fond{fill:var(--st-couleur-surface)}.st-qr-code__module{fill:currentColor}.st-qr-code__complement{font-size:var(--st-taille-sm);line-height:var(--st-interligne-sm);font-weight:var(--st-graisse-normale);letter-spacing:var(--st-interlettrage-normal);max-inline-size:36ch;overflow-wrap:anywhere;color:var(--st-couleur-texte-discret);text-align:center}.st-qr-code__complement:empty{display:none}\n"]
863
+ }]
864
+ }],
865
+ ctorParameters: () => [],
866
+ propDecorators: {
867
+ valeur: [{
868
+ type: i0.Input,
869
+ args: [{
870
+ isSignal: true,
871
+ alias: "valeur",
872
+ required: true
873
+ }]
874
+ }],
875
+ etiquette: [{
876
+ type: i0.Input,
877
+ args: [{
878
+ isSignal: true,
879
+ alias: "etiquette",
880
+ required: true
881
+ }]
882
+ }],
883
+ taille: [{
884
+ type: i0.Input,
885
+ args: [{
886
+ isSignal: true,
887
+ alias: "taille",
888
+ required: false
889
+ }]
890
+ }],
891
+ correction: [{
892
+ type: i0.Input,
893
+ args: [{
894
+ isSignal: true,
895
+ alias: "correction",
896
+ required: false
897
+ }]
898
+ }],
899
+ complement: [{
900
+ type: i0.ViewChild,
901
+ args: ["complement", { isSignal: true }]
902
+ }]
903
+ }
904
+ });
905
+ export { StQrCode, encoderQr };
906
+
907
+ //# sourceMappingURL=starterlib-ui-qr.mjs.map