@karakuri-ui/react 0.3.3 → 0.3.5
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.
- package/README.md +27 -4
- package/dist/components/ui/accordion.js +27 -24
- package/dist/components/ui/accordion.js.map +1 -1
- package/dist/components/ui/accordion.mjs +28 -25
- package/dist/components/ui/accordion.mjs.map +1 -1
- package/dist/components/ui/alert.js +45 -27
- package/dist/components/ui/alert.js.map +1 -1
- package/dist/components/ui/alert.mjs +46 -28
- package/dist/components/ui/alert.mjs.map +1 -1
- package/dist/components/ui/avatar.js +41 -32
- package/dist/components/ui/avatar.js.map +1 -1
- package/dist/components/ui/avatar.mjs +42 -33
- package/dist/components/ui/avatar.mjs.map +1 -1
- package/dist/components/ui/badge.js +46 -43
- package/dist/components/ui/badge.js.map +1 -1
- package/dist/components/ui/badge.mjs +47 -44
- package/dist/components/ui/badge.mjs.map +1 -1
- package/dist/components/ui/breadcrumb.js +30 -25
- package/dist/components/ui/breadcrumb.js.map +1 -1
- package/dist/components/ui/breadcrumb.mjs +31 -26
- package/dist/components/ui/breadcrumb.mjs.map +1 -1
- package/dist/components/ui/button-group.js +6 -5
- package/dist/components/ui/button-group.js.map +1 -1
- package/dist/components/ui/button-group.mjs +7 -6
- package/dist/components/ui/button-group.mjs.map +1 -1
- package/dist/components/ui/button.js +24 -14
- package/dist/components/ui/button.js.map +1 -1
- package/dist/components/ui/button.mjs +26 -16
- package/dist/components/ui/button.mjs.map +1 -1
- package/dist/components/ui/card.js +53 -39
- package/dist/components/ui/card.js.map +1 -1
- package/dist/components/ui/card.mjs +54 -40
- package/dist/components/ui/card.mjs.map +1 -1
- package/dist/components/ui/chart.d.mts +1 -1
- package/dist/components/ui/chart.d.ts +1 -1
- package/dist/components/ui/chart.js +154 -130
- package/dist/components/ui/chart.js.map +1 -1
- package/dist/components/ui/chart.mjs +155 -131
- package/dist/components/ui/chart.mjs.map +1 -1
- package/dist/components/ui/checkbox.js +47 -40
- package/dist/components/ui/checkbox.js.map +1 -1
- package/dist/components/ui/checkbox.mjs +49 -42
- package/dist/components/ui/checkbox.mjs.map +1 -1
- package/dist/components/ui/divider.js +16 -13
- package/dist/components/ui/divider.js.map +1 -1
- package/dist/components/ui/divider.mjs +17 -14
- package/dist/components/ui/divider.mjs.map +1 -1
- package/dist/components/ui/drawer.js +44 -35
- package/dist/components/ui/drawer.js.map +1 -1
- package/dist/components/ui/drawer.mjs +45 -36
- package/dist/components/ui/drawer.mjs.map +1 -1
- package/dist/components/ui/dropdown.js +31 -24
- package/dist/components/ui/dropdown.js.map +1 -1
- package/dist/components/ui/dropdown.mjs +32 -25
- package/dist/components/ui/dropdown.mjs.map +1 -1
- package/dist/components/ui/field.js +18 -15
- package/dist/components/ui/field.js.map +1 -1
- package/dist/components/ui/field.mjs +19 -16
- package/dist/components/ui/field.mjs.map +1 -1
- package/dist/components/ui/icon-button.js +17 -14
- package/dist/components/ui/icon-button.js.map +1 -1
- package/dist/components/ui/icon-button.mjs +19 -16
- package/dist/components/ui/icon-button.mjs.map +1 -1
- package/dist/components/ui/index.mjs +35 -35
- package/dist/components/ui/input.js +34 -29
- package/dist/components/ui/input.js.map +1 -1
- package/dist/components/ui/input.mjs +36 -31
- package/dist/components/ui/input.mjs.map +1 -1
- package/dist/components/ui/metric-card.js +24 -21
- package/dist/components/ui/metric-card.js.map +1 -1
- package/dist/components/ui/metric-card.mjs +25 -22
- package/dist/components/ui/metric-card.mjs.map +1 -1
- package/dist/components/ui/modal.js +91 -74
- package/dist/components/ui/modal.js.map +1 -1
- package/dist/components/ui/modal.mjs +92 -75
- package/dist/components/ui/modal.mjs.map +1 -1
- package/dist/components/ui/navigation-menu.js +114 -93
- package/dist/components/ui/navigation-menu.js.map +1 -1
- package/dist/components/ui/navigation-menu.mjs +115 -94
- package/dist/components/ui/navigation-menu.mjs.map +1 -1
- package/dist/components/ui/pagination.js +66 -55
- package/dist/components/ui/pagination.js.map +1 -1
- package/dist/components/ui/pagination.mjs +67 -56
- package/dist/components/ui/pagination.mjs.map +1 -1
- package/dist/components/ui/popover.js +39 -36
- package/dist/components/ui/popover.js.map +1 -1
- package/dist/components/ui/popover.mjs +40 -37
- package/dist/components/ui/popover.mjs.map +1 -1
- package/dist/components/ui/progress.js +73 -64
- package/dist/components/ui/progress.js.map +1 -1
- package/dist/components/ui/progress.mjs +74 -65
- package/dist/components/ui/progress.mjs.map +1 -1
- package/dist/components/ui/radio-group.js +23 -19
- package/dist/components/ui/radio-group.js.map +1 -1
- package/dist/components/ui/radio-group.mjs +25 -21
- package/dist/components/ui/radio-group.mjs.map +1 -1
- package/dist/components/ui/segmented.js +7 -6
- package/dist/components/ui/segmented.js.map +1 -1
- package/dist/components/ui/segmented.mjs +8 -7
- package/dist/components/ui/segmented.mjs.map +1 -1
- package/dist/components/ui/select.js +55 -48
- package/dist/components/ui/select.js.map +1 -1
- package/dist/components/ui/select.mjs +56 -49
- package/dist/components/ui/select.mjs.map +1 -1
- package/dist/components/ui/skeleton.js +20 -19
- package/dist/components/ui/skeleton.js.map +1 -1
- package/dist/components/ui/skeleton.mjs +21 -20
- package/dist/components/ui/skeleton.mjs.map +1 -1
- package/dist/components/ui/slider.js +68 -58
- package/dist/components/ui/slider.js.map +1 -1
- package/dist/components/ui/slider.mjs +69 -59
- package/dist/components/ui/slider.mjs.map +1 -1
- package/dist/components/ui/spinner.js +185 -176
- package/dist/components/ui/spinner.js.map +1 -1
- package/dist/components/ui/spinner.mjs +186 -177
- package/dist/components/ui/spinner.mjs.map +1 -1
- package/dist/components/ui/switch.js +39 -28
- package/dist/components/ui/switch.js.map +1 -1
- package/dist/components/ui/switch.mjs +41 -30
- package/dist/components/ui/switch.mjs.map +1 -1
- package/dist/components/ui/table.js +26 -23
- package/dist/components/ui/table.js.map +1 -1
- package/dist/components/ui/table.mjs +27 -24
- package/dist/components/ui/table.mjs.map +1 -1
- package/dist/components/ui/tabs.js +25 -9
- package/dist/components/ui/tabs.js.map +1 -1
- package/dist/components/ui/tabs.mjs +26 -10
- package/dist/components/ui/tabs.mjs.map +1 -1
- package/dist/components/ui/textarea.js +2 -1
- package/dist/components/ui/textarea.js.map +1 -1
- package/dist/components/ui/textarea.mjs +4 -3
- package/dist/components/ui/textarea.mjs.map +1 -1
- package/dist/components/ui/toast.js +104 -80
- package/dist/components/ui/toast.js.map +1 -1
- package/dist/components/ui/toast.mjs +105 -81
- package/dist/components/ui/toast.mjs.map +1 -1
- package/dist/components/ui/toggle-group.js +9 -8
- package/dist/components/ui/toggle-group.js.map +1 -1
- package/dist/components/ui/toggle-group.mjs +10 -9
- package/dist/components/ui/toggle-group.mjs.map +1 -1
- package/dist/components/ui/toggle.js +3 -2
- package/dist/components/ui/toggle.js.map +1 -1
- package/dist/components/ui/toggle.mjs +4 -3
- package/dist/components/ui/toggle.mjs.map +1 -1
- package/dist/components/ui/tooltip.js +18 -15
- package/dist/components/ui/tooltip.js.map +1 -1
- package/dist/components/ui/tooltip.mjs +19 -16
- package/dist/components/ui/tooltip.mjs.map +1 -1
- 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
|
[](https://www.npmjs.com/package/@karakuri-ui/react)
|
|
6
6
|
[](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__ */
|
|
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
|
-
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
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__ */
|
|
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
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBI;AAfJ,YAAuB;AACvB,yBAAoC;AACpC,sCAAuC;AACvC,mBAAmB;AAGnB,MAAM,qBAAqB,CAAC,EAAE,UAAU,MACtC;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,MAAK;AAAA,IACL,SAAQ;AAAA,IACR,QAAO;AAAA,IACP,aAAa;AAAA,IACb,eAAY;AAAA,IAEZ,sDAAC,UAAK,eAAc,SAAQ,gBAAe,SAAQ,GAAE,kBAAiB;AAAA;AACxE;AASF,MAAM,wBAAwB,MAAM,cAA0C,CAAC,CAAC;AAChF,MAAM,2BAA2B,MAAM,MAAM,WAAW,qBAAqB;AAI7E,MAAM,wBAAoB,qCAAI,UAAU;AAAA,EACtC,UAAU;AAAA,IACR,SAAS;AAAA,MACP,SAAS;AAAA,MACT,UAAU;AAAA,MACV,UAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,iBAAiB;AAAA,IACf,SAAS;AAAA,EACX;AACF,CAAC;AAcD,MAAM,YAAY,MAAM;AAAA,EACtB,CAAC,EAAE,WAAW,UAAU,WAAW,OAAO,WAAW,eAAe,SAAS,OAAO,UAAU,cAAc,MAAM,cAAc,OAAO,eAAe,UAAU,GAAG,MAAM,GAAG,QAAQ;AAClL,UAAM,sBAAkB,iBAAG,kBAAkB,EAAE,QAAQ,CAAC,GAAG,SAAS;AAEpE,UAAM,aAAa,SAAS,aACxB;AAAA,MACE,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,IACA;AAAA,MACE,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEJ,WACE,4CAAC,sBAAsB,UAAtB,EAA+B,OAAO,EAAE,SAAS,MAAM,aAAa,GAEnE;AAAA,MAAC,mBAAmB;AAAA,MAAnB;AAAA,QACC;AAAA,QACA,WAAW;AAAA,QACV,GAAG;AAAA,QACH,GAAI;AAAA;AAAA,IACP,GACF;AAAA,EAEJ;AACF;AACA,UAAU,cAAc;AAIxB,MAAM,4BAAwB,qCAAI,IAAI;AAAA,EACpC,UAAU;AAAA,IACR,SAAS;AAAA,MACP,SAAS;AAAA,MACT,UAAU;AAAA,MACV,UAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,iBAAiB;AAAA,IACf,SAAS;AAAA,EACX;AACF,CAAC;AAMD,MAAM,gBAAgB,MAAM,WAG1B,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAAQ;AAClC,QAAM,EAAE,QAAQ,IAAI,yBAAyB;AAC7C,SACE;AAAA,IAAC,mBAAmB;AAAA,IAAnB;AAAA,MACC;AAAA,MACA,eAAW,iBAAG,sBAAsB,EAAE,QAAQ,CAAC,GAAG,SAAS;AAAA,MAC1D,GAAG;AAAA;AAAA,EACN;AAEJ,CAAC;AACD,cAAc,cAAc;AAI5B,MAAM,+BAA2B;AAAA,EAC/B;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,GAAG;AAAA,EACV;AAAA,IACE,UAAU;AAAA,MACR,MAAM;AAAA,QACJ,IAAI;AAAA;AAAA,QACJ,SAAS;AAAA;AAAA,QACT,IAAI;AAAA;AAAA,MACN;AAAA,MACA,cAAc;AAAA,QACZ,MAAM;AAAA,QACN,OAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,MAAM;AAAA,MACN,cAAc;AAAA,IAChB;AAAA,EACF;AACF;AAGA,MAAM,yBAAyB;AAAA,EAC7B,IAAI;AAAA;AAAA,EACJ,SAAS;AAAA;AAAA,EACT,IAAI;AAAA;AACN;AAQA,MAAM,mBAAmB,MAAM,WAG7B,CAAC,EAAE,WAAW,UAAU,MAAM,GAAG,MAAM,GAAG,QAAQ;AAClD,QAAM,EAAE,MAAM,aAAa,IAAI,yBAAyB;AACxD,QAAM,eAAe,QAAQ;AAE7B,SACE,4CAAC,mBAAmB,QAAnB,EAA0B,WAAU,QACnC;AAAA,IAAC,mBAAmB;AAAA,IAAnB;AAAA,MACC;AAAA,MACA,eAAW;AAAA,QACT;AAAA,QACA,yBAAyB,EAAE,MAAM,cAAc,aAAa,CAAC;AAAA,QAC7D;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEH;AAAA,gBACC,4CAAC,sBAAmB,eAAW;AAAA,UAC7B;AAAA,UACA,uBAAuB,YAAY;AAAA,QACrC,GAAG;AAAA,QAEL,4CAAC,UAAK,WAAU,aAAa,UAAS;AAAA;AAAA;AAAA,EACxC,GACF;AAEJ,CAAC;AACD,iBAAiB,cAAc;AAI/B,MAAM,8BAA8B;AAAA,EAClC,IAAI;AAAA,EACJ,SAAS;AAAA,EACT,IAAI;AACN;AAKA,MAAM,mBAAmB,MAAM,WAG7B,CAAC,EAAE,WAAW,UAAU,GAAG,MAAM,GAAG,QAAQ;AAC5C,QAAM,EAAE,KAAK,IAAI,yBAAyB;AAC1C,QAAM,eAAe,QAAQ;AAE7B,SACE;AAAA,IAAC,mBAAmB;AAAA,IAAnB;AAAA,MACC;AAAA,MACA,WAAU;AAAA,MACT,GAAG;AAAA,MAEJ,sDAAC,SAAI,eAAW;AAAA,QACd;AAAA,QACA,4BAA4B,YAAY;AAAA,QACxC;AAAA,MACF,GACG,UACH;AAAA;AAAA,EACF;AAEJ,CAAC;AACD,iBAAiB,cAAc;","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
|
-
import { cn } from "../../lib/utils";
|
|
6
|
-
const DefaultChevronIcon = ({ className }) => /* @__PURE__ */
|
|
6
|
+
import { cn } from "../../lib/utils.mjs";
|
|
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
|
-
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
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__ */
|
|
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
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
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__ */
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
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__ */
|
|
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
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
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__ */
|
|
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__ */
|
|
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":"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","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":[]}
|