sherick-ui 2.2.0 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/components/Badge.cjs +1 -1
  3. package/dist/cjs/components/Badge.cjs.map +1 -1
  4. package/dist/cjs/components/Button.cjs +11 -2
  5. package/dist/cjs/components/Button.cjs.map +1 -1
  6. package/dist/cjs/components/Calendar.cjs +2 -2
  7. package/dist/cjs/components/Calendar.cjs.map +1 -1
  8. package/dist/cjs/components/Card.cjs +3 -2
  9. package/dist/cjs/components/Card.cjs.map +1 -1
  10. package/dist/cjs/components/Checkbox.cjs +3 -1
  11. package/dist/cjs/components/Checkbox.cjs.map +1 -1
  12. package/dist/cjs/components/Chip.cjs +3 -3
  13. package/dist/cjs/components/Chip.cjs.map +1 -1
  14. package/dist/cjs/components/Combobox.cjs +1 -1
  15. package/dist/cjs/components/Combobox.cjs.map +1 -1
  16. package/dist/cjs/components/Command.cjs +3 -3
  17. package/dist/cjs/components/Command.cjs.map +1 -1
  18. package/dist/cjs/components/CommandPalette.cjs +1 -1
  19. package/dist/cjs/components/CommandPalette.cjs.map +1 -1
  20. package/dist/cjs/components/DateRangePicker.cjs +1 -1
  21. package/dist/cjs/components/DateRangePicker.cjs.map +1 -1
  22. package/dist/cjs/components/DialogHeader.cjs +1 -1
  23. package/dist/cjs/components/DialogHeader.cjs.map +1 -1
  24. package/dist/cjs/components/Drawer.cjs +1 -1
  25. package/dist/cjs/components/Drawer.cjs.map +1 -1
  26. package/dist/cjs/components/Field.cjs +1 -1
  27. package/dist/cjs/components/Field.cjs.map +1 -1
  28. package/dist/cjs/components/FileUpload.cjs +3 -3
  29. package/dist/cjs/components/FileUpload.cjs.map +1 -1
  30. package/dist/cjs/components/IconButton.cjs +1 -1
  31. package/dist/cjs/components/IconButton.cjs.map +1 -1
  32. package/dist/cjs/components/Input.cjs +1 -1
  33. package/dist/cjs/components/Input.cjs.map +1 -1
  34. package/dist/cjs/components/NavItem.cjs +3 -3
  35. package/dist/cjs/components/NavItem.cjs.map +1 -1
  36. package/dist/cjs/components/NumberField.cjs +2 -2
  37. package/dist/cjs/components/NumberField.cjs.map +1 -1
  38. package/dist/cjs/components/Pagination.cjs +1 -1
  39. package/dist/cjs/components/Pagination.cjs.map +1 -1
  40. package/dist/cjs/components/Progress.cjs +7 -4
  41. package/dist/cjs/components/Progress.cjs.map +1 -1
  42. package/dist/cjs/components/RadioGroup.cjs +1 -1
  43. package/dist/cjs/components/RadioGroup.cjs.map +1 -1
  44. package/dist/cjs/components/Search.cjs +4 -1
  45. package/dist/cjs/components/Search.cjs.map +1 -1
  46. package/dist/cjs/components/Select.cjs +1 -1
  47. package/dist/cjs/components/Select.cjs.map +1 -1
  48. package/dist/cjs/components/Slider.cjs +1 -1
  49. package/dist/cjs/components/Slider.cjs.map +1 -1
  50. package/dist/cjs/components/Stepper.cjs +5 -1
  51. package/dist/cjs/components/Stepper.cjs.map +1 -1
  52. package/dist/cjs/components/Table.cjs +1 -1
  53. package/dist/cjs/components/Table.cjs.map +1 -1
  54. package/dist/cjs/components/Tabs.cjs +1 -1
  55. package/dist/cjs/components/Tabs.cjs.map +1 -1
  56. package/dist/cjs/components/Textarea.cjs +1 -1
  57. package/dist/cjs/components/Textarea.cjs.map +1 -1
  58. package/dist/cjs/components/Toast.cjs +5 -2
  59. package/dist/cjs/components/Toast.cjs.map +1 -1
  60. package/dist/cjs/components/Tooltip.cjs +1 -1
  61. package/dist/cjs/components/Tooltip.cjs.map +1 -1
  62. package/dist/cjs/components/TreeView.cjs +43 -10
  63. package/dist/cjs/components/TreeView.cjs.map +1 -1
  64. package/dist/cjs/components/date-field.cjs +2 -2
  65. package/dist/cjs/components/date-field.cjs.map +1 -1
  66. package/dist/cjs/components/ui.common.cjs +197 -88
  67. package/dist/cjs/components/ui.common.cjs.map +1 -1
  68. package/dist/cjs/components/ui.motion.cjs +43 -14
  69. package/dist/cjs/components/ui.motion.cjs.map +1 -1
  70. package/dist/cjs/dev.cjs +10 -0
  71. package/dist/cjs/dev.cjs.map +1 -1
  72. package/dist/esm/components/Badge.js +2 -2
  73. package/dist/esm/components/Badge.js.map +1 -1
  74. package/dist/esm/components/Button.js +12 -3
  75. package/dist/esm/components/Button.js.map +1 -1
  76. package/dist/esm/components/Calendar.js +3 -3
  77. package/dist/esm/components/Calendar.js.map +1 -1
  78. package/dist/esm/components/Card.js +4 -3
  79. package/dist/esm/components/Card.js.map +1 -1
  80. package/dist/esm/components/Checkbox.js +3 -1
  81. package/dist/esm/components/Checkbox.js.map +1 -1
  82. package/dist/esm/components/Chip.js +3 -3
  83. package/dist/esm/components/Chip.js.map +1 -1
  84. package/dist/esm/components/CodeBlock.js +5 -4
  85. package/dist/esm/components/CodeBlock.js.map +1 -1
  86. package/dist/esm/components/Combobox.js +3 -3
  87. package/dist/esm/components/Combobox.js.map +1 -1
  88. package/dist/esm/components/Command.js +4 -4
  89. package/dist/esm/components/Command.js.map +1 -1
  90. package/dist/esm/components/CommandPalette.js +2 -2
  91. package/dist/esm/components/CommandPalette.js.map +1 -1
  92. package/dist/esm/components/DateRangePicker.js +2 -2
  93. package/dist/esm/components/DateRangePicker.js.map +1 -1
  94. package/dist/esm/components/DialogHeader.js +2 -2
  95. package/dist/esm/components/DialogHeader.js.map +1 -1
  96. package/dist/esm/components/Drawer.js +2 -2
  97. package/dist/esm/components/Drawer.js.map +1 -1
  98. package/dist/esm/components/Field.js +2 -2
  99. package/dist/esm/components/Field.js.map +1 -1
  100. package/dist/esm/components/FileUpload.js +4 -4
  101. package/dist/esm/components/FileUpload.js.map +1 -1
  102. package/dist/esm/components/IconButton.js +1 -1
  103. package/dist/esm/components/IconButton.js.map +1 -1
  104. package/dist/esm/components/Input.js +2 -2
  105. package/dist/esm/components/Input.js.map +1 -1
  106. package/dist/esm/components/Markdown.js +3 -2
  107. package/dist/esm/components/Markdown.js.map +1 -1
  108. package/dist/esm/components/NavItem.js +5 -5
  109. package/dist/esm/components/NavItem.js.map +1 -1
  110. package/dist/esm/components/NumberField.js +3 -3
  111. package/dist/esm/components/NumberField.js.map +1 -1
  112. package/dist/esm/components/Pagination.js +2 -2
  113. package/dist/esm/components/Pagination.js.map +1 -1
  114. package/dist/esm/components/Progress.js +8 -5
  115. package/dist/esm/components/Progress.js.map +1 -1
  116. package/dist/esm/components/RadioGroup.js +2 -2
  117. package/dist/esm/components/RadioGroup.js.map +1 -1
  118. package/dist/esm/components/Search.js +5 -2
  119. package/dist/esm/components/Search.js.map +1 -1
  120. package/dist/esm/components/Select.js +3 -3
  121. package/dist/esm/components/Select.js.map +1 -1
  122. package/dist/esm/components/Slider.js +1 -1
  123. package/dist/esm/components/Slider.js.map +1 -1
  124. package/dist/esm/components/Stepper.js +6 -2
  125. package/dist/esm/components/Stepper.js.map +1 -1
  126. package/dist/esm/components/Table.js +2 -2
  127. package/dist/esm/components/Table.js.map +1 -1
  128. package/dist/esm/components/Tabs.js +2 -2
  129. package/dist/esm/components/Tabs.js.map +1 -1
  130. package/dist/esm/components/Textarea.js +2 -2
  131. package/dist/esm/components/Textarea.js.map +1 -1
  132. package/dist/esm/components/Toast.js +6 -3
  133. package/dist/esm/components/Toast.js.map +1 -1
  134. package/dist/esm/components/Tooltip.js +2 -2
  135. package/dist/esm/components/Tooltip.js.map +1 -1
  136. package/dist/esm/components/TreeView.js +45 -12
  137. package/dist/esm/components/TreeView.js.map +1 -1
  138. package/dist/esm/components/date-field.js +3 -3
  139. package/dist/esm/components/date-field.js.map +1 -1
  140. package/dist/esm/components/ui.common.js +194 -90
  141. package/dist/esm/components/ui.common.js.map +1 -1
  142. package/dist/esm/components/ui.motion.js +39 -15
  143. package/dist/esm/components/ui.motion.js.map +1 -1
  144. package/dist/esm/dev.js +2 -2
  145. package/dist/styles.css +339 -110
  146. package/dist/theme.css +40 -7
  147. package/dist/types/dev.d.cts +88 -56
  148. package/dist/types/dev.d.ts +88 -56
  149. package/package.json +1 -1
package/dist/cjs/dev.cjs CHANGED
@@ -6,6 +6,7 @@ var utils = require('./libs/utils.cjs');
6
6
 
7
7
 
8
8
 
9
+ exports.currentDestination = ui_common.currentDestination;
9
10
  exports.density = ui_common.density;
10
11
  exports.detail = ui_common.detail;
11
12
  exports.disclosure = ui_common.disclosure;
@@ -13,6 +14,7 @@ exports.edge = ui_common.edge;
13
14
  exports.edgeTone = ui_common.edgeTone;
14
15
  exports.elevation = ui_common.elevation;
15
16
  exports.fieldLayout = ui_common.fieldLayout;
17
+ exports.fieldMessage = ui_common.fieldMessage;
16
18
  exports.focusRing = ui_common.focusRing;
17
19
  exports.focusRingDrag = ui_common.focusRingDrag;
18
20
  exports.focusRingHeld = ui_common.focusRingHeld;
@@ -20,6 +22,7 @@ exports.focusRingInset = ui_common.focusRingInset;
20
22
  exports.focusRingWithin = ui_common.focusRingWithin;
21
23
  exports.groupFocusRing = ui_common.groupFocusRing;
22
24
  exports.hitArea = ui_common.hitArea;
25
+ exports.iconSlot = ui_common.iconSlot;
23
26
  exports.list = ui_common.list;
24
27
  exports.material = ui_common.material;
25
28
  exports.matteInset = ui_common.matteInset;
@@ -28,6 +31,7 @@ exports.overlay = ui_common.overlay;
28
31
  exports.parentFocusRingInset = ui_common.parentFocusRingInset;
29
32
  exports.recessedTop = ui_common.recessedTop;
30
33
  exports.recipeAlphas = ui_common.recipeAlphas;
34
+ exports.rim = ui_common.rim;
31
35
  exports.selectable = ui_common.selectable;
32
36
  exports.selectableRowSurface = ui_common.selectableRowSurface;
33
37
  exports.shape = ui_common.shape;
@@ -37,6 +41,7 @@ exports.stateLayer = ui_common.stateLayer;
37
41
  exports.stateLayerQuietComposite = ui_common.stateLayerQuietComposite;
38
42
  exports.text = ui_common.text;
39
43
  exports.tone = ui_common.tone;
44
+ exports.type = ui_common.type;
40
45
  exports.motionActivityIndeterminate = ui_motion.motionActivityIndeterminate;
41
46
  exports.motionActivityPulse = ui_motion.motionActivityPulse;
42
47
  exports.motionActivitySpin = ui_motion.motionActivitySpin;
@@ -53,7 +58,12 @@ exports.motionPresenceSheet = ui_motion.motionPresenceSheet;
53
58
  exports.motionPresenceToast = ui_motion.motionPresenceToast;
54
59
  exports.motionPresenceTooltip = ui_motion.motionPresenceTooltip;
55
60
  exports.motionRelocate = ui_motion.motionRelocate;
61
+ exports.motionRelocateLong = ui_motion.motionRelocateLong;
62
+ exports.motionRim = ui_motion.motionRim;
63
+ exports.motionRowLayer = ui_motion.motionRowLayer;
56
64
  exports.motionStateLayer = ui_motion.motionStateLayer;
57
65
  exports.motionTactile = ui_motion.motionTactile;
66
+ exports.motionTactileField = ui_motion.motionTactileField;
67
+ exports.motionTactileWide = ui_motion.motionTactileWide;
58
68
  exports.cn = utils.cn;
59
69
  //# sourceMappingURL=dev.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"dev.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"dev.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,9 +1,9 @@
1
1
  import { jsxs, jsx } from 'react/jsx-runtime';
2
2
  import { cn } from '../libs/utils.js';
3
- import { tone, text, shape } from './ui.common.js';
3
+ import { tone, text, shape, type } from './ui.common.js';
4
4
 
5
5
  const Badge = ({ children, variant = "primary", icon, className, ...props }) => {
6
- return (jsxs("span", { ...props, className: cn("inline-flex min-h-7 min-w-0 max-w-full items-center justify-center gap-1.5 px-3 py-1 text-xs font-semibold", shape.pill, tone.soft[variant], text.high, className), children: [icon && (jsx("span", { className: cn("inline-flex size-3.5 shrink-0 items-center justify-center [&>svg]:size-3.5", tone.text[variant]), "aria-hidden": "true", children: icon })), jsx("span", { className: cn("min-w-0 truncate"), children: children })] }));
6
+ return (jsxs("span", { ...props, className: 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", type.caption, shape.pill, tone.soft[variant], text.high, className), children: [icon && (jsx("span", { className: cn("inline-flex size-3.5 shrink-0 items-center justify-center [&>svg]:size-3.5", tone.text[variant]), "aria-hidden": "true", children: icon })), jsx("span", { className: cn("min-w-0 truncate"), children: children })] }));
7
7
  };
8
8
 
9
9
  export { Badge as default };
@@ -1 +1 @@
1
- {"version":3,"file":"Badge.js","sources":["../../../src/components/Badge.tsx"],"sourcesContent":["import React, { type HTMLAttributes, type ReactNode } from \"react\";\nimport { cn } from \"@/libs/utils\";\nimport { shape, text, tone } 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 = \"primary\",\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 text-xs font-semibold\",\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(\"inline-flex size-3.5 shrink-0 items-center justify-center [&>svg]:size-3.5\", 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","_jsx"],"mappings":";;;;AAWA,MAAM,KAAK,GAAG,CAAC,EACb,QAAQ,EACR,OAAO,GAAG,SAAS,EACnB,IAAI,EACJ,SAAS,EACT,GAAG,KAAK,EACG,KAAI;AACf,IAAA,QACEA,IAAA,CAAA,MAAA,EAAA,EAAA,GACM,KAAK,EACT,SAAS,EAAE,EAAE,CACX,4GAA4G,EAC5G,KAAK,CAAC,IAAI,EACV,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAClB,IAAI,CAAC,IAAI,EACT,SAAS,CACV,EAAA,QAAA,EAAA,CAIA,IAAI,KACHC,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAE,EAAE,CAAC,4EAA4E,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAA,aAAA,EAAc,MAAM,EAAA,QAAA,EACtI,IAAI,EAAA,CACA,CACR,EACDA,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAE,EAAE,CAAC,kBAAkB,CAAC,EAAA,QAAA,EAAG,QAAQ,EAAA,CAAQ,CAAA,EAAA,CACrD;AAEX;;"}
1
+ {"version":3,"file":"Badge.js","sources":["../../../src/components/Badge.tsx"],"sourcesContent":["import React, { type HTMLAttributes, type ReactNode } from \"react\";\nimport { cn } from \"@/libs/utils\";\nimport { 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 = \"primary\",\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(\"inline-flex size-3.5 shrink-0 items-center justify-center [&>svg]:size-3.5\", 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","_jsx"],"mappings":";;;;AAWA,MAAM,KAAK,GAAG,CAAC,EACb,QAAQ,EACR,OAAO,GAAG,SAAS,EACnB,IAAI,EACJ,SAAS,EACT,GAAG,KAAK,EACG,KAAI;AACf,IAAA,QACEA,IAAA,CAAA,MAAA,EAAA,EAAA,GACM,KAAK,EACT,SAAS,EAAE,EAAE,CACX,oGAAoG,EACpG,IAAI,CAAC,OAAO,EACZ,KAAK,CAAC,IAAI,EACV,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAClB,IAAI,CAAC,IAAI,EACT,SAAS,CACV,aAIA,IAAI,KACHC,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAE,EAAE,CAAC,4EAA4E,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,iBAAc,MAAM,EAAA,QAAA,EACtI,IAAI,EAAA,CACA,CACR,EACDA,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAE,EAAE,CAAC,kBAAkB,CAAC,EAAA,QAAA,EAAG,QAAQ,EAAA,CAAQ,CAAA,EAAA,CACrD;AAEX;;"}
@@ -3,10 +3,16 @@ import { jsxs, jsx } from 'react/jsx-runtime';
3
3
  import { Button as Button$1 } from '@base-ui/react/button';
4
4
  import { forwardRef } from 'react';
5
5
  import { cn } from '../libs/utils.js';
6
- import { state, elevation, stateLayer, tone, focusRing, density, shape } from './ui.common.js';
6
+ import { iconSlot, state, elevation, stateLayer, tone, focusRing, density, shape } from './ui.common.js';
7
7
  import { motionTactile } from './ui.motion.js';
8
8
  import { Spinner } from './Spinner.js';
9
9
 
10
+ /* The mark follows the type step beside it (§10): a compact label takes the compact slot. */
11
+ const slotMap = {
12
+ sm: iconSlot.compact,
13
+ md: iconSlot.normal,
14
+ lg: iconSlot.prominent,
15
+ };
10
16
  const sizeMap = {
11
17
  sm: `${density.compact} px-4 py-2`,
12
18
  md: `${density.normal} px-6 py-3`,
@@ -14,8 +20,11 @@ const sizeMap = {
14
20
  };
15
21
  const Button = forwardRef(({ children, variant = "primary", appearance = "tonal", size = "md", icon, className, loading = false, disabled, type = "button", ...props }, ref) => {
16
22
  const isDisabled = disabled || loading;
17
- const isTactile = appearance === "tonal" && !isDisabled;
18
- return (jsxs(Button$1, { ...props, render: jsx("button", { ref: ref }), type: type, disabled: isDisabled, "aria-busy": loading || undefined, className: cn("relative inline-flex min-w-0 max-w-full items-center justify-center gap-2 font-medium tracking-[-0.01em]", shape.pill, sizeMap[size], motionTactile, focusRing, appearance === "filled" && tone.strong[variant], appearance === "filled" && !isDisabled && stateLayer.filled, appearance === "tonal" && tone.tonal[variant], appearance === "tonal" && tone.text[variant], appearance === "tonal" && !isDisabled && stateLayer.tonal, appearance === "text" && tone.text[variant], appearance === "text" && !isDisabled && stateLayer.quiet, appearance === "tonal" && elevation.raised, isTactile && state.recess, isDisabled ? state.disabled : state.enabled, className), children: [loading ? (jsx("span", { className: cn("inline-flex size-5 shrink-0 items-center justify-center", !icon && "absolute"), children: jsx(Spinner, { size: "small", className: cn("size-5") }) })) : icon ? (jsx("span", { className: cn("inline-flex size-5 shrink-0 items-center justify-center [&>svg]:size-5"), "aria-hidden": "true", children: icon })) : null, jsx("span", { className: cn("min-w-0 [overflow-wrap:anywhere]", loading && !icon && "opacity-0"), children: children })] }));
23
+ /* The action ladder: text sits flat, tonal and filled are raised and recess while held. The
24
+ priority action is never flatter than the one beside it. */
25
+ const isRaised = appearance !== "text";
26
+ const isTactile = isRaised && !isDisabled;
27
+ return (jsxs(Button$1, { ...props, render: jsx("button", { ref: ref }), type: type, disabled: isDisabled, "aria-busy": loading || undefined, className: cn("relative inline-flex min-w-0 max-w-full items-center justify-center gap-2 font-medium tracking-[-0.01em]", shape.pill, sizeMap[size], motionTactile, focusRing, appearance === "filled" && tone.strong[variant], appearance === "filled" && !isDisabled && stateLayer.filled, appearance === "tonal" && tone.tonal[variant], appearance === "tonal" && tone.text[variant], appearance === "tonal" && !isDisabled && (variant === "secondary" ? stateLayer.tonalNeutral : stateLayer.tonal), appearance === "text" && tone.text[variant], appearance === "text" && !isDisabled && stateLayer.quiet, isRaised && elevation.raised, isTactile && state.recess, isDisabled ? state.disabled : state.enabled, className), children: [loading ? (jsx("span", { className: cn(slotMap[size], !icon && "absolute"), children: jsx(Spinner, { size: "small", className: cn("size-full") }) })) : icon ? (jsx("span", { className: cn(slotMap[size]), "aria-hidden": "true", children: icon })) : null, jsx("span", { className: cn("min-w-0 [overflow-wrap:anywhere]", loading && !icon && "opacity-0"), children: children })] }));
19
28
  });
20
29
  Button.displayName = "Button";
21
30
 
@@ -1 +1 @@
1
- {"version":3,"file":"Button.js","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 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\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 const isTactile = appearance === \"tonal\" && !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 && stateLayer.tonal,\n appearance === \"text\" && tone.text[variant],\n appearance === \"text\" && !isDisabled && stateLayer.quiet,\n appearance === \"tonal\" && 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 20px box, so a nested\n node — a wrapped mark, a status dot — cannot change the control's width, and the loading\n mark lands in the box the icon had. `[&>svg]` normalizes direct SVG artwork; sizing nested\n artwork is the caller's business, as §17 says. */}\n {loading ? (\n <span className={cn(\"inline-flex size-5 shrink-0 items-center justify-center\", !icon && \"absolute\")}>\n <Spinner size=\"small\" className={cn(\"size-5\")} />\n </span>\n ) : icon ? (\n <span className={cn(\"inline-flex size-5 shrink-0 items-center justify-center [&>svg]:size-5\")} 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":["_jsxs","BaseButton","_jsx"],"mappings":"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"}
1
+ {"version":3,"file":"Button.js","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":["_jsxs","BaseButton","_jsx"],"mappings":"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"}
@@ -4,7 +4,7 @@ import { useDirection } from '@base-ui/react/direction-provider';
4
4
  import { ArrowLeft, ArrowRight } from 'lucide-react';
5
5
  import { forwardRef, useMemo, useCallback, useState, useRef, useEffect, useId } from 'react';
6
6
  import { cn } from '../libs/utils.js';
7
- import { state, density, shape, text, focusRingInset, stateLayer, tone, elevation } from './ui.common.js';
7
+ import { state, density, shape, text, focusRingInset, stateLayer, type, tone, elevation } from './ui.common.js';
8
8
  import { motionInkPress, motionFeedback, motionTactile } from './ui.motion.js';
9
9
  import { resolveCalendarLabels, createCalendarFormat, normalizeCalendarDate, todayCalendarDate, parseCalendarDate, normalizeDateRange, daysInMonth, dayOfWeek, toCalendarDate, compareCalendarDates, rangeIncludesDate, addCalendarMonths, addCalendarDays } from './date-family.js';
10
10
 
@@ -262,7 +262,7 @@ const Calendar = forwardRef((props, ref) => {
262
262
  }
263
263
  }, className: cn("w-full table-fixed border-separate border-spacing-0"), children: [jsx("thead", { children: jsx("tr", { children: Array.from({ length: 7 }, (_, index) => {
264
264
  const name = format.weekdayNames[(index + weekStartsOn) % 7];
265
- return (jsxs("th", { scope: "col", abbr: name.long, className: cn("h-8 px-0 text-center text-xs font-medium", text.medium), children: [jsx("span", { "aria-hidden": "true", children: name.short }), jsx("span", { className: cn("sr-only"), children: name.long })] }, name.long));
265
+ return (jsxs("th", { scope: "col", abbr: name.long, className: cn("h-8 px-0 text-center font-medium", type.caption, text.medium), children: [jsx("span", { "aria-hidden": "true", children: name.short }), jsx("span", { className: cn("sr-only"), children: name.long })] }, name.long));
266
266
  }) }) }), jsx("tbody", { children: rows.map((row, rowIndex) => (jsx("tr", { children: row.map((day, columnIndex) => {
267
267
  if (day === null) {
268
268
  return (jsx("td", { role: "gridcell", className: cn("p-0 text-center align-middle") }, `blank-${rowIndex}-${columnIndex}`));
@@ -286,7 +286,7 @@ const Calendar = forwardRef((props, ref) => {
286
286
  if (day !== activeDayState)
287
287
  setActiveDayState(day);
288
288
  }, className: cn(dayButtonClassName, text.high, isToday && `${tone.text.primary} underline underline-offset-4`, selected && isEdge && "font-medium", selected && !joinedRange && cn(invalid ? tone.selected.danger : tone.selected.primary, elevation.control), !disabled && !unavailable && `${stateLayer.quiet} ${state.enabled}`, unavailable && !disabled && state.disabled, disabled && state.disabledDescendant), children: format.formatDayNumber(day) })] }, date));
289
- }) }, rowIndex))) })] }), jsxs("div", { className: cn("mt-3 flex items-center justify-between gap-3"), children: [jsx("button", { type: "button", disabled: disabled, onClick: goToToday, className: cn(todayButtonClassName, disabled ? state.disabledDescendant : state.enabled), children: labels.today }), jsx("div", { role: "status", className: cn("min-w-0 text-xs", tone.text.danger), children: rangeMessage !== null && rangeMessage !== void 0 ? rangeMessage : "" })] }), jsx("p", { id: hintId, className: cn("sr-only"), children: isRange ? labels.selectRange : labels.selectDate })] }));
289
+ }) }, rowIndex))) })] }), jsxs("div", { className: cn("mt-3 flex items-center justify-between gap-3"), children: [jsx("button", { type: "button", disabled: disabled, onClick: goToToday, className: cn(todayButtonClassName, disabled ? state.disabledDescendant : state.enabled), children: labels.today }), jsx("div", { role: "status", className: cn("min-w-0", type.supporting, tone.text.danger), children: rangeMessage !== null && rangeMessage !== void 0 ? rangeMessage : "" })] }), jsx("p", { id: hintId, className: cn("sr-only"), children: isRange ? labels.selectRange : labels.selectDate })] }));
290
290
  });
291
291
  Calendar.displayName = "Calendar";
292
292