@avenue-ticketing/ui 0.11.0 → 0.12.0-beta.2

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 (226) hide show
  1. package/README.md +47 -0
  2. package/dist/badge-types-B67wcd4m.d.ts +22 -0
  3. package/dist/react/app-store-buttons-outline.d.ts +17 -0
  4. package/dist/react/app-store-buttons-outline.js +582 -0
  5. package/dist/react/app-store-buttons-outline.js.map +1 -0
  6. package/dist/react/app-store-buttons.d.ts +20 -0
  7. package/dist/react/app-store-buttons.js +817 -0
  8. package/dist/react/app-store-buttons.js.map +1 -0
  9. package/dist/react/avatar-label-group.d.ts +14 -0
  10. package/dist/react/avatar-label-group.js +183 -0
  11. package/dist/react/avatar-label-group.js.map +1 -0
  12. package/dist/react/avatar-profile-photo.d.ts +9 -0
  13. package/dist/react/avatar-profile-photo.js +202 -0
  14. package/dist/react/avatar-profile-photo.js.map +1 -0
  15. package/dist/react/avatar.d.ts +66 -40
  16. package/dist/react/avatar.js +159 -149
  17. package/dist/react/avatar.js.map +1 -1
  18. package/dist/react/badge-groups.d.ts +25 -0
  19. package/dist/react/badge-groups.js +162 -0
  20. package/dist/react/badge-groups.js.map +1 -0
  21. package/dist/react/badge.d.ts +123 -59
  22. package/dist/react/badge.js +314 -86
  23. package/dist/react/badge.js.map +1 -1
  24. package/dist/react/button-group.d.ts +43 -0
  25. package/dist/react/button-group.js +108 -0
  26. package/dist/react/button-group.js.map +1 -0
  27. package/dist/react/button-utility.d.ts +47 -0
  28. package/dist/react/button-utility.js +158 -0
  29. package/dist/react/button-utility.js.map +1 -0
  30. package/dist/react/button.d.ts +112 -37
  31. package/dist/react/button.js +270 -55
  32. package/dist/react/button.js.map +1 -1
  33. package/dist/react/checkbox.d.ts +25 -8
  34. package/dist/react/checkbox.js +115 -110
  35. package/dist/react/checkbox.js.map +1 -1
  36. package/dist/react/close-button.d.ts +25 -0
  37. package/dist/react/close-button.js +54 -0
  38. package/dist/react/close-button.js.map +1 -0
  39. package/dist/react/combobox.d.ts +18 -0
  40. package/dist/react/combobox.js +574 -0
  41. package/dist/react/combobox.js.map +1 -0
  42. package/dist/react/dialog.d.ts +15 -15
  43. package/dist/react/dialog.js +43 -108
  44. package/dist/react/dialog.js.map +1 -1
  45. package/dist/react/dropdown-account-breadcrumb.d.ts +5 -0
  46. package/dist/react/dropdown-account-breadcrumb.js +481 -0
  47. package/dist/react/dropdown-account-breadcrumb.js.map +1 -0
  48. package/dist/react/dropdown-account-button.d.ts +5 -0
  49. package/dist/react/dropdown-account-button.js +938 -0
  50. package/dist/react/dropdown-account-button.js.map +1 -0
  51. package/dist/react/dropdown-account-card-md.d.ts +5 -0
  52. package/dist/react/dropdown-account-card-md.js +714 -0
  53. package/dist/react/dropdown-account-card-md.js.map +1 -0
  54. package/dist/react/dropdown-account-card-sm.d.ts +5 -0
  55. package/dist/react/dropdown-account-card-sm.js +692 -0
  56. package/dist/react/dropdown-account-card-sm.js.map +1 -0
  57. package/dist/react/dropdown-account-card-xs.d.ts +5 -0
  58. package/dist/react/dropdown-account-card-xs.js +672 -0
  59. package/dist/react/dropdown-account-card-xs.js.map +1 -0
  60. package/dist/react/dropdown-avatar.d.ts +5 -0
  61. package/dist/react/dropdown-avatar.js +955 -0
  62. package/dist/react/dropdown-avatar.js.map +1 -0
  63. package/dist/react/dropdown-button-advanced.d.ts +5 -0
  64. package/dist/react/dropdown-button-advanced.js +964 -0
  65. package/dist/react/dropdown-button-advanced.js.map +1 -0
  66. package/dist/react/dropdown-button-link.d.ts +5 -0
  67. package/dist/react/dropdown-button-link.js +666 -0
  68. package/dist/react/dropdown-button-link.js.map +1 -0
  69. package/dist/react/dropdown-button-simple.d.ts +5 -0
  70. package/dist/react/dropdown-button-simple.js +919 -0
  71. package/dist/react/dropdown-button-simple.js.map +1 -0
  72. package/dist/react/dropdown-icon-advanced.d.ts +5 -0
  73. package/dist/react/dropdown-icon-advanced.js +708 -0
  74. package/dist/react/dropdown-icon-advanced.js.map +1 -0
  75. package/dist/react/dropdown-icon-simple.d.ts +5 -0
  76. package/dist/react/dropdown-icon-simple.js +670 -0
  77. package/dist/react/dropdown-icon-simple.js.map +1 -0
  78. package/dist/react/dropdown-integration.d.ts +5 -0
  79. package/dist/react/dropdown-integration.js +1490 -0
  80. package/dist/react/dropdown-integration.js.map +1 -0
  81. package/dist/react/dropdown-search-advanced.d.ts +5 -0
  82. package/dist/react/dropdown-search-advanced.js +1163 -0
  83. package/dist/react/dropdown-search-advanced.js.map +1 -0
  84. package/dist/react/dropdown-search-simple.d.ts +5 -0
  85. package/dist/react/dropdown-search-simple.js +1125 -0
  86. package/dist/react/dropdown-search-simple.js.map +1 -0
  87. package/dist/react/dropdown.d.ts +35 -133
  88. package/dist/react/dropdown.js +536 -1318
  89. package/dist/react/dropdown.js.map +1 -1
  90. package/dist/react/file-upload-trigger.d.ts +34 -0
  91. package/dist/react/file-upload-trigger.js +39 -0
  92. package/dist/react/file-upload-trigger.js.map +1 -0
  93. package/dist/react/form.d.ts +10 -0
  94. package/dist/react/form.js +11 -0
  95. package/dist/react/form.js.map +1 -0
  96. package/dist/react/hint-text.d.ts +17 -0
  97. package/dist/react/hint-text.js +36 -0
  98. package/dist/react/hint-text.js.map +1 -0
  99. package/dist/react/hook-form.d.ts +35 -0
  100. package/dist/react/hook-form.js +50 -0
  101. package/dist/react/hook-form.js.map +1 -0
  102. package/dist/react/input-date.d.ts +43 -0
  103. package/dist/react/input-date.js +306 -0
  104. package/dist/react/input-date.js.map +1 -0
  105. package/dist/react/input-file.d.ts +45 -0
  106. package/dist/react/input-file.js +748 -0
  107. package/dist/react/input-file.js.map +1 -0
  108. package/dist/react/input-group.d.ts +37 -0
  109. package/dist/react/input-group.js +251 -0
  110. package/dist/react/input-group.js.map +1 -0
  111. package/dist/react/input-number.d.ts +32 -0
  112. package/dist/react/input-number.js +553 -0
  113. package/dist/react/input-number.js.map +1 -0
  114. package/dist/react/input-payment.d.ts +16 -0
  115. package/dist/react/input-payment.js +593 -0
  116. package/dist/react/input-payment.js.map +1 -0
  117. package/dist/react/input-tags-outer.d.ts +53 -0
  118. package/dist/react/input-tags-outer.js +607 -0
  119. package/dist/react/input-tags-outer.js.map +1 -0
  120. package/dist/react/input-tags.d.ts +53 -0
  121. package/dist/react/input-tags.js +565 -0
  122. package/dist/react/input-tags.js.map +1 -0
  123. package/dist/react/input.d.ts +71 -22
  124. package/dist/react/input.js +332 -45
  125. package/dist/react/input.js.map +1 -1
  126. package/dist/react/label.d.ts +18 -0
  127. package/dist/react/label.js +112 -0
  128. package/dist/react/label.js.map +1 -0
  129. package/dist/react/multi-select.d.ts +90 -0
  130. package/dist/react/multi-select.js +1237 -0
  131. package/dist/react/multi-select.js.map +1 -0
  132. package/dist/react/pin-input.d.ts +59 -0
  133. package/dist/react/pin-input.js +229 -0
  134. package/dist/react/pin-input.js.map +1 -0
  135. package/dist/react/popover.d.ts +14 -71
  136. package/dist/react/popover.js +171 -540
  137. package/dist/react/popover.js.map +1 -1
  138. package/dist/react/progress-circle.d.ts +9 -0
  139. package/dist/react/progress-circle.js +36 -0
  140. package/dist/react/progress-circle.js.map +1 -0
  141. package/dist/react/progress-circles.d.ts +14 -0
  142. package/dist/react/progress-circles.js +160 -0
  143. package/dist/react/progress-circles.js.map +1 -0
  144. package/dist/react/progress-indicators.d.ts +52 -0
  145. package/dist/react/progress-indicators.js +78 -0
  146. package/dist/react/progress-indicators.js.map +1 -0
  147. package/dist/react/radio-buttons.d.ts +35 -0
  148. package/dist/react/radio-buttons.js +117 -0
  149. package/dist/react/radio-buttons.js.map +1 -0
  150. package/dist/react/scroll-header.d.ts +6 -0
  151. package/dist/react/scroll-header.js +42 -61
  152. package/dist/react/scroll-header.js.map +1 -1
  153. package/dist/react/scroll-wheel.d.ts +4 -5
  154. package/dist/react/scroll-wheel.js +19 -15
  155. package/dist/react/scroll-wheel.js.map +1 -1
  156. package/dist/react/select-item.d.ts +14 -0
  157. package/dist/react/select-item.js +340 -0
  158. package/dist/react/select-item.js.map +1 -0
  159. package/dist/react/select-native.d.ts +17 -0
  160. package/dist/react/select-native.js +203 -0
  161. package/dist/react/select-native.js.map +1 -0
  162. package/dist/react/select.d.ts +19 -61
  163. package/dist/react/select.js +866 -908
  164. package/dist/react/select.js.map +1 -1
  165. package/dist/react/sheet.d.ts +19 -19
  166. package/dist/react/sheet.js +97 -219
  167. package/dist/react/sheet.js.map +1 -1
  168. package/dist/react/slider.d.ts +15 -0
  169. package/dist/react/slider.js +66 -0
  170. package/dist/react/slider.js.map +1 -0
  171. package/dist/react/social-button.d.ts +55 -0
  172. package/dist/react/social-button.js +263 -0
  173. package/dist/react/social-button.js.map +1 -0
  174. package/dist/react/social-logos.d.ts +20 -0
  175. package/dist/react/social-logos.js +131 -0
  176. package/dist/react/social-logos.js.map +1 -0
  177. package/dist/react/switch.d.ts +21 -36
  178. package/dist/react/switch.js +121 -109
  179. package/dist/react/switch.js.map +1 -1
  180. package/dist/react/tag-select.d.ts +47 -0
  181. package/dist/react/tag-select.js +1252 -0
  182. package/dist/react/tag-select.js.map +1 -0
  183. package/dist/react/tags.d.ts +30 -0
  184. package/dist/react/tags.js +228 -0
  185. package/dist/react/tags.js.map +1 -0
  186. package/dist/react/textarea.d.ts +40 -4
  187. package/dist/react/textarea.js +193 -27
  188. package/dist/react/textarea.js.map +1 -1
  189. package/dist/react/tooltip.d.ts +30 -43
  190. package/dist/react/tooltip.js +65 -521
  191. package/dist/react/tooltip.js.map +1 -1
  192. package/dist/select-mobile-sheet-CB2ptDTJ.d.ts +12 -0
  193. package/dist/select-shared-oJEeJxeB.d.ts +68 -0
  194. package/package.json +28 -21
  195. package/source.css +2 -13
  196. package/theme.css +883 -79
  197. package/dist/react/calendar.d.ts +0 -13
  198. package/dist/react/calendar.js +0 -4639
  199. package/dist/react/calendar.js.map +0 -1
  200. package/dist/react/card.d.ts +0 -11
  201. package/dist/react/card.js +0 -113
  202. package/dist/react/card.js.map +0 -1
  203. package/dist/react/datetime-picker.d.ts +0 -21
  204. package/dist/react/datetime-picker.js +0 -6142
  205. package/dist/react/datetime-picker.js.map +0 -1
  206. package/dist/react/pagination.d.ts +0 -28
  207. package/dist/react/pagination.js +0 -262
  208. package/dist/react/pagination.js.map +0 -1
  209. package/dist/react/table-pagination.d.ts +0 -15
  210. package/dist/react/table-pagination.js +0 -1247
  211. package/dist/react/table-pagination.js.map +0 -1
  212. package/dist/react/table-view/column-menu.d.ts +0 -15
  213. package/dist/react/table-view/column-menu.js +0 -1049
  214. package/dist/react/table-view/column-menu.js.map +0 -1
  215. package/dist/react/table-view/index.d.ts +0 -70
  216. package/dist/react/table-view/index.js +0 -2284
  217. package/dist/react/table-view/index.js.map +0 -1
  218. package/dist/react/table.d.ts +0 -86
  219. package/dist/react/table.js +0 -414
  220. package/dist/react/table.js.map +0 -1
  221. package/dist/react/tabs.d.ts +0 -34
  222. package/dist/react/tabs.js +0 -423
  223. package/dist/react/tabs.js.map +0 -1
  224. package/dist/react/time-picker.d.ts +0 -22
  225. package/dist/react/time-picker.js +0 -856
  226. package/dist/react/time-picker.js.map +0 -1
@@ -1,41 +1,116 @@
1
- import * as React from 'react';
1
+ import { FC, ReactNode, ReactElement } from 'react';
2
+ import { LinkProps as LinkProps$1, ButtonProps as ButtonProps$1 } from 'react-aria-components';
2
3
 
3
- declare const sizeClass: {
4
- readonly xs: "h-8 min-h-8 gap-2 px-4 text-sm has-[>svg]:px-3 [&_svg:not([class*='size-'])]:size-3";
5
- readonly default: "h-10 min-h-10 gap-2 px-5 text-sm has-[>svg]:px-4 [&_svg:not([class*='size-'])]:size-4";
6
- readonly lg: "h-11 min-h-11 gap-2 px-6 text-base has-[>svg]:px-5 [&_svg:not([class*='size-'])]:size-5";
4
+ declare const styles: {
5
+ common: {
6
+ root: string;
7
+ icon: string;
8
+ };
9
+ sizes: {
10
+ xs: {
11
+ root: string;
12
+ linkRoot: string;
13
+ };
14
+ sm: {
15
+ root: string;
16
+ linkRoot: string;
17
+ };
18
+ md: {
19
+ root: string;
20
+ linkRoot: string;
21
+ };
22
+ lg: {
23
+ root: string;
24
+ linkRoot: string;
25
+ };
26
+ xl: {
27
+ root: string;
28
+ linkRoot: string;
29
+ };
30
+ };
31
+ colors: {
32
+ /** Figma Hierarchy=Primary — dark neutral solid; hover lightens to fg-tertiary_hover (#404040). */
33
+ primary: {
34
+ root: string;
35
+ };
36
+ /** Figma Hierarchy=Brand — purple solid; hover darkens to bg-brand-solid_hover (#6d28d9). */
37
+ brand: {
38
+ root: string;
39
+ };
40
+ /** Figma Hierarchy=Secondary — border-primary + shadow-xs + skeuomorphic inner rim overlay. */
41
+ secondary: {
42
+ root: string;
43
+ };
44
+ /** Figma Hierarchy=Tertiary */
45
+ tertiary: {
46
+ root: string;
47
+ };
48
+ /** Figma Hierarchy=Link color — text + icons share brand-secondary; hover underlines with fg-brand-secondary. */
49
+ "link-color": {
50
+ root: string;
51
+ };
52
+ /** Figma Hierarchy=Link gray — text + icons share tertiary; hover underlines with fg-quaternary. */
53
+ "link-gray": {
54
+ root: string;
55
+ };
56
+ "primary-destructive": {
57
+ root: string;
58
+ };
59
+ "secondary-destructive": {
60
+ root: string;
61
+ };
62
+ "tertiary-destructive": {
63
+ root: string;
64
+ };
65
+ /** Figma Hierarchy=Link (destructive) — text + icons share error-primary; hover underlines. */
66
+ "link-destructive": {
67
+ root: string;
68
+ };
69
+ };
7
70
  };
8
- declare const roundedClass: {
9
- readonly full: "rounded-full";
10
- readonly lg: "rounded-lg";
11
- readonly md: "rounded-md";
71
+ /**
72
+ * Common props shared between button and anchor variants
73
+ */
74
+ interface CommonProps {
75
+ /** Disables the button and shows a disabled state */
76
+ isDisabled?: boolean;
77
+ /** Shows a loading spinner and disables the button */
78
+ isLoading?: boolean;
79
+ /** The size variant of the button */
80
+ size?: keyof typeof styles.sizes;
81
+ /** The color variant of the button */
82
+ color?: keyof typeof styles.colors;
83
+ /** Icon component or element to show before the text */
84
+ iconLeading?: FC<{
85
+ className?: string;
86
+ }> | ReactNode;
87
+ /** Icon component or element to show after the text */
88
+ iconTrailing?: FC<{
89
+ className?: string;
90
+ }> | ReactNode;
91
+ /** Removes horizontal padding from the text content */
92
+ noTextPadding?: boolean;
93
+ /** When true, keeps the text visible during loading state */
94
+ showTextWhileLoading?: boolean;
95
+ children?: ReactNode;
96
+ className?: string;
97
+ }
98
+ /**
99
+ * Props for the button variant (non-link)
100
+ */
101
+ interface ButtonProps extends CommonProps, Omit<ButtonProps$1, "children" | "className"> {
102
+ }
103
+ /**
104
+ * Props for the link variant (anchor tag)
105
+ */
106
+ interface LinkProps extends CommonProps, Omit<LinkProps$1, "children" | "className"> {
107
+ href: NonNullable<LinkProps$1["href"]>;
108
+ }
109
+ /** Union type of button and link props */
110
+ type Props = ButtonProps | LinkProps;
111
+ declare const Button: {
112
+ (props: LinkProps): ReactElement<LinkProps>;
113
+ (props: ButtonProps): ReactElement<ButtonProps>;
12
114
  };
13
- declare const variantClass: {
14
- readonly primary: "bg-primary text-background border border-transparent hover:bg-primary/90 active:bg-primary/85";
15
- readonly secondary: "bg-background text-primary border border-primary/10 hover:bg-primary/5";
16
- readonly destructive: "bg-background text-red-500 border border-red-500/25 hover:bg-red-500/5";
17
- readonly success: "bg-background text-green-500 border border-green-500/25 hover:bg-green-500/5";
18
- };
19
- type ButtonProps = React.ComponentProps<"button"> & {
20
- /**
21
- * Visual style: neutral (`secondary`, `primary`), or outline (`destructive`,
22
- * `success`) using Tailwind `red-500` / `green-500` text and matching borders on
23
- * `bg-background` (no solid fill).
24
- */
25
- variant?: keyof typeof variantClass;
26
- /**
27
- * Corner radius. Labeled buttons default to `full` (pill). `iconOnly` buttons
28
- * default to `md` (square corners) unless you pass `rounded` explicitly.
29
- */
30
- rounded?: keyof typeof roundedClass;
31
- /** Height and horizontal padding: `default` or `lg` only. */
32
- size?: keyof typeof sizeClass;
33
- /**
34
- * Square icon-only control; same `size` presets (`default` | `lg`). Pair with
35
- * `aria-label` (or `title`) when there is no visible text.
36
- */
37
- iconOnly?: boolean;
38
- };
39
- declare const Button: React.ForwardRefExoticComponent<Omit<ButtonProps, "ref"> & React.RefAttributes<HTMLButtonElement>>;
40
115
 
41
- export { Button, type ButtonProps };
116
+ export { Button, type ButtonProps, type CommonProps, type Props };
@@ -1,68 +1,283 @@
1
- import * as React from 'react';
2
- import { clsx } from 'clsx';
3
- import { twMerge } from 'tailwind-merge';
4
- import { jsx } from 'react/jsx-runtime';
1
+ import { isValidElement } from 'react';
2
+ import { Link, Button as Button$1 } from 'react-aria-components';
3
+ import { extendTailwindMerge } from 'tailwind-merge';
4
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
5
5
 
6
- // src/react/button.tsx
7
- function cn(...inputs) {
8
- return twMerge(clsx(inputs));
6
+ var twMerge = extendTailwindMerge({
7
+ extend: {
8
+ theme: {
9
+ text: ["display-xs", "display-sm", "display-md", "display-lg", "display-xl", "display-2xl"]
10
+ }
11
+ }
12
+ });
13
+ var cx = twMerge;
14
+ function sortCx(classes) {
15
+ return classes;
9
16
  }
10
- var sizeClass = {
11
- xs: "h-8 min-h-8 gap-2 px-4 text-sm has-[>svg]:px-3 [&_svg:not([class*='size-'])]:size-3",
12
- default: "h-10 min-h-10 gap-2 px-5 text-sm has-[>svg]:px-4 [&_svg:not([class*='size-'])]:size-4",
13
- lg: "h-11 min-h-11 gap-2 px-6 text-base has-[>svg]:px-5 [&_svg:not([class*='size-'])]:size-5"
17
+
18
+ // ../../utils/is-react-component.ts
19
+ var isFunctionComponent = (component) => {
20
+ return typeof component === "function";
14
21
  };
15
- var iconOnlySizeClass = {
16
- xs: "size-8 min-h-8 min-w-8 gap-0 p-0 [&_svg:not([class*='size-'])]:size-3",
17
- default: "size-10 min-h-10 min-w-10 gap-0 p-0 [&_svg:not([class*='size-'])]:size-4",
18
- lg: "size-11 min-h-11 min-w-11 gap-0 p-0 [&_svg:not([class*='size-'])]:size-5"
22
+ var isClassComponent = (component) => {
23
+ return typeof component === "function" && component.prototype && (!!component.prototype.isReactComponent || !!component.prototype.render);
19
24
  };
20
- var roundedClass = {
21
- full: "rounded-full",
22
- lg: "rounded-lg",
23
- md: "rounded-md"
25
+ var isForwardRefComponent = (component) => {
26
+ return typeof component === "object" && component !== null && component.$$typeof.toString() === "Symbol(react.forward_ref)";
24
27
  };
25
- var variantClass = {
26
- primary: "bg-primary text-background border border-transparent hover:bg-primary/90 active:bg-primary/85",
27
- secondary: "bg-background text-primary border border-primary/10 hover:bg-primary/5",
28
- destructive: "bg-background text-red-500 border border-red-500/25 hover:bg-red-500/5",
29
- success: "bg-background text-green-500 border border-green-500/25 hover:bg-green-500/5"
28
+ var isReactComponent = (component) => {
29
+ return isFunctionComponent(component) || isForwardRefComponent(component) || isClassComponent(component);
30
30
  };
31
- var Button = React.forwardRef(
32
- ({
33
- className,
34
- type = "button",
35
- variant = "secondary",
36
- rounded: roundedProp,
37
- size = "default",
38
- iconOnly = false,
39
- disabled,
40
- ...props
41
- }, ref) => {
42
- const rounded = roundedProp ?? (iconOnly ? "md" : "full");
43
- return /* @__PURE__ */ jsx(
44
- "button",
31
+ var focusShadowPlain = "focus-visible:outline-none focus-visible:[box-shadow:0px_0px_0px_2px_var(--color-bg-primary),0px_0px_0px_4px_var(--color-focus-ring)]";
32
+ var focusShadowSkeuomorphic = "focus-visible:outline-none focus-visible:[box-shadow:var(--shadow-xs-skeuomorphic),0px_0px_0px_2px_var(--color-bg-primary),0px_0px_0px_4px_var(--color-focus-ring)]";
33
+ var skeuomorphicGradientBorderClass = [
34
+ "ring-1 ring-inset ring-transparent",
35
+ "before:pointer-events-none before:absolute before:inset-px before:rounded-[inherit] before:border before:border-[#ffffff1f] before:content-['']",
36
+ "before:[mask-image:linear-gradient(to_bottom,#000,transparent)]"
37
+ ].join(" ");
38
+ var skeuomorphicShadowClass = ["shadow-xs-skeuomorphic", focusShadowSkeuomorphic, "overflow-hidden"].join(" ");
39
+ var focusShadowSecondary = "focus-visible:outline-none focus-visible:[box-shadow:0px_1px_2px_0px_rgba(0,0,0,0.05),0px_0px_0px_2px_var(--color-bg-primary),0px_0px_0px_4px_var(--color-focus-ring)]";
40
+ var secondaryInnerShadow = "after:pointer-events-none after:absolute after:inset-0 after:rounded-[inherit] after:content-[''] after:[box-shadow:inset_0px_-1px_0px_0px_rgba(0,0,0,0.05)]";
41
+ var secondaryShadowClass = ["relative overflow-hidden shadow-xs", secondaryInnerShadow, focusShadowSecondary].join(" ");
42
+ var inputNumberButtonClass = [
43
+ "in-data-number-input:border-0 in-data-number-input:shadow-none in-data-number-input:!rounded-none in-data-number-input:!h-full in-data-number-input:!min-h-0 in-data-number-input:self-stretch in-data-number-input:overflow-hidden",
44
+ "in-data-number-input:before:hidden in-data-number-input:after:hidden",
45
+ "in-data-number-input:focus-visible:outline-none in-data-number-input:focus-visible:shadow-none in-data-number-input:focus-visible:ring-0 in-data-number-input:focus-visible:![box-shadow:none]"
46
+ ].join(" ");
47
+ var inputAddonButtonClass = [
48
+ "in-data-input-wrapper:border-0 in-data-input-wrapper:shadow-none in-data-input-wrapper:!rounded-none in-data-input-wrapper:overflow-hidden",
49
+ "in-data-input-wrapper:in-data-trailing:border-l in-data-input-wrapper:in-data-trailing:border-solid in-data-input-wrapper:in-data-trailing:border-primary",
50
+ "in-data-input-wrapper:in-data-leading:border-r in-data-input-wrapper:in-data-leading:border-solid in-data-input-wrapper:in-data-leading:border-primary",
51
+ "in-data-input-wrapper:group-invalid:in-data-trailing:border-error_subtle in-data-input-wrapper:group-invalid:in-data-leading:border-error_subtle",
52
+ "in-data-input-wrapper:before:hidden in-data-input-wrapper:after:hidden",
53
+ "in-data-input-wrapper:focus-visible:outline-none in-data-input-wrapper:focus-visible:shadow-none in-data-input-wrapper:focus-visible:ring-0 in-data-input-wrapper:focus-visible:![box-shadow:none]"
54
+ ].join(" ");
55
+ var styles = sortCx({
56
+ common: {
57
+ root: [
58
+ "group relative inline-flex shrink-0 cursor-pointer items-center justify-center whitespace-nowrap rounded-full font-body outline-none before:absolute",
59
+ "font-semibold transition-[color,background-color,border-color,box-shadow,opacity,transform] duration-150 ease-out",
60
+ "pressed:scale-[0.985] pressed:duration-100 pressed:ease-linear motion-reduce:pressed:scale-100",
61
+ "disabled:pointer-events-none disabled:cursor-not-allowed in-data-input-wrapper:disabled:opacity-100",
62
+ inputAddonButtonClass,
63
+ inputNumberButtonClass,
64
+ // Stretch to InputGroup row height; padding/typography follow `data-input-size` on the field (Figma 85:1269).
65
+ "in-data-input-wrapper:!h-full in-data-input-wrapper:!min-h-0 in-data-input-wrapper:self-stretch",
66
+ "in-data-input-wrapper:in-data-[input-size=sm]:gap-1 in-data-input-wrapper:in-data-[input-size=sm]:px-3 in-data-input-wrapper:in-data-[input-size=sm]:py-2 in-data-input-wrapper:in-data-[input-size=sm]:text-sm",
67
+ "in-data-input-wrapper:in-data-[input-size=md]:gap-1 in-data-input-wrapper:in-data-[input-size=md]:px-3.5 in-data-input-wrapper:in-data-[input-size=md]:py-2.5 in-data-input-wrapper:in-data-[input-size=md]:text-sm",
68
+ "in-data-input-wrapper:in-data-[input-size=lg]:gap-1.5 in-data-input-wrapper:in-data-[input-size=lg]:px-4 in-data-input-wrapper:in-data-[input-size=lg]:py-2.5 in-data-input-wrapper:in-data-[input-size=lg]:text-md",
69
+ "*:data-icon:pointer-events-none *:data-icon:shrink-0 *:data-icon:transition-inherit-all"
70
+ ].join(" "),
71
+ icon: "pointer-events-none shrink-0 transition-inherit-all"
72
+ },
73
+ sizes: {
74
+ xs: {
75
+ root: [
76
+ "h-8 min-h-8 gap-1 px-[0.625rem] py-1.5 text-sm data-icon-only:size-8 data-icon-only:min-h-8 data-icon-only:min-w-8 data-icon-only:p-2",
77
+ "in-data-input-wrapper:data-icon-only:p-2.5",
78
+ "*:data-icon:size-4"
79
+ ].join(" "),
80
+ linkRoot: "h-auto min-h-0 gap-1 px-0! py-0! text-sm *:data-text:underline-offset-3"
81
+ },
82
+ sm: {
83
+ root: [
84
+ "h-9 min-h-9 gap-1 px-3 py-2 text-sm data-icon-only:size-9 data-icon-only:min-h-9 data-icon-only:min-w-9 data-icon-only:p-2",
85
+ "in-data-input-wrapper:data-icon-only:p-2.5",
86
+ "*:data-icon:size-5"
87
+ ].join(" "),
88
+ linkRoot: "h-auto min-h-0 gap-1 px-0! py-0! text-sm *:data-text:underline-offset-3"
89
+ },
90
+ md: {
91
+ root: [
92
+ "h-10 min-h-10 gap-1 px-3.5 py-2.5 text-sm data-icon-only:size-10 data-icon-only:min-h-10 data-icon-only:min-w-10 data-icon-only:p-2.5",
93
+ "in-data-input-wrapper:data-icon-only:p-3",
94
+ "*:data-icon:size-5"
95
+ ].join(" "),
96
+ linkRoot: "h-auto min-h-0 gap-1 px-0! py-0! text-sm *:data-text:underline-offset-4"
97
+ },
98
+ lg: {
99
+ root: "h-11 min-h-11 gap-1.5 px-4 py-2.5 text-md data-icon-only:size-11 data-icon-only:min-h-11 data-icon-only:min-w-11 data-icon-only:p-3 *:data-icon:size-5",
100
+ linkRoot: "h-auto min-h-0 gap-1.5 px-0! py-0! text-md *:data-text:underline-offset-4"
101
+ },
102
+ xl: {
103
+ root: "h-12 min-h-12 gap-1.5 px-[1.125rem] py-3 text-md data-icon-only:size-12 data-icon-only:min-h-12 data-icon-only:min-w-12 data-icon-only:p-3 data-icon-only:*:data-icon:size-6 *:data-icon:size-5",
104
+ linkRoot: "h-auto min-h-0 gap-1.5 px-0! py-0! text-md *:data-text:underline-offset-4"
105
+ }
106
+ },
107
+ colors: {
108
+ /** Figma Hierarchy=Primary — dark neutral solid; hover lightens to fg-tertiary_hover (#404040). */
109
+ primary: {
110
+ root: [
111
+ "bg-primary-solid text-white",
112
+ skeuomorphicShadowClass,
113
+ skeuomorphicGradientBorderClass,
114
+ "hover:bg-fg-tertiary_hover dark:hover:bg-quaternary",
115
+ "disabled:opacity-30",
116
+ "data-loading:bg-fg-tertiary_hover dark:data-loading:bg-quaternary",
117
+ "*:data-icon:not([data-icon=loading]):text-white/70"
118
+ ].join(" ")
119
+ },
120
+ /** Figma Hierarchy=Brand — purple solid; hover darkens to bg-brand-solid_hover (#6d28d9). */
121
+ brand: {
122
+ root: [
123
+ "bg-brand-solid text-primary_on-brand",
124
+ skeuomorphicShadowClass,
125
+ skeuomorphicGradientBorderClass,
126
+ "hover:bg-brand-solid_hover",
127
+ "disabled:opacity-50",
128
+ "data-loading:bg-brand-solid_hover",
129
+ "*:data-icon:not([data-icon=loading]):text-primary_on-brand"
130
+ ].join(" ")
131
+ },
132
+ /** Figma Hierarchy=Secondary — border-primary + shadow-xs + skeuomorphic inner rim overlay. */
133
+ secondary: {
134
+ root: [
135
+ "border border-solid border-primary bg-primary text-secondary",
136
+ secondaryShadowClass,
137
+ "hover:bg-primary_hover hover:text-secondary_hover",
138
+ "disabled:opacity-50",
139
+ "data-loading:bg-primary_hover",
140
+ "*:data-icon:text-fg-secondary hover:*:data-icon:text-fg-quaternary_hover"
141
+ ].join(" ")
142
+ },
143
+ /** Figma Hierarchy=Tertiary */
144
+ tertiary: {
145
+ root: [
146
+ "border border-transparent bg-transparent text-tertiary",
147
+ focusShadowPlain,
148
+ "hover:bg-primary_hover hover:text-tertiary_hover",
149
+ "disabled:opacity-50",
150
+ "*:data-icon:text-fg-tertiary hover:*:data-icon:text-fg-quaternary_hover"
151
+ ].join(" ")
152
+ },
153
+ /** Figma Hierarchy=Link color — text + icons share brand-secondary; hover underlines with fg-brand-secondary. */
154
+ "link-color": {
155
+ root: [
156
+ "h-auto min-h-0 border-0 bg-transparent px-0! py-0! text-brand-secondary shadow-none",
157
+ focusShadowPlain,
158
+ "hover:text-brand-secondary_hover",
159
+ "disabled:opacity-50",
160
+ "*:data-text:underline *:data-text:decoration-transparent *:data-text:decoration-solid hover:*:data-text:decoration-fg-brand-secondary"
161
+ ].join(" ")
162
+ },
163
+ /** Figma Hierarchy=Link gray — text + icons share tertiary; hover underlines with fg-quaternary. */
164
+ "link-gray": {
165
+ root: [
166
+ "h-auto min-h-0 border-0 bg-transparent px-0! py-0! text-tertiary shadow-none",
167
+ focusShadowPlain,
168
+ "hover:text-tertiary_hover",
169
+ "disabled:opacity-50",
170
+ "*:data-text:underline *:data-text:decoration-transparent *:data-text:decoration-solid hover:*:data-text:decoration-fg-quaternary"
171
+ ].join(" ")
172
+ },
173
+ "primary-destructive": {
174
+ root: [
175
+ "bg-error-solid text-white",
176
+ skeuomorphicShadowClass,
177
+ skeuomorphicGradientBorderClass,
178
+ "hover:bg-error-solid_hover",
179
+ "disabled:opacity-50",
180
+ "data-loading:bg-error-solid_hover",
181
+ "*:data-icon:not([data-icon=loading]):text-white/70"
182
+ ].join(" ")
183
+ },
184
+ "secondary-destructive": {
185
+ root: [
186
+ "border border-solid border-primary bg-primary text-error-primary",
187
+ secondaryShadowClass,
188
+ "hover:bg-error-primary hover:text-error-primary_hover",
189
+ "disabled:opacity-50",
190
+ "data-loading:bg-error-primary",
191
+ "*:data-icon:text-fg-error-secondary hover:*:data-icon:text-fg-error-primary"
192
+ ].join(" ")
193
+ },
194
+ "tertiary-destructive": {
195
+ root: [
196
+ "border border-transparent bg-transparent text-error-primary",
197
+ focusShadowPlain,
198
+ "hover:bg-error-primary hover:text-error-primary_hover",
199
+ "disabled:opacity-50",
200
+ "*:data-icon:text-fg-error-secondary hover:*:data-icon:text-fg-error-primary"
201
+ ].join(" ")
202
+ },
203
+ /** Figma Hierarchy=Link (destructive) — text + icons share error-primary; hover underlines. */
204
+ "link-destructive": {
205
+ root: [
206
+ "h-auto min-h-0 border-0 bg-transparent px-0! py-0! text-error-primary shadow-none",
207
+ focusShadowPlain,
208
+ "hover:text-error-primary_hover",
209
+ "disabled:opacity-50",
210
+ "*:data-text:underline *:data-text:decoration-transparent *:data-text:decoration-solid hover:*:data-text:decoration-current"
211
+ ].join(" ")
212
+ }
213
+ }
214
+ });
215
+ var Button = ({
216
+ size = "md",
217
+ color = "primary",
218
+ children,
219
+ className,
220
+ noTextPadding,
221
+ iconLeading: IconLeading,
222
+ iconTrailing: IconTrailing,
223
+ isDisabled: disabled,
224
+ isLoading: loading,
225
+ showTextWhileLoading,
226
+ ...props
227
+ }) => {
228
+ const href = "href" in props ? props.href : void 0;
229
+ const isIcon = (IconLeading || IconTrailing) && !children;
230
+ const isLinkType = ["link-gray", "link-color", "link-destructive"].includes(color);
231
+ noTextPadding = isLinkType || noTextPadding;
232
+ const commonChildren = /* @__PURE__ */ jsxs(Fragment, { children: [
233
+ isValidElement(IconLeading) && IconLeading,
234
+ isReactComponent(IconLeading) && /* @__PURE__ */ jsx(IconLeading, { "data-icon": "leading", className: styles.common.icon }),
235
+ loading && /* @__PURE__ */ jsx(
236
+ "svg",
45
237
  {
46
- type,
47
- disabled,
48
- "data-slot": "button",
49
- "data-icon-only": iconOnly ? "" : void 0,
50
- className: cn(
51
- "inline-flex shrink-0 cursor-pointer items-center justify-center whitespace-nowrap outline-none scale-100 transition-[color,background-color,box-shadow,transform] duration-150 ease-out active:scale-[0.98] active:duration-100 active:ease-linear [&_svg]:pointer-events-none [&_svg]:shrink-0",
52
- "disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50",
53
- "focus-visible:border-ring font-medium lg:tracking-wide focus-visible:ring-ring/50 focus-visible:ring-[3px]",
54
- iconOnly ? iconOnlySizeClass[size] : sizeClass[size],
55
- roundedClass[rounded],
56
- variantClass[variant],
57
- className
238
+ fill: "none",
239
+ "data-icon": "loading",
240
+ viewBox: "0 0 256 256",
241
+ "aria-hidden": true,
242
+ className: cx(
243
+ styles.common.icon,
244
+ "size-5 animate-spin",
245
+ !showTextWhileLoading && "absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2"
58
246
  ),
59
- ref,
60
- ...props
247
+ children: /* @__PURE__ */ jsx(
248
+ "path",
249
+ {
250
+ fill: "currentColor",
251
+ d: "M232,128a104,104,0,0,1-208,0c0-41,23.81-78.36,60.66-95.27a8,8,0,0,1,6.68,14.54C60,61.46,40,93.27,40,128a88,88,0,0,0,176,0c0-34.73-20-66.54-51.34-80.73a8,8,0,0,1,6.68-14.54C208.19,49.64,232,87,232,128Z"
252
+ }
253
+ )
61
254
  }
62
- );
255
+ ),
256
+ children && /* @__PURE__ */ jsx("span", { "data-text": true, className: cx("transition-inherit-all", !noTextPadding && !isLinkType && "px-0.5"), children }),
257
+ isValidElement(IconTrailing) && IconTrailing,
258
+ isReactComponent(IconTrailing) && /* @__PURE__ */ jsx(IconTrailing, { "data-icon": "trailing", className: styles.common.icon })
259
+ ] });
260
+ const commonProps = {
261
+ "data-icon-only": isIcon ? true : void 0,
262
+ "data-loading": loading ? true : void 0,
263
+ ...props,
264
+ isDisabled: disabled || loading,
265
+ className: cx(
266
+ styles.common.root,
267
+ styles.sizes[size].root,
268
+ styles.colors[color].root,
269
+ isLinkType && styles.sizes[size].linkRoot,
270
+ (loading || href && (disabled || loading)) && "pointer-events-none",
271
+ loading && (showTextWhileLoading ? "[&>*:not([data-icon=loading]):not([data-text])]:hidden" : "[&>*:not([data-icon=loading])]:invisible"),
272
+ className
273
+ ),
274
+ children: commonChildren
275
+ };
276
+ if ("href" in commonProps) {
277
+ return /* @__PURE__ */ jsx(Link, { ...commonProps, href: disabled || loading ? void 0 : href });
63
278
  }
64
- );
65
- Button.displayName = "Button";
279
+ return /* @__PURE__ */ jsx(Button$1, { ...commonProps, type: commonProps.type || "button", isPending: loading });
280
+ };
66
281
 
67
282
  export { Button };
68
283
  //# sourceMappingURL=button.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/utils.ts","../../src/react/button.tsx"],"names":[],"mappings":";;;;;;AAGO,SAAS,MAAM,MAAA,EAAsB;AAC1C,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;ACDA,IAAM,SAAA,GAAY;AAAA,EAChB,EAAA,EAAI,qFAAA;AAAA,EACJ,OAAA,EACE,uFAAA;AAAA,EACF,EAAA,EAAI;AACN,CAAA;AAGA,IAAM,iBAAA,GAAoB;AAAA,EACxB,EAAA,EAAI,uEAAA;AAAA,EACJ,OAAA,EACE,0EAAA;AAAA,EACF,EAAA,EAAI;AACN,CAAA;AAEA,IAAM,YAAA,GAAe;AAAA,EACnB,IAAA,EAAM,cAAA;AAAA,EACN,EAAA,EAAI,YAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAEA,IAAM,YAAA,GAAe;AAAA,EACnB,OAAA,EACE,+FAAA;AAAA,EACF,SAAA,EACE,wEAAA;AAAA,EACF,WAAA,EACE,wEAAA;AAAA,EACF,OAAA,EACE;AACJ,CAAA;AAuBA,IAAM,MAAA,GAAe,KAAA,CAAA,UAAA;AAAA,EACnB,CACE;AAAA,IACE,SAAA;AAAA,IACA,IAAA,GAAO,QAAA;AAAA,IACP,OAAA,GAAU,WAAA;AAAA,IACV,OAAA,EAAS,WAAA;AAAA,IACT,IAAA,GAAO,SAAA;AAAA,IACP,QAAA,GAAW,KAAA;AAAA,IACX,QAAA;AAAA,IACA,GAAG;AAAA,KAEL,GAAA,KACG;AACH,IAAA,MAAM,OAAA,GAAU,WAAA,KAAgB,QAAA,GAAW,IAAA,GAAO,MAAA,CAAA;AAElD,IAAA,uBACE,GAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA;AAAA,QACA,QAAA;AAAA,QACA,WAAA,EAAU,QAAA;AAAA,QACV,gBAAA,EAAgB,WAAW,EAAA,GAAK,MAAA;AAAA,QAChC,SAAA,EAAW,EAAA;AAAA,UACT,iSAAA;AAAA,UACA,8EAAA;AAAA,UACA,4GAAA;AAAA,UACA,QAAA,GAAW,iBAAA,CAAkB,IAAI,CAAA,GAAI,UAAU,IAAI,CAAA;AAAA,UACnD,aAAa,OAAO,CAAA;AAAA,UACpB,aAAa,OAAO,CAAA;AAAA,UACpB;AAAA,SACF;AAAA,QACA,GAAA;AAAA,QACC,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AACF;AACA,MAAA,CAAO,WAAA,GAAc,QAAA","file":"button.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import * as React from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\nconst sizeClass = {\n xs: \"h-8 min-h-8 gap-2 px-4 text-sm has-[>svg]:px-3 [&_svg:not([class*='size-'])]:size-3\",\n default:\n \"h-10 min-h-10 gap-2 px-5 text-sm has-[>svg]:px-4 [&_svg:not([class*='size-'])]:size-4\",\n lg: \"h-11 min-h-11 gap-2 px-6 text-base has-[>svg]:px-5 [&_svg:not([class*='size-'])]:size-5\",\n} as const;\n\n/** Square hit targets for `iconOnly` — same keys as `sizeClass` (`default` | `lg`). */\nconst iconOnlySizeClass = {\n xs: \"size-8 min-h-8 min-w-8 gap-0 p-0 [&_svg:not([class*='size-'])]:size-3\",\n default:\n \"size-10 min-h-10 min-w-10 gap-0 p-0 [&_svg:not([class*='size-'])]:size-4\",\n lg: \"size-11 min-h-11 min-w-11 gap-0 p-0 [&_svg:not([class*='size-'])]:size-5\",\n} as const;\n\nconst roundedClass = {\n full: \"rounded-full\",\n lg: \"rounded-lg\",\n md: \"rounded-md\",\n} as const;\n\nconst variantClass = {\n primary:\n \"bg-primary text-background border border-transparent hover:bg-primary/90 active:bg-primary/85\",\n secondary:\n \"bg-background text-primary border border-primary/10 hover:bg-primary/5\",\n destructive:\n \"bg-background text-red-500 border border-red-500/25 hover:bg-red-500/5\",\n success:\n \"bg-background text-green-500 border border-green-500/25 hover:bg-green-500/5\",\n} as const;\n\nexport type ButtonProps = React.ComponentProps<\"button\"> & {\n /**\n * Visual style: neutral (`secondary`, `primary`), or outline (`destructive`,\n * `success`) using Tailwind `red-500` / `green-500` text and matching borders on\n * `bg-background` (no solid fill).\n */\n variant?: keyof typeof variantClass;\n /**\n * Corner radius. Labeled buttons default to `full` (pill). `iconOnly` buttons\n * default to `md` (square corners) unless you pass `rounded` explicitly.\n */\n rounded?: keyof typeof roundedClass;\n /** Height and horizontal padding: `default` or `lg` only. */\n size?: keyof typeof sizeClass;\n /**\n * Square icon-only control; same `size` presets (`default` | `lg`). Pair with\n * `aria-label` (or `title`) when there is no visible text.\n */\n iconOnly?: boolean;\n};\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n className,\n type = \"button\",\n variant = \"secondary\",\n rounded: roundedProp,\n size = \"default\",\n iconOnly = false,\n disabled,\n ...props\n },\n ref,\n ) => {\n const rounded = roundedProp ?? (iconOnly ? \"md\" : \"full\");\n\n return (\n <button\n type={type}\n disabled={disabled}\n data-slot=\"button\"\n data-icon-only={iconOnly ? \"\" : undefined}\n className={cn(\n \"inline-flex shrink-0 cursor-pointer items-center justify-center whitespace-nowrap outline-none scale-100 transition-[color,background-color,box-shadow,transform] duration-150 ease-out active:scale-[0.98] active:duration-100 active:ease-linear [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n \"disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50\",\n \"focus-visible:border-ring font-medium lg:tracking-wide focus-visible:ring-ring/50 focus-visible:ring-[3px]\",\n iconOnly ? iconOnlySizeClass[size] : sizeClass[size],\n roundedClass[rounded],\n variantClass[variant],\n className,\n )}\n ref={ref}\n {...props}\n />\n );\n },\n);\nButton.displayName = \"Button\";\n\nexport { Button };\n"]}
1
+ {"version":3,"sources":["../../../../utils/cx.ts","../../../../utils/is-react-component.ts","../../../../components/base/buttons/button.tsx"],"names":["AriaLink","AriaButton"],"mappings":"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","file":"button.js","sourcesContent":["import { extendTailwindMerge } from \"tailwind-merge\";\n\nconst twMerge = extendTailwindMerge({\n extend: {\n theme: {\n text: [\"display-xs\", \"display-sm\", \"display-md\", \"display-lg\", \"display-xl\", \"display-2xl\"],\n },\n },\n});\n\n/**\n * This function is a wrapper around the twMerge function.\n * It is used to merge the classes inside style objects.\n */\nexport const cx = twMerge;\n\n/**\n * This function does nothing besides helping us to be able to\n * sort the classes inside style objects which is not supported\n * by the Tailwind IntelliSense by default.\n */\nexport function sortCx<T extends Record<string, string | number | Record<string, string | number | Record<string, string | number>>>>(classes: T): T {\n return classes;\n}\n","/* We cannot use type `unknown` instead of `any` here because it will break the type assertion `isReactComponent` function is providing. */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type React from \"react\";\n\ntype ReactComponent = React.FC<any> | React.ComponentClass<any, any>;\n\n/**\n * Checks if a given value is a function component.\n */\nexport const isFunctionComponent = (component: any): component is React.FC<any> => {\n return typeof component === \"function\";\n};\n\n/**\n * Checks if a given value is a class component.\n */\nexport const isClassComponent = (component: any): component is React.ComponentClass<any, any> => {\n return typeof component === \"function\" && component.prototype && (!!component.prototype.isReactComponent || !!component.prototype.render);\n};\n\n/**\n * Checks if a given value is a forward ref component.\n */\nexport const isForwardRefComponent = (component: any): component is React.ForwardRefExoticComponent<any> => {\n return typeof component === \"object\" && component !== null && component.$$typeof.toString() === \"Symbol(react.forward_ref)\";\n};\n\n/**\n * Checks if a given value is a valid React component.\n */\nexport const isReactComponent = (component: any): component is ReactComponent => {\n return isFunctionComponent(component) || isForwardRefComponent(component) || isClassComponent(component);\n};\n","\"use client\";\n\nimport type { FC, ReactElement, ReactNode } from \"react\";\nimport React, { isValidElement } from \"react\";\nimport type { ButtonProps as AriaButtonProps, LinkProps as AriaLinkProps } from \"react-aria-components\";\nimport { Button as AriaButton, Link as AriaLink } from \"react-aria-components\";\nimport { cx, sortCx } from \"@/utils/cx\";\nimport { isReactComponent } from \"@/utils/is-react-component\";\n\n/**\n * Figma: Buttons/Button (3287:427074), Buttons/Button destructive (6218:85578)\n *\n * Hierarchy mapping (Figma → Untitled `color` prop):\n * - Primary → `primary` (dark neutral solid — default CTA, black in light mode)\n * - Brand → `brand` (purple solid)\n * - Secondary / Tertiary / Link color / Link gray → same names\n *\n * Focus: Figma spread-shadow ring (2px surface gap + 4px focus-ring), not outline.\n * Skeuomorphic: shadow-xs-skeuomorphic + gradient top rim (#ffffff1f).\n */\n\n/** Plain focus — Tertiary, Link color, Link gray (Figma Focus rings/focus-ring). */\nconst focusShadowPlain =\n \"focus-visible:outline-none focus-visible:[box-shadow:0px_0px_0px_2px_var(--color-bg-primary),0px_0px_0px_4px_var(--color-focus-ring)]\";\n\n/** Skeuomorphic focus — Primary, Brand, Secondary (Figma focus-ring-shadow-xs-skeuomorphic). */\nconst focusShadowSkeuomorphic =\n \"focus-visible:outline-none focus-visible:[box-shadow:var(--shadow-xs-skeuomorphic),0px_0px_0px_2px_var(--color-bg-primary),0px_0px_0px_4px_var(--color-focus-ring)]\";\n\n/** Figma Gradient/skeuemorphic-gradient-border — 1px inner rim, strongest at top. */\nconst skeuomorphicGradientBorderClass = [\n \"ring-1 ring-inset ring-transparent\",\n \"before:pointer-events-none before:absolute before:inset-px before:rounded-[inherit] before:border before:border-[#ffffff1f] before:content-['']\",\n \"before:[mask-image:linear-gradient(to_bottom,#000,transparent)]\",\n].join(\" \");\n\nconst skeuomorphicShadowClass = [\"shadow-xs-skeuomorphic\", focusShadowSkeuomorphic, \"overflow-hidden\"].join(\" \");\n\n/** Secondary focus — shadow-xs + spread focus ring (Figma focus-ring-shadow-xs-skeuomorphic; keeps real border). */\nconst focusShadowSecondary =\n \"focus-visible:outline-none focus-visible:[box-shadow:0px_1px_2px_0px_rgba(0,0,0,0.05),0px_0px_0px_2px_var(--color-bg-primary),0px_0px_0px_4px_var(--color-focus-ring)]\";\n\n/** Secondary depth — bottom inset only; outer edge is border-primary (inner 1px rim stacks visually with border). */\nconst secondaryInnerShadow =\n \"after:pointer-events-none after:absolute after:inset-0 after:rounded-[inherit] after:content-[''] after:[box-shadow:inset_0px_-1px_0px_0px_rgba(0,0,0,0.05)]\";\n\nconst secondaryShadowClass = [\"relative overflow-hidden shadow-xs\", secondaryInnerShadow, focusShadowSecondary].join(\" \");\n\n/** Number input stepper buttons — shell owns border/focus; match outer rounded-lg corners. */\nconst inputNumberButtonClass =\n [\n \"in-data-number-input:border-0 in-data-number-input:shadow-none in-data-number-input:!rounded-none in-data-number-input:!h-full in-data-number-input:!min-h-0 in-data-number-input:self-stretch in-data-number-input:overflow-hidden\",\n \"in-data-number-input:before:hidden in-data-number-input:after:hidden\",\n \"in-data-number-input:focus-visible:outline-none in-data-number-input:focus-visible:shadow-none in-data-number-input:focus-visible:ring-0 in-data-number-input:focus-visible:![box-shadow:none]\",\n ].join(\" \");\n\n/** InputGroup addon buttons — shell owns outer border/corners; button is a flat inner segment (like NativeSelect). */\nconst inputAddonButtonClass =\n [\n \"in-data-input-wrapper:border-0 in-data-input-wrapper:shadow-none in-data-input-wrapper:!rounded-none in-data-input-wrapper:overflow-hidden\",\n \"in-data-input-wrapper:in-data-trailing:border-l in-data-input-wrapper:in-data-trailing:border-solid in-data-input-wrapper:in-data-trailing:border-primary\",\n \"in-data-input-wrapper:in-data-leading:border-r in-data-input-wrapper:in-data-leading:border-solid in-data-input-wrapper:in-data-leading:border-primary\",\n \"in-data-input-wrapper:group-invalid:in-data-trailing:border-error_subtle in-data-input-wrapper:group-invalid:in-data-leading:border-error_subtle\",\n \"in-data-input-wrapper:before:hidden in-data-input-wrapper:after:hidden\",\n \"in-data-input-wrapper:focus-visible:outline-none in-data-input-wrapper:focus-visible:shadow-none in-data-input-wrapper:focus-visible:ring-0 in-data-input-wrapper:focus-visible:![box-shadow:none]\",\n ].join(\" \");\n\nconst styles = sortCx({\n common: {\n root: [\n \"group relative inline-flex shrink-0 cursor-pointer items-center justify-center whitespace-nowrap rounded-full font-body outline-none before:absolute\",\n \"font-semibold transition-[color,background-color,border-color,box-shadow,opacity,transform] duration-150 ease-out\",\n \"pressed:scale-[0.985] pressed:duration-100 pressed:ease-linear motion-reduce:pressed:scale-100\",\n \"disabled:pointer-events-none disabled:cursor-not-allowed in-data-input-wrapper:disabled:opacity-100\",\n inputAddonButtonClass,\n inputNumberButtonClass,\n // Stretch to InputGroup row height; padding/typography follow `data-input-size` on the field (Figma 85:1269).\n \"in-data-input-wrapper:!h-full in-data-input-wrapper:!min-h-0 in-data-input-wrapper:self-stretch\",\n \"in-data-input-wrapper:in-data-[input-size=sm]:gap-1 in-data-input-wrapper:in-data-[input-size=sm]:px-3 in-data-input-wrapper:in-data-[input-size=sm]:py-2 in-data-input-wrapper:in-data-[input-size=sm]:text-sm\",\n \"in-data-input-wrapper:in-data-[input-size=md]:gap-1 in-data-input-wrapper:in-data-[input-size=md]:px-3.5 in-data-input-wrapper:in-data-[input-size=md]:py-2.5 in-data-input-wrapper:in-data-[input-size=md]:text-sm\",\n \"in-data-input-wrapper:in-data-[input-size=lg]:gap-1.5 in-data-input-wrapper:in-data-[input-size=lg]:px-4 in-data-input-wrapper:in-data-[input-size=lg]:py-2.5 in-data-input-wrapper:in-data-[input-size=lg]:text-md\",\n \"*:data-icon:pointer-events-none *:data-icon:shrink-0 *:data-icon:transition-inherit-all\",\n ].join(\" \"),\n icon: \"pointer-events-none shrink-0 transition-inherit-all\",\n },\n sizes: {\n xs: {\n root: [\n \"h-8 min-h-8 gap-1 px-[0.625rem] py-1.5 text-sm data-icon-only:size-8 data-icon-only:min-h-8 data-icon-only:min-w-8 data-icon-only:p-2\",\n \"in-data-input-wrapper:data-icon-only:p-2.5\",\n \"*:data-icon:size-4\",\n ].join(\" \"),\n linkRoot: \"h-auto min-h-0 gap-1 px-0! py-0! text-sm *:data-text:underline-offset-3\",\n },\n sm: {\n root: [\n \"h-9 min-h-9 gap-1 px-3 py-2 text-sm data-icon-only:size-9 data-icon-only:min-h-9 data-icon-only:min-w-9 data-icon-only:p-2\",\n \"in-data-input-wrapper:data-icon-only:p-2.5\",\n \"*:data-icon:size-5\",\n ].join(\" \"),\n linkRoot: \"h-auto min-h-0 gap-1 px-0! py-0! text-sm *:data-text:underline-offset-3\",\n },\n md: {\n root: [\n \"h-10 min-h-10 gap-1 px-3.5 py-2.5 text-sm data-icon-only:size-10 data-icon-only:min-h-10 data-icon-only:min-w-10 data-icon-only:p-2.5\",\n \"in-data-input-wrapper:data-icon-only:p-3\",\n \"*:data-icon:size-5\",\n ].join(\" \"),\n linkRoot: \"h-auto min-h-0 gap-1 px-0! py-0! text-sm *:data-text:underline-offset-4\",\n },\n lg: {\n root: \"h-11 min-h-11 gap-1.5 px-4 py-2.5 text-md data-icon-only:size-11 data-icon-only:min-h-11 data-icon-only:min-w-11 data-icon-only:p-3 *:data-icon:size-5\",\n linkRoot: \"h-auto min-h-0 gap-1.5 px-0! py-0! text-md *:data-text:underline-offset-4\",\n },\n xl: {\n root: \"h-12 min-h-12 gap-1.5 px-[1.125rem] py-3 text-md data-icon-only:size-12 data-icon-only:min-h-12 data-icon-only:min-w-12 data-icon-only:p-3 data-icon-only:*:data-icon:size-6 *:data-icon:size-5\",\n linkRoot: \"h-auto min-h-0 gap-1.5 px-0! py-0! text-md *:data-text:underline-offset-4\",\n },\n },\n\n colors: {\n /** Figma Hierarchy=Primary — dark neutral solid; hover lightens to fg-tertiary_hover (#404040). */\n primary: {\n root: [\n \"bg-primary-solid text-white\",\n skeuomorphicShadowClass,\n skeuomorphicGradientBorderClass,\n \"hover:bg-fg-tertiary_hover dark:hover:bg-quaternary\",\n \"disabled:opacity-30\",\n \"data-loading:bg-fg-tertiary_hover dark:data-loading:bg-quaternary\",\n \"*:data-icon:not([data-icon=loading]):text-white/70\",\n ].join(\" \"),\n },\n /** Figma Hierarchy=Brand — purple solid; hover darkens to bg-brand-solid_hover (#6d28d9). */\n brand: {\n root: [\n \"bg-brand-solid text-primary_on-brand\",\n skeuomorphicShadowClass,\n skeuomorphicGradientBorderClass,\n \"hover:bg-brand-solid_hover\",\n \"disabled:opacity-50\",\n \"data-loading:bg-brand-solid_hover\",\n \"*:data-icon:not([data-icon=loading]):text-primary_on-brand\",\n ].join(\" \"),\n },\n /** Figma Hierarchy=Secondary — border-primary + shadow-xs + skeuomorphic inner rim overlay. */\n secondary: {\n root: [\n \"border border-solid border-primary bg-primary text-secondary\",\n secondaryShadowClass,\n \"hover:bg-primary_hover hover:text-secondary_hover\",\n \"disabled:opacity-50\",\n \"data-loading:bg-primary_hover\",\n \"*:data-icon:text-fg-secondary hover:*:data-icon:text-fg-quaternary_hover\",\n ].join(\" \"),\n },\n /** Figma Hierarchy=Tertiary */\n tertiary: {\n root: [\n \"border border-transparent bg-transparent text-tertiary\",\n focusShadowPlain,\n \"hover:bg-primary_hover hover:text-tertiary_hover\",\n \"disabled:opacity-50\",\n \"*:data-icon:text-fg-tertiary hover:*:data-icon:text-fg-quaternary_hover\",\n ].join(\" \"),\n },\n /** Figma Hierarchy=Link color — text + icons share brand-secondary; hover underlines with fg-brand-secondary. */\n \"link-color\": {\n root: [\n \"h-auto min-h-0 border-0 bg-transparent px-0! py-0! text-brand-secondary shadow-none\",\n focusShadowPlain,\n \"hover:text-brand-secondary_hover\",\n \"disabled:opacity-50\",\n \"*:data-text:underline *:data-text:decoration-transparent *:data-text:decoration-solid hover:*:data-text:decoration-fg-brand-secondary\",\n ].join(\" \"),\n },\n /** Figma Hierarchy=Link gray — text + icons share tertiary; hover underlines with fg-quaternary. */\n \"link-gray\": {\n root: [\n \"h-auto min-h-0 border-0 bg-transparent px-0! py-0! text-tertiary shadow-none\",\n focusShadowPlain,\n \"hover:text-tertiary_hover\",\n \"disabled:opacity-50\",\n \"*:data-text:underline *:data-text:decoration-transparent *:data-text:decoration-solid hover:*:data-text:decoration-fg-quaternary\",\n ].join(\" \"),\n },\n \"primary-destructive\": {\n root: [\n \"bg-error-solid text-white\",\n skeuomorphicShadowClass,\n skeuomorphicGradientBorderClass,\n \"hover:bg-error-solid_hover\",\n \"disabled:opacity-50\",\n \"data-loading:bg-error-solid_hover\",\n \"*:data-icon:not([data-icon=loading]):text-white/70\",\n ].join(\" \"),\n },\n \"secondary-destructive\": {\n root: [\n \"border border-solid border-primary bg-primary text-error-primary\",\n secondaryShadowClass,\n \"hover:bg-error-primary hover:text-error-primary_hover\",\n \"disabled:opacity-50\",\n \"data-loading:bg-error-primary\",\n \"*:data-icon:text-fg-error-secondary hover:*:data-icon:text-fg-error-primary\",\n ].join(\" \"),\n },\n \"tertiary-destructive\": {\n root: [\n \"border border-transparent bg-transparent text-error-primary\",\n focusShadowPlain,\n \"hover:bg-error-primary hover:text-error-primary_hover\",\n \"disabled:opacity-50\",\n \"*:data-icon:text-fg-error-secondary hover:*:data-icon:text-fg-error-primary\",\n ].join(\" \"),\n },\n /** Figma Hierarchy=Link (destructive) — text + icons share error-primary; hover underlines. */\n \"link-destructive\": {\n root: [\n \"h-auto min-h-0 border-0 bg-transparent px-0! py-0! text-error-primary shadow-none\",\n focusShadowPlain,\n \"hover:text-error-primary_hover\",\n \"disabled:opacity-50\",\n \"*:data-text:underline *:data-text:decoration-transparent *:data-text:decoration-solid hover:*:data-text:decoration-current\",\n ].join(\" \"),\n },\n },\n});\n\n/**\n * Common props shared between button and anchor variants\n */\nexport interface CommonProps {\n /** Disables the button and shows a disabled state */\n isDisabled?: boolean;\n /** Shows a loading spinner and disables the button */\n isLoading?: boolean;\n /** The size variant of the button */\n size?: keyof typeof styles.sizes;\n /** The color variant of the button */\n color?: keyof typeof styles.colors;\n /** Icon component or element to show before the text */\n iconLeading?: FC<{ className?: string }> | ReactNode;\n /** Icon component or element to show after the text */\n iconTrailing?: FC<{ className?: string }> | ReactNode;\n /** Removes horizontal padding from the text content */\n noTextPadding?: boolean;\n /** When true, keeps the text visible during loading state */\n showTextWhileLoading?: boolean;\n\n children?: ReactNode;\n className?: string;\n}\n\n/**\n * Props for the button variant (non-link)\n */\nexport interface ButtonProps extends CommonProps, Omit<AriaButtonProps, \"children\" | \"className\"> {}\n/**\n * Props for the link variant (anchor tag)\n */\ninterface LinkProps extends CommonProps, Omit<AriaLinkProps, \"children\" | \"className\"> {\n href: NonNullable<AriaLinkProps[\"href\"]>;\n}\n\n/** Union type of button and link props */\nexport type Props = ButtonProps | LinkProps;\n\nexport const Button: {\n (props: LinkProps): ReactElement<LinkProps>;\n (props: ButtonProps): ReactElement<ButtonProps>;\n} = ({\n size = \"md\",\n color = \"primary\",\n children,\n className,\n noTextPadding,\n iconLeading: IconLeading,\n iconTrailing: IconTrailing,\n isDisabled: disabled,\n isLoading: loading,\n showTextWhileLoading,\n ...props\n}) => {\n const href = \"href\" in props ? props.href : undefined;\n\n const isIcon = (IconLeading || IconTrailing) && !children;\n const isLinkType = [\"link-gray\", \"link-color\", \"link-destructive\"].includes(color);\n\n noTextPadding = isLinkType || noTextPadding;\n\n const commonChildren = (\n <>\n {isValidElement(IconLeading) && IconLeading}\n {isReactComponent(IconLeading) && <IconLeading data-icon=\"leading\" className={styles.common.icon} />}\n\n {loading && (\n <svg\n fill=\"none\"\n data-icon=\"loading\"\n viewBox=\"0 0 256 256\"\n aria-hidden\n className={cx(\n styles.common.icon,\n \"size-5 animate-spin\",\n !showTextWhileLoading && \"absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2\",\n )}\n >\n <path\n fill=\"currentColor\"\n d=\"M232,128a104,104,0,0,1-208,0c0-41,23.81-78.36,60.66-95.27a8,8,0,0,1,6.68,14.54C60,61.46,40,93.27,40,128a88,88,0,0,0,176,0c0-34.73-20-66.54-51.34-80.73a8,8,0,0,1,6.68-14.54C208.19,49.64,232,87,232,128Z\"\n />\n </svg>\n )}\n\n {children && (\n <span data-text className={cx(\"transition-inherit-all\", !noTextPadding && !isLinkType && \"px-0.5\")}>\n {children}\n </span>\n )}\n\n {isValidElement(IconTrailing) && IconTrailing}\n {isReactComponent(IconTrailing) && <IconTrailing data-icon=\"trailing\" className={styles.common.icon} />}\n </>\n );\n\n const commonProps = {\n \"data-icon-only\": isIcon ? true : undefined,\n \"data-loading\": loading ? true : undefined,\n ...props,\n isDisabled: disabled || loading,\n className: cx(\n styles.common.root,\n styles.sizes[size].root,\n styles.colors[color].root,\n isLinkType && styles.sizes[size].linkRoot,\n (loading || (href && (disabled || loading))) && \"pointer-events-none\",\n loading && (showTextWhileLoading ? \"[&>*:not([data-icon=loading]):not([data-text])]:hidden\" : \"[&>*:not([data-icon=loading])]:invisible\"),\n className,\n ),\n children: commonChildren,\n };\n\n if (\"href\" in commonProps) {\n return <AriaLink {...commonProps} href={disabled || loading ? undefined : href} />;\n }\n\n return <AriaButton {...commonProps} type={commonProps.type || \"button\"} isPending={loading} />;\n};\n"]}
@@ -1,11 +1,28 @@
1
- import * as React from 'react';
1
+ import * as react from 'react';
2
+ import { Ref, ReactNode } from 'react';
3
+ import { CheckboxProps as CheckboxProps$1 } from 'react-aria-components';
2
4
 
3
- type CheckboxProps = Omit<React.ComponentProps<"button">, "type" | "role" | "aria-checked" | "children"> & {
4
- checked?: boolean;
5
- defaultChecked?: boolean;
6
- onCheckedChange?: (next: boolean) => void;
7
- indeterminate?: boolean;
5
+ interface CheckboxBaseProps {
6
+ size?: "sm" | "md";
7
+ className?: string;
8
+ isFocusVisible?: boolean;
9
+ isSelected?: boolean;
10
+ isDisabled?: boolean;
11
+ isIndeterminate?: boolean;
12
+ }
13
+ declare const CheckboxBase: {
14
+ ({ className, isSelected, isDisabled, isIndeterminate, size, isFocusVisible }: CheckboxBaseProps): react.JSX.Element;
15
+ displayName: string;
16
+ };
17
+ interface CheckboxProps extends CheckboxProps$1 {
18
+ ref?: Ref<HTMLLabelElement>;
19
+ size?: "sm" | "md";
20
+ label?: ReactNode;
21
+ hint?: ReactNode;
22
+ }
23
+ declare const Checkbox: {
24
+ ({ label, hint, size, className, ...ariaCheckboxProps }: CheckboxProps): react.JSX.Element;
25
+ displayName: string;
8
26
  };
9
- declare const Checkbox: React.ForwardRefExoticComponent<Omit<CheckboxProps, "ref"> & React.RefAttributes<HTMLButtonElement>>;
10
27
 
11
- export { Checkbox, type CheckboxProps };
28
+ export { Checkbox, CheckboxBase, type CheckboxBaseProps };