@7onic-ui/react 0.3.8 → 0.3.10

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 (171) hide show
  1. package/README.md +2 -2
  2. package/dist/chart.js +1 -1
  3. package/dist/chart.js.map +1 -1
  4. package/dist/chart.mjs +4 -10
  5. package/dist/chart.mjs.map +1 -1
  6. package/dist/chunk-234NAXGV.mjs +252 -0
  7. package/dist/chunk-234NAXGV.mjs.map +1 -0
  8. package/dist/chunk-53MIUPSY.mjs +13 -0
  9. package/dist/chunk-53MIUPSY.mjs.map +1 -0
  10. package/dist/chunk-BN5BEA3V.mjs +195 -0
  11. package/dist/chunk-BN5BEA3V.mjs.map +1 -0
  12. package/dist/chunk-COW3B62M.mjs +214 -0
  13. package/dist/chunk-COW3B62M.mjs.map +1 -0
  14. package/dist/chunk-CTH6SN5Y.mjs +114 -0
  15. package/dist/chunk-CTH6SN5Y.mjs.map +1 -0
  16. package/dist/chunk-D3NTQNDW.mjs +440 -0
  17. package/dist/chunk-D3NTQNDW.mjs.map +1 -0
  18. package/dist/chunk-DDRYEJBJ.mjs +164 -0
  19. package/dist/chunk-DDRYEJBJ.mjs.map +1 -0
  20. package/dist/chunk-DJAEXCRU.mjs +190 -0
  21. package/dist/chunk-DJAEXCRU.mjs.map +1 -0
  22. package/dist/chunk-DRVHHEAY.mjs +145 -0
  23. package/dist/chunk-DRVHHEAY.mjs.map +1 -0
  24. package/dist/chunk-DTLNWOTR.mjs +482 -0
  25. package/dist/chunk-DTLNWOTR.mjs.map +1 -0
  26. package/dist/chunk-DYYQOHQR.mjs +214 -0
  27. package/dist/chunk-DYYQOHQR.mjs.map +1 -0
  28. package/dist/chunk-FHUAH6AJ.mjs +93 -0
  29. package/dist/chunk-FHUAH6AJ.mjs.map +1 -0
  30. package/dist/chunk-GD4YE5AE.mjs +209 -0
  31. package/dist/chunk-GD4YE5AE.mjs.map +1 -0
  32. package/dist/chunk-GRCJ35DX.mjs +144 -0
  33. package/dist/chunk-GRCJ35DX.mjs.map +1 -0
  34. package/dist/chunk-HHX4GABH.mjs +129 -0
  35. package/dist/chunk-HHX4GABH.mjs.map +1 -0
  36. package/dist/chunk-IPCIC2BI.mjs +148 -0
  37. package/dist/chunk-IPCIC2BI.mjs.map +1 -0
  38. package/dist/chunk-IY3R2VGB.mjs +272 -0
  39. package/dist/chunk-IY3R2VGB.mjs.map +1 -0
  40. package/dist/chunk-JCJEVXER.mjs +170 -0
  41. package/dist/chunk-JCJEVXER.mjs.map +1 -0
  42. package/dist/chunk-KBPYAMGS.mjs +157 -0
  43. package/dist/chunk-KBPYAMGS.mjs.map +1 -0
  44. package/dist/chunk-LJJ6K4IU.mjs +318 -0
  45. package/dist/chunk-LJJ6K4IU.mjs.map +1 -0
  46. package/dist/chunk-MRUVGHGP.mjs +375 -0
  47. package/dist/chunk-MRUVGHGP.mjs.map +1 -0
  48. package/dist/chunk-N4K2BDGM.mjs +153 -0
  49. package/dist/chunk-N4K2BDGM.mjs.map +1 -0
  50. package/dist/chunk-NWFMJWGX.mjs +165 -0
  51. package/dist/chunk-NWFMJWGX.mjs.map +1 -0
  52. package/dist/chunk-PTAPPOKU.mjs +117 -0
  53. package/dist/chunk-PTAPPOKU.mjs.map +1 -0
  54. package/dist/chunk-PVTBM7V7.mjs +316 -0
  55. package/dist/chunk-PVTBM7V7.mjs.map +1 -0
  56. package/dist/chunk-Q5WVLK2L.mjs +77 -0
  57. package/dist/chunk-Q5WVLK2L.mjs.map +1 -0
  58. package/dist/chunk-RKSB2N5L.mjs +206 -0
  59. package/dist/chunk-RKSB2N5L.mjs.map +1 -0
  60. package/dist/chunk-S4DGVKBK.mjs +151 -0
  61. package/dist/chunk-S4DGVKBK.mjs.map +1 -0
  62. package/dist/chunk-S4T4PU7F.mjs +114 -0
  63. package/dist/chunk-S4T4PU7F.mjs.map +1 -0
  64. package/dist/chunk-SZPZOGPC.mjs +394 -0
  65. package/dist/chunk-SZPZOGPC.mjs.map +1 -0
  66. package/dist/chunk-T546XBQG.mjs +443 -0
  67. package/dist/chunk-T546XBQG.mjs.map +1 -0
  68. package/dist/chunk-UWTT5AE6.mjs +145 -0
  69. package/dist/chunk-UWTT5AE6.mjs.map +1 -0
  70. package/dist/chunk-V5UFWYFI.mjs +255 -0
  71. package/dist/chunk-V5UFWYFI.mjs.map +1 -0
  72. package/dist/chunk-VUPGBB5X.mjs +150 -0
  73. package/dist/chunk-VUPGBB5X.mjs.map +1 -0
  74. package/dist/chunk-W6YNEU53.mjs +175 -0
  75. package/dist/chunk-W6YNEU53.mjs.map +1 -0
  76. package/dist/chunk-WWSN5YME.mjs +222 -0
  77. package/dist/chunk-WWSN5YME.mjs.map +1 -0
  78. package/dist/chunk-XK52LYR4.mjs +182 -0
  79. package/dist/chunk-XK52LYR4.mjs.map +1 -0
  80. package/dist/chunk-YIAH6KHV.mjs +164 -0
  81. package/dist/chunk-YIAH6KHV.mjs.map +1 -0
  82. package/dist/chunk-Z6JWWCNL.mjs +108 -0
  83. package/dist/chunk-Z6JWWCNL.mjs.map +1 -0
  84. package/dist/chunk-ZDRUTJ4T.mjs +119 -0
  85. package/dist/chunk-ZDRUTJ4T.mjs.map +1 -0
  86. package/dist/components/accordion.mjs +19 -0
  87. package/dist/components/accordion.mjs.map +1 -0
  88. package/dist/components/alert.mjs +15 -0
  89. package/dist/components/alert.mjs.map +1 -0
  90. package/dist/components/avatar.mjs +23 -0
  91. package/dist/components/avatar.mjs.map +1 -0
  92. package/dist/components/badge.mjs +11 -0
  93. package/dist/components/badge.mjs.map +1 -0
  94. package/dist/components/breadcrumb.mjs +23 -0
  95. package/dist/components/breadcrumb.mjs.map +1 -0
  96. package/dist/components/button-group.mjs +11 -0
  97. package/dist/components/button-group.mjs.map +1 -0
  98. package/dist/components/button.mjs +12 -0
  99. package/dist/components/button.mjs.map +1 -0
  100. package/dist/components/card.mjs +25 -0
  101. package/dist/components/card.mjs.map +1 -0
  102. package/dist/components/chat-input.mjs +15 -0
  103. package/dist/components/chat-input.mjs.map +1 -0
  104. package/dist/components/chat-message.mjs +17 -0
  105. package/dist/components/chat-message.mjs.map +1 -0
  106. package/dist/components/checkbox.mjs +12 -0
  107. package/dist/components/checkbox.mjs.map +1 -0
  108. package/dist/components/divider.mjs +11 -0
  109. package/dist/components/divider.mjs.map +1 -0
  110. package/dist/components/drawer.mjs +33 -0
  111. package/dist/components/drawer.mjs.map +1 -0
  112. package/dist/components/dropdown.mjs +35 -0
  113. package/dist/components/dropdown.mjs.map +1 -0
  114. package/dist/components/field.mjs +17 -0
  115. package/dist/components/field.mjs.map +1 -0
  116. package/dist/components/icon-button.mjs +12 -0
  117. package/dist/components/icon-button.mjs.map +1 -0
  118. package/dist/components/input.mjs +12 -0
  119. package/dist/components/input.mjs.map +1 -0
  120. package/dist/components/metric-card.mjs +23 -0
  121. package/dist/components/metric-card.mjs.map +1 -0
  122. package/dist/components/modal.mjs +57 -0
  123. package/dist/components/modal.mjs.map +1 -0
  124. package/dist/components/navigation-menu.mjs +27 -0
  125. package/dist/components/navigation-menu.mjs.map +1 -0
  126. package/dist/components/pagination.mjs +33 -0
  127. package/dist/components/pagination.mjs.map +1 -0
  128. package/dist/components/popover.mjs +23 -0
  129. package/dist/components/popover.mjs.map +1 -0
  130. package/dist/components/progress.mjs +11 -0
  131. package/dist/components/progress.mjs.map +1 -0
  132. package/dist/components/quick-reply.mjs +15 -0
  133. package/dist/components/quick-reply.mjs.map +1 -0
  134. package/dist/components/radio-group.mjs +16 -0
  135. package/dist/components/radio-group.mjs.map +1 -0
  136. package/dist/components/segmented.mjs +15 -0
  137. package/dist/components/segmented.mjs.map +1 -0
  138. package/dist/components/select.mjs +23 -0
  139. package/dist/components/select.mjs.map +1 -0
  140. package/dist/components/skeleton.mjs +11 -0
  141. package/dist/components/skeleton.mjs.map +1 -0
  142. package/dist/components/slider.mjs +11 -0
  143. package/dist/components/slider.mjs.map +1 -0
  144. package/dist/components/spinner.mjs +11 -0
  145. package/dist/components/spinner.mjs.map +1 -0
  146. package/dist/components/switch.mjs +12 -0
  147. package/dist/components/switch.mjs.map +1 -0
  148. package/dist/components/table.mjs +23 -0
  149. package/dist/components/table.mjs.map +1 -0
  150. package/dist/components/tabs.mjs +19 -0
  151. package/dist/components/tabs.mjs.map +1 -0
  152. package/dist/components/textarea.mjs +12 -0
  153. package/dist/components/textarea.mjs.map +1 -0
  154. package/dist/components/toast.mjs +13 -0
  155. package/dist/components/toast.mjs.map +1 -0
  156. package/dist/components/toggle-group.mjs +15 -0
  157. package/dist/components/toggle-group.mjs.map +1 -0
  158. package/dist/components/toggle.mjs +11 -0
  159. package/dist/components/toggle.mjs.map +1 -0
  160. package/dist/components/tooltip.mjs +21 -0
  161. package/dist/components/tooltip.mjs.map +1 -0
  162. package/dist/components/typing-indicator.mjs +11 -0
  163. package/dist/components/typing-indicator.mjs.map +1 -0
  164. package/dist/index.js +22 -7
  165. package/dist/index.js.map +1 -1
  166. package/dist/index.mjs +296 -7521
  167. package/dist/index.mjs.map +1 -1
  168. package/llms.txt +29 -25
  169. package/package.json +4 -3
  170. package/dist/chart.d.mts +0 -147
  171. package/dist/index.d.mts +0 -1535
@@ -0,0 +1,144 @@
1
+ "use client";
2
+ import {
3
+ useFieldContext
4
+ } from "./chunk-Z6JWWCNL.mjs";
5
+ import {
6
+ cn
7
+ } from "./chunk-53MIUPSY.mjs";
8
+
9
+ // src/components/ui/radio-group.tsx
10
+ import * as React from "react";
11
+ import * as RadioGroupPrimitive from "@radix-ui/react-radio-group";
12
+ import { cva } from "class-variance-authority";
13
+ var radioColorMap = {
14
+ default: {
15
+ border: "data-[state=checked]:border-foreground",
16
+ dot: "bg-foreground"
17
+ },
18
+ primary: {
19
+ border: "data-[state=checked]:border-primary",
20
+ dot: "bg-primary"
21
+ }
22
+ };
23
+ var RadioGroupContext = React.createContext({ size: "default", weight: "bold", color: "default" });
24
+ var radioGroupVariants = cva("grid gap-3", {
25
+ variants: {
26
+ orientation: {
27
+ vertical: "grid-cols-1",
28
+ horizontal: "grid-flow-col auto-cols-max gap-4"
29
+ }
30
+ },
31
+ defaultVariants: {
32
+ orientation: "vertical"
33
+ }
34
+ });
35
+ var RadioGroup = React.forwardRef(({ className, orientation, size = "default", weight = "bold", color = "default", disabled, ...props }, ref) => {
36
+ const fieldContext = useFieldContext();
37
+ const resolvedDisabled = disabled ?? fieldContext?.disabled;
38
+ return /* @__PURE__ */ React.createElement(RadioGroupContext.Provider, { value: { size, weight, color, disabled: resolvedDisabled } }, /* @__PURE__ */ React.createElement(
39
+ RadioGroupPrimitive.Root,
40
+ {
41
+ ref,
42
+ className: cn(radioGroupVariants({ orientation }), className),
43
+ orientation: orientation || void 0,
44
+ disabled: resolvedDisabled,
45
+ ...props
46
+ }
47
+ ));
48
+ });
49
+ RadioGroup.displayName = "RadioGroup";
50
+ var radioItemVariants = cva(
51
+ [
52
+ "relative shrink-0 rounded-full border-border hover:border-border-strong transition-all duration-micro ease-out",
53
+ "focus-visible:focus-ring",
54
+ "disabled:cursor-not-allowed disabled:opacity-50",
55
+ // Transparent hit area expansion via ::after
56
+ "after:absolute after:content-['']"
57
+ ].join(" "),
58
+ {
59
+ variants: {
60
+ size: {
61
+ sm: "w-3.5 h-3.5 after:-inset-[5px]",
62
+ // 14px circle → 24px click
63
+ default: "w-4 h-4 after:-inset-2",
64
+ // 16px circle → 32px click
65
+ lg: "w-5 h-5 after:-inset-2"
66
+ // 20px circle → 36px click
67
+ },
68
+ weight: {
69
+ thin: "border",
70
+ // 1px
71
+ bold: "border-2"
72
+ // 2px
73
+ }
74
+ },
75
+ defaultVariants: {
76
+ size: "default",
77
+ weight: "bold"
78
+ }
79
+ }
80
+ );
81
+ var dotSizes = {
82
+ sm: "w-1.5 h-1.5",
83
+ // 6px
84
+ default: "w-2 h-2",
85
+ // 8px
86
+ lg: "w-2.5 h-2.5"
87
+ // 10px
88
+ };
89
+ var labelSizes = {
90
+ sm: "text-xs",
91
+ // 12px
92
+ default: "text-md",
93
+ // 14px
94
+ lg: "text-base"
95
+ // 16px
96
+ };
97
+ var gapSizes = {
98
+ sm: "gap-1.5",
99
+ default: "gap-2",
100
+ lg: "gap-2.5"
101
+ };
102
+ var RadioGroupItem = React.forwardRef(({ className, label, disabled, ...props }, ref) => {
103
+ const { size, weight, color, disabled: groupDisabled } = React.useContext(RadioGroupContext);
104
+ const resolvedDisabled = disabled ?? groupDisabled;
105
+ const itemId = React.useId();
106
+ const radio = /* @__PURE__ */ React.createElement(
107
+ RadioGroupPrimitive.Item,
108
+ {
109
+ ref,
110
+ id: label ? itemId : void 0,
111
+ disabled: resolvedDisabled,
112
+ className: cn(
113
+ radioItemVariants({ size, weight }),
114
+ radioColorMap[color].border,
115
+ className
116
+ ),
117
+ ...props
118
+ },
119
+ /* @__PURE__ */ React.createElement(RadioGroupPrimitive.Indicator, { className: "flex items-center justify-center animate-radio-enter" }, /* @__PURE__ */ React.createElement("div", { className: cn("rounded-full", radioColorMap[color].dot, dotSizes[size]) }))
120
+ );
121
+ if (!label) return radio;
122
+ return /* @__PURE__ */ React.createElement("div", { className: cn("group flex items-center", gapSizes[size]) }, /* @__PURE__ */ React.createElement("div", { className: "flex items-center" }, radio), /* @__PURE__ */ React.createElement(
123
+ "label",
124
+ {
125
+ htmlFor: itemId,
126
+ className: cn(
127
+ labelSizes[size],
128
+ "text-text-muted cursor-pointer select-none transition-colors duration-micro",
129
+ "group-hover:text-foreground",
130
+ resolvedDisabled && "opacity-50 cursor-not-allowed"
131
+ )
132
+ },
133
+ label
134
+ ));
135
+ });
136
+ RadioGroupItem.displayName = "RadioGroupItem";
137
+
138
+ export {
139
+ radioGroupVariants,
140
+ RadioGroup,
141
+ radioItemVariants,
142
+ RadioGroupItem
143
+ };
144
+ //# sourceMappingURL=chunk-GRCJ35DX.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/ui/radio-group.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as RadioGroupPrimitive from '@radix-ui/react-radio-group'\nimport { cva } from 'class-variance-authority'\nimport { cn } from '@/lib/utils'\nimport { useFieldContext } from './field'\n\n// Color maps for checked state\nconst radioColorMap = {\n default: {\n border: 'data-[state=checked]:border-foreground',\n dot: 'bg-foreground',\n },\n primary: {\n border: 'data-[state=checked]:border-primary',\n dot: 'bg-primary',\n },\n} as const\n\nexport type RadioColor = keyof typeof radioColorMap\n\n// Context to pass size, weight, color from RadioGroup to RadioGroupItem\ntype RadioGroupContextValue = {\n size: 'sm' | 'default' | 'lg'\n weight: 'thin' | 'bold'\n color: RadioColor\n disabled?: boolean\n}\nconst RadioGroupContext = React.createContext<RadioGroupContextValue>({ size: 'default', weight: 'bold', color: 'default' })\n\n// RadioGroup container\nconst radioGroupVariants = cva('grid gap-3', {\n variants: {\n orientation: {\n vertical: 'grid-cols-1',\n horizontal: 'grid-flow-col auto-cols-max gap-4',\n },\n },\n defaultVariants: {\n orientation: 'vertical',\n },\n})\n\nexport interface RadioGroupProps\n extends React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Root> {\n size?: 'sm' | 'default' | 'lg'\n weight?: 'thin' | 'bold'\n /** Checked state color */\n color?: RadioColor\n}\n\nconst RadioGroup = React.forwardRef<\n React.ElementRef<typeof RadioGroupPrimitive.Root>,\n RadioGroupProps\n>(({ className, orientation, size = 'default', weight = 'bold', color = 'default', disabled, ...props }, ref) => {\n const fieldContext = useFieldContext()\n const resolvedDisabled = disabled ?? fieldContext?.disabled\n\n return (\n <RadioGroupContext.Provider value={{ size, weight, color, disabled: resolvedDisabled }}>\n <RadioGroupPrimitive.Root\n ref={ref}\n className={cn(radioGroupVariants({ orientation }), className)}\n orientation={orientation || undefined}\n disabled={resolvedDisabled}\n {...props}\n />\n </RadioGroupContext.Provider>\n )\n})\nRadioGroup.displayName = 'RadioGroup'\n\n// RadioGroupItem circle variants\nconst radioItemVariants = cva(\n [\n 'relative shrink-0 rounded-full border-border hover:border-border-strong transition-all duration-micro ease-out',\n 'focus-visible:focus-ring',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n // Transparent hit area expansion via ::after\n \"after:absolute after:content-['']\",\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'w-3.5 h-3.5 after:-inset-[5px]', // 14px circle → 24px click\n default: 'w-4 h-4 after:-inset-2', // 16px circle → 32px click\n lg: 'w-5 h-5 after:-inset-2', // 20px circle → 36px click\n },\n weight: {\n thin: 'border', // 1px\n bold: 'border-2', // 2px\n },\n },\n defaultVariants: {\n size: 'default',\n weight: 'bold',\n },\n }\n)\n\n// Dot sizes per radio size\nconst dotSizes = {\n sm: 'w-1.5 h-1.5', // 6px\n default: 'w-2 h-2', // 8px\n lg: 'w-2.5 h-2.5', // 10px\n}\n\n// Label font sizes\nconst labelSizes = {\n sm: 'text-xs', // 12px\n default: 'text-md', // 14px\n lg: 'text-base', // 16px\n}\n\n// Gap between radio and label\nconst gapSizes = {\n sm: 'gap-1.5',\n default: 'gap-2',\n lg: 'gap-2.5',\n}\n\nexport interface RadioGroupItemProps\n extends React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Item> {\n label?: string\n}\n\nconst RadioGroupItem = React.forwardRef<\n React.ElementRef<typeof RadioGroupPrimitive.Item>,\n RadioGroupItemProps\n>(({ className, label, disabled, ...props }, ref) => {\n const { size, weight, color, disabled: groupDisabled } = React.useContext(RadioGroupContext)\n const resolvedDisabled = disabled ?? groupDisabled\n const itemId = React.useId()\n\n const radio = (\n <RadioGroupPrimitive.Item\n ref={ref}\n id={label ? itemId : undefined}\n disabled={resolvedDisabled}\n className={cn(\n radioItemVariants({ size, weight }),\n radioColorMap[color].border,\n className\n )}\n {...props}\n >\n <RadioGroupPrimitive.Indicator className=\"flex items-center justify-center animate-radio-enter\">\n <div className={cn('rounded-full', radioColorMap[color].dot, dotSizes[size])} />\n </RadioGroupPrimitive.Indicator>\n </RadioGroupPrimitive.Item>\n )\n\n if (!label) return radio\n\n return (\n <div className={cn('group flex items-center', gapSizes[size])}>\n <div className=\"flex items-center\">\n {radio}\n </div>\n <label\n htmlFor={itemId}\n className={cn(\n labelSizes[size],\n 'text-text-muted cursor-pointer select-none transition-colors duration-micro',\n 'group-hover:text-foreground',\n resolvedDisabled && 'opacity-50 cursor-not-allowed'\n )}\n >\n {label}\n </label>\n </div>\n )\n})\nRadioGroupItem.displayName = 'RadioGroupItem'\n\nexport { RadioGroup, RadioGroupItem, radioGroupVariants, radioItemVariants }\n"],"mappings":"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","names":[]}
@@ -0,0 +1,129 @@
1
+ "use client";
2
+ import {
3
+ cn
4
+ } from "./chunk-53MIUPSY.mjs";
5
+
6
+ // src/components/ui/popover.tsx
7
+ import * as React from "react";
8
+ import * as PopoverPrimitive from "@radix-ui/react-popover";
9
+ import { cva } from "class-variance-authority";
10
+ var DefaultCloseIcon = ({ className }) => /* @__PURE__ */ React.createElement(
11
+ "svg",
12
+ {
13
+ className,
14
+ fill: "none",
15
+ viewBox: "0 0 24 24",
16
+ stroke: "currentColor",
17
+ strokeWidth: 2,
18
+ "aria-hidden": "true"
19
+ },
20
+ /* @__PURE__ */ React.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M6 18L18 6M6 6l12 12" })
21
+ );
22
+ var ANIMATION_CLASSES = {
23
+ top: "data-[state=open]:animate-popover-top-enter data-[state=closed]:animate-popover-top-exit",
24
+ bottom: "data-[state=open]:animate-popover-bottom-enter data-[state=closed]:animate-popover-bottom-exit",
25
+ left: "data-[state=open]:animate-popover-left-enter data-[state=closed]:animate-popover-left-exit",
26
+ right: "data-[state=open]:animate-popover-right-enter data-[state=closed]:animate-popover-right-exit"
27
+ };
28
+ var popoverContentVariants = cva(
29
+ "relative z-popover flex flex-col font-normal select-none w-auto max-w-[calc(100vw-16px)] max-h-[var(--radix-popover-content-available-height)] outline-none",
30
+ {
31
+ variants: {
32
+ variant: {
33
+ default: "bg-background-paper text-foreground border border-border shadow-lg",
34
+ elevated: "bg-background-paper/95 text-foreground border border-border-subtle shadow-xl backdrop-blur-sm"
35
+ },
36
+ size: {
37
+ sm: "text-sm p-3 rounded-lg",
38
+ default: "text-sm p-4 rounded-xl",
39
+ lg: "text-md p-5 rounded-xl"
40
+ }
41
+ },
42
+ defaultVariants: {
43
+ variant: "default",
44
+ size: "default"
45
+ }
46
+ }
47
+ );
48
+ var CSS_ARROW_CLASSES = {
49
+ bottom: "-top-[5px] left-1/2 -translate-x-1/2 border-t border-l border-border",
50
+ top: "-bottom-[5px] left-1/2 -translate-x-1/2 border-b border-r border-border",
51
+ right: "-left-[5px] top-1/2 -translate-y-1/2 border-b border-l border-border",
52
+ left: "-right-[5px] top-1/2 -translate-y-1/2 border-t border-r border-border"
53
+ };
54
+ var ARROW_ELEVATED = "fill-background-paper drop-shadow-sm";
55
+ function Popover(props) {
56
+ return /* @__PURE__ */ React.createElement(PopoverPrimitive.Root, { ...props });
57
+ }
58
+ var PopoverTrigger = PopoverPrimitive.Trigger;
59
+ var PopoverPortal = PopoverPrimitive.Portal;
60
+ var PopoverAnchor = PopoverPrimitive.Anchor;
61
+ var PopoverClose = PopoverPrimitive.Close;
62
+ var PopoverContent = React.forwardRef(({ className, variant = "default", size, side = "bottom", sideOffset, showArrow = true, showClose = false, closeIcon, children, ...props }, ref) => {
63
+ const resolvedSide = side;
64
+ const resolvedOffset = sideOffset ?? (variant === "default" && showArrow ? 12 : 6);
65
+ return /* @__PURE__ */ React.createElement(PopoverPrimitive.Portal, null, /* @__PURE__ */ React.createElement(
66
+ PopoverPrimitive.Content,
67
+ {
68
+ ref,
69
+ side,
70
+ sideOffset: resolvedOffset,
71
+ className: cn(
72
+ popoverContentVariants({ variant, size }),
73
+ ANIMATION_CLASSES[resolvedSide],
74
+ className
75
+ ),
76
+ ...props
77
+ },
78
+ showClose && /* @__PURE__ */ React.createElement(
79
+ PopoverPrimitive.Close,
80
+ {
81
+ className: "absolute top-3 right-3 rounded-md p-1 text-text-muted hover:text-foreground hover:bg-background-muted transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-focus-ring",
82
+ "aria-label": "Close"
83
+ },
84
+ closeIcon || /* @__PURE__ */ React.createElement(DefaultCloseIcon, { className: "icon-sm" })
85
+ ),
86
+ /* @__PURE__ */ React.createElement("div", { className: "min-h-0 overflow-y-auto -m-1 p-1" }, children),
87
+ showArrow && variant === "default" && /* @__PURE__ */ React.createElement(
88
+ "div",
89
+ {
90
+ className: cn(
91
+ "absolute w-2.5 h-2.5 rotate-45 bg-background-paper",
92
+ CSS_ARROW_CLASSES[resolvedSide]
93
+ )
94
+ }
95
+ ),
96
+ showArrow && variant === "elevated" && /* @__PURE__ */ React.createElement(
97
+ PopoverPrimitive.Arrow,
98
+ {
99
+ className: ARROW_ELEVATED,
100
+ width: 12,
101
+ height: 6
102
+ }
103
+ )
104
+ ));
105
+ });
106
+ PopoverContent.displayName = "PopoverContent";
107
+ var PopoverArrow = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React.createElement(
108
+ PopoverPrimitive.Arrow,
109
+ {
110
+ ref,
111
+ className: cn("fill-background-paper", className),
112
+ width: 10,
113
+ height: 5,
114
+ ...props
115
+ }
116
+ ));
117
+ PopoverArrow.displayName = "PopoverArrow";
118
+
119
+ export {
120
+ popoverContentVariants,
121
+ Popover,
122
+ PopoverTrigger,
123
+ PopoverPortal,
124
+ PopoverAnchor,
125
+ PopoverClose,
126
+ PopoverContent,
127
+ PopoverArrow
128
+ };
129
+ //# sourceMappingURL=chunk-HHX4GABH.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/ui/popover.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as PopoverPrimitive from '@radix-ui/react-popover'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '@/lib/utils'\n\n// ─── Default Close Icon (built-in, no external dependency) ──\nconst DefaultCloseIcon = ({ className }: { className?: string }) => (\n <svg\n className={className}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n aria-hidden=\"true\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n)\n\n// ─── Types ──────────────────────────────────────────────────\nexport type PopoverSide = 'top' | 'right' | 'bottom' | 'left'\n\n// ─── Animation class mapping (static strings for Tailwind scanner) ──\nconst ANIMATION_CLASSES: Record<PopoverSide, string> = {\n top: 'data-[state=open]:animate-popover-top-enter data-[state=closed]:animate-popover-top-exit',\n bottom: 'data-[state=open]:animate-popover-bottom-enter data-[state=closed]:animate-popover-bottom-exit',\n left: 'data-[state=open]:animate-popover-left-enter data-[state=closed]:animate-popover-left-exit',\n right: 'data-[state=open]:animate-popover-right-enter data-[state=closed]:animate-popover-right-exit',\n}\n\n// ─── Content variants ────────────────────────────────────────\nconst popoverContentVariants = cva(\n 'relative z-popover flex flex-col font-normal select-none w-auto max-w-[calc(100vw-16px)] max-h-[var(--radix-popover-content-available-height)] outline-none',\n {\n variants: {\n variant: {\n default: 'bg-background-paper text-foreground border border-border shadow-lg',\n elevated: 'bg-background-paper/95 text-foreground border border-border-subtle shadow-xl backdrop-blur-sm',\n },\n size: {\n sm: 'text-sm p-3 rounded-lg',\n default: 'text-sm p-4 rounded-xl',\n lg: 'text-md p-5 rounded-xl',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n }\n)\n\n// ─── Arrow styles ──────────────────────────────────────────────\n// default: CSS rotated square with 2-side border (seamless connection)\n// elevated: Radix SVG arrow with drop-shadow (glassmorphism, subtle border)\nconst CSS_ARROW_CLASSES: Record<PopoverSide, string> = {\n bottom: '-top-[5px] left-1/2 -translate-x-1/2 border-t border-l border-border',\n top: '-bottom-[5px] left-1/2 -translate-x-1/2 border-b border-r border-border',\n right: '-left-[5px] top-1/2 -translate-y-1/2 border-b border-l border-border',\n left: '-right-[5px] top-1/2 -translate-y-1/2 border-t border-r border-border',\n}\n\nconst ARROW_ELEVATED = 'fill-background-paper drop-shadow-sm'\n\n// ═══════════════════════════════════════════════════════════════\n// Popover\n// ═══════════════════════════════════════════════════════════════\n\n// ─── Popover (Root) — thin wrapper to expose as named export ──\nexport interface PopoverRootProps extends React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Root> {}\n\nfunction Popover(props: PopoverRootProps) {\n return <PopoverPrimitive.Root {...props} />\n}\n\n// ─── PopoverTrigger ──────────────────────────────────────────\nconst PopoverTrigger = PopoverPrimitive.Trigger\n\n// ─── PopoverPortal ───────────────────────────────────────────\nconst PopoverPortal = PopoverPrimitive.Portal\n\n// ─── PopoverAnchor ───────────────────────────────────────────\nconst PopoverAnchor = PopoverPrimitive.Anchor\n\n// ─── PopoverClose ────────────────────────────────────────────\nconst PopoverClose = PopoverPrimitive.Close\n\n// ─── PopoverContent ──────────────────────────────────────────\nexport interface PopoverContentProps\n extends React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>,\n VariantProps<typeof popoverContentVariants> {\n /** Show arrow pointing to trigger */\n showArrow?: boolean\n /** Show built-in close button */\n showClose?: boolean\n /** Custom close icon (replaces default X icon) */\n closeIcon?: React.ReactNode\n}\n\nconst PopoverContent = React.forwardRef<\n React.ElementRef<typeof PopoverPrimitive.Content>,\n PopoverContentProps\n>(({ className, variant = 'default', size, side = 'bottom', sideOffset, showArrow = true, showClose = false, closeIcon, children, ...props }, ref) => {\n const resolvedSide = side as PopoverSide\n // CSS arrow (default) needs more gap since it doesn't occupy layout space\n const resolvedOffset = sideOffset ?? (variant === 'default' && showArrow ? 12 : 6)\n\n return (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n ref={ref}\n side={side}\n sideOffset={resolvedOffset}\n className={cn(\n popoverContentVariants({ variant, size }),\n ANIMATION_CLASSES[resolvedSide],\n className,\n )}\n {...props}\n >\n {showClose && (\n <PopoverPrimitive.Close\n className=\"absolute top-3 right-3 rounded-md p-1 text-text-muted hover:text-foreground hover:bg-background-muted transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-focus-ring\"\n aria-label=\"Close\"\n >\n {closeIcon || <DefaultCloseIcon className=\"icon-sm\" />}\n </PopoverPrimitive.Close>\n )}\n {/* Scrolls when taller than the viewport space; lives inside Content so the arrow is not clipped.\n -m-1 p-1 keeps children's focus rings inside the scroll area */}\n <div className=\"min-h-0 overflow-y-auto -m-1 p-1\">\n {children}\n </div>\n {showArrow && variant === 'default' && (\n <div\n className={cn(\n 'absolute w-2.5 h-2.5 rotate-45 bg-background-paper',\n CSS_ARROW_CLASSES[resolvedSide],\n )}\n />\n )}\n {showArrow && variant === 'elevated' && (\n <PopoverPrimitive.Arrow\n className={ARROW_ELEVATED}\n width={12}\n height={6}\n />\n )}\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n )\n})\nPopoverContent.displayName = 'PopoverContent'\n\n// ─── PopoverArrow (standalone, for manual placement outside Content) ──\nconst PopoverArrow = React.forwardRef<\n React.ElementRef<typeof PopoverPrimitive.Arrow>,\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Arrow>\n>(({ className, ...props }, ref) => (\n <PopoverPrimitive.Arrow\n ref={ref}\n className={cn('fill-background-paper', className)}\n width={10}\n height={5}\n {...props}\n />\n))\nPopoverArrow.displayName = 'PopoverArrow'\n\n// ─── Exports ────────────────────────────────────────────────\nexport {\n Popover,\n PopoverTrigger,\n PopoverContent,\n PopoverArrow,\n PopoverClose,\n PopoverAnchor,\n PopoverPortal,\n popoverContentVariants,\n}\n"],"mappings":";;;;;;AAEA,YAAY,WAAW;AACvB,YAAY,sBAAsB;AAClC,SAAS,WAA8B;AAIvC,IAAM,mBAAmB,CAAC,EAAE,UAAU,MACpC;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,MAAK;AAAA,IACL,SAAQ;AAAA,IACR,QAAO;AAAA,IACP,aAAa;AAAA,IACb,eAAY;AAAA;AAAA,EAEZ,oCAAC,UAAK,eAAc,SAAQ,gBAAe,SAAQ,GAAE,wBAAuB;AAC9E;AAOF,IAAM,oBAAiD;AAAA,EACrD,KAAQ;AAAA,EACR,QAAQ;AAAA,EACR,MAAQ;AAAA,EACR,OAAQ;AACV;AAGA,IAAM,yBAAyB;AAAA,EAC7B;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SAAS;AAAA,QACT,UAAU;AAAA,MACZ;AAAA,MACA,MAAM;AAAA,QACJ,IAAI;AAAA,QACJ,SAAS;AAAA,QACT,IAAI;AAAA,MACN;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,MACT,MAAM;AAAA,IACR;AAAA,EACF;AACF;AAKA,IAAM,oBAAiD;AAAA,EACrD,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,OAAO;AAAA,EACP,MAAM;AACR;AAEA,IAAM,iBAAiB;AASvB,SAAS,QAAQ,OAAyB;AACxC,SAAO,oCAAkB,uBAAjB,EAAuB,GAAG,OAAO;AAC3C;AAGA,IAAM,iBAAkC;AAGxC,IAAM,gBAAiC;AAGvC,IAAM,gBAAiC;AAGvC,IAAM,eAAgC;AActC,IAAM,iBAAuB,iBAG3B,CAAC,EAAE,WAAW,UAAU,WAAW,MAAM,OAAO,UAAU,YAAY,YAAY,MAAM,YAAY,OAAO,WAAW,UAAU,GAAG,MAAM,GAAG,QAAQ;AACpJ,QAAM,eAAe;AAErB,QAAM,iBAAiB,eAAe,YAAY,aAAa,YAAY,KAAK;AAEhF,SACE,oCAAkB,yBAAjB,MACC;AAAA,IAAkB;AAAA,IAAjB;AAAA,MACC;AAAA,MACA;AAAA,MACA,YAAY;AAAA,MACZ,WAAW;AAAA,QACT,uBAAuB,EAAE,SAAS,KAAK,CAAC;AAAA,QACxC,kBAAkB,YAAY;AAAA,QAC9B;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,IAEH,aACC;AAAA,MAAkB;AAAA,MAAjB;AAAA,QACC,WAAU;AAAA,QACV,cAAW;AAAA;AAAA,MAEV,aAAa,oCAAC,oBAAiB,WAAU,WAAU;AAAA,IACtD;AAAA,IAIF,oCAAC,SAAI,WAAU,sCACZ,QACH;AAAA,IACC,aAAa,YAAY,aACxB;AAAA,MAAC;AAAA;AAAA,QACC,WAAW;AAAA,UACT;AAAA,UACA,kBAAkB,YAAY;AAAA,QAChC;AAAA;AAAA,IACF;AAAA,IAED,aAAa,YAAY,cACxB;AAAA,MAAkB;AAAA,MAAjB;AAAA,QACC,WAAW;AAAA,QACX,OAAO;AAAA,QACP,QAAQ;AAAA;AAAA,IACV;AAAA,EAEJ,CACF;AAEJ,CAAC;AACD,eAAe,cAAc;AAG7B,IAAM,eAAqB,iBAGzB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAkB;AAAA,EAAjB;AAAA,IACC;AAAA,IACA,WAAW,GAAG,yBAAyB,SAAS;AAAA,IAChD,OAAO;AAAA,IACP,QAAQ;AAAA,IACP,GAAG;AAAA;AACN,CACD;AACD,aAAa,cAAc;","names":[]}
@@ -0,0 +1,148 @@
1
+ "use client";
2
+ import {
3
+ useButtonGroup
4
+ } from "./chunk-Q5WVLK2L.mjs";
5
+ import {
6
+ cn
7
+ } from "./chunk-53MIUPSY.mjs";
8
+
9
+ // src/components/ui/button.tsx
10
+ import * as React from "react";
11
+ import { Slot } from "@radix-ui/react-slot";
12
+ import { cva } from "class-variance-authority";
13
+ var solidColorMap = {
14
+ default: "bg-foreground text-background hover:bg-foreground/90 active:bg-foreground/80",
15
+ primary: "bg-primary text-primary-foreground hover:bg-primary-hover active:bg-primary-active",
16
+ secondary: "bg-secondary text-secondary-foreground hover:bg-secondary-hover active:bg-secondary-active",
17
+ destructive: "bg-error text-error-foreground hover:bg-error-hover active:bg-error-active"
18
+ };
19
+ var buttonVariants = cva(
20
+ "inline-flex items-center justify-center whitespace-nowrap transition-all duration-micro focus-visible:focus-ring disabled:pointer-events-none disabled:opacity-50",
21
+ {
22
+ variants: {
23
+ variant: {
24
+ solid: "font-semibold",
25
+ outline: "border border-border bg-background text-foreground hover:bg-background-muted font-normal",
26
+ ghost: "text-foreground hover:bg-background-muted font-normal",
27
+ link: "text-text-link underline-offset-4 hover:underline font-normal"
28
+ },
29
+ size: {
30
+ xs: "h-7 px-2.5 text-xs gap-1",
31
+ // 28px height, 10px paddingX, 12px font
32
+ sm: "h-8 px-3 text-sm gap-2",
33
+ // 32px height, 12px paddingX, 13px font
34
+ md: "h-9 px-3.5 text-md gap-2",
35
+ // 36px height, 14px paddingX, 14px font
36
+ default: "h-10 px-4 text-md gap-2",
37
+ // 40px height, 16px paddingX, 14px font
38
+ lg: "h-12 px-6 text-base gap-2",
39
+ // 48px height, 24px paddingX, 16px font
40
+ icon: "h-10 w-10"
41
+ },
42
+ radius: {
43
+ none: "rounded-none",
44
+ // 0px - primitive.borderRadius.none
45
+ sm: "rounded-sm",
46
+ // 2px - primitive.borderRadius.sm
47
+ base: "rounded",
48
+ // 4px - primitive.borderRadius.base
49
+ default: "rounded-md",
50
+ // 6px - primitive.borderRadius.md (Figma button default)
51
+ lg: "rounded-lg",
52
+ // 8px - primitive.borderRadius.lg
53
+ xl: "rounded-xl",
54
+ // 12px - primitive.borderRadius.xl
55
+ "2xl": "rounded-2xl",
56
+ // 16px - primitive.borderRadius.2xl
57
+ "3xl": "rounded-3xl",
58
+ // 24px - primitive.borderRadius.3xl
59
+ full: "rounded-full"
60
+ // 9999px - primitive.borderRadius.full
61
+ },
62
+ fullWidth: {
63
+ true: "w-full",
64
+ false: "w-auto"
65
+ }
66
+ },
67
+ defaultVariants: {
68
+ variant: "solid",
69
+ size: "default",
70
+ radius: "default",
71
+ fullWidth: false
72
+ }
73
+ }
74
+ );
75
+ var Button = React.forwardRef(
76
+ ({
77
+ className,
78
+ variant: variantProp,
79
+ color: colorProp,
80
+ size: sizeProp,
81
+ radius: radiusProp,
82
+ fullWidth,
83
+ asChild = false,
84
+ loading = false,
85
+ disabled: disabledProp,
86
+ leftIcon,
87
+ rightIcon,
88
+ selected = false,
89
+ fontWeight: fontWeightProp,
90
+ pressEffect,
91
+ children,
92
+ ...props
93
+ }, ref) => {
94
+ const Comp = asChild ? Slot : "button";
95
+ const groupContext = useButtonGroup();
96
+ const variant = variantProp ?? groupContext?.variant ?? "solid";
97
+ const color = colorProp ?? "default";
98
+ const size = sizeProp ?? groupContext?.size;
99
+ const radius = radiusProp ?? groupContext?.radius;
100
+ const disabled = disabledProp ?? groupContext?.disabled;
101
+ const fontWeight = fontWeightProp ?? groupContext?.fontWeight;
102
+ const fontWeightClass = fontWeight === "normal" ? "font-normal" : fontWeight === "semibold" ? "font-semibold" : "";
103
+ const iconSizeClass = {
104
+ xs: "icon-xs",
105
+ // 14px
106
+ sm: "icon-xs",
107
+ // 14px
108
+ md: "icon-sm",
109
+ // 16px
110
+ default: "icon-sm",
111
+ // 16px
112
+ lg: "icon-sm",
113
+ // 16px
114
+ icon: "icon-md"
115
+ // icon-only → 20px
116
+ }[size || "default"];
117
+ const selectedStyles = selected ? variant === "outline" ? "bg-background-muted" : variant === "ghost" ? "font-semibold" : "" : "";
118
+ return /* @__PURE__ */ React.createElement(
119
+ Comp,
120
+ {
121
+ className: cn(buttonVariants({ variant, size, radius, fullWidth }), variant === "solid" && solidColorMap[color], pressEffect !== false && "active:scale-pressed", fontWeightClass, selectedStyles, className),
122
+ ref,
123
+ disabled: disabled || loading,
124
+ "aria-busy": loading || void 0,
125
+ "aria-pressed": selected || void 0,
126
+ ...props
127
+ },
128
+ loading ? /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(
129
+ "svg",
130
+ {
131
+ className: cn(iconSizeClass, "animate-spin"),
132
+ fill: "none",
133
+ viewBox: "0 0 24 24",
134
+ "aria-hidden": "true"
135
+ },
136
+ /* @__PURE__ */ React.createElement("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }),
137
+ /* @__PURE__ */ React.createElement("path", { className: "opacity-75", fill: "currentColor", d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z" })
138
+ ), /* @__PURE__ */ React.createElement("span", null, children)) : /* @__PURE__ */ React.createElement(React.Fragment, null, leftIcon && /* @__PURE__ */ React.createElement("span", { className: cn(iconSizeClass, "[&>svg]:w-full [&>svg]:h-full"), "aria-hidden": "true" }, leftIcon), children, rightIcon && /* @__PURE__ */ React.createElement("span", { className: cn(iconSizeClass, "[&>svg]:w-full [&>svg]:h-full"), "aria-hidden": "true" }, rightIcon))
139
+ );
140
+ }
141
+ );
142
+ Button.displayName = "Button";
143
+
144
+ export {
145
+ buttonVariants,
146
+ Button
147
+ };
148
+ //# sourceMappingURL=chunk-IPCIC2BI.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/ui/button.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { Slot } from '@radix-ui/react-slot'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '@/lib/utils'\nimport { useButtonGroup } from './button-group'\n\n// Solid color maps (applied when variant=\"solid\")\nconst solidColorMap = {\n default: 'bg-foreground text-background hover:bg-foreground/90 active:bg-foreground/80',\n primary: 'bg-primary text-primary-foreground hover:bg-primary-hover active:bg-primary-active',\n secondary: 'bg-secondary text-secondary-foreground hover:bg-secondary-hover active:bg-secondary-active',\n destructive: 'bg-error text-error-foreground hover:bg-error-hover active:bg-error-active',\n} as const\n\nexport type ButtonColor = keyof typeof solidColorMap\n\nconst buttonVariants = cva(\n 'inline-flex items-center justify-center whitespace-nowrap transition-all duration-micro focus-visible:focus-ring disabled:pointer-events-none disabled:opacity-50',\n {\n variants: {\n variant: {\n solid: 'font-semibold',\n outline: 'border border-border bg-background text-foreground hover:bg-background-muted font-normal',\n ghost: 'text-foreground hover:bg-background-muted font-normal',\n link: 'text-text-link underline-offset-4 hover:underline font-normal',\n },\n size: {\n xs: 'h-7 px-2.5 text-xs gap-1', // 28px height, 10px paddingX, 12px font\n sm: 'h-8 px-3 text-sm gap-2', // 32px height, 12px paddingX, 13px font\n md: 'h-9 px-3.5 text-md gap-2', // 36px height, 14px paddingX, 14px font\n default: 'h-10 px-4 text-md gap-2', // 40px height, 16px paddingX, 14px font\n lg: 'h-12 px-6 text-base gap-2', // 48px height, 24px paddingX, 16px font\n icon: 'h-10 w-10',\n },\n radius: {\n none: 'rounded-none', // 0px - primitive.borderRadius.none\n sm: 'rounded-sm', // 2px - primitive.borderRadius.sm\n base: 'rounded', // 4px - primitive.borderRadius.base\n default: 'rounded-md', // 6px - primitive.borderRadius.md (Figma button default)\n lg: 'rounded-lg', // 8px - primitive.borderRadius.lg\n xl: 'rounded-xl', // 12px - primitive.borderRadius.xl\n '2xl': 'rounded-2xl', // 16px - primitive.borderRadius.2xl\n '3xl': 'rounded-3xl', // 24px - primitive.borderRadius.3xl\n full: 'rounded-full', // 9999px - primitive.borderRadius.full\n },\n fullWidth: {\n true: 'w-full',\n false: 'w-auto',\n },\n },\n defaultVariants: {\n variant: 'solid',\n size: 'default',\n radius: 'default',\n fullWidth: false,\n },\n }\n)\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n /** Solid variant color */\n color?: ButtonColor\n asChild?: boolean\n loading?: boolean\n leftIcon?: React.ReactNode\n rightIcon?: React.ReactNode\n selected?: boolean\n fontWeight?: 'normal' | 'semibold'\n pressEffect?: boolean\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({\n className,\n variant: variantProp,\n color: colorProp,\n size: sizeProp,\n radius: radiusProp,\n fullWidth,\n asChild = false,\n loading = false,\n disabled: disabledProp,\n leftIcon,\n rightIcon,\n selected = false,\n fontWeight: fontWeightProp,\n pressEffect,\n children,\n ...props\n }, ref) => {\n const Comp = asChild ? Slot : 'button'\n const groupContext = useButtonGroup()\n\n // Use context values as fallback, individual props take precedence\n const variant = variantProp ?? groupContext?.variant ?? 'solid'\n const color = colorProp ?? 'default'\n const size = sizeProp ?? groupContext?.size\n const radius = radiusProp ?? groupContext?.radius\n const disabled = disabledProp ?? groupContext?.disabled\n\n // Priority: direct prop > ButtonGroup context > variant default (no class)\n const fontWeight = fontWeightProp ?? groupContext?.fontWeight\n\n // FontWeight class (overrides variant default)\n const fontWeightClass = fontWeight === 'normal' ? 'font-normal' : fontWeight === 'semibold' ? 'font-semibold' : ''\n\n // Icon size for button with text (5-step scale)\n // xs~sm: 14px, md~default~lg: 16px\n const iconSizeClass = {\n xs: 'icon-xs', // 14px\n sm: 'icon-xs', // 14px\n md: 'icon-sm', // 16px\n default: 'icon-sm', // 16px\n lg: 'icon-sm', // 16px\n icon: 'icon-md', // icon-only → 20px\n }[size || 'default']\n\n // Selected styles by variant (used in ButtonGroup)\n const selectedStyles = selected ? (\n variant === 'outline' ? 'bg-background-muted' :\n variant === 'ghost' ? 'font-semibold' : ''\n ) : ''\n\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, radius, fullWidth }), variant === 'solid' && solidColorMap[color], pressEffect !== false && 'active:scale-pressed', fontWeightClass, selectedStyles, className)}\n ref={ref}\n disabled={disabled || loading}\n aria-busy={loading || undefined}\n aria-pressed={selected || undefined}\n {...props}\n >\n {loading ? (\n <>\n <svg\n className={cn(iconSizeClass, 'animate-spin')}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\" />\n <path className=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\" />\n </svg>\n <span>{children}</span>\n </>\n ) : (\n <>\n {leftIcon && <span className={cn(iconSizeClass, '[&>svg]:w-full [&>svg]:h-full')} aria-hidden=\"true\">{leftIcon}</span>}\n {children}\n {rightIcon && <span className={cn(iconSizeClass, '[&>svg]:w-full [&>svg]:h-full')} aria-hidden=\"true\">{rightIcon}</span>}\n </>\n )}\n </Comp>\n )\n }\n)\nButton.displayName = 'Button'\n\nexport { Button, buttonVariants }\n"],"mappings":";;;;;;;;;AAEA,YAAY,WAAW;AACvB,SAAS,YAAY;AACrB,SAAS,WAA8B;AAKvC,IAAM,gBAAgB;AAAA,EACpB,SAAS;AAAA,EACT,SAAS;AAAA,EACT,WAAW;AAAA,EACX,aAAa;AACf;AAIA,IAAM,iBAAiB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,OAAO;AAAA,QACP,SAAS;AAAA,QACT,OAAO;AAAA,QACP,MAAM;AAAA,MACR;AAAA,MACA,MAAM;AAAA,QACJ,IAAI;AAAA;AAAA,QACJ,IAAI;AAAA;AAAA,QACJ,IAAI;AAAA;AAAA,QACJ,SAAS;AAAA;AAAA,QACT,IAAI;AAAA;AAAA,QACJ,MAAM;AAAA,MACR;AAAA,MACA,QAAQ;AAAA,QACN,MAAM;AAAA;AAAA,QACN,IAAI;AAAA;AAAA,QACJ,MAAM;AAAA;AAAA,QACN,SAAS;AAAA;AAAA,QACT,IAAI;AAAA;AAAA,QACJ,IAAI;AAAA;AAAA,QACJ,OAAO;AAAA;AAAA,QACP,OAAO;AAAA;AAAA,QACP,MAAM;AAAA;AAAA,MACR;AAAA,MACA,WAAW;AAAA,QACT,MAAM;AAAA,QACN,OAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,MACT,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,WAAW;AAAA,IACb;AAAA,EACF;AACF;AAgBA,IAAM,SAAe;AAAA,EACnB,CAAC;AAAA,IACC;AAAA,IACA,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,IACN,QAAQ;AAAA,IACR;AAAA,IACA,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GAAG,QAAQ;AACT,UAAM,OAAO,UAAU,OAAO;AAC9B,UAAM,eAAe,eAAe;AAGpC,UAAM,UAAU,eAAe,cAAc,WAAW;AACxD,UAAM,QAAQ,aAAa;AAC3B,UAAM,OAAO,YAAY,cAAc;AACvC,UAAM,SAAS,cAAc,cAAc;AAC3C,UAAM,WAAW,gBAAgB,cAAc;AAG/C,UAAM,aAAa,kBAAkB,cAAc;AAGnD,UAAM,kBAAkB,eAAe,WAAW,gBAAgB,eAAe,aAAa,kBAAkB;AAIhH,UAAM,gBAAgB;AAAA,MACpB,IAAI;AAAA;AAAA,MACJ,IAAI;AAAA;AAAA,MACJ,IAAI;AAAA;AAAA,MACJ,SAAS;AAAA;AAAA,MACT,IAAI;AAAA;AAAA,MACJ,MAAM;AAAA;AAAA,IACR,EAAE,QAAQ,SAAS;AAGnB,UAAM,iBAAiB,WACrB,YAAY,YAAY,wBACxB,YAAY,UAAU,kBAAkB,KACtC;AAEJ,WACE;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,GAAG,eAAe,EAAE,SAAS,MAAM,QAAQ,UAAU,CAAC,GAAG,YAAY,WAAW,cAAc,KAAK,GAAG,gBAAgB,SAAS,wBAAwB,iBAAiB,gBAAgB,SAAS;AAAA,QAC5M;AAAA,QACA,UAAU,YAAY;AAAA,QACtB,aAAW,WAAW;AAAA,QACtB,gBAAc,YAAY;AAAA,QACzB,GAAG;AAAA;AAAA,MAEH,UACC,0DACE;AAAA,QAAC;AAAA;AAAA,UACC,WAAW,GAAG,eAAe,cAAc;AAAA,UAC3C,MAAK;AAAA,UACL,SAAQ;AAAA,UACR,eAAY;AAAA;AAAA,QAEZ,oCAAC,YAAO,WAAU,cAAa,IAAG,MAAK,IAAG,MAAK,GAAE,MAAK,QAAO,gBAAe,aAAY,KAAI;AAAA,QAC5F,oCAAC,UAAK,WAAU,cAAa,MAAK,gBAAe,GAAE,mHAAkH;AAAA,MACvK,GACA,oCAAC,cAAM,QAAS,CAClB,IAEA,0DACG,YAAY,oCAAC,UAAK,WAAW,GAAG,eAAe,+BAA+B,GAAG,eAAY,UAAQ,QAAS,GAC9G,UACA,aAAa,oCAAC,UAAK,WAAW,GAAG,eAAe,+BAA+B,GAAG,eAAY,UAAQ,SAAU,CACnH;AAAA,IAEJ;AAAA,EAEJ;AACF;AACA,OAAO,cAAc;","names":[]}