@karakuri-ui/react 0.3.3 → 0.3.4

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 (148) hide show
  1. package/README.md +27 -4
  2. package/dist/components/ui/accordion.js +27 -24
  3. package/dist/components/ui/accordion.js.map +1 -1
  4. package/dist/components/ui/accordion.mjs +27 -24
  5. package/dist/components/ui/accordion.mjs.map +1 -1
  6. package/dist/components/ui/alert.js +45 -27
  7. package/dist/components/ui/alert.js.map +1 -1
  8. package/dist/components/ui/alert.mjs +45 -27
  9. package/dist/components/ui/alert.mjs.map +1 -1
  10. package/dist/components/ui/avatar.js +41 -32
  11. package/dist/components/ui/avatar.js.map +1 -1
  12. package/dist/components/ui/avatar.mjs +41 -32
  13. package/dist/components/ui/avatar.mjs.map +1 -1
  14. package/dist/components/ui/badge.js +46 -43
  15. package/dist/components/ui/badge.js.map +1 -1
  16. package/dist/components/ui/badge.mjs +46 -43
  17. package/dist/components/ui/badge.mjs.map +1 -1
  18. package/dist/components/ui/breadcrumb.js +30 -25
  19. package/dist/components/ui/breadcrumb.js.map +1 -1
  20. package/dist/components/ui/breadcrumb.mjs +30 -25
  21. package/dist/components/ui/breadcrumb.mjs.map +1 -1
  22. package/dist/components/ui/button-group.js +6 -5
  23. package/dist/components/ui/button-group.js.map +1 -1
  24. package/dist/components/ui/button-group.mjs +6 -5
  25. package/dist/components/ui/button-group.mjs.map +1 -1
  26. package/dist/components/ui/button.js +24 -14
  27. package/dist/components/ui/button.js.map +1 -1
  28. package/dist/components/ui/button.mjs +24 -14
  29. package/dist/components/ui/button.mjs.map +1 -1
  30. package/dist/components/ui/card.js +53 -39
  31. package/dist/components/ui/card.js.map +1 -1
  32. package/dist/components/ui/card.mjs +53 -39
  33. package/dist/components/ui/card.mjs.map +1 -1
  34. package/dist/components/ui/chart.d.mts +1 -1
  35. package/dist/components/ui/chart.d.ts +1 -1
  36. package/dist/components/ui/chart.js +154 -130
  37. package/dist/components/ui/chart.js.map +1 -1
  38. package/dist/components/ui/chart.mjs +154 -130
  39. package/dist/components/ui/chart.mjs.map +1 -1
  40. package/dist/components/ui/checkbox.js +47 -40
  41. package/dist/components/ui/checkbox.js.map +1 -1
  42. package/dist/components/ui/checkbox.mjs +47 -40
  43. package/dist/components/ui/checkbox.mjs.map +1 -1
  44. package/dist/components/ui/divider.js +16 -13
  45. package/dist/components/ui/divider.js.map +1 -1
  46. package/dist/components/ui/divider.mjs +16 -13
  47. package/dist/components/ui/divider.mjs.map +1 -1
  48. package/dist/components/ui/drawer.js +44 -35
  49. package/dist/components/ui/drawer.js.map +1 -1
  50. package/dist/components/ui/drawer.mjs +44 -35
  51. package/dist/components/ui/drawer.mjs.map +1 -1
  52. package/dist/components/ui/dropdown.js +31 -24
  53. package/dist/components/ui/dropdown.js.map +1 -1
  54. package/dist/components/ui/dropdown.mjs +31 -24
  55. package/dist/components/ui/dropdown.mjs.map +1 -1
  56. package/dist/components/ui/field.js +18 -15
  57. package/dist/components/ui/field.js.map +1 -1
  58. package/dist/components/ui/field.mjs +18 -15
  59. package/dist/components/ui/field.mjs.map +1 -1
  60. package/dist/components/ui/icon-button.js +17 -14
  61. package/dist/components/ui/icon-button.js.map +1 -1
  62. package/dist/components/ui/icon-button.mjs +17 -14
  63. package/dist/components/ui/icon-button.mjs.map +1 -1
  64. package/dist/components/ui/input.js +34 -29
  65. package/dist/components/ui/input.js.map +1 -1
  66. package/dist/components/ui/input.mjs +34 -29
  67. package/dist/components/ui/input.mjs.map +1 -1
  68. package/dist/components/ui/metric-card.js +24 -21
  69. package/dist/components/ui/metric-card.js.map +1 -1
  70. package/dist/components/ui/metric-card.mjs +24 -21
  71. package/dist/components/ui/metric-card.mjs.map +1 -1
  72. package/dist/components/ui/modal.js +91 -74
  73. package/dist/components/ui/modal.js.map +1 -1
  74. package/dist/components/ui/modal.mjs +91 -74
  75. package/dist/components/ui/modal.mjs.map +1 -1
  76. package/dist/components/ui/navigation-menu.js +114 -93
  77. package/dist/components/ui/navigation-menu.js.map +1 -1
  78. package/dist/components/ui/navigation-menu.mjs +114 -93
  79. package/dist/components/ui/navigation-menu.mjs.map +1 -1
  80. package/dist/components/ui/pagination.js +66 -55
  81. package/dist/components/ui/pagination.js.map +1 -1
  82. package/dist/components/ui/pagination.mjs +66 -55
  83. package/dist/components/ui/pagination.mjs.map +1 -1
  84. package/dist/components/ui/popover.js +39 -36
  85. package/dist/components/ui/popover.js.map +1 -1
  86. package/dist/components/ui/popover.mjs +39 -36
  87. package/dist/components/ui/popover.mjs.map +1 -1
  88. package/dist/components/ui/progress.js +73 -64
  89. package/dist/components/ui/progress.js.map +1 -1
  90. package/dist/components/ui/progress.mjs +73 -64
  91. package/dist/components/ui/progress.mjs.map +1 -1
  92. package/dist/components/ui/radio-group.js +23 -19
  93. package/dist/components/ui/radio-group.js.map +1 -1
  94. package/dist/components/ui/radio-group.mjs +23 -19
  95. package/dist/components/ui/radio-group.mjs.map +1 -1
  96. package/dist/components/ui/segmented.js +7 -6
  97. package/dist/components/ui/segmented.js.map +1 -1
  98. package/dist/components/ui/segmented.mjs +7 -6
  99. package/dist/components/ui/segmented.mjs.map +1 -1
  100. package/dist/components/ui/select.js +55 -48
  101. package/dist/components/ui/select.js.map +1 -1
  102. package/dist/components/ui/select.mjs +55 -48
  103. package/dist/components/ui/select.mjs.map +1 -1
  104. package/dist/components/ui/skeleton.js +20 -19
  105. package/dist/components/ui/skeleton.js.map +1 -1
  106. package/dist/components/ui/skeleton.mjs +20 -19
  107. package/dist/components/ui/skeleton.mjs.map +1 -1
  108. package/dist/components/ui/slider.js +68 -58
  109. package/dist/components/ui/slider.js.map +1 -1
  110. package/dist/components/ui/slider.mjs +68 -58
  111. package/dist/components/ui/slider.mjs.map +1 -1
  112. package/dist/components/ui/spinner.js +185 -176
  113. package/dist/components/ui/spinner.js.map +1 -1
  114. package/dist/components/ui/spinner.mjs +185 -176
  115. package/dist/components/ui/spinner.mjs.map +1 -1
  116. package/dist/components/ui/switch.js +39 -28
  117. package/dist/components/ui/switch.js.map +1 -1
  118. package/dist/components/ui/switch.mjs +39 -28
  119. package/dist/components/ui/switch.mjs.map +1 -1
  120. package/dist/components/ui/table.js +26 -23
  121. package/dist/components/ui/table.js.map +1 -1
  122. package/dist/components/ui/table.mjs +26 -23
  123. package/dist/components/ui/table.mjs.map +1 -1
  124. package/dist/components/ui/tabs.js +25 -9
  125. package/dist/components/ui/tabs.js.map +1 -1
  126. package/dist/components/ui/tabs.mjs +25 -9
  127. package/dist/components/ui/tabs.mjs.map +1 -1
  128. package/dist/components/ui/textarea.js +2 -1
  129. package/dist/components/ui/textarea.js.map +1 -1
  130. package/dist/components/ui/textarea.mjs +2 -1
  131. package/dist/components/ui/textarea.mjs.map +1 -1
  132. package/dist/components/ui/toast.js +104 -80
  133. package/dist/components/ui/toast.js.map +1 -1
  134. package/dist/components/ui/toast.mjs +104 -80
  135. package/dist/components/ui/toast.mjs.map +1 -1
  136. package/dist/components/ui/toggle-group.js +9 -8
  137. package/dist/components/ui/toggle-group.js.map +1 -1
  138. package/dist/components/ui/toggle-group.mjs +9 -8
  139. package/dist/components/ui/toggle-group.mjs.map +1 -1
  140. package/dist/components/ui/toggle.js +3 -2
  141. package/dist/components/ui/toggle.js.map +1 -1
  142. package/dist/components/ui/toggle.mjs +3 -2
  143. package/dist/components/ui/toggle.mjs.map +1 -1
  144. package/dist/components/ui/tooltip.js +18 -15
  145. package/dist/components/ui/tooltip.js.map +1 -1
  146. package/dist/components/ui/tooltip.mjs +18 -15
  147. package/dist/components/ui/tooltip.mjs.map +1 -1
  148. package/package.json +27 -19
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # KARAKURI Design System
2
2
 
3
- Enterprise React component library with design token system.
3
+ Enterprise React component library with design token system — 37 components, Figma-sourced tokens, and an MCP server so AI agents build with the system instead of guessing it.
4
4
 
5
5
  [![npm react](https://img.shields.io/npm/v/@karakuri-ui/react?color=37D8E6&label=react)](https://www.npmjs.com/package/@karakuri-ui/react)
6
6
  [![npm tokens](https://img.shields.io/npm/v/@karakuri-ui/tokens?color=37D8E6&label=tokens)](https://www.npmjs.com/package/@karakuri-ui/tokens)
@@ -57,7 +57,7 @@ module.exports = {
57
57
 
58
58
  ```tsx
59
59
  import { Button, Card, CardHeader, CardTitle, CardContent } from '@karakuri-ui/react'
60
- import { Chart, type ChartConfig } from '@karakuri-ui/react/chart' // charts: separate entry
60
+ import { Chart, type ChartConfig } from '@karakuri-ui/react/chart' // charts: separate entry (requires `npm install recharts`)
61
61
 
62
62
  <Button variant="solid" color="primary">Get Started</Button>
63
63
 
@@ -69,16 +69,39 @@ import { Chart, type ChartConfig } from '@karakuri-ui/react/chart' // charts: s
69
69
  </Card>
70
70
  ```
71
71
 
72
+ ## AI Integration
73
+
74
+ ### Claude Code plugin (MCP server + skills)
75
+
76
+ One command installs the `karakuri-design` MCP server together with the KARAKURI skills and agent. No `npm install` — the plugin ships a self-contained bundle (requires read access to this repository).
77
+
78
+ ```bash
79
+ claude plugin marketplace add karakuri-ai/design-system && claude plugin install karakuri-design@karakuri
80
+ ```
81
+
82
+ | | |
83
+ |---|---|
84
+ | **MCP tools** | `list_components` · `get_component` · `get_component_examples` · `search_tokens` · `get_token` · `suggest_tokens` · `get_layout_pattern` · `validate_code` · `get_guidelines` |
85
+ | **Skills** | `/karakuri-setup` (project setup) · `/apply-design` (multi-screen builds) · `karakuri-design` (workflow rules, auto-loaded) |
86
+ | **Agent** | `design-agent` — builds several screens end to end, each validated to zero violations |
87
+
88
+ Other MCP clients: clone this repository and register `node <repo>/mcp/dist/index.js` (the bundle is committed — nothing to build). Setup guide: [/components/mcp](https://karakuri-design-system.vercel.app/components/mcp)
89
+
90
+ ### llms.txt
91
+
92
+ For AI tools that read plain text, point them at the docs-site files: [`llms.txt`](https://karakuri-design-system.vercel.app/llms.txt) (index) · [`llms-full.txt`](https://karakuri-design-system.vercel.app/llms-full.txt) (components) · [`llms-tokens.txt`](https://karakuri-design-system.vercel.app/llms-tokens.txt) (tokens). Guide: [/components/ai](https://karakuri-design-system.vercel.app/components/ai)
93
+
72
94
  ## Tech Stack
73
95
 
74
96
  | | |
75
97
  |---|---|
76
- | **Framework** | React 18 + TypeScript |
98
+ | **Framework** | React 18 / 19 + TypeScript |
77
99
  | **Styling** | Tailwind CSS v3 / v4 + CSS Variables |
78
100
  | **Primitives** | Radix UI |
79
101
  | **Charts** | Recharts |
80
102
  | **Tokens** | Figma Token Studio → `sync-tokens` |
81
- | **Build** | tsup (library), Next.js (docs) |
103
+ | **Build** | tsup (library), Next.js 16 (docs) |
104
+ | **AI** | MCP server (stdio) · Claude Code plugin · llms.txt |
82
105
 
83
106
  ## Roadmap
84
107
 
@@ -37,11 +37,12 @@ __export(accordion_exports, {
37
37
  accordionVariants: () => accordionVariants
38
38
  });
39
39
  module.exports = __toCommonJS(accordion_exports);
40
+ var import_jsx_runtime = require("react/jsx-runtime");
40
41
  var React = __toESM(require("react"));
41
42
  var AccordionPrimitive = __toESM(require("@radix-ui/react-accordion"));
42
43
  var import_class_variance_authority = require("class-variance-authority");
43
44
  var import_utils = require("../../lib/utils");
44
- const DefaultChevronIcon = ({ className }) => /* @__PURE__ */ React.createElement(
45
+ const DefaultChevronIcon = ({ className }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
45
46
  "svg",
46
47
  {
47
48
  className,
@@ -49,9 +50,9 @@ const DefaultChevronIcon = ({ className }) => /* @__PURE__ */ React.createElemen
49
50
  viewBox: "0 0 24 24",
50
51
  stroke: "currentColor",
51
52
  strokeWidth: 2,
52
- "aria-hidden": "true"
53
- },
54
- /* @__PURE__ */ React.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M19 9l-7 7-7-7" })
53
+ "aria-hidden": "true",
54
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M19 9l-7 7-7-7" })
55
+ }
55
56
  );
56
57
  const AccordionStyleContext = React.createContext({});
57
58
  const useAccordionStyleContext = () => React.useContext(AccordionStyleContext);
@@ -84,7 +85,7 @@ const Accordion = React.forwardRef(
84
85
  onValueChange,
85
86
  disabled
86
87
  };
87
- return /* @__PURE__ */ React.createElement(AccordionStyleContext.Provider, { value: { variant, size, iconPosition } }, /* @__PURE__ */ React.createElement(
88
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AccordionStyleContext.Provider, { value: { variant, size, iconPosition }, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
88
89
  AccordionPrimitive.Root,
89
90
  {
90
91
  ref,
@@ -92,7 +93,7 @@ const Accordion = React.forwardRef(
92
93
  ...radixProps,
93
94
  ...props
94
95
  }
95
- ));
96
+ ) });
96
97
  }
97
98
  );
98
99
  Accordion.displayName = "Accordion";
@@ -110,7 +111,7 @@ const accordionItemVariants = (0, import_class_variance_authority.cva)("", {
110
111
  });
111
112
  const AccordionItem = React.forwardRef(({ className, ...props }, ref) => {
112
113
  const { variant } = useAccordionStyleContext();
113
- return /* @__PURE__ */ React.createElement(
114
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
114
115
  AccordionPrimitive.Item,
115
116
  {
116
117
  ref,
@@ -161,7 +162,7 @@ const triggerIconSizeClasses = {
161
162
  const AccordionTrigger = React.forwardRef(({ className, children, icon, ...props }, ref) => {
162
163
  const { size, iconPosition } = useAccordionStyleContext();
163
164
  const resolvedSize = size || "default";
164
- return /* @__PURE__ */ React.createElement(AccordionPrimitive.Header, { className: "flex" }, /* @__PURE__ */ React.createElement(
165
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AccordionPrimitive.Header, { className: "flex", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
165
166
  AccordionPrimitive.Trigger,
166
167
  {
167
168
  ref,
@@ -170,14 +171,16 @@ const AccordionTrigger = React.forwardRef(({ className, children, icon, ...props
170
171
  accordionTriggerVariants({ size: resolvedSize, iconPosition }),
171
172
  className
172
173
  ),
173
- ...props
174
- },
175
- icon || /* @__PURE__ */ React.createElement(DefaultChevronIcon, { className: (0, import_utils.cn)(
176
- "accordion-chevron shrink-0 text-text-muted transition-transform duration-normal",
177
- triggerIconSizeClasses[resolvedSize]
178
- ) }),
179
- /* @__PURE__ */ React.createElement("span", { className: "text-left" }, children)
180
- ));
174
+ ...props,
175
+ children: [
176
+ icon || /* @__PURE__ */ (0, import_jsx_runtime.jsx)(DefaultChevronIcon, { className: (0, import_utils.cn)(
177
+ "accordion-chevron shrink-0 text-text-muted transition-transform duration-normal",
178
+ triggerIconSizeClasses[resolvedSize]
179
+ ) }),
180
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-left", children })
181
+ ]
182
+ }
183
+ ) });
181
184
  });
182
185
  AccordionTrigger.displayName = "AccordionTrigger";
183
186
  const accordionContentSizeClasses = {
@@ -188,18 +191,18 @@ const accordionContentSizeClasses = {
188
191
  const AccordionContent = React.forwardRef(({ className, children, ...props }, ref) => {
189
192
  const { size } = useAccordionStyleContext();
190
193
  const resolvedSize = size || "default";
191
- return /* @__PURE__ */ React.createElement(
194
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
192
195
  AccordionPrimitive.Content,
193
196
  {
194
197
  ref,
195
198
  className: "overflow-hidden data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down",
196
- ...props
197
- },
198
- /* @__PURE__ */ React.createElement("div", { className: (0, import_utils.cn)(
199
- "text-text-muted",
200
- accordionContentSizeClasses[resolvedSize],
201
- className
202
- ) }, children)
199
+ ...props,
200
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: (0, import_utils.cn)(
201
+ "text-text-muted",
202
+ accordionContentSizeClasses[resolvedSize],
203
+ className
204
+ ), children })
205
+ }
203
206
  );
204
207
  });
205
208
  AccordionContent.displayName = "AccordionContent";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/ui/accordion.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as AccordionPrimitive from '@radix-ui/react-accordion'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../../lib/utils'\n\n// Default chevron icon (built-in, no external dependency)\nconst DefaultChevronIcon = ({ 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=\"M19 9l-7 7-7-7\" />\n </svg>\n)\n\n// Context to pass style props from Accordion root to children\ntype AccordionStyleContextValue = {\n variant?: 'default' | 'bordered' | 'splitted'\n size?: 'sm' | 'default' | 'lg'\n iconPosition?: 'left' | 'right'\n}\nconst AccordionStyleContext = React.createContext<AccordionStyleContextValue>({})\nconst useAccordionStyleContext = () => React.useContext(AccordionStyleContext)\n\n// ─── Accordion (Root) ────────────────────────────────────────\n\nconst accordionVariants = cva('w-full', {\n variants: {\n variant: {\n default: 'divide-y divide-border',\n bordered: 'divide-y divide-border border border-border rounded-xl',\n splitted: 'flex flex-col gap-3',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n})\n\nexport interface AccordionProps extends React.HTMLAttributes<HTMLDivElement> {\n type?: 'single' | 'multiple'\n variant?: 'default' | 'bordered' | 'splitted'\n size?: 'sm' | 'default' | 'lg'\n iconPosition?: 'left' | 'right'\n collapsible?: boolean\n defaultValue?: string | string[]\n value?: string | string[]\n onValueChange?: ((value: string) => void) | ((value: string[]) => void)\n disabled?: boolean\n}\n\nconst Accordion = React.forwardRef<HTMLDivElement, AccordionProps>(\n ({ className, variant = 'default', size = 'default', iconPosition = 'right', type = 'single', collapsible = true, defaultValue, value, onValueChange, disabled, ...props }, ref) => {\n const sharedClassName = cn(accordionVariants({ variant }), className)\n\n const radixProps = type === 'multiple'\n ? {\n type: 'multiple' as const,\n defaultValue: defaultValue as string[] | undefined,\n value: value as string[] | undefined,\n onValueChange: onValueChange as ((value: string[]) => void) | undefined,\n disabled,\n }\n : {\n type: 'single' as const,\n collapsible,\n defaultValue: defaultValue as string | undefined,\n value: value as string | undefined,\n onValueChange: onValueChange as ((value: string) => void) | undefined,\n disabled,\n }\n\n return (\n <AccordionStyleContext.Provider value={{ variant, size, iconPosition }}>\n {/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}\n <AccordionPrimitive.Root\n ref={ref}\n className={sharedClassName}\n {...radixProps}\n {...(props as any)}\n />\n </AccordionStyleContext.Provider>\n )\n }\n)\nAccordion.displayName = 'Accordion'\n\n// ─── AccordionItem ───────────────────────────────────────────\n\nconst accordionItemVariants = cva('', {\n variants: {\n variant: {\n default: '',\n bordered: '',\n splitted: 'border border-border rounded-xl',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n})\n\nexport interface AccordionItemProps\n extends React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Item>,\n Omit<VariantProps<typeof accordionItemVariants>, 'variant'> {}\n\nconst AccordionItem = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Item>,\n AccordionItemProps\n>(({ className, ...props }, ref) => {\n const { variant } = useAccordionStyleContext()\n return (\n <AccordionPrimitive.Item\n ref={ref}\n className={cn(accordionItemVariants({ variant }), className)}\n {...props}\n />\n )\n})\nAccordionItem.displayName = 'AccordionItem'\n\n// ─── AccordionTrigger ────────────────────────────────────────\n\nconst accordionTriggerVariants = cva(\n [\n 'flex flex-1 items-center gap-3 font-semibold text-foreground',\n 'transition-all duration-micro ease-out cursor-pointer',\n 'hover:bg-background-muted/50',\n 'focus-visible:focus-ring focus-visible:rounded-md',\n 'disabled:pointer-events-none disabled:text-text-subtle disabled:opacity-50',\n '[&[data-state=open]>svg.accordion-chevron]:rotate-180',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'py-3 px-4 text-sm', // 13px\n default: 'py-4 px-4 text-md', // 14px\n lg: 'py-5 px-6 text-base', // 16px\n },\n iconPosition: {\n left: 'flex-row',\n right: 'flex-row-reverse justify-between',\n },\n },\n defaultVariants: {\n size: 'default',\n iconPosition: 'right',\n },\n }\n)\n\n// Icon size per trigger size\nconst triggerIconSizeClasses = {\n sm: 'icon-xs', // 14px\n default: 'icon-sm', // 16px\n lg: 'icon-sm', // 16px\n} as const\n\nexport interface AccordionTriggerProps\n extends React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Trigger> {\n /** Custom indicator icon (replaces default chevron) */\n icon?: React.ReactNode\n}\n\nconst AccordionTrigger = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Trigger>,\n AccordionTriggerProps\n>(({ className, children, icon, ...props }, ref) => {\n const { size, iconPosition } = useAccordionStyleContext()\n const resolvedSize = size || 'default'\n\n return (\n <AccordionPrimitive.Header className=\"flex\">\n <AccordionPrimitive.Trigger\n ref={ref}\n className={cn(\n 'group',\n accordionTriggerVariants({ size: resolvedSize, iconPosition }),\n className\n )}\n {...props}\n >\n {icon || (\n <DefaultChevronIcon className={cn(\n 'accordion-chevron shrink-0 text-text-muted transition-transform duration-normal',\n triggerIconSizeClasses[resolvedSize]\n )} />\n )}\n <span className=\"text-left\">{children}</span>\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n )\n})\nAccordionTrigger.displayName = 'AccordionTrigger'\n\n// ─── AccordionContent ────────────────────────────────────────\n\nconst accordionContentSizeClasses = {\n sm: 'px-4 pb-3 text-sm',\n default: 'px-4 pb-4 text-md',\n lg: 'px-6 pb-5 text-base',\n} as const\n\nexport interface AccordionContentProps\n extends React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Content> {}\n\nconst AccordionContent = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Content>,\n AccordionContentProps\n>(({ className, children, ...props }, ref) => {\n const { size } = useAccordionStyleContext()\n const resolvedSize = size || 'default'\n\n return (\n <AccordionPrimitive.Content\n ref={ref}\n className=\"overflow-hidden data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down\"\n {...props}\n >\n <div className={cn(\n 'text-text-muted',\n accordionContentSizeClasses[resolvedSize],\n className\n )}>\n {children}\n </div>\n </AccordionPrimitive.Content>\n )\n})\nAccordionContent.displayName = 'AccordionContent'\n\n// ─── Exports ─────────────────────────────────────────────────\n\nexport {\n Accordion,\n AccordionItem,\n AccordionTrigger,\n AccordionContent,\n accordionVariants,\n accordionTriggerVariants,\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/components/ui/accordion.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as AccordionPrimitive from '@radix-ui/react-accordion'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../../lib/utils'\n\n// Default chevron icon (built-in, no external dependency)\nconst DefaultChevronIcon = ({ 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=\"M19 9l-7 7-7-7\" />\n </svg>\n)\n\n// Context to pass style props from Accordion root to children\ntype AccordionStyleContextValue = {\n variant?: 'default' | 'bordered' | 'splitted'\n size?: 'sm' | 'default' | 'lg'\n iconPosition?: 'left' | 'right'\n}\nconst AccordionStyleContext = React.createContext<AccordionStyleContextValue>({})\nconst useAccordionStyleContext = () => React.useContext(AccordionStyleContext)\n\n// ─── Accordion (Root) ────────────────────────────────────────\n\nconst accordionVariants = cva('w-full', {\n variants: {\n variant: {\n default: 'divide-y divide-border',\n bordered: 'divide-y divide-border border border-border rounded-xl',\n splitted: 'flex flex-col gap-3',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n})\n\nexport interface AccordionProps extends React.HTMLAttributes<HTMLDivElement> {\n type?: 'single' | 'multiple'\n variant?: 'default' | 'bordered' | 'splitted'\n size?: 'sm' | 'default' | 'lg'\n iconPosition?: 'left' | 'right'\n collapsible?: boolean\n defaultValue?: string | string[]\n value?: string | string[]\n onValueChange?: ((value: string) => void) | ((value: string[]) => void)\n disabled?: boolean\n}\n\nconst Accordion = React.forwardRef<HTMLDivElement, AccordionProps>(\n ({ className, variant = 'default', size = 'default', iconPosition = 'right', type = 'single', collapsible = true, defaultValue, value, onValueChange, disabled, ...props }, ref) => {\n const sharedClassName = cn(accordionVariants({ variant }), className)\n\n const radixProps = type === 'multiple'\n ? {\n type: 'multiple' as const,\n defaultValue: defaultValue as string[] | undefined,\n value: value as string[] | undefined,\n onValueChange: onValueChange as ((value: string[]) => void) | undefined,\n disabled,\n }\n : {\n type: 'single' as const,\n collapsible,\n defaultValue: defaultValue as string | undefined,\n value: value as string | undefined,\n onValueChange: onValueChange as ((value: string) => void) | undefined,\n disabled,\n }\n\n return (\n <AccordionStyleContext.Provider value={{ variant, size, iconPosition }}>\n {/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}\n <AccordionPrimitive.Root\n ref={ref}\n className={sharedClassName}\n {...radixProps}\n {...(props as any)}\n />\n </AccordionStyleContext.Provider>\n )\n }\n)\nAccordion.displayName = 'Accordion'\n\n// ─── AccordionItem ───────────────────────────────────────────\n\nconst accordionItemVariants = cva('', {\n variants: {\n variant: {\n default: '',\n bordered: '',\n splitted: 'border border-border rounded-xl',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n})\n\nexport interface AccordionItemProps\n extends React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Item>,\n Omit<VariantProps<typeof accordionItemVariants>, 'variant'> {}\n\nconst AccordionItem = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Item>,\n AccordionItemProps\n>(({ className, ...props }, ref) => {\n const { variant } = useAccordionStyleContext()\n return (\n <AccordionPrimitive.Item\n ref={ref}\n className={cn(accordionItemVariants({ variant }), className)}\n {...props}\n />\n )\n})\nAccordionItem.displayName = 'AccordionItem'\n\n// ─── AccordionTrigger ────────────────────────────────────────\n\nconst accordionTriggerVariants = cva(\n [\n 'flex flex-1 items-center gap-3 font-semibold text-foreground',\n 'transition-all duration-micro ease-out cursor-pointer',\n 'hover:bg-background-muted/50',\n 'focus-visible:focus-ring focus-visible:rounded-md',\n 'disabled:pointer-events-none disabled:text-text-subtle disabled:opacity-50',\n '[&[data-state=open]>svg.accordion-chevron]:rotate-180',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'py-3 px-4 text-sm', // 13px\n default: 'py-4 px-4 text-md', // 14px\n lg: 'py-5 px-6 text-base', // 16px\n },\n iconPosition: {\n left: 'flex-row',\n right: 'flex-row-reverse justify-between',\n },\n },\n defaultVariants: {\n size: 'default',\n iconPosition: 'right',\n },\n }\n)\n\n// Icon size per trigger size\nconst triggerIconSizeClasses = {\n sm: 'icon-xs', // 14px\n default: 'icon-sm', // 16px\n lg: 'icon-sm', // 16px\n} as const\n\nexport interface AccordionTriggerProps\n extends React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Trigger> {\n /** Custom indicator icon (replaces default chevron) */\n icon?: React.ReactNode\n}\n\nconst AccordionTrigger = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Trigger>,\n AccordionTriggerProps\n>(({ className, children, icon, ...props }, ref) => {\n const { size, iconPosition } = useAccordionStyleContext()\n const resolvedSize = size || 'default'\n\n return (\n <AccordionPrimitive.Header className=\"flex\">\n <AccordionPrimitive.Trigger\n ref={ref}\n className={cn(\n 'group',\n accordionTriggerVariants({ size: resolvedSize, iconPosition }),\n className\n )}\n {...props}\n >\n {icon || (\n <DefaultChevronIcon className={cn(\n 'accordion-chevron shrink-0 text-text-muted transition-transform duration-normal',\n triggerIconSizeClasses[resolvedSize]\n )} />\n )}\n <span className=\"text-left\">{children}</span>\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n )\n})\nAccordionTrigger.displayName = 'AccordionTrigger'\n\n// ─── AccordionContent ────────────────────────────────────────\n\nconst accordionContentSizeClasses = {\n sm: 'px-4 pb-3 text-sm',\n default: 'px-4 pb-4 text-md',\n lg: 'px-6 pb-5 text-base',\n} as const\n\nexport interface AccordionContentProps\n extends React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Content> {}\n\nconst AccordionContent = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Content>,\n AccordionContentProps\n>(({ className, children, ...props }, ref) => {\n const { size } = useAccordionStyleContext()\n const resolvedSize = size || 'default'\n\n return (\n <AccordionPrimitive.Content\n ref={ref}\n className=\"overflow-hidden data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down\"\n {...props}\n >\n <div className={cn(\n 'text-text-muted',\n accordionContentSizeClasses[resolvedSize],\n className\n )}>\n {children}\n </div>\n </AccordionPrimitive.Content>\n )\n})\nAccordionContent.displayName = 'AccordionContent'\n\n// ─── Exports ─────────────────────────────────────────────────\n\nexport {\n Accordion,\n AccordionItem,\n AccordionTrigger,\n AccordionContent,\n accordionVariants,\n accordionTriggerVariants,\n}\n"],"mappings":"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","names":[]}
@@ -1,9 +1,10 @@
1
1
  "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
2
3
  import * as React from "react";
3
4
  import * as AccordionPrimitive from "@radix-ui/react-accordion";
4
5
  import { cva } from "class-variance-authority";
5
6
  import { cn } from "../../lib/utils";
6
- const DefaultChevronIcon = ({ className }) => /* @__PURE__ */ React.createElement(
7
+ const DefaultChevronIcon = ({ className }) => /* @__PURE__ */ jsx(
7
8
  "svg",
8
9
  {
9
10
  className,
@@ -11,9 +12,9 @@ const DefaultChevronIcon = ({ className }) => /* @__PURE__ */ React.createElemen
11
12
  viewBox: "0 0 24 24",
12
13
  stroke: "currentColor",
13
14
  strokeWidth: 2,
14
- "aria-hidden": "true"
15
- },
16
- /* @__PURE__ */ React.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M19 9l-7 7-7-7" })
15
+ "aria-hidden": "true",
16
+ children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M19 9l-7 7-7-7" })
17
+ }
17
18
  );
18
19
  const AccordionStyleContext = React.createContext({});
19
20
  const useAccordionStyleContext = () => React.useContext(AccordionStyleContext);
@@ -46,7 +47,7 @@ const Accordion = React.forwardRef(
46
47
  onValueChange,
47
48
  disabled
48
49
  };
49
- return /* @__PURE__ */ React.createElement(AccordionStyleContext.Provider, { value: { variant, size, iconPosition } }, /* @__PURE__ */ React.createElement(
50
+ return /* @__PURE__ */ jsx(AccordionStyleContext.Provider, { value: { variant, size, iconPosition }, children: /* @__PURE__ */ jsx(
50
51
  AccordionPrimitive.Root,
51
52
  {
52
53
  ref,
@@ -54,7 +55,7 @@ const Accordion = React.forwardRef(
54
55
  ...radixProps,
55
56
  ...props
56
57
  }
57
- ));
58
+ ) });
58
59
  }
59
60
  );
60
61
  Accordion.displayName = "Accordion";
@@ -72,7 +73,7 @@ const accordionItemVariants = cva("", {
72
73
  });
73
74
  const AccordionItem = React.forwardRef(({ className, ...props }, ref) => {
74
75
  const { variant } = useAccordionStyleContext();
75
- return /* @__PURE__ */ React.createElement(
76
+ return /* @__PURE__ */ jsx(
76
77
  AccordionPrimitive.Item,
77
78
  {
78
79
  ref,
@@ -123,7 +124,7 @@ const triggerIconSizeClasses = {
123
124
  const AccordionTrigger = React.forwardRef(({ className, children, icon, ...props }, ref) => {
124
125
  const { size, iconPosition } = useAccordionStyleContext();
125
126
  const resolvedSize = size || "default";
126
- return /* @__PURE__ */ React.createElement(AccordionPrimitive.Header, { className: "flex" }, /* @__PURE__ */ React.createElement(
127
+ return /* @__PURE__ */ jsx(AccordionPrimitive.Header, { className: "flex", children: /* @__PURE__ */ jsxs(
127
128
  AccordionPrimitive.Trigger,
128
129
  {
129
130
  ref,
@@ -132,14 +133,16 @@ const AccordionTrigger = React.forwardRef(({ className, children, icon, ...props
132
133
  accordionTriggerVariants({ size: resolvedSize, iconPosition }),
133
134
  className
134
135
  ),
135
- ...props
136
- },
137
- icon || /* @__PURE__ */ React.createElement(DefaultChevronIcon, { className: cn(
138
- "accordion-chevron shrink-0 text-text-muted transition-transform duration-normal",
139
- triggerIconSizeClasses[resolvedSize]
140
- ) }),
141
- /* @__PURE__ */ React.createElement("span", { className: "text-left" }, children)
142
- ));
136
+ ...props,
137
+ children: [
138
+ icon || /* @__PURE__ */ jsx(DefaultChevronIcon, { className: cn(
139
+ "accordion-chevron shrink-0 text-text-muted transition-transform duration-normal",
140
+ triggerIconSizeClasses[resolvedSize]
141
+ ) }),
142
+ /* @__PURE__ */ jsx("span", { className: "text-left", children })
143
+ ]
144
+ }
145
+ ) });
143
146
  });
144
147
  AccordionTrigger.displayName = "AccordionTrigger";
145
148
  const accordionContentSizeClasses = {
@@ -150,18 +153,18 @@ const accordionContentSizeClasses = {
150
153
  const AccordionContent = React.forwardRef(({ className, children, ...props }, ref) => {
151
154
  const { size } = useAccordionStyleContext();
152
155
  const resolvedSize = size || "default";
153
- return /* @__PURE__ */ React.createElement(
156
+ return /* @__PURE__ */ jsx(
154
157
  AccordionPrimitive.Content,
155
158
  {
156
159
  ref,
157
160
  className: "overflow-hidden data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down",
158
- ...props
159
- },
160
- /* @__PURE__ */ React.createElement("div", { className: cn(
161
- "text-text-muted",
162
- accordionContentSizeClasses[resolvedSize],
163
- className
164
- ) }, children)
161
+ ...props,
162
+ children: /* @__PURE__ */ jsx("div", { className: cn(
163
+ "text-text-muted",
164
+ accordionContentSizeClasses[resolvedSize],
165
+ className
166
+ ), children })
167
+ }
165
168
  );
166
169
  });
167
170
  AccordionContent.displayName = "AccordionContent";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/ui/accordion.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as AccordionPrimitive from '@radix-ui/react-accordion'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../../lib/utils'\n\n// Default chevron icon (built-in, no external dependency)\nconst DefaultChevronIcon = ({ 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=\"M19 9l-7 7-7-7\" />\n </svg>\n)\n\n// Context to pass style props from Accordion root to children\ntype AccordionStyleContextValue = {\n variant?: 'default' | 'bordered' | 'splitted'\n size?: 'sm' | 'default' | 'lg'\n iconPosition?: 'left' | 'right'\n}\nconst AccordionStyleContext = React.createContext<AccordionStyleContextValue>({})\nconst useAccordionStyleContext = () => React.useContext(AccordionStyleContext)\n\n// ─── Accordion (Root) ────────────────────────────────────────\n\nconst accordionVariants = cva('w-full', {\n variants: {\n variant: {\n default: 'divide-y divide-border',\n bordered: 'divide-y divide-border border border-border rounded-xl',\n splitted: 'flex flex-col gap-3',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n})\n\nexport interface AccordionProps extends React.HTMLAttributes<HTMLDivElement> {\n type?: 'single' | 'multiple'\n variant?: 'default' | 'bordered' | 'splitted'\n size?: 'sm' | 'default' | 'lg'\n iconPosition?: 'left' | 'right'\n collapsible?: boolean\n defaultValue?: string | string[]\n value?: string | string[]\n onValueChange?: ((value: string) => void) | ((value: string[]) => void)\n disabled?: boolean\n}\n\nconst Accordion = React.forwardRef<HTMLDivElement, AccordionProps>(\n ({ className, variant = 'default', size = 'default', iconPosition = 'right', type = 'single', collapsible = true, defaultValue, value, onValueChange, disabled, ...props }, ref) => {\n const sharedClassName = cn(accordionVariants({ variant }), className)\n\n const radixProps = type === 'multiple'\n ? {\n type: 'multiple' as const,\n defaultValue: defaultValue as string[] | undefined,\n value: value as string[] | undefined,\n onValueChange: onValueChange as ((value: string[]) => void) | undefined,\n disabled,\n }\n : {\n type: 'single' as const,\n collapsible,\n defaultValue: defaultValue as string | undefined,\n value: value as string | undefined,\n onValueChange: onValueChange as ((value: string) => void) | undefined,\n disabled,\n }\n\n return (\n <AccordionStyleContext.Provider value={{ variant, size, iconPosition }}>\n {/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}\n <AccordionPrimitive.Root\n ref={ref}\n className={sharedClassName}\n {...radixProps}\n {...(props as any)}\n />\n </AccordionStyleContext.Provider>\n )\n }\n)\nAccordion.displayName = 'Accordion'\n\n// ─── AccordionItem ───────────────────────────────────────────\n\nconst accordionItemVariants = cva('', {\n variants: {\n variant: {\n default: '',\n bordered: '',\n splitted: 'border border-border rounded-xl',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n})\n\nexport interface AccordionItemProps\n extends React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Item>,\n Omit<VariantProps<typeof accordionItemVariants>, 'variant'> {}\n\nconst AccordionItem = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Item>,\n AccordionItemProps\n>(({ className, ...props }, ref) => {\n const { variant } = useAccordionStyleContext()\n return (\n <AccordionPrimitive.Item\n ref={ref}\n className={cn(accordionItemVariants({ variant }), className)}\n {...props}\n />\n )\n})\nAccordionItem.displayName = 'AccordionItem'\n\n// ─── AccordionTrigger ────────────────────────────────────────\n\nconst accordionTriggerVariants = cva(\n [\n 'flex flex-1 items-center gap-3 font-semibold text-foreground',\n 'transition-all duration-micro ease-out cursor-pointer',\n 'hover:bg-background-muted/50',\n 'focus-visible:focus-ring focus-visible:rounded-md',\n 'disabled:pointer-events-none disabled:text-text-subtle disabled:opacity-50',\n '[&[data-state=open]>svg.accordion-chevron]:rotate-180',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'py-3 px-4 text-sm', // 13px\n default: 'py-4 px-4 text-md', // 14px\n lg: 'py-5 px-6 text-base', // 16px\n },\n iconPosition: {\n left: 'flex-row',\n right: 'flex-row-reverse justify-between',\n },\n },\n defaultVariants: {\n size: 'default',\n iconPosition: 'right',\n },\n }\n)\n\n// Icon size per trigger size\nconst triggerIconSizeClasses = {\n sm: 'icon-xs', // 14px\n default: 'icon-sm', // 16px\n lg: 'icon-sm', // 16px\n} as const\n\nexport interface AccordionTriggerProps\n extends React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Trigger> {\n /** Custom indicator icon (replaces default chevron) */\n icon?: React.ReactNode\n}\n\nconst AccordionTrigger = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Trigger>,\n AccordionTriggerProps\n>(({ className, children, icon, ...props }, ref) => {\n const { size, iconPosition } = useAccordionStyleContext()\n const resolvedSize = size || 'default'\n\n return (\n <AccordionPrimitive.Header className=\"flex\">\n <AccordionPrimitive.Trigger\n ref={ref}\n className={cn(\n 'group',\n accordionTriggerVariants({ size: resolvedSize, iconPosition }),\n className\n )}\n {...props}\n >\n {icon || (\n <DefaultChevronIcon className={cn(\n 'accordion-chevron shrink-0 text-text-muted transition-transform duration-normal',\n triggerIconSizeClasses[resolvedSize]\n )} />\n )}\n <span className=\"text-left\">{children}</span>\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n )\n})\nAccordionTrigger.displayName = 'AccordionTrigger'\n\n// ─── AccordionContent ────────────────────────────────────────\n\nconst accordionContentSizeClasses = {\n sm: 'px-4 pb-3 text-sm',\n default: 'px-4 pb-4 text-md',\n lg: 'px-6 pb-5 text-base',\n} as const\n\nexport interface AccordionContentProps\n extends React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Content> {}\n\nconst AccordionContent = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Content>,\n AccordionContentProps\n>(({ className, children, ...props }, ref) => {\n const { size } = useAccordionStyleContext()\n const resolvedSize = size || 'default'\n\n return (\n <AccordionPrimitive.Content\n ref={ref}\n className=\"overflow-hidden data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down\"\n {...props}\n >\n <div className={cn(\n 'text-text-muted',\n accordionContentSizeClasses[resolvedSize],\n className\n )}>\n {children}\n </div>\n </AccordionPrimitive.Content>\n )\n})\nAccordionContent.displayName = 'AccordionContent'\n\n// ─── Exports ─────────────────────────────────────────────────\n\nexport {\n Accordion,\n AccordionItem,\n AccordionTrigger,\n AccordionContent,\n accordionVariants,\n accordionTriggerVariants,\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/components/ui/accordion.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as AccordionPrimitive from '@radix-ui/react-accordion'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../../lib/utils'\n\n// Default chevron icon (built-in, no external dependency)\nconst DefaultChevronIcon = ({ 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=\"M19 9l-7 7-7-7\" />\n </svg>\n)\n\n// Context to pass style props from Accordion root to children\ntype AccordionStyleContextValue = {\n variant?: 'default' | 'bordered' | 'splitted'\n size?: 'sm' | 'default' | 'lg'\n iconPosition?: 'left' | 'right'\n}\nconst AccordionStyleContext = React.createContext<AccordionStyleContextValue>({})\nconst useAccordionStyleContext = () => React.useContext(AccordionStyleContext)\n\n// ─── Accordion (Root) ────────────────────────────────────────\n\nconst accordionVariants = cva('w-full', {\n variants: {\n variant: {\n default: 'divide-y divide-border',\n bordered: 'divide-y divide-border border border-border rounded-xl',\n splitted: 'flex flex-col gap-3',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n})\n\nexport interface AccordionProps extends React.HTMLAttributes<HTMLDivElement> {\n type?: 'single' | 'multiple'\n variant?: 'default' | 'bordered' | 'splitted'\n size?: 'sm' | 'default' | 'lg'\n iconPosition?: 'left' | 'right'\n collapsible?: boolean\n defaultValue?: string | string[]\n value?: string | string[]\n onValueChange?: ((value: string) => void) | ((value: string[]) => void)\n disabled?: boolean\n}\n\nconst Accordion = React.forwardRef<HTMLDivElement, AccordionProps>(\n ({ className, variant = 'default', size = 'default', iconPosition = 'right', type = 'single', collapsible = true, defaultValue, value, onValueChange, disabled, ...props }, ref) => {\n const sharedClassName = cn(accordionVariants({ variant }), className)\n\n const radixProps = type === 'multiple'\n ? {\n type: 'multiple' as const,\n defaultValue: defaultValue as string[] | undefined,\n value: value as string[] | undefined,\n onValueChange: onValueChange as ((value: string[]) => void) | undefined,\n disabled,\n }\n : {\n type: 'single' as const,\n collapsible,\n defaultValue: defaultValue as string | undefined,\n value: value as string | undefined,\n onValueChange: onValueChange as ((value: string) => void) | undefined,\n disabled,\n }\n\n return (\n <AccordionStyleContext.Provider value={{ variant, size, iconPosition }}>\n {/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}\n <AccordionPrimitive.Root\n ref={ref}\n className={sharedClassName}\n {...radixProps}\n {...(props as any)}\n />\n </AccordionStyleContext.Provider>\n )\n }\n)\nAccordion.displayName = 'Accordion'\n\n// ─── AccordionItem ───────────────────────────────────────────\n\nconst accordionItemVariants = cva('', {\n variants: {\n variant: {\n default: '',\n bordered: '',\n splitted: 'border border-border rounded-xl',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n})\n\nexport interface AccordionItemProps\n extends React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Item>,\n Omit<VariantProps<typeof accordionItemVariants>, 'variant'> {}\n\nconst AccordionItem = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Item>,\n AccordionItemProps\n>(({ className, ...props }, ref) => {\n const { variant } = useAccordionStyleContext()\n return (\n <AccordionPrimitive.Item\n ref={ref}\n className={cn(accordionItemVariants({ variant }), className)}\n {...props}\n />\n )\n})\nAccordionItem.displayName = 'AccordionItem'\n\n// ─── AccordionTrigger ────────────────────────────────────────\n\nconst accordionTriggerVariants = cva(\n [\n 'flex flex-1 items-center gap-3 font-semibold text-foreground',\n 'transition-all duration-micro ease-out cursor-pointer',\n 'hover:bg-background-muted/50',\n 'focus-visible:focus-ring focus-visible:rounded-md',\n 'disabled:pointer-events-none disabled:text-text-subtle disabled:opacity-50',\n '[&[data-state=open]>svg.accordion-chevron]:rotate-180',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'py-3 px-4 text-sm', // 13px\n default: 'py-4 px-4 text-md', // 14px\n lg: 'py-5 px-6 text-base', // 16px\n },\n iconPosition: {\n left: 'flex-row',\n right: 'flex-row-reverse justify-between',\n },\n },\n defaultVariants: {\n size: 'default',\n iconPosition: 'right',\n },\n }\n)\n\n// Icon size per trigger size\nconst triggerIconSizeClasses = {\n sm: 'icon-xs', // 14px\n default: 'icon-sm', // 16px\n lg: 'icon-sm', // 16px\n} as const\n\nexport interface AccordionTriggerProps\n extends React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Trigger> {\n /** Custom indicator icon (replaces default chevron) */\n icon?: React.ReactNode\n}\n\nconst AccordionTrigger = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Trigger>,\n AccordionTriggerProps\n>(({ className, children, icon, ...props }, ref) => {\n const { size, iconPosition } = useAccordionStyleContext()\n const resolvedSize = size || 'default'\n\n return (\n <AccordionPrimitive.Header className=\"flex\">\n <AccordionPrimitive.Trigger\n ref={ref}\n className={cn(\n 'group',\n accordionTriggerVariants({ size: resolvedSize, iconPosition }),\n className\n )}\n {...props}\n >\n {icon || (\n <DefaultChevronIcon className={cn(\n 'accordion-chevron shrink-0 text-text-muted transition-transform duration-normal',\n triggerIconSizeClasses[resolvedSize]\n )} />\n )}\n <span className=\"text-left\">{children}</span>\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n )\n})\nAccordionTrigger.displayName = 'AccordionTrigger'\n\n// ─── AccordionContent ────────────────────────────────────────\n\nconst accordionContentSizeClasses = {\n sm: 'px-4 pb-3 text-sm',\n default: 'px-4 pb-4 text-md',\n lg: 'px-6 pb-5 text-base',\n} as const\n\nexport interface AccordionContentProps\n extends React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Content> {}\n\nconst AccordionContent = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Content>,\n AccordionContentProps\n>(({ className, children, ...props }, ref) => {\n const { size } = useAccordionStyleContext()\n const resolvedSize = size || 'default'\n\n return (\n <AccordionPrimitive.Content\n ref={ref}\n className=\"overflow-hidden data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down\"\n {...props}\n >\n <div className={cn(\n 'text-text-muted',\n accordionContentSizeClasses[resolvedSize],\n className\n )}>\n {children}\n </div>\n </AccordionPrimitive.Content>\n )\n})\nAccordionContent.displayName = 'AccordionContent'\n\n// ─── Exports ─────────────────────────────────────────────────\n\nexport {\n Accordion,\n AccordionItem,\n AccordionTrigger,\n AccordionContent,\n accordionVariants,\n accordionTriggerVariants,\n}\n"],"mappings":"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","names":[]}
@@ -35,14 +35,30 @@ __export(alert_exports, {
35
35
  alertVariants: () => alertVariants
36
36
  });
37
37
  module.exports = __toCommonJS(alert_exports);
38
+ var import_jsx_runtime = require("react/jsx-runtime");
38
39
  var React = __toESM(require("react"));
39
40
  var import_class_variance_authority = require("class-variance-authority");
40
41
  var import_utils = require("../../lib/utils");
41
- const InfoIcon = ({ className }) => /* @__PURE__ */ React.createElement("svg", { className, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true" }, /* @__PURE__ */ React.createElement("circle", { cx: "12", cy: "12", r: "10" }), /* @__PURE__ */ React.createElement("path", { d: "M12 16v-4" }), /* @__PURE__ */ React.createElement("path", { d: "M12 8h.01" }));
42
- const SuccessIcon = ({ className }) => /* @__PURE__ */ React.createElement("svg", { className, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true" }, /* @__PURE__ */ React.createElement("circle", { cx: "12", cy: "12", r: "10" }), /* @__PURE__ */ React.createElement("path", { d: "m9 12 2 2 4-4" }));
43
- const WarningIcon = ({ className }) => /* @__PURE__ */ React.createElement("svg", { className, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true" }, /* @__PURE__ */ React.createElement("path", { d: "m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3" }), /* @__PURE__ */ React.createElement("path", { d: "M12 9v4" }), /* @__PURE__ */ React.createElement("path", { d: "M12 17h.01" }));
44
- const ErrorIcon = ({ className }) => /* @__PURE__ */ React.createElement("svg", { className, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true" }, /* @__PURE__ */ React.createElement("circle", { cx: "12", cy: "12", r: "10" }), /* @__PURE__ */ React.createElement("path", { d: "M12 8v5" }), /* @__PURE__ */ React.createElement("path", { d: "M12 16h.01" }));
45
- const DefaultCloseIcon = ({ className }) => /* @__PURE__ */ React.createElement("svg", { className, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, "aria-hidden": "true" }, /* @__PURE__ */ React.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M6 18L18 6M6 6l12 12" }));
42
+ const InfoIcon = ({ className }) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("svg", { className, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: [
43
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: "12", cy: "12", r: "10" }),
44
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M12 16v-4" }),
45
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M12 8h.01" })
46
+ ] });
47
+ const SuccessIcon = ({ className }) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("svg", { className, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: [
48
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: "12", cy: "12", r: "10" }),
49
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "m9 12 2 2 4-4" })
50
+ ] });
51
+ const WarningIcon = ({ className }) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("svg", { className, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: [
52
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3" }),
53
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M12 9v4" }),
54
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M12 17h.01" })
55
+ ] });
56
+ const ErrorIcon = ({ className }) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("svg", { className, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: [
57
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: "12", cy: "12", r: "10" }),
58
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M12 8v5" }),
59
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M12 16h.01" })
60
+ ] });
61
+ const DefaultCloseIcon = ({ className }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { className, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, "aria-hidden": "true", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M6 18L18 6M6 6l12 12" }) });
46
62
  const STATUS_ICONS = {
47
63
  info: InfoIcon,
48
64
  success: SuccessIcon,
@@ -142,7 +158,7 @@ const Alert = React.forwardRef(
142
158
  const role = color === "error" ? "alert" : "status";
143
159
  const colorClasses = colorMap[color][variant];
144
160
  const StatusIcon = STATUS_ICONS[color];
145
- return /* @__PURE__ */ React.createElement(AlertContext.Provider, { value: { variant, color, size } }, /* @__PURE__ */ React.createElement(
161
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AlertContext.Provider, { value: { variant, color, size }, children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
146
162
  "div",
147
163
  {
148
164
  ref,
@@ -152,32 +168,34 @@ const Alert = React.forwardRef(
152
168
  colorClasses,
153
169
  className
154
170
  ),
155
- ...props
156
- },
157
- !hideIcon && /* @__PURE__ */ React.createElement("span", { className: "shrink-0" }, icon || /* @__PURE__ */ React.createElement(StatusIcon, { className: ICON_SIZE_MAP[size] })),
158
- /* @__PURE__ */ React.createElement("div", { className: "flex-1 min-w-0" }, children),
159
- closable && /* @__PURE__ */ React.createElement(
160
- "button",
161
- {
162
- type: "button",
163
- className: (0, import_utils.cn)(
164
- "shrink-0 rounded-md p-1 opacity-70 hover:opacity-100 transition-opacity focus-visible:focus-ring",
165
- "group-has-[[data-alert-description]]:absolute",
166
- size === "sm" ? "group-has-[[data-alert-description]]:top-2 group-has-[[data-alert-description]]:right-2" : "group-has-[[data-alert-description]]:top-3 group-has-[[data-alert-description]]:right-3"
167
- ),
168
- onClick: onClose,
169
- "aria-label": "Close"
170
- },
171
- closeIcon || /* @__PURE__ */ React.createElement(DefaultCloseIcon, { className: "icon-sm" })
172
- )
173
- ));
171
+ ...props,
172
+ children: [
173
+ !hideIcon && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "shrink-0", children: icon || /* @__PURE__ */ (0, import_jsx_runtime.jsx)(StatusIcon, { className: ICON_SIZE_MAP[size] }) }),
174
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "flex-1 min-w-0", children }),
175
+ closable && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
176
+ "button",
177
+ {
178
+ type: "button",
179
+ className: (0, import_utils.cn)(
180
+ "shrink-0 rounded-md p-1 opacity-70 hover:opacity-100 transition-opacity focus-visible:focus-ring",
181
+ "group-has-[[data-alert-description]]:absolute",
182
+ size === "sm" ? "group-has-[[data-alert-description]]:top-2 group-has-[[data-alert-description]]:right-2" : "group-has-[[data-alert-description]]:top-3 group-has-[[data-alert-description]]:right-3"
183
+ ),
184
+ onClick: onClose,
185
+ "aria-label": "Close",
186
+ children: closeIcon || /* @__PURE__ */ (0, import_jsx_runtime.jsx)(DefaultCloseIcon, { className: "icon-sm" })
187
+ }
188
+ )
189
+ ]
190
+ }
191
+ ) });
174
192
  }
175
193
  );
176
194
  Alert.displayName = "Alert";
177
195
  const AlertTitle = React.forwardRef(
178
196
  ({ className, ...props }, ref) => {
179
197
  const { size } = useAlertContext();
180
- return /* @__PURE__ */ React.createElement(
198
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
181
199
  "h5",
182
200
  {
183
201
  ref,
@@ -191,7 +209,7 @@ AlertTitle.displayName = "AlertTitle";
191
209
  const AlertDescription = React.forwardRef(
192
210
  ({ className, ...props }, ref) => {
193
211
  const { variant, size } = useAlertContext();
194
- return /* @__PURE__ */ React.createElement(
212
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
195
213
  "p",
196
214
  {
197
215
  ref,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/ui/alert.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../../lib/utils'\n\n// ─── Built-in status icons (no external dependency) ──────────────\n// All icons: Lucide-compatible 24×24 viewBox, strokeWidth=2, rounded caps/joins\n// Info = circle + \"i\" | Success = circle + check | Warning = triangle + \"!\" | Error = circle + small ×\nconst InfoIcon = ({ className }: { className?: string }) => (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 16v-4\" />\n <path d=\"M12 8h.01\" />\n </svg>\n)\n\nconst SuccessIcon = ({ className }: { className?: string }) => (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"m9 12 2 2 4-4\" />\n </svg>\n)\n\nconst WarningIcon = ({ className }: { className?: string }) => (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\" />\n <path d=\"M12 9v4\" />\n <path d=\"M12 17h.01\" />\n </svg>\n)\n\nconst ErrorIcon = ({ className }: { className?: string }) => (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 8v5\" />\n <path d=\"M12 16h.01\" />\n </svg>\n)\n\nconst DefaultCloseIcon = ({ className }: { className?: string }) => (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2} aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n)\n\n// ─── Status icon mapping ─────────────────────────────────────────\nconst STATUS_ICONS: Record<AlertColor, React.FC<{ className?: string }>> = {\n info: InfoIcon,\n success: SuccessIcon,\n warning: WarningIcon,\n error: ErrorIcon,\n}\n\n// ─── Color × Variant class mapping ──────────────────────────────\n// Uses semantic tokens (*.tint, text-text-*) — same pattern as Badge\nconst colorMap = {\n info: {\n default: 'bg-info-tint text-text-info border-info/20',\n outline: 'bg-transparent text-text-info border-info',\n filled: 'bg-info text-info-foreground border-transparent',\n },\n success: {\n default: 'bg-success-tint text-text-success border-success/20',\n outline: 'bg-transparent text-text-success border-success',\n filled: 'bg-success text-success-foreground border-transparent',\n },\n warning: {\n default: 'bg-warning-tint text-text-warning border-warning/20',\n outline: 'bg-transparent text-text-warning border-warning',\n filled: 'bg-warning text-warning-foreground border-transparent',\n },\n error: {\n default: 'bg-error-tint text-text-error border-error/20',\n outline: 'bg-transparent text-text-error border-error',\n filled: 'bg-error text-error-foreground border-transparent',\n },\n} as const\n\n// ─── Alert variants ──────────────────────────────────────────────\nconst alertVariants = cva(\n 'group relative flex items-center border w-full [&:has([data-alert-description])]:items-start',\n {\n variants: {\n size: {\n sm: 'gap-2 p-3 text-sm',\n default: 'gap-2.5 p-4 text-md',\n lg: 'gap-3 p-5 text-md',\n },\n radius: {\n none: 'rounded-none',\n sm: 'rounded-sm',\n base: 'rounded',\n md: 'rounded-md',\n lg: 'rounded-lg',\n xl: 'rounded-xl',\n '2xl': 'rounded-2xl',\n '3xl': 'rounded-3xl',\n full: 'rounded-full',\n },\n },\n defaultVariants: {\n size: 'default',\n radius: 'lg',\n },\n }\n)\n\n// ─── Size-dependent class maps ──────────────────────────────────\nconst ICON_SIZE_MAP = {\n sm: 'icon-sm', // 16px\n default: 'w-[18px] h-[18px]', // 18px — TOKEN-EXCEPTION: no 18px icon token\n lg: 'icon-md', // 20px\n} as const\n\nconst TITLE_SIZE_MAP = {\n sm: 'text-sm font-semibold leading-4 tracking-tight',\n default: 'font-semibold leading-[18px] tracking-tight',\n lg: 'text-base font-semibold leading-5 tracking-tight',\n} as const\n\nconst DESC_SIZE_MAP = {\n sm: 'text-xs mt-0.5',\n default: 'text-sm mt-1',\n lg: 'text-md mt-1.5',\n} as const\n\n// ─── Types ───────────────────────────────────────────────────────\nexport type AlertVariant = 'default' | 'outline' | 'filled'\nexport type AlertColor = 'info' | 'success' | 'warning' | 'error'\nexport type AlertSize = 'sm' | 'default' | 'lg'\n\n// ─── Context ─────────────────────────────────────────────────────\ninterface AlertContextValue {\n variant: AlertVariant\n color: AlertColor\n size: AlertSize\n}\n\nconst AlertContext = React.createContext<AlertContextValue>({\n variant: 'default',\n color: 'info',\n size: 'default',\n})\n\nfunction useAlertContext() {\n return React.useContext(AlertContext)\n}\n\n// ═══════════════════════════════════════════════════════════════════\n// Alert\n// ═══════════════════════════════════════════════════════════════════\n\n// ─── Alert ───────────────────────────────────────────────────────\nexport interface AlertProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof alertVariants> {\n /** Visual style */\n variant?: AlertVariant\n /** Semantic color (determines icon, colors, and ARIA role) */\n color?: AlertColor\n /** Size */\n size?: AlertSize\n /** Closable — shows close button */\n closable?: boolean\n /** Close callback */\n onClose?: () => void\n /** Custom close icon */\n closeIcon?: React.ReactNode\n /** Custom status icon (overrides default) */\n icon?: React.ReactNode\n /** Hide the status icon entirely */\n hideIcon?: boolean\n}\n\nconst Alert = React.forwardRef<HTMLDivElement, AlertProps>(\n ({\n className,\n variant = 'default',\n color = 'info',\n size = 'default',\n radius,\n closable = false,\n onClose,\n closeIcon,\n icon,\n hideIcon = false,\n children,\n ...props\n }, ref) => {\n // error → role=\"alert\" (assertive), others → role=\"status\" (polite)\n const role = color === 'error' ? 'alert' : 'status'\n const colorClasses = colorMap[color][variant]\n const StatusIcon = STATUS_ICONS[color]\n\n return (\n <AlertContext.Provider value={{ variant, color, size }}>\n <div\n ref={ref}\n role={role}\n className={cn(\n alertVariants({ size, radius }),\n colorClasses,\n className,\n )}\n {...props}\n >\n {/* Icon */}\n {!hideIcon && (\n <span className=\"shrink-0\">\n {icon || <StatusIcon className={ICON_SIZE_MAP[size]} />}\n </span>\n )}\n\n {/* Content area */}\n <div className=\"flex-1 min-w-0\">\n {children}\n </div>\n\n {/* Close button */}\n {closable && (\n <button\n type=\"button\"\n className={cn(\n 'shrink-0 rounded-md p-1 opacity-70 hover:opacity-100 transition-opacity focus-visible:focus-ring',\n 'group-has-[[data-alert-description]]:absolute',\n size === 'sm'\n ? 'group-has-[[data-alert-description]]:top-2 group-has-[[data-alert-description]]:right-2'\n : 'group-has-[[data-alert-description]]:top-3 group-has-[[data-alert-description]]:right-3',\n )}\n onClick={onClose}\n aria-label=\"Close\"\n >\n {closeIcon || <DefaultCloseIcon className=\"icon-sm\" />}\n </button>\n )}\n </div>\n </AlertContext.Provider>\n )\n }\n)\nAlert.displayName = 'Alert'\n\n// ─── AlertTitle ──────────────────────────────────────────────────\nexport interface AlertTitleProps extends React.HTMLAttributes<HTMLHeadingElement> {}\n\nconst AlertTitle = React.forwardRef<HTMLHeadingElement, AlertTitleProps>(\n ({ className, ...props }, ref) => {\n const { size } = useAlertContext()\n return (\n <h5\n ref={ref}\n className={cn(TITLE_SIZE_MAP[size], className)}\n {...props}\n />\n )\n }\n)\nAlertTitle.displayName = 'AlertTitle'\n\n// ─── AlertDescription ────────────────────────────────────────────\nexport interface AlertDescriptionProps extends React.HTMLAttributes<HTMLParagraphElement> {}\n\nconst AlertDescription = React.forwardRef<HTMLParagraphElement, AlertDescriptionProps>(\n ({ className, ...props }, ref) => {\n const { variant, size } = useAlertContext()\n return (\n <p\n ref={ref}\n data-alert-description=\"\"\n className={cn(\n DESC_SIZE_MAP[size],\n variant === 'filled' ? 'opacity-90' : 'opacity-80',\n className,\n )}\n {...props}\n />\n )\n }\n)\nAlertDescription.displayName = 'AlertDescription'\n\n// ─── Exports ─────────────────────────────────────────────────────\nexport {\n Alert,\n AlertTitle,\n AlertDescription,\n alertVariants,\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,YAAuB;AACvB,sCAAuC;AACvC,mBAAmB;AAKnB,MAAM,WAAW,CAAC,EAAE,UAAU,MAC5B,oCAAC,SAAI,WAAsB,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAa,GAAG,eAAc,SAAQ,gBAAe,SAAQ,eAAY,UACxJ,oCAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,MAAK,GAC/B,oCAAC,UAAK,GAAE,aAAY,GACpB,oCAAC,UAAK,GAAE,aAAY,CACtB;AAGF,MAAM,cAAc,CAAC,EAAE,UAAU,MAC/B,oCAAC,SAAI,WAAsB,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAa,GAAG,eAAc,SAAQ,gBAAe,SAAQ,eAAY,UACxJ,oCAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,MAAK,GAC/B,oCAAC,UAAK,GAAE,iBAAgB,CAC1B;AAGF,MAAM,cAAc,CAAC,EAAE,UAAU,MAC/B,oCAAC,SAAI,WAAsB,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAa,GAAG,eAAc,SAAQ,gBAAe,SAAQ,eAAY,UACxJ,oCAAC,UAAK,GAAE,4EAA2E,GACnF,oCAAC,UAAK,GAAE,WAAU,GAClB,oCAAC,UAAK,GAAE,cAAa,CACvB;AAGF,MAAM,YAAY,CAAC,EAAE,UAAU,MAC7B,oCAAC,SAAI,WAAsB,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAa,GAAG,eAAc,SAAQ,gBAAe,SAAQ,eAAY,UACxJ,oCAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,MAAK,GAC/B,oCAAC,UAAK,GAAE,WAAU,GAClB,oCAAC,UAAK,GAAE,cAAa,CACvB;AAGF,MAAM,mBAAmB,CAAC,EAAE,UAAU,MACpC,oCAAC,SAAI,WAAsB,MAAK,QAAO,SAAQ,aAAY,QAAO,gBAAe,aAAa,GAAG,eAAY,UAC3G,oCAAC,UAAK,eAAc,SAAQ,gBAAe,SAAQ,GAAE,wBAAuB,CAC9E;AAIF,MAAM,eAAqE;AAAA,EACzE,MAAM;AAAA,EACN,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AACT;AAIA,MAAM,WAAW;AAAA,EACf,MAAM;AAAA,IACJ,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAQ;AAAA,EACV;AAAA,EACA,SAAS;AAAA,IACP,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAQ;AAAA,EACV;AAAA,EACA,SAAS;AAAA,IACP,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAQ;AAAA,EACV;AAAA,EACA,OAAO;AAAA,IACL,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAQ;AAAA,EACV;AACF;AAGA,MAAM,oBAAgB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,MAAM;AAAA,QACJ,IAAI;AAAA,QACJ,SAAS;AAAA,QACT,IAAI;AAAA,MACN;AAAA,MACA,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,OAAO;AAAA,QACP,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,MAAM;AAAA,MACN,QAAQ;AAAA,IACV;AAAA,EACF;AACF;AAGA,MAAM,gBAAgB;AAAA,EACpB,IAAI;AAAA;AAAA,EACJ,SAAS;AAAA;AAAA,EACT,IAAI;AAAA;AACN;AAEA,MAAM,iBAAiB;AAAA,EACrB,IAAI;AAAA,EACJ,SAAS;AAAA,EACT,IAAI;AACN;AAEA,MAAM,gBAAgB;AAAA,EACpB,IAAI;AAAA,EACJ,SAAS;AAAA,EACT,IAAI;AACN;AAcA,MAAM,eAAe,MAAM,cAAiC;AAAA,EAC1D,SAAS;AAAA,EACT,OAAO;AAAA,EACP,MAAM;AACR,CAAC;AAED,SAAS,kBAAkB;AACzB,SAAO,MAAM,WAAW,YAAY;AACtC;AA4BA,MAAM,QAAQ,MAAM;AAAA,EAClB,CAAC;AAAA,IACC;AAAA,IACA,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,OAAO;AAAA,IACP;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA,GAAG;AAAA,EACL,GAAG,QAAQ;AAET,UAAM,OAAO,UAAU,UAAU,UAAU;AAC3C,UAAM,eAAe,SAAS,KAAK,EAAE,OAAO;AAC5C,UAAM,aAAa,aAAa,KAAK;AAErC,WACE,oCAAC,aAAa,UAAb,EAAsB,OAAO,EAAE,SAAS,OAAO,KAAK,KACnD;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,eAAW;AAAA,UACT,cAAc,EAAE,MAAM,OAAO,CAAC;AAAA,UAC9B;AAAA,UACA;AAAA,QACF;AAAA,QACC,GAAG;AAAA;AAAA,MAGH,CAAC,YACA,oCAAC,UAAK,WAAU,cACb,QAAQ,oCAAC,cAAW,WAAW,cAAc,IAAI,GAAG,CACvD;AAAA,MAIF,oCAAC,SAAI,WAAU,oBACZ,QACH;AAAA,MAGC,YACC;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,eAAW;AAAA,YACT;AAAA,YACA;AAAA,YACA,SAAS,OACL,4FACA;AAAA,UACN;AAAA,UACA,SAAS;AAAA,UACT,cAAW;AAAA;AAAA,QAEV,aAAa,oCAAC,oBAAiB,WAAU,WAAU;AAAA,MACtD;AAAA,IAEJ,CACF;AAAA,EAEJ;AACF;AACA,MAAM,cAAc;AAKpB,MAAM,aAAa,MAAM;AAAA,EACvB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAAQ;AAChC,UAAM,EAAE,KAAK,IAAI,gBAAgB;AACjC,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,eAAW,iBAAG,eAAe,IAAI,GAAG,SAAS;AAAA,QAC5C,GAAG;AAAA;AAAA,IACN;AAAA,EAEJ;AACF;AACA,WAAW,cAAc;AAKzB,MAAM,mBAAmB,MAAM;AAAA,EAC7B,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAAQ;AAChC,UAAM,EAAE,SAAS,KAAK,IAAI,gBAAgB;AAC1C,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,0BAAuB;AAAA,QACvB,eAAW;AAAA,UACT,cAAc,IAAI;AAAA,UAClB,YAAY,WAAW,eAAe;AAAA,UACtC;AAAA,QACF;AAAA,QACC,GAAG;AAAA;AAAA,IACN;AAAA,EAEJ;AACF;AACA,iBAAiB,cAAc;","names":[]}
1
+ {"version":3,"sources":["../../../src/components/ui/alert.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../../lib/utils'\n\n// ─── Built-in status icons (no external dependency) ──────────────\n// All icons: Lucide-compatible 24×24 viewBox, strokeWidth=2, rounded caps/joins\n// Info = circle + \"i\" | Success = circle + check | Warning = triangle + \"!\" | Error = circle + small ×\nconst InfoIcon = ({ className }: { className?: string }) => (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 16v-4\" />\n <path d=\"M12 8h.01\" />\n </svg>\n)\n\nconst SuccessIcon = ({ className }: { className?: string }) => (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"m9 12 2 2 4-4\" />\n </svg>\n)\n\nconst WarningIcon = ({ className }: { className?: string }) => (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\" />\n <path d=\"M12 9v4\" />\n <path d=\"M12 17h.01\" />\n </svg>\n)\n\nconst ErrorIcon = ({ className }: { className?: string }) => (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 8v5\" />\n <path d=\"M12 16h.01\" />\n </svg>\n)\n\nconst DefaultCloseIcon = ({ className }: { className?: string }) => (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2} aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n)\n\n// ─── Status icon mapping ─────────────────────────────────────────\nconst STATUS_ICONS: Record<AlertColor, React.FC<{ className?: string }>> = {\n info: InfoIcon,\n success: SuccessIcon,\n warning: WarningIcon,\n error: ErrorIcon,\n}\n\n// ─── Color × Variant class mapping ──────────────────────────────\n// Uses semantic tokens (*.tint, text-text-*) — same pattern as Badge\nconst colorMap = {\n info: {\n default: 'bg-info-tint text-text-info border-info/20',\n outline: 'bg-transparent text-text-info border-info',\n filled: 'bg-info text-info-foreground border-transparent',\n },\n success: {\n default: 'bg-success-tint text-text-success border-success/20',\n outline: 'bg-transparent text-text-success border-success',\n filled: 'bg-success text-success-foreground border-transparent',\n },\n warning: {\n default: 'bg-warning-tint text-text-warning border-warning/20',\n outline: 'bg-transparent text-text-warning border-warning',\n filled: 'bg-warning text-warning-foreground border-transparent',\n },\n error: {\n default: 'bg-error-tint text-text-error border-error/20',\n outline: 'bg-transparent text-text-error border-error',\n filled: 'bg-error text-error-foreground border-transparent',\n },\n} as const\n\n// ─── Alert variants ──────────────────────────────────────────────\nconst alertVariants = cva(\n 'group relative flex items-center border w-full [&:has([data-alert-description])]:items-start',\n {\n variants: {\n size: {\n sm: 'gap-2 p-3 text-sm',\n default: 'gap-2.5 p-4 text-md',\n lg: 'gap-3 p-5 text-md',\n },\n radius: {\n none: 'rounded-none',\n sm: 'rounded-sm',\n base: 'rounded',\n md: 'rounded-md',\n lg: 'rounded-lg',\n xl: 'rounded-xl',\n '2xl': 'rounded-2xl',\n '3xl': 'rounded-3xl',\n full: 'rounded-full',\n },\n },\n defaultVariants: {\n size: 'default',\n radius: 'lg',\n },\n }\n)\n\n// ─── Size-dependent class maps ──────────────────────────────────\nconst ICON_SIZE_MAP = {\n sm: 'icon-sm', // 16px\n default: 'w-[18px] h-[18px]', // 18px — TOKEN-EXCEPTION: no 18px icon token\n lg: 'icon-md', // 20px\n} as const\n\nconst TITLE_SIZE_MAP = {\n sm: 'text-sm font-semibold leading-4 tracking-tight',\n default: 'font-semibold leading-[18px] tracking-tight',\n lg: 'text-base font-semibold leading-5 tracking-tight',\n} as const\n\nconst DESC_SIZE_MAP = {\n sm: 'text-xs mt-0.5',\n default: 'text-sm mt-1',\n lg: 'text-md mt-1.5',\n} as const\n\n// ─── Types ───────────────────────────────────────────────────────\nexport type AlertVariant = 'default' | 'outline' | 'filled'\nexport type AlertColor = 'info' | 'success' | 'warning' | 'error'\nexport type AlertSize = 'sm' | 'default' | 'lg'\n\n// ─── Context ─────────────────────────────────────────────────────\ninterface AlertContextValue {\n variant: AlertVariant\n color: AlertColor\n size: AlertSize\n}\n\nconst AlertContext = React.createContext<AlertContextValue>({\n variant: 'default',\n color: 'info',\n size: 'default',\n})\n\nfunction useAlertContext() {\n return React.useContext(AlertContext)\n}\n\n// ═══════════════════════════════════════════════════════════════════\n// Alert\n// ═══════════════════════════════════════════════════════════════════\n\n// ─── Alert ───────────────────────────────────────────────────────\nexport interface AlertProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof alertVariants> {\n /** Visual style */\n variant?: AlertVariant\n /** Semantic color (determines icon, colors, and ARIA role) */\n color?: AlertColor\n /** Size */\n size?: AlertSize\n /** Closable — shows close button */\n closable?: boolean\n /** Close callback */\n onClose?: () => void\n /** Custom close icon */\n closeIcon?: React.ReactNode\n /** Custom status icon (overrides default) */\n icon?: React.ReactNode\n /** Hide the status icon entirely */\n hideIcon?: boolean\n}\n\nconst Alert = React.forwardRef<HTMLDivElement, AlertProps>(\n ({\n className,\n variant = 'default',\n color = 'info',\n size = 'default',\n radius,\n closable = false,\n onClose,\n closeIcon,\n icon,\n hideIcon = false,\n children,\n ...props\n }, ref) => {\n // error → role=\"alert\" (assertive), others → role=\"status\" (polite)\n const role = color === 'error' ? 'alert' : 'status'\n const colorClasses = colorMap[color][variant]\n const StatusIcon = STATUS_ICONS[color]\n\n return (\n <AlertContext.Provider value={{ variant, color, size }}>\n <div\n ref={ref}\n role={role}\n className={cn(\n alertVariants({ size, radius }),\n colorClasses,\n className,\n )}\n {...props}\n >\n {/* Icon */}\n {!hideIcon && (\n <span className=\"shrink-0\">\n {icon || <StatusIcon className={ICON_SIZE_MAP[size]} />}\n </span>\n )}\n\n {/* Content area */}\n <div className=\"flex-1 min-w-0\">\n {children}\n </div>\n\n {/* Close button */}\n {closable && (\n <button\n type=\"button\"\n className={cn(\n 'shrink-0 rounded-md p-1 opacity-70 hover:opacity-100 transition-opacity focus-visible:focus-ring',\n 'group-has-[[data-alert-description]]:absolute',\n size === 'sm'\n ? 'group-has-[[data-alert-description]]:top-2 group-has-[[data-alert-description]]:right-2'\n : 'group-has-[[data-alert-description]]:top-3 group-has-[[data-alert-description]]:right-3',\n )}\n onClick={onClose}\n aria-label=\"Close\"\n >\n {closeIcon || <DefaultCloseIcon className=\"icon-sm\" />}\n </button>\n )}\n </div>\n </AlertContext.Provider>\n )\n }\n)\nAlert.displayName = 'Alert'\n\n// ─── AlertTitle ──────────────────────────────────────────────────\nexport interface AlertTitleProps extends React.HTMLAttributes<HTMLHeadingElement> {}\n\nconst AlertTitle = React.forwardRef<HTMLHeadingElement, AlertTitleProps>(\n ({ className, ...props }, ref) => {\n const { size } = useAlertContext()\n return (\n <h5\n ref={ref}\n className={cn(TITLE_SIZE_MAP[size], className)}\n {...props}\n />\n )\n }\n)\nAlertTitle.displayName = 'AlertTitle'\n\n// ─── AlertDescription ────────────────────────────────────────────\nexport interface AlertDescriptionProps extends React.HTMLAttributes<HTMLParagraphElement> {}\n\nconst AlertDescription = React.forwardRef<HTMLParagraphElement, AlertDescriptionProps>(\n ({ className, ...props }, ref) => {\n const { variant, size } = useAlertContext()\n return (\n <p\n ref={ref}\n data-alert-description=\"\"\n className={cn(\n DESC_SIZE_MAP[size],\n variant === 'filled' ? 'opacity-90' : 'opacity-80',\n className,\n )}\n {...props}\n />\n )\n }\n)\nAlertDescription.displayName = 'AlertDescription'\n\n// ─── Exports ─────────────────────────────────────────────────────\nexport {\n Alert,\n AlertTitle,\n AlertDescription,\n alertVariants,\n}\n"],"mappings":"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","names":[]}