@weeehaoooz/talos-ui 0.1.1 → 0.1.2

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 (190) hide show
  1. package/README.md +2 -0
  2. package/fesm2022/{weeehaoooz-talos-ui-button-button-group.mjs → weeehaoooz-talos-ui-button.mjs} +91 -15
  3. package/fesm2022/weeehaoooz-talos-ui-button.mjs.map +1 -0
  4. package/fesm2022/weeehaoooz-talos-ui-data-display.mjs +3110 -0
  5. package/fesm2022/weeehaoooz-talos-ui-data-display.mjs.map +1 -0
  6. package/fesm2022/weeehaoooz-talos-ui-data-viz.mjs +2414 -0
  7. package/fesm2022/weeehaoooz-talos-ui-data-viz.mjs.map +1 -0
  8. package/fesm2022/weeehaoooz-talos-ui-dropdown.mjs +1039 -0
  9. package/fesm2022/weeehaoooz-talos-ui-dropdown.mjs.map +1 -0
  10. package/fesm2022/weeehaoooz-talos-ui-feedback.mjs +2885 -0
  11. package/fesm2022/weeehaoooz-talos-ui-feedback.mjs.map +1 -0
  12. package/fesm2022/weeehaoooz-talos-ui-form.mjs +10799 -0
  13. package/fesm2022/weeehaoooz-talos-ui-form.mjs.map +1 -0
  14. package/fesm2022/weeehaoooz-talos-ui-layout.mjs +1316 -7
  15. package/fesm2022/weeehaoooz-talos-ui-layout.mjs.map +1 -1
  16. package/fesm2022/weeehaoooz-talos-ui-nav.mjs +3 -3
  17. package/fesm2022/weeehaoooz-talos-ui-nav.mjs.map +1 -1
  18. package/fesm2022/weeehaoooz-talos-ui.mjs +21592 -16293
  19. package/fesm2022/weeehaoooz-talos-ui.mjs.map +1 -1
  20. package/package.json +20 -139
  21. package/styles/_breadcrumb.scss +16 -0
  22. package/styles/_button-group.scss +2 -1
  23. package/styles/_buttons.scss +51 -0
  24. package/styles/_dropdown.scss +438 -0
  25. package/styles/_form-controls.scss +13 -0
  26. package/styles/_progress-bar.scss +43 -0
  27. package/styles/_skeleton.scss +176 -0
  28. package/styles/_spinner.scss +58 -0
  29. package/styles/_variables.scss +33 -0
  30. package/styles/index.scss +6 -1
  31. package/types/weeehaoooz-talos-ui-button.d.ts +92 -0
  32. package/types/weeehaoooz-talos-ui-button.d.ts.map +1 -0
  33. package/types/weeehaoooz-talos-ui-data-display.d.ts +1018 -0
  34. package/types/weeehaoooz-talos-ui-data-display.d.ts.map +1 -0
  35. package/types/weeehaoooz-talos-ui-data-viz.d.ts +839 -0
  36. package/types/weeehaoooz-talos-ui-data-viz.d.ts.map +1 -0
  37. package/types/weeehaoooz-talos-ui-dropdown.d.ts +187 -0
  38. package/types/weeehaoooz-talos-ui-dropdown.d.ts.map +1 -0
  39. package/types/weeehaoooz-talos-ui-feedback.d.ts +1495 -0
  40. package/types/weeehaoooz-talos-ui-feedback.d.ts.map +1 -0
  41. package/types/weeehaoooz-talos-ui-form.d.ts +2639 -0
  42. package/types/weeehaoooz-talos-ui-form.d.ts.map +1 -0
  43. package/types/weeehaoooz-talos-ui-layout.d.ts +851 -3
  44. package/types/weeehaoooz-talos-ui-layout.d.ts.map +1 -1
  45. package/types/weeehaoooz-talos-ui-nav.d.ts +1 -1
  46. package/types/weeehaoooz-talos-ui.d.ts +7148 -4629
  47. package/types/weeehaoooz-talos-ui.d.ts.map +1 -1
  48. package/fesm2022/weeehaoooz-talos-ui-button-button-group.mjs.map +0 -1
  49. package/fesm2022/weeehaoooz-talos-ui-button-button.mjs +0 -94
  50. package/fesm2022/weeehaoooz-talos-ui-button-button.mjs.map +0 -1
  51. package/fesm2022/weeehaoooz-talos-ui-data-display-badge.mjs +0 -233
  52. package/fesm2022/weeehaoooz-talos-ui-data-display-badge.mjs.map +0 -1
  53. package/fesm2022/weeehaoooz-talos-ui-data-display-data-grid.mjs +0 -1627
  54. package/fesm2022/weeehaoooz-talos-ui-data-display-data-grid.mjs.map +0 -1
  55. package/fesm2022/weeehaoooz-talos-ui-data-display-status-tag.mjs +0 -361
  56. package/fesm2022/weeehaoooz-talos-ui-data-display-status-tag.mjs.map +0 -1
  57. package/fesm2022/weeehaoooz-talos-ui-data-display-timeline.mjs +0 -312
  58. package/fesm2022/weeehaoooz-talos-ui-data-display-timeline.mjs.map +0 -1
  59. package/fesm2022/weeehaoooz-talos-ui-data-display-trend-indicator.mjs +0 -235
  60. package/fesm2022/weeehaoooz-talos-ui-data-display-trend-indicator.mjs.map +0 -1
  61. package/fesm2022/weeehaoooz-talos-ui-data-viz-category-bar.mjs +0 -462
  62. package/fesm2022/weeehaoooz-talos-ui-data-viz-category-bar.mjs.map +0 -1
  63. package/fesm2022/weeehaoooz-talos-ui-data-viz-heatmap.mjs +0 -805
  64. package/fesm2022/weeehaoooz-talos-ui-data-viz-heatmap.mjs.map +0 -1
  65. package/fesm2022/weeehaoooz-talos-ui-data-viz-mini-donut.mjs +0 -267
  66. package/fesm2022/weeehaoooz-talos-ui-data-viz-mini-donut.mjs.map +0 -1
  67. package/fesm2022/weeehaoooz-talos-ui-data-viz-mini-gauge.mjs +0 -351
  68. package/fesm2022/weeehaoooz-talos-ui-data-viz-mini-gauge.mjs.map +0 -1
  69. package/fesm2022/weeehaoooz-talos-ui-data-viz-sparkline.mjs +0 -566
  70. package/fesm2022/weeehaoooz-talos-ui-data-viz-sparkline.mjs.map +0 -1
  71. package/fesm2022/weeehaoooz-talos-ui-feedback-alert.mjs +0 -534
  72. package/fesm2022/weeehaoooz-talos-ui-feedback-alert.mjs.map +0 -1
  73. package/fesm2022/weeehaoooz-talos-ui-feedback-dialog.mjs +0 -446
  74. package/fesm2022/weeehaoooz-talos-ui-feedback-dialog.mjs.map +0 -1
  75. package/fesm2022/weeehaoooz-talos-ui-feedback-snackbar.mjs +0 -376
  76. package/fesm2022/weeehaoooz-talos-ui-feedback-snackbar.mjs.map +0 -1
  77. package/fesm2022/weeehaoooz-talos-ui-feedback-tooltip.mjs +0 -147
  78. package/fesm2022/weeehaoooz-talos-ui-feedback-tooltip.mjs.map +0 -1
  79. package/fesm2022/weeehaoooz-talos-ui-form-affix.mjs +0 -242
  80. package/fesm2022/weeehaoooz-talos-ui-form-affix.mjs.map +0 -1
  81. package/fesm2022/weeehaoooz-talos-ui-form-autocomplete.mjs +0 -514
  82. package/fesm2022/weeehaoooz-talos-ui-form-autocomplete.mjs.map +0 -1
  83. package/fesm2022/weeehaoooz-talos-ui-form-checkbox.mjs +0 -548
  84. package/fesm2022/weeehaoooz-talos-ui-form-checkbox.mjs.map +0 -1
  85. package/fesm2022/weeehaoooz-talos-ui-form-chips.mjs +0 -692
  86. package/fesm2022/weeehaoooz-talos-ui-form-chips.mjs.map +0 -1
  87. package/fesm2022/weeehaoooz-talos-ui-form-color-picker.mjs +0 -761
  88. package/fesm2022/weeehaoooz-talos-ui-form-color-picker.mjs.map +0 -1
  89. package/fesm2022/weeehaoooz-talos-ui-form-date-picker.mjs +0 -896
  90. package/fesm2022/weeehaoooz-talos-ui-form-date-picker.mjs.map +0 -1
  91. package/fesm2022/weeehaoooz-talos-ui-form-date-range-picker.mjs +0 -872
  92. package/fesm2022/weeehaoooz-talos-ui-form-date-range-picker.mjs.map +0 -1
  93. package/fesm2022/weeehaoooz-talos-ui-form-date-time-picker.mjs +0 -119
  94. package/fesm2022/weeehaoooz-talos-ui-form-date-time-picker.mjs.map +0 -1
  95. package/fesm2022/weeehaoooz-talos-ui-form-date-time-range-picker.mjs +0 -135
  96. package/fesm2022/weeehaoooz-talos-ui-form-date-time-range-picker.mjs.map +0 -1
  97. package/fesm2022/weeehaoooz-talos-ui-form-drop-zone.mjs +0 -666
  98. package/fesm2022/weeehaoooz-talos-ui-form-drop-zone.mjs.map +0 -1
  99. package/fesm2022/weeehaoooz-talos-ui-form-form-field.mjs +0 -147
  100. package/fesm2022/weeehaoooz-talos-ui-form-form-field.mjs.map +0 -1
  101. package/fesm2022/weeehaoooz-talos-ui-form-input.mjs +0 -33
  102. package/fesm2022/weeehaoooz-talos-ui-form-input.mjs.map +0 -1
  103. package/fesm2022/weeehaoooz-talos-ui-form-otp.mjs +0 -455
  104. package/fesm2022/weeehaoooz-talos-ui-form-otp.mjs.map +0 -1
  105. package/fesm2022/weeehaoooz-talos-ui-form-password-input.mjs +0 -379
  106. package/fesm2022/weeehaoooz-talos-ui-form-password-input.mjs.map +0 -1
  107. package/fesm2022/weeehaoooz-talos-ui-form-radio.mjs +0 -297
  108. package/fesm2022/weeehaoooz-talos-ui-form-radio.mjs.map +0 -1
  109. package/fesm2022/weeehaoooz-talos-ui-form-range-input.mjs +0 -661
  110. package/fesm2022/weeehaoooz-talos-ui-form-range-input.mjs.map +0 -1
  111. package/fesm2022/weeehaoooz-talos-ui-form-rating.mjs +0 -346
  112. package/fesm2022/weeehaoooz-talos-ui-form-rating.mjs.map +0 -1
  113. package/fesm2022/weeehaoooz-talos-ui-form-select-input.mjs +0 -896
  114. package/fesm2022/weeehaoooz-talos-ui-form-select-input.mjs.map +0 -1
  115. package/fesm2022/weeehaoooz-talos-ui-form-slide-toggle.mjs +0 -252
  116. package/fesm2022/weeehaoooz-talos-ui-form-slide-toggle.mjs.map +0 -1
  117. package/fesm2022/weeehaoooz-talos-ui-form-transfer-list.mjs +0 -916
  118. package/fesm2022/weeehaoooz-talos-ui-form-transfer-list.mjs.map +0 -1
  119. package/types/weeehaoooz-talos-ui-button-button-group.d.ts +0 -62
  120. package/types/weeehaoooz-talos-ui-button-button-group.d.ts.map +0 -1
  121. package/types/weeehaoooz-talos-ui-button-button.d.ts +0 -38
  122. package/types/weeehaoooz-talos-ui-button-button.d.ts.map +0 -1
  123. package/types/weeehaoooz-talos-ui-data-display-badge.d.ts +0 -119
  124. package/types/weeehaoooz-talos-ui-data-display-badge.d.ts.map +0 -1
  125. package/types/weeehaoooz-talos-ui-data-display-data-grid.d.ts +0 -272
  126. package/types/weeehaoooz-talos-ui-data-display-data-grid.d.ts.map +0 -1
  127. package/types/weeehaoooz-talos-ui-data-display-status-tag.d.ts +0 -135
  128. package/types/weeehaoooz-talos-ui-data-display-status-tag.d.ts.map +0 -1
  129. package/types/weeehaoooz-talos-ui-data-display-timeline.d.ts +0 -144
  130. package/types/weeehaoooz-talos-ui-data-display-timeline.d.ts.map +0 -1
  131. package/types/weeehaoooz-talos-ui-data-display-trend-indicator.d.ts +0 -83
  132. package/types/weeehaoooz-talos-ui-data-display-trend-indicator.d.ts.map +0 -1
  133. package/types/weeehaoooz-talos-ui-data-viz-category-bar.d.ts +0 -255
  134. package/types/weeehaoooz-talos-ui-data-viz-category-bar.d.ts.map +0 -1
  135. package/types/weeehaoooz-talos-ui-data-viz-heatmap.d.ts +0 -204
  136. package/types/weeehaoooz-talos-ui-data-viz-heatmap.d.ts.map +0 -1
  137. package/types/weeehaoooz-talos-ui-data-viz-mini-donut.d.ts +0 -101
  138. package/types/weeehaoooz-talos-ui-data-viz-mini-donut.d.ts.map +0 -1
  139. package/types/weeehaoooz-talos-ui-data-viz-mini-gauge.d.ts +0 -138
  140. package/types/weeehaoooz-talos-ui-data-viz-mini-gauge.d.ts.map +0 -1
  141. package/types/weeehaoooz-talos-ui-data-viz-sparkline.d.ts +0 -161
  142. package/types/weeehaoooz-talos-ui-data-viz-sparkline.d.ts.map +0 -1
  143. package/types/weeehaoooz-talos-ui-feedback-alert.d.ts +0 -212
  144. package/types/weeehaoooz-talos-ui-feedback-alert.d.ts.map +0 -1
  145. package/types/weeehaoooz-talos-ui-feedback-dialog.d.ts +0 -259
  146. package/types/weeehaoooz-talos-ui-feedback-dialog.d.ts.map +0 -1
  147. package/types/weeehaoooz-talos-ui-feedback-snackbar.d.ts +0 -147
  148. package/types/weeehaoooz-talos-ui-feedback-snackbar.d.ts.map +0 -1
  149. package/types/weeehaoooz-talos-ui-feedback-tooltip.d.ts +0 -32
  150. package/types/weeehaoooz-talos-ui-feedback-tooltip.d.ts.map +0 -1
  151. package/types/weeehaoooz-talos-ui-form-affix.d.ts +0 -88
  152. package/types/weeehaoooz-talos-ui-form-affix.d.ts.map +0 -1
  153. package/types/weeehaoooz-talos-ui-form-autocomplete.d.ts +0 -113
  154. package/types/weeehaoooz-talos-ui-form-autocomplete.d.ts.map +0 -1
  155. package/types/weeehaoooz-talos-ui-form-checkbox.d.ts +0 -165
  156. package/types/weeehaoooz-talos-ui-form-checkbox.d.ts.map +0 -1
  157. package/types/weeehaoooz-talos-ui-form-chips.d.ts +0 -152
  158. package/types/weeehaoooz-talos-ui-form-chips.d.ts.map +0 -1
  159. package/types/weeehaoooz-talos-ui-form-color-picker.d.ts +0 -144
  160. package/types/weeehaoooz-talos-ui-form-color-picker.d.ts.map +0 -1
  161. package/types/weeehaoooz-talos-ui-form-date-picker.d.ts +0 -138
  162. package/types/weeehaoooz-talos-ui-form-date-picker.d.ts.map +0 -1
  163. package/types/weeehaoooz-talos-ui-form-date-range-picker.d.ts +0 -148
  164. package/types/weeehaoooz-talos-ui-form-date-range-picker.d.ts.map +0 -1
  165. package/types/weeehaoooz-talos-ui-form-date-time-picker.d.ts +0 -44
  166. package/types/weeehaoooz-talos-ui-form-date-time-picker.d.ts.map +0 -1
  167. package/types/weeehaoooz-talos-ui-form-date-time-range-picker.d.ts +0 -48
  168. package/types/weeehaoooz-talos-ui-form-date-time-range-picker.d.ts.map +0 -1
  169. package/types/weeehaoooz-talos-ui-form-drop-zone.d.ts +0 -227
  170. package/types/weeehaoooz-talos-ui-form-drop-zone.d.ts.map +0 -1
  171. package/types/weeehaoooz-talos-ui-form-form-field.d.ts +0 -42
  172. package/types/weeehaoooz-talos-ui-form-form-field.d.ts.map +0 -1
  173. package/types/weeehaoooz-talos-ui-form-input.d.ts +0 -15
  174. package/types/weeehaoooz-talos-ui-form-input.d.ts.map +0 -1
  175. package/types/weeehaoooz-talos-ui-form-otp.d.ts +0 -111
  176. package/types/weeehaoooz-talos-ui-form-otp.d.ts.map +0 -1
  177. package/types/weeehaoooz-talos-ui-form-password-input.d.ts +0 -145
  178. package/types/weeehaoooz-talos-ui-form-password-input.d.ts.map +0 -1
  179. package/types/weeehaoooz-talos-ui-form-radio.d.ts +0 -84
  180. package/types/weeehaoooz-talos-ui-form-radio.d.ts.map +0 -1
  181. package/types/weeehaoooz-talos-ui-form-range-input.d.ts +0 -181
  182. package/types/weeehaoooz-talos-ui-form-range-input.d.ts.map +0 -1
  183. package/types/weeehaoooz-talos-ui-form-rating.d.ts +0 -110
  184. package/types/weeehaoooz-talos-ui-form-rating.d.ts.map +0 -1
  185. package/types/weeehaoooz-talos-ui-form-select-input.d.ts +0 -195
  186. package/types/weeehaoooz-talos-ui-form-select-input.d.ts.map +0 -1
  187. package/types/weeehaoooz-talos-ui-form-slide-toggle.d.ts +0 -79
  188. package/types/weeehaoooz-talos-ui-form-slide-toggle.d.ts.map +0 -1
  189. package/types/weeehaoooz-talos-ui-form-transfer-list.d.ts +0 -192
  190. package/types/weeehaoooz-talos-ui-form-transfer-list.d.ts.map +0 -1
@@ -1,455 +0,0 @@
1
- import * as i0 from '@angular/core';
2
- import { input, output, computed, signal, effect, forwardRef, ViewChildren, Component, NgModule } from '@angular/core';
3
- import { NG_VALUE_ACCESSOR } from '@angular/forms';
4
-
5
- let uniqueOtpId = 0;
6
- class TalosOtpComponent {
7
- slotInputs;
8
- /** Total number of OTP digits/slots */
9
- length = input(6, /* @ts-ignore */
10
- ...(ngDevMode ? [{ debugName: "length" }] : /* istanbul ignore next */ []));
11
- /** Expected character input type ('number', 'text', 'password', 'alphanumeric') */
12
- type = input('number', /* @ts-ignore */
13
- ...(ngDevMode ? [{ debugName: "type" }] : /* istanbul ignore next */ []));
14
- /** Visual variant ('outlined' | 'filled' | 'underlined') */
15
- variant = input('outlined', /* @ts-ignore */
16
- ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
17
- /** Size scale ('sm' | 'md' | 'lg') */
18
- size = input('md', /* @ts-ignore */
19
- ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
20
- /** Whether to visually mask input characters */
21
- mask = input(false, /* @ts-ignore */
22
- ...(ngDevMode ? [{ debugName: "mask" }] : /* istanbul ignore next */ []));
23
- /** Character to display when masked */
24
- maskChar = input('•', /* @ts-ignore */
25
- ...(ngDevMode ? [{ debugName: "maskChar" }] : /* istanbul ignore next */ []));
26
- /** Single placeholder character for empty slots */
27
- placeholder = input('', /* @ts-ignore */
28
- ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
29
- /** Disabled state */
30
- disabled = input(false, /* @ts-ignore */
31
- ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
32
- /** Readonly state */
33
- readonly = input(false, /* @ts-ignore */
34
- ...(ngDevMode ? [{ debugName: "readonly" }] : /* istanbul ignore next */ []));
35
- /** Error / Invalid state */
36
- invalid = input(false, /* @ts-ignore */
37
- ...(ngDevMode ? [{ debugName: "invalid" }] : /* istanbul ignore next */ []));
38
- /** Automatically focus first slot on init */
39
- autoFocus = input(false, /* @ts-ignore */
40
- ...(ngDevMode ? [{ debugName: "autoFocus" }] : /* istanbul ignore next */ []));
41
- /** Optional separator character between slots or groups (e.g. '-') */
42
- separator = input('', /* @ts-ignore */
43
- ...(ngDevMode ? [{ debugName: "separator" }] : /* istanbul ignore next */ []));
44
- /**
45
- * Split configuration: number (interval), number[] (group sizes), or string (e.g. '3,3' or '2-2-2')
46
- */
47
- split = input(undefined, /* @ts-ignore */
48
- ...(ngDevMode ? [{ debugName: "split" }] : /* istanbul ignore next */ []));
49
- /** Frequency of separator insertion (e.g. 3 for grouping by 3) */
50
- separatorInterval = input(undefined, /* @ts-ignore */
51
- ...(ngDevMode ? [{ debugName: "separatorInterval" }] : /* istanbul ignore next */ []));
52
- /** Custom grouping sizes, e.g. [3, 3] or [4, 4] */
53
- grouping = input(undefined, /* @ts-ignore */
54
- ...(ngDevMode ? [{ debugName: "grouping" }] : /* istanbul ignore next */ []));
55
- /** Whether to allow alphanumeric characters when type is text or alphanumeric */
56
- allowAlphanumeric = input(false, /* @ts-ignore */
57
- ...(ngDevMode ? [{ debugName: "allowAlphanumeric" }] : /* istanbul ignore next */ []));
58
- /** Component HTML ID prefix */
59
- id = input('', /* @ts-ignore */
60
- ...(ngDevMode ? [{ debugName: "id" }] : /* istanbul ignore next */ []));
61
- /** Accessible label */
62
- ariaLabel = input('One-time password', /* @ts-ignore */
63
- ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
64
- /** Emitted whenever the combined value changes */
65
- valueChange = output();
66
- /** Emitted when all slots are filled */
67
- completed = output();
68
- /** Emitted with structured complete state */
69
- otpChange = output();
70
- // Internal reactive state
71
- defaultId = `talos-otp-${++uniqueOtpId}`;
72
- elementId = computed(() => this.id() || this.defaultId, /* @ts-ignore */
73
- ...(ngDevMode ? [{ debugName: "elementId" }] : /* istanbul ignore next */ []));
74
- disabledState = signal(false, /* @ts-ignore */
75
- ...(ngDevMode ? [{ debugName: "disabledState" }] : /* istanbul ignore next */ []));
76
- effectiveDisabled = computed(() => this.disabled() || this.disabledState(), /* @ts-ignore */
77
- ...(ngDevMode ? [{ debugName: "effectiveDisabled" }] : /* istanbul ignore next */ []));
78
- effectiveInvalid = computed(() => this.invalid(), /* @ts-ignore */
79
- ...(ngDevMode ? [{ debugName: "effectiveInvalid" }] : /* istanbul ignore next */ []));
80
- /** Slots array for iteration */
81
- slotIndices = computed(() => {
82
- const len = Math.max(1, Math.min(16, this.length()));
83
- return Array.from({ length: len }, (_, i) => i);
84
- }, /* @ts-ignore */
85
- ...(ngDevMode ? [{ debugName: "slotIndices" }] : /* istanbul ignore next */ []));
86
- /** Digit array holding current slot values */
87
- digitValues = signal([], /* @ts-ignore */
88
- ...(ngDevMode ? [{ debugName: "digitValues" }] : /* istanbul ignore next */ []));
89
- focusedIndex = signal(-1, /* @ts-ignore */
90
- ...(ngDevMode ? [{ debugName: "focusedIndex" }] : /* istanbul ignore next */ []));
91
- // Set of indices after which a separator should appear
92
- separatorIndices = computed(() => {
93
- const indices = new Set();
94
- const total = this.slotIndices().length;
95
- const sep = this.separator();
96
- const userSplit = this.parseSplit(this.split() ?? this.grouping());
97
- // If no separator string is provided or user explicitly disabled split:
98
- if (!sep || userSplit === 'none') {
99
- return indices;
100
- }
101
- // Check for explicit user split / grouping configuration
102
- const userInterval = this.separatorInterval();
103
- // If explicit grouping / array split is provided:
104
- if (Array.isArray(userSplit) && userSplit.length > 0) {
105
- let cumulative = 0;
106
- let splitCount = 0;
107
- for (let i = 0; i < userSplit.length - 1 && splitCount < 4; i++) {
108
- const chunkSize = Math.min(4, Math.max(1, userSplit[i]));
109
- cumulative += chunkSize;
110
- if (cumulative - 1 < total - 1) {
111
- indices.add(cumulative - 1);
112
- splitCount++;
113
- }
114
- }
115
- return indices;
116
- }
117
- // If explicit interval number is provided (via split or separatorInterval):
118
- const explicitInterval = typeof userSplit === 'number' ? userSplit : userInterval;
119
- if (explicitInterval != null && explicitInterval > 0) {
120
- const interval = Math.min(4, Math.max(1, explicitInterval));
121
- let splitCount = 0;
122
- for (let i = interval - 1; i < total - 1 && splitCount < 4; i += interval) {
123
- indices.add(i);
124
- splitCount++;
125
- }
126
- return indices;
127
- }
128
- // Automatic default split mode (no explicit split configured):
129
- // Suppress separators for 4 digits and below
130
- if (total < 5) {
131
- return indices;
132
- }
133
- // Automatic balanced grouping for 5+ digits (chunks of max 4, max 4 splits)
134
- let interval;
135
- if (total <= 8) {
136
- interval = Math.min(4, Math.ceil(total / 2));
137
- }
138
- else if (total <= 12) {
139
- interval = Math.min(4, Math.ceil(total / 3));
140
- }
141
- else {
142
- interval = 4;
143
- }
144
- let splitCount = 0;
145
- for (let i = interval - 1; i < total - 1 && splitCount < 4; i += interval) {
146
- indices.add(i);
147
- splitCount++;
148
- }
149
- return indices;
150
- }, /* @ts-ignore */
151
- ...(ngDevMode ? [{ debugName: "separatorIndices" }] : /* istanbul ignore next */ []));
152
- parseSplit(config) {
153
- if (config == null)
154
- return undefined;
155
- if (config === 'none' || config === false || config === 0)
156
- return 'none';
157
- if (config === true)
158
- return undefined;
159
- if (typeof config === 'number')
160
- return config > 0 ? config : 'none';
161
- if (Array.isArray(config))
162
- return config;
163
- if (typeof config === 'string') {
164
- const trimmed = config.trim().toLowerCase();
165
- if (trimmed === 'none' || trimmed === 'false' || trimmed === '0' || trimmed === 'off' || trimmed === 'no') {
166
- return 'none';
167
- }
168
- if (trimmed === 'auto' || trimmed === 'true') {
169
- return undefined;
170
- }
171
- if (/^\d+$/.test(trimmed)) {
172
- return parseInt(trimmed, 10);
173
- }
174
- const parts = trimmed
175
- .replace(/^\[|\]$/g, '')
176
- .split(/[\s,\-]+/)
177
- .map(p => parseInt(p.trim(), 10))
178
- .filter(n => !isNaN(n) && n > 0);
179
- if (parts.length > 0) {
180
- return parts;
181
- }
182
- }
183
- return undefined;
184
- }
185
- onChange = () => { };
186
- onTouched = () => { };
187
- constructor() {
188
- // Keep digitValues in sync with length
189
- effect(() => {
190
- const len = this.slotIndices().length;
191
- const current = this.digitValues();
192
- if (current.length !== len) {
193
- const next = Array.from({ length: len }, (_, i) => current[i] || '');
194
- this.digitValues.set(next);
195
- }
196
- }, { allowSignalWrites: true });
197
- }
198
- ngAfterViewInit() {
199
- if (this.autoFocus() && !this.effectiveDisabled() && !this.readonly()) {
200
- setTimeout(() => this.focusSlot(0), 50);
201
- }
202
- }
203
- /** Gets native input type for slots */
204
- getInputType() {
205
- if (this.mask() || this.type() === 'password') {
206
- return 'password';
207
- }
208
- return 'text';
209
- }
210
- /** Gets appropriate inputMode for mobile keyboards */
211
- getInputMode() {
212
- if (this.type() === 'number') {
213
- return 'numeric';
214
- }
215
- return 'text';
216
- }
217
- /** Value representation for slot */
218
- getSlotDisplayValue(index) {
219
- const val = this.digitValues()[index] || '';
220
- return val;
221
- }
222
- onSlotFocus(index, event) {
223
- if (this.effectiveDisabled() || this.readonly())
224
- return;
225
- this.focusedIndex.set(index);
226
- const target = event.target;
227
- if (target) {
228
- target.select();
229
- }
230
- }
231
- onSlotBlur() {
232
- this.focusedIndex.set(-1);
233
- this.onTouched();
234
- }
235
- onSlotKeyDown(event, index) {
236
- if (this.effectiveDisabled() || this.readonly())
237
- return;
238
- const key = event.key;
239
- if (key === 'Backspace') {
240
- event.preventDefault();
241
- const currentValues = [...this.digitValues()];
242
- if (currentValues[index]) {
243
- currentValues[index] = '';
244
- this.updateValues(currentValues);
245
- }
246
- else if (index > 0) {
247
- currentValues[index - 1] = '';
248
- this.updateValues(currentValues);
249
- this.focusSlot(index - 1);
250
- }
251
- return;
252
- }
253
- if (key === 'Delete') {
254
- event.preventDefault();
255
- const currentValues = [...this.digitValues()];
256
- currentValues[index] = '';
257
- this.updateValues(currentValues);
258
- return;
259
- }
260
- if (key === 'ArrowLeft') {
261
- event.preventDefault();
262
- if (index > 0) {
263
- this.focusSlot(index - 1);
264
- }
265
- return;
266
- }
267
- if (key === 'ArrowRight') {
268
- event.preventDefault();
269
- if (index < this.slotIndices().length - 1) {
270
- this.focusSlot(index + 1);
271
- }
272
- return;
273
- }
274
- if (key === 'Home') {
275
- event.preventDefault();
276
- this.focusSlot(0);
277
- return;
278
- }
279
- if (key === 'End') {
280
- event.preventDefault();
281
- this.focusSlot(this.slotIndices().length - 1);
282
- return;
283
- }
284
- // Single character input
285
- if (key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey) {
286
- if (this.isValidCharacter(key)) {
287
- event.preventDefault();
288
- const currentValues = [...this.digitValues()];
289
- currentValues[index] = this.type() === 'alphanumeric' ? key.toUpperCase() : key;
290
- this.updateValues(currentValues);
291
- if (index < this.slotIndices().length - 1) {
292
- this.focusSlot(index + 1);
293
- }
294
- }
295
- else {
296
- event.preventDefault();
297
- }
298
- }
299
- }
300
- onSlotInput(event, index) {
301
- if (this.effectiveDisabled() || this.readonly())
302
- return;
303
- const inputEl = event.target;
304
- const rawVal = inputEl.value;
305
- if (!rawVal) {
306
- const currentValues = [...this.digitValues()];
307
- currentValues[index] = '';
308
- this.updateValues(currentValues);
309
- return;
310
- }
311
- const lastChar = rawVal.slice(-1);
312
- if (this.isValidCharacter(lastChar)) {
313
- const currentValues = [...this.digitValues()];
314
- currentValues[index] = this.type() === 'alphanumeric' ? lastChar.toUpperCase() : lastChar;
315
- this.updateValues(currentValues);
316
- if (index < this.slotIndices().length - 1) {
317
- this.focusSlot(index + 1);
318
- }
319
- }
320
- else {
321
- inputEl.value = this.digitValues()[index] || '';
322
- }
323
- }
324
- onPaste(event, startIndex) {
325
- if (this.effectiveDisabled() || this.readonly())
326
- return;
327
- event.preventDefault();
328
- const clipboardData = event.clipboardData?.getData('text') || '';
329
- if (!clipboardData)
330
- return;
331
- const cleanChars = clipboardData
332
- .split('')
333
- .filter(char => this.isValidCharacter(char))
334
- .map(char => (this.type() === 'alphanumeric' ? char.toUpperCase() : char));
335
- if (cleanChars.length === 0)
336
- return;
337
- const totalSlots = this.slotIndices().length;
338
- const currentValues = [...this.digitValues()];
339
- // If pasted full string, start from 0; otherwise start from focused slot
340
- const start = cleanChars.length >= totalSlots ? 0 : startIndex;
341
- for (let i = 0; i < cleanChars.length && start + i < totalSlots; i++) {
342
- currentValues[start + i] = cleanChars[i];
343
- }
344
- this.updateValues(currentValues);
345
- const nextIndex = Math.min(start + cleanChars.length, totalSlots - 1);
346
- this.focusSlot(nextIndex);
347
- }
348
- /** Validates whether a single character is allowed based on input type */
349
- isValidCharacter(char) {
350
- if (this.type() === 'number') {
351
- return /^[0-9]$/.test(char);
352
- }
353
- if (this.type() === 'alphanumeric' || this.allowAlphanumeric()) {
354
- return /^[a-zA-Z0-9]$/.test(char);
355
- }
356
- return true;
357
- }
358
- /** Focuses the slot input at the specified index */
359
- focusSlot(index) {
360
- if (!this.slotInputs)
361
- return;
362
- const inputsArray = this.slotInputs.toArray();
363
- if (inputsArray[index]) {
364
- inputsArray[index].nativeElement.focus();
365
- inputsArray[index].nativeElement.select();
366
- }
367
- }
368
- /** Clears all slot values */
369
- clear() {
370
- const emptyValues = Array.from({ length: this.slotIndices().length }, () => '');
371
- this.updateValues(emptyValues);
372
- this.focusSlot(0);
373
- }
374
- /** Updates internal state, triggers CVA, and emits change events */
375
- updateValues(values) {
376
- this.digitValues.set(values);
377
- const combinedValue = values.join('');
378
- const total = this.slotIndices().length;
379
- const isComplete = combinedValue.length === total && values.every(v => v.length > 0);
380
- this.onChange(combinedValue);
381
- this.valueChange.emit(combinedValue);
382
- this.otpChange.emit({ value: combinedValue, isComplete });
383
- if (isComplete) {
384
- this.completed.emit(combinedValue);
385
- }
386
- }
387
- // --- ControlValueAccessor Implementation ---
388
- writeValue(obj) {
389
- const str = obj != null ? String(obj) : '';
390
- const total = this.slotIndices().length;
391
- const newValues = Array.from({ length: total }, (_, i) => str[i] || '');
392
- this.digitValues.set(newValues);
393
- }
394
- registerOnChange(fn) {
395
- this.onChange = fn;
396
- }
397
- registerOnTouched(fn) {
398
- this.onTouched = fn;
399
- }
400
- setDisabledState(isDisabled) {
401
- this.disabledState.set(isDisabled);
402
- }
403
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: TalosOtpComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
404
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.1", type: TalosOtpComponent, isStandalone: true, selector: "talos-otp, talos-otp-input, talos-pin-input", inputs: { length: { classPropertyName: "length", publicName: "length", isSignal: true, isRequired: false, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, mask: { classPropertyName: "mask", publicName: "mask", isSignal: true, isRequired: false, transformFunction: null }, maskChar: { classPropertyName: "maskChar", publicName: "maskChar", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, invalid: { classPropertyName: "invalid", publicName: "invalid", isSignal: true, isRequired: false, transformFunction: null }, autoFocus: { classPropertyName: "autoFocus", publicName: "autoFocus", isSignal: true, isRequired: false, transformFunction: null }, separator: { classPropertyName: "separator", publicName: "separator", isSignal: true, isRequired: false, transformFunction: null }, split: { classPropertyName: "split", publicName: "split", isSignal: true, isRequired: false, transformFunction: null }, separatorInterval: { classPropertyName: "separatorInterval", publicName: "separatorInterval", isSignal: true, isRequired: false, transformFunction: null }, grouping: { classPropertyName: "grouping", publicName: "grouping", isSignal: true, isRequired: false, transformFunction: null }, allowAlphanumeric: { classPropertyName: "allowAlphanumeric", publicName: "allowAlphanumeric", isSignal: true, isRequired: false, transformFunction: null }, id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange", completed: "completed", otpChange: "otpChange" }, host: { properties: { "class.is-disabled": "effectiveDisabled()", "class.is-readonly": "readonly()", "class.is-invalid": "effectiveInvalid()", "class.otp-sm": "size() === \"sm\"", "class.otp-md": "size() === \"md\"", "class.otp-lg": "size() === \"lg\"", "class.otp-outlined": "variant() === \"outlined\"", "class.otp-filled": "variant() === \"filled\"", "class.otp-underlined": "variant() === \"underlined\"" }, classAttribute: "talos-otp-host" }, providers: [
405
- {
406
- provide: NG_VALUE_ACCESSOR,
407
- useExisting: forwardRef(() => TalosOtpComponent),
408
- multi: true
409
- }
410
- ], viewQueries: [{ propertyName: "slotInputs", predicate: ["slotInput"], descendants: true }], ngImport: i0, template: "<div\n class=\"talos-otp-container\"\n role=\"group\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.id]=\"elementId()\"\n>\n @for (index of slotIndices(); track index) {\n <div\n class=\"talos-otp-slot-wrapper\"\n [class.is-focused]=\"focusedIndex() === index\"\n [class.is-filled]=\"!!digitValues()[index]\"\n >\n <input\n #slotInput\n class=\"talos-otp-slot\"\n [type]=\"getInputType()\"\n [attr.inputmode]=\"getInputMode()\"\n autocomplete=\"one-time-code\"\n [value]=\"getSlotDisplayValue(index)\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"effectiveDisabled()\"\n [readOnly]=\"readonly()\"\n [attr.aria-label]=\"'Digit ' + (index + 1) + ' of ' + slotIndices().length\"\n [attr.aria-invalid]=\"effectiveInvalid()\"\n (focus)=\"onSlotFocus(index, $event)\"\n (blur)=\"onSlotBlur()\"\n (keydown)=\"onSlotKeyDown($event, index)\"\n (input)=\"onSlotInput($event, index)\"\n (paste)=\"onPaste($event, index)\"\n />\n </div>\n\n @if (separatorIndices().has(index)) {\n <span class=\"talos-otp-separator\" aria-hidden=\"true\">\n {{ separator() || '\u2013' }}\n </span>\n }\n }\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:inline-block;-webkit-user-select:none;user-select:none}.talos-otp-container{display:inline-flex;align-items:center;gap:var(--talos-otp-gap, .5rem);position:relative}.talos-otp-slot-wrapper{position:relative;display:inline-flex;align-items:center;justify-content:center;transition:transform .15s cubic-bezier(.4,0,.2,1)}.talos-otp-slot-wrapper.is-focused{transform:translateY(-1px)}.talos-otp-slot{width:var(--talos-otp-slot-width, 42px);height:var(--talos-otp-slot-height, 48px);text-align:center;font-family:inherit;font-weight:600;font-size:var(--talos-otp-font-size, 1.125rem);color:var(--talos-text-color, #0f172a);background-color:var(--talos-input-bg, #ffffff);border:1.5px solid var(--talos-border-color, #e2e8f0);border-radius:var(--talos-radius-md, 8px);outline:none;padding:0;margin:0;box-sizing:border-box;caret-color:var(--talos-primary, #3b82f6);transition:all .18s cubic-bezier(.4,0,.2,1)}.talos-otp-slot::placeholder{color:var(--talos-placeholder-color, #94a3b8);font-weight:400}.talos-otp-slot:focus{border-color:var(--talos-primary, #3b82f6);box-shadow:0 0 0 3px #3b82f62e;z-index:2}.talos-otp-slot:disabled{background-color:var(--talos-bg-subtle, #f8fafc);color:var(--talos-text-muted, #94a3b8);border-color:var(--talos-border-color, #e2e8f0);cursor:not-allowed;opacity:.6}.talos-otp-slot:read-only:not(:disabled){background-color:var(--talos-bg-subtle, #f8fafc);cursor:default}.talos-otp-separator{display:inline-flex;align-items:center;justify-content:center;font-weight:600;font-size:var(--talos-otp-font-size, 1.125rem);color:var(--talos-text-muted, #94a3b8);padding:0 .125rem}:host(.otp-sm) .talos-otp-container{--talos-otp-gap: .375rem}:host(.otp-sm) .talos-otp-slot{--talos-otp-slot-width: 34px;--talos-otp-slot-height: 38px;--talos-otp-font-size: .9375rem;border-radius:var(--talos-radius-sm, 6px)}:host(.otp-md) .talos-otp-container{--talos-otp-gap: .5rem}:host(.otp-md) .talos-otp-slot{--talos-otp-slot-width: 44px;--talos-otp-slot-height: 50px;--talos-otp-font-size: 1.1875rem;border-radius:var(--talos-radius-md, 8px)}:host(.otp-lg) .talos-otp-container{--talos-otp-gap: .625rem}:host(.otp-lg) .talos-otp-slot{--talos-otp-slot-width: 52px;--talos-otp-slot-height: 60px;--talos-otp-font-size: 1.375rem;border-radius:var(--talos-radius-lg, 10px)}:host(.otp-filled) .talos-otp-slot{background-color:var(--talos-bg-subtle, #f1f5f9);border-color:transparent}:host(.otp-filled) .talos-otp-slot:focus{background-color:var(--talos-input-bg, #ffffff);border-color:var(--talos-primary, #3b82f6)}:host(.otp-underlined) .talos-otp-slot{background-color:transparent;border-top:none;border-left:none;border-right:none;border-bottom:2.5px solid var(--talos-border-color, #cbd5e1);border-radius:0}:host(.otp-underlined) .talos-otp-slot:focus{border-bottom-color:var(--talos-primary, #3b82f6);box-shadow:none}:host(.is-invalid) .talos-otp-slot{border-color:var(--talos-error, #ef4444)!important}:host(.is-invalid) .talos-otp-slot:focus{box-shadow:0 0 0 3px #ef444433!important}:host-context(.dark) .talos-otp-slot{color:var(--talos-text-color, #f8fafc);background-color:var(--talos-card-bg, #1e293b);border-color:var(--talos-border-color, #334155)}:host-context(.dark) .talos-otp-slot:focus{border-color:var(--talos-primary, #60a5fa);box-shadow:0 0 0 3px #60a5fa40}:host-context(.dark) .talos-otp-slot:disabled{background-color:#0f172a80;border-color:#1e293b;color:#64748b}:host-context(.dark).otp-filled .talos-otp-slot{background-color:#1e293bcc;border-color:transparent}:host-context(.dark).otp-filled .talos-otp-slot:focus{background-color:var(--talos-card-bg, #1e293b);border-color:var(--talos-primary, #60a5fa)}:host-context(.dark).otp-underlined .talos-otp-slot{background-color:transparent;border-bottom-color:var(--talos-border-color, #475569)}:host-context(.dark).otp-underlined .talos-otp-slot:focus{border-bottom-color:var(--talos-primary, #60a5fa)}\n"] });
411
- }
412
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: TalosOtpComponent, decorators: [{
413
- type: Component,
414
- args: [{ selector: 'talos-otp, talos-otp-input, talos-pin-input', imports: [], providers: [
415
- {
416
- provide: NG_VALUE_ACCESSOR,
417
- useExisting: forwardRef(() => TalosOtpComponent),
418
- multi: true
419
- }
420
- ], host: {
421
- 'class': 'talos-otp-host',
422
- '[class.is-disabled]': 'effectiveDisabled()',
423
- '[class.is-readonly]': 'readonly()',
424
- '[class.is-invalid]': 'effectiveInvalid()',
425
- '[class.otp-sm]': 'size() === "sm"',
426
- '[class.otp-md]': 'size() === "md"',
427
- '[class.otp-lg]': 'size() === "lg"',
428
- '[class.otp-outlined]': 'variant() === "outlined"',
429
- '[class.otp-filled]': 'variant() === "filled"',
430
- '[class.otp-underlined]': 'variant() === "underlined"'
431
- }, template: "<div\n class=\"talos-otp-container\"\n role=\"group\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.id]=\"elementId()\"\n>\n @for (index of slotIndices(); track index) {\n <div\n class=\"talos-otp-slot-wrapper\"\n [class.is-focused]=\"focusedIndex() === index\"\n [class.is-filled]=\"!!digitValues()[index]\"\n >\n <input\n #slotInput\n class=\"talos-otp-slot\"\n [type]=\"getInputType()\"\n [attr.inputmode]=\"getInputMode()\"\n autocomplete=\"one-time-code\"\n [value]=\"getSlotDisplayValue(index)\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"effectiveDisabled()\"\n [readOnly]=\"readonly()\"\n [attr.aria-label]=\"'Digit ' + (index + 1) + ' of ' + slotIndices().length\"\n [attr.aria-invalid]=\"effectiveInvalid()\"\n (focus)=\"onSlotFocus(index, $event)\"\n (blur)=\"onSlotBlur()\"\n (keydown)=\"onSlotKeyDown($event, index)\"\n (input)=\"onSlotInput($event, index)\"\n (paste)=\"onPaste($event, index)\"\n />\n </div>\n\n @if (separatorIndices().has(index)) {\n <span class=\"talos-otp-separator\" aria-hidden=\"true\">\n {{ separator() || '\u2013' }}\n </span>\n }\n }\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:inline-block;-webkit-user-select:none;user-select:none}.talos-otp-container{display:inline-flex;align-items:center;gap:var(--talos-otp-gap, .5rem);position:relative}.talos-otp-slot-wrapper{position:relative;display:inline-flex;align-items:center;justify-content:center;transition:transform .15s cubic-bezier(.4,0,.2,1)}.talos-otp-slot-wrapper.is-focused{transform:translateY(-1px)}.talos-otp-slot{width:var(--talos-otp-slot-width, 42px);height:var(--talos-otp-slot-height, 48px);text-align:center;font-family:inherit;font-weight:600;font-size:var(--talos-otp-font-size, 1.125rem);color:var(--talos-text-color, #0f172a);background-color:var(--talos-input-bg, #ffffff);border:1.5px solid var(--talos-border-color, #e2e8f0);border-radius:var(--talos-radius-md, 8px);outline:none;padding:0;margin:0;box-sizing:border-box;caret-color:var(--talos-primary, #3b82f6);transition:all .18s cubic-bezier(.4,0,.2,1)}.talos-otp-slot::placeholder{color:var(--talos-placeholder-color, #94a3b8);font-weight:400}.talos-otp-slot:focus{border-color:var(--talos-primary, #3b82f6);box-shadow:0 0 0 3px #3b82f62e;z-index:2}.talos-otp-slot:disabled{background-color:var(--talos-bg-subtle, #f8fafc);color:var(--talos-text-muted, #94a3b8);border-color:var(--talos-border-color, #e2e8f0);cursor:not-allowed;opacity:.6}.talos-otp-slot:read-only:not(:disabled){background-color:var(--talos-bg-subtle, #f8fafc);cursor:default}.talos-otp-separator{display:inline-flex;align-items:center;justify-content:center;font-weight:600;font-size:var(--talos-otp-font-size, 1.125rem);color:var(--talos-text-muted, #94a3b8);padding:0 .125rem}:host(.otp-sm) .talos-otp-container{--talos-otp-gap: .375rem}:host(.otp-sm) .talos-otp-slot{--talos-otp-slot-width: 34px;--talos-otp-slot-height: 38px;--talos-otp-font-size: .9375rem;border-radius:var(--talos-radius-sm, 6px)}:host(.otp-md) .talos-otp-container{--talos-otp-gap: .5rem}:host(.otp-md) .talos-otp-slot{--talos-otp-slot-width: 44px;--talos-otp-slot-height: 50px;--talos-otp-font-size: 1.1875rem;border-radius:var(--talos-radius-md, 8px)}:host(.otp-lg) .talos-otp-container{--talos-otp-gap: .625rem}:host(.otp-lg) .talos-otp-slot{--talos-otp-slot-width: 52px;--talos-otp-slot-height: 60px;--talos-otp-font-size: 1.375rem;border-radius:var(--talos-radius-lg, 10px)}:host(.otp-filled) .talos-otp-slot{background-color:var(--talos-bg-subtle, #f1f5f9);border-color:transparent}:host(.otp-filled) .talos-otp-slot:focus{background-color:var(--talos-input-bg, #ffffff);border-color:var(--talos-primary, #3b82f6)}:host(.otp-underlined) .talos-otp-slot{background-color:transparent;border-top:none;border-left:none;border-right:none;border-bottom:2.5px solid var(--talos-border-color, #cbd5e1);border-radius:0}:host(.otp-underlined) .talos-otp-slot:focus{border-bottom-color:var(--talos-primary, #3b82f6);box-shadow:none}:host(.is-invalid) .talos-otp-slot{border-color:var(--talos-error, #ef4444)!important}:host(.is-invalid) .talos-otp-slot:focus{box-shadow:0 0 0 3px #ef444433!important}:host-context(.dark) .talos-otp-slot{color:var(--talos-text-color, #f8fafc);background-color:var(--talos-card-bg, #1e293b);border-color:var(--talos-border-color, #334155)}:host-context(.dark) .talos-otp-slot:focus{border-color:var(--talos-primary, #60a5fa);box-shadow:0 0 0 3px #60a5fa40}:host-context(.dark) .talos-otp-slot:disabled{background-color:#0f172a80;border-color:#1e293b;color:#64748b}:host-context(.dark).otp-filled .talos-otp-slot{background-color:#1e293bcc;border-color:transparent}:host-context(.dark).otp-filled .talos-otp-slot:focus{background-color:var(--talos-card-bg, #1e293b);border-color:var(--talos-primary, #60a5fa)}:host-context(.dark).otp-underlined .talos-otp-slot{background-color:transparent;border-bottom-color:var(--talos-border-color, #475569)}:host-context(.dark).otp-underlined .talos-otp-slot:focus{border-bottom-color:var(--talos-primary, #60a5fa)}\n"] }]
432
- }], ctorParameters: () => [], propDecorators: { slotInputs: [{
433
- type: ViewChildren,
434
- args: ['slotInput']
435
- }], length: [{ type: i0.Input, args: [{ isSignal: true, alias: "length", required: false }] }], type: [{ type: i0.Input, args: [{ isSignal: true, alias: "type", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], mask: [{ type: i0.Input, args: [{ isSignal: true, alias: "mask", required: false }] }], maskChar: [{ type: i0.Input, args: [{ isSignal: true, alias: "maskChar", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], invalid: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }], autoFocus: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoFocus", required: false }] }], separator: [{ type: i0.Input, args: [{ isSignal: true, alias: "separator", required: false }] }], split: [{ type: i0.Input, args: [{ isSignal: true, alias: "split", required: false }] }], separatorInterval: [{ type: i0.Input, args: [{ isSignal: true, alias: "separatorInterval", required: false }] }], grouping: [{ type: i0.Input, args: [{ isSignal: true, alias: "grouping", required: false }] }], allowAlphanumeric: [{ type: i0.Input, args: [{ isSignal: true, alias: "allowAlphanumeric", required: false }] }], id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], valueChange: [{ type: i0.Output, args: ["valueChange"] }], completed: [{ type: i0.Output, args: ["completed"] }], otpChange: [{ type: i0.Output, args: ["otpChange"] }] } });
436
-
437
- class TalosOtpModule {
438
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: TalosOtpModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
439
- static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.1.1", ngImport: i0, type: TalosOtpModule, imports: [TalosOtpComponent], exports: [TalosOtpComponent] });
440
- static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: TalosOtpModule });
441
- }
442
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: TalosOtpModule, decorators: [{
443
- type: NgModule,
444
- args: [{
445
- imports: [TalosOtpComponent],
446
- exports: [TalosOtpComponent]
447
- }]
448
- }] });
449
-
450
- /**
451
- * Generated bundle index. Do not edit.
452
- */
453
-
454
- export { TalosOtpComponent, TalosOtpModule };
455
- //# sourceMappingURL=weeehaoooz-talos-ui-form-otp.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"weeehaoooz-talos-ui-form-otp.mjs","sources":["../../../projects/talos-ui/form/otp/otp.component.ts","../../../projects/talos-ui/form/otp/otp.component.html","../../../projects/talos-ui/form/otp/otp.module.ts","../../../projects/talos-ui/form/otp/weeehaoooz-talos-ui-form-otp.ts"],"sourcesContent":["import {\n Component,\n ElementRef,\n ViewChildren,\n QueryList,\n computed,\n effect,\n forwardRef,\n input,\n output,\n signal,\n AfterViewInit\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { OtpCompletedEvent, OtpInputType, OtpSize, OtpSplitConfig, OtpVariant } from './otp.types';\n\nlet uniqueOtpId = 0;\n\n@Component({\n selector: 'talos-otp, talos-otp-input, talos-pin-input',\n imports: [],\n templateUrl: './otp.component.html',\n styleUrl: './otp.component.scss',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => TalosOtpComponent),\n multi: true\n }\n ],\n host: {\n 'class': 'talos-otp-host',\n '[class.is-disabled]': 'effectiveDisabled()',\n '[class.is-readonly]': 'readonly()',\n '[class.is-invalid]': 'effectiveInvalid()',\n '[class.otp-sm]': 'size() === \"sm\"',\n '[class.otp-md]': 'size() === \"md\"',\n '[class.otp-lg]': 'size() === \"lg\"',\n '[class.otp-outlined]': 'variant() === \"outlined\"',\n '[class.otp-filled]': 'variant() === \"filled\"',\n '[class.otp-underlined]': 'variant() === \"underlined\"'\n }\n})\nexport class TalosOtpComponent implements ControlValueAccessor, AfterViewInit {\n @ViewChildren('slotInput') slotInputs!: QueryList<ElementRef<HTMLInputElement>>;\n\n /** Total number of OTP digits/slots */\n readonly length = input<number>(6);\n\n /** Expected character input type ('number', 'text', 'password', 'alphanumeric') */\n readonly type = input<OtpInputType>('number');\n\n /** Visual variant ('outlined' | 'filled' | 'underlined') */\n readonly variant = input<OtpVariant>('outlined');\n\n /** Size scale ('sm' | 'md' | 'lg') */\n readonly size = input<OtpSize>('md');\n\n /** Whether to visually mask input characters */\n readonly mask = input<boolean>(false);\n\n /** Character to display when masked */\n readonly maskChar = input<string>('•');\n\n /** Single placeholder character for empty slots */\n readonly placeholder = input<string>('');\n\n /** Disabled state */\n readonly disabled = input<boolean>(false);\n\n /** Readonly state */\n readonly readonly = input<boolean>(false);\n\n /** Error / Invalid state */\n readonly invalid = input<boolean>(false);\n\n /** Automatically focus first slot on init */\n readonly autoFocus = input<boolean>(false);\n\n /** Optional separator character between slots or groups (e.g. '-') */\n readonly separator = input<string>('');\n\n /**\n * Split configuration: number (interval), number[] (group sizes), or string (e.g. '3,3' or '2-2-2')\n */\n readonly split = input<OtpSplitConfig | undefined>(undefined);\n\n /** Frequency of separator insertion (e.g. 3 for grouping by 3) */\n readonly separatorInterval = input<number | undefined>(undefined);\n\n /** Custom grouping sizes, e.g. [3, 3] or [4, 4] */\n readonly grouping = input<OtpSplitConfig | undefined>(undefined);\n\n /** Whether to allow alphanumeric characters when type is text or alphanumeric */\n readonly allowAlphanumeric = input<boolean>(false);\n\n /** Component HTML ID prefix */\n readonly id = input<string>('');\n\n /** Accessible label */\n readonly ariaLabel = input<string>('One-time password');\n\n /** Emitted whenever the combined value changes */\n readonly valueChange = output<string>();\n\n /** Emitted when all slots are filled */\n readonly completed = output<string>();\n\n /** Emitted with structured complete state */\n readonly otpChange = output<OtpCompletedEvent>();\n\n // Internal reactive state\n private readonly defaultId = `talos-otp-${++uniqueOtpId}`;\n readonly elementId = computed(() => this.id() || this.defaultId);\n\n private readonly disabledState = signal<boolean>(false);\n readonly effectiveDisabled = computed(() => this.disabled() || this.disabledState());\n readonly effectiveInvalid = computed(() => this.invalid());\n\n /** Slots array for iteration */\n readonly slotIndices = computed(() => {\n const len = Math.max(1, Math.min(16, this.length()));\n return Array.from({ length: len }, (_, i) => i);\n });\n\n /** Digit array holding current slot values */\n readonly digitValues = signal<string[]>([]);\n readonly focusedIndex = signal<number>(-1);\n\n // Set of indices after which a separator should appear\n readonly separatorIndices = computed<Set<number>>(() => {\n const indices = new Set<number>();\n const total = this.slotIndices().length;\n const sep = this.separator();\n const userSplit = this.parseSplit(this.split() ?? this.grouping());\n\n // If no separator string is provided or user explicitly disabled split:\n if (!sep || userSplit === 'none') {\n return indices;\n }\n\n // Check for explicit user split / grouping configuration\n const userInterval = this.separatorInterval();\n\n // If explicit grouping / array split is provided:\n if (Array.isArray(userSplit) && userSplit.length > 0) {\n let cumulative = 0;\n let splitCount = 0;\n for (let i = 0; i < userSplit.length - 1 && splitCount < 4; i++) {\n const chunkSize = Math.min(4, Math.max(1, userSplit[i]));\n cumulative += chunkSize;\n if (cumulative - 1 < total - 1) {\n indices.add(cumulative - 1);\n splitCount++;\n }\n }\n return indices;\n }\n\n // If explicit interval number is provided (via split or separatorInterval):\n const explicitInterval = typeof userSplit === 'number' ? userSplit : userInterval;\n if (explicitInterval != null && explicitInterval > 0) {\n const interval = Math.min(4, Math.max(1, explicitInterval));\n let splitCount = 0;\n for (let i = interval - 1; i < total - 1 && splitCount < 4; i += interval) {\n indices.add(i);\n splitCount++;\n }\n return indices;\n }\n\n // Automatic default split mode (no explicit split configured):\n // Suppress separators for 4 digits and below\n if (total < 5) {\n return indices;\n }\n\n // Automatic balanced grouping for 5+ digits (chunks of max 4, max 4 splits)\n let interval: number;\n if (total <= 8) {\n interval = Math.min(4, Math.ceil(total / 2));\n } else if (total <= 12) {\n interval = Math.min(4, Math.ceil(total / 3));\n } else {\n interval = 4;\n }\n\n let splitCount = 0;\n for (let i = interval - 1; i < total - 1 && splitCount < 4; i += interval) {\n indices.add(i);\n splitCount++;\n }\n\n return indices;\n });\n\n private parseSplit(config: OtpSplitConfig | undefined): number[] | number | 'none' | undefined {\n if (config == null) return undefined;\n if (config === 'none' || config === false || config === 0) return 'none';\n if (config === true) return undefined;\n if (typeof config === 'number') return config > 0 ? config : 'none';\n if (Array.isArray(config)) return config;\n if (typeof config === 'string') {\n const trimmed = config.trim().toLowerCase();\n if (trimmed === 'none' || trimmed === 'false' || trimmed === '0' || trimmed === 'off' || trimmed === 'no') {\n return 'none';\n }\n if (trimmed === 'auto' || trimmed === 'true') {\n return undefined;\n }\n if (/^\\d+$/.test(trimmed)) {\n return parseInt(trimmed, 10);\n }\n const parts = trimmed\n .replace(/^\\[|\\]$/g, '')\n .split(/[\\s,\\-]+/)\n .map(p => parseInt(p.trim(), 10))\n .filter(n => !isNaN(n) && n > 0);\n if (parts.length > 0) {\n return parts;\n }\n }\n return undefined;\n }\n\n private onChange: (value: string) => void = () => {};\n private onTouched: () => void = () => {};\n\n constructor() {\n // Keep digitValues in sync with length\n effect(\n () => {\n const len = this.slotIndices().length;\n const current = this.digitValues();\n if (current.length !== len) {\n const next = Array.from({ length: len }, (_, i) => current[i] || '');\n this.digitValues.set(next);\n }\n },\n { allowSignalWrites: true }\n );\n }\n\n ngAfterViewInit(): void {\n if (this.autoFocus() && !this.effectiveDisabled() && !this.readonly()) {\n setTimeout(() => this.focusSlot(0), 50);\n }\n }\n\n /** Gets native input type for slots */\n getInputType(): string {\n if (this.mask() || this.type() === 'password') {\n return 'password';\n }\n return 'text';\n }\n\n /** Gets appropriate inputMode for mobile keyboards */\n getInputMode(): string {\n if (this.type() === 'number') {\n return 'numeric';\n }\n return 'text';\n }\n\n /** Value representation for slot */\n getSlotDisplayValue(index: number): string {\n const val = this.digitValues()[index] || '';\n return val;\n }\n\n onSlotFocus(index: number, event: FocusEvent): void {\n if (this.effectiveDisabled() || this.readonly()) return;\n this.focusedIndex.set(index);\n const target = event.target as HTMLInputElement;\n if (target) {\n target.select();\n }\n }\n\n onSlotBlur(): void {\n this.focusedIndex.set(-1);\n this.onTouched();\n }\n\n onSlotKeyDown(event: KeyboardEvent, index: number): void {\n if (this.effectiveDisabled() || this.readonly()) return;\n\n const key = event.key;\n\n if (key === 'Backspace') {\n event.preventDefault();\n const currentValues = [...this.digitValues()];\n if (currentValues[index]) {\n currentValues[index] = '';\n this.updateValues(currentValues);\n } else if (index > 0) {\n currentValues[index - 1] = '';\n this.updateValues(currentValues);\n this.focusSlot(index - 1);\n }\n return;\n }\n\n if (key === 'Delete') {\n event.preventDefault();\n const currentValues = [...this.digitValues()];\n currentValues[index] = '';\n this.updateValues(currentValues);\n return;\n }\n\n if (key === 'ArrowLeft') {\n event.preventDefault();\n if (index > 0) {\n this.focusSlot(index - 1);\n }\n return;\n }\n\n if (key === 'ArrowRight') {\n event.preventDefault();\n if (index < this.slotIndices().length - 1) {\n this.focusSlot(index + 1);\n }\n return;\n }\n\n if (key === 'Home') {\n event.preventDefault();\n this.focusSlot(0);\n return;\n }\n\n if (key === 'End') {\n event.preventDefault();\n this.focusSlot(this.slotIndices().length - 1);\n return;\n }\n\n // Single character input\n if (key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey) {\n if (this.isValidCharacter(key)) {\n event.preventDefault();\n const currentValues = [...this.digitValues()];\n currentValues[index] = this.type() === 'alphanumeric' ? key.toUpperCase() : key;\n this.updateValues(currentValues);\n\n if (index < this.slotIndices().length - 1) {\n this.focusSlot(index + 1);\n }\n } else {\n event.preventDefault();\n }\n }\n }\n\n onSlotInput(event: Event, index: number): void {\n if (this.effectiveDisabled() || this.readonly()) return;\n\n const inputEl = event.target as HTMLInputElement;\n const rawVal = inputEl.value;\n\n if (!rawVal) {\n const currentValues = [...this.digitValues()];\n currentValues[index] = '';\n this.updateValues(currentValues);\n return;\n }\n\n const lastChar = rawVal.slice(-1);\n if (this.isValidCharacter(lastChar)) {\n const currentValues = [...this.digitValues()];\n currentValues[index] = this.type() === 'alphanumeric' ? lastChar.toUpperCase() : lastChar;\n this.updateValues(currentValues);\n\n if (index < this.slotIndices().length - 1) {\n this.focusSlot(index + 1);\n }\n } else {\n inputEl.value = this.digitValues()[index] || '';\n }\n }\n\n onPaste(event: ClipboardEvent, startIndex: number): void {\n if (this.effectiveDisabled() || this.readonly()) return;\n\n event.preventDefault();\n const clipboardData = event.clipboardData?.getData('text') || '';\n if (!clipboardData) return;\n\n const cleanChars = clipboardData\n .split('')\n .filter(char => this.isValidCharacter(char))\n .map(char => (this.type() === 'alphanumeric' ? char.toUpperCase() : char));\n\n if (cleanChars.length === 0) return;\n\n const totalSlots = this.slotIndices().length;\n const currentValues = [...this.digitValues()];\n\n // If pasted full string, start from 0; otherwise start from focused slot\n const start = cleanChars.length >= totalSlots ? 0 : startIndex;\n\n for (let i = 0; i < cleanChars.length && start + i < totalSlots; i++) {\n currentValues[start + i] = cleanChars[i];\n }\n\n this.updateValues(currentValues);\n\n const nextIndex = Math.min(start + cleanChars.length, totalSlots - 1);\n this.focusSlot(nextIndex);\n }\n\n /** Validates whether a single character is allowed based on input type */\n private isValidCharacter(char: string): boolean {\n if (this.type() === 'number') {\n return /^[0-9]$/.test(char);\n }\n if (this.type() === 'alphanumeric' || this.allowAlphanumeric()) {\n return /^[a-zA-Z0-9]$/.test(char);\n }\n return true;\n }\n\n /** Focuses the slot input at the specified index */\n focusSlot(index: number): void {\n if (!this.slotInputs) return;\n const inputsArray = this.slotInputs.toArray();\n if (inputsArray[index]) {\n inputsArray[index].nativeElement.focus();\n inputsArray[index].nativeElement.select();\n }\n }\n\n /** Clears all slot values */\n clear(): void {\n const emptyValues = Array.from({ length: this.slotIndices().length }, () => '');\n this.updateValues(emptyValues);\n this.focusSlot(0);\n }\n\n /** Updates internal state, triggers CVA, and emits change events */\n private updateValues(values: string[]): void {\n this.digitValues.set(values);\n const combinedValue = values.join('');\n const total = this.slotIndices().length;\n const isComplete = combinedValue.length === total && values.every(v => v.length > 0);\n\n this.onChange(combinedValue);\n this.valueChange.emit(combinedValue);\n this.otpChange.emit({ value: combinedValue, isComplete });\n\n if (isComplete) {\n this.completed.emit(combinedValue);\n }\n }\n\n // --- ControlValueAccessor Implementation ---\n writeValue(obj: any): void {\n const str = obj != null ? String(obj) : '';\n const total = this.slotIndices().length;\n const newValues = Array.from({ length: total }, (_, i) => str[i] || '');\n this.digitValues.set(newValues);\n }\n\n registerOnChange(fn: (val: string) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabledState.set(isDisabled);\n }\n}\n","<div\n class=\"talos-otp-container\"\n role=\"group\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.id]=\"elementId()\"\n>\n @for (index of slotIndices(); track index) {\n <div\n class=\"talos-otp-slot-wrapper\"\n [class.is-focused]=\"focusedIndex() === index\"\n [class.is-filled]=\"!!digitValues()[index]\"\n >\n <input\n #slotInput\n class=\"talos-otp-slot\"\n [type]=\"getInputType()\"\n [attr.inputmode]=\"getInputMode()\"\n autocomplete=\"one-time-code\"\n [value]=\"getSlotDisplayValue(index)\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"effectiveDisabled()\"\n [readOnly]=\"readonly()\"\n [attr.aria-label]=\"'Digit ' + (index + 1) + ' of ' + slotIndices().length\"\n [attr.aria-invalid]=\"effectiveInvalid()\"\n (focus)=\"onSlotFocus(index, $event)\"\n (blur)=\"onSlotBlur()\"\n (keydown)=\"onSlotKeyDown($event, index)\"\n (input)=\"onSlotInput($event, index)\"\n (paste)=\"onPaste($event, index)\"\n />\n </div>\n\n @if (separatorIndices().has(index)) {\n <span class=\"talos-otp-separator\" aria-hidden=\"true\">\n {{ separator() || '–' }}\n </span>\n }\n }\n</div>\n","import { NgModule } from '@angular/core';\nimport { TalosOtpComponent } from './otp.component';\n\n@NgModule({\n imports: [TalosOtpComponent],\n exports: [TalosOtpComponent]\n})\nexport class TalosOtpModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}