@astryxdesign/core 0.4.3 → 0.4.4-canary.0f4d45f

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 (200) hide show
  1. package/CHANGELOG.md +60 -0
  2. package/README.md +79 -45
  3. package/dist/Banner/Banner.d.ts +3 -0
  4. package/dist/Banner/Banner.d.ts.map +1 -1
  5. package/dist/Banner/Banner.js +13 -3
  6. package/dist/BottomSheet/BottomSheet.d.ts +66 -0
  7. package/dist/BottomSheet/BottomSheet.d.ts.map +1 -0
  8. package/dist/BottomSheet/BottomSheet.js +392 -0
  9. package/dist/BottomSheet/BottomSheetPanel.d.ts +60 -0
  10. package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -0
  11. package/dist/BottomSheet/BottomSheetPanel.js +398 -0
  12. package/dist/BottomSheet/BottomSheetSwitcher.d.ts +61 -0
  13. package/dist/BottomSheet/BottomSheetSwitcher.d.ts.map +1 -0
  14. package/dist/BottomSheet/BottomSheetSwitcher.js +410 -0
  15. package/dist/BottomSheet/BottomSheetSwitcherContext.d.ts +21 -0
  16. package/dist/BottomSheet/BottomSheetSwitcherContext.d.ts.map +1 -0
  17. package/dist/BottomSheet/BottomSheetSwitcherContext.js +13 -0
  18. package/dist/BottomSheet/index.d.ts +11 -0
  19. package/dist/BottomSheet/index.d.ts.map +1 -0
  20. package/dist/BottomSheet/index.js +12 -0
  21. package/dist/BottomSheet/snapOffsets.d.ts +72 -0
  22. package/dist/BottomSheet/snapOffsets.d.ts.map +1 -0
  23. package/dist/BottomSheet/snapOffsets.js +130 -0
  24. package/dist/BottomSheet/useMobileKeyboard.d.ts +35 -0
  25. package/dist/BottomSheet/useMobileKeyboard.d.ts.map +1 -0
  26. package/dist/BottomSheet/useMobileKeyboard.js +373 -0
  27. package/dist/BottomSheet/useSheetGestures.d.ts +180 -0
  28. package/dist/BottomSheet/useSheetGestures.d.ts.map +1 -0
  29. package/dist/BottomSheet/useSheetGestures.js +989 -0
  30. package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
  31. package/dist/Chat/ChatComposerInput.js +3 -4
  32. package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
  33. package/dist/ComplexSelector/ComplexSelector.js +12 -6
  34. package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
  35. package/dist/ContextMenu/ContextMenu.js +4 -2
  36. package/dist/DateInput/DateInput.d.ts.map +1 -1
  37. package/dist/DateInput/DateInput.js +9 -1
  38. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  39. package/dist/DateTimeInput/DateTimeInput.js +31 -1
  40. package/dist/Dialog/Dialog.d.ts.map +1 -1
  41. package/dist/Dialog/Dialog.js +2 -1
  42. package/dist/Field/InputClearButton.d.ts +2 -1
  43. package/dist/Field/InputClearButton.d.ts.map +1 -1
  44. package/dist/Field/InputClearButton.js +6 -1
  45. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  46. package/dist/Lightbox/Lightbox.js +9 -3
  47. package/dist/MobileNav/MobileNav.d.ts +12 -0
  48. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  49. package/dist/MobileNav/MobileNav.js +102 -30
  50. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  51. package/dist/MultiSelector/MultiSelector.js +21 -7
  52. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  53. package/dist/NumberInput/NumberInput.js +9 -1
  54. package/dist/PowerSearch/PowerSearchEditPopover.js +1 -1
  55. package/dist/Selector/Selector.d.ts.map +1 -1
  56. package/dist/Selector/Selector.js +14 -3
  57. package/dist/StatusDot/StatusDot.d.ts +43 -3
  58. package/dist/StatusDot/StatusDot.d.ts.map +1 -1
  59. package/dist/StatusDot/StatusDot.js +42 -5
  60. package/dist/Switch/Switch.d.ts.map +1 -1
  61. package/dist/Switch/Switch.js +5 -1
  62. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
  63. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +7 -2
  64. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  65. package/dist/TimeInput/TimeInput.js +8 -1
  66. package/dist/Tokenizer/Tokenizer.js +11 -5
  67. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  68. package/dist/Tooltip/useTooltip.js +4 -1
  69. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  70. package/dist/Typeahead/BaseTypeahead.js +5 -3
  71. package/dist/Typeahead/Typeahead.d.ts.map +1 -1
  72. package/dist/Typeahead/Typeahead.js +10 -1
  73. package/dist/astryx.css +21 -0
  74. package/dist/hooks/index.d.ts +8 -1
  75. package/dist/hooks/index.d.ts.map +1 -1
  76. package/dist/hooks/index.js +8 -1
  77. package/dist/hooks/useFocusTrap.d.ts +0 -11
  78. package/dist/hooks/useFocusTrap.d.ts.map +1 -1
  79. package/dist/hooks/useFocusTrap.js +1 -11
  80. package/dist/hooks/useInputStatusIcon.d.ts.map +1 -1
  81. package/dist/hooks/useInputStatusIcon.js +1 -0
  82. package/dist/index.d.ts +1 -0
  83. package/dist/index.d.ts.map +1 -1
  84. package/dist/index.js +1 -0
  85. package/dist/theme/defineTheme.d.ts +22 -4
  86. package/dist/theme/defineTheme.d.ts.map +1 -1
  87. package/dist/theme/expandColorScale.d.ts +17 -2
  88. package/dist/theme/expandColorScale.d.ts.map +1 -1
  89. package/dist/theme/expandColorScale.js +63 -33
  90. package/dist/utils/ime.d.ts +5 -0
  91. package/dist/utils/ime.d.ts.map +1 -0
  92. package/dist/utils/ime.js +63 -0
  93. package/dist/utils/index.d.ts +1 -0
  94. package/dist/utils/index.d.ts.map +1 -1
  95. package/dist/utils/index.js +2 -1
  96. package/locales/af-ZA.json +958 -0
  97. package/locales/ar-SA.json +998 -0
  98. package/locales/ca-ES.json +974 -0
  99. package/locales/cs-CZ.json +990 -0
  100. package/locales/da-DK.json +966 -0
  101. package/locales/de-DE.json +966 -0
  102. package/locales/el-GR.json +990 -0
  103. package/locales/en.json +48 -0
  104. package/locales/es-ES.json +978 -0
  105. package/locales/fi-FI.json +990 -0
  106. package/locales/fr-FR.json +928 -0
  107. package/locales/he-IL.json +990 -0
  108. package/locales/hu-HU.json +990 -0
  109. package/locales/it-IT.json +978 -0
  110. package/locales/ja-JP.json +998 -0
  111. package/locales/ko-KR.json +990 -0
  112. package/locales/nl-NL.json +954 -0
  113. package/locales/no-NO.json +978 -0
  114. package/locales/pl-PL.json +982 -0
  115. package/locales/pseudo.json +36 -0
  116. package/locales/pt-BR.json +982 -0
  117. package/locales/pt-PT.json +982 -0
  118. package/locales/ro-RO.json +982 -0
  119. package/locales/ru-RU.json +990 -0
  120. package/locales/sr-SP.json +990 -0
  121. package/locales/sv-SE.json +986 -0
  122. package/locales/tr-TR.json +990 -0
  123. package/locales/uk-UA.json +990 -0
  124. package/locales/vi-VN.json +986 -0
  125. package/locales/zh-CN.json +998 -0
  126. package/locales/zh-TW.json +998 -0
  127. package/package.json +9 -8
  128. package/src/Banner/Banner.doc.mjs +3 -3
  129. package/src/Banner/Banner.test.tsx +40 -0
  130. package/src/Banner/Banner.tsx +27 -2
  131. package/src/BottomSheet/BottomSheet.doc.mjs +266 -0
  132. package/src/BottomSheet/BottomSheet.test.tsx +2114 -0
  133. package/src/BottomSheet/BottomSheet.tsx +545 -0
  134. package/src/BottomSheet/BottomSheetPanel.test.tsx +240 -0
  135. package/src/BottomSheet/BottomSheetPanel.tsx +547 -0
  136. package/src/BottomSheet/BottomSheetSwitcher.doc.mjs +219 -0
  137. package/src/BottomSheet/BottomSheetSwitcher.test.tsx +850 -0
  138. package/src/BottomSheet/BottomSheetSwitcher.tsx +628 -0
  139. package/src/BottomSheet/BottomSheetSwitcherContext.ts +51 -0
  140. package/src/BottomSheet/index.ts +15 -0
  141. package/src/BottomSheet/snapOffsets.test.ts +187 -0
  142. package/src/BottomSheet/snapOffsets.ts +159 -0
  143. package/src/BottomSheet/useMobileKeyboard.ts +499 -0
  144. package/src/BottomSheet/useSheetGestures.test.ts +1059 -0
  145. package/src/BottomSheet/useSheetGestures.ts +1459 -0
  146. package/src/Chat/ChatComposerInput.tsx +3 -4
  147. package/src/ComplexSelector/ComplexSelector.tsx +12 -5
  148. package/src/ContextMenu/ContextMenu.tsx +4 -2
  149. package/src/DateInput/DateInput.test.tsx +21 -0
  150. package/src/DateInput/DateInput.tsx +9 -1
  151. package/src/DateTimeInput/DateTimeInput.doc.mjs +4 -0
  152. package/src/DateTimeInput/DateTimeInput.test.tsx +137 -0
  153. package/src/DateTimeInput/DateTimeInput.tsx +39 -2
  154. package/src/Dialog/Dialog.tsx +2 -1
  155. package/src/Field/Field.doc.mjs +1 -0
  156. package/src/Field/InputClearButton.test.tsx +25 -0
  157. package/src/Field/InputClearButton.tsx +4 -1
  158. package/src/FileInput/FileInput.test.tsx +53 -9
  159. package/src/Lightbox/Lightbox.test.tsx +49 -28
  160. package/src/Lightbox/Lightbox.tsx +7 -3
  161. package/src/MobileNav/MobileNav.tsx +128 -37
  162. package/src/MobileNav/MobileNavCloseEdgeCases.test.tsx +426 -0
  163. package/src/MobileNav/MobileNavCloseTiming.test.ts +58 -0
  164. package/src/MobileNav/MobileNavCloseVisibility.test.tsx +172 -0
  165. package/src/MultiSelector/MultiSelector.test.tsx +195 -51
  166. package/src/MultiSelector/MultiSelector.tsx +22 -8
  167. package/src/NumberInput/NumberInput.test.tsx +18 -0
  168. package/src/NumberInput/NumberInput.tsx +9 -1
  169. package/src/PowerSearch/PowerSearchEditPopover.tsx +1 -1
  170. package/src/Selector/Selector.test.tsx +85 -26
  171. package/src/Selector/Selector.tsx +13 -4
  172. package/src/StatusDot/StatusDot.doc.mjs +13 -0
  173. package/src/StatusDot/StatusDot.test.tsx +115 -8
  174. package/src/StatusDot/StatusDot.tsx +74 -9
  175. package/src/Switch/Switch.test.tsx +16 -0
  176. package/src/Switch/Switch.tsx +7 -0
  177. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +20 -2
  178. package/src/TimeInput/TimeInput.test.tsx +23 -0
  179. package/src/TimeInput/TimeInput.tsx +8 -0
  180. package/src/Tokenizer/Tokenizer.test.tsx +50 -32
  181. package/src/Tokenizer/Tokenizer.tsx +5 -5
  182. package/src/Tooltip/useTooltip.tsx +4 -1
  183. package/src/Typeahead/BaseTypeahead.tsx +10 -3
  184. package/src/Typeahead/Typeahead.test.tsx +116 -7
  185. package/src/Typeahead/Typeahead.tsx +10 -1
  186. package/src/__tests__/stubMatchMedia.test.ts +79 -0
  187. package/src/__tests__/stubMatchMedia.ts +95 -0
  188. package/src/hooks/index.ts +9 -5
  189. package/src/hooks/useFocusTrap.ts +1 -14
  190. package/src/hooks/useInputStatusIcon.test.tsx +19 -0
  191. package/src/hooks/useInputStatusIcon.tsx +7 -0
  192. package/src/index.ts +1 -0
  193. package/src/theme/defineTheme.ts +22 -4
  194. package/src/theme/expandColorScale.test.ts +138 -0
  195. package/src/theme/expandColorScale.ts +89 -44
  196. package/src/utils/ime.test.ts +32 -0
  197. package/src/utils/ime.ts +69 -0
  198. package/src/utils/index.ts +2 -0
  199. package/dist/astryx.umd.js +0 -147
  200. package/dist/astryx.umd.js.map +0 -7
@@ -0,0 +1,219 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+ /** @type {import('@astryxdesign/cli/authoring').ComponentDoc} */
3
+
4
+ export const docs = {
5
+ name: 'BottomSheetSwitcher',
6
+ displayName: 'Bottom Sheet Switcher',
7
+ group: 'BottomSheet',
8
+ category: 'Overlay',
9
+ keywords: ['bottom sheet', 'switcher', 'multi-step', 'flow', 'wizard'],
10
+ playground: {
11
+ overlay: true,
12
+ overlayControl: {
13
+ stateProp: 'activeSheet',
14
+ openValue: 'details',
15
+ },
16
+ defaults: {
17
+ activeSheet: null,
18
+ children: [
19
+ {
20
+ __element: 'BottomSheet',
21
+ props: {
22
+ sheetId: 'details',
23
+ label: 'Setup details',
24
+ height: 'hug',
25
+ },
26
+ children: {
27
+ __element: 'Section',
28
+ props: {padding: 4},
29
+ children: {
30
+ __element: 'VStack',
31
+ props: {gap: 2},
32
+ children: [
33
+ {
34
+ __element: 'Heading',
35
+ props: {level: 3},
36
+ children: 'Setup details',
37
+ },
38
+ {
39
+ __element: 'Text',
40
+ props: {type: 'body'},
41
+ children: 'Add the essential information for this setup.',
42
+ },
43
+ {
44
+ __element: 'Text',
45
+ props: {type: 'supporting'},
46
+ children: 'You can review these details before saving.',
47
+ },
48
+ ],
49
+ },
50
+ },
51
+ },
52
+ {
53
+ __element: 'BottomSheet',
54
+ props: {
55
+ sheetId: 'preferences',
56
+ label: 'Choose preferences',
57
+ height: 'hug',
58
+ },
59
+ children: {
60
+ __element: 'Section',
61
+ props: {padding: 4},
62
+ children: {
63
+ __element: 'VStack',
64
+ props: {gap: 2},
65
+ children: [
66
+ {
67
+ __element: 'Heading',
68
+ props: {level: 3},
69
+ children: 'Choose preferences',
70
+ },
71
+ {
72
+ __element: 'Text',
73
+ props: {type: 'body'},
74
+ children: 'Select how this setup should behave.',
75
+ },
76
+ {
77
+ __element: 'Text',
78
+ props: {type: 'supporting'},
79
+ children:
80
+ 'Notifications can be sent immediately, daily, or weekly.',
81
+ },
82
+ {
83
+ __element: 'Text',
84
+ props: {type: 'supporting'},
85
+ children: 'You can update these preferences later.',
86
+ },
87
+ ],
88
+ },
89
+ },
90
+ },
91
+ {
92
+ __element: 'BottomSheet',
93
+ props: {
94
+ sheetId: 'confirm',
95
+ label: 'Confirm setup',
96
+ height: 'hug',
97
+ },
98
+ children: {
99
+ __element: 'Section',
100
+ props: {padding: 4},
101
+ children: {
102
+ __element: 'VStack',
103
+ props: {gap: 2},
104
+ children: [
105
+ {
106
+ __element: 'Heading',
107
+ props: {level: 3},
108
+ children: 'Confirm setup',
109
+ },
110
+ {
111
+ __element: 'Text',
112
+ props: {type: 'body'},
113
+ children: 'Everything is ready to save.',
114
+ },
115
+ ],
116
+ },
117
+ },
118
+ },
119
+ ],
120
+ },
121
+ },
122
+ description:
123
+ 'Coordinates multiple BottomSheets as a mutually exclusive flow. One activeSheet ID selects the only interactive sheet; during a handoff, the new sheet enters above the inert previous sheet. If the new sheet is shorter, the previous sheet simultaneously moves down until their top edges align, then fades after both transforms complete. The switcher owns one shared native <dialog>: modal flows call showModal() once for one top-layer boundary and one ::backdrop across the whole flow, while no-scrim flows use a non-modal show() shell. Its ref and shared DOM props target that dialog.',
124
+ props: [
125
+ {
126
+ name: 'activeSheet',
127
+ type: 'string | null',
128
+ description:
129
+ "ID of the interactive BottomSheet, or null when the flow should close. Match a nested BottomSheet's unique sheetId; the previous sheet may remain visually present and inert while the new sheet enters, simultaneously align downward behind a shorter step, then fade away.",
130
+ required: true,
131
+ },
132
+ {
133
+ name: 'onActiveSheetChange',
134
+ type: '(activeSheet: string | null) => void',
135
+ description:
136
+ "Called with null when the active sheet dismisses according to its purpose. Child BottomSheets may use purpose='form' or purpose='required' to limit implicit dismissal while flow controls can still use the same state setter to switch sheets or close the flow.",
137
+ required: true,
138
+ },
139
+ {
140
+ name: 'hasScrim',
141
+ type: 'boolean',
142
+ description:
143
+ "Whether the shared dialog is modal. true uses showModal() once for one native ::backdrop, focus trap, scroll lock, and click-to-dismiss when the active BottomSheet has purpose='info'. false uses show() with no backdrop and leaves the page interactive; avoid transformed, contained, or clipping ancestors because the non-modal dialog remains in its containing context.",
144
+ default: 'true',
145
+ },
146
+ {
147
+ name: 'children',
148
+ type: 'ReactNode',
149
+ description: 'BottomSheets identified by unique sheetId values.',
150
+ required: true,
151
+ },
152
+ ],
153
+ usage: {
154
+ description:
155
+ "Coordinates a multi-step bottom-sheet flow in one shared dialog; set activeSheet to a nested BottomSheet's sheetId to open or switch steps, and to null to close.",
156
+ bestPractices: [
157
+ {
158
+ guidance: true,
159
+ description:
160
+ 'Use when each step depends on the previous one and only one step needs attention at a time.',
161
+ },
162
+ {
163
+ guidance: false,
164
+ description:
165
+ "Don't split information across sheets when people need to compare it; use a full-page layout that keeps the relevant content visible together instead.",
166
+ },
167
+ ],
168
+ },
169
+ examples: [
170
+ {
171
+ label: 'Three-step flow',
172
+ code: `const [activeSheet, setActiveSheet] = useState(null);
173
+
174
+ <>
175
+ <Button label="Start" onClick={() => setActiveSheet('details')} />
176
+ <BottomSheetSwitcher
177
+ activeSheet={activeSheet}
178
+ onActiveSheetChange={setActiveSheet}>
179
+ <BottomSheet sheetId="details" label="Details" height="hug">
180
+ <SetupDetails />
181
+ <Button label="Continue" onClick={() => setActiveSheet('preferences')} />
182
+ </BottomSheet>
183
+ <BottomSheet sheetId="preferences" label="Preferences" height="hug">
184
+ <Preferences />
185
+ <Button label="Back" onClick={() => setActiveSheet('details')} />
186
+ <Button label="Continue" onClick={() => setActiveSheet('confirm')} />
187
+ </BottomSheet>
188
+ <BottomSheet sheetId="confirm" label="Confirm" height="hug">
189
+ <Confirmation />
190
+ <Button label="Back" onClick={() => setActiveSheet('preferences')} />
191
+ <Button label="Done" onClick={() => setActiveSheet(null)} />
192
+ </BottomSheet>
193
+ </BottomSheetSwitcher>
194
+ </>`,
195
+ },
196
+ ],
197
+ };
198
+
199
+ /** @type {import('@astryxdesign/cli/authoring').ComponentTranslationDoc} */
200
+ export const docsDense = {
201
+ description:
202
+ 'controller with one shared native dialog for mutually exclusive multi-step BottomSheets',
203
+ usage: {
204
+ description:
205
+ "Coordinates a multi-step bottom-sheet flow in one shared dialog; set activeSheet to a nested BottomSheet's sheetId to open or switch steps, and to null to close.",
206
+ bestPractices: [
207
+ {
208
+ guidance: true,
209
+ description:
210
+ 'Use when each step depends on the previous one and only one step needs attention at a time.',
211
+ },
212
+ {
213
+ guidance: false,
214
+ description:
215
+ "Don't split information across sheets when people need to compare it; use a full-page layout that keeps the relevant content visible together instead.",
216
+ },
217
+ ],
218
+ },
219
+ };