@egose/shadcn-theme-ng 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.
- package/README.md +130 -13
- package/accordion/README.md +376 -34
- package/accordion/fesm2022/accordion.mjs +27 -39
- package/alert/README.md +343 -34
- package/alert/fesm2022/alert.mjs +47 -47
- package/alert-dialog/README.md +471 -5
- package/alert-dialog/fesm2022/alert-dialog.mjs +47 -47
- package/aspect-ratio/README.md +272 -5
- package/aspect-ratio/fesm2022/aspect-ratio.mjs +9 -9
- package/autocomplete/README.md +473 -34
- package/autocomplete/fesm2022/autocomplete.mjs +53 -71
- package/avatar/README.md +357 -5
- package/avatar/fesm2022/avatar.mjs +32 -32
- package/badge/README.md +289 -34
- package/badge/fesm2022/badge.mjs +57 -57
- package/basic-alert/README.md +324 -34
- package/basic-alert/fesm2022/basic-alert.mjs +6 -18
- package/breadcrumb/README.md +406 -5
- package/breadcrumb/fesm2022/breadcrumb.mjs +33 -39
- package/button/README.md +453 -34
- package/button/fesm2022/button.mjs +147 -219
- package/button/types/button.d.ts +7 -10
- package/button-group/README.md +318 -5
- package/button-group/fesm2022/button-group.mjs +20 -20
- package/calendar/README.md +328 -34
- package/calendar/fesm2022/calendar.mjs +29 -743
- package/card/README.md +331 -5
- package/card/fesm2022/card.mjs +33 -33
- package/carousel/README.md +333 -5
- package/carousel/fesm2022/carousel.mjs +39 -78
- package/checkbox/README.md +291 -34
- package/checkbox/fesm2022/checkbox.mjs +20 -58
- package/checkbox/types/checkbox.d.ts +5 -4
- package/collapsible/README.md +332 -5
- package/collapsible/fesm2022/collapsible.mjs +15 -15
- package/combobox/README.md +507 -5
- package/combobox/fesm2022/combobox.mjs +91 -224
- package/command/README.md +435 -5
- package/command/fesm2022/command.mjs +49 -109
- package/confirmation-dialog/README.md +272 -34
- package/confirmation-dialog/fesm2022/confirmation-dialog.mjs +15 -40
- package/confirmation-dialog/types/confirmation-dialog.d.ts +8 -4
- package/context-menu/README.md +366 -5
- package/context-menu/fesm2022/context-menu.mjs +9 -9
- package/date-picker/README.md +436 -34
- package/date-picker/fesm2022/date-picker.mjs +64 -267
- package/date-picker/types/date-picker.d.ts +7 -3
- package/dialog/README.md +419 -34
- package/dialog/fesm2022/dialog.mjs +45 -71
- package/drawer/README.md +395 -5
- package/drawer/fesm2022/drawer.mjs +44 -54
- package/dropdown-menu/README.md +417 -5
- package/dropdown-menu/fesm2022/dropdown-menu.mjs +82 -70
- package/dropdown-menu/types/dropdown-menu.d.ts +4 -0
- package/empty/README.md +329 -5
- package/empty/fesm2022/empty.mjs +30 -30
- package/field/README.md +385 -5
- package/field/fesm2022/field.mjs +56 -72
- package/form-checkbox/README.md +283 -34
- package/form-checkbox/fesm2022/form-checkbox.mjs +25 -85
- package/form-checkbox/types/form-checkbox.d.ts +7 -1
- package/form-date-picker/README.md +293 -34
- package/form-date-picker/fesm2022/form-date-picker.mjs +31 -84
- package/form-date-picker/types/form-date-picker.d.ts +7 -1
- package/form-field/README.md +327 -34
- package/form-field/fesm2022/form-field.mjs +33 -19
- package/form-field/types/form-field.d.ts +28 -20
- package/form-field-simple/README.md +311 -34
- package/form-field-simple/fesm2022/form-field-simple.mjs +4 -4
- package/form-searchable-multiselect/README.md +332 -34
- package/form-searchable-multiselect/fesm2022/form-searchable-multiselect.mjs +31 -91
- package/form-searchable-multiselect/types/form-searchable-multiselect.d.ts +7 -1
- package/form-select/README.md +321 -34
- package/form-select/fesm2022/form-select.mjs +32 -149
- package/form-select/types/form-select.d.ts +7 -1
- package/form-text-input/README.md +342 -34
- package/form-text-input/fesm2022/form-text-input.mjs +35 -149
- package/form-text-input/types/form-text-input.d.ts +9 -12
- package/form-textarea/README.md +318 -34
- package/form-textarea/fesm2022/form-textarea.mjs +34 -109
- package/form-textarea/types/form-textarea.d.ts +8 -1
- package/hover-card/README.md +256 -5
- package/hover-card/fesm2022/hover-card.mjs +19 -19
- package/icon/README.md +210 -34
- package/icon/fesm2022/icon.mjs +8 -8
- package/input/README.md +240 -34
- package/input/fesm2022/input.mjs +17 -12
- package/input/types/input.d.ts +2 -1
- package/input-group/README.md +335 -5
- package/input-group/fesm2022/input-group.mjs +34 -34
- package/input-otp/README.md +375 -5
- package/input-otp/fesm2022/input-otp.mjs +26 -26
- package/item/README.md +385 -5
- package/item/fesm2022/item.mjs +53 -53
- package/kbd/README.md +291 -5
- package/kbd/fesm2022/kbd.mjs +12 -12
- package/label/README.md +243 -34
- package/label/fesm2022/label.mjs +10 -10
- package/label/types/label.d.ts +1 -1
- package/layout-simple/README.md +174 -44
- package/layout-simple/fesm2022/layout-simple.mjs +508 -603
- package/layout-simple/types/layout-simple.d.ts +179 -128
- package/menu/README.md +418 -0
- package/menu/fesm2022/menu.mjs +455 -0
- package/menu/package.json +24 -0
- package/menu/types/menu.d.ts +137 -0
- package/menubar/README.md +343 -5
- package/menubar/fesm2022/menubar.mjs +13 -13
- package/native-select/README.md +323 -5
- package/native-select/fesm2022/native-select.mjs +19 -19
- package/navigation-menu/README.md +369 -5
- package/navigation-menu/fesm2022/navigation-menu.mjs +35 -47
- package/package.json +183 -154
- package/pagination/README.md +388 -5
- package/pagination/fesm2022/pagination.mjs +45 -331
- package/popover/README.md +302 -34
- package/popover/fesm2022/popover.mjs +30 -30
- package/progress/README.md +311 -5
- package/progress/fesm2022/progress.mjs +13 -13
- package/radio-group/README.md +335 -34
- package/radio-group/fesm2022/radio-group.mjs +26 -19
- package/radio-group/types/radio-group.d.ts +1 -1
- package/resizable/README.md +269 -5
- package/resizable/fesm2022/resizable.mjs +18 -26
- package/scroll-area/README.md +233 -5
- package/scroll-area/fesm2022/scroll-area.mjs +9 -9
- package/searchable-multiselect/README.md +294 -34
- package/searchable-multiselect/fesm2022/searchable-multiselect.mjs +28 -117
- package/searchable-multiselect/types/searchable-multiselect.d.ts +8 -2
- package/select/README.md +408 -34
- package/select/fesm2022/select.mjs +71 -111
- package/select/types/select.d.ts +3 -1
- package/separator/README.md +193 -34
- package/separator/fesm2022/separator.mjs +9 -9
- package/separator/types/separator.d.ts +1 -1
- package/sheet/README.md +282 -34
- package/sheet/fesm2022/sheet.mjs +41 -53
- package/sidebar/README.md +457 -5
- package/sidebar/fesm2022/sidebar.mjs +125 -227
- package/skeleton/README.md +217 -5
- package/skeleton/fesm2022/skeleton.mjs +9 -9
- package/slider/README.md +273 -5
- package/slider/fesm2022/slider.mjs +10 -80
- package/sonner/README.md +317 -34
- package/sonner/fesm2022/sonner.mjs +13 -13
- package/spinner/README.md +255 -34
- package/spinner/fesm2022/spinner.mjs +11 -11
- package/switch/README.md +281 -34
- package/switch/fesm2022/switch.mjs +13 -15
- package/table/README.md +423 -5
- package/table/fesm2022/table.mjs +41 -41
- package/tabs/README.md +382 -34
- package/tabs/fesm2022/tabs.mjs +35 -111
- package/textarea/README.md +282 -5
- package/textarea/fesm2022/textarea.mjs +9 -9
- package/toggle/README.md +270 -5
- package/toggle/fesm2022/toggle.mjs +13 -13
- package/toggle-group/README.md +340 -5
- package/toggle-group/fesm2022/toggle-group.mjs +13 -13
- package/toggle-group/types/toggle-group.d.ts +13 -7
- package/tooltip/README.md +240 -34
- package/tooltip/fesm2022/tooltip.mjs +14 -14
- package/typography/README.md +271 -5
- package/typography/fesm2022/typography.mjs +53 -53
- package/typography/types/typography.d.ts +19 -19
- package/utils/README.md +274 -34
- package/utils/fesm2022/utils.mjs +68 -44
- package/accordion/fesm2022/accordion.mjs.map +0 -1
- package/alert/fesm2022/alert.mjs.map +0 -1
- package/alert-dialog/fesm2022/alert-dialog.mjs.map +0 -1
- package/aspect-ratio/fesm2022/aspect-ratio.mjs.map +0 -1
- package/autocomplete/fesm2022/autocomplete.mjs.map +0 -1
- package/avatar/fesm2022/avatar.mjs.map +0 -1
- package/badge/fesm2022/badge.mjs.map +0 -1
- package/basic-alert/fesm2022/basic-alert.mjs.map +0 -1
- package/breadcrumb/fesm2022/breadcrumb.mjs.map +0 -1
- package/button/fesm2022/button.mjs.map +0 -1
- package/button-group/fesm2022/button-group.mjs.map +0 -1
- package/calendar/fesm2022/calendar.mjs.map +0 -1
- package/card/fesm2022/card.mjs.map +0 -1
- package/carousel/fesm2022/carousel.mjs.map +0 -1
- package/checkbox/fesm2022/checkbox.mjs.map +0 -1
- package/collapsible/fesm2022/collapsible.mjs.map +0 -1
- package/combobox/fesm2022/combobox.mjs.map +0 -1
- package/command/fesm2022/command.mjs.map +0 -1
- package/confirmation-dialog/fesm2022/confirmation-dialog.mjs.map +0 -1
- package/context-menu/fesm2022/context-menu.mjs.map +0 -1
- package/date-picker/fesm2022/date-picker.mjs.map +0 -1
- package/dialog/fesm2022/dialog.mjs.map +0 -1
- package/drawer/fesm2022/drawer.mjs.map +0 -1
- package/dropdown-menu/fesm2022/dropdown-menu.mjs.map +0 -1
- package/empty/fesm2022/empty.mjs.map +0 -1
- package/field/fesm2022/field.mjs.map +0 -1
- package/form-checkbox/fesm2022/form-checkbox.mjs.map +0 -1
- package/form-date-picker/fesm2022/form-date-picker.mjs.map +0 -1
- package/form-field/fesm2022/form-field.mjs.map +0 -1
- package/form-field-simple/fesm2022/form-field-simple.mjs.map +0 -1
- package/form-searchable-multiselect/fesm2022/form-searchable-multiselect.mjs.map +0 -1
- package/form-select/fesm2022/form-select.mjs.map +0 -1
- package/form-text-input/fesm2022/form-text-input.mjs.map +0 -1
- package/form-textarea/fesm2022/form-textarea.mjs.map +0 -1
- package/hover-card/fesm2022/hover-card.mjs.map +0 -1
- package/icon/fesm2022/icon.mjs.map +0 -1
- package/input/fesm2022/input.mjs.map +0 -1
- package/input-group/fesm2022/input-group.mjs.map +0 -1
- package/input-otp/fesm2022/input-otp.mjs.map +0 -1
- package/item/fesm2022/item.mjs.map +0 -1
- package/kbd/fesm2022/kbd.mjs.map +0 -1
- package/label/fesm2022/label.mjs.map +0 -1
- package/layout-simple/fesm2022/layout-simple.mjs.map +0 -1
- package/menubar/fesm2022/menubar.mjs.map +0 -1
- package/native-select/fesm2022/native-select.mjs.map +0 -1
- package/navigation-menu/fesm2022/navigation-menu.mjs.map +0 -1
- package/pagination/fesm2022/pagination.mjs.map +0 -1
- package/popover/fesm2022/popover.mjs.map +0 -1
- package/progress/fesm2022/progress.mjs.map +0 -1
- package/radio-group/fesm2022/radio-group.mjs.map +0 -1
- package/resizable/fesm2022/resizable.mjs.map +0 -1
- package/scroll-area/fesm2022/scroll-area.mjs.map +0 -1
- package/searchable-multiselect/fesm2022/searchable-multiselect.mjs.map +0 -1
- package/select/fesm2022/select.mjs.map +0 -1
- package/separator/fesm2022/separator.mjs.map +0 -1
- package/sheet/fesm2022/sheet.mjs.map +0 -1
- package/sidebar/fesm2022/sidebar.mjs.map +0 -1
- package/skeleton/fesm2022/skeleton.mjs.map +0 -1
- package/slider/fesm2022/slider.mjs.map +0 -1
- package/sonner/fesm2022/sonner.mjs.map +0 -1
- package/spinner/fesm2022/spinner.mjs.map +0 -1
- package/switch/fesm2022/switch.mjs.map +0 -1
- package/table/fesm2022/table.mjs.map +0 -1
- package/tabs/fesm2022/tabs.mjs.map +0 -1
- package/textarea/fesm2022/textarea.mjs.map +0 -1
- package/toggle/fesm2022/toggle.mjs.map +0 -1
- package/toggle-group/fesm2022/toggle-group.mjs.map +0 -1
- package/tooltip/fesm2022/tooltip.mjs.map +0 -1
- package/typography/fesm2022/typography.mjs.map +0 -1
- package/utils/fesm2022/utils.mjs.map +0 -1
package/input-otp/README.md
CHANGED
|
@@ -1,11 +1,381 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Input OTP (`@egose/shadcn-theme-ng/input-otp`)
|
|
2
2
|
|
|
3
|
-
|
|
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
|
-
|
|
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
|
-
|
|
7
|
+
## Installation
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
|
-
|
|
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(() =>
|
|
10
|
+
classes(() => "gap-2 flex items-center has-disabled:opacity-50");
|
|
11
11
|
}
|
|
12
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.
|
|
13
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.
|
|
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.
|
|
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(() =>
|
|
25
|
+
classes(() => "pointer-events-none absolute inset-0 flex items-center justify-center");
|
|
26
26
|
}
|
|
27
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.
|
|
28
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.
|
|
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=\"animate-caret-blink bg-foreground h-4 w-px duration-1000\"></div> ", isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
29
29
|
}
|
|
30
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.
|
|
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:
|
|
35
|
+
template: " <div class=\"animate-caret-blink bg-foreground h-4 w-px duration-1000\"></div> ",
|
|
36
36
|
}]
|
|
37
37
|
}], ctorParameters: () => [] });
|
|
38
38
|
|
|
39
39
|
class HlmInputOtpGroup {
|
|
40
40
|
constructor() {
|
|
41
|
-
classes(() =>
|
|
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");
|
|
42
42
|
}
|
|
43
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.
|
|
44
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.
|
|
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.
|
|
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',
|
|
@@ -55,10 +55,10 @@ class HlmInputOtpSeparator {
|
|
|
55
55
|
constructor() {
|
|
56
56
|
classes(() => "[&_ng-icon:not([class*='text-'])]:text-[length:--spacing(4)] flex items-center");
|
|
57
57
|
}
|
|
58
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.
|
|
59
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.
|
|
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.
|
|
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(() =>
|
|
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");
|
|
81
81
|
}
|
|
82
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.
|
|
83
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.
|
|
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.
|
|
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.
|
|
116
|
-
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
141
|
+
|