sherick-ui 2.9.0 → 2.10.1

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 (284) hide show
  1. package/README.md +32 -0
  2. package/dist/cjs/components/Accordion.cjs +14 -26
  3. package/dist/cjs/components/Accordion.cjs.map +1 -1
  4. package/dist/cjs/components/Alert.cjs +60 -19
  5. package/dist/cjs/components/Alert.cjs.map +1 -1
  6. package/dist/cjs/components/AlertDialog.cjs +5 -3
  7. package/dist/cjs/components/AlertDialog.cjs.map +1 -1
  8. package/dist/cjs/components/Avatar.cjs +12 -3
  9. package/dist/cjs/components/Avatar.cjs.map +1 -1
  10. package/dist/cjs/components/Badge.cjs +5 -3
  11. package/dist/cjs/components/Badge.cjs.map +1 -1
  12. package/dist/cjs/components/Breadcrumb.cjs +8 -4
  13. package/dist/cjs/components/Breadcrumb.cjs.map +1 -1
  14. package/dist/cjs/components/Button.cjs +11 -4
  15. package/dist/cjs/components/Button.cjs.map +1 -1
  16. package/dist/cjs/components/Calendar.cjs +39 -4
  17. package/dist/cjs/components/Calendar.cjs.map +1 -1
  18. package/dist/cjs/components/Card.cjs +10 -6
  19. package/dist/cjs/components/Card.cjs.map +1 -1
  20. package/dist/cjs/components/Checkbox.cjs +15 -3
  21. package/dist/cjs/components/Checkbox.cjs.map +1 -1
  22. package/dist/cjs/components/CheckboxGroup.cjs +3 -2
  23. package/dist/cjs/components/CheckboxGroup.cjs.map +1 -1
  24. package/dist/cjs/components/Chip.cjs +53 -43
  25. package/dist/cjs/components/Chip.cjs.map +1 -1
  26. package/dist/cjs/components/ChipGroup.cjs +17 -0
  27. package/dist/cjs/components/ChipGroup.cjs.map +1 -1
  28. package/dist/cjs/components/Collapsible.cjs +1 -1
  29. package/dist/cjs/components/Collapsible.cjs.map +1 -1
  30. package/dist/cjs/components/Combobox.cjs +58 -14
  31. package/dist/cjs/components/Combobox.cjs.map +1 -1
  32. package/dist/cjs/components/Command.cjs +10 -4
  33. package/dist/cjs/components/Command.cjs.map +1 -1
  34. package/dist/cjs/components/CommandPalette.cjs +5 -2
  35. package/dist/cjs/components/CommandPalette.cjs.map +1 -1
  36. package/dist/cjs/components/DatePicker.cjs +6 -3
  37. package/dist/cjs/components/DatePicker.cjs.map +1 -1
  38. package/dist/cjs/components/DateRangePicker.cjs +3 -2
  39. package/dist/cjs/components/DateRangePicker.cjs.map +1 -1
  40. package/dist/cjs/components/DateTimePicker.cjs +1 -1
  41. package/dist/cjs/components/DateTimePicker.cjs.map +1 -1
  42. package/dist/cjs/components/Dialog.cjs +10 -3
  43. package/dist/cjs/components/Dialog.cjs.map +1 -1
  44. package/dist/cjs/components/DialogContent.cjs +5 -3
  45. package/dist/cjs/components/DialogContent.cjs.map +1 -1
  46. package/dist/cjs/components/DialogDescription.cjs +5 -3
  47. package/dist/cjs/components/DialogDescription.cjs.map +1 -1
  48. package/dist/cjs/components/DialogFooter.cjs +3 -3
  49. package/dist/cjs/components/DialogFooter.cjs.map +1 -1
  50. package/dist/cjs/components/DialogHeader.cjs +5 -3
  51. package/dist/cjs/components/DialogHeader.cjs.map +1 -1
  52. package/dist/cjs/components/DialogSurface.cjs +37 -15
  53. package/dist/cjs/components/DialogSurface.cjs.map +1 -1
  54. package/dist/cjs/components/DismissButton.cjs +24 -0
  55. package/dist/cjs/components/DismissButton.cjs.map +1 -0
  56. package/dist/cjs/components/Divider.cjs +3 -1
  57. package/dist/cjs/components/Divider.cjs.map +1 -1
  58. package/dist/cjs/components/Drawer.cjs +24 -14
  59. package/dist/cjs/components/Drawer.cjs.map +1 -1
  60. package/dist/cjs/components/Field.cjs +47 -2
  61. package/dist/cjs/components/Field.cjs.map +1 -1
  62. package/dist/cjs/components/FieldLabel.cjs +20 -0
  63. package/dist/cjs/components/FieldLabel.cjs.map +1 -0
  64. package/dist/cjs/components/FileUpload.cjs +19 -9
  65. package/dist/cjs/components/FileUpload.cjs.map +1 -1
  66. package/dist/cjs/components/IconButton.cjs +28 -7
  67. package/dist/cjs/components/IconButton.cjs.map +1 -1
  68. package/dist/cjs/components/Input.cjs +14 -5
  69. package/dist/cjs/components/Input.cjs.map +1 -1
  70. package/dist/cjs/components/Menu.cjs +18 -4
  71. package/dist/cjs/components/Menu.cjs.map +1 -1
  72. package/dist/cjs/components/NavGroup.cjs +7 -1
  73. package/dist/cjs/components/NavGroup.cjs.map +1 -1
  74. package/dist/cjs/components/NavItem.cjs +28 -3
  75. package/dist/cjs/components/NavItem.cjs.map +1 -1
  76. package/dist/cjs/components/NumberField.cjs +7 -6
  77. package/dist/cjs/components/NumberField.cjs.map +1 -1
  78. package/dist/cjs/components/Pagination.cjs +42 -8
  79. package/dist/cjs/components/Pagination.cjs.map +1 -1
  80. package/dist/cjs/components/Popover.cjs +13 -5
  81. package/dist/cjs/components/Popover.cjs.map +1 -1
  82. package/dist/cjs/components/Progress.cjs +5 -3
  83. package/dist/cjs/components/Progress.cjs.map +1 -1
  84. package/dist/cjs/components/RadioGroup.cjs +3 -2
  85. package/dist/cjs/components/RadioGroup.cjs.map +1 -1
  86. package/dist/cjs/components/Search.cjs +35 -14
  87. package/dist/cjs/components/Search.cjs.map +1 -1
  88. package/dist/cjs/components/SegmentedControl.cjs +2 -1
  89. package/dist/cjs/components/SegmentedControl.cjs.map +1 -1
  90. package/dist/cjs/components/Select.cjs +14 -4
  91. package/dist/cjs/components/Select.cjs.map +1 -1
  92. package/dist/cjs/components/Skeleton.cjs +5 -3
  93. package/dist/cjs/components/Skeleton.cjs.map +1 -1
  94. package/dist/cjs/components/Slider.cjs +1 -1
  95. package/dist/cjs/components/Slider.cjs.map +1 -1
  96. package/dist/cjs/components/Spinner.cjs +24 -14
  97. package/dist/cjs/components/Spinner.cjs.map +1 -1
  98. package/dist/cjs/components/StatusMark.cjs +43 -0
  99. package/dist/cjs/components/StatusMark.cjs.map +1 -0
  100. package/dist/cjs/components/Stepper.cjs +3 -3
  101. package/dist/cjs/components/Stepper.cjs.map +1 -1
  102. package/dist/cjs/components/Switch.cjs +20 -1
  103. package/dist/cjs/components/Switch.cjs.map +1 -1
  104. package/dist/cjs/components/Table.cjs +15 -7
  105. package/dist/cjs/components/Table.cjs.map +1 -1
  106. package/dist/cjs/components/Tabs.cjs +10 -3
  107. package/dist/cjs/components/Tabs.cjs.map +1 -1
  108. package/dist/cjs/components/Textarea.cjs +8 -4
  109. package/dist/cjs/components/Textarea.cjs.map +1 -1
  110. package/dist/cjs/components/Toast.cjs +47 -34
  111. package/dist/cjs/components/Toast.cjs.map +1 -1
  112. package/dist/cjs/components/ToggleGroup.cjs +14 -3
  113. package/dist/cjs/components/ToggleGroup.cjs.map +1 -1
  114. package/dist/cjs/components/Tooltip.cjs +16 -2
  115. package/dist/cjs/components/Tooltip.cjs.map +1 -1
  116. package/dist/cjs/components/TreeView.cjs +8 -4
  117. package/dist/cjs/components/TreeView.cjs.map +1 -1
  118. package/dist/cjs/components/choice-row.cjs +1 -1
  119. package/dist/cjs/components/choice-row.cjs.map +1 -1
  120. package/dist/cjs/components/date-family.cjs +16 -2
  121. package/dist/cjs/components/date-family.cjs.map +1 -1
  122. package/dist/cjs/components/date-field.cjs +4 -2
  123. package/dist/cjs/components/date-field.cjs.map +1 -1
  124. package/dist/cjs/components/edge-fade.cjs +80 -0
  125. package/dist/cjs/components/edge-fade.cjs.map +1 -0
  126. package/dist/cjs/components/scroll-region.cjs +56 -0
  127. package/dist/cjs/components/scroll-region.cjs.map +1 -0
  128. package/dist/cjs/components/time-panel.cjs +1 -1
  129. package/dist/cjs/components/time-panel.cjs.map +1 -1
  130. package/dist/cjs/components/ui.common.cjs +115 -58
  131. package/dist/cjs/components/ui.common.cjs.map +1 -1
  132. package/dist/cjs/components/ui.motion.cjs +41 -15
  133. package/dist/cjs/components/ui.motion.cjs.map +1 -1
  134. package/dist/cjs/dev.cjs +5 -0
  135. package/dist/cjs/dev.cjs.map +1 -1
  136. package/dist/cjs/index.cjs +1 -0
  137. package/dist/cjs/index.cjs.map +1 -1
  138. package/dist/esm/components/Accordion.js +16 -28
  139. package/dist/esm/components/Accordion.js.map +1 -1
  140. package/dist/esm/components/Alert.js +62 -22
  141. package/dist/esm/components/Alert.js.map +1 -1
  142. package/dist/esm/components/AlertDialog.js +6 -4
  143. package/dist/esm/components/AlertDialog.js.map +1 -1
  144. package/dist/esm/components/Avatar.js +14 -5
  145. package/dist/esm/components/Avatar.js.map +1 -1
  146. package/dist/esm/components/Badge.js +5 -3
  147. package/dist/esm/components/Badge.js.map +1 -1
  148. package/dist/esm/components/Breadcrumb.js +9 -5
  149. package/dist/esm/components/Breadcrumb.js.map +1 -1
  150. package/dist/esm/components/Button.js +11 -4
  151. package/dist/esm/components/Button.js.map +1 -1
  152. package/dist/esm/components/Calendar.js +42 -7
  153. package/dist/esm/components/Calendar.js.map +1 -1
  154. package/dist/esm/components/Card.js +12 -8
  155. package/dist/esm/components/Card.js.map +1 -1
  156. package/dist/esm/components/Checkbox.js +16 -4
  157. package/dist/esm/components/Checkbox.js.map +1 -1
  158. package/dist/esm/components/CheckboxGroup.js +3 -2
  159. package/dist/esm/components/CheckboxGroup.js.map +1 -1
  160. package/dist/esm/components/Chip.js +56 -46
  161. package/dist/esm/components/Chip.js.map +1 -1
  162. package/dist/esm/components/ChipGroup.js +18 -1
  163. package/dist/esm/components/ChipGroup.js.map +1 -1
  164. package/dist/esm/components/CodeBlock.js +58 -28
  165. package/dist/esm/components/CodeBlock.js.map +1 -1
  166. package/dist/esm/components/Collapsible.js +1 -1
  167. package/dist/esm/components/Collapsible.js.map +1 -1
  168. package/dist/esm/components/Combobox.js +62 -18
  169. package/dist/esm/components/Combobox.js.map +1 -1
  170. package/dist/esm/components/Command.js +11 -5
  171. package/dist/esm/components/Command.js.map +1 -1
  172. package/dist/esm/components/CommandPalette.js +7 -4
  173. package/dist/esm/components/CommandPalette.js.map +1 -1
  174. package/dist/esm/components/DatePicker.js +7 -4
  175. package/dist/esm/components/DatePicker.js.map +1 -1
  176. package/dist/esm/components/DateRangePicker.js +4 -3
  177. package/dist/esm/components/DateRangePicker.js.map +1 -1
  178. package/dist/esm/components/DateTimePicker.js +1 -1
  179. package/dist/esm/components/DateTimePicker.js.map +1 -1
  180. package/dist/esm/components/Dialog.js +12 -6
  181. package/dist/esm/components/Dialog.js.map +1 -1
  182. package/dist/esm/components/DialogContent.js +6 -4
  183. package/dist/esm/components/DialogContent.js.map +1 -1
  184. package/dist/esm/components/DialogDescription.js +6 -4
  185. package/dist/esm/components/DialogDescription.js.map +1 -1
  186. package/dist/esm/components/DialogFooter.js +3 -3
  187. package/dist/esm/components/DialogFooter.js.map +1 -1
  188. package/dist/esm/components/DialogHeader.js +5 -3
  189. package/dist/esm/components/DialogHeader.js.map +1 -1
  190. package/dist/esm/components/DialogSurface.js +38 -17
  191. package/dist/esm/components/DialogSurface.js.map +1 -1
  192. package/dist/esm/components/DismissButton.js +20 -0
  193. package/dist/esm/components/DismissButton.js.map +1 -0
  194. package/dist/esm/components/Divider.js +3 -1
  195. package/dist/esm/components/Divider.js.map +1 -1
  196. package/dist/esm/components/Drawer.js +27 -17
  197. package/dist/esm/components/Drawer.js.map +1 -1
  198. package/dist/esm/components/Field.js +49 -6
  199. package/dist/esm/components/Field.js.map +1 -1
  200. package/dist/esm/components/FieldLabel.js +15 -0
  201. package/dist/esm/components/FieldLabel.js.map +1 -0
  202. package/dist/esm/components/FileUpload.js +23 -13
  203. package/dist/esm/components/FileUpload.js.map +1 -1
  204. package/dist/esm/components/IconButton.js +30 -9
  205. package/dist/esm/components/IconButton.js.map +1 -1
  206. package/dist/esm/components/Input.js +15 -6
  207. package/dist/esm/components/Input.js.map +1 -1
  208. package/dist/esm/components/Markdown.js +7 -4
  209. package/dist/esm/components/Markdown.js.map +1 -1
  210. package/dist/esm/components/Menu.js +20 -6
  211. package/dist/esm/components/Menu.js.map +1 -1
  212. package/dist/esm/components/NavGroup.js +8 -2
  213. package/dist/esm/components/NavGroup.js.map +1 -1
  214. package/dist/esm/components/NavItem.js +30 -6
  215. package/dist/esm/components/NavItem.js.map +1 -1
  216. package/dist/esm/components/NumberField.js +8 -7
  217. package/dist/esm/components/NumberField.js.map +1 -1
  218. package/dist/esm/components/Pagination.js +43 -9
  219. package/dist/esm/components/Pagination.js.map +1 -1
  220. package/dist/esm/components/Popover.js +14 -6
  221. package/dist/esm/components/Popover.js.map +1 -1
  222. package/dist/esm/components/Progress.js +5 -3
  223. package/dist/esm/components/Progress.js.map +1 -1
  224. package/dist/esm/components/RadioGroup.js +3 -2
  225. package/dist/esm/components/RadioGroup.js.map +1 -1
  226. package/dist/esm/components/Search.js +36 -15
  227. package/dist/esm/components/Search.js.map +1 -1
  228. package/dist/esm/components/SegmentedControl.js +2 -1
  229. package/dist/esm/components/SegmentedControl.js.map +1 -1
  230. package/dist/esm/components/Select.js +16 -6
  231. package/dist/esm/components/Select.js.map +1 -1
  232. package/dist/esm/components/Skeleton.js +5 -3
  233. package/dist/esm/components/Skeleton.js.map +1 -1
  234. package/dist/esm/components/Slider.js +2 -2
  235. package/dist/esm/components/Slider.js.map +1 -1
  236. package/dist/esm/components/Spinner.js +24 -14
  237. package/dist/esm/components/Spinner.js.map +1 -1
  238. package/dist/esm/components/StatusMark.js +38 -0
  239. package/dist/esm/components/StatusMark.js.map +1 -0
  240. package/dist/esm/components/Stepper.js +4 -4
  241. package/dist/esm/components/Stepper.js.map +1 -1
  242. package/dist/esm/components/Switch.js +21 -2
  243. package/dist/esm/components/Switch.js.map +1 -1
  244. package/dist/esm/components/Table.js +16 -8
  245. package/dist/esm/components/Table.js.map +1 -1
  246. package/dist/esm/components/Tabs.js +11 -4
  247. package/dist/esm/components/Tabs.js.map +1 -1
  248. package/dist/esm/components/Textarea.js +8 -4
  249. package/dist/esm/components/Textarea.js.map +1 -1
  250. package/dist/esm/components/Toast.js +49 -36
  251. package/dist/esm/components/Toast.js.map +1 -1
  252. package/dist/esm/components/ToggleGroup.js +16 -5
  253. package/dist/esm/components/ToggleGroup.js.map +1 -1
  254. package/dist/esm/components/Tooltip.js +17 -4
  255. package/dist/esm/components/Tooltip.js.map +1 -1
  256. package/dist/esm/components/TreeView.js +9 -5
  257. package/dist/esm/components/TreeView.js.map +1 -1
  258. package/dist/esm/components/choice-row.js +1 -1
  259. package/dist/esm/components/choice-row.js.map +1 -1
  260. package/dist/esm/components/date-family.js +15 -3
  261. package/dist/esm/components/date-family.js.map +1 -1
  262. package/dist/esm/components/date-field.js +5 -3
  263. package/dist/esm/components/date-field.js.map +1 -1
  264. package/dist/esm/components/edge-fade.js +77 -0
  265. package/dist/esm/components/edge-fade.js.map +1 -0
  266. package/dist/esm/components/scroll-region.js +52 -0
  267. package/dist/esm/components/scroll-region.js.map +1 -0
  268. package/dist/esm/components/time-panel.js +1 -1
  269. package/dist/esm/components/time-panel.js.map +1 -1
  270. package/dist/esm/components/ui.common.js +115 -60
  271. package/dist/esm/components/ui.common.js.map +1 -1
  272. package/dist/esm/components/ui.motion.js +39 -16
  273. package/dist/esm/components/ui.motion.js.map +1 -1
  274. package/dist/esm/content.js +1 -1
  275. package/dist/esm/dev.js +2 -2
  276. package/dist/esm/index.js +1 -1
  277. package/dist/styles.css +326 -200
  278. package/dist/theme.css +15 -12
  279. package/dist/types/content.d.ts +13 -3
  280. package/dist/types/dev.d.cts +65 -30
  281. package/dist/types/dev.d.ts +65 -30
  282. package/dist/types/index.d.cts +502 -166
  283. package/dist/types/index.d.ts +502 -166
  284. package/package.json +1 -1
@@ -1,13 +1,32 @@
1
1
  'use client';
2
2
  import { jsx } from 'react/jsx-runtime';
3
3
  import { Switch as Switch$1 } from '@base-ui/react/switch';
4
- import { forwardRef } from 'react';
4
+ import { forwardRef, useRef } from 'react';
5
5
  import { cn } from '../libs/utils.js';
6
6
  import { elevation, shape, stateLayer, tone, text, groupFocusRing, state } from './ui.common.js';
7
7
  import { motionRelocate, motionFeedback } from './ui.motion.js';
8
+ import { useControlNameWarning } from './Field.js';
8
9
 
9
10
  const Switch = forwardRef(({ checked, defaultChecked, onCheckedChange, variant = "primary", className, disabled, name, form, value, uncheckedValue, readOnly, required, inputRef, ...buttonProps }, ref) => {
10
- return (jsx(Switch$1.Root, { nativeButton: true, render: jsx("button", { ...buttonProps, ref: ref, type: "button" }), checked: checked, defaultChecked: defaultChecked, disabled: disabled, name: name, form: form, value: value, uncheckedValue: uncheckedValue, readOnly: readOnly, required: required, inputRef: inputRef, onCheckedChange: onCheckedChange, className: cn("group inline-flex min-h-12 min-w-14 items-center justify-center outline-none", shape.pill, state.enabled, state.effectiveDisabled, className), children: jsx("span", { "aria-hidden": "true", className: cn("relative block h-8 w-[3.25rem] shrink-0", shape.pill, elevation.recessed, motionFeedback, groupFocusRing, tone.strong.secondary, text.medium, tone.strongChecked[variant], stateLayer.track), children: jsx(Switch$1.Thumb, { className: cn("absolute start-1 top-1/2 h-5 w-5 -translate-y-1/2 bg-current", "group-data-[checked]:h-6 group-data-[checked]:w-6 group-data-[checked]:translate-x-5 rtl:group-data-[checked]:-translate-x-5", shape.circle, elevation.control, motionRelocate) }) }) }));
11
+ /* The visible button is both the forwarded ref and the element the name check reads. */
12
+ const buttonRef = useRef(null);
13
+ const setButtonRef = (node) => {
14
+ buttonRef.current = node;
15
+ if (typeof ref === "function")
16
+ ref(node);
17
+ else if (ref)
18
+ ref.current = node;
19
+ };
20
+ useControlNameWarning(buttonRef, "Switch", Boolean(buttonProps["aria-label"] || buttonProps["aria-labelledby"]));
21
+ return (jsx(Switch$1.Root, { nativeButton: true, render: jsx("button", { ...buttonProps, ref: setButtonRef, type: "button" }), checked: checked, defaultChecked: defaultChecked, disabled: disabled, name: name, form: form, value: value, uncheckedValue: uncheckedValue, readOnly: readOnly, required: required, inputRef: inputRef, onCheckedChange: onCheckedChange, className: cn("group inline-flex min-h-12 min-w-14 items-center justify-center [outline-style:none]", shape.pill, state.enabled, state.effectiveDisabled, className), children: jsx("span", { "aria-hidden": "true", className: cn("relative block h-8 w-[3.25rem] shrink-0", shape.pill, elevation.recessed, motionFeedback, groupFocusRing, tone.strong.secondary, text.medium, tone.strongChecked[variant], stateLayer.track,
22
+ /* Forced colors removes the track's fill and its shadow, so the track keeps its boundary as a
23
+ border the browser repaints. In normal colors the track still has no rim: its thumb and its
24
+ range identify it. */
25
+ "forced-colors:border"), children: jsx(Switch$1.Thumb, { className: cn("absolute start-1 top-1/2 h-5 w-5 -translate-y-1/2 bg-current", "group-data-[checked]:h-6 group-data-[checked]:w-6 group-data-[checked]:translate-x-5 rtl:group-data-[checked]:-translate-x-5", shape.circle, elevation.control, motionRelocate,
26
+ /* The thumb's fill is a background, and forced colors removes every background unless the part
27
+ opts out of colour adjustment, so the thumb opts out and paints a system colour in both
28
+ states. Its position still says on or off. */
29
+ "forced-color-adjust-none forced-colors:[background-color:Highlight]") }) }) }));
11
30
  });
12
31
  Switch.displayName = "Switch";
13
32
 
@@ -1 +1 @@
1
- {"version":3,"file":"Switch.js","sources":["../../../src/components/Switch.tsx"],"sourcesContent":["\"use client\";\n\nimport { Switch as BaseSwitch } from \"@base-ui/react/switch\";\nimport React, {\n forwardRef,\n type ButtonHTMLAttributes,\n type Ref,\n} from \"react\";\nimport { cn } from \"@/libs/utils\";\nimport {\n elevation,\n groupFocusRing,\n shape,\n state,\n stateLayer,\n text,\n tone,\n} from \"./ui.common\";\nimport { motionFeedback, motionRelocate } from \"./ui.motion\";\nimport { Variant } from \"./ui.types\";\n\nexport interface SwitchProps\n extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"value\"> {\n checked?: boolean;\n defaultChecked?: boolean;\n /** Base's checked-change callback, event details included. */\n onCheckedChange?: BaseSwitch.Root.Props[\"onCheckedChange\"];\n variant?: Variant;\n value?: string;\n uncheckedValue?: string;\n readOnly?: boolean;\n required?: boolean;\n inputRef?: Ref<HTMLInputElement>;\n}\n\nexport const Switch = forwardRef<HTMLButtonElement, SwitchProps>(({\n checked,\n defaultChecked,\n onCheckedChange,\n variant = \"primary\",\n className,\n disabled,\n name,\n form,\n value,\n uncheckedValue,\n readOnly,\n required,\n inputRef,\n ...buttonProps\n}, ref) => {\n return (\n <BaseSwitch.Root\n nativeButton\n render={<button {...buttonProps} ref={ref} type=\"button\" />}\n checked={checked}\n defaultChecked={defaultChecked}\n disabled={disabled}\n name={name}\n form={form}\n value={value}\n uncheckedValue={uncheckedValue}\n readOnly={readOnly}\n required={required}\n inputRef={inputRef}\n onCheckedChange={onCheckedChange}\n className={cn(\n \"group inline-flex min-h-12 min-w-14 items-center justify-center outline-none\",\n shape.pill,\n state.enabled,\n state.effectiveDisabled,\n className\n )}\n >\n {/* Every state of the track and the thumb is keyed on the primitive's own selection\n marker rather than on the `checked` prop, so an uncontrolled switch is styled from\n the same source of truth as a controlled one — and its thumb actually travels. */}\n <span\n aria-hidden=\"true\"\n className={cn(\n \"relative block h-8 w-[3.25rem] shrink-0\",\n shape.pill,\n elevation.recessed,\n motionFeedback,\n groupFocusRing,\n tone.strong.secondary,\n text.medium,\n tone.strongChecked[variant],\n stateLayer.track\n )}\n >\n <BaseSwitch.Thumb\n className={cn(\n \"absolute start-1 top-1/2 h-5 w-5 -translate-y-1/2 bg-current\",\n \"group-data-[checked]:h-6 group-data-[checked]:w-6 group-data-[checked]:translate-x-5 rtl:group-data-[checked]:-translate-x-5\",\n shape.circle,\n elevation.control,\n motionRelocate\n )}\n />\n </span>\n </BaseSwitch.Root>\n );\n});\n\nSwitch.displayName = \"Switch\";\n"],"names":["_jsx","BaseSwitch"],"mappings":"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"}
1
+ {"version":3,"file":"Switch.js","sources":["../../../src/components/Switch.tsx"],"sourcesContent":["\"use client\";\n\nimport { Switch as BaseSwitch } from \"@base-ui/react/switch\";\nimport React, {\n forwardRef,\n useRef,\n type ButtonHTMLAttributes,\n type Ref,\n} from \"react\";\nimport { cn } from \"@/libs/utils\";\nimport {\n elevation,\n groupFocusRing,\n shape,\n state,\n stateLayer,\n text,\n tone,\n} from \"./ui.common\";\nimport { motionFeedback, motionRelocate } from \"./ui.motion\";\nimport { useControlNameWarning } from \"./Field\";\nimport { Variant } from \"./ui.types\";\n\nexport interface SwitchProps\n extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"value\"> {\n checked?: boolean;\n defaultChecked?: boolean;\n /** Base's checked-change callback, event details included. */\n onCheckedChange?: BaseSwitch.Root.Props[\"onCheckedChange\"];\n variant?: Variant;\n value?: string;\n uncheckedValue?: string;\n readOnly?: boolean;\n required?: boolean;\n inputRef?: Ref<HTMLInputElement>;\n}\n\nexport const Switch = forwardRef<HTMLButtonElement, SwitchProps>(({\n checked,\n defaultChecked,\n onCheckedChange,\n variant = \"primary\",\n className,\n disabled,\n name,\n form,\n value,\n uncheckedValue,\n readOnly,\n required,\n inputRef,\n ...buttonProps\n}, ref) => {\n /* The visible button is both the forwarded ref and the element the name check reads. */\n const buttonRef = useRef<HTMLButtonElement | null>(null);\n const setButtonRef = (node: HTMLButtonElement | null) => {\n buttonRef.current = node;\n if (typeof ref === \"function\") ref(node);\n else if (ref) ref.current = node;\n };\n useControlNameWarning(buttonRef, \"Switch\", Boolean(buttonProps[\"aria-label\"] || buttonProps[\"aria-labelledby\"]));\n\n return (\n <BaseSwitch.Root\n nativeButton\n render={<button {...buttonProps} ref={setButtonRef} type=\"button\" />}\n checked={checked}\n defaultChecked={defaultChecked}\n disabled={disabled}\n name={name}\n form={form}\n value={value}\n uncheckedValue={uncheckedValue}\n readOnly={readOnly}\n required={required}\n inputRef={inputRef}\n onCheckedChange={onCheckedChange}\n className={cn(\n \"group inline-flex min-h-12 min-w-14 items-center justify-center [outline-style:none]\",\n shape.pill,\n state.enabled,\n state.effectiveDisabled,\n className\n )}\n >\n {/* Every state of the track and the thumb is keyed on the primitive's own selection\n marker rather than on the `checked` prop, so an uncontrolled switch is styled from\n the same source of truth as a controlled one — and its thumb actually travels. */}\n <span\n aria-hidden=\"true\"\n className={cn(\n \"relative block h-8 w-[3.25rem] shrink-0\",\n shape.pill,\n elevation.recessed,\n motionFeedback,\n groupFocusRing,\n tone.strong.secondary,\n text.medium,\n tone.strongChecked[variant],\n stateLayer.track,\n /* Forced colors removes the track's fill and its shadow, so the track keeps its boundary as a\n border the browser repaints. In normal colors the track still has no rim: its thumb and its\n range identify it. */\n \"forced-colors:border\"\n )}\n >\n <BaseSwitch.Thumb\n className={cn(\n \"absolute start-1 top-1/2 h-5 w-5 -translate-y-1/2 bg-current\",\n \"group-data-[checked]:h-6 group-data-[checked]:w-6 group-data-[checked]:translate-x-5 rtl:group-data-[checked]:-translate-x-5\",\n shape.circle,\n elevation.control,\n motionRelocate,\n /* The thumb's fill is a background, and forced colors removes every background unless the part\n opts out of colour adjustment, so the thumb opts out and paints a system colour in both\n states. Its position still says on or off. */\n \"forced-color-adjust-none forced-colors:[background-color:Highlight]\"\n )}\n />\n </span>\n </BaseSwitch.Root>\n );\n});\n\nSwitch.displayName = \"Switch\";\n"],"names":["_jsx","BaseSwitch"],"mappings":"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"}
@@ -1,22 +1,30 @@
1
1
  import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import { forwardRef } from 'react';
2
3
  import { cn } from '../libs/utils.js';
3
- import { text, type, edge, state, focusRing, material, shape } from './ui.common.js';
4
+ import ScrollRegion from './scroll-region.js';
5
+ import { text, type, edge, state, material, shape } from './ui.common.js';
4
6
  import { motionFeedback } from './ui.motion.js';
5
7
 
6
8
  /* A table is a quiet, dense data region: the lightest matte fill, tighter geometry than
7
9
  a card, and hairlines between rows. Row feedback is tonality only — the rows are
8
10
  scannable, not manipulated. */
9
- const Table = ({ headers, rows, className, tableClassName, }) => {
11
+ const Table = forwardRef(({ headers, rows, caption, emptyMessage, getRowKey, className, tableClassName, "aria-label": ariaLabel, ...props }, ref) => {
12
+ var _a;
10
13
  const columns = headers.map((header, index) => typeof header === "string"
11
14
  ? { key: `string:${index}`, label: header }
12
15
  : { ...header, key: `column:${header.id}` });
16
+ const captionText = typeof caption === "string" ? caption : undefined;
13
17
  return (
14
- // Passive cells still need a keyboard-reachable surface when the table overflows.
15
- jsx("div", { tabIndex: 0, className: cn("w-full overflow-auto", shape.control, material.matteQuiet, focusRing, className), children: jsxs("table", { className: cn("w-full border-collapse", tableClassName), children: [jsx("thead", { children: jsx("tr", { className: cn(edge.header), children: columns.map((column) => (jsx("th", { className: cn("px-4 py-3 text-start", type.label, text.medium, column.className), children: column.label }, column.key))) }) }), jsx("tbody", { children: rows.map((row, i) => (jsx("tr", { className: cn(edge.row, motionFeedback, state.rowHover), children: row.map((cell, j) => {
16
- var _a, _b, _c;
17
- return (jsx("td", { className: cn("px-4 py-3 text-sm", type.numeric, text.high, (_a = columns[j]) === null || _a === void 0 ? void 0 : _a.className), children: cell }, (_c = (_b = columns[j]) === null || _b === void 0 ? void 0 : _b.key) !== null && _c !== void 0 ? _c : `extra:${j}`));
18
- }) }, i))) })] }) }));
19
- };
18
+ /* The region is named by the caller's label, then by a string caption, then by the table itself. A
19
+ scrolling box with no name is not something a screen reader can find. */
20
+ jsx(ScrollRegion, { ...props, ref: ref, label: (_a = ariaLabel !== null && ariaLabel !== void 0 ? ariaLabel : captionText) !== null && _a !== void 0 ? _a : "Table", className: cn("w-full", shape.control, material.matteQuiet, className), children: jsxs("table", { className: cn("w-full border-collapse", tableClassName), children: [caption !== undefined && (jsx("caption", { className: cn("px-4 py-3 text-start", type.label, text.medium), children: caption })), jsx("thead", { children: jsx("tr", { className: cn(edge.header), children: columns.map((column) => (jsx("th", { scope: "col", className: cn("px-4 py-3 text-start", type.label, text.medium, column.className), children: column.label }, column.key))) }) }), jsx("tbody", { children: rows.length === 0 && emptyMessage !== undefined ? (jsx("tr", { children: jsx("td", { colSpan: columns.length, className: cn("px-4 py-6 text-start", type.body, text.medium), children: emptyMessage }) })) : (rows.map((row, i) => (jsx("tr", { className: cn(edge.row, motionFeedback, state.rowHover), children: row.map((cell, j) => {
21
+ var _a;
22
+ const column = columns[j];
23
+ const cellClass = cn("px-4 py-3", type.numeric, text.high, column === null || column === void 0 ? void 0 : column.className);
24
+ return (column === null || column === void 0 ? void 0 : column.rowHeader) ? (jsx("th", { scope: "row", className: cn(cellClass, "text-start font-medium"), children: cell }, column.key)) : (jsx("td", { className: cn(cellClass), children: cell }, (_a = column === null || column === void 0 ? void 0 : column.key) !== null && _a !== void 0 ? _a : `extra:${j}`));
25
+ }) }, getRowKey ? getRowKey(row, i) : i)))) })] }) }));
26
+ });
27
+ Table.displayName = "Table";
20
28
 
21
29
  export { Table };
22
30
  //# sourceMappingURL=Table.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Table.js","sources":["../../../src/components/Table.tsx"],"sourcesContent":["import React, { type ReactNode } from \"react\";\nimport { cn } from \"@/libs/utils\";\nimport { edge, focusRing, material, shape, state, text, type } from \"./ui.common\";\nimport { motionFeedback } from \"./ui.motion\";\n\nexport interface TableProps {\n headers: Array<string | TableColumn>;\n rows: ReactNode[][];\n /** Classes for the outer scrollable surface. */\n className?: string;\n /** Classes for the native table element. */\n tableClassName?: string;\n}\n\nexport interface TableColumn {\n /** Stable identity for this column, shared by its header and body cells. */\n id: string;\n label: string;\n /** Classes applied to this column's header and body cells. */\n className?: string;\n}\n\n/* A table is a quiet, dense data region: the lightest matte fill, tighter geometry than\n a card, and hairlines between rows. Row feedback is tonality only — the rows are\n scannable, not manipulated. */\nexport const Table = ({\n headers,\n rows,\n className,\n tableClassName,\n}: TableProps) => {\n const columns = headers.map((header, index): { key: string; label: string; className?: string } =>\n typeof header === \"string\"\n ? { key: `string:${index}`, label: header }\n : { ...header, key: `column:${header.id}` }\n );\n\n return (\n // Passive cells still need a keyboard-reachable surface when the table overflows.\n <div tabIndex={0} className={cn(\"w-full overflow-auto\", shape.control, material.matteQuiet, focusRing, className)}>\n <table className={cn(\"w-full border-collapse\", tableClassName)}>\n <thead>\n <tr className={cn(edge.header)}>\n {columns.map((column) => (\n <th\n key={column.key}\n className={cn(\"px-4 py-3 text-start\", type.label, text.medium, column.className)}\n >\n {column.label}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((row, i) => (\n <tr key={i} className={cn(edge.row, motionFeedback, state.rowHover)}>\n {row.map((cell, j) => (\n <td key={columns[j]?.key ?? `extra:${j}`} className={cn(\"px-4 py-3 text-sm\", type.numeric, text.high, columns[j]?.className)}>\n {cell}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n};\n"],"names":["_jsx","_jsxs"],"mappings":";;;;;AAsBA;;AAEiC;AAC1B,MAAM,KAAK,GAAG,CAAC,EACpB,OAAO,EACP,IAAI,EACJ,SAAS,EACT,cAAc,GACH,KAAI;AACf,IAAA,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,KACxC,OAAO,MAAM,KAAK;UACd,EAAE,GAAG,EAAE,CAAA,OAAA,EAAU,KAAK,CAAA,CAAE,EAAE,KAAK,EAAE,MAAM;AACzC,UAAE,EAAE,GAAG,MAAM,EAAE,GAAG,EAAE,CAAA,OAAA,EAAU,MAAM,CAAC,EAAE,CAAA,CAAE,EAAE,CAC9C;IAED;;AAEE,IAAAA,GAAA,CAAA,KAAA,EAAA,EAAK,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,CAAC,sBAAsB,EAAE,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,UAAU,EAAE,SAAS,EAAE,SAAS,CAAC,EAAA,QAAA,EAC/GC,IAAA,CAAA,OAAA,EAAA,EAAO,SAAS,EAAE,EAAE,CAAC,wBAAwB,EAAE,cAAc,CAAC,EAAA,QAAA,EAAA,CAC5DD,GAAA,CAAA,OAAA,EAAA,EAAA,QAAA,EACEA,GAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,EAAA,QAAA,EAC3B,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,MAClBA,GAAA,CAAA,IAAA,EAAA,EAEE,SAAS,EAAE,EAAE,CAAC,sBAAsB,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC,EAAA,QAAA,EAE/E,MAAM,CAAC,KAAK,EAAA,EAHR,MAAM,CAAC,GAAG,CAIZ,CACN,CAAC,EAAA,CACC,EAAA,CACC,EACRA,GAAA,CAAA,OAAA,EAAA,EAAA,QAAA,EACG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,MACfA,GAAA,CAAA,IAAA,EAAA,EAAY,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAA,QAAA,EAChE,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAI;;AAAC,4BAAA,QACpBA,GAAA,CAAA,IAAA,EAAA,EAA0C,SAAS,EAAE,EAAE,CAAC,mBAAmB,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,CAAA,EAAA,GAAA,OAAO,CAAC,CAAC,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,SAAS,CAAC,EAAA,QAAA,EACzH,IAAI,EAAA,EADE,CAAA,EAAA,GAAA,MAAA,OAAO,CAAC,CAAC,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,GAAG,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAI,CAAA,MAAA,EAAS,CAAC,CAAA,CAAE,CAEnC;yBACN,CAAC,EAAA,EALK,CAAC,CAML,CACN,CAAC,EAAA,CACI,CAAA,EAAA,CACF,EAAA,CACJ;AAEV;;"}
1
+ {"version":3,"file":"Table.js","sources":["../../../src/components/Table.tsx"],"sourcesContent":["import React, { forwardRef, type ComponentPropsWithoutRef, type Key, type ReactNode } from \"react\";\nimport { cn } from \"@/libs/utils\";\nimport ScrollRegion from \"./scroll-region\";\nimport { edge, material, shape, state, text, type } from \"./ui.common\";\nimport { motionFeedback } from \"./ui.motion\";\n\nexport interface TableColumn {\n /** Stable identity for this column, shared by its header and body cells. */\n id: string;\n label: string;\n /** Classes applied to this column's header and body cells. */\n className?: string;\n /**\n * The column names each row, so its body cells are row headers (`th scope=\"row\"`) rather than data.\n * A row header is what a screen reader announces with every cell beside it.\n */\n rowHeader?: boolean;\n}\n\nexport interface TableProps extends Omit<ComponentPropsWithoutRef<\"div\">, \"children\" | \"role\"> {\n headers: Array<string | TableColumn>;\n rows: ReactNode[][];\n /**\n * The table's visible caption. A string caption also names the scrolling region, so a table with a\n * caption is never anonymous.\n */\n caption?: ReactNode;\n /** The one row shown when `rows` is empty, spanning every column. */\n emptyMessage?: ReactNode;\n /** A stable key for each row. The index is only right for rows that never reorder. */\n getRowKey?: (row: ReactNode[], index: number) => Key;\n /** Classes for the outer scrollable surface. */\n className?: string;\n /** Classes for the native table element. */\n tableClassName?: string;\n}\n\n/* A table is a quiet, dense data region: the lightest matte fill, tighter geometry than\n a card, and hairlines between rows. Row feedback is tonality only — the rows are\n scannable, not manipulated. */\nexport const Table = forwardRef<HTMLDivElement, TableProps>(\n (\n {\n headers,\n rows,\n caption,\n emptyMessage,\n getRowKey,\n className,\n tableClassName,\n \"aria-label\": ariaLabel,\n ...props\n },\n ref\n ) => {\n const columns = headers.map((header, index): { key: string; label: string; className?: string; rowHeader?: boolean } =>\n typeof header === \"string\"\n ? { key: `string:${index}`, label: header }\n : { ...header, key: `column:${header.id}` }\n );\n const captionText = typeof caption === \"string\" ? caption : undefined;\n\n return (\n /* The region is named by the caller's label, then by a string caption, then by the table itself. A\n scrolling box with no name is not something a screen reader can find. */\n <ScrollRegion\n {...props}\n ref={ref}\n label={ariaLabel ?? captionText ?? \"Table\"}\n className={cn(\"w-full\", shape.control, material.matteQuiet, className)}\n >\n <table className={cn(\"w-full border-collapse\", tableClassName)}>\n {caption !== undefined && (\n <caption className={cn(\"px-4 py-3 text-start\", type.label, text.medium)}>{caption}</caption>\n )}\n <thead>\n <tr className={cn(edge.header)}>\n {columns.map((column) => (\n <th\n key={column.key}\n scope=\"col\"\n className={cn(\"px-4 py-3 text-start\", type.label, text.medium, column.className)}\n >\n {column.label}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.length === 0 && emptyMessage !== undefined ? (\n <tr>\n <td colSpan={columns.length} className={cn(\"px-4 py-6 text-start\", type.body, text.medium)}>\n {emptyMessage}\n </td>\n </tr>\n ) : (\n rows.map((row, i) => (\n <tr key={getRowKey ? getRowKey(row, i) : i} className={cn(edge.row, motionFeedback, state.rowHover)}>\n {row.map((cell, j) => {\n const column = columns[j];\n const cellClass = cn(\"px-4 py-3\", type.numeric, text.high, column?.className);\n return column?.rowHeader ? (\n <th key={column.key} scope=\"row\" className={cn(cellClass, \"text-start font-medium\")}>\n {cell}\n </th>\n ) : (\n <td key={column?.key ?? `extra:${j}`} className={cn(cellClass)}>\n {cell}\n </td>\n );\n })}\n </tr>\n ))\n )}\n </tbody>\n </table>\n </ScrollRegion>\n );\n }\n);\n\nTable.displayName = \"Table\";\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
@@ -2,20 +2,27 @@
2
2
  import { jsxs, jsx } from 'react/jsx-runtime';
3
3
  import { Tabs as Tabs$1 } from '@base-ui/react/tabs';
4
4
  import { cn } from '../libs/utils.js';
5
- import { elevation, puck, shape, state, stateLayer, tone, text, focusRingInset, density, selectable } from './ui.common.js';
5
+ import { useEdgeFade } from './edge-fade.js';
6
+ import { elevation, puck, shape, iconSlot, state, stateLayer, tone, text, focusRingInset, density, selectable } from './ui.common.js';
6
7
  import { motionRelocateLong, motionTactileWide } from './ui.motion.js';
7
8
 
8
- const Tabs = ({ tabs, variant = "primary", className, value, defaultValue, onValueChange, ariaLabel = "Tabs", }) => {
9
- var _a, _b;
9
+ const defaultTabsLabels = {
10
+ list: "Tabs",
11
+ };
12
+ const Tabs = ({ tabs, variant = "primary", className, value, defaultValue, onValueChange, "aria-label": ariaLabelProp, "aria-labelledby": ariaLabelledBy, ariaLabel, labels, }) => {
13
+ var _a, _b, _c;
14
+ /* Called before the empty check, so the hook order never depends on how many tabs there are. */
15
+ const edge = useEdgeFade();
10
16
  if (tabs.length === 0)
11
17
  return null;
12
18
  const fallbackValue = (_b = (_a = tabs.find((tab) => !tab.disabled)) === null || _a === void 0 ? void 0 : _a.id) !== null && _b !== void 0 ? _b : tabs[0].id;
13
19
  const uncontrolledDefault = defaultValue !== null && defaultValue !== void 0 ? defaultValue : fallbackValue;
20
+ const name = (_c = ariaLabelProp !== null && ariaLabelProp !== void 0 ? ariaLabelProp : ariaLabel) !== null && _c !== void 0 ? _c : { ...defaultTabsLabels, ...labels }.list;
14
21
  return (jsxs(Tabs$1.Root, { value: value, defaultValue: value === undefined ? uncontrolledDefault : undefined, onValueChange: (nextValue, eventDetails) => {
15
22
  if (typeof nextValue !== "string")
16
23
  return;
17
24
  onValueChange === null || onValueChange === void 0 ? void 0 : onValueChange(nextValue, eventDetails);
18
- }, className: cn("min-w-0 w-full [overflow-wrap:anywhere]", className), children: [jsx("div", { className: cn("overflow-x-auto"), children: jsxs(Tabs$1.List, { "aria-label": ariaLabel, className: cn("relative flex min-w-max p-1", shape.prominent, selectable.surface, selectable.rest), children: [jsx(Tabs$1.Indicator, { className: cn("absolute left-[var(--active-tab-left)] top-[var(--active-tab-top)] h-[var(--active-tab-height)] w-[var(--active-tab-width)]", shape.control, puck, elevation.control, motionRelocateLong) }), tabs.map((tab) => (jsx(Tabs$1.Tab, { value: tab.id, disabled: tab.disabled, className: ({ active, disabled }) => cn("relative z-10 min-w-28 flex-1 whitespace-nowrap px-7 py-3 font-medium", density.normal, shape.control, motionTactileWide, focusRingInset, active ? tone.text[variant] : cn(text.medium, !disabled && "hover:text-sherick-ink"), !disabled && stateLayer.quiet, disabled && state.disabled), children: tab.label }, tab.id)))] }) }), tabs.map((tab) => (jsx(Tabs$1.Panel, { value: tab.id, className: cn("mt-5"), children: tab.content }, tab.id)))] }));
25
+ }, className: cn("min-w-0 w-full [overflow-wrap:anywhere]", className), children: [jsx("div", { ref: edge.ref, style: edge.mask, className: cn("overflow-x-auto"), children: jsxs(Tabs$1.List, { "aria-label": ariaLabelledBy ? undefined : name, "aria-labelledby": ariaLabelledBy, className: cn("relative flex min-w-max p-1", shape.prominent, selectable.surface, selectable.rest), children: [jsx(Tabs$1.Indicator, { className: cn("absolute left-[var(--active-tab-left)] top-[var(--active-tab-top)] h-[var(--active-tab-height)] w-[var(--active-tab-width)]", shape.control, puck, elevation.control, motionRelocateLong) }), tabs.map((tab) => (jsxs(Tabs$1.Tab, { value: tab.id, disabled: tab.disabled, className: ({ active, disabled }) => cn("relative z-10 inline-flex min-w-28 flex-1 items-center justify-center gap-2 whitespace-nowrap px-7 py-3 font-medium", density.normal, shape.control, motionTactileWide, focusRingInset, active ? tone.text[variant] : disabled ? text.medium : state.quietInk, !disabled && stateLayer.quiet, disabled && state.disabled), children: [tab.icon && (jsx("span", { className: cn(iconSlot.normal), "aria-hidden": "true", children: tab.icon })), tab.label] }, tab.id)))] }) }), tabs.map((tab) => (jsx(Tabs$1.Panel, { value: tab.id, className: cn("mt-5"), children: tab.content }, tab.id)))] }));
19
26
  };
20
27
 
21
28
  export { Tabs };
@@ -1 +1 @@
1
- {"version":3,"file":"Tabs.js","sources":["../../../src/components/Tabs.tsx"],"sourcesContent":["\"use client\";\n\nimport { Tabs as BaseTabs } from \"@base-ui/react/tabs\";\nimport React, { type ReactNode } from \"react\";\nimport { cn } from \"@/libs/utils\";\nimport {\n density,\n elevation,\n focusRingInset,\n puck,\n selectable,\n shape,\n state,\n stateLayer,\n text,\n tone,\n} from \"./ui.common\";\nimport { motionRelocateLong, motionTactileWide } from \"./ui.motion\";\nimport { Variant } from \"./ui.types\";\n\ntype TabsChangeDetails = Parameters<NonNullable<BaseTabs.Root.Props[\"onValueChange\"]>>[1];\n\nexport interface Tab {\n id: string;\n label: string;\n content: ReactNode;\n disabled?: boolean;\n}\n\nexport interface TabsProps {\n tabs: Tab[];\n variant?: Variant;\n className?: string;\n value?: string;\n defaultValue?: string;\n /** Base's value-change event details are passed through unchanged. */\n onValueChange?: (tabId: string, eventDetails: TabsChangeDetails) => void;\n ariaLabel?: string;\n}\n\nexport const Tabs = ({\n tabs,\n variant = \"primary\",\n className,\n value,\n defaultValue,\n onValueChange,\n ariaLabel = \"Tabs\",\n}: TabsProps) => {\n if (tabs.length === 0) return null;\n\n const fallbackValue = tabs.find((tab) => !tab.disabled)?.id ?? tabs[0].id;\n const uncontrolledDefault = defaultValue ?? fallbackValue;\n\n return (\n <BaseTabs.Root\n value={value}\n defaultValue={value === undefined ? uncontrolledDefault : undefined}\n onValueChange={(nextValue, eventDetails) => {\n if (typeof nextValue !== \"string\") return;\n onValueChange?.(nextValue, eventDetails);\n }}\n className={cn(\"min-w-0 w-full [overflow-wrap:anywhere]\", className)}\n >\n {/* A tab row that cannot fit where it was placed scrolls inside itself rather than widening\n the page. The row is the content that is wider than its container, so owning that overflow\n here is the same thing `Table` does, and it is what keeps a 320px-wide reader from having\n to pan the whole page sideways to reach the third tab — no consumer wrapper to know\n about, and nothing about the shape of the control changes. The scroller wraps the track\n and not the whole control, so the region an application placed the tabs in still owns the\n horizontal axis of everything below it, and the track keeps its own content width so the\n track still scrolls as one object. */}\n <div className={cn(\"overflow-x-auto\")}>\n <BaseTabs.List\n aria-label={ariaLabel}\n className={cn(\n \"relative flex min-w-max p-1\",\n shape.prominent,\n selectable.surface,\n selectable.rest\n )}\n >\n <BaseTabs.Indicator\n className={cn(\n \"absolute left-[var(--active-tab-left)] top-[var(--active-tab-top)] h-[var(--active-tab-height)] w-[var(--active-tab-width)]\",\n shape.control,\n puck,\n elevation.control,\n motionRelocateLong\n )}\n />\n\n {tabs.map((tab) => (\n <BaseTabs.Tab\n key={tab.id}\n value={tab.id}\n disabled={tab.disabled}\n className={({ active, disabled }) =>\n cn(\n \"relative z-10 min-w-28 flex-1 whitespace-nowrap px-7 py-3 font-medium\",\n density.normal,\n shape.control,\n motionTactileWide,\n focusRingInset,\n active ? tone.text[variant] : cn(text.medium, !disabled && \"hover:text-sherick-ink\"),\n !disabled && stateLayer.quiet,\n disabled && state.disabled\n )\n }\n >\n {tab.label}\n </BaseTabs.Tab>\n ))}\n </BaseTabs.List>\n </div>\n\n {tabs.map((tab) => (\n <BaseTabs.Panel key={tab.id} value={tab.id} className={cn(\"mt-5\")}>\n {tab.content}\n </BaseTabs.Panel>\n ))}\n </BaseTabs.Root>\n );\n};\n"],"names":["_jsxs","BaseTabs","_jsx"],"mappings":";;;;;;;AAwCO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAI,GAAG,CAAC,CAAA,CACnB,IAAI,CAAA,CACJ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CACnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,EACT,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CACL,YAAY,CAAA,CACZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,EACb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CACR,CAAA,CAAA,CAAA,CAAA,CAAI;;AACd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,KAAK,CAAC;AAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAA,CAAA,CAAA,CAAI;IAElC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,aAAa,CAAA,CAAA,CAAG,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,MAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,CAAA,CAAE,CAAA,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA,CAAA,CAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA,CAAE;IACzE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAmB,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,GAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa;AAEzD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACEA,CAAAA,CAAAA,CAAAA,CAAA,CAACC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CACZ,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAE,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CACZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAA,CAAE,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAmB,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CACnE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAA,CAAA,CAAA,CAAA,CAAI;YACzC,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ;gBAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;YACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAb,aAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAAE,YAAY,CAAC;QAC1C,CAAC,CAAA,CACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAAE,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAyC,CAAA,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAUnEC,CAAAA,CAAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAAE,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAiB,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACnCF,KAACC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CACrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAAE,CAAA,CAAE,CACX,6BAA6B,CAAA,CAC7B,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CACf,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAClB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAA,CAAA,CAAA,CAAI,CAChB,CAAA,CAAA,QAAA,CAAA,CAAA,CAEDC,CAAAA,CAAAA,CAAA,CAACD,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAAA,CAAA,CACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAAE,CAAA,CAAE,CACX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAA6H,EAC7H,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CACb,CAAA,CAAA,CAAA,CAAI,CAAA,CACJ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAkB,CACnB,CAAA,CAAA,CACD,EAED,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CACZC,CAAAA,CAAAA,EAACD,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAQ,CAAC,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAEX,KAAK,CAAA,CAAE,CAAA,CAAA,CAAG,CAAC,CAAA,CAAE,CAAA,CACb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAE,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CACtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAAE,CAAC,EAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAE,CAAA,CAAA,CAAA,CAAA,CAC9B,CAAA,CAAE,CACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAuE,CAAA,CACvE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CACd,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CACb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAiB,CAAA,CACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAA,CACd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,GAAG,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAwB,CAAC,CAAA,CACpF,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,IAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAC3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAGF,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,GAhBL,CAAA,CAAA,CAAG,CAAC,CAAA,CAAE,CAiBE,CAChB,CAAC,CAAA,CAAA,CAAA,CACY,CAAA,CAAA,CACZ,EAEL,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CACZC,CAAAA,CAAAA,CAAA,CAACD,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,GAAc,KAAK,CAAA,CAAE,CAAA,CAAA,CAAG,CAAC,CAAA,CAAE,CAAA,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAAE,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAC9D,GAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CADO,CAAA,CAAA,CAAG,CAAC,CAAA,CAAE,CAEV,CAClB,CAAC,CAAA,CAAA,CAAA,CACY,CAAA;AAEpB,CAAA;;"}
1
+ {"version":3,"file":"Tabs.js","sources":["../../../src/components/Tabs.tsx"],"sourcesContent":["\"use client\";\n\nimport { Tabs as BaseTabs } from \"@base-ui/react/tabs\";\nimport React, { type ReactNode } from \"react\";\nimport { cn } from \"@/libs/utils\";\nimport { useEdgeFade } from \"./edge-fade\";\nimport {\n density,\n elevation,\n focusRingInset,\n iconSlot,\n puck,\n selectable,\n shape,\n state,\n stateLayer,\n text,\n tone,\n} from \"./ui.common\";\nimport { motionRelocateLong, motionTactileWide } from \"./ui.motion\";\nimport { Variant } from \"./ui.types\";\n\ntype TabsChangeDetails = Parameters<NonNullable<BaseTabs.Root.Props[\"onValueChange\"]>>[1];\n\n/** The English copy a tab list names itself with. */\nexport interface TabsLabels {\n /** The tab list's accessible name, when neither `aria-label` nor `aria-labelledby` names it. */\n list: string;\n}\n\nconst defaultTabsLabels: TabsLabels = {\n list: \"Tabs\",\n};\n\nexport interface Tab {\n id: string;\n /** The tab's name. The tab is named by its label, so the label may be any content a row can hold. */\n label: ReactNode;\n /** A mark before the label. It is decorative: the label alone names the tab. */\n icon?: ReactNode;\n content: ReactNode;\n disabled?: boolean;\n}\n\nexport interface TabsProps {\n tabs: Tab[];\n variant?: Variant;\n className?: string;\n value?: string;\n defaultValue?: string;\n /** Base's value-change event details are passed through unchanged. */\n onValueChange?: (tabId: string, eventDetails: TabsChangeDetails) => void;\n /** Names the tab list. Left unset, the list takes the name in `labels`. */\n \"aria-label\"?: string;\n /** Names the tab list from an element that already labels it. It takes precedence over a name. */\n \"aria-labelledby\"?: string;\n /** The same name as `aria-label`, kept for callers that already use it. */\n ariaLabel?: string;\n /** The English copy the tab list names itself with. */\n labels?: Partial<TabsLabels>;\n}\n\nexport const Tabs = ({\n tabs,\n variant = \"primary\",\n className,\n value,\n defaultValue,\n onValueChange,\n \"aria-label\": ariaLabelProp,\n \"aria-labelledby\": ariaLabelledBy,\n ariaLabel,\n labels,\n}: TabsProps) => {\n /* Called before the empty check, so the hook order never depends on how many tabs there are. */\n const edge = useEdgeFade<HTMLDivElement>();\n\n if (tabs.length === 0) return null;\n\n const fallbackValue = tabs.find((tab) => !tab.disabled)?.id ?? tabs[0].id;\n const uncontrolledDefault = defaultValue ?? fallbackValue;\n const name = ariaLabelProp ?? ariaLabel ?? { ...defaultTabsLabels, ...labels }.list;\n\n return (\n <BaseTabs.Root\n value={value}\n defaultValue={value === undefined ? uncontrolledDefault : undefined}\n onValueChange={(nextValue, eventDetails) => {\n if (typeof nextValue !== \"string\") return;\n onValueChange?.(nextValue, eventDetails);\n }}\n className={cn(\"min-w-0 w-full [overflow-wrap:anywhere]\", className)}\n >\n {/* A tab row that cannot fit where it was placed scrolls inside itself rather than widening\n the page. The row is the content that is wider than its container, so owning that overflow\n here is the same thing `Table` does, and it is what keeps a 320px-wide reader from having\n to pan the whole page sideways to reach the third tab — no consumer wrapper to know\n about, and nothing about the shape of the control changes. The scroller wraps the track\n and not the whole control, so the region an application placed the tabs in still owns the\n horizontal axis of everything below it, and the track keeps its own content width so the\n track still scrolls as one object. The edge fade says which side has more tabs behind it. */}\n <div ref={edge.ref} style={edge.mask} className={cn(\"overflow-x-auto\")}>\n <BaseTabs.List\n aria-label={ariaLabelledBy ? undefined : name}\n aria-labelledby={ariaLabelledBy}\n className={cn(\n \"relative flex min-w-max p-1\",\n shape.prominent,\n selectable.surface,\n selectable.rest\n )}\n >\n {/* Base publishes only the activation direction on the indicator, and that value persists between\n selections, so it cannot tell a selection from a resize. The travel therefore stays on every\n position change; the gap is recorded in DESIGN_LANGUAGE §12. */}\n <BaseTabs.Indicator\n className={cn(\n \"absolute left-[var(--active-tab-left)] top-[var(--active-tab-top)] h-[var(--active-tab-height)] w-[var(--active-tab-width)]\",\n shape.control,\n puck,\n elevation.control,\n motionRelocateLong\n )}\n />\n\n {tabs.map((tab) => (\n <BaseTabs.Tab\n key={tab.id}\n value={tab.id}\n disabled={tab.disabled}\n className={({ active, disabled }) =>\n cn(\n \"relative z-10 inline-flex min-w-28 flex-1 items-center justify-center gap-2 whitespace-nowrap px-7 py-3 font-medium\",\n density.normal,\n shape.control,\n motionTactileWide,\n focusRingInset,\n active ? tone.text[variant] : disabled ? text.medium : state.quietInk,\n !disabled && stateLayer.quiet,\n disabled && state.disabled\n )\n }\n >\n {tab.icon && (\n <span className={cn(iconSlot.normal)} aria-hidden=\"true\">\n {tab.icon}\n </span>\n )}\n {tab.label}\n </BaseTabs.Tab>\n ))}\n </BaseTabs.List>\n </div>\n\n {tabs.map((tab) => (\n <BaseTabs.Panel key={tab.id} value={tab.id} className={cn(\"mt-5\")}>\n {tab.content}\n </BaseTabs.Panel>\n ))}\n </BaseTabs.Root>\n );\n};\n"],"names":["_jsxs","BaseTabs","_jsx"],"mappings":"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"}
@@ -5,14 +5,18 @@ import { forwardRef } from 'react';
5
5
  import { cn } from '../libs/utils.js';
6
6
  import { fieldLabel, state, rim, material, focusRing, shape, density, fieldMessage, fieldLayout } from './ui.common.js';
7
7
  import { motionFeedback } from './ui.motion.js';
8
+ import { FieldLabel } from './FieldLabel.js';
8
9
 
9
- const Textarea = forwardRef(({ label, description, className, textareaClassName, required, error = false, errorMessage, id, name, disabled, onValueChange, value, defaultValue, ...textareaProps }, ref) => {
10
- return (jsxs(Field.Root, { className: cn(fieldLayout, className), name: name, disabled: disabled, invalid: error, children: [label && (jsxs(Field.Label, { className: cn(fieldLabel), children: [label, required && jsx("span", { className: cn("ms-1 text-sherick-danger"), "aria-hidden": "true", children: "*" })] })), jsx(Field.Control, { render: jsx("textarea", { ...textareaProps, ref: ref }), id: id, name: name, required: required, disabled: disabled, value: value, defaultValue: defaultValue, onValueChange: onValueChange, className: (controlState) => {
10
+ const Textarea = forwardRef(({ label, description, className, textareaClassName, required, error, errorMessage, id, name, disabled, onValueChange, value, defaultValue, ...textareaProps }, ref) => {
11
+ /* An `error` that is a message, or a flag with the message beside it: both mark the field invalid. */
12
+ const invalidByProp = Boolean(error);
13
+ const errorText = typeof error === "boolean" || error == null ? errorMessage : error;
14
+ return (jsxs(Field.Root, { className: cn(fieldLayout, className), name: name, disabled: disabled, invalid: invalidByProp, children: [label && (jsx(Field.Label, { className: cn(fieldLabel), children: jsx(FieldLabel, { required: required, children: label }) })), jsx(Field.Control, { render: jsx("textarea", { ...textareaProps, ref: ref }), id: id, name: name, required: required, disabled: disabled, value: value, defaultValue: defaultValue, onValueChange: onValueChange, className: (controlState) => {
11
15
  /* Invalid by its own prop, or by what Base reports — a failed constraint, or the error a
12
16
  `Form` returns for this field's name: one field, one ladder. */
13
- const invalid = error || controlState.valid === false;
17
+ const invalid = invalidByProp || controlState.valid === false;
14
18
  return cn("min-w-0 w-full resize-y", density.normal, "min-h-28 px-5 py-4", shape.control, motionFeedback, focusRing, invalid ? material.controlError : material.control, rim.field, !disabled && (invalid ? state.field.errorHover : state.field.hover), !disabled && (invalid ? state.field.errorFocus : state.field.focus), disabled ? state.disabled : state.text, textareaClassName);
15
- } }), description && (jsx(Field.Description, { className: cn(fieldMessage.description), children: description })), !(error && !errorMessage) && (jsx(Field.Error, { match: error ? true : undefined, className: cn(fieldMessage.error), ...(error ? { children: errorMessage } : {}) }))] }));
19
+ } }), description && (jsx(Field.Description, { className: cn(fieldMessage.description), children: description })), !(invalidByProp && !errorText) && (jsx(Field.Error, { match: invalidByProp ? true : undefined, className: cn(fieldMessage.error), ...(invalidByProp ? { children: errorText } : {}) }))] }));
16
20
  });
17
21
  Textarea.displayName = "Textarea";
18
22
 
@@ -1 +1 @@
1
- {"version":3,"file":"Textarea.js","sources":["../../../src/components/Textarea.tsx"],"sourcesContent":["\"use client\";\n\nimport { Field } from \"@base-ui/react/field\";\nimport React, {\n forwardRef,\n type ComponentProps,\n type ReactNode,\n type TextareaHTMLAttributes,\n} from \"react\";\nimport { cn } from \"@/libs/utils\";\nimport {\n density,\n fieldLabel,\n fieldLayout,\n fieldMessage,\n focusRing,\n material,\n rim,\n shape,\n state,\n} from \"./ui.common\";\nimport { motionFeedback } from \"./ui.motion\";\n\nexport interface TextareaProps\n extends TextareaHTMLAttributes<HTMLTextAreaElement> {\n label?: ReactNode;\n description?: ReactNode;\n error?: boolean;\n errorMessage?: ReactNode;\n textareaClassName?: string;\n /** Base's value-change callback, event details included. */\n onValueChange?: ComponentProps<typeof Field.Control>[\"onValueChange\"];\n}\n\nconst Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(\n ({\n label,\n description,\n className,\n textareaClassName,\n required,\n error = false,\n errorMessage,\n id,\n name,\n disabled,\n onValueChange,\n value,\n defaultValue,\n ...textareaProps\n }, ref) => {\n return (\n <Field.Root\n className={cn(fieldLayout, className)}\n name={name}\n disabled={disabled}\n invalid={error}\n >\n {label && (\n <Field.Label className={cn(fieldLabel)}>\n {label}\n {required && <span className={cn(\"ms-1 text-sherick-danger\")} aria-hidden=\"true\">*</span>}\n </Field.Label>\n )}\n <Field.Control\n render={<textarea {...textareaProps} ref={ref} />}\n id={id}\n name={name}\n required={required}\n disabled={disabled}\n value={value}\n defaultValue={defaultValue}\n onValueChange={onValueChange}\n className={(controlState) => {\n /* Invalid by its own prop, or by what Base reports — a failed constraint, or the error a\n `Form` returns for this field's name: one field, one ladder. */\n const invalid = error || controlState.valid === false;\n return cn(\n \"min-w-0 w-full resize-y\",\n density.normal,\n \"min-h-28 px-5 py-4\",\n shape.control,\n motionFeedback,\n focusRing,\n invalid ? material.controlError : material.control,\n rim.field,\n !disabled && (invalid ? state.field.errorHover : state.field.hover),\n !disabled && (invalid ? state.field.errorFocus : state.field.focus),\n disabled ? state.disabled : state.text,\n textareaClassName\n );\n }}\n />\n {description && (\n <Field.Description className={cn(fieldMessage.description)}>\n {description}\n </Field.Description>\n )}\n {/* Mounted whether or not a message was passed, as `Field`'s is: without `match` this part\n renders what Base reports, including the error a `Form` returns for this field's name. */}\n {!(error && !errorMessage) && (\n <Field.Error\n match={error ? true : undefined}\n className={cn(fieldMessage.error)}\n {...(error ? { children: errorMessage } : {})}\n />\n )}\n </Field.Root>\n );\n }\n);\n\nTextarea.displayName = \"Textarea\";\n\nexport default Textarea;\n"],"names":["_jsxs","_jsx"],"mappings":"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"}
1
+ {"version":3,"file":"Textarea.js","sources":["../../../src/components/Textarea.tsx"],"sourcesContent":["\"use client\";\n\nimport { Field } from \"@base-ui/react/field\";\nimport React, {\n forwardRef,\n type ComponentProps,\n type ReactNode,\n type TextareaHTMLAttributes,\n} from \"react\";\nimport { cn } from \"@/libs/utils\";\nimport {\n density,\n fieldLabel,\n fieldLayout,\n fieldMessage,\n focusRing,\n material,\n rim,\n shape,\n state,\n} from \"./ui.common\";\nimport { motionFeedback } from \"./ui.motion\";\nimport FieldLabel from \"./FieldLabel\";\n\nexport interface TextareaProps\n extends TextareaHTMLAttributes<HTMLTextAreaElement> {\n label?: ReactNode;\n description?: ReactNode;\n /**\n * Marks the field invalid. A message is shown beneath it, so a `ReactNode` here is both the flag and\n * its message. `true` marks the field without one, and `errorMessage` supplies the message.\n */\n error?: ReactNode;\n /** The message for `error={true}`. A message passed as `error` takes its place. */\n errorMessage?: ReactNode;\n textareaClassName?: string;\n /** Base's value-change callback, event details included. */\n onValueChange?: ComponentProps<typeof Field.Control>[\"onValueChange\"];\n}\n\nconst Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(\n ({\n label,\n description,\n className,\n textareaClassName,\n required,\n error,\n errorMessage,\n id,\n name,\n disabled,\n onValueChange,\n value,\n defaultValue,\n ...textareaProps\n }, ref) => {\n /* An `error` that is a message, or a flag with the message beside it: both mark the field invalid. */\n const invalidByProp = Boolean(error);\n const errorText = typeof error === \"boolean\" || error == null ? errorMessage : error;\n\n return (\n <Field.Root\n className={cn(fieldLayout, className)}\n name={name}\n disabled={disabled}\n invalid={invalidByProp}\n >\n {label && (\n <Field.Label className={cn(fieldLabel)}>\n <FieldLabel required={required}>{label}</FieldLabel>\n </Field.Label>\n )}\n <Field.Control\n render={<textarea {...textareaProps} ref={ref} />}\n id={id}\n name={name}\n required={required}\n disabled={disabled}\n value={value}\n defaultValue={defaultValue}\n onValueChange={onValueChange}\n className={(controlState) => {\n /* Invalid by its own prop, or by what Base reports — a failed constraint, or the error a\n `Form` returns for this field's name: one field, one ladder. */\n const invalid = invalidByProp || controlState.valid === false;\n return cn(\n \"min-w-0 w-full resize-y\",\n density.normal,\n \"min-h-28 px-5 py-4\",\n shape.control,\n motionFeedback,\n focusRing,\n invalid ? material.controlError : material.control,\n rim.field,\n !disabled && (invalid ? state.field.errorHover : state.field.hover),\n !disabled && (invalid ? state.field.errorFocus : state.field.focus),\n disabled ? state.disabled : state.text,\n textareaClassName\n );\n }}\n />\n {description && (\n <Field.Description className={cn(fieldMessage.description)}>\n {description}\n </Field.Description>\n )}\n {/* Mounted whether or not a message was passed, as `Field`'s is: without `match` this part\n renders what Base reports, including the error a `Form` returns for this field's name. */}\n {!(invalidByProp && !errorText) && (\n <Field.Error\n match={invalidByProp ? true : undefined}\n className={cn(fieldMessage.error)}\n {...(invalidByProp ? { children: errorText } : {})}\n />\n )}\n </Field.Root>\n );\n }\n);\n\nTextarea.displayName = \"Textarea\";\n\nexport default Textarea;\n"],"names":["_jsxs","_jsx"],"mappings":"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"}
@@ -2,23 +2,38 @@
2
2
  import { jsx, jsxs } from 'react/jsx-runtime';
3
3
  import { Toast } from '@base-ui/react/toast';
4
4
  import { useMemo } from 'react';
5
- import { HugeiconsIcon } from '@hugeicons/react';
6
- import { Cancel01Icon, InformationCircleIcon, Alert02Icon, CancelCircleIcon, CheckmarkCircle02Icon } from '@hugeicons/core-free-icons';
7
5
  import { cn } from '../libs/utils.js';
8
6
  import Button from './Button.js';
7
+ import DismissButton from './DismissButton.js';
9
8
  import { Spinner } from './Spinner.js';
10
- import { text, type, iconStroke, state, stateLayer, focusRingInset, shape, density, overlay, stacking, tone } from './ui.common.js';
11
- import { motionInkPress, motionFeedback, motionPresenceToast } from './ui.motion.js';
9
+ import { StatusMark } from './StatusMark.js';
10
+ import { text, type, overlay, stacking } from './ui.common.js';
11
+ import { motionFeedback, motionPresenceToast } from './ui.motion.js';
12
12
 
13
13
  /* The provider needs Base's own object back, and the only managers that can be handed to it are
14
14
  the ones this module built. Keeping the pair in a map rather than on the wrapper leaves the
15
15
  public type free of anything a consumer could reach for and depend on. */
16
16
  const baseManagers = new WeakMap();
17
+ /* A toast that asks for a decision, or reports a failure, must not leave before it has been read: an
18
+ action waits to be taken and a danger waits to be acknowledged. A caller that names a timeout keeps
19
+ it, so this is a default and not a rule. */
20
+ const stickyUnlessTimed = (options) => options.timeout === undefined && (options.actionProps !== undefined || options.type === "danger")
21
+ ? { ...options, timeout: 0 }
22
+ : options;
23
+ /* A promise state is either a line, which needs no default, or an options object that can be sticky. */
24
+ const stickyState = (state) => typeof state === "string" ? state : stickyUnlessTimed(state);
17
25
  const narrow = (base) => ({
18
- add: (options) => base.add(options),
19
- update: (id, options) => base.update(id, options),
26
+ add: (options) => base.add(stickyUnlessTimed(options)),
27
+ update: (id, options) => base.update(id, stickyUnlessTimed(options)),
20
28
  close: (id) => base.close(id),
21
- promise: (value, options) => base.promise(value, options),
29
+ promise: (value, options) => {
30
+ const { loading, success, error } = options;
31
+ return base.promise(value, {
32
+ loading: stickyState(loading),
33
+ success: typeof success === "function" ? (result) => stickyState(success(result)) : stickyState(success),
34
+ error: typeof error === "function" ? (reason) => stickyState(error(reason)) : stickyState(error),
35
+ });
36
+ },
22
37
  });
23
38
  const baseOf = (manager) => {
24
39
  const base = baseManagers.get(manager);
@@ -27,25 +42,25 @@ const baseOf = (manager) => {
27
42
  }
28
43
  return base;
29
44
  };
30
- /* The mark a toast takes from what it is reporting, and the tone that goes with it. Base's promise
31
- states are in this map because `promise()` sets them itself: loading, success and error are
32
- states of one lifecycle rather than roles a caller chose, and a state left out of the map would
33
- silently lose its mark and its tone. `loading` is the one that is not a status glyph — it is
34
- ongoing work, so it carries the same activity the library's `Spinner` does. */
35
- const markIcon = (icon, className) => (jsx(HugeiconsIcon, { icon: icon, "aria-hidden": "true", className: cn(iconStroke.glyph, "size-5 shrink-0", className) }));
36
- const toastMark = (type) => {
37
- switch (type) {
45
+ /* The mark a toast takes from what it is reporting. Base's promise states are in this map because
46
+ `promise()` sets them itself: loading, success and error are states of one lifecycle rather than
47
+ roles a caller chose, and a state left out of the map would silently lose its mark and its tone.
48
+ `loading` is the one that is not a status glyph — it is ongoing work, so it carries the same
49
+ activity the library's `Spinner` does. Every status glyph comes from `StatusMark`, so a toast and an
50
+ alert draw the same mark for the same status. */
51
+ const toastMark = (status) => {
52
+ switch (status) {
38
53
  case "loading":
39
- return jsx(Spinner, { size: "small", className: cn("size-5") });
54
+ return jsx(Spinner, { size: "small", label: "Loading", className: cn("size-5") });
40
55
  case "success":
41
- return markIcon(CheckmarkCircle02Icon, tone.text.success);
56
+ return jsx(StatusMark, { variant: "success" });
42
57
  case "error":
43
58
  case "danger":
44
- return markIcon(CancelCircleIcon, tone.text.danger);
59
+ return jsx(StatusMark, { variant: "danger" });
45
60
  case "warning":
46
- return markIcon(Alert02Icon, tone.text.warning);
61
+ return jsx(StatusMark, { variant: "warning" });
47
62
  case "info":
48
- return markIcon(InformationCircleIcon, tone.text.primary);
63
+ return jsx(StatusMark, { variant: "primary" });
49
64
  default:
50
65
  return null;
51
66
  }
@@ -54,16 +69,19 @@ const toastMark = (type) => {
54
69
  so a toast raised with only a description would publish an unnamed dialog — a role with no
55
70
  accessible name. The state it reports names it instead in that case, which is what an
56
71
  assistive technology has left to announce; the description is still what it reads out, because
57
- Base points the toast's own `aria-describedby` at it. A toast raised with a title is untouched.
58
- The copy is this package's, like every other name the library gives a control it renders. */
59
- const toastTypeName = {
72
+ Base points the toast's own `aria-describedby` at it. A toast raised with a title is untouched. */
73
+ const defaultLabels = {
60
74
  info: "Information",
61
75
  success: "Success",
62
76
  warning: "Warning",
63
77
  danger: "Error",
64
78
  error: "Error",
65
79
  loading: "Working",
80
+ notification: "Notification",
66
81
  };
82
+ const nameFor = (names, status) => status !== undefined && Object.prototype.hasOwnProperty.call(names, status)
83
+ ? names[status]
84
+ : names.notification;
67
85
  /* Where the stack sits, where a toast rests inside the viewport, and which way it grows. A stack
68
86
  anchored to the bottom grows upward and a toast leaves downward, so one signed factor carries
69
87
  both the resting offset and the edge a new toast arrives from. The horizontal inset is
@@ -112,31 +130,26 @@ const ToastProvider = ({ children, manager, ...props }) => (jsx(Toast.Provider,
112
130
  * is holding. Base provides F6 entry and focus restoration; the live region remains available
113
131
  * while a modal is open. Keep the keyboard shortcut discoverable without reimplementing it.
114
132
  */
115
- const ToastViewport = ({ position = "bottom-end", className }) => {
133
+ const ToastViewport = ({ position = "bottom-end", dismissLabel = "Dismiss", labels, className, }) => {
116
134
  const { toasts } = Toast.useToastManager();
117
135
  const geometry = positionLayout[position];
136
+ const names = { ...defaultLabels, ...labels };
118
137
  return (jsx(Toast.Portal, { children: jsx(Toast.Viewport, { "aria-keyshortcuts": "F6", className: cn("fixed flex w-[calc(100%-3rem)] flex-col sm:w-[22.5rem]", stacking.notification, geometry.viewport, className), children: toasts.map((toast) => {
119
- var _a, _b;
120
138
  const mark = toastMark(toast.type);
121
- return (jsx(Toast.Root, { toast: toast, "aria-label": toast.title ? undefined : (_b = toastTypeName[String((_a = toast.type) !== null && _a !== void 0 ? _a : "")]) !== null && _b !== void 0 ? _b : "Notification", className: cn(
139
+ return (jsx(Toast.Root, { toast: toast, "aria-label": toast.title ? undefined : nameFor(names, toast.type), className: cn(
122
140
  /* The stack's own geometry: each toast is anchored to the same viewport corner,
123
141
  sits one shortened step behind the one in front of it, and the stack clamps every
124
142
  root to the frontmost toast's height so a collapsed stack shows one surface with
125
143
  a sliver of each of the others. Expanding rests every root at its own height
126
144
  again. The signed factor is the only difference between a stack that grows up and
127
145
  one that grows down. */
128
- "[--gap:0.75rem] [--peek:0.75rem]", "[--scale:calc(max(0,1-(var(--toast-index)*0.1)))]", "[--shrink:calc(1-var(--scale))]", "[--height:var(--toast-frontmost-height,var(--toast-height))]", "[--offset-y:calc(var(--sui-toast-stack-sign)*(var(--toast-offset-y)+var(--toast-index)*var(--gap))+var(--toast-swipe-movement-y,0px))]", "absolute z-[calc(1000-var(--toast-index))] w-full select-none overflow-hidden", geometry.anchor, geometry.sign, geometry.from, "[transform:translateX(var(--toast-swipe-movement-x,0px))_translateY(calc(var(--toast-swipe-movement-y,0px)+var(--sui-toast-stack-sign)*(var(--toast-index)*var(--peek)+var(--shrink)*var(--height))))_scale(var(--scale))]", "h-[var(--height)] data-[expanded]:h-[var(--toast-height)]", "data-[expanded]:[transform:translateX(var(--toast-swipe-movement-x,0px))_translateY(var(--offset-y))]", "data-[limited]:opacity-0", overlay.toast, motionPresenceToast), children: jsxs(Toast.Content, { className: cn("flex max-h-[calc(100dvh-3rem)] items-start gap-3 overflow-y-auto overscroll-contain p-4 [overflow-wrap:anywhere]", motionFeedback, "data-[behind]:opacity-0 data-[expanded]:opacity-100"), children: [mark ? (jsx("span", { className: cn("inline-flex h-6 shrink-0 items-center"), children: mark })) : null, jsxs("div", { className: cn("flex min-w-0 flex-1 flex-col gap-0.5"), children: [toast.title ? (jsx(Toast.Title, { className: cn(type.title, text.high) })) : null, toast.description ? (jsx(Toast.Description, { className: cn(type.body, text.medium) })) : null, toast.actionProps ? (
146
+ "[--gap:0.75rem] [--peek:0.75rem]", "[--scale:calc(max(0,1-(var(--toast-index)*0.1)))]", "[--shrink:calc(1-var(--scale))]", "[--height:var(--toast-frontmost-height,var(--toast-height))]", "[--offset-y:calc(var(--sui-toast-stack-sign)*(var(--toast-offset-y)+var(--toast-index)*var(--gap))+var(--toast-swipe-movement-y,0px))]", "absolute z-[calc(1000-var(--toast-index))] w-full select-none overflow-hidden", geometry.anchor, geometry.sign, geometry.from, "[transform:translateX(var(--toast-swipe-movement-x,0px))_translateY(calc(var(--toast-swipe-movement-y,0px)+var(--sui-toast-stack-sign)*(var(--toast-index)*var(--peek)+var(--shrink)*var(--height))))_scale(var(--scale))]", "h-[var(--height)] data-[expanded]:h-[var(--toast-height)]", "data-[expanded]:[transform:translateX(var(--toast-swipe-movement-x,0px))_translateY(var(--offset-y))]", "data-[limited]:opacity-0", overlay.toast, motionPresenceToast), children: jsxs(Toast.Content, { className: cn("flex max-h-[calc(100dvh-3rem)] items-start gap-3 overflow-y-auto overscroll-contain p-4 [overflow-wrap:anywhere]", motionFeedback, "data-[behind]:opacity-0 data-[expanded]:opacity-100"), children: [mark ? (jsx("span", { className: cn("inline-flex h-6 shrink-0 items-center"), children: mark })) : null, jsxs("div", { className: cn("flex min-w-0 flex-1 flex-col gap-1"), children: [toast.title ? (jsx(Toast.Title, { className: cn(type.title, text.high) })) : null, toast.description ? (jsx(Toast.Description, { className: cn(type.body, text.medium) })) : null, toast.actionProps ? (
129
147
  /* Actions follow the copy instead of squeezing it between three controls.
130
148
  Give back the small text button's start padding, moving the whole target. */
131
- jsx(Toast.Action, { render: jsx(Button, { appearance: "text", variant: "primary", size: "sm", className: cn("-ms-4 mt-2 self-start"), children: toast.actionProps.children }) })) : null] }), jsx(Toast.Close, { "aria-label": "Dismiss", className: cn(density.target, shape.circle,
132
- /* Centre the 44px target on the first line and give back its excess on BOTH
133
- vertical edges: a top-only offset leaves 10–12px below a one-line toast.
134
- The whole target stays intact, with an inset ring inside the clipped root.
135
- Its inline end padding is compensated separately. */
136
- "group -me-2 inline-flex shrink-0 items-center justify-center",
137
- /* Half the target minus half the first line: the title and the description both
138
- set a 24px line, so the target gives back 10px either way. */
139
- "-my-2.5", text.medium, "hover:text-sherick-ink", motionFeedback, focusRingInset, stateLayer.quiet, state.enabled), children: jsx("span", { className: cn("inline-flex items-center justify-center", motionInkPress), children: jsx(HugeiconsIcon, { icon: Cancel01Icon, className: cn(iconStroke.glyph, "size-4"), "aria-hidden": "true" }) }) })] }) }, toast.id));
149
+ jsx(Toast.Action, { render: jsx(Button, { appearance: "text", variant: "primary", size: "sm", className: cn("-ms-4 mt-1 self-start"), children: toast.actionProps.children }) })) : null] }), jsx(Toast.Close, { render: jsx(DismissButton, { label: dismissLabel, size: "compact", inRow: true,
150
+ /* Half the target minus half the first line: the title and the description both
151
+ set a 24px line, so the target gives back 10px either way. */
152
+ className: cn("-me-2 -my-2.5") }) })] }) }, toast.id));
140
153
  }) }) }));
141
154
  };
142
155
  /**