@tensor_1/react 2.47.0 → 2.49.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 (204) hide show
  1. package/README.md +540 -2
  2. package/dist/{SchedulingCalendar-B6TakO2h.d.ts → SchedulingCalendar-WWyFL3Eo.d.ts} +51 -2
  3. package/dist/announce.d.ts +10 -0
  4. package/dist/announce.js +30 -0
  5. package/dist/chart-analytic.cjs +33 -25
  6. package/dist/chart-preset.cjs +23 -15
  7. package/dist/chart.cjs +23 -15
  8. package/dist/combobox-model.d.ts +10 -1
  9. package/dist/combobox-model.js +15 -0
  10. package/dist/command-palette-model.d.ts +44 -0
  11. package/dist/command-palette-model.js +36 -0
  12. package/dist/components/AccountMenu.d.ts +44 -0
  13. package/dist/components/AccountMenu.js +43 -0
  14. package/dist/components/AppShell.d.ts +45 -2
  15. package/dist/components/AppShell.js +116 -5
  16. package/dist/components/AuditLog.d.ts +128 -0
  17. package/dist/components/AuditLog.js +196 -0
  18. package/dist/components/BrandProfiles.js +4 -3
  19. package/dist/components/Breadcrumbs.d.ts +9 -2
  20. package/dist/components/Breadcrumbs.js +3 -2
  21. package/dist/components/Button.d.ts +12 -5
  22. package/dist/components/Button.js +7 -3
  23. package/dist/components/Card.d.ts +18 -1
  24. package/dist/components/Card.js +5 -1
  25. package/dist/components/ChangeHighlight.d.ts +30 -0
  26. package/dist/components/ChangeHighlight.js +21 -0
  27. package/dist/components/ChartCore.js +2 -1
  28. package/dist/components/Checkbox.d.ts +27 -1
  29. package/dist/components/Checkbox.js +31 -2
  30. package/dist/components/Chip.d.ts +7 -3
  31. package/dist/components/Chip.js +2 -2
  32. package/dist/components/CodeDisplay.d.ts +65 -0
  33. package/dist/components/CodeDisplay.js +124 -0
  34. package/dist/components/Combobox.d.ts +27 -6
  35. package/dist/components/Combobox.js +195 -58
  36. package/dist/components/CommandPalette.d.ts +36 -1
  37. package/dist/components/CommandPalette.js +254 -2
  38. package/dist/components/ContactCard.d.ts +66 -0
  39. package/dist/components/ContactCard.js +74 -0
  40. package/dist/components/Count.d.ts +24 -0
  41. package/dist/components/Count.js +32 -0
  42. package/dist/components/DashboardCanvas.js +14 -0
  43. package/dist/components/DataWorkspace.d.ts +167 -0
  44. package/dist/components/DataWorkspace.js +380 -0
  45. package/dist/components/DateFieldParts.d.ts +2 -1
  46. package/dist/components/DateFieldParts.js +7 -0
  47. package/dist/components/DatePicker.d.ts +9 -2
  48. package/dist/components/DatePicker.js +67 -28
  49. package/dist/components/DateRangePicker.d.ts +12 -2
  50. package/dist/components/DateRangePicker.js +13 -12
  51. package/dist/components/DetailPage.d.ts +7 -1
  52. package/dist/components/DetailPage.js +2 -1
  53. package/dist/components/Dialogs.d.ts +71 -10
  54. package/dist/components/Dialogs.js +130 -30
  55. package/dist/components/DiffViewer.d.ts +23 -3
  56. package/dist/components/DiffViewer.js +26 -12
  57. package/dist/components/DiscardPrompt.js +16 -0
  58. package/dist/components/DisplayPreferences.d.ts +83 -0
  59. package/dist/components/DisplayPreferences.js +185 -0
  60. package/dist/components/EditorialHome.d.ts +23 -3
  61. package/dist/components/EditorialHome.js +16 -11
  62. package/dist/components/EntityPicker.d.ts +20 -3
  63. package/dist/components/EntityPicker.js +32 -13
  64. package/dist/components/FilterEditor.d.ts +18 -4
  65. package/dist/components/FilterEditor.js +141 -19
  66. package/dist/components/FocusOnMount.d.ts +282 -0
  67. package/dist/components/FocusOnMount.js +12 -0
  68. package/dist/components/InfoTip.js +11 -12
  69. package/dist/components/InlineEdit.d.ts +87 -20
  70. package/dist/components/InlineEdit.js +197 -54
  71. package/dist/components/Input.d.ts +12 -2
  72. package/dist/components/Input.js +5 -3
  73. package/dist/components/Kanban.d.ts +14 -3
  74. package/dist/components/Kanban.js +9 -4
  75. package/dist/components/Kbd.d.ts +6 -1
  76. package/dist/components/Kbd.js +6 -6
  77. package/dist/components/Lightbox.d.ts +41 -5
  78. package/dist/components/Lightbox.js +95 -9
  79. package/dist/components/MatchReview.d.ts +40 -1
  80. package/dist/components/MatchReview.js +130 -4
  81. package/dist/components/MetricInput.js +3 -2
  82. package/dist/components/Modal.d.ts +2 -1
  83. package/dist/components/Modal.js +13 -4
  84. package/dist/components/MotionList.d.ts +303 -0
  85. package/dist/components/MotionList.js +175 -0
  86. package/dist/components/NavFavourites.d.ts +5 -0
  87. package/dist/components/NavFavourites.js +7 -7
  88. package/dist/components/OtpInput.d.ts +33 -0
  89. package/dist/components/OtpInput.js +123 -0
  90. package/dist/components/PageHeader.d.ts +7 -1
  91. package/dist/components/PageHeader.js +2 -2
  92. package/dist/components/Pagination.js +6 -5
  93. package/dist/components/PasswordInput.d.ts +34 -0
  94. package/dist/components/PasswordInput.js +101 -0
  95. package/dist/components/Peek.js +3 -3
  96. package/dist/components/Popover.js +11 -0
  97. package/dist/components/PrintLayout.d.ts +63 -0
  98. package/dist/components/PrintLayout.js +114 -0
  99. package/dist/components/QrCode.d.ts +47 -0
  100. package/dist/components/QrCode.js +55 -0
  101. package/dist/components/QrScanner.d.ts +95 -0
  102. package/dist/components/QrScanner.js +266 -0
  103. package/dist/components/RelationshipGraph.d.ts +32 -1
  104. package/dist/components/RelationshipGraph.js +22 -6
  105. package/dist/components/RelationshipGraphLayered.d.ts +1 -1
  106. package/dist/components/RelationshipGraphLayered.js +268 -118
  107. package/dist/components/RelationshipGraphList.js +33 -6
  108. package/dist/components/RuleBuilder.js +39 -7
  109. package/dist/components/SchedulingAgenda.d.ts +3 -1
  110. package/dist/components/SchedulingCalendar.d.ts +3 -1
  111. package/dist/components/SchedulingCalendar.js +43 -4
  112. package/dist/components/SchedulingResourceDay.d.ts +57 -0
  113. package/dist/components/SchedulingResourceDay.js +287 -0
  114. package/dist/components/SchedulingTimeGrid.d.ts +3 -1
  115. package/dist/components/SchedulingTimeline.d.ts +3 -1
  116. package/dist/components/SearchSuggest.d.ts +23 -3
  117. package/dist/components/SearchSuggest.js +56 -18
  118. package/dist/components/Segmented.d.ts +39 -4
  119. package/dist/components/Segmented.js +39 -5
  120. package/dist/components/Select.d.ts +3 -2
  121. package/dist/components/Select.js +7 -1
  122. package/dist/components/ShortcutHint.d.ts +11 -10
  123. package/dist/components/ShortcutHint.js +44 -38
  124. package/dist/components/Sidebar.d.ts +36 -4
  125. package/dist/components/Sidebar.js +37 -12
  126. package/dist/components/SortableList.d.ts +45 -0
  127. package/dist/components/SortableList.js +147 -0
  128. package/dist/components/Stat.d.ts +28 -3
  129. package/dist/components/Stat.js +13 -3
  130. package/dist/components/States.d.ts +33 -1
  131. package/dist/components/States.js +43 -1
  132. package/dist/components/StatusPill.d.ts +14 -3
  133. package/dist/components/StatusPill.js +11 -3
  134. package/dist/components/Steps.js +2 -1
  135. package/dist/components/Table.d.ts +9 -2
  136. package/dist/components/Table.js +4 -2
  137. package/dist/components/TableControls.js +18 -58
  138. package/dist/components/TableOverflowProbe.d.ts +12 -0
  139. package/dist/components/TableOverflowProbe.js +27 -0
  140. package/dist/components/Tabs.d.ts +2 -1
  141. package/dist/components/Tabs.js +10 -2
  142. package/dist/components/TagInput.d.ts +67 -0
  143. package/dist/components/TagInput.js +342 -0
  144. package/dist/components/Textarea.d.ts +5 -0
  145. package/dist/components/Textarea.js +2 -2
  146. package/dist/components/TimePicker.d.ts +80 -0
  147. package/dist/components/TimePicker.js +347 -0
  148. package/dist/components/Toast.d.ts +1 -1
  149. package/dist/components/Toast.js +109 -4
  150. package/dist/components/Tooltip.d.ts +8 -4
  151. package/dist/components/Tooltip.js +86 -28
  152. package/dist/components/Tree.d.ts +8 -0
  153. package/dist/components/Tree.js +11 -5
  154. package/dist/display-preferences-model.d.ts +53 -0
  155. package/dist/display-preferences-model.js +64 -0
  156. package/dist/emoji.cjs +143 -49
  157. package/dist/filter-model.d.ts +59 -3
  158. package/dist/filter-model.js +67 -2
  159. package/dist/hooks/useAnchoredPosition.js +14 -2
  160. package/dist/hooks/useChangeHighlight.d.ts +33 -0
  161. package/dist/hooks/useChangeHighlight.js +44 -0
  162. package/dist/hooks/useDeferredReorder.d.ts +32 -0
  163. package/dist/hooks/useDeferredReorder.js +47 -0
  164. package/dist/hooks/useDialog.d.ts +5 -0
  165. package/dist/hooks/useDialog.js +17 -3
  166. package/dist/hooks/useKeyboardGrab.d.ts +58 -0
  167. package/dist/hooks/useKeyboardGrab.js +118 -0
  168. package/dist/hooks/useOptimisticValue.d.ts +51 -0
  169. package/dist/hooks/useOptimisticValue.js +61 -0
  170. package/dist/hooks/useReducedMotion.d.ts +4 -1
  171. package/dist/hooks/useReducedMotion.js +7 -1
  172. package/dist/hooks/useResolvedFilterLabels.d.ts +15 -0
  173. package/dist/hooks/useResolvedFilterLabels.js +34 -0
  174. package/dist/hooks/useSlidingIndicator.d.ts +18 -0
  175. package/dist/hooks/useSlidingIndicator.js +80 -0
  176. package/dist/hooks/useVirtualRows.d.ts +21 -2
  177. package/dist/hooks/useVirtualRows.js +30 -3
  178. package/dist/icons/Icon.d.ts +1 -1
  179. package/dist/index.cjs +19687 -13423
  180. package/dist/index.d.cts +3419 -651
  181. package/dist/index.d.ts +48 -18
  182. package/dist/index.js +153 -9
  183. package/dist/labels-context.d.ts +93 -3
  184. package/dist/motion.d.ts +11 -0
  185. package/dist/motion.js +35 -0
  186. package/dist/overlay-stack.d.ts +6 -0
  187. package/dist/overlay-stack.js +13 -0
  188. package/dist/qr-model.d.ts +65 -0
  189. package/dist/qr-model.js +323 -0
  190. package/dist/relationship-graph-model.d.ts +92 -3
  191. package/dist/relationship-graph-model.js +134 -15
  192. package/dist/reorder.d.ts +30 -0
  193. package/dist/reorder.js +74 -0
  194. package/dist/rich-text.cjs +46 -4
  195. package/dist/scheduling-resource-model.d.ts +76 -0
  196. package/dist/scheduling-resource-model.js +74 -0
  197. package/dist/search-suggest-model.js +3 -1
  198. package/dist/shell-context.d.ts +11 -0
  199. package/dist/shell-context.js +7 -0
  200. package/dist/time-field-model.d.ts +46 -0
  201. package/dist/time-field-model.js +152 -0
  202. package/dist/toast-store.d.ts +22 -3
  203. package/dist/toast-store.js +26 -9
  204. package/package.json +2 -1
@@ -0,0 +1,303 @@
1
+ import * as react from 'react';
2
+ import { HTMLAttributes, ReactElement, TransitionEvent } from 'react';
3
+
4
+ type Key = string | number;
5
+ interface MotionListProps<T> extends Omit<HTMLAttributes<HTMLElement>, 'children'> {
6
+ /** The items in the order to show them. */
7
+ items: readonly T[];
8
+ /** A stable key per item. */
9
+ getKey: (item: T) => Key;
10
+ /**
11
+ * One element per item: an `<li>` for `ul`/`ol`, a `Tr` for `tbody`. It must pass unknown
12
+ * props through to its DOM element (the list sets `data-uix-key` and, while an item leaves,
13
+ * `data-uix-exiting` and `aria-hidden`; `inert` is set on the element directly).
14
+ */
15
+ renderItem: (item: T, state: {
16
+ exiting: boolean;
17
+ }) => ReactElement;
18
+ /** The list element (default `ul`). */
19
+ as?: 'ul' | 'ol' | 'div' | 'tbody';
20
+ }
21
+ /**
22
+ * A list whose items arrive, leave and move visibly (HAR-2586, motion standard §2.5):
23
+ *
24
+ * - A new item fades in and rises 8 px into place; never on the first render.
25
+ * - A removed item stays for a moment, fades out, and only then leaves; the items after it
26
+ * glide up into the gap instead of jumping.
27
+ * - A reordered item glides from its old place to its new one (FLIP: transform only).
28
+ * - Focus stays put: on an item that moved, and on the next item when the focused one leaves.
29
+ * Focus outside the list is never pulled in.
30
+ *
31
+ * Reduced motion keeps the fades and drops every glide and rise. For a list that re-sorts
32
+ * itself (live data), hold the order while the person is pointing at it: `useDeferredReorder`.
33
+ */
34
+ declare function MotionList<T>({ items, getKey, renderItem, as, className, ...props }: MotionListProps<T>): react.DetailedReactHTMLElement<{
35
+ ref: react.RefObject<HTMLElement>;
36
+ className: string;
37
+ onTransitionEnd: (event: TransitionEvent<HTMLElement>) => void;
38
+ color?: string | undefined | undefined;
39
+ title?: string | undefined | undefined;
40
+ id?: string | undefined | undefined;
41
+ draggable?: (boolean | "false" | "true") | undefined;
42
+ style?: react.CSSProperties | undefined;
43
+ defaultChecked?: boolean | undefined | undefined;
44
+ defaultValue?: string | number | readonly string[] | undefined;
45
+ suppressContentEditableWarning?: boolean | undefined | undefined;
46
+ suppressHydrationWarning?: boolean | undefined | undefined;
47
+ accessKey?: string | undefined | undefined;
48
+ autoCapitalize?: "off" | "none" | "on" | "sentences" | "words" | "characters" | undefined | (string & {}) | undefined;
49
+ autoFocus?: boolean | undefined | undefined;
50
+ contentEditable?: "inherit" | (boolean | "false" | "true") | "plaintext-only" | undefined;
51
+ contextMenu?: string | undefined | undefined;
52
+ dir?: string | undefined | undefined;
53
+ enterKeyHint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined | undefined;
54
+ hidden?: boolean | undefined | undefined;
55
+ lang?: string | undefined | undefined;
56
+ nonce?: string | undefined | undefined;
57
+ slot?: string | undefined | undefined;
58
+ spellCheck?: (boolean | "false" | "true") | undefined;
59
+ tabIndex?: number | undefined | undefined;
60
+ translate?: "yes" | "no" | undefined | undefined;
61
+ radioGroup?: string | undefined | undefined;
62
+ role?: react.AriaRole | undefined;
63
+ about?: string | undefined | undefined;
64
+ content?: string | undefined | undefined;
65
+ datatype?: string | undefined | undefined;
66
+ inlist?: any;
67
+ prefix?: string | undefined | undefined;
68
+ property?: string | undefined | undefined;
69
+ rel?: string | undefined | undefined;
70
+ resource?: string | undefined | undefined;
71
+ rev?: string | undefined | undefined;
72
+ typeof?: string | undefined | undefined;
73
+ vocab?: string | undefined | undefined;
74
+ autoCorrect?: string | undefined | undefined;
75
+ autoSave?: string | undefined | undefined;
76
+ itemProp?: string | undefined | undefined;
77
+ itemScope?: boolean | undefined | undefined;
78
+ itemType?: string | undefined | undefined;
79
+ itemID?: string | undefined | undefined;
80
+ itemRef?: string | undefined | undefined;
81
+ results?: number | undefined | undefined;
82
+ security?: string | undefined | undefined;
83
+ unselectable?: "on" | "off" | undefined | undefined;
84
+ inputMode?: "none" | "text" | "tel" | "url" | "email" | "numeric" | "decimal" | "search" | undefined | undefined;
85
+ is?: string | undefined | undefined;
86
+ exportparts?: string | undefined | undefined;
87
+ part?: string | undefined | undefined;
88
+ "aria-activedescendant"?: string | undefined | undefined;
89
+ "aria-atomic"?: (boolean | "false" | "true") | undefined;
90
+ "aria-autocomplete"?: "none" | "inline" | "list" | "both" | undefined | undefined;
91
+ "aria-braillelabel"?: string | undefined | undefined;
92
+ "aria-brailleroledescription"?: string | undefined | undefined;
93
+ "aria-busy"?: (boolean | "false" | "true") | undefined;
94
+ "aria-checked"?: boolean | "false" | "mixed" | "true" | undefined | undefined;
95
+ "aria-colcount"?: number | undefined | undefined;
96
+ "aria-colindex"?: number | undefined | undefined;
97
+ "aria-colindextext"?: string | undefined | undefined;
98
+ "aria-colspan"?: number | undefined | undefined;
99
+ "aria-controls"?: string | undefined | undefined;
100
+ "aria-current"?: boolean | "false" | "true" | "page" | "step" | "location" | "date" | "time" | undefined | undefined;
101
+ "aria-describedby"?: string | undefined | undefined;
102
+ "aria-description"?: string | undefined | undefined;
103
+ "aria-details"?: string | undefined | undefined;
104
+ "aria-disabled"?: (boolean | "false" | "true") | undefined;
105
+ "aria-dropeffect"?: "none" | "copy" | "execute" | "link" | "move" | "popup" | undefined | undefined;
106
+ "aria-errormessage"?: string | undefined | undefined;
107
+ "aria-expanded"?: (boolean | "false" | "true") | undefined;
108
+ "aria-flowto"?: string | undefined | undefined;
109
+ "aria-grabbed"?: (boolean | "false" | "true") | undefined;
110
+ "aria-haspopup"?: boolean | "false" | "true" | "menu" | "listbox" | "tree" | "grid" | "dialog" | undefined | undefined;
111
+ "aria-hidden"?: (boolean | "false" | "true") | undefined;
112
+ "aria-invalid"?: boolean | "false" | "true" | "grammar" | "spelling" | undefined | undefined;
113
+ "aria-keyshortcuts"?: string | undefined | undefined;
114
+ "aria-label"?: string | undefined | undefined;
115
+ "aria-labelledby"?: string | undefined | undefined;
116
+ "aria-level"?: number | undefined | undefined;
117
+ "aria-live"?: "off" | "assertive" | "polite" | undefined | undefined;
118
+ "aria-modal"?: (boolean | "false" | "true") | undefined;
119
+ "aria-multiline"?: (boolean | "false" | "true") | undefined;
120
+ "aria-multiselectable"?: (boolean | "false" | "true") | undefined;
121
+ "aria-orientation"?: "horizontal" | "vertical" | undefined | undefined;
122
+ "aria-owns"?: string | undefined | undefined;
123
+ "aria-placeholder"?: string | undefined | undefined;
124
+ "aria-posinset"?: number | undefined | undefined;
125
+ "aria-pressed"?: boolean | "false" | "mixed" | "true" | undefined | undefined;
126
+ "aria-readonly"?: (boolean | "false" | "true") | undefined;
127
+ "aria-relevant"?: "additions" | "additions removals" | "additions text" | "all" | "removals" | "removals additions" | "removals text" | "text" | "text additions" | "text removals" | undefined | undefined;
128
+ "aria-required"?: (boolean | "false" | "true") | undefined;
129
+ "aria-roledescription"?: string | undefined | undefined;
130
+ "aria-rowcount"?: number | undefined | undefined;
131
+ "aria-rowindex"?: number | undefined | undefined;
132
+ "aria-rowindextext"?: string | undefined | undefined;
133
+ "aria-rowspan"?: number | undefined | undefined;
134
+ "aria-selected"?: (boolean | "false" | "true") | undefined;
135
+ "aria-setsize"?: number | undefined | undefined;
136
+ "aria-sort"?: "none" | "ascending" | "descending" | "other" | undefined | undefined;
137
+ "aria-valuemax"?: number | undefined | undefined;
138
+ "aria-valuemin"?: number | undefined | undefined;
139
+ "aria-valuenow"?: number | undefined | undefined;
140
+ "aria-valuetext"?: string | undefined | undefined;
141
+ dangerouslySetInnerHTML?: {
142
+ __html: string | TrustedHTML;
143
+ } | undefined | undefined;
144
+ onCopy?: react.ClipboardEventHandler<HTMLElement> | undefined;
145
+ onCopyCapture?: react.ClipboardEventHandler<HTMLElement> | undefined;
146
+ onCut?: react.ClipboardEventHandler<HTMLElement> | undefined;
147
+ onCutCapture?: react.ClipboardEventHandler<HTMLElement> | undefined;
148
+ onPaste?: react.ClipboardEventHandler<HTMLElement> | undefined;
149
+ onPasteCapture?: react.ClipboardEventHandler<HTMLElement> | undefined;
150
+ onCompositionEnd?: react.CompositionEventHandler<HTMLElement> | undefined;
151
+ onCompositionEndCapture?: react.CompositionEventHandler<HTMLElement> | undefined;
152
+ onCompositionStart?: react.CompositionEventHandler<HTMLElement> | undefined;
153
+ onCompositionStartCapture?: react.CompositionEventHandler<HTMLElement> | undefined;
154
+ onCompositionUpdate?: react.CompositionEventHandler<HTMLElement> | undefined;
155
+ onCompositionUpdateCapture?: react.CompositionEventHandler<HTMLElement> | undefined;
156
+ onFocus?: react.FocusEventHandler<HTMLElement> | undefined;
157
+ onFocusCapture?: react.FocusEventHandler<HTMLElement> | undefined;
158
+ onBlur?: react.FocusEventHandler<HTMLElement> | undefined;
159
+ onBlurCapture?: react.FocusEventHandler<HTMLElement> | undefined;
160
+ onChange?: react.FormEventHandler<HTMLElement> | undefined;
161
+ onChangeCapture?: react.FormEventHandler<HTMLElement> | undefined;
162
+ onBeforeInput?: react.InputEventHandler<HTMLElement> | undefined;
163
+ onBeforeInputCapture?: react.FormEventHandler<HTMLElement> | undefined;
164
+ onInput?: react.FormEventHandler<HTMLElement> | undefined;
165
+ onInputCapture?: react.FormEventHandler<HTMLElement> | undefined;
166
+ onReset?: react.FormEventHandler<HTMLElement> | undefined;
167
+ onResetCapture?: react.FormEventHandler<HTMLElement> | undefined;
168
+ onSubmit?: react.FormEventHandler<HTMLElement> | undefined;
169
+ onSubmitCapture?: react.FormEventHandler<HTMLElement> | undefined;
170
+ onInvalid?: react.FormEventHandler<HTMLElement> | undefined;
171
+ onInvalidCapture?: react.FormEventHandler<HTMLElement> | undefined;
172
+ onLoad?: react.ReactEventHandler<HTMLElement> | undefined;
173
+ onLoadCapture?: react.ReactEventHandler<HTMLElement> | undefined;
174
+ onError?: react.ReactEventHandler<HTMLElement> | undefined;
175
+ onErrorCapture?: react.ReactEventHandler<HTMLElement> | undefined;
176
+ onKeyDown?: react.KeyboardEventHandler<HTMLElement> | undefined;
177
+ onKeyDownCapture?: react.KeyboardEventHandler<HTMLElement> | undefined;
178
+ onKeyPress?: react.KeyboardEventHandler<HTMLElement> | undefined;
179
+ onKeyPressCapture?: react.KeyboardEventHandler<HTMLElement> | undefined;
180
+ onKeyUp?: react.KeyboardEventHandler<HTMLElement> | undefined;
181
+ onKeyUpCapture?: react.KeyboardEventHandler<HTMLElement> | undefined;
182
+ onAbort?: react.ReactEventHandler<HTMLElement> | undefined;
183
+ onAbortCapture?: react.ReactEventHandler<HTMLElement> | undefined;
184
+ onCanPlay?: react.ReactEventHandler<HTMLElement> | undefined;
185
+ onCanPlayCapture?: react.ReactEventHandler<HTMLElement> | undefined;
186
+ onCanPlayThrough?: react.ReactEventHandler<HTMLElement> | undefined;
187
+ onCanPlayThroughCapture?: react.ReactEventHandler<HTMLElement> | undefined;
188
+ onDurationChange?: react.ReactEventHandler<HTMLElement> | undefined;
189
+ onDurationChangeCapture?: react.ReactEventHandler<HTMLElement> | undefined;
190
+ onEmptied?: react.ReactEventHandler<HTMLElement> | undefined;
191
+ onEmptiedCapture?: react.ReactEventHandler<HTMLElement> | undefined;
192
+ onEncrypted?: react.ReactEventHandler<HTMLElement> | undefined;
193
+ onEncryptedCapture?: react.ReactEventHandler<HTMLElement> | undefined;
194
+ onEnded?: react.ReactEventHandler<HTMLElement> | undefined;
195
+ onEndedCapture?: react.ReactEventHandler<HTMLElement> | undefined;
196
+ onLoadedData?: react.ReactEventHandler<HTMLElement> | undefined;
197
+ onLoadedDataCapture?: react.ReactEventHandler<HTMLElement> | undefined;
198
+ onLoadedMetadata?: react.ReactEventHandler<HTMLElement> | undefined;
199
+ onLoadedMetadataCapture?: react.ReactEventHandler<HTMLElement> | undefined;
200
+ onLoadStart?: react.ReactEventHandler<HTMLElement> | undefined;
201
+ onLoadStartCapture?: react.ReactEventHandler<HTMLElement> | undefined;
202
+ onPause?: react.ReactEventHandler<HTMLElement> | undefined;
203
+ onPauseCapture?: react.ReactEventHandler<HTMLElement> | undefined;
204
+ onPlay?: react.ReactEventHandler<HTMLElement> | undefined;
205
+ onPlayCapture?: react.ReactEventHandler<HTMLElement> | undefined;
206
+ onPlaying?: react.ReactEventHandler<HTMLElement> | undefined;
207
+ onPlayingCapture?: react.ReactEventHandler<HTMLElement> | undefined;
208
+ onProgress?: react.ReactEventHandler<HTMLElement> | undefined;
209
+ onProgressCapture?: react.ReactEventHandler<HTMLElement> | undefined;
210
+ onRateChange?: react.ReactEventHandler<HTMLElement> | undefined;
211
+ onRateChangeCapture?: react.ReactEventHandler<HTMLElement> | undefined;
212
+ onSeeked?: react.ReactEventHandler<HTMLElement> | undefined;
213
+ onSeekedCapture?: react.ReactEventHandler<HTMLElement> | undefined;
214
+ onSeeking?: react.ReactEventHandler<HTMLElement> | undefined;
215
+ onSeekingCapture?: react.ReactEventHandler<HTMLElement> | undefined;
216
+ onStalled?: react.ReactEventHandler<HTMLElement> | undefined;
217
+ onStalledCapture?: react.ReactEventHandler<HTMLElement> | undefined;
218
+ onSuspend?: react.ReactEventHandler<HTMLElement> | undefined;
219
+ onSuspendCapture?: react.ReactEventHandler<HTMLElement> | undefined;
220
+ onTimeUpdate?: react.ReactEventHandler<HTMLElement> | undefined;
221
+ onTimeUpdateCapture?: react.ReactEventHandler<HTMLElement> | undefined;
222
+ onVolumeChange?: react.ReactEventHandler<HTMLElement> | undefined;
223
+ onVolumeChangeCapture?: react.ReactEventHandler<HTMLElement> | undefined;
224
+ onWaiting?: react.ReactEventHandler<HTMLElement> | undefined;
225
+ onWaitingCapture?: react.ReactEventHandler<HTMLElement> | undefined;
226
+ onAuxClick?: react.MouseEventHandler<HTMLElement> | undefined;
227
+ onAuxClickCapture?: react.MouseEventHandler<HTMLElement> | undefined;
228
+ onClick?: react.MouseEventHandler<HTMLElement> | undefined;
229
+ onClickCapture?: react.MouseEventHandler<HTMLElement> | undefined;
230
+ onContextMenu?: react.MouseEventHandler<HTMLElement> | undefined;
231
+ onContextMenuCapture?: react.MouseEventHandler<HTMLElement> | undefined;
232
+ onDoubleClick?: react.MouseEventHandler<HTMLElement> | undefined;
233
+ onDoubleClickCapture?: react.MouseEventHandler<HTMLElement> | undefined;
234
+ onDrag?: react.DragEventHandler<HTMLElement> | undefined;
235
+ onDragCapture?: react.DragEventHandler<HTMLElement> | undefined;
236
+ onDragEnd?: react.DragEventHandler<HTMLElement> | undefined;
237
+ onDragEndCapture?: react.DragEventHandler<HTMLElement> | undefined;
238
+ onDragEnter?: react.DragEventHandler<HTMLElement> | undefined;
239
+ onDragEnterCapture?: react.DragEventHandler<HTMLElement> | undefined;
240
+ onDragExit?: react.DragEventHandler<HTMLElement> | undefined;
241
+ onDragExitCapture?: react.DragEventHandler<HTMLElement> | undefined;
242
+ onDragLeave?: react.DragEventHandler<HTMLElement> | undefined;
243
+ onDragLeaveCapture?: react.DragEventHandler<HTMLElement> | undefined;
244
+ onDragOver?: react.DragEventHandler<HTMLElement> | undefined;
245
+ onDragOverCapture?: react.DragEventHandler<HTMLElement> | undefined;
246
+ onDragStart?: react.DragEventHandler<HTMLElement> | undefined;
247
+ onDragStartCapture?: react.DragEventHandler<HTMLElement> | undefined;
248
+ onDrop?: react.DragEventHandler<HTMLElement> | undefined;
249
+ onDropCapture?: react.DragEventHandler<HTMLElement> | undefined;
250
+ onMouseDown?: react.MouseEventHandler<HTMLElement> | undefined;
251
+ onMouseDownCapture?: react.MouseEventHandler<HTMLElement> | undefined;
252
+ onMouseEnter?: react.MouseEventHandler<HTMLElement> | undefined;
253
+ onMouseLeave?: react.MouseEventHandler<HTMLElement> | undefined;
254
+ onMouseMove?: react.MouseEventHandler<HTMLElement> | undefined;
255
+ onMouseMoveCapture?: react.MouseEventHandler<HTMLElement> | undefined;
256
+ onMouseOut?: react.MouseEventHandler<HTMLElement> | undefined;
257
+ onMouseOutCapture?: react.MouseEventHandler<HTMLElement> | undefined;
258
+ onMouseOver?: react.MouseEventHandler<HTMLElement> | undefined;
259
+ onMouseOverCapture?: react.MouseEventHandler<HTMLElement> | undefined;
260
+ onMouseUp?: react.MouseEventHandler<HTMLElement> | undefined;
261
+ onMouseUpCapture?: react.MouseEventHandler<HTMLElement> | undefined;
262
+ onSelect?: react.ReactEventHandler<HTMLElement> | undefined;
263
+ onSelectCapture?: react.ReactEventHandler<HTMLElement> | undefined;
264
+ onTouchCancel?: react.TouchEventHandler<HTMLElement> | undefined;
265
+ onTouchCancelCapture?: react.TouchEventHandler<HTMLElement> | undefined;
266
+ onTouchEnd?: react.TouchEventHandler<HTMLElement> | undefined;
267
+ onTouchEndCapture?: react.TouchEventHandler<HTMLElement> | undefined;
268
+ onTouchMove?: react.TouchEventHandler<HTMLElement> | undefined;
269
+ onTouchMoveCapture?: react.TouchEventHandler<HTMLElement> | undefined;
270
+ onTouchStart?: react.TouchEventHandler<HTMLElement> | undefined;
271
+ onTouchStartCapture?: react.TouchEventHandler<HTMLElement> | undefined;
272
+ onPointerDown?: react.PointerEventHandler<HTMLElement> | undefined;
273
+ onPointerDownCapture?: react.PointerEventHandler<HTMLElement> | undefined;
274
+ onPointerMove?: react.PointerEventHandler<HTMLElement> | undefined;
275
+ onPointerMoveCapture?: react.PointerEventHandler<HTMLElement> | undefined;
276
+ onPointerUp?: react.PointerEventHandler<HTMLElement> | undefined;
277
+ onPointerUpCapture?: react.PointerEventHandler<HTMLElement> | undefined;
278
+ onPointerCancel?: react.PointerEventHandler<HTMLElement> | undefined;
279
+ onPointerCancelCapture?: react.PointerEventHandler<HTMLElement> | undefined;
280
+ onPointerEnter?: react.PointerEventHandler<HTMLElement> | undefined;
281
+ onPointerLeave?: react.PointerEventHandler<HTMLElement> | undefined;
282
+ onPointerOver?: react.PointerEventHandler<HTMLElement> | undefined;
283
+ onPointerOverCapture?: react.PointerEventHandler<HTMLElement> | undefined;
284
+ onPointerOut?: react.PointerEventHandler<HTMLElement> | undefined;
285
+ onPointerOutCapture?: react.PointerEventHandler<HTMLElement> | undefined;
286
+ onGotPointerCapture?: react.PointerEventHandler<HTMLElement> | undefined;
287
+ onGotPointerCaptureCapture?: react.PointerEventHandler<HTMLElement> | undefined;
288
+ onLostPointerCapture?: react.PointerEventHandler<HTMLElement> | undefined;
289
+ onLostPointerCaptureCapture?: react.PointerEventHandler<HTMLElement> | undefined;
290
+ onScroll?: react.UIEventHandler<HTMLElement> | undefined;
291
+ onScrollCapture?: react.UIEventHandler<HTMLElement> | undefined;
292
+ onWheel?: react.WheelEventHandler<HTMLElement> | undefined;
293
+ onWheelCapture?: react.WheelEventHandler<HTMLElement> | undefined;
294
+ onAnimationStart?: react.AnimationEventHandler<HTMLElement> | undefined;
295
+ onAnimationStartCapture?: react.AnimationEventHandler<HTMLElement> | undefined;
296
+ onAnimationEnd?: react.AnimationEventHandler<HTMLElement> | undefined;
297
+ onAnimationEndCapture?: react.AnimationEventHandler<HTMLElement> | undefined;
298
+ onAnimationIteration?: react.AnimationEventHandler<HTMLElement> | undefined;
299
+ onAnimationIterationCapture?: react.AnimationEventHandler<HTMLElement> | undefined;
300
+ onTransitionEndCapture?: react.TransitionEventHandler<HTMLElement> | undefined;
301
+ }, HTMLElement>;
302
+
303
+ export { MotionList, type MotionListProps };
@@ -0,0 +1,175 @@
1
+ "use client";
2
+ import { Children, cloneElement, createElement, isValidElement, useEffect, useLayoutEffect, useRef, useState } from "react";
3
+ import { cx } from "../cx.js";
4
+ import { prefersReducedMotion } from "../hooks/useReducedMotion.js";
5
+ const useIsomorphicLayoutEffect = typeof document !== "undefined" ? useLayoutEffect : useEffect;
6
+ const EXIT_FALLBACK_MS = 1e3;
7
+ const FOCUSABLE = 'a[href], button:not(:disabled), input:not(:disabled), select:not(:disabled), textarea:not(:disabled), [tabindex]:not([tabindex="-1"])';
8
+ function MotionList({ items, getKey, renderItem, as = "ul", className, ...props }) {
9
+ const containerRef = useRef(null);
10
+ const [state, setState] = useState(() => ({
11
+ items,
12
+ entries: items.map((item) => ({ key: getKey(item), item, exiting: false })),
13
+ exiting: /* @__PURE__ */ new Map()
14
+ }));
15
+ let { entries } = state;
16
+ if (state.items !== items && !sameItems(state.items, items)) {
17
+ const now = new Set(items.map(getKey));
18
+ const exitingNow = new Map(state.exiting);
19
+ for (const e of state.entries) if (!e.exiting && !now.has(e.key)) exitingNow.set(e.key, e.item);
20
+ for (const key of now) exitingNow.delete(key);
21
+ entries = merge(items, getKey, state.entries, exitingNow);
22
+ setState({ items, entries, exiting: exitingNow });
23
+ }
24
+ const previous = useRef(null);
25
+ const drop = (keys) => setState((current) => {
26
+ const gone = keys.filter((key) => current.exiting.has(key));
27
+ if (!gone.length) return current;
28
+ const exitingNow = new Map(current.exiting);
29
+ for (const key of gone) exitingNow.delete(key);
30
+ const goneSet = new Set(gone);
31
+ return { ...current, exiting: exitingNow, entries: current.entries.filter((e) => !(e.exiting && goneSet.has(e.key))) };
32
+ });
33
+ const boxes = useRef(/* @__PURE__ */ new Map());
34
+ const focusedKey = useRef(null);
35
+ const measuredFor = useRef(null);
36
+ if (measuredFor.current !== entries && containerRef.current) {
37
+ measuredFor.current = entries;
38
+ boxes.current = measure(containerRef.current);
39
+ let holder = typeof document !== "undefined" ? document.activeElement : null;
40
+ while (holder && holder.parentElement !== containerRef.current) holder = holder.parentElement;
41
+ focusedKey.current = holder?.getAttribute("data-uix-key") ?? null;
42
+ }
43
+ useIsomorphicLayoutEffect(() => {
44
+ const container = containerRef.current;
45
+ const before = previous.current;
46
+ previous.current = entries;
47
+ if (!container) return;
48
+ const byKey = new Map(entries.map((e) => [String(e.key), e]));
49
+ const elements = Array.from(container.querySelectorAll(":scope > [data-uix-key]"));
50
+ for (const el of elements) if (byKey.get(el.getAttribute("data-uix-key"))?.exiting) el.setAttribute("inert", "");
51
+ const had = focusedKey.current;
52
+ focusedKey.current = null;
53
+ const active = document.activeElement;
54
+ const lost = active === document.body || active === null || !active.isConnected || !!active.closest("[data-uix-exiting], [inert]");
55
+ if (had !== null && lost) {
56
+ const index = elements.findIndex((el) => el.getAttribute("data-uix-key") === had);
57
+ const stays = (el) => el && !el.hasAttribute("data-uix-exiting");
58
+ const own = stays(elements[index]) ? elements[index] : void 0;
59
+ const target = own ?? elements.slice(index + 1).find(stays) ?? elements.slice(0, Math.max(index, 0)).reverse().find(stays);
60
+ const focusable = target?.matches(FOCUSABLE) ? target : target?.querySelector(FOCUSABLE);
61
+ focusable?.focus({ preventScroll: true });
62
+ }
63
+ if (!before) return;
64
+ const reduced = prefersReducedMotion();
65
+ const was = new Set(before.map((e) => String(e.key)));
66
+ const moves = [];
67
+ if (!reduced) {
68
+ for (const el of elements) el.removeAttribute("data-uix-moving");
69
+ const origin = container.getBoundingClientRect();
70
+ for (const el of elements) {
71
+ const key = el.getAttribute("data-uix-key");
72
+ const entry = byKey.get(key);
73
+ if (!entry || entry.exiting || !was.has(key)) continue;
74
+ const from = boxes.current.get(key);
75
+ if (!from) continue;
76
+ const r = el.getBoundingClientRect();
77
+ const dx = from.x - (r.left - origin.left);
78
+ const dy = from.y - (r.top - origin.top);
79
+ if (dx || dy) moves.push({ el, dx, dy });
80
+ }
81
+ for (const { el, dx, dy } of moves) el.style.transform = `translate(${dx}px, ${dy}px)`;
82
+ if (moves.length) void container.offsetWidth;
83
+ for (const { el } of moves) {
84
+ el.setAttribute("data-uix-moving", "");
85
+ el.style.transform = "";
86
+ }
87
+ }
88
+ for (const el of elements) {
89
+ const key = el.getAttribute("data-uix-key");
90
+ if (!was.has(key) && !byKey.get(key)?.exiting) replay(el, "data-uix-entering");
91
+ }
92
+ }, [entries]);
93
+ const deadlines = useRef(/* @__PURE__ */ new Map());
94
+ const exitingKeys = entries.filter((e) => e.exiting).map((e) => e.key);
95
+ const exitingSignature = exitingKeys.join("\n");
96
+ useEffect(() => {
97
+ const container = containerRef.current;
98
+ const now = Date.now();
99
+ for (const key of Array.from(deadlines.current.keys())) if (!exitingKeys.includes(key)) deadlines.current.delete(key);
100
+ for (const key of exitingKeys) if (!deadlines.current.has(key)) deadlines.current.set(key, now + EXIT_FALLBACK_MS);
101
+ if (!container || !exitingKeys.length) return void 0;
102
+ const onEnd = (event) => {
103
+ const el = event.target;
104
+ if (!el.hasAttribute("data-uix-exiting") || el.parentElement !== container) return;
105
+ const key = exitingKeys.find((k) => String(k) === el.getAttribute("data-uix-key"));
106
+ if (key !== void 0) drop([key]);
107
+ };
108
+ container.addEventListener("animationend", onEnd);
109
+ const next = Math.min(...deadlines.current.values());
110
+ const timer = setTimeout(() => {
111
+ const due = Date.now();
112
+ drop([...deadlines.current].filter(([, at]) => at <= due).map(([key]) => key));
113
+ }, Math.max(0, next - now));
114
+ return () => {
115
+ container.removeEventListener("animationend", onEnd);
116
+ clearTimeout(timer);
117
+ };
118
+ }, [exitingSignature]);
119
+ const children = entries.map(({ key, item, exiting: leaving }) => {
120
+ const element = renderItem(item, { exiting: leaving });
121
+ if (!isValidElement(element)) return element;
122
+ const extra = { key, "data-uix-key": String(key) };
123
+ if (leaving) Object.assign(extra, { "data-uix-exiting": "", "aria-hidden": true });
124
+ return cloneElement(element, extra);
125
+ });
126
+ const onTransitionEnd = (event) => {
127
+ const el = event.target;
128
+ if (event.propertyName === "transform" && el.parentElement === containerRef.current) el.removeAttribute("data-uix-moving");
129
+ };
130
+ return createElement(as, { ...props, ref: containerRef, className: cx("uix-motion-list", className), onTransitionEnd }, Children.toArray(children));
131
+ }
132
+ function sameItems(a, b) {
133
+ if (a.length !== b.length) return false;
134
+ for (let i = 0; i < a.length; i += 1) if (a[i] !== b[i]) return false;
135
+ return true;
136
+ }
137
+ function merge(items, getKey, before, exiting) {
138
+ const list = items.map((item) => ({ key: getKey(item), item, exiting: false }));
139
+ before.forEach((e, i) => {
140
+ if (!exiting.has(e.key)) return;
141
+ let at = -1;
142
+ for (let j = i - 1; j >= 0 && at < 0; j -= 1) {
143
+ const k = before[j].key;
144
+ at = list.findIndex((x) => x.key === k);
145
+ }
146
+ list.splice(at + 1, 0, { key: e.key, item: exiting.get(e.key), exiting: true });
147
+ });
148
+ return list;
149
+ }
150
+ function measure(container) {
151
+ const map = /* @__PURE__ */ new Map();
152
+ const origin = container.getBoundingClientRect();
153
+ for (const el of Array.from(container.querySelectorAll(":scope > [data-uix-key]"))) {
154
+ if (el.hasAttribute("data-uix-exiting")) continue;
155
+ const r = el.getBoundingClientRect();
156
+ map.set(el.getAttribute("data-uix-key"), { x: r.left - origin.left, y: r.top - origin.top });
157
+ }
158
+ return map;
159
+ }
160
+ function replay(el, attribute) {
161
+ if (el.hasAttribute(attribute)) {
162
+ el.removeAttribute(attribute);
163
+ void el.offsetWidth;
164
+ }
165
+ el.setAttribute(attribute, "");
166
+ const done = (event) => {
167
+ if (event.target !== el) return;
168
+ el.removeAttribute(attribute);
169
+ el.removeEventListener("animationend", done);
170
+ };
171
+ el.addEventListener("animationend", done);
172
+ }
173
+ export {
174
+ MotionList
175
+ };
@@ -20,6 +20,11 @@ interface NavFavouritesLabels {
20
20
  readonly remove: string;
21
21
  /** Per-row overflow-trigger accessible-name template with `{label}`. Defaults to "{label} favourite options". */
22
22
  readonly options?: string;
23
+ /**
24
+ * Polite announcement after a move: `{label}`, `{position}`, `{count}`. Defaults to
25
+ * "{label} moved to position {position} of {count}" (it was English only before HAR-1375).
26
+ */
27
+ readonly moved?: string;
23
28
  }
24
29
  interface NavFavouritesProps {
25
30
  /** The already-resolved favourites, in display order. */
@@ -2,6 +2,8 @@
2
2
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
3
  import { memo, useCallback, useEffect, useId, useMemo, useRef, useState } from "react";
4
4
  import { cx } from "../cx.js";
5
+ import { fillLabel } from "../fill-label.js";
6
+ import { placeId } from "../reorder.js";
5
7
  const ChevronDownIcon = () => /* @__PURE__ */ jsx(
6
8
  "svg",
7
9
  {
@@ -91,15 +93,13 @@ function NavFavourites({
91
93
  const idx = order.indexOf(id);
92
94
  const next = idx + dir;
93
95
  if (idx < 0 || next < 0 || next >= order.length) return;
94
- const reordered = [...order];
95
- const [it] = reordered.splice(idx, 1);
96
- if (it === void 0) return;
97
- reordered.splice(next, 0, it);
96
+ const reordered = placeId(order, id, next);
97
+ if (reordered === order) return;
98
98
  focusAfterRef.current = id;
99
99
  const moved = items.find((i) => i.id === id);
100
- if (moved) setAnnouncement(`${moved.label} moved to position ${next + 1} of ${order.length}`);
101
- onReorder(reordered);
102
- }, [onReorder, order]);
100
+ if (moved) setAnnouncement(fillLabel(labels.moved ?? "{label} moved to position {position} of {count}", { label: moved.label, position: next + 1, count: order.length }));
101
+ onReorder([...reordered]);
102
+ }, [onReorder, order, items, labels.moved]);
103
103
  const remove = useCallback((id) => {
104
104
  const idx = order.indexOf(id);
105
105
  const neighbour = order[idx + 1] ?? order[idx - 1] ?? null;
@@ -0,0 +1,33 @@
1
+ import * as react from 'react';
2
+ import { InputHTMLAttributes, AriaAttributes, CSSProperties } from 'react';
3
+
4
+ interface OtpInputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'value' | 'defaultValue' | 'onChange' | 'type' | 'size' | 'maxLength' | 'pattern' | 'inputMode'> {
5
+ /** How many characters the code has. Default 6. */
6
+ length?: number;
7
+ /** Controlled value: the characters typed so far. */
8
+ value?: string;
9
+ defaultValue?: string;
10
+ /** Every change, with the cleaned code (only allowed characters, at most `length`). */
11
+ onValueChange?: (value: string) => void;
12
+ /** Called once each time the code reaches `length` characters. */
13
+ onComplete?: (code: string) => void;
14
+ /** `numeric` (default): digits, with the phone's number pad. `alphanumeric`: letters and digits, upper-cased. */
15
+ mode?: 'numeric' | 'alphanumeric';
16
+ /** Draw a gap after every n cells (3 → "123 456"). Visual only: the value has no separator. */
17
+ groupSize?: number;
18
+ invalid?: boolean;
19
+ 'aria-invalid'?: AriaAttributes['aria-invalid'];
20
+ className?: string;
21
+ style?: CSSProperties;
22
+ }
23
+ /**
24
+ * A one-time code (HAR-1376): ONE native input, so screen readers, the phone's code autofill
25
+ * (`autoComplete="one-time-code"`) and password managers see a single field, drawn as `length`
26
+ * cells. Pasting "123 456" or "123-456" keeps the characters; typing past the end is ignored;
27
+ * Backspace deletes the last one. `onComplete(code)` runs when the last character arrives. Put it in
28
+ * a `Field` for its label, hint and error (the cells turn red with `aria-invalid`). `name` submits
29
+ * the code. `ref` is the input.
30
+ */
31
+ declare const OtpInput: react.ForwardRefExoticComponent<OtpInputProps & react.RefAttributes<HTMLInputElement>>;
32
+
33
+ export { OtpInput, type OtpInputProps };