@egose/shadcn-theme-ng-tw 0.0.28 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (244) hide show
  1. package/README.md +130 -13
  2. package/accordion/README.md +376 -34
  3. package/accordion/fesm2022/accordion.mjs +20 -20
  4. package/alert/README.md +343 -34
  5. package/alert/fesm2022/alert.mjs +18 -18
  6. package/alert-dialog/README.md +471 -5
  7. package/alert-dialog/fesm2022/alert-dialog.mjs +48 -48
  8. package/alert-dialog/types/alert-dialog.d.ts +1 -1
  9. package/aspect-ratio/README.md +272 -5
  10. package/aspect-ratio/fesm2022/aspect-ratio.mjs +9 -9
  11. package/autocomplete/README.md +473 -34
  12. package/autocomplete/fesm2022/autocomplete.mjs +54 -54
  13. package/autocomplete/types/autocomplete.d.ts +1 -1
  14. package/avatar/README.md +357 -5
  15. package/avatar/fesm2022/avatar.mjs +32 -32
  16. package/badge/README.md +289 -34
  17. package/badge/fesm2022/badge.mjs +4 -4
  18. package/basic-alert/README.md +324 -34
  19. package/basic-alert/fesm2022/basic-alert.mjs +4 -4
  20. package/basic-alert/types/basic-alert.d.ts +1 -1
  21. package/breadcrumb/README.md +406 -5
  22. package/breadcrumb/fesm2022/breadcrumb.mjs +34 -34
  23. package/button/README.md +453 -34
  24. package/button/fesm2022/button.mjs +96 -118
  25. package/button/types/button.d.ts +7 -10
  26. package/button-group/README.md +318 -5
  27. package/button-group/fesm2022/button-group.mjs +20 -20
  28. package/calendar/README.md +328 -34
  29. package/calendar/fesm2022/calendar.mjs +154 -154
  30. package/card/README.md +331 -5
  31. package/card/fesm2022/card.mjs +33 -33
  32. package/carousel/README.md +333 -5
  33. package/carousel/fesm2022/carousel.mjs +47 -44
  34. package/carousel/types/carousel.d.ts +1 -1
  35. package/checkbox/README.md +291 -34
  36. package/checkbox/fesm2022/checkbox.mjs +22 -20
  37. package/checkbox/types/checkbox.d.ts +5 -4
  38. package/collapsible/README.md +332 -5
  39. package/collapsible/fesm2022/collapsible.mjs +15 -15
  40. package/combobox/README.md +507 -5
  41. package/combobox/fesm2022/combobox.mjs +95 -92
  42. package/combobox/types/combobox.d.ts +1 -1
  43. package/command/README.md +435 -5
  44. package/command/fesm2022/command.mjs +56 -56
  45. package/confirmation-dialog/README.md +272 -34
  46. package/confirmation-dialog/fesm2022/confirmation-dialog.mjs +13 -12
  47. package/confirmation-dialog/types/confirmation-dialog.d.ts +9 -5
  48. package/context-menu/README.md +366 -5
  49. package/context-menu/fesm2022/context-menu.mjs +9 -9
  50. package/date-picker/README.md +436 -34
  51. package/date-picker/fesm2022/date-picker.mjs +79 -68
  52. package/date-picker/types/date-picker.d.ts +8 -4
  53. package/dialog/README.md +419 -34
  54. package/dialog/fesm2022/dialog.mjs +48 -48
  55. package/drawer/README.md +395 -5
  56. package/drawer/fesm2022/drawer.mjs +45 -45
  57. package/dropdown-menu/README.md +417 -5
  58. package/dropdown-menu/fesm2022/dropdown-menu.mjs +85 -73
  59. package/dropdown-menu/types/dropdown-menu.d.ts +4 -0
  60. package/empty/README.md +329 -5
  61. package/empty/fesm2022/empty.mjs +31 -31
  62. package/field/README.md +385 -5
  63. package/field/fesm2022/field.mjs +59 -59
  64. package/field/types/field.d.ts +1 -1
  65. package/form-checkbox/README.md +283 -34
  66. package/form-checkbox/fesm2022/form-checkbox.mjs +37 -19
  67. package/form-checkbox/types/form-checkbox.d.ts +7 -1
  68. package/form-date-picker/README.md +293 -34
  69. package/form-date-picker/fesm2022/form-date-picker.mjs +59 -24
  70. package/form-date-picker/types/form-date-picker.d.ts +7 -1
  71. package/form-field/README.md +327 -34
  72. package/form-field/fesm2022/form-field.mjs +30 -16
  73. package/form-field/types/form-field.d.ts +28 -20
  74. package/form-field-simple/README.md +311 -34
  75. package/form-field-simple/fesm2022/form-field-simple.mjs +4 -4
  76. package/form-searchable-multiselect/README.md +332 -34
  77. package/form-searchable-multiselect/fesm2022/form-searchable-multiselect.mjs +41 -21
  78. package/form-searchable-multiselect/types/form-searchable-multiselect.d.ts +8 -2
  79. package/form-select/README.md +321 -34
  80. package/form-select/fesm2022/form-select.mjs +62 -29
  81. package/form-select/types/form-select.d.ts +7 -1
  82. package/form-text-input/README.md +342 -34
  83. package/form-text-input/fesm2022/form-text-input.mjs +43 -55
  84. package/form-text-input/types/form-text-input.d.ts +9 -12
  85. package/form-textarea/README.md +318 -34
  86. package/form-textarea/fesm2022/form-textarea.mjs +42 -23
  87. package/form-textarea/types/form-textarea.d.ts +8 -1
  88. package/hover-card/README.md +256 -5
  89. package/hover-card/fesm2022/hover-card.mjs +19 -19
  90. package/icon/README.md +210 -34
  91. package/icon/fesm2022/icon.mjs +8 -8
  92. package/input/README.md +240 -34
  93. package/input/fesm2022/input.mjs +17 -12
  94. package/input/types/input.d.ts +2 -1
  95. package/input-group/README.md +335 -5
  96. package/input-group/fesm2022/input-group.mjs +37 -37
  97. package/input-group/types/input-group.d.ts +3 -3
  98. package/input-otp/README.md +375 -5
  99. package/input-otp/fesm2022/input-otp.mjs +27 -27
  100. package/item/README.md +385 -5
  101. package/item/fesm2022/item.mjs +54 -54
  102. package/kbd/README.md +291 -5
  103. package/kbd/fesm2022/kbd.mjs +13 -13
  104. package/label/README.md +243 -34
  105. package/label/fesm2022/label.mjs +9 -9
  106. package/label/types/label.d.ts +1 -1
  107. package/layout-simple/README.md +174 -44
  108. package/layout-simple/fesm2022/layout-simple.mjs +917 -398
  109. package/layout-simple/types/layout-simple.d.ts +180 -129
  110. package/menu/README.md +418 -0
  111. package/menu/fesm2022/menu.mjs +461 -0
  112. package/menu/package.json +24 -0
  113. package/menu/types/menu.d.ts +137 -0
  114. package/menubar/README.md +343 -5
  115. package/menubar/fesm2022/menubar.mjs +13 -13
  116. package/native-select/README.md +323 -5
  117. package/native-select/fesm2022/native-select.mjs +19 -19
  118. package/navigation-menu/README.md +369 -5
  119. package/navigation-menu/fesm2022/navigation-menu.mjs +37 -37
  120. package/package.json +183 -154
  121. package/pagination/README.md +388 -5
  122. package/pagination/fesm2022/pagination.mjs +63 -63
  123. package/popover/README.md +302 -34
  124. package/popover/fesm2022/popover.mjs +30 -30
  125. package/progress/README.md +311 -5
  126. package/progress/fesm2022/progress.mjs +13 -13
  127. package/radio-group/README.md +335 -34
  128. package/radio-group/fesm2022/radio-group.mjs +26 -19
  129. package/resizable/README.md +269 -5
  130. package/resizable/fesm2022/resizable.mjs +19 -19
  131. package/scroll-area/README.md +233 -5
  132. package/scroll-area/fesm2022/scroll-area.mjs +9 -9
  133. package/searchable-multiselect/README.md +294 -34
  134. package/searchable-multiselect/fesm2022/searchable-multiselect.mjs +63 -16
  135. package/searchable-multiselect/types/searchable-multiselect.d.ts +8 -2
  136. package/select/README.md +408 -34
  137. package/select/fesm2022/select.mjs +80 -72
  138. package/select/types/select.d.ts +3 -1
  139. package/separator/README.md +193 -34
  140. package/separator/fesm2022/separator.mjs +9 -9
  141. package/separator/types/separator.d.ts +1 -1
  142. package/sheet/README.md +282 -34
  143. package/sheet/fesm2022/sheet.mjs +30 -30
  144. package/sidebar/README.md +457 -5
  145. package/sidebar/fesm2022/sidebar.mjs +136 -134
  146. package/sidebar/types/sidebar.d.ts +3 -3
  147. package/skeleton/README.md +217 -5
  148. package/skeleton/fesm2022/skeleton.mjs +9 -9
  149. package/slider/README.md +273 -5
  150. package/slider/fesm2022/slider.mjs +29 -25
  151. package/sonner/README.md +317 -34
  152. package/sonner/fesm2022/sonner.mjs +9 -9
  153. package/spinner/README.md +255 -34
  154. package/spinner/fesm2022/spinner.mjs +8 -8
  155. package/switch/README.md +281 -34
  156. package/switch/fesm2022/switch.mjs +12 -14
  157. package/table/README.md +423 -5
  158. package/table/fesm2022/table.mjs +41 -41
  159. package/tabs/README.md +382 -34
  160. package/tabs/fesm2022/tabs.mjs +48 -38
  161. package/textarea/README.md +282 -5
  162. package/textarea/fesm2022/textarea.mjs +9 -9
  163. package/toggle/README.md +270 -5
  164. package/toggle/fesm2022/toggle.mjs +14 -14
  165. package/toggle-group/README.md +340 -5
  166. package/toggle-group/fesm2022/toggle-group.mjs +13 -13
  167. package/toggle-group/types/toggle-group.d.ts +13 -7
  168. package/tooltip/README.md +240 -34
  169. package/tooltip/fesm2022/tooltip.mjs +14 -14
  170. package/typography/README.md +271 -5
  171. package/typography/fesm2022/typography.mjs +53 -53
  172. package/typography/types/typography.d.ts +12 -12
  173. package/utils/README.md +274 -34
  174. package/utils/fesm2022/utils.mjs +68 -44
  175. package/accordion/fesm2022/accordion.mjs.map +0 -1
  176. package/alert/fesm2022/alert.mjs.map +0 -1
  177. package/alert-dialog/fesm2022/alert-dialog.mjs.map +0 -1
  178. package/aspect-ratio/fesm2022/aspect-ratio.mjs.map +0 -1
  179. package/autocomplete/fesm2022/autocomplete.mjs.map +0 -1
  180. package/avatar/fesm2022/avatar.mjs.map +0 -1
  181. package/badge/fesm2022/badge.mjs.map +0 -1
  182. package/basic-alert/fesm2022/basic-alert.mjs.map +0 -1
  183. package/breadcrumb/fesm2022/breadcrumb.mjs.map +0 -1
  184. package/button/fesm2022/button.mjs.map +0 -1
  185. package/button-group/fesm2022/button-group.mjs.map +0 -1
  186. package/calendar/fesm2022/calendar.mjs.map +0 -1
  187. package/card/fesm2022/card.mjs.map +0 -1
  188. package/carousel/fesm2022/carousel.mjs.map +0 -1
  189. package/checkbox/fesm2022/checkbox.mjs.map +0 -1
  190. package/collapsible/fesm2022/collapsible.mjs.map +0 -1
  191. package/combobox/fesm2022/combobox.mjs.map +0 -1
  192. package/command/fesm2022/command.mjs.map +0 -1
  193. package/confirmation-dialog/fesm2022/confirmation-dialog.mjs.map +0 -1
  194. package/context-menu/fesm2022/context-menu.mjs.map +0 -1
  195. package/date-picker/fesm2022/date-picker.mjs.map +0 -1
  196. package/dialog/fesm2022/dialog.mjs.map +0 -1
  197. package/drawer/fesm2022/drawer.mjs.map +0 -1
  198. package/dropdown-menu/fesm2022/dropdown-menu.mjs.map +0 -1
  199. package/empty/fesm2022/empty.mjs.map +0 -1
  200. package/field/fesm2022/field.mjs.map +0 -1
  201. package/form-checkbox/fesm2022/form-checkbox.mjs.map +0 -1
  202. package/form-date-picker/fesm2022/form-date-picker.mjs.map +0 -1
  203. package/form-field/fesm2022/form-field.mjs.map +0 -1
  204. package/form-field-simple/fesm2022/form-field-simple.mjs.map +0 -1
  205. package/form-searchable-multiselect/fesm2022/form-searchable-multiselect.mjs.map +0 -1
  206. package/form-select/fesm2022/form-select.mjs.map +0 -1
  207. package/form-text-input/fesm2022/form-text-input.mjs.map +0 -1
  208. package/form-textarea/fesm2022/form-textarea.mjs.map +0 -1
  209. package/hover-card/fesm2022/hover-card.mjs.map +0 -1
  210. package/icon/fesm2022/icon.mjs.map +0 -1
  211. package/input/fesm2022/input.mjs.map +0 -1
  212. package/input-group/fesm2022/input-group.mjs.map +0 -1
  213. package/input-otp/fesm2022/input-otp.mjs.map +0 -1
  214. package/item/fesm2022/item.mjs.map +0 -1
  215. package/kbd/fesm2022/kbd.mjs.map +0 -1
  216. package/label/fesm2022/label.mjs.map +0 -1
  217. package/layout-simple/fesm2022/layout-simple.mjs.map +0 -1
  218. package/menubar/fesm2022/menubar.mjs.map +0 -1
  219. package/native-select/fesm2022/native-select.mjs.map +0 -1
  220. package/navigation-menu/fesm2022/navigation-menu.mjs.map +0 -1
  221. package/pagination/fesm2022/pagination.mjs.map +0 -1
  222. package/popover/fesm2022/popover.mjs.map +0 -1
  223. package/progress/fesm2022/progress.mjs.map +0 -1
  224. package/radio-group/fesm2022/radio-group.mjs.map +0 -1
  225. package/resizable/fesm2022/resizable.mjs.map +0 -1
  226. package/scroll-area/fesm2022/scroll-area.mjs.map +0 -1
  227. package/searchable-multiselect/fesm2022/searchable-multiselect.mjs.map +0 -1
  228. package/select/fesm2022/select.mjs.map +0 -1
  229. package/separator/fesm2022/separator.mjs.map +0 -1
  230. package/sheet/fesm2022/sheet.mjs.map +0 -1
  231. package/sidebar/fesm2022/sidebar.mjs.map +0 -1
  232. package/skeleton/fesm2022/skeleton.mjs.map +0 -1
  233. package/slider/fesm2022/slider.mjs.map +0 -1
  234. package/sonner/fesm2022/sonner.mjs.map +0 -1
  235. package/spinner/fesm2022/spinner.mjs.map +0 -1
  236. package/switch/fesm2022/switch.mjs.map +0 -1
  237. package/table/fesm2022/table.mjs.map +0 -1
  238. package/tabs/fesm2022/tabs.mjs.map +0 -1
  239. package/textarea/fesm2022/textarea.mjs.map +0 -1
  240. package/toggle/fesm2022/toggle.mjs.map +0 -1
  241. package/toggle-group/fesm2022/toggle-group.mjs.map +0 -1
  242. package/tooltip/fesm2022/tooltip.mjs.map +0 -1
  243. package/typography/fesm2022/typography.mjs.map +0 -1
  244. package/utils/fesm2022/utils.mjs.map +0 -1
@@ -1,11 +1,381 @@
1
- # InputOtp
1
+ # Input OTP (`@egose/shadcn-theme-ng/input-otp`)
2
2
 
3
- This project was generated using [Angular CLI](https://github.com/angular/angular-cli).
3
+ One-time-password entry: a row of individual character slots (with a blinking fake caret) that behaves as a single field — the shadcn/ui _InputOTP_ equivalent (6-digit SMS/email verification codes, 2FA, invite codes). Keystroke handling, paste splitting, and the `ControlValueAccessor` come from spartan-ng's `BrnInputOtp` family; this subpath adds the shadcn slot styling, group wrapper, separator glyph, and fake caret.
4
4
 
5
- ## Building
5
+ > **Ships as:** `@egose/shadcn-theme-ng/input-otp` (plain Tailwind) and `@egose/shadcn-theme-ng-tw/input-otp` (`tw:`-prefixed variant). See the [package README](../../README.md) for installation, peer dependencies, and the Tailwind-variant contract. Do not publish this project directory independently.
6
6
 
7
- To build the library, run:
7
+ ## Installation
8
8
 
9
9
  ```bash
10
- ng build input-otp
10
+ # Plain Tailwind (no prefix)
11
+ npm install @egose/shadcn-theme-ng
12
+
13
+ # Or the tw:-prefixed variant
14
+ npm install @egose/shadcn-theme-ng-tw
15
+ ```
16
+
17
+ Peer dependencies (Angular, CDK, `@spartan-ng/brain`, `rxjs`) are documented in the [package README](../../README.md#peer-dependencies).
18
+
19
+ ```ts
20
+ import { HlmInputOtpImports } from '@egose/shadcn-theme-ng/input-otp';
21
+ // tw variant:
22
+ // import { HlmInputOtpImports } from '@egose/shadcn-theme-ng-tw/input-otp';
23
+ ```
24
+
25
+ ## Imports
26
+
27
+ The behavior host `BrnInputOtp` lives in `@spartan-ng/brain/input-otp` — import it alongside the styling imports:
28
+
29
+ ```ts
30
+ // Standalone component:
31
+ import { BrnInputOtp } from '@spartan-ng/brain/input-otp';
32
+ import { HlmInputOtpImports } from '@egose/shadcn-theme-ng/input-otp';
33
+
34
+ @Component({
35
+ standalone: true,
36
+ imports: [BrnInputOtp, HlmInputOtpImports],
37
+ template: `
38
+ <brn-input-otp hlmInputOtp [length]="6">
39
+ <div hlmInputOtpGroup>
40
+ <hlm-input-otp-slot index="0" />
41
+ <hlm-input-otp-slot index="1" />
42
+ <hlm-input-otp-slot index="2" />
43
+ </div>
44
+ <hlm-input-otp-separator />
45
+ <div hlmInputOtpGroup>
46
+ <hlm-input-otp-slot index="3" />
47
+ <hlm-input-otp-slot index="4" />
48
+ <hlm-input-otp-slot index="5" />
49
+ </div>
50
+ </brn-input-otp>
51
+ `,
52
+ })
53
+ export class MyComp {}
11
54
  ```
55
+
56
+ ```ts
57
+ // NgModule-based:
58
+ import { HlmInputOtpModule } from '@egose/shadcn-theme-ng/input-otp';
59
+
60
+ @NgModule({ imports: [BrnInputOtp, HlmInputOtpModule] })
61
+ export class MyModule {}
62
+ ```
63
+
64
+ Exported from `src/public-api.ts`: `HlmInputOtp`, `HlmInputOtpGroup`, `HlmInputOtpSeparator`, `HlmInputOtpSlot`, `HlmInputOtpFakeCaret`, plus `HlmInputOtpImports` and `HlmInputOtpModule`.
65
+
66
+ ## Anatomy / Structure
67
+
68
+ ```html
69
+ <label for="otp-code">Verification code</label>
70
+ <brn-input-otp hlmInputOtp [length]="6" inputId="otp-code">
71
+ <div hlmInputOtpGroup>
72
+ <hlm-input-otp-slot index="0" />
73
+ <hlm-input-otp-slot index="1" />
74
+ <hlm-input-otp-slot index="2" />
75
+ </div>
76
+ <hlm-input-otp-separator />
77
+ <div hlmInputOtpGroup>
78
+ <hlm-input-otp-slot index="3" />
79
+ <hlm-input-otp-slot index="4" />
80
+ <hlm-input-otp-slot index="5" />
81
+ </div>
82
+ </brn-input-otp>
83
+ ```
84
+
85
+ Real selectors: `brn-input-otp[hlmInputOtp]` / `brn-input-otp[hlm]` (flex row container, `data-slot="input-otp"`); `[hlmInputOtpGroup]` / `hlm-input-otp-group` (slot cluster, `data-slot="input-otp-group"`); `hlm-input-otp-slot` (component, requires `index`, renders `brn-input-otp-slot` + `hlm-input-otp-fake-caret`); `hlm-input-otp-separator` (component, `role="separator"`, `lucideMinus` glyph); `hlm-input-otp-fake-caret` (blinking caret block, usually not used directly — the slot renders it).
86
+
87
+ Brain inputs on `brn-input-otp` (from `@spartan-ng/brain/input-otp`): `length` (**required**), `value` / `valueChange`, `completed`, `disabled`, `inputId`, `inputAutocomplete`, `inputMode`, `inputClass`, `autofocus`, `transformPaste`, `hostStyles` / `inputStyles` / `containerStyles`.
88
+
89
+ ## API reference
90
+
91
+ ### `brn-input-otp[hlmInputOtp]` — `HlmInputOtp`
92
+
93
+ Pure styling directive (`data-slot="input-otp"`, flex row, dims on `has-disabled`). No inputs/outputs — bind `length`, `value`, `disabled`, `inputId`, … on the `brn-input-otp` element itself.
94
+
95
+ ### `[hlmInputOtpGroup]` — `HlmInputOtpGroup`
96
+
97
+ Slot cluster wrapper (`data-slot="input-otp-group"`). No inputs/outputs. Use one group per visual cluster (e.g. `3+3` with a separator, or a single group of 4/6).
98
+
99
+ ### `hlm-input-otp-slot` — `HlmInputOtpSlot`
100
+
101
+ | Input | Type | Description |
102
+ | ------- | -------------------------------------------------- | -------------------------------------------------------- |
103
+ | `index` | `number` (**required**, `numberAttribute` coerced) | Zero-based position of the character this slot displays. |
104
+
105
+ Renders `<brn-input-otp-slot [index]>` internally; active slot gets the `ring` highlight, invalid state the destructive border.
106
+
107
+ ### `hlm-input-otp-separator` — `HlmInputOtpSeparator`
108
+
109
+ Visual `-` divider between groups (`role="separator"`, `lucideMinus` via `ng-icon`). No inputs/outputs.
110
+
111
+ ### `hlm-input-otp-fake-caret` — `HlmInputOtpFakeCaret`
112
+
113
+ Blinking caret block rendered inside each slot. No inputs/outputs; not normally instantiated directly.
114
+
115
+ ## Examples
116
+
117
+ ### 1. Basic 6-digit code (3+3 with separator)
118
+
119
+ ```ts
120
+ import { Component } from '@angular/core';
121
+ import { BrnInputOtp } from '@spartan-ng/brain/input-otp';
122
+ import { HlmInputOtpImports } from '@egose/shadcn-theme-ng/input-otp';
123
+
124
+ @Component({
125
+ standalone: true,
126
+ imports: [BrnInputOtp, HlmInputOtpImports],
127
+ template: `
128
+ <label for="otp-code">Verification code</label>
129
+ <brn-input-otp hlmInputOtp [length]="6" inputId="otp-code">
130
+ <div hlmInputOtpGroup>
131
+ <hlm-input-otp-slot index="0" />
132
+ <hlm-input-otp-slot index="1" />
133
+ <hlm-input-otp-slot index="2" />
134
+ </div>
135
+ <hlm-input-otp-separator />
136
+ <div hlmInputOtpGroup>
137
+ <hlm-input-otp-slot index="3" />
138
+ <hlm-input-otp-slot index="4" />
139
+ <hlm-input-otp-slot index="5" />
140
+ </div>
141
+ </brn-input-otp>
142
+ `,
143
+ })
144
+ export class BasicExample {}
145
+ ```
146
+
147
+ ### 2. Reactive form + auto-submit on `completed`
148
+
149
+ ```ts
150
+ import { Component } from '@angular/core';
151
+ import { FormControl, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms';
152
+ import { BrnInputOtp } from '@spartan-ng/brain/input-otp';
153
+ import { HlmInputOtpImports } from '@egose/shadcn-theme-ng/input-otp';
154
+
155
+ @Component({
156
+ standalone: true,
157
+ imports: [ReactiveFormsModule, BrnInputOtp, HlmInputOtpImports],
158
+ template: `
159
+ <form [formGroup]="form">
160
+ <label for="otp">Enter the 6-digit code</label>
161
+ <brn-input-otp
162
+ hlmInputOtp
163
+ formControlName="code"
164
+ [length]="6"
165
+ inputId="otp"
166
+ inputMode="numeric"
167
+ inputAutocomplete="one-time-code"
168
+ (completed)="verify()"
169
+ >
170
+ <div hlmInputOtpGroup>
171
+ <hlm-input-otp-slot index="0" />
172
+ <hlm-input-otp-slot index="1" />
173
+ <hlm-input-otp-slot index="2" />
174
+ <hlm-input-otp-slot index="3" />
175
+ <hlm-input-otp-slot index="4" />
176
+ <hlm-input-otp-slot index="5" />
177
+ </div>
178
+ </brn-input-otp>
179
+ <p class="tw:text-sm">Value: {{ form.value.code }}</p>
180
+ </form>
181
+ `,
182
+ })
183
+ export class ReactiveExample {
184
+ readonly form = new FormGroup({
185
+ code: new FormControl<string>('', { nonNullable: true, validators: [Validators.minLength(6)] }),
186
+ });
187
+
188
+ verify() {
189
+ console.log('verifying', this.form.value.code);
190
+ }
191
+ }
192
+ ```
193
+
194
+ ### 3. Two-way value binding + controlled value
195
+
196
+ ```ts
197
+ import { Component, signal } from '@angular/core';
198
+ import { BrnInputOtp } from '@spartan-ng/brain/input-otp';
199
+ import { HlmInputOtpImports } from '@egose/shadcn-theme-ng/input-otp';
200
+
201
+ @Component({
202
+ standalone: true,
203
+ imports: [BrnInputOtp, HlmInputOtpImports],
204
+ template: `
205
+ <brn-input-otp hlmInputOtp [length]="4" [value]="pin()" (valueChange)="pin.set($event)" inputId="pin">
206
+ <div hlmInputOtpGroup>
207
+ <hlm-input-otp-slot index="0" />
208
+ <hlm-input-otp-slot index="1" />
209
+ <hlm-input-otp-slot index="2" />
210
+ <hlm-input-otp-slot index="3" />
211
+ </div>
212
+ </brn-input-otp>
213
+ <div class="tw:flex tw:gap-2">
214
+ <button type="button" (click)="pin.set('')">Clear</button>
215
+ <button type="button" (click)="pin.set('1234')">Fill demo</button>
216
+ </div>
217
+ `,
218
+ })
219
+ export class ControlledExample {
220
+ readonly pin = signal('');
221
+ }
222
+ ```
223
+
224
+ ### 4. Different lengths: 4-digit PIN vs 8-char invite code
225
+
226
+ ```ts
227
+ import { Component } from '@angular/core';
228
+ import { BrnInputOtp } from '@spartan-ng/brain/input-otp';
229
+ import { HlmInputOtpImports } from '@egose/shadcn-theme-ng/input-otp';
230
+
231
+ @Component({
232
+ standalone: true,
233
+ imports: [BrnInputOtp, HlmInputOtpImports],
234
+ template: `
235
+ <label for="pin">Card PIN (4 digits)</label>
236
+ <brn-input-otp hlmInputOtp [length]="4" inputId="pin" inputMode="numeric">
237
+ <div hlmInputOtpGroup>
238
+ <hlm-input-otp-slot index="0" />
239
+ <hlm-input-otp-slot index="1" />
240
+ <hlm-input-otp-slot index="2" />
241
+ <hlm-input-otp-slot index="3" />
242
+ </div>
243
+ </brn-input-otp>
244
+
245
+ <label for="invite">Invite code (8 characters, two groups of 4)</label>
246
+ <brn-input-otp hlmInputOtp [length]="8" inputId="invite" inputMode="text">
247
+ <div hlmInputOtpGroup>
248
+ <hlm-input-otp-slot index="0" />
249
+ <hlm-input-otp-slot index="1" />
250
+ <hlm-input-otp-slot index="2" />
251
+ <hlm-input-otp-slot index="3" />
252
+ </div>
253
+ <hlm-input-otp-separator />
254
+ <div hlmInputOtpGroup>
255
+ <hlm-input-otp-slot index="4" />
256
+ <hlm-input-otp-slot index="5" />
257
+ <hlm-input-otp-slot index="6" />
258
+ <hlm-input-otp-slot index="7" />
259
+ </div>
260
+ </brn-input-otp>
261
+ `,
262
+ })
263
+ export class LengthsExample {}
264
+ ```
265
+
266
+ ### 5. Disabled + error display with resend flow
267
+
268
+ ```ts
269
+ import { Component, signal } from '@angular/core';
270
+ import { BrnInputOtp } from '@spartan-ng/brain/input-otp';
271
+ import { HlmInputOtpImports } from '@egose/shadcn-theme-ng/input-otp';
272
+ import { HlmError } from '@egose/shadcn-theme-ng/form-field';
273
+
274
+ @Component({
275
+ standalone: true,
276
+ imports: [BrnInputOtp, HlmInputOtpImports, HlmError],
277
+ template: `
278
+ <label for="otp-verify">Verification code</label>
279
+ <brn-input-otp
280
+ hlmInputOtp
281
+ [length]="6"
282
+ inputId="otp-verify"
283
+ inputMode="numeric"
284
+ inputAutocomplete="one-time-code"
285
+ [disabled]="verifying()"
286
+ [value]="code()"
287
+ (valueChange)="code.set($event); error.set(null)"
288
+ (completed)="verify()"
289
+ aria-describedby="otp-error"
290
+ >
291
+ <div hlmInputOtpGroup>
292
+ <hlm-input-otp-slot index="0" />
293
+ <hlm-input-otp-slot index="1" />
294
+ <hlm-input-otp-slot index="2" />
295
+ </div>
296
+ <hlm-input-otp-separator />
297
+ <div hlmInputOtpGroup>
298
+ <hlm-input-otp-slot index="3" />
299
+ <hlm-input-otp-slot index="4" />
300
+ <hlm-input-otp-slot index="5" />
301
+ </div>
302
+ </brn-input-otp>
303
+ @if (error()) {
304
+ <hlm-error id="otp-error">{{ error() }}</hlm-error>
305
+ }
306
+ <button type="button" (click)="resend()" [disabled]="verifying()">
307
+ {{ verifying() ? 'Verifying…' : 'Resend code' }}
308
+ </button>
309
+ `,
310
+ })
311
+ export class VerifyFlowExample {
312
+ readonly code = signal('');
313
+ readonly error = signal<string | null>(null);
314
+ readonly verifying = signal(false);
315
+
316
+ verify() {
317
+ this.verifying.set(true);
318
+ setTimeout(() => {
319
+ this.verifying.set(false);
320
+ if (this.code() !== '123456') {
321
+ this.error.set('That code is incorrect. Try again or resend.');
322
+ this.code.set('');
323
+ }
324
+ }, 900);
325
+ }
326
+
327
+ resend() {
328
+ this.error.set(null);
329
+ this.code.set('');
330
+ }
331
+ }
332
+ ```
333
+
334
+ ### 6. Paste normalization with `transformPaste`
335
+
336
+ ```ts
337
+ import { Component } from '@angular/core';
338
+ import { BrnInputOtp } from '@spartan-ng/brain/input-otp';
339
+ import { HlmInputOtpImports } from '@egose/shadcn-theme-ng/input-otp';
340
+
341
+ @Component({
342
+ standalone: true,
343
+ imports: [BrnInputOtp, HlmInputOtpImports],
344
+ template: `
345
+ <label for="otp-paste">Code (pasting “12-34-56” works)</label>
346
+ <brn-input-otp hlmInputOtp [length]="6" inputId="otp-paste" [transformPaste]="stripSeparators">
347
+ <div hlmInputOtpGroup>
348
+ <hlm-input-otp-slot index="0" />
349
+ <hlm-input-otp-slot index="1" />
350
+ <hlm-input-otp-slot index="2" />
351
+ <hlm-input-otp-slot index="3" />
352
+ <hlm-input-otp-slot index="4" />
353
+ <hlm-input-otp-slot index="5" />
354
+ </div>
355
+ </brn-input-otp>
356
+ `,
357
+ })
358
+ export class PasteExample {
359
+ stripSeparators(pasted: string): string {
360
+ return pasted.replace(/[^0-9]/g, '').slice(0, 6);
361
+ }
362
+ }
363
+ ```
364
+
365
+ ## Accessibility notes
366
+
367
+ - Always render a visible `<label>` bound via `inputId` — the hidden native input is what AT focuses; without the label the purpose is unclear.
368
+ - `inputMode="numeric"` (digits) vs `text` (alphanumeric) selects the right mobile keyboard; `inputAutocomplete="one-time-code"` lets browsers/OS autofill SMS codes.
369
+ - Announce failures with a text error (`<hlm-error>` + `aria-describedby`), never by slot color alone.
370
+ - Keep `length` aligned with what the backend expects and validate `minLength(length)` on the form control so incomplete codes cannot submit.
371
+
372
+ ## Theming / CSS variables
373
+
374
+ No component-specific CSS variables; slots use the shared `--input` / `--ring` / `--destructive` tokens. Slot size is fixed (`size-9`); adjust grouping/spacing with wrapper classes rather than per-slot overrides.
375
+
376
+ ## Related subpaths
377
+
378
+ - `@egose/shadcn-theme-ng/input` — single-field `HlmInput` for non-OTP entry.
379
+ - `@egose/shadcn-theme-ng/form-field` — `HlmError`/`HlmHint` for code error text.
380
+ - `@egose/shadcn-theme-ng/button` — Verify/Resend actions.
381
+ - `@egose/shadcn-theme-ng/form-text-input` — labeled wrapper pattern to mirror for OTP forms.
@@ -7,12 +7,12 @@ import { BrnInputOtpSlot } from '@spartan-ng/brain/input-otp';
7
7
 
8
8
  class HlmInputOtp {
9
9
  constructor() {
10
- classes(() => 'gap-2 flex items-center has-disabled:opacity-50');
10
+ classes(() => 'tw:gap-2 tw:flex tw:items-center tw:has-disabled:opacity-50');
11
11
  }
12
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: HlmInputOtp, deps: [], target: i0.ɵɵFactoryTarget.Directive });
13
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.7", type: HlmInputOtp, isStandalone: true, selector: "brn-input-otp[hlmInputOtp], brn-input-otp[hlm]", host: { attributes: { "data-slot": "input-otp" } }, ngImport: i0 });
12
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmInputOtp, deps: [], target: i0.ɵɵFactoryTarget.Directive });
13
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.3", type: HlmInputOtp, isStandalone: true, selector: "brn-input-otp[hlmInputOtp], brn-input-otp[hlm]", host: { attributes: { "data-slot": "input-otp" } }, ngImport: i0 });
14
14
  }
15
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: HlmInputOtp, decorators: [{
15
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmInputOtp, decorators: [{
16
16
  type: Directive,
17
17
  args: [{
18
18
  selector: 'brn-input-otp[hlmInputOtp], brn-input-otp[hlm]',
@@ -22,28 +22,28 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
22
22
 
23
23
  class HlmInputOtpFakeCaret {
24
24
  constructor() {
25
- classes(() => 'pointer-events-none absolute inset-0 flex items-center justify-center');
25
+ classes(() => 'tw:pointer-events-none tw:absolute tw:inset-0 tw:flex tw:items-center tw:justify-center');
26
26
  }
27
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: HlmInputOtpFakeCaret, deps: [], target: i0.ɵɵFactoryTarget.Component });
28
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.7", type: HlmInputOtpFakeCaret, isStandalone: true, selector: "hlm-input-otp-fake-caret", ngImport: i0, template: ` <div class="animate-caret-blink bg-foreground h-4 w-px duration-1000"></div> `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
27
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmInputOtpFakeCaret, deps: [], target: i0.ɵɵFactoryTarget.Component });
28
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.1.3", type: HlmInputOtpFakeCaret, isStandalone: true, selector: "hlm-input-otp-fake-caret", ngImport: i0, template: ` <div class="tw:animate-caret-blink tw:bg-foreground tw:h-4 tw:w-px tw:duration-1000"></div> `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
29
29
  }
30
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: HlmInputOtpFakeCaret, decorators: [{
30
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmInputOtpFakeCaret, decorators: [{
31
31
  type: Component,
32
32
  args: [{
33
33
  selector: 'hlm-input-otp-fake-caret',
34
34
  changeDetection: ChangeDetectionStrategy.OnPush,
35
- template: ` <div class="animate-caret-blink bg-foreground h-4 w-px duration-1000"></div> `,
35
+ template: ` <div class="tw:animate-caret-blink tw:bg-foreground tw:h-4 tw:w-px tw:duration-1000"></div> `,
36
36
  }]
37
37
  }], ctorParameters: () => [] });
38
38
 
39
39
  class HlmInputOtpGroup {
40
40
  constructor() {
41
- classes(() => 'data-[matches-spartan-invalid=true]:ring-destructive/20 dark:data-[matches-spartan-invalid=true]:ring-destructive/40 data-[matches-spartan-invalid=true]:border-destructive rounded-md data-[matches-spartan-invalid=true]:ring-3 flex items-center');
41
+ classes(() => 'tw:data-[matches-spartan-invalid=true]:ring-destructive/20 tw:dark:data-[matches-spartan-invalid=true]:ring-destructive/40 tw:data-[matches-spartan-invalid=true]:border-destructive tw:rounded-md tw:data-[matches-spartan-invalid=true]:ring-3 tw:flex tw:items-center');
42
42
  }
43
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: HlmInputOtpGroup, deps: [], target: i0.ɵɵFactoryTarget.Directive });
44
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.7", type: HlmInputOtpGroup, isStandalone: true, selector: "[hlmInputOtpGroup],hlm-input-otp-group", host: { attributes: { "data-slot": "input-otp-group" } }, ngImport: i0 });
43
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmInputOtpGroup, deps: [], target: i0.ɵɵFactoryTarget.Directive });
44
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.3", type: HlmInputOtpGroup, isStandalone: true, selector: "[hlmInputOtpGroup],hlm-input-otp-group", host: { attributes: { "data-slot": "input-otp-group" } }, ngImport: i0 });
45
45
  }
46
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: HlmInputOtpGroup, decorators: [{
46
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmInputOtpGroup, decorators: [{
47
47
  type: Directive,
48
48
  args: [{
49
49
  selector: '[hlmInputOtpGroup],hlm-input-otp-group',
@@ -53,12 +53,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
53
53
 
54
54
  class HlmInputOtpSeparator {
55
55
  constructor() {
56
- classes(() => "[&_ng-icon:not([class*='text-'])]:text-[length:--spacing(4)] flex items-center");
56
+ classes(() => "tw:[&_ng-icon:not([class*='text-'])]:text-[length:--spacing(4)] tw:flex tw:items-center");
57
57
  }
58
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: HlmInputOtpSeparator, deps: [], target: i0.ɵɵFactoryTarget.Component });
59
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.7", type: HlmInputOtpSeparator, isStandalone: true, selector: "hlm-input-otp-separator", host: { attributes: { "role": "separator", "data-slot": "input-otp-separator" } }, providers: [provideIcons({ lucideMinus })], ngImport: i0, template: ` <ng-icon name="lucideMinus" /> `, isInline: true, dependencies: [{ kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
58
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmInputOtpSeparator, deps: [], target: i0.ɵɵFactoryTarget.Component });
59
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.1.3", type: HlmInputOtpSeparator, isStandalone: true, selector: "hlm-input-otp-separator", host: { attributes: { "role": "separator", "data-slot": "input-otp-separator" } }, providers: [provideIcons({ lucideMinus })], ngImport: i0, template: ` <ng-icon name="lucideMinus" /> `, isInline: true, dependencies: [{ kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
60
60
  }
61
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: HlmInputOtpSeparator, decorators: [{
61
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmInputOtpSeparator, decorators: [{
62
62
  type: Component,
63
63
  args: [{
64
64
  selector: 'hlm-input-otp-separator',
@@ -77,16 +77,16 @@ class HlmInputOtpSlot {
77
77
  /** The index of the slot to render the char or a fake caret */
78
78
  index = input.required({ ...(ngDevMode ? { debugName: "index" } : /* istanbul ignore next */ {}), transform: numberAttribute });
79
79
  constructor() {
80
- classes(() => 'dark:bg-input/30 border-input has-[brn-input-otp-slot[data-active="true"]]:border-ring has-[brn-input-otp-slot[data-active="true"]]:ring-ring/50 has-[brn-input-otp-slot[data-active="true"]]:data-[matches-spartan-invalid=true]:ring-destructive/20 dark:has-[brn-input-otp-slot[data-active="true"]]:data-[matches-spartan-invalid=true]:ring-destructive/40 data-[matches-spartan-invalid=true]:border-destructive has-[brn-input-otp-slot[data-active="true"]]:data-[matches-spartan-invalid=true]:border-destructive size-9 border-y border-e text-sm shadow-xs transition-all outline-none first:rounded-s-md first:border-s last:rounded-e-md has-[brn-input-otp-slot[data-active="true"]]:ring-3 relative flex items-center justify-center has-[brn-input-otp-slot[data-active="true"]]:z-10');
80
+ classes(() => 'tw:dark:bg-input/30 tw:border-input tw:has-[brn-input-otp-slot[data-active="true"]]:border-ring tw:has-[brn-input-otp-slot[data-active="true"]]:ring-ring/50 tw:has-[brn-input-otp-slot[data-active="true"]]:data-[matches-spartan-invalid=true]:ring-destructive/20 tw:dark:has-[brn-input-otp-slot[data-active="true"]]:data-[matches-spartan-invalid=true]:ring-destructive/40 tw:data-[matches-spartan-invalid=true]:border-destructive tw:has-[brn-input-otp-slot[data-active="true"]]:data-[matches-spartan-invalid=true]:border-destructive tw:size-9 tw:border-y tw:border-e tw:text-sm tw:shadow-xs tw:transition-all tw:outline-none tw:first:rounded-s-md tw:first:border-s tw:last:rounded-e-md tw:has-[brn-input-otp-slot[data-active="true"]]:ring-3 tw:relative tw:flex tw:items-center tw:justify-center tw:has-[brn-input-otp-slot[data-active="true"]]:z-10');
81
81
  }
82
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: HlmInputOtpSlot, deps: [], target: i0.ɵɵFactoryTarget.Component });
83
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.7", type: HlmInputOtpSlot, isStandalone: true, selector: "hlm-input-otp-slot", inputs: { index: { classPropertyName: "index", publicName: "index", isSignal: true, isRequired: true, transformFunction: null } }, host: { attributes: { "data-slot": "input-otp-slot" } }, ngImport: i0, template: `
82
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmInputOtpSlot, deps: [], target: i0.ɵɵFactoryTarget.Component });
83
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.3", type: HlmInputOtpSlot, isStandalone: true, selector: "hlm-input-otp-slot", inputs: { index: { classPropertyName: "index", publicName: "index", isSignal: true, isRequired: true, transformFunction: null } }, host: { attributes: { "data-slot": "input-otp-slot" } }, ngImport: i0, template: `
84
84
  <brn-input-otp-slot [index]="index()">
85
85
  <hlm-input-otp-fake-caret />
86
86
  </brn-input-otp-slot>
87
- `, isInline: true, dependencies: [{ kind: "component", type: BrnInputOtpSlot, selector: "brn-input-otp-slot", inputs: ["index"] }, { kind: "component", type: HlmInputOtpFakeCaret, selector: "hlm-input-otp-fake-caret" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
87
+ `, isInline: true, dependencies: [{ kind: "component", type: BrnInputOtpSlot, selector: "brn-input-otp-slot", inputs: ["index", "forceInvalid"] }, { kind: "component", type: HlmInputOtpFakeCaret, selector: "hlm-input-otp-fake-caret" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
88
88
  }
89
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: HlmInputOtpSlot, decorators: [{
89
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmInputOtpSlot, decorators: [{
90
90
  type: Component,
91
91
  args: [{
92
92
  selector: 'hlm-input-otp-slot',
@@ -112,8 +112,8 @@ const HlmInputOtpImports = [
112
112
  HlmInputOtpFakeCaret,
113
113
  ];
114
114
  class HlmInputOtpModule {
115
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: HlmInputOtpModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
116
- static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.0.7", ngImport: i0, type: HlmInputOtpModule, imports: [HlmInputOtp,
115
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmInputOtpModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
116
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.1.3", ngImport: i0, type: HlmInputOtpModule, imports: [HlmInputOtp,
117
117
  HlmInputOtpGroup,
118
118
  HlmInputOtpSeparator,
119
119
  HlmInputOtpSlot,
@@ -122,10 +122,10 @@ class HlmInputOtpModule {
122
122
  HlmInputOtpSeparator,
123
123
  HlmInputOtpSlot,
124
124
  HlmInputOtpFakeCaret] });
125
- static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: HlmInputOtpModule, imports: [HlmInputOtpSeparator,
125
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmInputOtpModule, imports: [HlmInputOtpSeparator,
126
126
  HlmInputOtpSlot] });
127
127
  }
128
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: HlmInputOtpModule, decorators: [{
128
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmInputOtpModule, decorators: [{
129
129
  type: NgModule,
130
130
  args: [{
131
131
  imports: [...HlmInputOtpImports],
@@ -138,4 +138,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
138
138
  */
139
139
 
140
140
  export { HlmInputOtp, HlmInputOtpFakeCaret, HlmInputOtpGroup, HlmInputOtpImports, HlmInputOtpModule, HlmInputOtpSeparator, HlmInputOtpSlot };
141
- //# sourceMappingURL=input-otp.mjs.map
141
+