iss-ctrl 0.0.21 → 0.0.23

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 (141) hide show
  1. package/README.md +33 -0
  2. package/fesm2022/iss-ctrl-attachment.viewer-DVUL39xd.mjs +110 -0
  3. package/fesm2022/iss-ctrl-attachment.viewer-DVUL39xd.mjs.map +1 -0
  4. package/fesm2022/iss-ctrl-base.mjs +682 -0
  5. package/fesm2022/iss-ctrl-base.mjs.map +1 -0
  6. package/fesm2022/iss-ctrl-checkbox.field-CILXADas.mjs +88 -0
  7. package/fesm2022/iss-ctrl-checkbox.field-CILXADas.mjs.map +1 -0
  8. package/fesm2022/iss-ctrl-checkbox.mjs +146 -0
  9. package/fesm2022/iss-ctrl-checkbox.mjs.map +1 -0
  10. package/fesm2022/iss-ctrl-checkbox.viewer-C3SEUszR.mjs +31 -0
  11. package/fesm2022/iss-ctrl-checkbox.viewer-C3SEUszR.mjs.map +1 -0
  12. package/fesm2022/iss-ctrl-chips.field-445Ds3V7.mjs +76 -0
  13. package/fesm2022/iss-ctrl-chips.field-445Ds3V7.mjs.map +1 -0
  14. package/fesm2022/iss-ctrl-chips.mjs +168 -0
  15. package/fesm2022/iss-ctrl-chips.mjs.map +1 -0
  16. package/fesm2022/iss-ctrl-chips.viewer-BcKT2hcq.mjs +38 -0
  17. package/fesm2022/iss-ctrl-chips.viewer-BcKT2hcq.mjs.map +1 -0
  18. package/fesm2022/iss-ctrl-date-picker.field-Djhh1FsR.mjs +98 -0
  19. package/fesm2022/iss-ctrl-date-picker.field-Djhh1FsR.mjs.map +1 -0
  20. package/fesm2022/iss-ctrl-date-picker.mjs +200 -0
  21. package/fesm2022/iss-ctrl-date-picker.mjs.map +1 -0
  22. package/fesm2022/iss-ctrl-date-picker.viewer-Dsmsf91t.mjs +40 -0
  23. package/fesm2022/iss-ctrl-date-picker.viewer-Dsmsf91t.mjs.map +1 -0
  24. package/fesm2022/iss-ctrl-date-range-picker.field-Dv636SAm.mjs +97 -0
  25. package/fesm2022/iss-ctrl-date-range-picker.field-Dv636SAm.mjs.map +1 -0
  26. package/fesm2022/iss-ctrl-date-range-picker.mjs +307 -0
  27. package/fesm2022/iss-ctrl-date-range-picker.mjs.map +1 -0
  28. package/fesm2022/iss-ctrl-date-range-picker.viewer-tmTQGPFh.mjs +41 -0
  29. package/fesm2022/iss-ctrl-date-range-picker.viewer-tmTQGPFh.mjs.map +1 -0
  30. package/fesm2022/iss-ctrl-datetime-picker.field-DldY8vke.mjs +98 -0
  31. package/fesm2022/iss-ctrl-datetime-picker.field-DldY8vke.mjs.map +1 -0
  32. package/fesm2022/iss-ctrl-datetime-picker.mjs +226 -0
  33. package/fesm2022/iss-ctrl-datetime-picker.mjs.map +1 -0
  34. package/fesm2022/iss-ctrl-datetime-picker.viewer-BeUyEBKo.mjs +42 -0
  35. package/fesm2022/iss-ctrl-datetime-picker.viewer-BeUyEBKo.mjs.map +1 -0
  36. package/fesm2022/iss-ctrl-dropdownlist.field-DikBAtc_.mjs +87 -0
  37. package/fesm2022/iss-ctrl-dropdownlist.field-DikBAtc_.mjs.map +1 -0
  38. package/fesm2022/iss-ctrl-dropdownlist.mjs +398 -0
  39. package/fesm2022/iss-ctrl-dropdownlist.mjs.map +1 -0
  40. package/fesm2022/iss-ctrl-dropdownlist.viewer-OWJxDpr8.mjs +30 -0
  41. package/fesm2022/iss-ctrl-dropdownlist.viewer-OWJxDpr8.mjs.map +1 -0
  42. package/fesm2022/iss-ctrl-file-picker.field-BMZaJxvj.mjs +210 -0
  43. package/fesm2022/iss-ctrl-file-picker.field-BMZaJxvj.mjs.map +1 -0
  44. package/fesm2022/iss-ctrl-file-picker.mjs +274 -0
  45. package/fesm2022/iss-ctrl-file-picker.mjs.map +1 -0
  46. package/fesm2022/iss-ctrl-input.field-BiwBFYx3.mjs +104 -0
  47. package/fesm2022/iss-ctrl-input.field-BiwBFYx3.mjs.map +1 -0
  48. package/fesm2022/iss-ctrl-input.mjs +204 -0
  49. package/fesm2022/iss-ctrl-input.mjs.map +1 -0
  50. package/fesm2022/iss-ctrl-input.viewer-BOZnW0_e.mjs +22 -0
  51. package/fesm2022/iss-ctrl-input.viewer-BOZnW0_e.mjs.map +1 -0
  52. package/fesm2022/iss-ctrl-iss-ctrl-BG-QWWdq.mjs +1770 -0
  53. package/fesm2022/iss-ctrl-iss-ctrl-BG-QWWdq.mjs.map +1 -0
  54. package/fesm2022/{iss-ctrl-load-event-bOt6IlIo.mjs → iss-ctrl-load-event-T4L3k9XO.mjs} +4 -3
  55. package/fesm2022/iss-ctrl-load-event-T4L3k9XO.mjs.map +1 -0
  56. package/fesm2022/{iss-ctrl-load-options-event-CxyAyNMe.mjs → iss-ctrl-load-options-event-tG258cbP.mjs} +3 -3
  57. package/fesm2022/{iss-ctrl-load-options-event-CxyAyNMe.mjs.map → iss-ctrl-load-options-event-tG258cbP.mjs.map} +1 -1
  58. package/fesm2022/{iss-ctrl-load-value-event-DJKJ5S3h.mjs → iss-ctrl-load-value-event--7zt90Dl.mjs} +3 -3
  59. package/fesm2022/{iss-ctrl-load-value-event-DJKJ5S3h.mjs.map → iss-ctrl-load-value-event--7zt90Dl.mjs.map} +1 -1
  60. package/fesm2022/iss-ctrl-mobile.field-DLccnWKX.mjs +77 -0
  61. package/fesm2022/iss-ctrl-mobile.field-DLccnWKX.mjs.map +1 -0
  62. package/fesm2022/iss-ctrl-mobile.mjs +2465 -0
  63. package/fesm2022/iss-ctrl-mobile.mjs.map +1 -0
  64. package/fesm2022/iss-ctrl-mobile.viewer-DQgxAcR-.mjs +22 -0
  65. package/fesm2022/iss-ctrl-mobile.viewer-DQgxAcR-.mjs.map +1 -0
  66. package/fesm2022/{iss-ctrl-note.field-B_Lbp28X.mjs → iss-ctrl-note.field-CT1wVmfF.mjs} +2 -2
  67. package/fesm2022/{iss-ctrl-note.field-B_Lbp28X.mjs.map → iss-ctrl-note.field-CT1wVmfF.mjs.map} +1 -1
  68. package/fesm2022/iss-ctrl-plate.field-CQQY8rnE.mjs +92 -0
  69. package/fesm2022/iss-ctrl-plate.field-CQQY8rnE.mjs.map +1 -0
  70. package/fesm2022/iss-ctrl-plate.mjs +493 -0
  71. package/fesm2022/iss-ctrl-plate.mjs.map +1 -0
  72. package/fesm2022/iss-ctrl-plate.viewer-B8PUBLH8.mjs +179 -0
  73. package/fesm2022/iss-ctrl-plate.viewer-B8PUBLH8.mjs.map +1 -0
  74. package/fesm2022/iss-ctrl-radio.field-Dp5D-AXQ.mjs +88 -0
  75. package/fesm2022/iss-ctrl-radio.field-Dp5D-AXQ.mjs.map +1 -0
  76. package/fesm2022/iss-ctrl-radio.mjs +104 -0
  77. package/fesm2022/iss-ctrl-radio.mjs.map +1 -0
  78. package/fesm2022/iss-ctrl-radio.viewer-EiDliZro.mjs +30 -0
  79. package/fesm2022/iss-ctrl-radio.viewer-EiDliZro.mjs.map +1 -0
  80. package/fesm2022/{iss-ctrl-replace-api-keys-C0XYQW4i.mjs → iss-ctrl-replace-api-keys-COUv4Kin.mjs} +2 -2
  81. package/fesm2022/{iss-ctrl-replace-api-keys-C0XYQW4i.mjs.map → iss-ctrl-replace-api-keys-COUv4Kin.mjs.map} +1 -1
  82. package/fesm2022/{iss-ctrl-set-value-event-CgXhi0Bv.mjs → iss-ctrl-set-value-event-D0-_qIyS.mjs} +2 -2
  83. package/fesm2022/{iss-ctrl-set-value-event-CgXhi0Bv.mjs.map → iss-ctrl-set-value-event-D0-_qIyS.mjs.map} +1 -1
  84. package/fesm2022/iss-ctrl-slide-toggle.field-vCJHOiSG.mjs +85 -0
  85. package/fesm2022/iss-ctrl-slide-toggle.field-vCJHOiSG.mjs.map +1 -0
  86. package/fesm2022/iss-ctrl-slide-toggle.mjs +66 -0
  87. package/fesm2022/iss-ctrl-slide-toggle.mjs.map +1 -0
  88. package/fesm2022/iss-ctrl-slide-toggle.viewer-hsIHwDj3.mjs +34 -0
  89. package/fesm2022/iss-ctrl-slide-toggle.viewer-hsIHwDj3.mjs.map +1 -0
  90. package/fesm2022/{iss-ctrl-table.field-B5FxF6hn.mjs → iss-ctrl-table.field-DdFjH-D8.mjs} +142 -140
  91. package/fesm2022/iss-ctrl-table.field-DdFjH-D8.mjs.map +1 -0
  92. package/fesm2022/iss-ctrl-textarea.field-Dqhhu2m4.mjs +82 -0
  93. package/fesm2022/iss-ctrl-textarea.field-Dqhhu2m4.mjs.map +1 -0
  94. package/fesm2022/iss-ctrl-textarea.mjs +115 -0
  95. package/fesm2022/iss-ctrl-textarea.mjs.map +1 -0
  96. package/fesm2022/iss-ctrl-textarea.viewer-CpmLauik.mjs +22 -0
  97. package/fesm2022/iss-ctrl-textarea.viewer-CpmLauik.mjs.map +1 -0
  98. package/fesm2022/iss-ctrl-time-picker.field-CdmxRiH8.mjs +77 -0
  99. package/fesm2022/iss-ctrl-time-picker.field-CdmxRiH8.mjs.map +1 -0
  100. package/fesm2022/iss-ctrl-time-picker.mjs +170 -0
  101. package/fesm2022/iss-ctrl-time-picker.mjs.map +1 -0
  102. package/fesm2022/iss-ctrl-time-picker.viewer-CJeFLrdI.mjs +22 -0
  103. package/fesm2022/iss-ctrl-time-picker.viewer-CJeFLrdI.mjs.map +1 -0
  104. package/fesm2022/iss-ctrl-toggle-button.field-rAT7dVFC.mjs +101 -0
  105. package/fesm2022/iss-ctrl-toggle-button.field-rAT7dVFC.mjs.map +1 -0
  106. package/fesm2022/iss-ctrl-toggle-button.mjs +158 -0
  107. package/fesm2022/iss-ctrl-toggle-button.mjs.map +1 -0
  108. package/fesm2022/iss-ctrl-toggle-button.viewer-CC-8_Dy4.mjs +30 -0
  109. package/fesm2022/iss-ctrl-toggle-button.viewer-CC-8_Dy4.mjs.map +1 -0
  110. package/fesm2022/iss-ctrl-tokens.mjs +25 -0
  111. package/fesm2022/iss-ctrl-tokens.mjs.map +1 -0
  112. package/fesm2022/{iss-ctrl-trigger-based-on-json-value-2v1kLVHZ.mjs → iss-ctrl-trigger-based-on-json-value-I92SNsv9.mjs} +2 -2
  113. package/fesm2022/{iss-ctrl-trigger-based-on-json-value-2v1kLVHZ.mjs.map → iss-ctrl-trigger-based-on-json-value-I92SNsv9.mjs.map} +1 -1
  114. package/fesm2022/{iss-ctrl-user-picker.field-BH63sZ-X.mjs → iss-ctrl-user-picker.field-DpmYCfpD.mjs} +154 -153
  115. package/fesm2022/iss-ctrl-user-picker.field-DpmYCfpD.mjs.map +1 -0
  116. package/fesm2022/iss-ctrl.mjs +3 -1
  117. package/fesm2022/iss-ctrl.mjs.map +1 -1
  118. package/package.json +69 -1
  119. package/types/iss-ctrl-base.d.ts +318 -0
  120. package/types/iss-ctrl-checkbox.d.ts +46 -0
  121. package/types/iss-ctrl-chips.d.ts +41 -0
  122. package/types/iss-ctrl-date-picker.d.ts +75 -0
  123. package/types/iss-ctrl-date-range-picker.d.ts +95 -0
  124. package/types/iss-ctrl-datetime-picker.d.ts +77 -0
  125. package/types/iss-ctrl-dropdownlist.d.ts +78 -0
  126. package/types/iss-ctrl-file-picker.d.ts +95 -0
  127. package/types/iss-ctrl-input.d.ts +76 -0
  128. package/types/iss-ctrl-mobile.d.ts +91 -0
  129. package/types/iss-ctrl-plate.d.ts +54 -0
  130. package/types/iss-ctrl-radio.d.ts +34 -0
  131. package/types/iss-ctrl-slide-toggle.d.ts +26 -0
  132. package/types/iss-ctrl-textarea.d.ts +30 -0
  133. package/types/iss-ctrl-time-picker.d.ts +48 -0
  134. package/types/iss-ctrl-toggle-button.d.ts +41 -0
  135. package/types/iss-ctrl-tokens.d.ts +21 -0
  136. package/types/iss-ctrl.d.ts +303 -2005
  137. package/fesm2022/iss-ctrl-iss-ctrl-BKu6a5HF.mjs +0 -9683
  138. package/fesm2022/iss-ctrl-iss-ctrl-BKu6a5HF.mjs.map +0 -1
  139. package/fesm2022/iss-ctrl-load-event-bOt6IlIo.mjs.map +0 -1
  140. package/fesm2022/iss-ctrl-table.field-B5FxF6hn.mjs.map +0 -1
  141. package/fesm2022/iss-ctrl-user-picker.field-BH63sZ-X.mjs.map +0 -1
@@ -0,0 +1,493 @@
1
+ import * as i0 from '@angular/core';
2
+ import { signal, inject, ElementRef, Component } from '@angular/core';
3
+ import { ReactiveFormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';
4
+ import { ControlBase } from 'iss-ctrl/base';
5
+
6
+ const PLATE_LETTERS = [
7
+ { label: { ar: "أ", en: "A" }, value: "A" },
8
+ { label: { ar: "ب", en: "B" }, value: "B" },
9
+ { label: { ar: "ح", en: "J" }, value: "J" },
10
+ { label: { ar: "د", en: "D" }, value: "D" },
11
+ { label: { ar: "ر", en: "R" }, value: "R" },
12
+ { label: { ar: "س", en: "S" }, value: "S" },
13
+ { label: { ar: "ص", en: "X" }, value: "X" },
14
+ { label: { ar: "ط", en: "T" }, value: "T" },
15
+ { label: { ar: "ع", en: "E" }, value: "E" },
16
+ { label: { ar: "ق", en: "G" }, value: "G" },
17
+ { label: { ar: "ك", en: "K" }, value: "K" },
18
+ { label: { ar: "ل", en: "L" }, value: "L" },
19
+ { label: { ar: "م", en: "Z" }, value: "Z" },
20
+ { label: { ar: "ن", en: "N" }, value: "N" },
21
+ { label: { ar: "هـ", en: "H" }, value: "H" },
22
+ { label: { ar: "و", en: "U" }, value: "U" },
23
+ { label: { ar: "ي", en: "V" }, value: "V" }
24
+ ];
25
+
26
+ /**
27
+ * `<iss-ctrl-plate-number>` — Saudi vehicle plate, entered as digits and letters in both
28
+ * Arabic and English.
29
+ *
30
+ * Typing into one script fills the matching cell in the other automatically, and letters are
31
+ * validated against the allowed plate alphabet.
32
+ *
33
+ * @example
34
+ * ```html
35
+ * <iss-ctrl-plate-number formControlName="plate" [readonly]="false"/>
36
+ * ```
37
+ *
38
+ * ### Own inputs
39
+ * None — the control is configured entirely through the inherited properties.
40
+ *
41
+ * ### Inherited from {@link ControlBase}
42
+ * `formControlName` · `readonly` · `className` · `(onChange)`
43
+ *
44
+ * Projects a `<label>` above the control — the wrapping `iss-field-*` passes the field label in that way.
45
+ */
46
+ class PlateControl extends ControlBase {
47
+ numbersAr = signal(Array(4).fill(""), ...(ngDevMode ? [{ debugName: "numbersAr" }] : /* istanbul ignore next */ []));
48
+ numbersEn = signal(Array(4).fill(""), ...(ngDevMode ? [{ debugName: "numbersEn" }] : /* istanbul ignore next */ []));
49
+ lettersAr = signal(Array(3).fill(""), ...(ngDevMode ? [{ debugName: "lettersAr" }] : /* istanbul ignore next */ []));
50
+ lettersEn = signal(Array(3).fill(""), ...(ngDevMode ? [{ debugName: "lettersEn" }] : /* istanbul ignore next */ []));
51
+ letterErrors = signal(Array(3).fill(false), ...(ngDevMode ? [{ debugName: "letterErrors" }] : /* istanbul ignore next */ []));
52
+ #host = inject(ElementRef);
53
+ writeValue(value) {
54
+ if (!value) {
55
+ this.#resetPlate();
56
+ return;
57
+ }
58
+ const parts = value.split("-");
59
+ const letters = parts[0]?.split("") || [];
60
+ const numbers = parts[1]?.split("") || [];
61
+ // Initialize letters
62
+ const lAr = [];
63
+ const lEn = [];
64
+ for (let i = 0; i < 3; i++) {
65
+ const char = letters[i] || "";
66
+ if (char) {
67
+ const plateLetter = PLATE_LETTERS.find(l => l.value === char || l.label.en === char || l.label.ar === char);
68
+ if (plateLetter) {
69
+ lAr.push(plateLetter.label.ar);
70
+ lEn.push(plateLetter.label.en);
71
+ }
72
+ else {
73
+ lAr.push("");
74
+ lEn.push("");
75
+ }
76
+ }
77
+ else {
78
+ lAr.push("");
79
+ lEn.push("");
80
+ }
81
+ }
82
+ this.lettersAr.set(lAr);
83
+ this.lettersEn.set(lEn);
84
+ // Initialize numbers
85
+ const nAr = [];
86
+ const nEn = [];
87
+ for (let i = 0; i < 4; i++) {
88
+ const char = numbers[i] || "";
89
+ if (char) {
90
+ nAr.push(this.convertDigit(char, "ar"));
91
+ nEn.push(this.convertDigit(char, "en"));
92
+ }
93
+ else {
94
+ nAr.push("");
95
+ nEn.push("");
96
+ }
97
+ }
98
+ this.numbersAr.set(nAr);
99
+ this.numbersEn.set(nEn);
100
+ }
101
+ onNumberInput(index, event, lang) {
102
+ if (this.readonly()) {
103
+ return;
104
+ }
105
+ const input = event.target;
106
+ let value = input.value;
107
+ // Allow only numbers
108
+ if (!/^[0-9\u0660-\u0669]*$/.test(value)) {
109
+ return;
110
+ }
111
+ input.value = lang === "ar" ? this.numbersAr()[index] : this.numbersEn()[index];
112
+ // Take only the last character if multiple characters are entered
113
+ if (value.length > 1) {
114
+ value = value.slice(-1);
115
+ input.value = value;
116
+ }
117
+ if (!value) {
118
+ const newAr = [...this.numbersAr()];
119
+ const newEn = [...this.numbersEn()];
120
+ newAr[index] = "";
121
+ newEn[index] = "";
122
+ this.numbersAr.set(newAr);
123
+ this.numbersEn.set(newEn);
124
+ this.emitPlate();
125
+ return;
126
+ }
127
+ const arDigits = ["٠", "١", "٢", "٣", "٤", "٥", "٦", "٧", "٨", "٩"];
128
+ const enDigits = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"];
129
+ let digitIndex = enDigits.indexOf(value);
130
+ if (digitIndex === -1) {
131
+ digitIndex = arDigits.indexOf(value);
132
+ }
133
+ const newAr = [...this.numbersAr()];
134
+ const newEn = [...this.numbersEn()];
135
+ if (digitIndex !== -1) {
136
+ newAr[index] = arDigits[digitIndex];
137
+ newEn[index] = enDigits[digitIndex];
138
+ // Focus next
139
+ if (index < 3) {
140
+ this.focusInput(`num-${lang}-${index + 1}`);
141
+ }
142
+ else {
143
+ this.focusInput(`let-${lang}-0`);
144
+ }
145
+ }
146
+ else {
147
+ // Should not happen due to regex check, but safe fallback
148
+ newAr[index] = "";
149
+ newEn[index] = "";
150
+ }
151
+ this.numbersAr.set(newAr);
152
+ this.numbersEn.set(newEn);
153
+ this.emitPlate();
154
+ }
155
+ onLetterInput(index, event, lang) {
156
+ if (this.readonly()) {
157
+ return;
158
+ }
159
+ const input = event.target;
160
+ let value = input.value;
161
+ if (!value) {
162
+ const newAr = [...this.lettersAr()];
163
+ const newEn = [...this.lettersEn()];
164
+ const newErrors = [...this.letterErrors()];
165
+ newAr[index] = "";
166
+ newEn[index] = "";
167
+ newErrors[index] = false;
168
+ this.lettersAr.set(newAr);
169
+ this.lettersEn.set(newEn);
170
+ this.letterErrors.set(newErrors);
171
+ this.emitPlate();
172
+ return;
173
+ }
174
+ // Take only the last character
175
+ if (value.length > 1) {
176
+ value = value.slice(-1);
177
+ input.value = value;
178
+ }
179
+ const plateLetter = PLATE_LETTERS.find(l => l.value === value.toUpperCase() ||
180
+ l.label.en === value.toUpperCase() ||
181
+ l.label.ar === value);
182
+ const newAr = [...this.lettersAr()];
183
+ const newEn = [...this.lettersEn()];
184
+ const newErrors = [...this.letterErrors()];
185
+ if (plateLetter) {
186
+ newAr[index] = plateLetter.label.ar;
187
+ newEn[index] = plateLetter.label.en;
188
+ newErrors[index] = false;
189
+ // Focus next
190
+ if (index < 2) {
191
+ this.focusInput(`let-${lang}-${index + 1}`);
192
+ }
193
+ else {
194
+ this.focusInput(`num-${lang}-0`);
195
+ }
196
+ }
197
+ else {
198
+ // Show error
199
+ if (lang === "ar") {
200
+ newAr[index] = value;
201
+ newEn[index] = ""; // Or keep previous?
202
+ }
203
+ else {
204
+ newEn[index] = value;
205
+ newAr[index] = "";
206
+ }
207
+ newErrors[index] = true;
208
+ }
209
+ this.lettersAr.set(newAr);
210
+ this.lettersEn.set(newEn);
211
+ this.letterErrors.set(newErrors);
212
+ this.emitPlate();
213
+ }
214
+ preventNonDigits($event, ar) {
215
+ if ($event.key.length === 1 && !/^[0-9\u0660-\u0669]$/.test($event.key)) {
216
+ $event.preventDefault();
217
+ }
218
+ }
219
+ #resetPlate() {
220
+ this.numbersAr.set(Array(4).fill(""));
221
+ this.numbersEn.set(Array(4).fill(""));
222
+ this.lettersAr.set(Array(3).fill(""));
223
+ this.lettersEn.set(Array(3).fill(""));
224
+ this.letterErrors.set(Array(3).fill(false));
225
+ this.ctrl.setValue(null, { emitEvent: false });
226
+ }
227
+ emitPlate() {
228
+ this.markAsTouched();
229
+ this.emitValue(this.stringifyPlate());
230
+ }
231
+ stringifyPlate() {
232
+ // lettersEn holds PlateLetter.label.en, which equals PlateLetter.value for every entry,
233
+ // so this round-trips through writeValue and the viewer. Invalid letters are held in the
234
+ // opposite-language row and serialize as empty.
235
+ const letters = this.lettersEn().join("");
236
+ const numbers = this.numbersEn().join("");
237
+ if (!letters && !numbers) {
238
+ return null;
239
+ }
240
+ return `${letters}-${numbers}`;
241
+ }
242
+ focusInput(id) {
243
+ setTimeout(() => {
244
+ // scoped to this host: several plates can be on the same page
245
+ const element = this.#host.nativeElement.querySelector("[data-plate-input=\"" + id + "\"]");
246
+ if (element) {
247
+ element.focus();
248
+ // Optional: Select text so user can overwrite easily if they cycle back
249
+ element.select();
250
+ }
251
+ }, 0);
252
+ }
253
+ convertDigit(digit, toLang) {
254
+ const arDigits = ["٠", "١", "٢", "٣", "٤", "٥", "٦", "٧", "٨", "٩"];
255
+ const enDigits = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"];
256
+ if (toLang === "ar") {
257
+ const index = enDigits.indexOf(digit);
258
+ return index !== -1 ? arDigits[index] : digit;
259
+ }
260
+ else {
261
+ const index = arDigits.indexOf(digit);
262
+ return index !== -1 ? enDigits[index] : digit;
263
+ }
264
+ }
265
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: PlateControl, deps: null, target: i0.ɵɵFactoryTarget.Component });
266
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: PlateControl, isStandalone: true, selector: "iss-ctrl-plate-number", providers: [
267
+ { provide: NG_VALUE_ACCESSOR, useExisting: PlateControl, multi: true }
268
+ ], usesInheritance: true, ngImport: i0, template: `
269
+ <ng-content select="label"></ng-content>
270
+ <div class="plate-container">
271
+ <div class="section numbers-section">
272
+ <div class="digit-row">
273
+ @for (num of numbersAr(); track $index) {
274
+ <input
275
+ type="text"
276
+ class="plate-input number-input"
277
+ maxlength="1"
278
+ [attr.data-plate-input]="'num-ar-' + $index"
279
+ [value]="num"
280
+ [readonly]="readonly()"
281
+ placeholder="١"
282
+ (keydown)="preventNonDigits($event, 'ar')"
283
+ (keyup)="preventNonDigits($event, 'ar')"
284
+ (input)="onNumberInput($index, $event, 'ar')"
285
+ />
286
+ }
287
+ </div>
288
+
289
+ <div class="digit-row">
290
+ @for (num of numbersEn(); track $index) {
291
+ <input
292
+ type="text"
293
+ class="plate-input number-input"
294
+ maxlength="1"
295
+ [attr.data-plate-input]="'num-en-' + $index"
296
+ [value]="num"
297
+ [readonly]="readonly()"
298
+ placeholder="1"
299
+ (keydown)="preventNonDigits($event, 'en')"
300
+ (keyup)="preventNonDigits($event, 'en')"
301
+ (input)="onNumberInput($index, $event, 'en')"
302
+ />
303
+ }
304
+ </div>
305
+ </div>
306
+
307
+ <div class="section emblem-section">
308
+ <svg class="emblem-svg" viewBox="0 0 17 19" fill="none" xmlns="http://www.w3.org/2000/svg">
309
+ <path
310
+ fill-rule="evenodd"
311
+ clip-rule="evenodd"
312
+ d="M10.8072 16.8744C11.4633 16.178 11.3244 15.3914 10.7996 15.3825C10.9872 15.9606 10.5562 16.3344 10.3922 16.5266C9.97894 16.1712 9.55086 15.7761 9.10778 15.3694C11.2695 13.5812 13.6354 11.995 16.7263 11.9452C13.3983 10.7499 10.7417 12.7815 8.4925 14.8084C6.24308 12.7815 3.58672 10.7499 0.257812 11.9452C3.34944 11.995 5.71507 13.581 7.87722 15.3694C7.43329 15.7761 7.00564 16.1712 6.59172 16.5266C6.42902 16.3344 5.99777 15.9606 6.18435 15.3825C5.65992 15.3914 5.52089 16.178 6.17758 16.8744C5.91495 17.0931 5.48962 17.4631 5.15113 17.5518C4.89082 17.6199 4.68185 17.4846 4.63473 17.2026C4.53542 16.6069 3.61271 16.6959 3.72554 17.5372C3.82907 18.3044 4.76066 18.6391 5.55892 18.2837C5.87565 18.1424 6.3107 17.7413 6.66778 17.45C6.83111 17.641 7.26215 18.0145 7.07494 18.5935C7.59979 18.5838 7.7384 17.798 7.08234 17.1005C7.54845 16.7028 8.01625 16.2927 8.4925 15.887C8.96833 16.2925 9.43634 16.7028 9.90288 17.1005C9.24639 17.798 9.385 18.5838 9.91006 18.5935C9.72285 18.0145 10.1539 17.6414 10.3168 17.45C10.6745 17.7413 11.1091 18.1424 11.4263 18.2837C12.2246 18.6391 13.1555 18.3044 13.259 17.5372C13.3719 16.6959 12.4496 16.6069 12.3494 17.2026C12.3023 17.4846 12.094 17.6196 11.8332 17.5518C11.4948 17.4631 11.0696 17.0931 10.8072 16.8744ZM6.72504 5.72093C6.22365 7.04637 6.19597 8.53894 6.9169 10.1805C6.80195 8.47576 7.17594 7.06771 7.8713 6.0066L8.01815 7.46832H7.84679L8.01815 9.17958H7.84679L8.01815 10.8904H7.84679L8.01794 12.5991L7.53366 13.0819H8.4925H9.45156L8.96685 12.5991L9.13842 10.8904H8.96685L9.13842 9.17958H8.96685L9.13842 7.46832H8.96685L9.11391 6.0066C9.80906 7.06771 10.1833 8.47682 10.0683 10.1805C10.7886 8.53894 10.7616 7.047 10.2602 5.72093C11.1115 6.72478 11.7701 7.89851 12.0661 9.36572C12.3733 7.50466 11.848 5.98568 10.8852 4.8071C11.8174 5.47943 12.6184 6.33157 13.1785 7.48396C13.048 5.72072 12.1559 4.57742 10.927 3.75824C11.989 4.1054 12.8561 4.68645 13.6343 5.71798C13.1139 3.8884 11.9801 3.15564 10.575 2.74362C11.5332 2.67368 12.4386 2.78165 13.3347 3.33988C12.3621 2.02839 11.0565 1.81055 9.73257 1.95634C10.2893 1.67279 10.9158 1.53101 11.5888 1.63137C10.8302 1.07187 9.81836 1.01651 8.95227 1.48812L8.4925 0.328125L8.0321 1.48749C7.1658 1.01651 6.15476 1.07166 5.39623 1.63137C6.06877 1.53122 6.69483 1.67279 7.25179 1.95634C5.92826 1.81055 4.62311 2.0286 3.6499 3.33988C4.54662 2.78165 5.45137 2.67368 6.41001 2.74362C5.00534 3.15564 3.87112 3.8884 3.35113 5.71798C4.12868 4.68666 4.99625 4.1054 6.05842 3.75824C4.8287 4.57721 3.93704 5.72072 3.80625 7.48396C4.36618 6.33157 5.16782 5.47943 6.09962 4.8071C5.13676 5.98568 4.61149 7.50466 4.91871 9.36572C5.21494 7.89851 5.87354 6.72478 6.72504 5.72093Z"
313
+ fill="#1D252D"
314
+ />
315
+ </svg>
316
+ </div>
317
+
318
+ <div class="section letters-section">
319
+ <div class="arabic-row" dir="rtl">
320
+ @for (letter of lettersAr(); track $index) {
321
+ <div class="input-wrapper">
322
+ <input
323
+ type="text"
324
+ class="plate-input letter-input"
325
+ maxlength="1"
326
+ [attr.data-plate-input]="'let-ar-' + $index"
327
+ [class.invalid]="letterErrors()[$index]"
328
+ [value]="letter"
329
+ [readonly]="readonly()"
330
+ placeholder="س"
331
+ (input)="onLetterInput($index, $event, 'ar')"
332
+ />
333
+ @if (letterErrors()[$index]) {
334
+ <span class="error-tooltip">Invalid</span>
335
+ }
336
+ </div>
337
+ }
338
+ </div>
339
+
340
+ <div class="english-row" dir="rtl">
341
+ @for (letter of lettersEn(); track $index) {
342
+ <div class="input-wrapper">
343
+ <input
344
+ type="text"
345
+ class="plate-input letter-input"
346
+ maxlength="1"
347
+ [attr.data-plate-input]="'let-en-' + $index"
348
+ [class.invalid]="letterErrors()[$index]"
349
+ [value]="letter"
350
+ [readonly]="readonly()"
351
+ placeholder="S"
352
+ (input)="onLetterInput($index, $event, 'en')"
353
+ />
354
+ </div>
355
+ }
356
+ </div>
357
+ </div>
358
+
359
+ <div class="ksa-strip">
360
+ <svg class="mini-emblem" viewBox="0 0 17 19" fill="none" xmlns="http://www.w3.org/2000/svg">
361
+ <path
362
+ fill-rule="evenodd"
363
+ clip-rule="evenodd"
364
+ d="M10.8072 16.8744C11.4633 16.178 11.3244 15.3914 10.7996 15.3825C10.9872 15.9606 10.5562 16.3344 10.3922 16.5266C9.97894 16.1712 9.55086 15.7761 9.10778 15.3694C11.2695 13.5812 13.6354 11.995 16.7263 11.9452C13.3983 10.7499 10.7417 12.7815 8.4925 14.8084C6.24308 12.7815 3.58672 10.7499 0.257812 11.9452C3.34944 11.995 5.71507 13.581 7.87722 15.3694C7.43329 15.7761 7.00564 16.1712 6.59172 16.5266C6.42902 16.3344 5.99777 15.9606 6.18435 15.3825C5.65992 15.3914 5.52089 16.178 6.17758 16.8744C5.91495 17.0931 5.48962 17.4631 5.15113 17.5518C4.89082 17.6199 4.68185 17.4846 4.63473 17.2026C4.53542 16.6069 3.61271 16.6959 3.72554 17.5372C3.82907 18.3044 4.76066 18.6391 5.55892 18.2837C5.87565 18.1424 6.3107 17.7413 6.66778 17.45C6.83111 17.641 7.26215 18.0145 7.07494 18.5935C7.59979 18.5838 7.7384 17.798 7.08234 17.1005C7.54845 16.7028 8.01625 16.2927 8.4925 15.887C8.96833 16.2925 9.43634 16.7028 9.90288 17.1005C9.24639 17.798 9.385 18.5838 9.91006 18.5935C9.72285 18.0145 10.1539 17.6414 10.3168 17.45C10.6745 17.7413 11.1091 18.1424 11.4263 18.2837C12.2246 18.6391 13.1555 18.3044 13.259 17.5372C13.3719 16.6959 12.4496 16.6069 12.3494 17.2026C12.3023 17.4846 12.094 17.6196 11.8332 17.5518C11.4948 17.4631 11.0696 17.0931 10.8072 16.8744ZM6.72504 5.72093C6.22365 7.04637 6.19597 8.53894 6.9169 10.1805C6.80195 8.47576 7.17594 7.06771 7.8713 6.0066L8.01815 7.46832H7.84679L8.01815 9.17958H7.84679L8.01815 10.8904H7.84679L8.01794 12.5991L7.53366 13.0819H8.4925H9.45156L8.96685 12.5991L9.13842 10.8904H8.96685L9.13842 9.17958H8.96685L9.13842 7.46832H8.96685L9.11391 6.0066C9.80906 7.06771 10.1833 8.47682 10.0683 10.1805C10.7886 8.53894 10.7616 7.047 10.2602 5.72093C11.1115 6.72478 11.7701 7.89851 12.0661 9.36572C12.3733 7.50466 11.848 5.98568 10.8852 4.8071C11.8174 5.47943 12.6184 6.33157 13.1785 7.48396C13.048 5.72072 12.1559 4.57742 10.927 3.75824C11.989 4.1054 12.8561 4.68645 13.6343 5.71798C13.1139 3.8884 11.9801 3.15564 10.575 2.74362C11.5332 2.67368 12.4386 2.78165 13.3347 3.33988C12.3621 2.02839 11.0565 1.81055 9.73257 1.95634C10.2893 1.67279 10.9158 1.53101 11.5888 1.63137C10.8302 1.07187 9.81836 1.01651 8.95227 1.48812L8.4925 0.328125L8.0321 1.48749C7.1658 1.01651 6.15476 1.07166 5.39623 1.63137C6.06877 1.53122 6.69483 1.67279 7.25179 1.95634C5.92826 1.81055 4.62311 2.0286 3.6499 3.33988C4.54662 2.78165 5.45137 2.67368 6.41001 2.74362C5.00534 3.15564 3.87112 3.8884 3.35113 5.71798C4.12868 4.68666 4.99625 4.1054 6.05842 3.75824C4.8287 4.57721 3.93704 5.72072 3.80625 7.48396C4.36618 6.33157 5.16782 5.47943 6.09962 4.8071C5.13676 5.98568 4.61149 7.50466 4.91871 9.36572C5.21494 7.89851 5.87354 6.72478 6.72504 5.72093Z"
365
+ fill="#1D252D"
366
+ />
367
+ </svg>
368
+ <span class="ksa-text">KSA</span>
369
+ </div>
370
+ </div>
371
+ `, isInline: true, styles: [".plate-container{width:600px;height:130px;border:4px solid #1D252D;border-radius:10px;background:#fff;display:flex;box-shadow:0 4px 10px #0003;overflow:hidden;position:relative}.section{display:flex;flex-direction:column;justify-content:center;align-items:center}.numbers-section{flex:2;padding:0 10px}.digit-row{display:flex;justify-content:space-between;width:80%;font-size:38px;line-height:1;color:#1d252d;margin:2px 0}.emblem-section{flex:1.2;padding:10px}.emblem-svg{width:100%;height:100%;max-height:90px}.letters-section{flex:1.8;border-right:2px solid #1D252D;padding:0 10px}.arabic-row{font-family:Noto Sans Arabic,sans-serif;font-size:32px;display:flex;justify-content:space-around;width:100%;margin-bottom:5px;color:#1d252d}.english-row{font-size:38px;display:flex;justify-content:space-around;width:100%;color:#1d252d}.ksa-strip{width:50px;display:flex;flex-direction:column;justify-content:space-between;align-items:center;padding:10px 0;background-color:#fff}.mini-emblem{width:25px;height:auto}.ksa-text{writing-mode:vertical-rl;text-orientation:upright;font-weight:900;font-size:16px;letter-spacing:2px;color:#1d252d;margin-top:auto;margin-bottom:5px}.plate-input{background:transparent;border:none;text-align:center;font-family:inherit;font-size:inherit;font-weight:700;color:#1d252d;width:100%;padding:0;margin:0;outline:none}.plate-input:focus{border-bottom:2px solid #1D252D}.digit-row,.arabic-row,.english-row{display:flex;justify-content:space-between;width:100%}.number-input,.letter-input{flex:1}.plate-input::placeholder{color:#ccc;opacity:1}.input-wrapper{position:relative;display:flex;flex-direction:column;align-items:center;flex:1}.error-tooltip{position:absolute;bottom:-15px;font-size:10px;color:red;white-space:nowrap}.plate-input.invalid{color:red}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }] });
372
+ }
373
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: PlateControl, decorators: [{
374
+ type: Component,
375
+ args: [{ selector: "iss-ctrl-plate-number", imports: [
376
+ ReactiveFormsModule
377
+ ], providers: [
378
+ { provide: NG_VALUE_ACCESSOR, useExisting: PlateControl, multi: true }
379
+ ], template: `
380
+ <ng-content select="label"></ng-content>
381
+ <div class="plate-container">
382
+ <div class="section numbers-section">
383
+ <div class="digit-row">
384
+ @for (num of numbersAr(); track $index) {
385
+ <input
386
+ type="text"
387
+ class="plate-input number-input"
388
+ maxlength="1"
389
+ [attr.data-plate-input]="'num-ar-' + $index"
390
+ [value]="num"
391
+ [readonly]="readonly()"
392
+ placeholder="١"
393
+ (keydown)="preventNonDigits($event, 'ar')"
394
+ (keyup)="preventNonDigits($event, 'ar')"
395
+ (input)="onNumberInput($index, $event, 'ar')"
396
+ />
397
+ }
398
+ </div>
399
+
400
+ <div class="digit-row">
401
+ @for (num of numbersEn(); track $index) {
402
+ <input
403
+ type="text"
404
+ class="plate-input number-input"
405
+ maxlength="1"
406
+ [attr.data-plate-input]="'num-en-' + $index"
407
+ [value]="num"
408
+ [readonly]="readonly()"
409
+ placeholder="1"
410
+ (keydown)="preventNonDigits($event, 'en')"
411
+ (keyup)="preventNonDigits($event, 'en')"
412
+ (input)="onNumberInput($index, $event, 'en')"
413
+ />
414
+ }
415
+ </div>
416
+ </div>
417
+
418
+ <div class="section emblem-section">
419
+ <svg class="emblem-svg" viewBox="0 0 17 19" fill="none" xmlns="http://www.w3.org/2000/svg">
420
+ <path
421
+ fill-rule="evenodd"
422
+ clip-rule="evenodd"
423
+ d="M10.8072 16.8744C11.4633 16.178 11.3244 15.3914 10.7996 15.3825C10.9872 15.9606 10.5562 16.3344 10.3922 16.5266C9.97894 16.1712 9.55086 15.7761 9.10778 15.3694C11.2695 13.5812 13.6354 11.995 16.7263 11.9452C13.3983 10.7499 10.7417 12.7815 8.4925 14.8084C6.24308 12.7815 3.58672 10.7499 0.257812 11.9452C3.34944 11.995 5.71507 13.581 7.87722 15.3694C7.43329 15.7761 7.00564 16.1712 6.59172 16.5266C6.42902 16.3344 5.99777 15.9606 6.18435 15.3825C5.65992 15.3914 5.52089 16.178 6.17758 16.8744C5.91495 17.0931 5.48962 17.4631 5.15113 17.5518C4.89082 17.6199 4.68185 17.4846 4.63473 17.2026C4.53542 16.6069 3.61271 16.6959 3.72554 17.5372C3.82907 18.3044 4.76066 18.6391 5.55892 18.2837C5.87565 18.1424 6.3107 17.7413 6.66778 17.45C6.83111 17.641 7.26215 18.0145 7.07494 18.5935C7.59979 18.5838 7.7384 17.798 7.08234 17.1005C7.54845 16.7028 8.01625 16.2927 8.4925 15.887C8.96833 16.2925 9.43634 16.7028 9.90288 17.1005C9.24639 17.798 9.385 18.5838 9.91006 18.5935C9.72285 18.0145 10.1539 17.6414 10.3168 17.45C10.6745 17.7413 11.1091 18.1424 11.4263 18.2837C12.2246 18.6391 13.1555 18.3044 13.259 17.5372C13.3719 16.6959 12.4496 16.6069 12.3494 17.2026C12.3023 17.4846 12.094 17.6196 11.8332 17.5518C11.4948 17.4631 11.0696 17.0931 10.8072 16.8744ZM6.72504 5.72093C6.22365 7.04637 6.19597 8.53894 6.9169 10.1805C6.80195 8.47576 7.17594 7.06771 7.8713 6.0066L8.01815 7.46832H7.84679L8.01815 9.17958H7.84679L8.01815 10.8904H7.84679L8.01794 12.5991L7.53366 13.0819H8.4925H9.45156L8.96685 12.5991L9.13842 10.8904H8.96685L9.13842 9.17958H8.96685L9.13842 7.46832H8.96685L9.11391 6.0066C9.80906 7.06771 10.1833 8.47682 10.0683 10.1805C10.7886 8.53894 10.7616 7.047 10.2602 5.72093C11.1115 6.72478 11.7701 7.89851 12.0661 9.36572C12.3733 7.50466 11.848 5.98568 10.8852 4.8071C11.8174 5.47943 12.6184 6.33157 13.1785 7.48396C13.048 5.72072 12.1559 4.57742 10.927 3.75824C11.989 4.1054 12.8561 4.68645 13.6343 5.71798C13.1139 3.8884 11.9801 3.15564 10.575 2.74362C11.5332 2.67368 12.4386 2.78165 13.3347 3.33988C12.3621 2.02839 11.0565 1.81055 9.73257 1.95634C10.2893 1.67279 10.9158 1.53101 11.5888 1.63137C10.8302 1.07187 9.81836 1.01651 8.95227 1.48812L8.4925 0.328125L8.0321 1.48749C7.1658 1.01651 6.15476 1.07166 5.39623 1.63137C6.06877 1.53122 6.69483 1.67279 7.25179 1.95634C5.92826 1.81055 4.62311 2.0286 3.6499 3.33988C4.54662 2.78165 5.45137 2.67368 6.41001 2.74362C5.00534 3.15564 3.87112 3.8884 3.35113 5.71798C4.12868 4.68666 4.99625 4.1054 6.05842 3.75824C4.8287 4.57721 3.93704 5.72072 3.80625 7.48396C4.36618 6.33157 5.16782 5.47943 6.09962 4.8071C5.13676 5.98568 4.61149 7.50466 4.91871 9.36572C5.21494 7.89851 5.87354 6.72478 6.72504 5.72093Z"
424
+ fill="#1D252D"
425
+ />
426
+ </svg>
427
+ </div>
428
+
429
+ <div class="section letters-section">
430
+ <div class="arabic-row" dir="rtl">
431
+ @for (letter of lettersAr(); track $index) {
432
+ <div class="input-wrapper">
433
+ <input
434
+ type="text"
435
+ class="plate-input letter-input"
436
+ maxlength="1"
437
+ [attr.data-plate-input]="'let-ar-' + $index"
438
+ [class.invalid]="letterErrors()[$index]"
439
+ [value]="letter"
440
+ [readonly]="readonly()"
441
+ placeholder="س"
442
+ (input)="onLetterInput($index, $event, 'ar')"
443
+ />
444
+ @if (letterErrors()[$index]) {
445
+ <span class="error-tooltip">Invalid</span>
446
+ }
447
+ </div>
448
+ }
449
+ </div>
450
+
451
+ <div class="english-row" dir="rtl">
452
+ @for (letter of lettersEn(); track $index) {
453
+ <div class="input-wrapper">
454
+ <input
455
+ type="text"
456
+ class="plate-input letter-input"
457
+ maxlength="1"
458
+ [attr.data-plate-input]="'let-en-' + $index"
459
+ [class.invalid]="letterErrors()[$index]"
460
+ [value]="letter"
461
+ [readonly]="readonly()"
462
+ placeholder="S"
463
+ (input)="onLetterInput($index, $event, 'en')"
464
+ />
465
+ </div>
466
+ }
467
+ </div>
468
+ </div>
469
+
470
+ <div class="ksa-strip">
471
+ <svg class="mini-emblem" viewBox="0 0 17 19" fill="none" xmlns="http://www.w3.org/2000/svg">
472
+ <path
473
+ fill-rule="evenodd"
474
+ clip-rule="evenodd"
475
+ d="M10.8072 16.8744C11.4633 16.178 11.3244 15.3914 10.7996 15.3825C10.9872 15.9606 10.5562 16.3344 10.3922 16.5266C9.97894 16.1712 9.55086 15.7761 9.10778 15.3694C11.2695 13.5812 13.6354 11.995 16.7263 11.9452C13.3983 10.7499 10.7417 12.7815 8.4925 14.8084C6.24308 12.7815 3.58672 10.7499 0.257812 11.9452C3.34944 11.995 5.71507 13.581 7.87722 15.3694C7.43329 15.7761 7.00564 16.1712 6.59172 16.5266C6.42902 16.3344 5.99777 15.9606 6.18435 15.3825C5.65992 15.3914 5.52089 16.178 6.17758 16.8744C5.91495 17.0931 5.48962 17.4631 5.15113 17.5518C4.89082 17.6199 4.68185 17.4846 4.63473 17.2026C4.53542 16.6069 3.61271 16.6959 3.72554 17.5372C3.82907 18.3044 4.76066 18.6391 5.55892 18.2837C5.87565 18.1424 6.3107 17.7413 6.66778 17.45C6.83111 17.641 7.26215 18.0145 7.07494 18.5935C7.59979 18.5838 7.7384 17.798 7.08234 17.1005C7.54845 16.7028 8.01625 16.2927 8.4925 15.887C8.96833 16.2925 9.43634 16.7028 9.90288 17.1005C9.24639 17.798 9.385 18.5838 9.91006 18.5935C9.72285 18.0145 10.1539 17.6414 10.3168 17.45C10.6745 17.7413 11.1091 18.1424 11.4263 18.2837C12.2246 18.6391 13.1555 18.3044 13.259 17.5372C13.3719 16.6959 12.4496 16.6069 12.3494 17.2026C12.3023 17.4846 12.094 17.6196 11.8332 17.5518C11.4948 17.4631 11.0696 17.0931 10.8072 16.8744ZM6.72504 5.72093C6.22365 7.04637 6.19597 8.53894 6.9169 10.1805C6.80195 8.47576 7.17594 7.06771 7.8713 6.0066L8.01815 7.46832H7.84679L8.01815 9.17958H7.84679L8.01815 10.8904H7.84679L8.01794 12.5991L7.53366 13.0819H8.4925H9.45156L8.96685 12.5991L9.13842 10.8904H8.96685L9.13842 9.17958H8.96685L9.13842 7.46832H8.96685L9.11391 6.0066C9.80906 7.06771 10.1833 8.47682 10.0683 10.1805C10.7886 8.53894 10.7616 7.047 10.2602 5.72093C11.1115 6.72478 11.7701 7.89851 12.0661 9.36572C12.3733 7.50466 11.848 5.98568 10.8852 4.8071C11.8174 5.47943 12.6184 6.33157 13.1785 7.48396C13.048 5.72072 12.1559 4.57742 10.927 3.75824C11.989 4.1054 12.8561 4.68645 13.6343 5.71798C13.1139 3.8884 11.9801 3.15564 10.575 2.74362C11.5332 2.67368 12.4386 2.78165 13.3347 3.33988C12.3621 2.02839 11.0565 1.81055 9.73257 1.95634C10.2893 1.67279 10.9158 1.53101 11.5888 1.63137C10.8302 1.07187 9.81836 1.01651 8.95227 1.48812L8.4925 0.328125L8.0321 1.48749C7.1658 1.01651 6.15476 1.07166 5.39623 1.63137C6.06877 1.53122 6.69483 1.67279 7.25179 1.95634C5.92826 1.81055 4.62311 2.0286 3.6499 3.33988C4.54662 2.78165 5.45137 2.67368 6.41001 2.74362C5.00534 3.15564 3.87112 3.8884 3.35113 5.71798C4.12868 4.68666 4.99625 4.1054 6.05842 3.75824C4.8287 4.57721 3.93704 5.72072 3.80625 7.48396C4.36618 6.33157 5.16782 5.47943 6.09962 4.8071C5.13676 5.98568 4.61149 7.50466 4.91871 9.36572C5.21494 7.89851 5.87354 6.72478 6.72504 5.72093Z"
476
+ fill="#1D252D"
477
+ />
478
+ </svg>
479
+ <span class="ksa-text">KSA</span>
480
+ </div>
481
+ </div>
482
+ `, styles: [".plate-container{width:600px;height:130px;border:4px solid #1D252D;border-radius:10px;background:#fff;display:flex;box-shadow:0 4px 10px #0003;overflow:hidden;position:relative}.section{display:flex;flex-direction:column;justify-content:center;align-items:center}.numbers-section{flex:2;padding:0 10px}.digit-row{display:flex;justify-content:space-between;width:80%;font-size:38px;line-height:1;color:#1d252d;margin:2px 0}.emblem-section{flex:1.2;padding:10px}.emblem-svg{width:100%;height:100%;max-height:90px}.letters-section{flex:1.8;border-right:2px solid #1D252D;padding:0 10px}.arabic-row{font-family:Noto Sans Arabic,sans-serif;font-size:32px;display:flex;justify-content:space-around;width:100%;margin-bottom:5px;color:#1d252d}.english-row{font-size:38px;display:flex;justify-content:space-around;width:100%;color:#1d252d}.ksa-strip{width:50px;display:flex;flex-direction:column;justify-content:space-between;align-items:center;padding:10px 0;background-color:#fff}.mini-emblem{width:25px;height:auto}.ksa-text{writing-mode:vertical-rl;text-orientation:upright;font-weight:900;font-size:16px;letter-spacing:2px;color:#1d252d;margin-top:auto;margin-bottom:5px}.plate-input{background:transparent;border:none;text-align:center;font-family:inherit;font-size:inherit;font-weight:700;color:#1d252d;width:100%;padding:0;margin:0;outline:none}.plate-input:focus{border-bottom:2px solid #1D252D}.digit-row,.arabic-row,.english-row{display:flex;justify-content:space-between;width:100%}.number-input,.letter-input{flex:1}.plate-input::placeholder{color:#ccc;opacity:1}.input-wrapper{position:relative;display:flex;flex-direction:column;align-items:center;flex:1}.error-tooltip{position:absolute;bottom:-15px;font-size:10px;color:red;white-space:nowrap}.plate-input.invalid{color:red}\n"] }]
483
+ }] });
484
+
485
+ // The plate control. Its field and viewer stay in the primary entry point and reach it
486
+ // from there, so the control ships only to an app that renders it or imports it directly.
487
+
488
+ /**
489
+ * Generated bundle index. Do not edit.
490
+ */
491
+
492
+ export { PLATE_LETTERS, PlateControl };
493
+ //# sourceMappingURL=iss-ctrl-plate.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iss-ctrl-plate.mjs","sources":["../../../projects/iss/plate/src/plate-letters.const.ts","../../../projects/iss/plate/src/plate.control.ts","../../../projects/iss/plate/src/public-api.ts","../../../projects/iss/plate/src/iss-ctrl-plate.ts"],"sourcesContent":["import { PlateLetter } from \"./plate-letter\";\r\n\r\nexport const PLATE_LETTERS: PlateLetter[] = [\r\n {label: {ar: \"أ\", en: \"A\"}, value: \"A\"},\r\n {label: {ar: \"ب\", en: \"B\"}, value: \"B\"},\r\n {label: {ar: \"ح\", en: \"J\"}, value: \"J\"},\r\n {label: {ar: \"د\", en: \"D\"}, value: \"D\"},\r\n {label: {ar: \"ر\", en: \"R\"}, value: \"R\"},\r\n {label: {ar: \"س\", en: \"S\"}, value: \"S\"},\r\n {label: {ar: \"ص\", en: \"X\"}, value: \"X\"},\r\n {label: {ar: \"ط\", en: \"T\"}, value: \"T\"},\r\n {label: {ar: \"ع\", en: \"E\"}, value: \"E\"},\r\n {label: {ar: \"ق\", en: \"G\"}, value: \"G\"},\r\n {label: {ar: \"ك\", en: \"K\"}, value: \"K\"},\r\n {label: {ar: \"ل\", en: \"L\"}, value: \"L\"},\r\n {label: {ar: \"م\", en: \"Z\"}, value: \"Z\"},\r\n {label: {ar: \"ن\", en: \"N\"}, value: \"N\"},\r\n {label: {ar: \"هـ\", en: \"H\"}, value: \"H\"},\r\n {label: {ar: \"و\", en: \"U\"}, value: \"U\"},\r\n {label: {ar: \"ي\", en: \"V\"}, value: \"V\"}\r\n];\r\n","import { Component, ElementRef, inject, signal } from \"@angular/core\";\nimport { NG_VALUE_ACCESSOR, ReactiveFormsModule } from \"@angular/forms\";\nimport { ControlBase } from \"iss-ctrl/base\";\nimport { PLATE_LETTERS } from \"./plate-letters.const\";\n\n/**\n * `<iss-ctrl-plate-number>` — Saudi vehicle plate, entered as digits and letters in both\n * Arabic and English.\n *\n * Typing into one script fills the matching cell in the other automatically, and letters are\n * validated against the allowed plate alphabet.\n *\n * @example\n * ```html\n * <iss-ctrl-plate-number formControlName=\"plate\" [readonly]=\"false\"/>\n * ```\n *\n * ### Own inputs\n * None — the control is configured entirely through the inherited properties.\n *\n * ### Inherited from {@link ControlBase}\n * `formControlName` · `readonly` · `className` · `(onChange)`\n *\n * Projects a `<label>` above the control — the wrapping `iss-field-*` passes the field label in that way.\n */\n@Component({\n selector: \"iss-ctrl-plate-number\",\n imports: [\n ReactiveFormsModule\n ],\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: PlateControl, multi: true }\n ],\n template: `\n <ng-content select=\"label\"></ng-content>\n <div class=\"plate-container\">\n <div class=\"section numbers-section\">\n <div class=\"digit-row\">\n @for (num of numbersAr(); track $index) {\n <input\n type=\"text\"\n class=\"plate-input number-input\"\n maxlength=\"1\"\n [attr.data-plate-input]=\"'num-ar-' + $index\"\n [value]=\"num\"\n [readonly]=\"readonly()\"\n placeholder=\"١\"\n (keydown)=\"preventNonDigits($event, 'ar')\"\n (keyup)=\"preventNonDigits($event, 'ar')\"\n (input)=\"onNumberInput($index, $event, 'ar')\"\n />\n }\n </div>\n\n <div class=\"digit-row\">\n @for (num of numbersEn(); track $index) {\n <input\n type=\"text\"\n class=\"plate-input number-input\"\n maxlength=\"1\"\n [attr.data-plate-input]=\"'num-en-' + $index\"\n [value]=\"num\"\n [readonly]=\"readonly()\"\n placeholder=\"1\"\n (keydown)=\"preventNonDigits($event, 'en')\"\n (keyup)=\"preventNonDigits($event, 'en')\"\n (input)=\"onNumberInput($index, $event, 'en')\"\n />\n }\n </div>\n </div>\n\n <div class=\"section emblem-section\">\n <svg class=\"emblem-svg\" viewBox=\"0 0 17 19\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M10.8072 16.8744C11.4633 16.178 11.3244 15.3914 10.7996 15.3825C10.9872 15.9606 10.5562 16.3344 10.3922 16.5266C9.97894 16.1712 9.55086 15.7761 9.10778 15.3694C11.2695 13.5812 13.6354 11.995 16.7263 11.9452C13.3983 10.7499 10.7417 12.7815 8.4925 14.8084C6.24308 12.7815 3.58672 10.7499 0.257812 11.9452C3.34944 11.995 5.71507 13.581 7.87722 15.3694C7.43329 15.7761 7.00564 16.1712 6.59172 16.5266C6.42902 16.3344 5.99777 15.9606 6.18435 15.3825C5.65992 15.3914 5.52089 16.178 6.17758 16.8744C5.91495 17.0931 5.48962 17.4631 5.15113 17.5518C4.89082 17.6199 4.68185 17.4846 4.63473 17.2026C4.53542 16.6069 3.61271 16.6959 3.72554 17.5372C3.82907 18.3044 4.76066 18.6391 5.55892 18.2837C5.87565 18.1424 6.3107 17.7413 6.66778 17.45C6.83111 17.641 7.26215 18.0145 7.07494 18.5935C7.59979 18.5838 7.7384 17.798 7.08234 17.1005C7.54845 16.7028 8.01625 16.2927 8.4925 15.887C8.96833 16.2925 9.43634 16.7028 9.90288 17.1005C9.24639 17.798 9.385 18.5838 9.91006 18.5935C9.72285 18.0145 10.1539 17.6414 10.3168 17.45C10.6745 17.7413 11.1091 18.1424 11.4263 18.2837C12.2246 18.6391 13.1555 18.3044 13.259 17.5372C13.3719 16.6959 12.4496 16.6069 12.3494 17.2026C12.3023 17.4846 12.094 17.6196 11.8332 17.5518C11.4948 17.4631 11.0696 17.0931 10.8072 16.8744ZM6.72504 5.72093C6.22365 7.04637 6.19597 8.53894 6.9169 10.1805C6.80195 8.47576 7.17594 7.06771 7.8713 6.0066L8.01815 7.46832H7.84679L8.01815 9.17958H7.84679L8.01815 10.8904H7.84679L8.01794 12.5991L7.53366 13.0819H8.4925H9.45156L8.96685 12.5991L9.13842 10.8904H8.96685L9.13842 9.17958H8.96685L9.13842 7.46832H8.96685L9.11391 6.0066C9.80906 7.06771 10.1833 8.47682 10.0683 10.1805C10.7886 8.53894 10.7616 7.047 10.2602 5.72093C11.1115 6.72478 11.7701 7.89851 12.0661 9.36572C12.3733 7.50466 11.848 5.98568 10.8852 4.8071C11.8174 5.47943 12.6184 6.33157 13.1785 7.48396C13.048 5.72072 12.1559 4.57742 10.927 3.75824C11.989 4.1054 12.8561 4.68645 13.6343 5.71798C13.1139 3.8884 11.9801 3.15564 10.575 2.74362C11.5332 2.67368 12.4386 2.78165 13.3347 3.33988C12.3621 2.02839 11.0565 1.81055 9.73257 1.95634C10.2893 1.67279 10.9158 1.53101 11.5888 1.63137C10.8302 1.07187 9.81836 1.01651 8.95227 1.48812L8.4925 0.328125L8.0321 1.48749C7.1658 1.01651 6.15476 1.07166 5.39623 1.63137C6.06877 1.53122 6.69483 1.67279 7.25179 1.95634C5.92826 1.81055 4.62311 2.0286 3.6499 3.33988C4.54662 2.78165 5.45137 2.67368 6.41001 2.74362C5.00534 3.15564 3.87112 3.8884 3.35113 5.71798C4.12868 4.68666 4.99625 4.1054 6.05842 3.75824C4.8287 4.57721 3.93704 5.72072 3.80625 7.48396C4.36618 6.33157 5.16782 5.47943 6.09962 4.8071C5.13676 5.98568 4.61149 7.50466 4.91871 9.36572C5.21494 7.89851 5.87354 6.72478 6.72504 5.72093Z\"\n fill=\"#1D252D\"\n />\n </svg>\n </div>\n\n <div class=\"section letters-section\">\n <div class=\"arabic-row\" dir=\"rtl\">\n @for (letter of lettersAr(); track $index) {\n <div class=\"input-wrapper\">\n <input\n type=\"text\"\n class=\"plate-input letter-input\"\n maxlength=\"1\"\n [attr.data-plate-input]=\"'let-ar-' + $index\"\n [class.invalid]=\"letterErrors()[$index]\"\n [value]=\"letter\"\n [readonly]=\"readonly()\"\n placeholder=\"س\"\n (input)=\"onLetterInput($index, $event, 'ar')\"\n />\n @if (letterErrors()[$index]) {\n <span class=\"error-tooltip\">Invalid</span>\n }\n </div>\n }\n </div>\n\n <div class=\"english-row\" dir=\"rtl\">\n @for (letter of lettersEn(); track $index) {\n <div class=\"input-wrapper\">\n <input\n type=\"text\"\n class=\"plate-input letter-input\"\n maxlength=\"1\"\n [attr.data-plate-input]=\"'let-en-' + $index\"\n [class.invalid]=\"letterErrors()[$index]\"\n [value]=\"letter\"\n [readonly]=\"readonly()\"\n placeholder=\"S\"\n (input)=\"onLetterInput($index, $event, 'en')\"\n />\n </div>\n }\n </div>\n </div>\n\n <div class=\"ksa-strip\">\n <svg class=\"mini-emblem\" viewBox=\"0 0 17 19\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M10.8072 16.8744C11.4633 16.178 11.3244 15.3914 10.7996 15.3825C10.9872 15.9606 10.5562 16.3344 10.3922 16.5266C9.97894 16.1712 9.55086 15.7761 9.10778 15.3694C11.2695 13.5812 13.6354 11.995 16.7263 11.9452C13.3983 10.7499 10.7417 12.7815 8.4925 14.8084C6.24308 12.7815 3.58672 10.7499 0.257812 11.9452C3.34944 11.995 5.71507 13.581 7.87722 15.3694C7.43329 15.7761 7.00564 16.1712 6.59172 16.5266C6.42902 16.3344 5.99777 15.9606 6.18435 15.3825C5.65992 15.3914 5.52089 16.178 6.17758 16.8744C5.91495 17.0931 5.48962 17.4631 5.15113 17.5518C4.89082 17.6199 4.68185 17.4846 4.63473 17.2026C4.53542 16.6069 3.61271 16.6959 3.72554 17.5372C3.82907 18.3044 4.76066 18.6391 5.55892 18.2837C5.87565 18.1424 6.3107 17.7413 6.66778 17.45C6.83111 17.641 7.26215 18.0145 7.07494 18.5935C7.59979 18.5838 7.7384 17.798 7.08234 17.1005C7.54845 16.7028 8.01625 16.2927 8.4925 15.887C8.96833 16.2925 9.43634 16.7028 9.90288 17.1005C9.24639 17.798 9.385 18.5838 9.91006 18.5935C9.72285 18.0145 10.1539 17.6414 10.3168 17.45C10.6745 17.7413 11.1091 18.1424 11.4263 18.2837C12.2246 18.6391 13.1555 18.3044 13.259 17.5372C13.3719 16.6959 12.4496 16.6069 12.3494 17.2026C12.3023 17.4846 12.094 17.6196 11.8332 17.5518C11.4948 17.4631 11.0696 17.0931 10.8072 16.8744ZM6.72504 5.72093C6.22365 7.04637 6.19597 8.53894 6.9169 10.1805C6.80195 8.47576 7.17594 7.06771 7.8713 6.0066L8.01815 7.46832H7.84679L8.01815 9.17958H7.84679L8.01815 10.8904H7.84679L8.01794 12.5991L7.53366 13.0819H8.4925H9.45156L8.96685 12.5991L9.13842 10.8904H8.96685L9.13842 9.17958H8.96685L9.13842 7.46832H8.96685L9.11391 6.0066C9.80906 7.06771 10.1833 8.47682 10.0683 10.1805C10.7886 8.53894 10.7616 7.047 10.2602 5.72093C11.1115 6.72478 11.7701 7.89851 12.0661 9.36572C12.3733 7.50466 11.848 5.98568 10.8852 4.8071C11.8174 5.47943 12.6184 6.33157 13.1785 7.48396C13.048 5.72072 12.1559 4.57742 10.927 3.75824C11.989 4.1054 12.8561 4.68645 13.6343 5.71798C13.1139 3.8884 11.9801 3.15564 10.575 2.74362C11.5332 2.67368 12.4386 2.78165 13.3347 3.33988C12.3621 2.02839 11.0565 1.81055 9.73257 1.95634C10.2893 1.67279 10.9158 1.53101 11.5888 1.63137C10.8302 1.07187 9.81836 1.01651 8.95227 1.48812L8.4925 0.328125L8.0321 1.48749C7.1658 1.01651 6.15476 1.07166 5.39623 1.63137C6.06877 1.53122 6.69483 1.67279 7.25179 1.95634C5.92826 1.81055 4.62311 2.0286 3.6499 3.33988C4.54662 2.78165 5.45137 2.67368 6.41001 2.74362C5.00534 3.15564 3.87112 3.8884 3.35113 5.71798C4.12868 4.68666 4.99625 4.1054 6.05842 3.75824C4.8287 4.57721 3.93704 5.72072 3.80625 7.48396C4.36618 6.33157 5.16782 5.47943 6.09962 4.8071C5.13676 5.98568 4.61149 7.50466 4.91871 9.36572C5.21494 7.89851 5.87354 6.72478 6.72504 5.72093Z\"\n fill=\"#1D252D\"\n />\n </svg>\n <span class=\"ksa-text\">KSA</span>\n </div>\n </div>\n `,\n styles: `\n .plate-container {\n width: 600px;\n height: 130px;\n border: 4px solid #1D252D;\n border-radius: 10px;\n background: white;\n display: flex;\n box-shadow: 0 4px 10px rgba(0, 0, 0, 0.2);\n overflow: hidden;\n position: relative;\n }\n\n /* General Section Styling */\n .section {\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n }\n\n /* Left Section: Numbers/Asterisks */\n .numbers-section {\n flex: 2;\n padding: 0 10px;\n }\n\n .digit-row {\n display: flex;\n justify-content: space-between;\n width: 80%;\n font-size: 38px;\n line-height: 1;\n color: #1D252D;\n margin: 2px 0;\n }\n\n /* Middle Section: Emblem */\n .emblem-section {\n flex: 1.2;\n padding: 10px;\n }\n\n .emblem-svg {\n width: 100%;\n height: 100%;\n max-height: 90px;\n }\n\n /* Right Section: Letters */\n .letters-section {\n flex: 1.8;\n border-right: 2px solid #1D252D;\n padding: 0 10px;\n }\n\n .arabic-row {\n font-family: 'Noto Sans Arabic', sans-serif;\n font-size: 32px;\n display: flex;\n justify-content: space-around;\n width: 100%;\n margin-bottom: 5px;\n color: #1D252D;\n }\n\n .english-row {\n font-size: 38px;\n display: flex;\n justify-content: space-around;\n width: 100%;\n color: #1D252D;\n }\n\n /* Far Right: KSA Strip */\n .ksa-strip {\n width: 50px;\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n align-items: center;\n padding: 10px 0;\n background-color: #fff; /* or specific reflective white */\n }\n\n .mini-emblem {\n width: 25px;\n height: auto;\n }\n\n .ksa-text {\n writing-mode: vertical-rl;\n text-orientation: upright;\n font-weight: 900;\n font-size: 16px;\n letter-spacing: 2px;\n color: #1D252D;\n margin-top: auto;\n margin-bottom: 5px;\n }\n\n .plate-input {\n background: transparent;\n border: none;\n text-align: center;\n font-family: inherit;\n font-size: inherit;\n font-weight: bold;\n color: #1D252D;\n width: 100%; /* Fill the flex/grid item */\n padding: 0;\n margin: 0;\n outline: none; /* Remove blue outline on focus */\n }\n\n /* Optional: Add a subtle underline or color change when user clicks the input */\n .plate-input:focus {\n border-bottom: 2px solid #1D252D;\n }\n\n /* Adjusting the container flex settings to ensure inputs fit */\n .digit-row, .arabic-row, .english-row {\n display: flex;\n justify-content: space-between;\n width: 100%;\n }\n\n /* Specific sizing for numbers to ensure they match plate proportions */\n .number-input {\n /* Adjust width based on your container size, roughly 20-25% */\n flex: 1;\n }\n\n /* Specific sizing for letters */\n .letter-input {\n flex: 1;\n }\n\n /* Placeholder styling to look like a ghost plate */\n .plate-input::placeholder {\n color: #ccc;\n opacity: 1;\n }\n\n .input-wrapper {\n position: relative;\n display: flex;\n flex-direction: column;\n align-items: center;\n flex: 1;\n }\n\n .error-tooltip {\n position: absolute;\n bottom: -15px;\n font-size: 10px;\n color: red;\n white-space: nowrap;\n }\n\n .plate-input.invalid {\n color: red;\n }\n `,\n})\nexport class PlateControl extends ControlBase {\n numbersAr = signal<string[]>(Array(4).fill(\"\"));\n numbersEn = signal<string[]>(Array(4).fill(\"\"));\n lettersAr = signal<string[]>(Array(3).fill(\"\"));\n lettersEn = signal<string[]>(Array(3).fill(\"\"));\n letterErrors = signal<boolean[]>(Array(3).fill(false));\n #host: ElementRef<HTMLElement> = inject(ElementRef);\n\n override writeValue(value: string | null) {\n if (!value) {\n this.#resetPlate();\n return;\n }\n\n const parts = value.split(\"-\");\n const letters = parts[0]?.split(\"\") || [];\n const numbers = parts[1]?.split(\"\") || [];\n\n // Initialize letters\n const lAr: string[] = [];\n const lEn: string[] = [];\n for (let i = 0; i < 3; i++) {\n const char = letters[i] || \"\";\n if (char) {\n const plateLetter = PLATE_LETTERS.find(l => l.value === char || l.label.en === char || l.label.ar === char);\n if (plateLetter) {\n lAr.push(plateLetter.label.ar);\n lEn.push(plateLetter.label.en);\n } else {\n lAr.push(\"\");\n lEn.push(\"\");\n }\n } else {\n lAr.push(\"\");\n lEn.push(\"\");\n }\n }\n this.lettersAr.set(lAr);\n this.lettersEn.set(lEn);\n\n // Initialize numbers\n const nAr: string[] = [];\n const nEn: string[] = [];\n for (let i = 0; i < 4; i++) {\n const char = numbers[i] || \"\";\n if (char) {\n nAr.push(this.convertDigit(char, \"ar\"));\n nEn.push(this.convertDigit(char, \"en\"));\n } else {\n nAr.push(\"\");\n nEn.push(\"\");\n }\n }\n this.numbersAr.set(nAr);\n this.numbersEn.set(nEn);\n }\n\n onNumberInput(index: number, event: Event, lang: \"ar\" | \"en\") {\n if (this.readonly()) {\n return;\n }\n const input = event.target as HTMLInputElement;\n let value = input.value;\n\n // Allow only numbers\n if (!/^[0-9\\u0660-\\u0669]*$/.test(value)) {\n return;\n }\n\n input.value = lang === \"ar\" ? this.numbersAr()[index] : this.numbersEn()[index];\n\n // Take only the last character if multiple characters are entered\n if (value.length > 1) {\n value = value.slice(-1);\n input.value = value;\n }\n\n if (!value) {\n const newAr = [...this.numbersAr()];\n const newEn = [...this.numbersEn()];\n newAr[index] = \"\";\n newEn[index] = \"\";\n this.numbersAr.set(newAr);\n this.numbersEn.set(newEn);\n this.emitPlate();\n return;\n }\n\n const arDigits = [\"٠\", \"١\", \"٢\", \"٣\", \"٤\", \"٥\", \"٦\", \"٧\", \"٨\", \"٩\"];\n const enDigits = [\"0\", \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\"];\n\n let digitIndex = enDigits.indexOf(value);\n\n if (digitIndex === -1) {\n digitIndex = arDigits.indexOf(value);\n }\n\n const newAr = [...this.numbersAr()];\n const newEn = [...this.numbersEn()];\n\n if (digitIndex !== -1) {\n newAr[index] = arDigits[digitIndex];\n newEn[index] = enDigits[digitIndex];\n\n // Focus next\n if (index < 3) {\n this.focusInput(`num-${lang}-${index + 1}`);\n } else {\n this.focusInput(`let-${lang}-0`);\n }\n } else {\n // Should not happen due to regex check, but safe fallback\n newAr[index] = \"\";\n newEn[index] = \"\";\n }\n\n this.numbersAr.set(newAr);\n this.numbersEn.set(newEn);\n this.emitPlate();\n }\n\n onLetterInput(index: number, event: Event, lang: \"ar\" | \"en\") {\n if (this.readonly()) {\n return;\n }\n const input = event.target as HTMLInputElement;\n let value = input.value;\n\n if (!value) {\n const newAr = [...this.lettersAr()];\n const newEn = [...this.lettersEn()];\n const newErrors = [...this.letterErrors()];\n newAr[index] = \"\";\n newEn[index] = \"\";\n newErrors[index] = false;\n this.lettersAr.set(newAr);\n this.lettersEn.set(newEn);\n this.letterErrors.set(newErrors);\n this.emitPlate();\n return;\n }\n\n // Take only the last character\n if (value.length > 1) {\n value = value.slice(-1);\n input.value = value;\n }\n\n const plateLetter = PLATE_LETTERS.find(l =>\n l.value === value.toUpperCase() ||\n l.label.en === value.toUpperCase() ||\n l.label.ar === value\n );\n\n const newAr = [...this.lettersAr()];\n const newEn = [...this.lettersEn()];\n const newErrors = [...this.letterErrors()];\n\n if (plateLetter) {\n newAr[index] = plateLetter.label.ar;\n newEn[index] = plateLetter.label.en;\n newErrors[index] = false;\n\n // Focus next\n if (index < 2) {\n this.focusInput(`let-${lang}-${index + 1}`);\n } else {\n this.focusInput(`num-${lang}-0`);\n }\n } else {\n // Show error\n if (lang === \"ar\") {\n newAr[index] = value;\n newEn[index] = \"\"; // Or keep previous?\n } else {\n newEn[index] = value;\n newAr[index] = \"\";\n }\n newErrors[index] = true;\n }\n\n this.lettersAr.set(newAr);\n this.lettersEn.set(newEn);\n this.letterErrors.set(newErrors);\n this.emitPlate();\n }\n\n protected preventNonDigits($event: KeyboardEvent, ar: string) {\n if ($event.key.length === 1 && !/^[0-9\\u0660-\\u0669]$/.test($event.key)) {\n $event.preventDefault();\n }\n }\n\n #resetPlate() {\n this.numbersAr.set(Array(4).fill(\"\"));\n this.numbersEn.set(Array(4).fill(\"\"));\n this.lettersAr.set(Array(3).fill(\"\"));\n this.lettersEn.set(Array(3).fill(\"\"));\n this.letterErrors.set(Array(3).fill(false));\n this.ctrl.setValue(null, { emitEvent: false });\n }\n\n private emitPlate() {\n this.markAsTouched();\n this.emitValue(this.stringifyPlate());\n }\n\n private stringifyPlate(): string | null {\n // lettersEn holds PlateLetter.label.en, which equals PlateLetter.value for every entry,\n // so this round-trips through writeValue and the viewer. Invalid letters are held in the\n // opposite-language row and serialize as empty.\n const letters: string = this.lettersEn().join(\"\");\n const numbers: string = this.numbersEn().join(\"\");\n if (!letters && !numbers) {\n return null;\n }\n return `${letters}-${numbers}`;\n }\n\n private focusInput(id: string) {\n setTimeout(() => {\n // scoped to this host: several plates can be on the same page\n const element = this.#host.nativeElement.querySelector(\"[data-plate-input=\\\"\" + id + \"\\\"]\") as HTMLInputElement | null;\n if (element) {\n element.focus();\n // Optional: Select text so user can overwrite easily if they cycle back\n element.select();\n }\n }, 0);\n }\n\n private convertDigit(digit: string, toLang: \"ar\" | \"en\"): string {\n const arDigits = [\"٠\", \"١\", \"٢\", \"٣\", \"٤\", \"٥\", \"٦\", \"٧\", \"٨\", \"٩\"];\n const enDigits = [\"0\", \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\"];\n\n if (toLang === \"ar\") {\n const index = enDigits.indexOf(digit);\n return index !== -1 ? arDigits[index] : digit;\n } else {\n const index = arDigits.indexOf(digit);\n return index !== -1 ? enDigits[index] : digit;\n }\n }\n}\n","// The plate control. Its field and viewer stay in the primary entry point and reach it\n// from there, so the control ships only to an app that renders it or imports it directly.\n\nexport * from \"./plate-letter\";\nexport * from \"./plate-letters.const\";\nexport * from \"./plate.control\";\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}