@weeehaoooz/talos-ui 0.1.0 → 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 (187) hide show
  1. package/README.md +2 -0
  2. package/fesm2022/{weeehaoooz-talos-ui-button-button-group.mjs → weeehaoooz-talos-ui-button.mjs} +115 -18
  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 +1320 -11
  15. package/fesm2022/weeehaoooz-talos-ui-layout.mjs.map +1 -1
  16. package/fesm2022/weeehaoooz-talos-ui-nav.mjs +119 -72
  17. package/fesm2022/weeehaoooz-talos-ui-nav.mjs.map +1 -1
  18. package/fesm2022/weeehaoooz-talos-ui.mjs +22190 -15213
  19. package/fesm2022/weeehaoooz-talos-ui.mjs.map +1 -1
  20. package/package.json +20 -135
  21. package/styles/_breadcrumb.scss +16 -0
  22. package/styles/_button-group.scss +156 -7
  23. package/styles/_buttons.scss +156 -8
  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 +37 -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 +36 -10
  46. package/types/weeehaoooz-talos-ui-nav.d.ts.map +1 -1
  47. package/types/weeehaoooz-talos-ui.d.ts +6949 -4137
  48. package/types/weeehaoooz-talos-ui.d.ts.map +1 -1
  49. package/fesm2022/weeehaoooz-talos-ui-button-button-group.mjs.map +0 -1
  50. package/fesm2022/weeehaoooz-talos-ui-button-button.mjs +0 -93
  51. package/fesm2022/weeehaoooz-talos-ui-button-button.mjs.map +0 -1
  52. package/fesm2022/weeehaoooz-talos-ui-data-display-badge.mjs +0 -233
  53. package/fesm2022/weeehaoooz-talos-ui-data-display-badge.mjs.map +0 -1
  54. package/fesm2022/weeehaoooz-talos-ui-data-display-status-tag.mjs +0 -361
  55. package/fesm2022/weeehaoooz-talos-ui-data-display-status-tag.mjs.map +0 -1
  56. package/fesm2022/weeehaoooz-talos-ui-data-display-timeline.mjs +0 -312
  57. package/fesm2022/weeehaoooz-talos-ui-data-display-timeline.mjs.map +0 -1
  58. package/fesm2022/weeehaoooz-talos-ui-data-display-trend-indicator.mjs +0 -235
  59. package/fesm2022/weeehaoooz-talos-ui-data-display-trend-indicator.mjs.map +0 -1
  60. package/fesm2022/weeehaoooz-talos-ui-data-viz-category-bar.mjs +0 -462
  61. package/fesm2022/weeehaoooz-talos-ui-data-viz-category-bar.mjs.map +0 -1
  62. package/fesm2022/weeehaoooz-talos-ui-data-viz-heatmap.mjs +0 -805
  63. package/fesm2022/weeehaoooz-talos-ui-data-viz-heatmap.mjs.map +0 -1
  64. package/fesm2022/weeehaoooz-talos-ui-data-viz-mini-donut.mjs +0 -267
  65. package/fesm2022/weeehaoooz-talos-ui-data-viz-mini-donut.mjs.map +0 -1
  66. package/fesm2022/weeehaoooz-talos-ui-data-viz-mini-gauge.mjs +0 -351
  67. package/fesm2022/weeehaoooz-talos-ui-data-viz-mini-gauge.mjs.map +0 -1
  68. package/fesm2022/weeehaoooz-talos-ui-data-viz-sparkline.mjs +0 -566
  69. package/fesm2022/weeehaoooz-talos-ui-data-viz-sparkline.mjs.map +0 -1
  70. package/fesm2022/weeehaoooz-talos-ui-feedback-alert.mjs +0 -534
  71. package/fesm2022/weeehaoooz-talos-ui-feedback-alert.mjs.map +0 -1
  72. package/fesm2022/weeehaoooz-talos-ui-feedback-dialog.mjs +0 -446
  73. package/fesm2022/weeehaoooz-talos-ui-feedback-dialog.mjs.map +0 -1
  74. package/fesm2022/weeehaoooz-talos-ui-feedback-snackbar.mjs +0 -376
  75. package/fesm2022/weeehaoooz-talos-ui-feedback-snackbar.mjs.map +0 -1
  76. package/fesm2022/weeehaoooz-talos-ui-feedback-tooltip.mjs +0 -147
  77. package/fesm2022/weeehaoooz-talos-ui-feedback-tooltip.mjs.map +0 -1
  78. package/fesm2022/weeehaoooz-talos-ui-form-affix.mjs +0 -242
  79. package/fesm2022/weeehaoooz-talos-ui-form-affix.mjs.map +0 -1
  80. package/fesm2022/weeehaoooz-talos-ui-form-autocomplete.mjs +0 -514
  81. package/fesm2022/weeehaoooz-talos-ui-form-autocomplete.mjs.map +0 -1
  82. package/fesm2022/weeehaoooz-talos-ui-form-checkbox.mjs +0 -548
  83. package/fesm2022/weeehaoooz-talos-ui-form-checkbox.mjs.map +0 -1
  84. package/fesm2022/weeehaoooz-talos-ui-form-chips.mjs +0 -692
  85. package/fesm2022/weeehaoooz-talos-ui-form-chips.mjs.map +0 -1
  86. package/fesm2022/weeehaoooz-talos-ui-form-color-picker.mjs +0 -761
  87. package/fesm2022/weeehaoooz-talos-ui-form-color-picker.mjs.map +0 -1
  88. package/fesm2022/weeehaoooz-talos-ui-form-date-picker.mjs +0 -896
  89. package/fesm2022/weeehaoooz-talos-ui-form-date-picker.mjs.map +0 -1
  90. package/fesm2022/weeehaoooz-talos-ui-form-date-range-picker.mjs +0 -872
  91. package/fesm2022/weeehaoooz-talos-ui-form-date-range-picker.mjs.map +0 -1
  92. package/fesm2022/weeehaoooz-talos-ui-form-date-time-picker.mjs +0 -119
  93. package/fesm2022/weeehaoooz-talos-ui-form-date-time-picker.mjs.map +0 -1
  94. package/fesm2022/weeehaoooz-talos-ui-form-date-time-range-picker.mjs +0 -135
  95. package/fesm2022/weeehaoooz-talos-ui-form-date-time-range-picker.mjs.map +0 -1
  96. package/fesm2022/weeehaoooz-talos-ui-form-drop-zone.mjs +0 -666
  97. package/fesm2022/weeehaoooz-talos-ui-form-drop-zone.mjs.map +0 -1
  98. package/fesm2022/weeehaoooz-talos-ui-form-form-field.mjs +0 -147
  99. package/fesm2022/weeehaoooz-talos-ui-form-form-field.mjs.map +0 -1
  100. package/fesm2022/weeehaoooz-talos-ui-form-input.mjs +0 -33
  101. package/fesm2022/weeehaoooz-talos-ui-form-input.mjs.map +0 -1
  102. package/fesm2022/weeehaoooz-talos-ui-form-otp.mjs +0 -455
  103. package/fesm2022/weeehaoooz-talos-ui-form-otp.mjs.map +0 -1
  104. package/fesm2022/weeehaoooz-talos-ui-form-password-input.mjs +0 -379
  105. package/fesm2022/weeehaoooz-talos-ui-form-password-input.mjs.map +0 -1
  106. package/fesm2022/weeehaoooz-talos-ui-form-radio.mjs +0 -297
  107. package/fesm2022/weeehaoooz-talos-ui-form-radio.mjs.map +0 -1
  108. package/fesm2022/weeehaoooz-talos-ui-form-range-input.mjs +0 -661
  109. package/fesm2022/weeehaoooz-talos-ui-form-range-input.mjs.map +0 -1
  110. package/fesm2022/weeehaoooz-talos-ui-form-rating.mjs +0 -346
  111. package/fesm2022/weeehaoooz-talos-ui-form-rating.mjs.map +0 -1
  112. package/fesm2022/weeehaoooz-talos-ui-form-select-input.mjs +0 -896
  113. package/fesm2022/weeehaoooz-talos-ui-form-select-input.mjs.map +0 -1
  114. package/fesm2022/weeehaoooz-talos-ui-form-slide-toggle.mjs +0 -252
  115. package/fesm2022/weeehaoooz-talos-ui-form-slide-toggle.mjs.map +0 -1
  116. package/fesm2022/weeehaoooz-talos-ui-form-transfer-list.mjs +0 -916
  117. package/fesm2022/weeehaoooz-talos-ui-form-transfer-list.mjs.map +0 -1
  118. package/types/weeehaoooz-talos-ui-button-button-group.d.ts +0 -59
  119. package/types/weeehaoooz-talos-ui-button-button-group.d.ts.map +0 -1
  120. package/types/weeehaoooz-talos-ui-button-button.d.ts +0 -38
  121. package/types/weeehaoooz-talos-ui-button-button.d.ts.map +0 -1
  122. package/types/weeehaoooz-talos-ui-data-display-badge.d.ts +0 -119
  123. package/types/weeehaoooz-talos-ui-data-display-badge.d.ts.map +0 -1
  124. package/types/weeehaoooz-talos-ui-data-display-status-tag.d.ts +0 -135
  125. package/types/weeehaoooz-talos-ui-data-display-status-tag.d.ts.map +0 -1
  126. package/types/weeehaoooz-talos-ui-data-display-timeline.d.ts +0 -144
  127. package/types/weeehaoooz-talos-ui-data-display-timeline.d.ts.map +0 -1
  128. package/types/weeehaoooz-talos-ui-data-display-trend-indicator.d.ts +0 -83
  129. package/types/weeehaoooz-talos-ui-data-display-trend-indicator.d.ts.map +0 -1
  130. package/types/weeehaoooz-talos-ui-data-viz-category-bar.d.ts +0 -255
  131. package/types/weeehaoooz-talos-ui-data-viz-category-bar.d.ts.map +0 -1
  132. package/types/weeehaoooz-talos-ui-data-viz-heatmap.d.ts +0 -204
  133. package/types/weeehaoooz-talos-ui-data-viz-heatmap.d.ts.map +0 -1
  134. package/types/weeehaoooz-talos-ui-data-viz-mini-donut.d.ts +0 -101
  135. package/types/weeehaoooz-talos-ui-data-viz-mini-donut.d.ts.map +0 -1
  136. package/types/weeehaoooz-talos-ui-data-viz-mini-gauge.d.ts +0 -138
  137. package/types/weeehaoooz-talos-ui-data-viz-mini-gauge.d.ts.map +0 -1
  138. package/types/weeehaoooz-talos-ui-data-viz-sparkline.d.ts +0 -161
  139. package/types/weeehaoooz-talos-ui-data-viz-sparkline.d.ts.map +0 -1
  140. package/types/weeehaoooz-talos-ui-feedback-alert.d.ts +0 -212
  141. package/types/weeehaoooz-talos-ui-feedback-alert.d.ts.map +0 -1
  142. package/types/weeehaoooz-talos-ui-feedback-dialog.d.ts +0 -259
  143. package/types/weeehaoooz-talos-ui-feedback-dialog.d.ts.map +0 -1
  144. package/types/weeehaoooz-talos-ui-feedback-snackbar.d.ts +0 -147
  145. package/types/weeehaoooz-talos-ui-feedback-snackbar.d.ts.map +0 -1
  146. package/types/weeehaoooz-talos-ui-feedback-tooltip.d.ts +0 -32
  147. package/types/weeehaoooz-talos-ui-feedback-tooltip.d.ts.map +0 -1
  148. package/types/weeehaoooz-talos-ui-form-affix.d.ts +0 -88
  149. package/types/weeehaoooz-talos-ui-form-affix.d.ts.map +0 -1
  150. package/types/weeehaoooz-talos-ui-form-autocomplete.d.ts +0 -113
  151. package/types/weeehaoooz-talos-ui-form-autocomplete.d.ts.map +0 -1
  152. package/types/weeehaoooz-talos-ui-form-checkbox.d.ts +0 -165
  153. package/types/weeehaoooz-talos-ui-form-checkbox.d.ts.map +0 -1
  154. package/types/weeehaoooz-talos-ui-form-chips.d.ts +0 -152
  155. package/types/weeehaoooz-talos-ui-form-chips.d.ts.map +0 -1
  156. package/types/weeehaoooz-talos-ui-form-color-picker.d.ts +0 -144
  157. package/types/weeehaoooz-talos-ui-form-color-picker.d.ts.map +0 -1
  158. package/types/weeehaoooz-talos-ui-form-date-picker.d.ts +0 -138
  159. package/types/weeehaoooz-talos-ui-form-date-picker.d.ts.map +0 -1
  160. package/types/weeehaoooz-talos-ui-form-date-range-picker.d.ts +0 -148
  161. package/types/weeehaoooz-talos-ui-form-date-range-picker.d.ts.map +0 -1
  162. package/types/weeehaoooz-talos-ui-form-date-time-picker.d.ts +0 -44
  163. package/types/weeehaoooz-talos-ui-form-date-time-picker.d.ts.map +0 -1
  164. package/types/weeehaoooz-talos-ui-form-date-time-range-picker.d.ts +0 -48
  165. package/types/weeehaoooz-talos-ui-form-date-time-range-picker.d.ts.map +0 -1
  166. package/types/weeehaoooz-talos-ui-form-drop-zone.d.ts +0 -227
  167. package/types/weeehaoooz-talos-ui-form-drop-zone.d.ts.map +0 -1
  168. package/types/weeehaoooz-talos-ui-form-form-field.d.ts +0 -42
  169. package/types/weeehaoooz-talos-ui-form-form-field.d.ts.map +0 -1
  170. package/types/weeehaoooz-talos-ui-form-input.d.ts +0 -15
  171. package/types/weeehaoooz-talos-ui-form-input.d.ts.map +0 -1
  172. package/types/weeehaoooz-talos-ui-form-otp.d.ts +0 -111
  173. package/types/weeehaoooz-talos-ui-form-otp.d.ts.map +0 -1
  174. package/types/weeehaoooz-talos-ui-form-password-input.d.ts +0 -145
  175. package/types/weeehaoooz-talos-ui-form-password-input.d.ts.map +0 -1
  176. package/types/weeehaoooz-talos-ui-form-radio.d.ts +0 -84
  177. package/types/weeehaoooz-talos-ui-form-radio.d.ts.map +0 -1
  178. package/types/weeehaoooz-talos-ui-form-range-input.d.ts +0 -181
  179. package/types/weeehaoooz-talos-ui-form-range-input.d.ts.map +0 -1
  180. package/types/weeehaoooz-talos-ui-form-rating.d.ts +0 -110
  181. package/types/weeehaoooz-talos-ui-form-rating.d.ts.map +0 -1
  182. package/types/weeehaoooz-talos-ui-form-select-input.d.ts +0 -195
  183. package/types/weeehaoooz-talos-ui-form-select-input.d.ts.map +0 -1
  184. package/types/weeehaoooz-talos-ui-form-slide-toggle.d.ts +0 -79
  185. package/types/weeehaoooz-talos-ui-form-slide-toggle.d.ts.map +0 -1
  186. package/types/weeehaoooz-talos-ui-form-transfer-list.d.ts +0 -192
  187. 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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"}