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
@@ -3,12 +3,14 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var jsxRuntime = require('react/jsx-runtime');
6
+ var React = require('react');
6
7
  var utils = require('../libs/utils.cjs');
7
8
  var ui_common = require('./ui.common.cjs');
8
9
 
9
- const Badge = ({ children, variant = "secondary", icon, className, ...props }) => {
10
- return (jsxRuntime.jsxs("span", { ...props, className: utils.cn("inline-flex min-h-7 min-w-0 max-w-full items-center justify-center gap-1.5 px-3 py-1 font-semibold", ui_common.type.caption, ui_common.shape.pill, ui_common.tone.soft[variant], ui_common.text.high, className), children: [icon && (jsxRuntime.jsx("span", { className: utils.cn(ui_common.iconSlot.caption, ui_common.tone.text[variant]), "aria-hidden": "true", children: icon })), jsxRuntime.jsx("span", { className: utils.cn("min-w-0 truncate"), children: children })] }));
11
- };
10
+ const Badge = React.forwardRef(({ children, variant = "secondary", icon, className, ...props }, ref) => {
11
+ return (jsxRuntime.jsxs("span", { ...props, ref: ref, className: utils.cn("inline-flex min-h-7 min-w-0 max-w-full items-center justify-center gap-1.5 px-3 py-1 font-semibold", ui_common.type.caption, ui_common.shape.pill, ui_common.tone.soft[variant], ui_common.text.high, className), children: [icon && (jsxRuntime.jsx("span", { className: utils.cn(ui_common.iconSlot.caption, ui_common.tone.text[variant]), "aria-hidden": "true", children: icon })), jsxRuntime.jsx("span", { className: utils.cn("min-w-0 truncate"), children: children })] }));
12
+ });
13
+ Badge.displayName = "Badge";
12
14
 
13
15
  exports.default = Badge;
14
16
  //# sourceMappingURL=Badge.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Badge.cjs","sources":["../../../src/components/Badge.tsx"],"sourcesContent":["import React, { type HTMLAttributes, type ReactNode } from \"react\";\nimport { cn } from \"@/libs/utils\";\nimport { iconSlot, shape, text, tone, type } from \"./ui.common\";\nimport { Variant } from \"./ui.types\";\n\nexport interface BadgeProps extends HTMLAttributes<HTMLSpanElement> {\n children: ReactNode;\n variant?: Variant;\n icon?: ReactNode;\n}\n\nconst Badge = ({\n children,\n variant = \"secondary\",\n icon,\n className,\n ...props\n}: BadgeProps) => {\n return (\n <span\n {...props}\n className={cn(\n \"inline-flex min-h-7 min-w-0 max-w-full items-center justify-center gap-1.5 px-3 py-1 font-semibold\",\n type.caption,\n shape.pill,\n tone.soft[variant],\n text.high,\n className\n )}\n >\n {/* A badge gives its leading mark one predictable slot: 14px, held at that size whatever artwork\n a caller hands in, with the box — not the artwork's own whitespace — aligned to the label. */}\n {icon && (\n <span className={cn(iconSlot.caption, tone.text[variant])} aria-hidden=\"true\">\n {icon}\n </span>\n )}\n <span className={cn(\"min-w-0 truncate\")}>{children}</span>\n </span>\n );\n};\n\nexport default Badge;\n"],"names":["_jsxs","cn","type","shape","tone","text","_jsx","iconSlot"],"mappings":";;;;;;;;AAWA,MAAM,KAAK,GAAG,CAAC,EACb,QAAQ,EACR,OAAO,GAAG,WAAW,EACrB,IAAI,EACJ,SAAS,EACT,GAAG,KAAK,EACG,KAAI;AACf,IAAA,QACEA,eAAA,CAAA,MAAA,EAAA,EAAA,GACM,KAAK,EACT,SAAS,EAAEC,QAAE,CACX,oGAAoG,EACpGC,cAAI,CAAC,OAAO,EACZC,eAAK,CAAC,IAAI,EACVC,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAClBC,cAAI,CAAC,IAAI,EACT,SAAS,CACV,EAAA,QAAA,EAAA,CAIA,IAAI,KACHC,cAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAEL,QAAE,CAACM,kBAAQ,CAAC,OAAO,EAAEH,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAA,aAAA,EAAc,MAAM,EAAA,QAAA,EAC1E,IAAI,EAAA,CACA,CACR,EACDE,cAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAEL,QAAE,CAAC,kBAAkB,CAAC,EAAA,QAAA,EAAG,QAAQ,EAAA,CAAQ,CAAA,EAAA,CACrD;AAEX;;"}
1
+ {"version":3,"file":"Badge.cjs","sources":["../../../src/components/Badge.tsx"],"sourcesContent":["import React, { forwardRef, type HTMLAttributes, type ReactNode } from \"react\";\nimport { cn } from \"@/libs/utils\";\nimport { iconSlot, shape, text, tone, type } from \"./ui.common\";\nimport { Variant } from \"./ui.types\";\n\nexport interface BadgeProps extends HTMLAttributes<HTMLSpanElement> {\n children: ReactNode;\n variant?: Variant;\n icon?: ReactNode;\n}\n\nconst Badge = forwardRef<HTMLSpanElement, BadgeProps>(\n ({ children, variant = \"secondary\", icon, className, ...props }, ref) => {\n return (\n <span\n {...props}\n ref={ref}\n className={cn(\n \"inline-flex min-h-7 min-w-0 max-w-full items-center justify-center gap-1.5 px-3 py-1 font-semibold\",\n type.caption,\n shape.pill,\n tone.soft[variant],\n text.high,\n className\n )}\n >\n {/* A badge gives its leading mark one predictable slot: 14px, held at that size whatever artwork\n a caller hands in, with the box — not the artwork's own whitespace — aligned to the label. */}\n {icon && (\n <span className={cn(iconSlot.caption, tone.text[variant])} aria-hidden=\"true\">\n {icon}\n </span>\n )}\n <span className={cn(\"min-w-0 truncate\")}>{children}</span>\n </span>\n );\n }\n);\n\nBadge.displayName = \"Badge\";\n\nexport default Badge;\n"],"names":["forwardRef","_jsxs","cn","type","shape","tone","text","_jsx","iconSlot"],"mappings":";;;;;;;;;AAWA,MAAM,KAAK,GAAGA,gBAAU,CACtB,CAAC,EAAE,QAAQ,EAAE,OAAO,GAAG,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,KAAI;AACtE,IAAA,QACEC,eAAA,CAAA,MAAA,EAAA,EAAA,GACM,KAAK,EACT,GAAG,EAAE,GAAG,EACR,SAAS,EAAEC,QAAE,CACX,oGAAoG,EACpGC,cAAI,CAAC,OAAO,EACZC,eAAK,CAAC,IAAI,EACVC,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAClBC,cAAI,CAAC,IAAI,EACT,SAAS,CACV,EAAA,QAAA,EAAA,CAIA,IAAI,KACHC,cAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAEL,QAAE,CAACM,kBAAQ,CAAC,OAAO,EAAEH,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAA,aAAA,EAAc,MAAM,EAAA,QAAA,EAC1E,IAAI,EAAA,CACA,CACR,EACDE,cAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAEL,QAAE,CAAC,kBAAkB,CAAC,EAAA,QAAA,EAAG,QAAQ,EAAA,CAAQ,CAAA,EAAA,CACrD;AAEX,CAAC;AAGH,KAAK,CAAC,WAAW,GAAG,OAAO;;"}
@@ -9,6 +9,9 @@ var React = require('react');
9
9
  var utils = require('../libs/utils.cjs');
10
10
  var ui_common = require('./ui.common.cjs');
11
11
 
12
+ const defaultBreadcrumbLabels = {
13
+ navigation: "Breadcrumb",
14
+ };
12
15
  /* The trail of places a reader came through. It is **passive**: links and text, no state, no effect
13
16
  and no client directive, so a server component renders it and a page that only reads it ships no
14
17
  behaviour.
@@ -25,21 +28,22 @@ var ui_common = require('./ui.common.cjs');
25
28
  assistive technology. Long labels wrap and the trail yields to a narrow parent instead of
26
29
  collapsing, truncating or hiding a place — which places are behind the reader is information, and a
27
30
  breadcrumb that hides one is a breadcrumb that lies. */
28
- const Breadcrumb = React.forwardRef(({ items, renderLink, className, "aria-label": ariaLabel, ...props }, ref) => {
31
+ const Breadcrumb = React.forwardRef(({ items, renderLink, labels, className, "aria-label": ariaLabel, ...props }, ref) => {
32
+ const copy = { ...defaultBreadcrumbLabels, ...labels };
29
33
  /* The props an intermediate destination is rendered from, composed once so the caller's own link
30
34
  and the default anchor are the same object: the same destination, the same content and the same
31
35
  shared classes — including the focus ring the keyboard needs to see. */
32
36
  const linkProps = (item) => ({
33
37
  href: item.href,
34
- className: utils.cn("min-w-0 no-underline [overflow-wrap:anywhere]", ui_common.focusRing, ui_common.text.medium, "hover:text-sherick-ink"),
38
+ className: utils.cn("min-w-0 no-underline [overflow-wrap:anywhere]", ui_common.focusRing, ui_common.state.quietInk),
35
39
  children: item.label,
36
40
  });
37
- return (jsxRuntime.jsx("nav", { ...props, ref: ref, "aria-label": ariaLabel !== null && ariaLabel !== void 0 ? ariaLabel : "Breadcrumb", className: utils.cn("min-w-0", ui_common.type.body, className), children: jsxRuntime.jsx("ol", { role: "list", className: utils.cn("m-0 flex min-w-0 list-none flex-wrap items-start gap-x-2 gap-y-1 p-0", ui_common.text.medium), children: items.map((item, index) => {
41
+ return (jsxRuntime.jsx("nav", { ...props, ref: ref, "aria-label": ariaLabel !== null && ariaLabel !== void 0 ? ariaLabel : copy.navigation, className: utils.cn("min-w-0", ui_common.type.body, className), children: jsxRuntime.jsx("ol", { role: "list", className: utils.cn("m-0 flex min-w-0 list-none flex-wrap items-start gap-x-2 gap-y-1 p-0", ui_common.text.medium), children: items.map((item, index) => {
38
42
  const isCurrent = index === items.length - 1;
39
43
  return (jsxRuntime.jsxs("li", { className: utils.cn("flex min-w-0 items-start gap-x-2"), children: [index > 0 && (
40
44
  /* One inherited line box centers the glyph on the label's first line, even when
41
45
  the label wraps or a consumer changes the trail's line-height. */
42
- jsxRuntime.jsx("span", { "aria-hidden": "true", className: utils.cn("inline-flex h-[1lh] w-4 shrink-0 items-center"), children: jsxRuntime.jsx(react.HugeiconsIcon, { icon: coreFreeIcons.ArrowRight01Icon, "aria-hidden": "true", className: utils.cn(ui_common.iconStroke.glyph, "size-4 rtl:-scale-x-100") }) })), isCurrent ? (jsxRuntime.jsx("span", { "aria-current": "page", className: utils.cn("min-w-0 font-medium [overflow-wrap:anywhere]", ui_common.text.high), children: item.label })) : item.href !== undefined ? (renderLink ? (renderLink(item, linkProps(item))) : (jsxRuntime.jsx("a", { ...linkProps(item) }))) : (jsxRuntime.jsx("span", { className: utils.cn("min-w-0 [overflow-wrap:anywhere]"), children: item.label }))] }, index));
46
+ jsxRuntime.jsx("span", { "aria-hidden": "true", className: utils.cn(ui_common.iconSlot.compact, "h-[1lh] w-4"), children: jsxRuntime.jsx(react.HugeiconsIcon, { icon: coreFreeIcons.ArrowRight01Icon, "aria-hidden": "true", className: utils.cn(ui_common.iconStroke.glyph, "rtl:-scale-x-100") }) })), isCurrent ? (jsxRuntime.jsx("span", { "aria-current": "page", className: utils.cn("min-w-0 font-medium [overflow-wrap:anywhere]", ui_common.text.high), children: item.label })) : item.href !== undefined ? (renderLink ? (renderLink(item, linkProps(item))) : (jsxRuntime.jsx("a", { ...linkProps(item) }))) : (jsxRuntime.jsx("span", { className: utils.cn("min-w-0 [overflow-wrap:anywhere]"), children: item.label }))] }, index));
43
47
  }) }) }));
44
48
  });
45
49
  Breadcrumb.displayName = "Breadcrumb";
@@ -1 +1 @@
1
- {"version":3,"file":"Breadcrumb.cjs","sources":["../../../src/components/Breadcrumb.tsx"],"sourcesContent":["import { HugeiconsIcon } from \"@hugeicons/react\";\nimport { ArrowRight01Icon } from \"@hugeicons/core-free-icons\";\nimport {\n forwardRef,\n type AnchorHTMLAttributes,\n type ComponentPropsWithoutRef,\n type ReactNode,\n} from \"react\";\nimport { cn } from \"@/libs/utils\";\nimport { focusRing, iconStroke, text, type } from \"./ui.common\";\n\nexport interface BreadcrumbItem {\n label: ReactNode;\n href?: string;\n}\n\nexport interface BreadcrumbProps extends Omit<ComponentPropsWithoutRef<\"nav\">, \"children\"> {\n items: BreadcrumbItem[];\n /**\n * How an intermediate destination is rendered — the escape hatch for a router link. The supplied\n * props carry the destination, the shared classes and the item's own content, and the renderer\n * spreads them onto its element.\n */\n renderLink?: (item: BreadcrumbItem, props: AnchorHTMLAttributes<HTMLAnchorElement>) => ReactNode;\n}\n\n/* The trail of places a reader came through. It is **passive**: links and text, no state, no effect\n and no client directive, so a server component renders it and a page that only reads it ships no\n behaviour.\n\n The last item is the page the reader is on, and it is text even when the caller supplies an href\n for it — a link to where you already are is a control with nothing left to do, and `aria-current`\n is what says which one it is. Every intermediate destination is a real anchor, so an ordinary\n click, a modified click and every browser affordance work the way they do everywhere else on the\n web: no router is required and none is assumed. `renderLink` is the caller's way to substitute its\n own link component, and it receives the href, the accessible relationship and the shared classes\n the plain anchor would have been given.\n\n Separators are decorative chevrons: they mirror with the writing direction and are hidden from\n assistive technology. Long labels wrap and the trail yields to a narrow parent instead of\n collapsing, truncating or hiding a place — which places are behind the reader is information, and a\n breadcrumb that hides one is a breadcrumb that lies. */\nconst Breadcrumb = forwardRef<HTMLElement, BreadcrumbProps>(\n ({ items, renderLink, className, \"aria-label\": ariaLabel, ...props }, ref) => {\n /* The props an intermediate destination is rendered from, composed once so the caller's own link\n and the default anchor are the same object: the same destination, the same content and the same\n shared classes — including the focus ring the keyboard needs to see. */\n const linkProps = (item: BreadcrumbItem): AnchorHTMLAttributes<HTMLAnchorElement> => ({\n href: item.href,\n className: cn(\"min-w-0 no-underline [overflow-wrap:anywhere]\", focusRing, text.medium, \"hover:text-sherick-ink\"),\n children: item.label,\n });\n\n return (\n <nav\n {...props}\n ref={ref}\n aria-label={ariaLabel ?? \"Breadcrumb\"}\n className={cn(\"min-w-0\", type.body, className)}\n >\n {/* A native ordered list: the trail has an order, and the order is the information. The row\n wraps rather than overflowing, so a long trail stays inside its column. `role=\"list\"`\n restates the element's own role rather than adding one, because `list-none` — which removes\n the marker a breadcrumb does not want — is also what makes Safari drop the semantics. */}\n <ol\n role=\"list\"\n className={cn(\n \"m-0 flex min-w-0 list-none flex-wrap items-start gap-x-2 gap-y-1 p-0\",\n text.medium\n )}\n >\n {items.map((item, index) => {\n const isCurrent = index === items.length - 1;\n\n return (\n <li key={index} className={cn(\"flex min-w-0 items-start gap-x-2\")}>\n {index > 0 && (\n /* One inherited line box centers the glyph on the label's first line, even when\n the label wraps or a consumer changes the trail's line-height. */\n <span aria-hidden=\"true\" className={cn(\"inline-flex h-[1lh] w-4 shrink-0 items-center\")}>\n <HugeiconsIcon icon={ArrowRight01Icon} aria-hidden=\"true\" className={cn(iconStroke.glyph, \"size-4 rtl:-scale-x-100\")} />\n </span>\n )}\n {isCurrent ? (\n <span\n aria-current=\"page\"\n className={cn(\"min-w-0 font-medium [overflow-wrap:anywhere]\", text.high)}\n >\n {item.label}\n </span>\n ) : item.href !== undefined ? (\n renderLink ? (\n renderLink(item, linkProps(item))\n ) : (\n <a {...linkProps(item)} />\n )\n ) : (\n <span className={cn(\"min-w-0 [overflow-wrap:anywhere]\")}>{item.label}</span>\n )}\n </li>\n );\n })}\n </ol>\n </nav>\n );\n }\n);\n\nBreadcrumb.displayName = \"Breadcrumb\";\n\nexport default Breadcrumb;\n"],"names":["forwardRef","cn","focusRing","text","_jsx","type","_jsxs","HugeiconsIcon","ArrowRight01Icon","iconStroke"],"mappings":";;;;;;;;;;;AA0BA;;;;;;;;;;;;;;;AAe0D;AAC1D,MAAM,UAAU,GAAGA,gBAAU,CAC3B,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,KAAI;AAC3E;;AAE0E;AAC1E,IAAA,MAAM,SAAS,GAAG,CAAC,IAAoB,MAA+C;QACpF,IAAI,EAAE,IAAI,CAAC,IAAI;AACf,QAAA,SAAS,EAAEC,QAAE,CAAC,+CAA+C,EAAEC,mBAAS,EAAEC,cAAI,CAAC,MAAM,EAAE,wBAAwB,CAAC;QAChH,QAAQ,EAAE,IAAI,CAAC,KAAK;AACrB,KAAA,CAAC;IAEF,QACEC,cAAA,CAAA,KAAA,EAAA,EAAA,GACM,KAAK,EACT,GAAG,EAAE,GAAG,EAAA,YAAA,EACI,SAAS,KAAA,IAAA,IAAT,SAAS,KAAA,MAAA,GAAT,SAAS,GAAI,YAAY,EACrC,SAAS,EAAEH,QAAE,CAAC,SAAS,EAAEI,cAAI,CAAC,IAAI,EAAE,SAAS,CAAC,EAAA,QAAA,EAM9CD,cAAA,CAAA,IAAA,EAAA,EACE,IAAI,EAAC,MAAM,EACX,SAAS,EAAEH,QAAE,CACX,sEAAsE,EACtEE,cAAI,CAAC,MAAM,CACZ,EAAA,QAAA,EAEA,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,KAAI;gBACzB,MAAM,SAAS,GAAG,KAAK,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC;AAE5C,gBAAA,QACEG,eAAA,CAAA,IAAA,EAAA,EAAgB,SAAS,EAAEL,QAAE,CAAC,kCAAkC,CAAC,EAAA,QAAA,EAAA,CAC9D,KAAK,GAAG,CAAC;AACR;AACoE;wBACpEG,cAAA,CAAA,MAAA,EAAA,EAAA,aAAA,EAAkB,MAAM,EAAC,SAAS,EAAEH,QAAE,CAAC,+CAA+C,CAAC,EAAA,QAAA,EACrFG,cAAA,CAACG,mBAAa,EAAA,EAAC,IAAI,EAAEC,8BAAgB,EAAA,aAAA,EAAc,MAAM,EAAC,SAAS,EAAEP,QAAE,CAACQ,oBAAU,CAAC,KAAK,EAAE,yBAAyB,CAAC,GAAI,EAAA,CACnH,CACR,EACA,SAAS,IACRL,cAAA,CAAA,MAAA,EAAA,EAAA,cAAA,EACe,MAAM,EACnB,SAAS,EAAEH,QAAE,CAAC,8CAA8C,EAAEE,cAAI,CAAC,IAAI,CAAC,EAAA,QAAA,EAEvE,IAAI,CAAC,KAAK,EAAA,CACN,IACL,IAAI,CAAC,IAAI,KAAK,SAAS,IACzB,UAAU,IACR,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,KAEjCC,cAAA,CAAA,GAAA,EAAA,EAAA,GAAO,SAAS,CAAC,IAAI,CAAC,EAAA,CAAI,CAC3B,KAEDA,cAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAEH,QAAE,CAAC,kCAAkC,CAAC,EAAA,QAAA,EAAG,IAAI,CAAC,KAAK,EAAA,CAAQ,CAC7E,CAAA,EAAA,EAvBM,KAAK,CAwBT;AAET,YAAA,CAAC,CAAC,EAAA,CACC,EAAA,CACD;AAEV,CAAC;AAGH,UAAU,CAAC,WAAW,GAAG,YAAY;;"}
1
+ {"version":3,"file":"Breadcrumb.cjs","sources":["../../../src/components/Breadcrumb.tsx"],"sourcesContent":["import { HugeiconsIcon } from \"@hugeicons/react\";\nimport { ArrowRight01Icon } from \"@hugeicons/core-free-icons\";\nimport {\n forwardRef,\n type AnchorHTMLAttributes,\n type ComponentPropsWithoutRef,\n type ReactNode,\n} from \"react\";\nimport { cn } from \"@/libs/utils\";\nimport { focusRing, iconSlot, iconStroke, state, text, type } from \"./ui.common\";\n\nexport interface BreadcrumbItem {\n label: ReactNode;\n href?: string;\n}\n\n/** The English copy a trail names itself with. */\nexport interface BreadcrumbLabels {\n /** The trail's accessible name. */\n navigation: string;\n}\n\nconst defaultBreadcrumbLabels: BreadcrumbLabels = {\n navigation: \"Breadcrumb\",\n};\n\nexport interface BreadcrumbProps extends Omit<ComponentPropsWithoutRef<\"nav\">, \"children\"> {\n items: BreadcrumbItem[];\n /**\n * How an intermediate destination is rendered — the escape hatch for a router link. The supplied\n * props carry the destination, the shared classes and the item's own content, and the renderer\n * spreads them onto its element.\n */\n renderLink?: (item: BreadcrumbItem, props: AnchorHTMLAttributes<HTMLAnchorElement>) => ReactNode;\n /** The English copy the trail names itself with. `aria-label` takes precedence over it. */\n labels?: Partial<BreadcrumbLabels>;\n}\n\n/* The trail of places a reader came through. It is **passive**: links and text, no state, no effect\n and no client directive, so a server component renders it and a page that only reads it ships no\n behaviour.\n\n The last item is the page the reader is on, and it is text even when the caller supplies an href\n for it — a link to where you already are is a control with nothing left to do, and `aria-current`\n is what says which one it is. Every intermediate destination is a real anchor, so an ordinary\n click, a modified click and every browser affordance work the way they do everywhere else on the\n web: no router is required and none is assumed. `renderLink` is the caller's way to substitute its\n own link component, and it receives the href, the accessible relationship and the shared classes\n the plain anchor would have been given.\n\n Separators are decorative chevrons: they mirror with the writing direction and are hidden from\n assistive technology. Long labels wrap and the trail yields to a narrow parent instead of\n collapsing, truncating or hiding a place — which places are behind the reader is information, and a\n breadcrumb that hides one is a breadcrumb that lies. */\nconst Breadcrumb = forwardRef<HTMLElement, BreadcrumbProps>(\n ({ items, renderLink, labels, className, \"aria-label\": ariaLabel, ...props }, ref) => {\n const copy = { ...defaultBreadcrumbLabels, ...labels };\n\n /* The props an intermediate destination is rendered from, composed once so the caller's own link\n and the default anchor are the same object: the same destination, the same content and the same\n shared classes — including the focus ring the keyboard needs to see. */\n const linkProps = (item: BreadcrumbItem): AnchorHTMLAttributes<HTMLAnchorElement> => ({\n href: item.href,\n className: cn(\"min-w-0 no-underline [overflow-wrap:anywhere]\", focusRing, state.quietInk),\n children: item.label,\n });\n\n return (\n <nav\n {...props}\n ref={ref}\n aria-label={ariaLabel ?? copy.navigation}\n className={cn(\"min-w-0\", type.body, className)}\n >\n {/* A native ordered list: the trail has an order, and the order is the information. The row\n wraps rather than overflowing, so a long trail stays inside its column. `role=\"list\"`\n restates the element's own role rather than adding one, because `list-none` — which removes\n the marker a breadcrumb does not want — is also what makes Safari drop the semantics. */}\n <ol\n role=\"list\"\n className={cn(\n \"m-0 flex min-w-0 list-none flex-wrap items-start gap-x-2 gap-y-1 p-0\",\n text.medium\n )}\n >\n {items.map((item, index) => {\n const isCurrent = index === items.length - 1;\n\n return (\n <li key={index} className={cn(\"flex min-w-0 items-start gap-x-2\")}>\n {index > 0 && (\n /* One inherited line box centers the glyph on the label's first line, even when\n the label wraps or a consumer changes the trail's line-height. */\n <span aria-hidden=\"true\" className={cn(iconSlot.compact, \"h-[1lh] w-4\")}>\n <HugeiconsIcon icon={ArrowRight01Icon} aria-hidden=\"true\" className={cn(iconStroke.glyph, \"rtl:-scale-x-100\")} />\n </span>\n )}\n {isCurrent ? (\n <span\n aria-current=\"page\"\n className={cn(\"min-w-0 font-medium [overflow-wrap:anywhere]\", text.high)}\n >\n {item.label}\n </span>\n ) : item.href !== undefined ? (\n renderLink ? (\n renderLink(item, linkProps(item))\n ) : (\n <a {...linkProps(item)} />\n )\n ) : (\n <span className={cn(\"min-w-0 [overflow-wrap:anywhere]\")}>{item.label}</span>\n )}\n </li>\n );\n })}\n </ol>\n </nav>\n );\n }\n);\n\nBreadcrumb.displayName = \"Breadcrumb\";\n\nexport default Breadcrumb;\n"],"names":["forwardRef","cn","focusRing","state","_jsx","type","text","_jsxs","iconSlot","HugeiconsIcon","ArrowRight01Icon","iconStroke"],"mappings":";;;;;;;;;;;AAsBA,MAAM,uBAAuB,GAAqB;AAChD,IAAA,UAAU,EAAE,YAAY;CACzB;AAcD;;;;;;;;;;;;;;;AAe0D;AAC1D,MAAM,UAAU,GAAGA,gBAAU,CAC3B,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,KAAI;IACnF,MAAM,IAAI,GAAG,EAAE,GAAG,uBAAuB,EAAE,GAAG,MAAM,EAAE;AAEtD;;AAE0E;AAC1E,IAAA,MAAM,SAAS,GAAG,CAAC,IAAoB,MAA+C;QACpF,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,SAAS,EAAEC,QAAE,CAAC,+CAA+C,EAAEC,mBAAS,EAAEC,eAAK,CAAC,QAAQ,CAAC;QACzF,QAAQ,EAAE,IAAI,CAAC,KAAK;AACrB,KAAA,CAAC;IAEF,QACEC,cAAA,CAAA,KAAA,EAAA,EAAA,GACM,KAAK,EACT,GAAG,EAAE,GAAG,EAAA,YAAA,EACI,SAAS,KAAA,IAAA,IAAT,SAAS,KAAA,MAAA,GAAT,SAAS,GAAI,IAAI,CAAC,UAAU,EACxC,SAAS,EAAEH,QAAE,CAAC,SAAS,EAAEI,cAAI,CAAC,IAAI,EAAE,SAAS,CAAC,EAAA,QAAA,EAM9CD,cAAA,CAAA,IAAA,EAAA,EACE,IAAI,EAAC,MAAM,EACX,SAAS,EAAEH,QAAE,CACX,sEAAsE,EACtEK,cAAI,CAAC,MAAM,CACZ,EAAA,QAAA,EAEA,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,KAAI;gBACzB,MAAM,SAAS,GAAG,KAAK,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC;AAE5C,gBAAA,QACEC,eAAA,CAAA,IAAA,EAAA,EAAgB,SAAS,EAAEN,QAAE,CAAC,kCAAkC,CAAC,EAAA,QAAA,EAAA,CAC9D,KAAK,GAAG,CAAC;AACR;AACoE;wBACpEG,cAAA,CAAA,MAAA,EAAA,EAAA,aAAA,EAAkB,MAAM,EAAC,SAAS,EAAEH,QAAE,CAACO,kBAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,EAAA,QAAA,EACrEJ,cAAA,CAACK,mBAAa,EAAA,EAAC,IAAI,EAAEC,8BAAgB,EAAA,aAAA,EAAc,MAAM,EAAC,SAAS,EAAET,QAAE,CAACU,oBAAU,CAAC,KAAK,EAAE,kBAAkB,CAAC,EAAA,CAAI,EAAA,CAC5G,CACR,EACA,SAAS,IACRP,cAAA,CAAA,MAAA,EAAA,EAAA,cAAA,EACe,MAAM,EACnB,SAAS,EAAEH,QAAE,CAAC,8CAA8C,EAAEK,cAAI,CAAC,IAAI,CAAC,EAAA,QAAA,EAEvE,IAAI,CAAC,KAAK,EAAA,CACN,IACL,IAAI,CAAC,IAAI,KAAK,SAAS,IACzB,UAAU,IACR,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,KAEjCF,yBAAO,SAAS,CAAC,IAAI,CAAC,EAAA,CAAI,CAC3B,KAEDA,cAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAEH,QAAE,CAAC,kCAAkC,CAAC,EAAA,QAAA,EAAG,IAAI,CAAC,KAAK,EAAA,CAAQ,CAC7E,CAAA,EAAA,EAvBM,KAAK,CAwBT;AAET,YAAA,CAAC,CAAC,EAAA,CACC,EAAA,CACD;AAEV,CAAC;AAGH,UAAU,CAAC,WAAW,GAAG,YAAY;;"}
@@ -22,13 +22,20 @@ const sizeMap = {
22
22
  md: `${ui_common.density.normal} px-6 py-3`,
23
23
  lg: `${ui_common.density.prominent} px-8 py-4`,
24
24
  };
25
- const Button = React.forwardRef(({ children, variant = "primary", appearance = "tonal", size = "md", icon, className, loading = false, disabled, type = "button", ...props }, ref) => {
26
- const isDisabled = disabled || loading;
25
+ const Button = React.forwardRef(({ children, variant = "primary", appearance = "tonal", size = "md", icon, className, loading = false, disabled, type = "button", render, ...props }, ref) => {
26
+ /* A busy button is inert for hover and press, but it is not disabled. Only a real `disabled` takes
27
+ the native attribute and the dimmed step. A loading button stays focusable, so Enter keeps focus
28
+ on it, and Base's disabled gate stops its click handler from running a second time. */
29
+ const isNativeButton = render === undefined || render.type === "button";
30
+ /* An element that carries an `href` is a link, so it keeps its link semantics; Base UI would otherwise
31
+ give it `role="button"`. Any other element is a button to Base UI. */
32
+ const isLink = render !== undefined && render.props.href !== undefined;
33
+ const isInert = disabled || loading;
27
34
  /* The action ladder: text sits flat, tonal and filled are raised and recess while held. The
28
35
  priority action is never flatter than the one beside it. */
29
36
  const isRaised = appearance !== "text";
30
- const isTactile = isRaised && !isDisabled;
31
- return (jsxRuntime.jsxs(button.Button, { ...props, render: jsxRuntime.jsx("button", { ref: ref }), type: type, disabled: isDisabled, "aria-busy": loading || undefined, className: utils.cn("relative inline-flex min-w-0 max-w-full items-center justify-center gap-2 font-medium tracking-[-0.01em]", ui_common.shape.pill, sizeMap[size], ui_motion.motionTactile, ui_common.focusRing, appearance === "filled" && ui_common.tone.strong[variant], appearance === "filled" && !isDisabled && ui_common.stateLayer.filled, appearance === "tonal" && ui_common.tone.tonal[variant], appearance === "tonal" && ui_common.tone.text[variant], appearance === "tonal" && !isDisabled && (variant === "secondary" ? ui_common.stateLayer.tonalNeutral : ui_common.stateLayer.tonal), appearance === "text" && ui_common.tone.text[variant], appearance === "text" && !isDisabled && ui_common.stateLayer.quiet, isRaised && ui_common.elevation.raised, isTactile && ui_common.state.recess, isDisabled ? ui_common.state.disabled : ui_common.state.enabled, className), children: [loading ? (jsxRuntime.jsx("span", { className: utils.cn(slotMap[size], !icon && "absolute"), children: jsxRuntime.jsx(Spinner.Spinner, { size: "small", className: utils.cn("size-full") }) })) : icon ? (jsxRuntime.jsx("span", { className: utils.cn(slotMap[size]), "aria-hidden": "true", children: icon })) : null, jsxRuntime.jsx("span", { className: utils.cn("min-w-0 [overflow-wrap:anywhere]", loading && !icon && "opacity-0"), children: children })] }));
37
+ const isTactile = isRaised && !isInert;
38
+ return (jsxRuntime.jsxs(button.Button, { ...props, ...(isLink ? { role: undefined } : undefined), ref: ref, render: render, nativeButton: isNativeButton, type: isNativeButton ? type : undefined, disabled: isInert, focusableWhenDisabled: loading && !disabled, "aria-busy": loading || undefined, className: utils.cn("relative inline-flex min-w-0 max-w-full items-center justify-center gap-2 font-medium tracking-[-0.01em]", ui_common.shape.pill, sizeMap[size], ui_motion.motionTactile, ui_common.focusRing, appearance === "filled" && ui_common.tone.strong[variant], appearance === "filled" && !isInert && ui_common.stateLayer.filled, appearance === "tonal" && ui_common.tone.tonal[variant], appearance === "tonal" && ui_common.tone.text[variant], appearance === "tonal" && !isInert && (variant === "secondary" ? ui_common.stateLayer.tonalNeutral : ui_common.stateLayer.tonal), appearance === "text" && ui_common.tone.text[variant], appearance === "text" && !isInert && ui_common.stateLayer.quiet, isRaised && ui_common.elevation.raised, isTactile && ui_common.state.recess, disabled ? ui_common.state.disabled : loading ? ui_common.state.busy : ui_common.state.enabled, className), children: [loading ? (jsxRuntime.jsx("span", { className: utils.cn(slotMap[size], !icon && "absolute"), children: jsxRuntime.jsx(Spinner.Spinner, { size: "small", className: utils.cn("size-full") }) })) : icon ? (jsxRuntime.jsx("span", { className: utils.cn(slotMap[size]), "aria-hidden": "true", children: icon })) : null, jsxRuntime.jsx("span", { className: utils.cn("min-w-0 [overflow-wrap:anywhere]", loading && !icon && "opacity-0"), children: children })] }));
32
39
  });
33
40
  Button.displayName = "Button";
34
41
 
@@ -1 +1 @@
1
- {"version":3,"file":"Button.cjs","sources":["../../../src/components/Button.tsx"],"sourcesContent":["\"use client\";\n\nimport { Button as BaseButton } from \"@base-ui/react/button\";\nimport React, { forwardRef, type ButtonHTMLAttributes, type ReactNode } from \"react\";\nimport { cn } from \"@/libs/utils\";\nimport {\n density,\n elevation,\n focusRing,\n iconSlot,\n shape,\n state,\n stateLayer,\n tone,\n} from \"./ui.common\";\nimport { motionTactile } from \"./ui.motion\";\nimport { Variant } from \"./ui.types\";\nimport { Spinner } from \"./Spinner\";\n\nexport type ButtonAppearance = \"filled\" | \"tonal\" | \"text\";\nexport type ButtonSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n children: ReactNode;\n variant?: Variant;\n appearance?: ButtonAppearance;\n size?: ButtonSize;\n icon?: ReactNode;\n loading?: boolean;\n}\n\n/* The mark follows the type step beside it (§10): a compact label takes the compact slot. */\nconst slotMap: Record<ButtonSize, string> = {\n sm: iconSlot.compact,\n md: iconSlot.normal,\n lg: iconSlot.prominent,\n};\n\nconst sizeMap: Record<ButtonSize, string> = {\n sm: `${density.compact} px-4 py-2`,\n md: `${density.normal} px-6 py-3`,\n lg: `${density.prominent} px-8 py-4`,\n};\n\nconst Button = forwardRef<HTMLButtonElement, ButtonProps>(\n ({\n children,\n variant = \"primary\",\n appearance = \"tonal\",\n size = \"md\",\n icon,\n className,\n loading = false,\n disabled,\n type = \"button\",\n ...props\n }, ref) => {\n const isDisabled = disabled || loading;\n /* The action ladder: text sits flat, tonal and filled are raised and recess while held. The\n priority action is never flatter than the one beside it. */\n const isRaised = appearance !== \"text\";\n const isTactile = isRaised && !isDisabled;\n\n return (\n <BaseButton\n {...props}\n render={<button ref={ref} />}\n type={type}\n disabled={isDisabled}\n aria-busy={loading || undefined}\n className={cn(\n \"relative inline-flex min-w-0 max-w-full items-center justify-center gap-2 font-medium tracking-[-0.01em]\",\n shape.pill,\n sizeMap[size],\n motionTactile,\n focusRing,\n appearance === \"filled\" && tone.strong[variant],\n appearance === \"filled\" && !isDisabled && stateLayer.filled,\n appearance === \"tonal\" && tone.tonal[variant],\n appearance === \"tonal\" && tone.text[variant],\n appearance === \"tonal\" && !isDisabled && (variant === \"secondary\" ? stateLayer.tonalNeutral : stateLayer.tonal),\n appearance === \"text\" && tone.text[variant],\n appearance === \"text\" && !isDisabled && stateLayer.quiet,\n isRaised && elevation.raised,\n isTactile && state.recess,\n isDisabled ? state.disabled : state.enabled,\n className\n )}\n >\n {/* A mark occupies one slot whatever is inside it. The slot is a fixed box sized by the\n button's type step, so a nested node — a wrapped mark, a status dot — cannot change the\n control's width, and the loading mark lands in the box the icon had. `[&>svg]` normalizes\n direct SVG artwork; sizing nested artwork is the caller's business, as §17 says. */}\n {loading ? (\n <span className={cn(slotMap[size], !icon && \"absolute\")}>\n <Spinner size=\"small\" className={cn(\"size-full\")} />\n </span>\n ) : icon ? (\n <span className={cn(slotMap[size])} aria-hidden=\"true\">\n {icon}\n </span>\n ) : null}\n {/* Retain one label subtree and its accessible name while the spinner occupies its footprint. */}\n <span className={cn(\"min-w-0 [overflow-wrap:anywhere]\", loading && !icon && \"opacity-0\")}>{children}</span>\n </BaseButton>\n );\n }\n);\n\nButton.displayName = \"Button\";\n\nexport default Button;\n"],"names":["iconSlot","density","forwardRef","_jsxs","BaseButton","_jsx","cn","shape","motionTactile","focusRing","tone","stateLayer","elevation","state","Spinner"],"mappings":";;;;;;;;;;;;;AA+BA,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;AACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,OAAO,CAAA,CAAA,CAA+B;IAC1C,CAAA,CAAE,CAAA,CAAEA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO;IACpB,CAAA,CAAE,CAAA,CAAEA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM;IACnB,CAAA,CAAE,CAAA,CAAEA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS;CACvB;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,OAAO,CAAA,CAAA,CAA+B;AAC1C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,EAAE,CAAA,CAAA,CAAGC,iBAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY;AAClC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,EAAE,CAAA,CAAA,CAAGA,iBAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY;AACjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,EAAE,CAAA,CAAA,CAAGA,iBAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY;CACrC;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,MAAM,CAAA,CAAA,CAAGC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAU,CACvB,CAAC,EACC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CACR,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAG,SAAS,CAAA,CACnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,GAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CACpB,IAAI,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAI,CAAA,CACX,CAAA,CAAA,CAAA,CAAI,EACJ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CACT,OAAO,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAK,EACf,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CACR,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAG,QAAQ,CAAA,CACf,CAAA,CAAA,CAAG,KAAK,CAAA,CACT,CAAA,CAAE,GAAG,CAAA,CAAA,CAAA,CAAA,CAAI;AACR,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,IAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO;AACtC,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;AAC8D,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;AAC9D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,KAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM;AACtC,CAAA,CAAA,CAAA,CAAA,MAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU;IAEzC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACEC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAA,CAACC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACL,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CACT,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAEC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAG,CAAA,CAAE,CAAA,CAAA,CAAG,CAAA,CAAA,CAAI,CAAA,CAC5B,CAAA,CAAA,CAAA,CAAI,CAAA,CAAE,CAAA,CAAA,CAAA,CAAI,CAAA,CACV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACT,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAC/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAAEC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,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,CAA0G,CAAA,CAC1GC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAI,CAAA,CACV,OAAO,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CACbC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAa,CAAA,CACbC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAS,CAAA,CACT,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAIC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,OAAO,CAAC,CAAA,CAC/C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAA,CAAA,CAAA,CAAIC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAU,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAC3D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAID,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAC7C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAAIA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAC5C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAA,CAAA,CAAGC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAU,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAA,CAAA,CAAGA,oBAAU,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAC/G,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAID,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAC3C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,KAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAA,CAAA,CAAA,CAAIC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAU,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CACxD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAIC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAS,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAC5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,IAAIC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CACzB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAA,CAAA,CAAGA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAGA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAC3C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CACV,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAMA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CACNR,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAAEC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,IAAI,CAAC,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACrDD,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAA,CAACS,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAO,CAAA,CAAA,CAAA,CAAC,CAAA,CAAA,CAAA,CAAI,EAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAAER,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC,CAAA,CAAA,CAAI,CAAA,CAAA,CAC/C,CAAA,CAAA,CAAA,CACL,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CACND,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAAEC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACnD,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CACA,CAAA,CAAA,CAAA,CACL,CAAA,CAAA,CAAA,CAAI,CAAA,CAERD,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAAEC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,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,CAAkC,CAAA,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAQ,CAAA,EAAA,CAChG,CAAA;AAEjB,CAAC,CAAA;AAGH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ;;"}
1
+ {"version":3,"file":"Button.cjs","sources":["../../../src/components/Button.tsx"],"sourcesContent":["\"use client\";\n\nimport { Button as BaseButton } from \"@base-ui/react/button\";\nimport React, { forwardRef, type ButtonHTMLAttributes, type ReactElement, type ReactNode } from \"react\";\nimport { cn } from \"@/libs/utils\";\nimport {\n density,\n elevation,\n focusRing,\n iconSlot,\n shape,\n state,\n stateLayer,\n tone,\n} from \"./ui.common\";\nimport { motionTactile } from \"./ui.motion\";\nimport { Variant } from \"./ui.types\";\nimport { Spinner } from \"./Spinner\";\n\nexport type ButtonAppearance = \"filled\" | \"tonal\" | \"text\";\nexport type ButtonSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n children: ReactNode;\n variant?: Variant;\n appearance?: ButtonAppearance;\n size?: ButtonSize;\n icon?: ReactNode;\n loading?: boolean;\n /**\n * The element the button renders as, such as a router link. The button's classes and its own props\n * are merged onto it, so the link looks and presses like a button and keeps its own navigation.\n */\n render?: ReactElement;\n}\n\n/* The mark follows the type step beside it (§10): a compact label takes the compact slot. */\nconst slotMap: Record<ButtonSize, string> = {\n sm: iconSlot.compact,\n md: iconSlot.normal,\n lg: iconSlot.prominent,\n};\n\nconst sizeMap: Record<ButtonSize, string> = {\n sm: `${density.compact} px-4 py-2`,\n md: `${density.normal} px-6 py-3`,\n lg: `${density.prominent} px-8 py-4`,\n};\n\nconst Button = forwardRef<HTMLButtonElement, ButtonProps>(\n ({\n children,\n variant = \"primary\",\n appearance = \"tonal\",\n size = \"md\",\n icon,\n className,\n loading = false,\n disabled,\n type = \"button\",\n render,\n ...props\n }, ref) => {\n /* A busy button is inert for hover and press, but it is not disabled. Only a real `disabled` takes\n the native attribute and the dimmed step. A loading button stays focusable, so Enter keeps focus\n on it, and Base's disabled gate stops its click handler from running a second time. */\n const isNativeButton = render === undefined || render.type === \"button\";\n /* An element that carries an `href` is a link, so it keeps its link semantics; Base UI would otherwise\n give it `role=\"button\"`. Any other element is a button to Base UI. */\n const isLink = render !== undefined && (render.props as { href?: unknown }).href !== undefined;\n const isInert = disabled || loading;\n /* The action ladder: text sits flat, tonal and filled are raised and recess while held. The\n priority action is never flatter than the one beside it. */\n const isRaised = appearance !== \"text\";\n const isTactile = isRaised && !isInert;\n\n return (\n <BaseButton\n {...props}\n {...(isLink ? { role: undefined } : undefined)}\n ref={ref}\n render={render}\n nativeButton={isNativeButton}\n type={isNativeButton ? type : undefined}\n disabled={isInert}\n focusableWhenDisabled={loading && !disabled}\n aria-busy={loading || undefined}\n className={cn(\n \"relative inline-flex min-w-0 max-w-full items-center justify-center gap-2 font-medium tracking-[-0.01em]\",\n shape.pill,\n sizeMap[size],\n motionTactile,\n focusRing,\n appearance === \"filled\" && tone.strong[variant],\n appearance === \"filled\" && !isInert && stateLayer.filled,\n appearance === \"tonal\" && tone.tonal[variant],\n appearance === \"tonal\" && tone.text[variant],\n appearance === \"tonal\" && !isInert && (variant === \"secondary\" ? stateLayer.tonalNeutral : stateLayer.tonal),\n appearance === \"text\" && tone.text[variant],\n appearance === \"text\" && !isInert && stateLayer.quiet,\n isRaised && elevation.raised,\n isTactile && state.recess,\n disabled ? state.disabled : loading ? state.busy : state.enabled,\n className\n )}\n >\n {/* A mark occupies one slot whatever is inside it. The slot is a fixed box sized by the\n button's type step, so a nested node — a wrapped mark, a status dot — cannot change the\n control's width, and the loading mark lands in the box the icon had. `[&>svg]` normalizes\n direct SVG artwork; sizing nested artwork is the caller's business, as §17 says. */}\n {loading ? (\n <span className={cn(slotMap[size], !icon && \"absolute\")}>\n <Spinner size=\"small\" className={cn(\"size-full\")} />\n </span>\n ) : icon ? (\n <span className={cn(slotMap[size])} aria-hidden=\"true\">\n {icon}\n </span>\n ) : null}\n {/* Retain one label subtree and its accessible name while the spinner occupies its footprint. */}\n <span className={cn(\"min-w-0 [overflow-wrap:anywhere]\", loading && !icon && \"opacity-0\")}>{children}</span>\n </BaseButton>\n );\n }\n);\n\nButton.displayName = \"Button\";\n\nexport default Button;\n"],"names":["iconSlot","density","forwardRef","_jsxs","BaseButton","cn","shape","motionTactile","focusRing","tone","stateLayer","elevation","state","_jsx","Spinner"],"mappings":";;;;;;;;;;;;;AAoCA,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;AACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,OAAO,CAAA,CAAA,CAA+B;IAC1C,CAAA,CAAE,CAAA,CAAEA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO;IACpB,CAAA,CAAE,CAAA,CAAEA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM;IACnB,CAAA,CAAE,CAAA,CAAEA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS;CACvB;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,OAAO,CAAA,CAAA,CAA+B;AAC1C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,EAAE,CAAA,CAAA,CAAGC,iBAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY;AAClC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,EAAE,CAAA,CAAA,CAAGA,iBAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY;AACjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,EAAE,CAAA,CAAA,CAAGA,iBAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY;CACrC;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,MAAM,CAAA,CAAA,CAAGC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAU,CACvB,CAAC,CAAA,CACC,QAAQ,CAAA,CACR,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,EACnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAA,CAAA,CAAG,OAAO,CAAA,CACpB,CAAA,CAAA,CAAA,CAAI,GAAG,CAAA,CAAA,CAAA,CAAI,CAAA,CACX,CAAA,CAAA,CAAA,CAAI,CAAA,CACJ,SAAS,CAAA,CACT,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,GAAG,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CACf,QAAQ,CAAA,CACR,CAAA,CAAA,CAAA,CAAI,GAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CACf,MAAM,CAAA,CACN,CAAA,CAAA,CAAG,KAAK,CAAA,CACT,CAAA,CAAE,GAAG,CAAA,CAAA,CAAA,CAAA,CAAI;AACR,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;;AAEyF,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;IACzF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ;AACvE,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;AACwE,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;AACxE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,C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"}
@@ -20,7 +20,7 @@ const navigationButtonClassName = `group inline-flex shrink-0 items-center justi
20
20
  const todayButtonClassName = `inline-flex shrink-0 items-center justify-center px-4 ${ui_common.density.compact} ${ui_common.shape.pill} ${ui_common.text.high} ${ui_motion.motionFeedback} ${ui_motion.motionTactile} ${ui_common.focusRingInset} ${ui_common.stateLayer.quiet}`;
21
21
  /* A chosen day holds the same shallow surface as an option. The square target yields with its
22
22
  column without changing the seven-day grid; selection and focus boundaries never compress. */
23
- const dayButtonClassName = `relative inline-flex aspect-square w-full max-w-10 select-none items-center justify-center text-sm tabular-nums ${ui_common.shape.circle} ${ui_motion.motionFeedback} ${ui_common.focusRingInset}`;
23
+ const dayButtonClassName = `relative inline-flex aspect-square w-full max-w-10 select-none items-center justify-center ${ui_common.type.numeric} ${ui_common.shape.circle} ${ui_motion.motionFeedback} ${ui_common.focusRingInset}`;
24
24
  /**
25
25
  * One month of a Gregorian calendar, navigated as a keyboard grid.
26
26
  *
@@ -50,7 +50,11 @@ const Calendar = React.forwardRef((props, ref) => {
50
50
  const direction = directionProvider.useDirection();
51
51
  /* Which way a horizontal arrow walks in *time*: the page's reading direction, not the screen's. */
52
52
  const mirror = direction === "rtl" ? -1 : 1;
53
- const today = React.useMemo(() => { var _a; return (_a = dateFamily.normalizeCalendarDate(todayProp)) !== null && _a !== void 0 ? _a : dateFamily.todayCalendarDate(); }, [todayProp]);
53
+ /* Today is the viewer's own civil day. The first render reads it in UTC, the reading the server shares, so
54
+ the markup agrees with what hydrates; the effects below move it to the local day. The `today` prop
55
+ overrides all of it. */
56
+ const [clockToday, setClockToday] = React.useState(() => dateFamily.todayCalendarDate());
57
+ const today = React.useMemo(() => { var _a; return (_a = dateFamily.normalizeCalendarDate(todayProp)) !== null && _a !== void 0 ? _a : clockToday; }, [todayProp, clockToday]);
54
58
  const todayParts = dateFamily.parseCalendarDate(today);
55
59
  const minDate = React.useMemo(() => dateFamily.normalizeCalendarDate(min), [min]);
56
60
  const maxDate = React.useMemo(() => dateFamily.normalizeCalendarDate(max), [max]);
@@ -126,6 +130,28 @@ const Calendar = React.forwardRef((props, ref) => {
126
130
  }
127
131
  setPendingDayFocus(null);
128
132
  }, [pendingDayFocus, view.year, view.month]);
133
+ /* The viewer's day is read on mount and again at each local midnight, when the civil day turns over. A
134
+ timer that waits for midnight is the only clock the calendar keeps; it never ticks in between. */
135
+ React.useEffect(() => {
136
+ let timer;
137
+ const readClock = () => {
138
+ const now = new Date();
139
+ setClockToday(dateFamily.localCalendarDate(now));
140
+ timer = setTimeout(readClock, dateFamily.millisecondsUntilLocalMidnight(now));
141
+ };
142
+ readClock();
143
+ return () => clearTimeout(timer);
144
+ }, []);
145
+ /* A grid with nothing to anchor it opens on the viewer's month, not on the UTC month it was first drawn
146
+ with. Only that first local reading may move it: a reader who has walked away from today is never
147
+ brought back to it by a later midnight. */
148
+ React.useEffect(() => {
149
+ if (monthProp !== undefined || todayProp !== undefined || anchorParts !== null || defaultMonthParts !== null)
150
+ return;
151
+ const local = dateFamily.parseCalendarDate(dateFamily.localCalendarDate());
152
+ setInternalMonth({ year: local.year, month: local.month, day: 1 });
153
+ setActiveDayState(local.day);
154
+ }, []);
129
155
  const isUnavailableDate = React.useCallback((date) => {
130
156
  if (minDate && dateFamily.compareCalendarDates(date, minDate) < 0)
131
157
  return true;
@@ -260,7 +286,13 @@ const Calendar = React.forwardRef((props, ref) => {
260
286
  const hintId = React.useId();
261
287
  return (jsxRuntime.jsxs("div", { ...divProps, ref: ref,
262
288
  /* Seven equal columns yield together in a narrow panel; no weekday is hidden offscreen. */
263
- className: utils.cn("inline-flex w-[17.5rem] min-w-0 max-w-full flex-col", disabled && ui_common.state.disabled, className), children: [jsxRuntime.jsxs("div", { className: utils.cn("mb-2 flex items-center justify-between gap-2"), children: [jsxRuntime.jsx("button", { type: "button", "aria-label": labels.previousMonth, disabled: disabled || atFirstMonth, onClick: () => walkMonth(-1), className: utils.cn(navigationButtonClassName, disabled ? ui_common.state.disabledDescendant : atFirstMonth ? ui_common.state.disabled : ui_common.state.enabled), children: jsxRuntime.jsx("span", { className: utils.cn("inline-flex", !disabled && !atFirstMonth && ui_motion.motionInkPress), children: jsxRuntime.jsx(react.HugeiconsIcon, { icon: coreFreeIcons.ArrowLeft01Icon, "aria-hidden": "true", className: utils.cn(ui_common.iconStroke.glyph, "size-5 rtl:-scale-x-100") }) }) }), jsxRuntime.jsx("div", { id: captionId, "aria-live": "polite", className: utils.cn("min-w-0 flex-1 truncate text-center", ui_common.type.label, ui_common.text.high), children: format.formatMonthYear(view) }), jsxRuntime.jsx("button", { type: "button", "aria-label": labels.nextMonth, disabled: disabled || atLastMonth, onClick: () => walkMonth(1), className: utils.cn(navigationButtonClassName, disabled ? ui_common.state.disabledDescendant : atLastMonth ? ui_common.state.disabled : ui_common.state.enabled), children: jsxRuntime.jsx("span", { className: utils.cn("inline-flex", !disabled && !atLastMonth && ui_motion.motionInkPress), children: jsxRuntime.jsx(react.HugeiconsIcon, { icon: coreFreeIcons.ArrowRight01Icon, "aria-hidden": "true", className: utils.cn(ui_common.iconStroke.glyph, "size-5 rtl:-scale-x-100") }) }) })] }), jsxRuntime.jsxs("table", { ref: gridRef, role: "grid", "aria-label": ariaLabel, "aria-labelledby": ariaLabel ? undefined : ariaLabelledBy !== null && ariaLabelledBy !== void 0 ? ariaLabelledBy : captionId, "aria-describedby": hintId, "aria-multiselectable": isRange ? true : undefined, "aria-invalid": invalid || undefined, "aria-disabled": disabled || undefined, onKeyDown: handleGridKeyDown, onBlur: (event) => {
289
+ className: utils.cn("inline-flex w-[17.5rem] min-w-0 max-w-full flex-col", disabled && ui_common.state.disabled, className), children: [jsxRuntime.jsxs("div", { className: utils.cn("mb-2 flex items-center justify-between gap-2"), children: [jsxRuntime.jsx("button", { type: "button", "aria-label": labels.previousMonth, disabled: disabled, "aria-disabled": atFirstMonth || undefined, onClick: () => {
290
+ if (!atFirstMonth)
291
+ walkMonth(-1);
292
+ }, className: utils.cn(navigationButtonClassName, disabled ? ui_common.state.disabledDescendant : atFirstMonth ? ui_common.state.disabled : ui_common.state.enabled), children: jsxRuntime.jsx("span", { className: utils.cn(ui_common.iconSlot.normal, !disabled && !atFirstMonth && ui_motion.motionInkPress), children: jsxRuntime.jsx(react.HugeiconsIcon, { icon: coreFreeIcons.ArrowLeft01Icon, "aria-hidden": "true", className: utils.cn(ui_common.iconStroke.glyph, "rtl:-scale-x-100") }) }) }), jsxRuntime.jsx("div", { id: captionId, "aria-live": "polite", className: utils.cn("min-w-0 flex-1 truncate text-center", ui_common.type.label, ui_common.text.high), children: format.formatMonthYear(view) }), jsxRuntime.jsx("button", { type: "button", "aria-label": labels.nextMonth, disabled: disabled, "aria-disabled": atLastMonth || undefined, onClick: () => {
293
+ if (!atLastMonth)
294
+ walkMonth(1);
295
+ }, className: utils.cn(navigationButtonClassName, disabled ? ui_common.state.disabledDescendant : atLastMonth ? ui_common.state.disabled : ui_common.state.enabled), children: jsxRuntime.jsx("span", { className: utils.cn(ui_common.iconSlot.normal, !disabled && !atLastMonth && ui_motion.motionInkPress), children: jsxRuntime.jsx(react.HugeiconsIcon, { icon: coreFreeIcons.ArrowRight01Icon, "aria-hidden": "true", className: utils.cn(ui_common.iconStroke.glyph, "rtl:-scale-x-100") }) }) })] }), jsxRuntime.jsxs("table", { ref: gridRef, role: "grid", "aria-label": ariaLabel, "aria-labelledby": ariaLabel ? undefined : ariaLabelledBy !== null && ariaLabelledBy !== void 0 ? ariaLabelledBy : captionId, "aria-describedby": hintId, "aria-multiselectable": isRange ? true : undefined, "aria-invalid": invalid || undefined, "aria-disabled": disabled || undefined, onKeyDown: handleGridKeyDown, onBlur: (event) => {
264
296
  /* A day is no longer the focus, so a pending refocus must not claim it later. */
265
297
  if (!event.currentTarget.contains(event.relatedTarget)) {
266
298
  setPendingDayFocus(null);
@@ -290,7 +322,10 @@ const Calendar = React.forwardRef((props, ref) => {
290
322
  return (jsxRuntime.jsxs("td", { role: "gridcell", "aria-selected": selected || undefined, "aria-current": isToday ? "date" : undefined, className: utils.cn("relative p-0 text-center align-middle"), children: [bandLength > 0 && (jsxRuntime.jsx("span", { "aria-hidden": "true", "data-sui-range-band": "", style: { width: `${bandLength * 100}%` }, className: utils.cn("pointer-events-none absolute inset-y-1 start-0", ui_common.shape.pill, ui_common.elevation.control, invalid ? ui_common.tone.selected.danger : ui_common.tone.selected.primary) })), jsxRuntime.jsx("button", { type: "button", "data-day": date, tabIndex: disabled ? -1 : isActive ? 0 : -1, "aria-label": format.formatDate(parts), "aria-disabled": unavailable || undefined, disabled: disabled, onClick: () => selectDate(date), onFocus: () => {
291
323
  if (day !== activeDayState)
292
324
  setActiveDayState(day);
293
- }, className: utils.cn(dayButtonClassName, ui_common.text.high, isToday && `${ui_common.tone.text.primary} underline underline-offset-4`, selected && isEdge && "font-medium", selected && !joinedRange && utils.cn(invalid ? ui_common.tone.selected.danger : ui_common.tone.selected.primary, ui_common.elevation.control), !disabled && !unavailable && `${ui_common.stateLayer.quiet} ${ui_common.state.enabled}`, unavailable && !disabled && ui_common.state.disabled, disabled && ui_common.state.disabledDescendant), children: format.formatDayNumber(day) })] }, date));
325
+ }, className: utils.cn(dayButtonClassName, ui_common.text.high, selected && isEdge && "font-medium",
326
+ /* Today is marked in ink, never in the accent: iris is spent where the reader acts (§10), and
327
+ a day is not an action. A weight step and an underline say "today" without a colour. */
328
+ isToday && "font-semibold underline underline-offset-4", selected && !joinedRange && utils.cn(invalid ? ui_common.tone.selected.danger : ui_common.tone.selected.primary, ui_common.elevation.control), !disabled && !unavailable && `${ui_common.stateLayer.quiet} ${ui_common.state.enabled}`, unavailable && !disabled && ui_common.state.disabled, disabled && ui_common.state.disabledDescendant), children: format.formatDayNumber(day) })] }, date));
294
329
  }) }, rowIndex))) })] }), jsxRuntime.jsxs("div", { className: utils.cn("mt-3 flex items-center justify-between gap-3"), children: [jsxRuntime.jsx("button", { type: "button", disabled: disabled, onClick: goToToday, className: utils.cn(todayButtonClassName, disabled ? ui_common.state.disabledDescendant : ui_common.state.enabled), children: labels.today }), jsxRuntime.jsx("div", { role: "status", className: utils.cn("min-w-0", ui_common.type.supporting, ui_common.tone.text.danger), children: rangeMessage !== null && rangeMessage !== void 0 ? rangeMessage : "" })] }), jsxRuntime.jsx("p", { id: hintId, className: utils.cn("sr-only"), children: isRange ? labels.selectRange : labels.selectDate })] }));
295
330
  });
296
331
  Calendar.displayName = "Calendar";