@burtson-labs/ui 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/README.md +3 -3
  2. package/dist/components/accordion.js +1 -1
  3. package/dist/components/accordion.js.map +1 -1
  4. package/dist/components/alert.d.ts +1 -1
  5. package/dist/components/alert.js +9 -8
  6. package/dist/components/alert.js.map +1 -1
  7. package/dist/components/app-shell.d.ts +8 -0
  8. package/dist/components/app-shell.js +50 -0
  9. package/dist/components/app-shell.js.map +1 -0
  10. package/dist/components/avatar.js +1 -1
  11. package/dist/components/avatar.js.map +1 -1
  12. package/dist/components/badge.d.ts +1 -1
  13. package/dist/components/badge.js +9 -8
  14. package/dist/components/badge.js.map +1 -1
  15. package/dist/components/button.d.ts +4 -4
  16. package/dist/components/button.js +28 -19
  17. package/dist/components/button.js.map +1 -1
  18. package/dist/components/card.d.ts +10 -2
  19. package/dist/components/card.js +40 -9
  20. package/dist/components/card.js.map +1 -1
  21. package/dist/components/checkbox.js +1 -1
  22. package/dist/components/checkbox.js.map +1 -1
  23. package/dist/components/command.js +4 -4
  24. package/dist/components/command.js.map +1 -1
  25. package/dist/components/dialog.d.ts +1 -1
  26. package/dist/components/dialog.js +15 -15
  27. package/dist/components/dialog.js.map +1 -1
  28. package/dist/components/dropdown-menu.js +3 -3
  29. package/dist/components/dropdown-menu.js.map +1 -1
  30. package/dist/components/empty-state.d.ts +7 -0
  31. package/dist/components/empty-state.js +44 -0
  32. package/dist/components/empty-state.js.map +1 -0
  33. package/dist/components/field.d.ts +8 -0
  34. package/dist/components/field.js +51 -0
  35. package/dist/components/field.js.map +1 -0
  36. package/dist/components/icon-button.d.ts +8 -0
  37. package/dist/components/icon-button.js +19 -0
  38. package/dist/components/icon-button.js.map +1 -0
  39. package/dist/components/input.d.ts +1 -2
  40. package/dist/components/input.js +2 -3
  41. package/dist/components/input.js.map +1 -1
  42. package/dist/components/kbd.js +1 -1
  43. package/dist/components/kbd.js.map +1 -1
  44. package/dist/components/label.js +1 -1
  45. package/dist/components/label.js.map +1 -1
  46. package/dist/components/navigation-menu.d.ts +20 -0
  47. package/dist/components/navigation-menu.js +83 -0
  48. package/dist/components/navigation-menu.js.map +1 -0
  49. package/dist/components/page-header.d.ts +8 -0
  50. package/dist/components/page-header.js +51 -0
  51. package/dist/components/page-header.js.map +1 -0
  52. package/dist/components/popover.d.ts +5 -2
  53. package/dist/components/popover.js +5 -2
  54. package/dist/components/popover.js.map +1 -1
  55. package/dist/components/progress.js +2 -2
  56. package/dist/components/progress.js.map +1 -1
  57. package/dist/components/radio-group.js +1 -1
  58. package/dist/components/radio-group.js.map +1 -1
  59. package/dist/components/scroll-area.js +1 -1
  60. package/dist/components/scroll-area.js.map +1 -1
  61. package/dist/components/select.js +3 -3
  62. package/dist/components/select.js.map +1 -1
  63. package/dist/components/sheet.js +4 -4
  64. package/dist/components/sheet.js.map +1 -1
  65. package/dist/components/skeleton.js +1 -1
  66. package/dist/components/skeleton.js.map +1 -1
  67. package/dist/components/stat-card.d.ts +11 -0
  68. package/dist/components/stat-card.js +42 -0
  69. package/dist/components/stat-card.js.map +1 -0
  70. package/dist/components/status.d.ts +12 -0
  71. package/dist/components/status.js +40 -0
  72. package/dist/components/status.js.map +1 -0
  73. package/dist/components/switch.js +1 -1
  74. package/dist/components/switch.js.map +1 -1
  75. package/dist/components/table.d.ts +19 -4
  76. package/dist/components/table.js +18 -12
  77. package/dist/components/table.js.map +1 -1
  78. package/dist/components/tabs.js +4 -4
  79. package/dist/components/tabs.js.map +1 -1
  80. package/dist/components/textarea.js +1 -1
  81. package/dist/components/textarea.js.map +1 -1
  82. package/dist/components/toast.d.ts +20 -0
  83. package/dist/components/toast.js +70 -0
  84. package/dist/components/toast.js.map +1 -0
  85. package/dist/components/toolbar.d.ts +6 -0
  86. package/dist/components/toolbar.js +39 -0
  87. package/dist/components/toolbar.js.map +1 -0
  88. package/dist/components/tooltip.js +2 -2
  89. package/dist/components/tooltip.js.map +1 -1
  90. package/dist/index.d.ts +10 -0
  91. package/dist/index.js +13 -3
  92. package/dist/mui/index.js +9 -5
  93. package/dist/mui/index.js.map +1 -1
  94. package/dist/styles.css +1 -1
  95. package/dist/theme.css +95 -47
  96. package/dist/tokens.d.ts +41 -13
  97. package/dist/tokens.js +80 -47
  98. package/dist/tokens.js.map +1 -1
  99. package/package.json +2 -2
package/README.md CHANGED
@@ -9,7 +9,7 @@
9
9
 
10
10
  **The component system behind every Burtson Labs app.**
11
11
 
12
- Accessible React components on Radix and Tailwind CSS, with [Burtson Icons](https://icons.burtson.ai) built in. Install the package, or copy the source into your app and make it yours.
12
+ A quiet, precise, dark-first component system for agents, IDEs and ops tools, with [Burtson Icons](https://icons.burtson.ai) built in. Accessible (Radix primitives underneath, unstyled), themed with Tailwind, no runtime provider. Install the package, or copy the source into your app and make it yours.
13
13
 
14
14
  [![Docs](https://img.shields.io/badge/docs-ui.burtson.ai-a60ee5)](https://ui.burtson.ai)
15
15
  [![npm](https://img.shields.io/npm/v/@burtson-labs/ui?logo=npm)](https://www.npmjs.com/package/@burtson-labs/ui)
@@ -50,7 +50,7 @@ export const Save = () => <Button>Save</Button>;
50
50
 
51
51
  ### Or copy the source
52
52
 
53
- Every component is also a [shadcn](https://ui.shadcn.com) registry item. The CLI copies the file into `components/ui`, installs its dependencies and adds the Burtson theme:
53
+ Every component is also a registry item in the [shadcn](https://ui.shadcn.com) registry format. The CLI copies the file into `components/ui`, installs its dependencies and adds the Burtson theme:
54
54
 
55
55
  ```bash
56
56
  npx shadcn@latest add https://ui.burtson.ai/r/button.json
@@ -58,7 +58,7 @@ npx shadcn@latest add https://ui.burtson.ai/r/button.json
58
58
 
59
59
  ## <picture><source media="(prefers-color-scheme: dark)" srcset="https://icons.burtson.ai/svg-white/panel-grid.svg"/><img src="https://icons.burtson.ai/svg-black/panel-grid.svg" align="center" alt=""/></picture> Components
60
60
 
61
- Accordion · Alert · Avatar · Badge · Breadcrumb · Button · Card · Checkbox · Collapsible · Command · Dialog · Dropdown Menu · Input · Kbd · Label · Popover · Progress · Radio Group · Scroll Area · Select · Separator · Sheet · Skeleton · Spinner · Switch · Table · Tabs · Textarea · Tooltip
61
+ Accordion · Alert · App Shell · Avatar · Badge · Breadcrumb · Button · Card · Checkbox · Collapsible · Command · Dialog · Dropdown Menu · Empty State · Field · Icon Button · Input · Kbd · Label · Navigation Menu · Page Header · Popover · Progress · Radio Group · Scroll Area · Select · Separator · Sheet · Skeleton · Spinner · Stat Card · Status · Switch · Table · Tabs · Textarea · Toast · Toolbar · Tooltip
62
62
 
63
63
  Live previews and code for each one are at [ui.burtson.ai](https://ui.burtson.ai/docs/components/button).
64
64
 
@@ -22,7 +22,7 @@ function AccordionTrigger({ className, children, ...props }) {
22
22
  className: "flex",
23
23
  children: /* @__PURE__ */ jsxs(Accordion.Trigger, {
24
24
  "data-slot": "accordion-trigger",
25
- className: cn("flex flex-1 items-start justify-between gap-4 rounded-md py-4 text-left text-sm font-medium transition-all outline-none hover:underline focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 [&[data-state=open]>svg]:rotate-180", className),
25
+ className: cn("flex flex-1 items-start justify-between gap-4 rounded-md py-4 text-left text-sm font-semibold transition-all outline-none hover:text-brand focus-visible:ring-[3px] focus-visible:ring-ring/20 disabled:pointer-events-none disabled:opacity-50 [&[data-state=open]>svg]:rotate-180", className),
26
26
  ...props,
27
27
  children: [children, /* @__PURE__ */ jsx(ChevronDown, {
28
28
  className: "pointer-events-none size-4 shrink-0 translate-y-0.5 text-muted-foreground transition-transform duration-200",
@@ -1 +1 @@
1
- {"version":3,"file":"accordion.js","names":["Accordion","AccordionPrimitive"],"sources":["../../src/components/accordion.tsx"],"sourcesContent":["import ChevronDown from '@burtson-labs/icons/react/chevron-down';\nimport { Accordion as AccordionPrimitive } from 'radix-ui';\nimport * as React from 'react';\n\nimport { cn } from '../lib/utils';\n\nfunction Accordion(props: React.ComponentProps<typeof AccordionPrimitive.Root>) {\n return <AccordionPrimitive.Root data-slot=\"accordion\" {...props} />;\n}\n\nfunction AccordionItem({\n className,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Item>) {\n return (\n <AccordionPrimitive.Item\n data-slot=\"accordion-item\"\n className={cn('border-b last:border-b-0', className)}\n {...props}\n />\n );\n}\n\nfunction AccordionTrigger({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Trigger>) {\n return (\n <AccordionPrimitive.Header className=\"flex\">\n <AccordionPrimitive.Trigger\n data-slot=\"accordion-trigger\"\n className={cn(\n 'flex flex-1 items-start justify-between gap-4 rounded-md py-4 text-left text-sm font-medium transition-all outline-none hover:underline focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 [&[data-state=open]>svg]:rotate-180',\n className,\n )}\n {...props}\n >\n {children}\n <ChevronDown\n className=\"pointer-events-none size-4 shrink-0 translate-y-0.5 text-muted-foreground transition-transform duration-200\"\n aria-hidden\n />\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n );\n}\n\nfunction AccordionContent({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Content>) {\n return (\n <AccordionPrimitive.Content\n data-slot=\"accordion-content\"\n className=\"overflow-hidden text-sm data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down\"\n {...props}\n >\n <div className={cn('pt-0 pb-4', className)}>{children}</div>\n </AccordionPrimitive.Content>\n );\n}\n\nexport { Accordion, AccordionContent, AccordionItem, AccordionTrigger };\n"],"mappings":";;;;;;AAMA,SAASA,YAAU,OAA6D;CAC9E,OAAO,oBAACC,UAAmB,MAApB;EAAyB,aAAU;EAAY,GAAI;CAAQ,CAAA;AACpE;AAEA,SAAS,cAAc,EACrB,WACA,GAAG,SACoD;CACvD,OACE,oBAACA,UAAmB,MAApB;EACE,aAAU;EACV,WAAW,GAAG,4BAA4B,SAAS;EACnD,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,iBAAiB,EACxB,WACA,UACA,GAAG,SACuD;CAC1D,OACE,oBAACA,UAAmB,QAApB;EAA2B,WAAU;EACnC,UAAA,qBAACA,UAAmB,SAApB;GACE,aAAU;GACV,WAAW,GACT,oRACA,SACF;GACA,GAAI;GANN,UAAA,CAQG,UACD,oBAAC,aAAD;IACE,WAAU;IACV,eAAA;GACD,CAAA,CACyB;;CACH,CAAA;AAE/B;AAEA,SAAS,iBAAiB,EACxB,WACA,UACA,GAAG,SACuD;CAC1D,OACE,oBAACA,UAAmB,SAApB;EACE,aAAU;EACV,WAAU;EACV,GAAI;EAEJ,UAAA,oBAAC,OAAD;GAAK,WAAW,GAAG,aAAa,SAAS;GAAI;EAAc,CAAA;CACjC,CAAA;AAEhC"}
1
+ {"version":3,"file":"accordion.js","names":["Accordion","AccordionPrimitive"],"sources":["../../src/components/accordion.tsx"],"sourcesContent":["import ChevronDown from '@burtson-labs/icons/react/chevron-down';\nimport { Accordion as AccordionPrimitive } from 'radix-ui';\nimport * as React from 'react';\n\nimport { cn } from '../lib/utils';\n\nfunction Accordion(props: React.ComponentProps<typeof AccordionPrimitive.Root>) {\n return <AccordionPrimitive.Root data-slot=\"accordion\" {...props} />;\n}\n\nfunction AccordionItem({\n className,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Item>) {\n return (\n <AccordionPrimitive.Item\n data-slot=\"accordion-item\"\n className={cn('border-b last:border-b-0', className)}\n {...props}\n />\n );\n}\n\nfunction AccordionTrigger({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Trigger>) {\n return (\n <AccordionPrimitive.Header className=\"flex\">\n <AccordionPrimitive.Trigger\n data-slot=\"accordion-trigger\"\n className={cn(\n 'flex flex-1 items-start justify-between gap-4 rounded-md py-4 text-left text-sm font-semibold transition-all outline-none hover:text-brand focus-visible:ring-[3px] focus-visible:ring-ring/20 disabled:pointer-events-none disabled:opacity-50 [&[data-state=open]>svg]:rotate-180',\n className,\n )}\n {...props}\n >\n {children}\n <ChevronDown\n className=\"pointer-events-none size-4 shrink-0 translate-y-0.5 text-muted-foreground transition-transform duration-200\"\n aria-hidden\n />\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n );\n}\n\nfunction AccordionContent({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Content>) {\n return (\n <AccordionPrimitive.Content\n data-slot=\"accordion-content\"\n className=\"overflow-hidden text-sm data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down\"\n {...props}\n >\n <div className={cn('pt-0 pb-4', className)}>{children}</div>\n </AccordionPrimitive.Content>\n );\n}\n\nexport { Accordion, AccordionContent, AccordionItem, AccordionTrigger };\n"],"mappings":";;;;;;AAMA,SAASA,YAAU,OAA6D;CAC9E,OAAO,oBAACC,UAAmB,MAApB;EAAyB,aAAU;EAAY,GAAI;CAAQ,CAAA;AACpE;AAEA,SAAS,cAAc,EACrB,WACA,GAAG,SACoD;CACvD,OACE,oBAACA,UAAmB,MAApB;EACE,aAAU;EACV,WAAW,GAAG,4BAA4B,SAAS;EACnD,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,iBAAiB,EACxB,WACA,UACA,GAAG,SACuD;CAC1D,OACE,oBAACA,UAAmB,QAApB;EAA2B,WAAU;EACnC,UAAA,qBAACA,UAAmB,SAApB;GACE,aAAU;GACV,WAAW,GACT,uRACA,SACF;GACA,GAAI;GANN,UAAA,CAQG,UACD,oBAAC,aAAD;IACE,WAAU;IACV,eAAA;GACD,CAAA,CACyB;;CACH,CAAA;AAE/B;AAEA,SAAS,iBAAiB,EACxB,WACA,UACA,GAAG,SACuD;CAC1D,OACE,oBAACA,UAAmB,SAApB;EACE,aAAU;EACV,WAAU;EACV,GAAI;EAEJ,UAAA,oBAAC,OAAD;GAAK,WAAW,GAAG,aAAa,SAAS;GAAI;EAAc,CAAA;CACjC,CAAA;AAEhC"}
@@ -1,7 +1,7 @@
1
1
  import { type VariantProps } from 'class-variance-authority';
2
2
  import * as React from 'react';
3
3
  declare const alertVariants: (props?: ({
4
- variant?: "destructive" | "success" | "warning" | "brand" | "default" | null | undefined;
4
+ variant?: "destructive" | "success" | "warning" | "info" | "brand" | "default" | null | undefined;
5
5
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
6
6
  declare function Alert({ className, variant, ...props }: React.ComponentProps<'div'> & VariantProps<typeof alertVariants>): React.JSX.Element;
7
7
  declare function AlertTitle({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
@@ -3,13 +3,14 @@ import "react";
3
3
  import { jsx } from "react/jsx-runtime";
4
4
  import { cva } from "class-variance-authority";
5
5
  //#region src/components/alert.tsx
6
- var alertVariants = cva("relative grid w-full grid-cols-[0_1fr] items-start gap-y-0.5 rounded-lg border px-4 py-3 text-sm has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] has-[>svg]:gap-x-3 [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current", {
6
+ var alertVariants = cva("relative grid w-full grid-cols-[auto_1fr] gap-x-3 gap-y-0.5 rounded-lg border px-4 py-3.5 text-sm shadow-xs [&>svg]:mt-0.5 [&>svg]:size-4", {
7
7
  variants: { variant: {
8
- default: "bg-card text-card-foreground",
9
- brand: "border-brand/40 bg-brand-soft text-foreground [&>svg]:text-brand",
10
- success: "border-success/40 bg-success/10 text-foreground [&>svg]:text-success",
11
- warning: "border-warning/40 bg-warning/10 text-foreground [&>svg]:text-warning",
12
- destructive: "border-destructive/40 bg-destructive/10 text-destructive [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90"
8
+ default: "border-border bg-surface text-foreground [&>svg]:text-muted-foreground",
9
+ brand: "border-brand/25 bg-brand-soft/70 text-foreground [&>svg]:text-brand",
10
+ success: "border-success/25 bg-success/10 text-foreground [&>svg]:text-success",
11
+ warning: "border-warning/25 bg-warning/10 text-foreground [&>svg]:text-warning",
12
+ destructive: "border-destructive/25 bg-destructive/10 text-foreground [&>svg]:text-destructive",
13
+ info: "border-info/25 bg-info/10 text-foreground [&>svg]:text-info"
13
14
  } },
14
15
  defaultVariants: { variant: "default" }
15
16
  });
@@ -24,14 +25,14 @@ function Alert({ className, variant, ...props }) {
24
25
  function AlertTitle({ className, ...props }) {
25
26
  return /* @__PURE__ */ jsx("div", {
26
27
  "data-slot": "alert-title",
27
- className: cn("col-start-2 line-clamp-1 min-h-4 font-medium tracking-tight", className),
28
+ className: cn("font-semibold tracking-[-0.01em]", className),
28
29
  ...props
29
30
  });
30
31
  }
31
32
  function AlertDescription({ className, ...props }) {
32
33
  return /* @__PURE__ */ jsx("div", {
33
34
  "data-slot": "alert-description",
34
- className: cn("col-start-2 grid justify-items-start gap-1 text-sm text-muted-foreground [&_p]:leading-relaxed", className),
35
+ className: cn("col-start-2 text-[13px] leading-5 text-muted-foreground", className),
35
36
  ...props
36
37
  });
37
38
  }
@@ -1 +1 @@
1
- {"version":3,"file":"alert.js","names":[],"sources":["../../src/components/alert.tsx"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\nimport * as React from 'react';\n\nimport { cn } from '../lib/utils';\n\nconst alertVariants = cva(\n 'relative grid w-full grid-cols-[0_1fr] items-start gap-y-0.5 rounded-lg border px-4 py-3 text-sm has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] has-[>svg]:gap-x-3 [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current',\n {\n variants: {\n variant: {\n default: 'bg-card text-card-foreground',\n brand: 'border-brand/40 bg-brand-soft text-foreground [&>svg]:text-brand',\n success: 'border-success/40 bg-success/10 text-foreground [&>svg]:text-success',\n warning: 'border-warning/40 bg-warning/10 text-foreground [&>svg]:text-warning',\n destructive:\n 'border-destructive/40 bg-destructive/10 text-destructive [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90',\n },\n },\n defaultVariants: { variant: 'default' },\n },\n);\n\nfunction Alert({\n className,\n variant,\n ...props\n}: React.ComponentProps<'div'> & VariantProps<typeof alertVariants>) {\n return (\n <div\n data-slot=\"alert\"\n role=\"alert\"\n className={cn(alertVariants({ variant }), className)}\n {...props}\n />\n );\n}\n\nfunction AlertTitle({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"alert-title\"\n className={cn('col-start-2 line-clamp-1 min-h-4 font-medium tracking-tight', className)}\n {...props}\n />\n );\n}\n\nfunction AlertDescription({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"alert-description\"\n className={cn(\n 'col-start-2 grid justify-items-start gap-1 text-sm text-muted-foreground [&_p]:leading-relaxed',\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Alert, AlertDescription, AlertTitle, alertVariants };\n"],"mappings":";;;;;AAKA,IAAM,gBAAgB,IACpB,qOACA;CACE,UAAU,EACR,SAAS;EACP,SAAS;EACT,OAAO;EACP,SAAS;EACT,SAAS;EACT,aACE;CACJ,EACF;CACA,iBAAiB,EAAE,SAAS,UAAU;AACxC,CACF;AAEA,SAAS,MAAM,EACb,WACA,SACA,GAAG,SACgE;CACnE,OACE,oBAAC,OAAD;EACE,aAAU;EACV,MAAK;EACL,WAAW,GAAG,cAAc,EAAE,QAAQ,CAAC,GAAG,SAAS;EACnD,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,WAAW,EAAE,WAAW,GAAG,SAAsC;CACxE,OACE,oBAAC,OAAD;EACE,aAAU;EACV,WAAW,GAAG,+DAA+D,SAAS;EACtF,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,iBAAiB,EAAE,WAAW,GAAG,SAAsC;CAC9E,OACE,oBAAC,OAAD;EACE,aAAU;EACV,WAAW,GACT,kGACA,SACF;EACA,GAAI;CACL,CAAA;AAEL"}
1
+ {"version":3,"file":"alert.js","names":[],"sources":["../../src/components/alert.tsx"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\nimport * as React from 'react';\n\nimport { cn } from '../lib/utils';\n\nconst alertVariants = cva(\n 'relative grid w-full grid-cols-[auto_1fr] gap-x-3 gap-y-0.5 rounded-lg border px-4 py-3.5 text-sm shadow-xs [&>svg]:mt-0.5 [&>svg]:size-4',\n {\n variants: {\n variant: {\n default: 'border-border bg-surface text-foreground [&>svg]:text-muted-foreground',\n brand: 'border-brand/25 bg-brand-soft/70 text-foreground [&>svg]:text-brand',\n success: 'border-success/25 bg-success/10 text-foreground [&>svg]:text-success',\n warning: 'border-warning/25 bg-warning/10 text-foreground [&>svg]:text-warning',\n destructive:\n 'border-destructive/25 bg-destructive/10 text-foreground [&>svg]:text-destructive',\n info: 'border-info/25 bg-info/10 text-foreground [&>svg]:text-info',\n },\n },\n defaultVariants: { variant: 'default' },\n },\n);\n\nfunction Alert({\n className,\n variant,\n ...props\n}: React.ComponentProps<'div'> & VariantProps<typeof alertVariants>) {\n return (\n <div\n data-slot=\"alert\"\n role=\"alert\"\n className={cn(alertVariants({ variant }), className)}\n {...props}\n />\n );\n}\n\nfunction AlertTitle({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"alert-title\"\n className={cn('font-semibold tracking-[-0.01em]', className)}\n {...props}\n />\n );\n}\n\nfunction AlertDescription({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"alert-description\"\n className={cn('col-start-2 text-[13px] leading-5 text-muted-foreground', className)}\n {...props}\n />\n );\n}\n\nexport { Alert, AlertDescription, AlertTitle, alertVariants };\n"],"mappings":";;;;;AAKA,IAAM,gBAAgB,IACpB,6IACA;CACE,UAAU,EACR,SAAS;EACP,SAAS;EACT,OAAO;EACP,SAAS;EACT,SAAS;EACT,aACE;EACF,MAAM;CACR,EACF;CACA,iBAAiB,EAAE,SAAS,UAAU;AACxC,CACF;AAEA,SAAS,MAAM,EACb,WACA,SACA,GAAG,SACgE;CACnE,OACE,oBAAC,OAAD;EACE,aAAU;EACV,MAAK;EACL,WAAW,GAAG,cAAc,EAAE,QAAQ,CAAC,GAAG,SAAS;EACnD,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,WAAW,EAAE,WAAW,GAAG,SAAsC;CACxE,OACE,oBAAC,OAAD;EACE,aAAU;EACV,WAAW,GAAG,oCAAoC,SAAS;EAC3D,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,iBAAiB,EAAE,WAAW,GAAG,SAAsC;CAC9E,OACE,oBAAC,OAAD;EACE,aAAU;EACV,WAAW,GAAG,2DAA2D,SAAS;EAClF,GAAI;CACL,CAAA;AAEL"}
@@ -0,0 +1,8 @@
1
+ import * as React from 'react';
2
+ declare function AppShell({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
3
+ declare function AppShellHeader({ className, ...props }: React.ComponentProps<'header'>): React.JSX.Element;
4
+ declare function AppShellBody({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
5
+ declare function AppShellSidebar({ className, ...props }: React.ComponentProps<'aside'>): React.JSX.Element;
6
+ declare function AppShellMain({ className, ...props }: React.ComponentProps<'main'>): React.JSX.Element;
7
+ declare function AppShellContent({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
8
+ export { AppShell, AppShellBody, AppShellContent, AppShellHeader, AppShellMain, AppShellSidebar };
@@ -0,0 +1,50 @@
1
+ import { cn } from "../lib/utils.js";
2
+ import "react";
3
+ import { jsx } from "react/jsx-runtime";
4
+ //#region src/components/app-shell.tsx
5
+ function AppShell({ className, ...props }) {
6
+ return /* @__PURE__ */ jsx("div", {
7
+ "data-slot": "app-shell",
8
+ className: cn("grid min-h-dvh grid-rows-[auto_1fr] bg-background text-foreground", className),
9
+ ...props
10
+ });
11
+ }
12
+ function AppShellHeader({ className, ...props }) {
13
+ return /* @__PURE__ */ jsx("header", {
14
+ "data-slot": "app-shell-header",
15
+ className: cn("sticky top-0 z-40 flex h-12 items-center border-b border-border bg-background/90 px-3 backdrop-blur-xl sm:px-4", className),
16
+ ...props
17
+ });
18
+ }
19
+ function AppShellBody({ className, ...props }) {
20
+ return /* @__PURE__ */ jsx("div", {
21
+ "data-slot": "app-shell-body",
22
+ className: cn("grid min-h-0 grid-cols-1", className),
23
+ ...props
24
+ });
25
+ }
26
+ function AppShellSidebar({ className, ...props }) {
27
+ return /* @__PURE__ */ jsx("aside", {
28
+ "data-slot": "app-shell-sidebar",
29
+ className: cn("min-h-0 border-r border-border bg-surface-muted/55", className),
30
+ ...props
31
+ });
32
+ }
33
+ function AppShellMain({ className, ...props }) {
34
+ return /* @__PURE__ */ jsx("main", {
35
+ "data-slot": "app-shell-main",
36
+ className: cn("min-w-0 bg-background", className),
37
+ ...props
38
+ });
39
+ }
40
+ function AppShellContent({ className, ...props }) {
41
+ return /* @__PURE__ */ jsx("div", {
42
+ "data-slot": "app-shell-content",
43
+ className: cn("mx-auto w-full max-w-[1600px] p-4 sm:p-6", className),
44
+ ...props
45
+ });
46
+ }
47
+ //#endregion
48
+ export { AppShell, AppShellBody, AppShellContent, AppShellHeader, AppShellMain, AppShellSidebar };
49
+
50
+ //# sourceMappingURL=app-shell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-shell.js","names":[],"sources":["../../src/components/app-shell.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { cn } from '../lib/utils';\n\nfunction AppShell({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"app-shell\"\n className={cn('grid min-h-dvh grid-rows-[auto_1fr] bg-background text-foreground', className)}\n {...props}\n />\n );\n}\n\nfunction AppShellHeader({ className, ...props }: React.ComponentProps<'header'>) {\n return (\n <header\n data-slot=\"app-shell-header\"\n className={cn(\n 'sticky top-0 z-40 flex h-12 items-center border-b border-border bg-background/90 px-3 backdrop-blur-xl sm:px-4',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction AppShellBody({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"app-shell-body\"\n className={cn('grid min-h-0 grid-cols-1', className)}\n {...props}\n />\n );\n}\n\nfunction AppShellSidebar({ className, ...props }: React.ComponentProps<'aside'>) {\n return (\n <aside\n data-slot=\"app-shell-sidebar\"\n className={cn('min-h-0 border-r border-border bg-surface-muted/55', className)}\n {...props}\n />\n );\n}\n\nfunction AppShellMain({ className, ...props }: React.ComponentProps<'main'>) {\n return (\n <main\n data-slot=\"app-shell-main\"\n className={cn('min-w-0 bg-background', className)}\n {...props}\n />\n );\n}\n\nfunction AppShellContent({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"app-shell-content\"\n className={cn('mx-auto w-full max-w-[1600px] p-4 sm:p-6', className)}\n {...props}\n />\n );\n}\n\nexport { AppShell, AppShellBody, AppShellContent, AppShellHeader, AppShellMain, AppShellSidebar };\n"],"mappings":";;;;AAIA,SAAS,SAAS,EAAE,WAAW,GAAG,SAAsC;CACtE,OACE,oBAAC,OAAD;EACE,aAAU;EACV,WAAW,GAAG,qEAAqE,SAAS;EAC5F,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,eAAe,EAAE,WAAW,GAAG,SAAyC;CAC/E,OACE,oBAAC,UAAD;EACE,aAAU;EACV,WAAW,GACT,kHACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,aAAa,EAAE,WAAW,GAAG,SAAsC;CAC1E,OACE,oBAAC,OAAD;EACE,aAAU;EACV,WAAW,GAAG,4BAA4B,SAAS;EACnD,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,gBAAgB,EAAE,WAAW,GAAG,SAAwC;CAC/E,OACE,oBAAC,SAAD;EACE,aAAU;EACV,WAAW,GAAG,sDAAsD,SAAS;EAC7E,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,aAAa,EAAE,WAAW,GAAG,SAAuC;CAC3E,OACE,oBAAC,QAAD;EACE,aAAU;EACV,WAAW,GAAG,yBAAyB,SAAS;EAChD,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,gBAAgB,EAAE,WAAW,GAAG,SAAsC;CAC7E,OACE,oBAAC,OAAD;EACE,aAAU;EACV,WAAW,GAAG,4CAA4C,SAAS;EACnE,GAAI;CACL,CAAA;AAEL"}
@@ -20,7 +20,7 @@ function AvatarImage({ className, ...props }) {
20
20
  function AvatarFallback({ className, ...props }) {
21
21
  return /* @__PURE__ */ jsx(Avatar.Fallback, {
22
22
  "data-slot": "avatar-fallback",
23
- className: cn("flex size-full items-center justify-center rounded-full bg-brand-soft text-xs font-medium text-accent-foreground", className),
23
+ className: cn("flex size-full items-center justify-center rounded-full border border-brand/15 bg-brand-soft text-xs font-semibold text-brand-soft-foreground", className),
24
24
  ...props
25
25
  });
26
26
  }
@@ -1 +1 @@
1
- {"version":3,"file":"avatar.js","names":["Avatar","AvatarPrimitive"],"sources":["../../src/components/avatar.tsx"],"sourcesContent":["import { Avatar as AvatarPrimitive } from 'radix-ui';\nimport * as React from 'react';\n\nimport { cn } from '../lib/utils';\n\nfunction Avatar({ className, ...props }: React.ComponentProps<typeof AvatarPrimitive.Root>) {\n return (\n <AvatarPrimitive.Root\n data-slot=\"avatar\"\n className={cn('relative flex size-8 shrink-0 overflow-hidden rounded-full', className)}\n {...props}\n />\n );\n}\n\nfunction AvatarImage({ className, ...props }: React.ComponentProps<typeof AvatarPrimitive.Image>) {\n return (\n <AvatarPrimitive.Image\n data-slot=\"avatar-image\"\n className={cn('aspect-square size-full object-cover', className)}\n {...props}\n />\n );\n}\n\nfunction AvatarFallback({\n className,\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Fallback>) {\n return (\n <AvatarPrimitive.Fallback\n data-slot=\"avatar-fallback\"\n className={cn(\n 'flex size-full items-center justify-center rounded-full bg-brand-soft text-xs font-medium text-accent-foreground',\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Avatar, AvatarFallback, AvatarImage };\n"],"mappings":";;;;;AAKA,SAASA,SAAO,EAAE,WAAW,GAAG,SAA4D;CAC1F,OACE,oBAACC,OAAgB,MAAjB;EACE,aAAU;EACV,WAAW,GAAG,8DAA8D,SAAS;EACrF,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,YAAY,EAAE,WAAW,GAAG,SAA6D;CAChG,OACE,oBAACA,OAAgB,OAAjB;EACE,aAAU;EACV,WAAW,GAAG,wCAAwC,SAAS;EAC/D,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,eAAe,EACtB,WACA,GAAG,SACqD;CACxD,OACE,oBAACA,OAAgB,UAAjB;EACE,aAAU;EACV,WAAW,GACT,oHACA,SACF;EACA,GAAI;CACL,CAAA;AAEL"}
1
+ {"version":3,"file":"avatar.js","names":["Avatar","AvatarPrimitive"],"sources":["../../src/components/avatar.tsx"],"sourcesContent":["import { Avatar as AvatarPrimitive } from 'radix-ui';\nimport * as React from 'react';\n\nimport { cn } from '../lib/utils';\n\nfunction Avatar({ className, ...props }: React.ComponentProps<typeof AvatarPrimitive.Root>) {\n return (\n <AvatarPrimitive.Root\n data-slot=\"avatar\"\n className={cn('relative flex size-8 shrink-0 overflow-hidden rounded-full', className)}\n {...props}\n />\n );\n}\n\nfunction AvatarImage({ className, ...props }: React.ComponentProps<typeof AvatarPrimitive.Image>) {\n return (\n <AvatarPrimitive.Image\n data-slot=\"avatar-image\"\n className={cn('aspect-square size-full object-cover', className)}\n {...props}\n />\n );\n}\n\nfunction AvatarFallback({\n className,\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Fallback>) {\n return (\n <AvatarPrimitive.Fallback\n data-slot=\"avatar-fallback\"\n className={cn(\n 'flex size-full items-center justify-center rounded-full border border-brand/15 bg-brand-soft text-xs font-semibold text-brand-soft-foreground',\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Avatar, AvatarFallback, AvatarImage };\n"],"mappings":";;;;;AAKA,SAASA,SAAO,EAAE,WAAW,GAAG,SAA4D;CAC1F,OACE,oBAACC,OAAgB,MAAjB;EACE,aAAU;EACV,WAAW,GAAG,8DAA8D,SAAS;EACrF,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,YAAY,EAAE,WAAW,GAAG,SAA6D;CAChG,OACE,oBAACA,OAAgB,OAAjB;EACE,aAAU;EACV,WAAW,GAAG,wCAAwC,SAAS;EAC/D,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,eAAe,EACtB,WACA,GAAG,SACqD;CACxD,OACE,oBAACA,OAAgB,UAAjB;EACE,aAAU;EACV,WAAW,GACT,iJACA,SACF;EACA,GAAI;CACL,CAAA;AAEL"}
@@ -1,7 +1,7 @@
1
1
  import { type VariantProps } from 'class-variance-authority';
2
2
  import * as React from 'react';
3
3
  declare const badgeVariants: (props?: ({
4
- variant?: "secondary" | "destructive" | "success" | "warning" | "brand" | "default" | "outline" | null | undefined;
4
+ variant?: "secondary" | "destructive" | "success" | "warning" | "info" | "brand" | "default" | "outline" | null | undefined;
5
5
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
6
6
  export interface BadgeProps extends React.ComponentProps<'span'>, VariantProps<typeof badgeVariants> {
7
7
  asChild?: boolean;
@@ -4,15 +4,16 @@ import "react";
4
4
  import { jsx } from "react/jsx-runtime";
5
5
  import { cva } from "class-variance-authority";
6
6
  //#region src/components/badge.tsx
7
- var badgeVariants = cva("inline-flex w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-full border px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-colors focus-visible:ring-[3px] focus-visible:ring-ring/50 [&>svg]:pointer-events-none [&>svg]:size-3", {
7
+ var badgeVariants = cva("inline-flex w-fit shrink-0 items-center gap-1.5 rounded-full border px-2 py-0.5 text-[11px] font-semibold leading-4 whitespace-nowrap outline-none transition-colors focus-visible:ring-[3px] focus-visible:ring-ring/20 [&>svg]:size-3", {
8
8
  variants: { variant: {
9
- default: "border-transparent bg-primary text-primary-foreground",
10
- secondary: "border-transparent bg-secondary text-secondary-foreground",
11
- brand: "border-brand/40 bg-brand-soft text-accent-foreground",
12
- success: "border-transparent bg-success/15 text-success",
13
- warning: "border-transparent bg-warning/15 text-warning",
14
- destructive: "border-transparent bg-destructive/15 text-destructive",
15
- outline: "text-foreground"
9
+ default: "border-border bg-surface-muted text-foreground",
10
+ secondary: "border-border bg-surface-muted text-foreground",
11
+ brand: "border-brand/20 bg-brand-soft text-brand-soft-foreground",
12
+ success: "border-success/20 bg-success/10 text-success",
13
+ warning: "border-warning/20 bg-warning/10 text-warning",
14
+ destructive: "border-destructive/20 bg-destructive/10 text-destructive",
15
+ info: "border-info/20 bg-info/10 text-info",
16
+ outline: "border-border-strong bg-transparent text-muted-foreground"
16
17
  } },
17
18
  defaultVariants: { variant: "default" }
18
19
  });
@@ -1 +1 @@
1
- {"version":3,"file":"badge.js","names":[],"sources":["../../src/components/badge.tsx"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\nimport { Slot } from 'radix-ui';\nimport * as React from 'react';\n\nimport { cn } from '../lib/utils';\n\nconst badgeVariants = cva(\n 'inline-flex w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-full border px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-colors focus-visible:ring-[3px] focus-visible:ring-ring/50 [&>svg]:pointer-events-none [&>svg]:size-3',\n {\n variants: {\n variant: {\n default: 'border-transparent bg-primary text-primary-foreground',\n secondary: 'border-transparent bg-secondary text-secondary-foreground',\n brand: 'border-brand/40 bg-brand-soft text-accent-foreground',\n success: 'border-transparent bg-success/15 text-success',\n warning: 'border-transparent bg-warning/15 text-warning',\n destructive: 'border-transparent bg-destructive/15 text-destructive',\n outline: 'text-foreground',\n },\n },\n defaultVariants: { variant: 'default' },\n },\n);\n\nexport interface BadgeProps\n extends React.ComponentProps<'span'>, VariantProps<typeof badgeVariants> {\n asChild?: boolean;\n}\n\nfunction Badge({ className, variant, asChild = false, ...props }: BadgeProps) {\n const Comp = asChild ? Slot.Root : 'span';\n return (\n <Comp data-slot=\"badge\" className={cn(badgeVariants({ variant }), className)} {...props} />\n );\n}\n\nexport { Badge, badgeVariants };\n"],"mappings":";;;;;;AAMA,IAAM,gBAAgB,IACpB,uQACA;CACE,UAAU,EACR,SAAS;EACP,SAAS;EACT,WAAW;EACX,OAAO;EACP,SAAS;EACT,SAAS;EACT,aAAa;EACb,SAAS;CACX,EACF;CACA,iBAAiB,EAAE,SAAS,UAAU;AACxC,CACF;AAOA,SAAS,MAAM,EAAE,WAAW,SAAS,UAAU,OAAO,GAAG,SAAqB;CAC5E,MAAM,OAAO,UAAU,KAAK,OAAO;CACnC,OACE,oBAAC,MAAD;EAAM,aAAU;EAAQ,WAAW,GAAG,cAAc,EAAE,QAAQ,CAAC,GAAG,SAAS;EAAG,GAAI;CAAQ,CAAA;AAE9F"}
1
+ {"version":3,"file":"badge.js","names":[],"sources":["../../src/components/badge.tsx"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\nimport { Slot } from 'radix-ui';\nimport * as React from 'react';\n\nimport { cn } from '../lib/utils';\n\nconst badgeVariants = cva(\n 'inline-flex w-fit shrink-0 items-center gap-1.5 rounded-full border px-2 py-0.5 text-[11px] font-semibold leading-4 whitespace-nowrap outline-none transition-colors focus-visible:ring-[3px] focus-visible:ring-ring/20 [&>svg]:size-3',\n {\n variants: {\n variant: {\n default: 'border-border bg-surface-muted text-foreground',\n // 0.x name for the neutral tag; kept so existing apps keep compiling.\n secondary: 'border-border bg-surface-muted text-foreground',\n brand: 'border-brand/20 bg-brand-soft text-brand-soft-foreground',\n success: 'border-success/20 bg-success/10 text-success',\n warning: 'border-warning/20 bg-warning/10 text-warning',\n destructive: 'border-destructive/20 bg-destructive/10 text-destructive',\n info: 'border-info/20 bg-info/10 text-info',\n outline: 'border-border-strong bg-transparent text-muted-foreground',\n },\n },\n defaultVariants: { variant: 'default' },\n },\n);\n\nexport interface BadgeProps\n extends React.ComponentProps<'span'>, VariantProps<typeof badgeVariants> {\n asChild?: boolean;\n}\n\nfunction Badge({ className, variant, asChild = false, ...props }: BadgeProps) {\n const Comp = asChild ? Slot.Root : 'span';\n return (\n <Comp data-slot=\"badge\" className={cn(badgeVariants({ variant }), className)} {...props} />\n );\n}\n\nexport { Badge, badgeVariants };\n"],"mappings":";;;;;;AAMA,IAAM,gBAAgB,IACpB,2OACA;CACE,UAAU,EACR,SAAS;EACP,SAAS;EAET,WAAW;EACX,OAAO;EACP,SAAS;EACT,SAAS;EACT,aAAa;EACb,MAAM;EACN,SAAS;CACX,EACF;CACA,iBAAiB,EAAE,SAAS,UAAU;AACxC,CACF;AAOA,SAAS,MAAM,EAAE,WAAW,SAAS,UAAU,OAAO,GAAG,SAAqB;CAC5E,MAAM,OAAO,UAAU,KAAK,OAAO;CACnC,OACE,oBAAC,MAAD;EAAM,aAAU;EAAQ,WAAW,GAAG,cAAc,EAAE,QAAQ,CAAC,GAAG,SAAS;EAAG,GAAI;CAAQ,CAAA;AAE9F"}
@@ -1,12 +1,12 @@
1
1
  import { type VariantProps } from 'class-variance-authority';
2
2
  import * as React from 'react';
3
3
  declare const buttonVariants: (props?: ({
4
- variant?: "secondary" | "destructive" | "link" | "default" | "outline" | "ghost" | null | undefined;
5
- size?: "default" | "sm" | "lg" | "icon" | "icon-sm" | "icon-lg" | null | undefined;
4
+ variant?: "secondary" | "destructive" | "brand" | "link" | "default" | "outline" | "soft" | "ghost" | null | undefined;
5
+ size?: "default" | "xs" | "sm" | "lg" | "icon" | "icon-sm" | "icon-lg" | null | undefined;
6
6
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
7
7
  export interface ButtonProps extends React.ComponentProps<'button'>, VariantProps<typeof buttonVariants> {
8
- /** Render the child element instead of a <button>, merging props onto it (e.g. a router link). */
9
8
  asChild?: boolean;
9
+ loading?: boolean;
10
10
  }
11
- declare function Button({ className, variant, size, asChild, ...props }: ButtonProps): React.JSX.Element;
11
+ declare function Button({ className, variant, size, asChild, loading, disabled, children, ...props }: ButtonProps): React.JSX.Element;
12
12
  export { Button, buttonVariants };
@@ -1,26 +1,29 @@
1
1
  import { cn } from "../lib/utils.js";
2
2
  import { Slot } from "radix-ui";
3
3
  import "react";
4
- import { jsx } from "react/jsx-runtime";
4
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
5
5
  import { cva } from "class-variance-authority";
6
6
  //#region src/components/button.tsx
7
- var buttonVariants = cva("inline-flex shrink-0 items-center justify-center gap-2 rounded-md text-sm font-medium whitespace-nowrap transition-[color,background-color,border-color,box-shadow] outline-none select-none focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", {
7
+ var buttonVariants = cva("inline-flex shrink-0 items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-semibold tracking-[-0.01em] outline-none transition-[background-color,border-color,color,box-shadow,transform] duration-150 select-none focus-visible:ring-[3px] focus-visible:ring-ring/20 active:translate-y-px disabled:pointer-events-none disabled:opacity-45 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", {
8
8
  variants: {
9
9
  variant: {
10
- default: "bg-primary text-primary-foreground shadow-xs hover:bg-primary/90",
11
- destructive: "bg-destructive text-destructive-foreground shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/30",
12
- outline: "border border-input bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/20 dark:hover:bg-input/40",
13
- secondary: "bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80",
14
- ghost: "hover:bg-accent hover:text-accent-foreground",
15
- link: "text-brand underline-offset-4 hover:underline"
10
+ default: "border border-primary bg-primary text-primary-foreground shadow-xs hover:border-brand-hover hover:bg-brand-hover",
11
+ brand: "border border-brand bg-brand text-white shadow-[0_1px_2px_rgb(68_8_94_/_0.18)] hover:border-brand-hover hover:bg-brand-hover",
12
+ soft: "border border-brand/15 bg-brand-soft text-brand-soft-foreground hover:bg-brand/15",
13
+ secondary: "border border-border bg-secondary text-secondary-foreground shadow-xs hover:border-border-strong hover:bg-muted",
14
+ outline: "border border-border-strong bg-surface text-foreground shadow-xs hover:border-brand/35 hover:bg-accent/60 hover:text-accent-foreground",
15
+ ghost: "border border-transparent text-foreground hover:bg-muted",
16
+ destructive: "border border-destructive bg-destructive text-destructive-foreground shadow-xs hover:bg-destructive/90",
17
+ link: "h-auto rounded-none border-0 p-0 text-brand shadow-none hover:text-brand-hover hover:underline hover:underline-offset-4 active:translate-y-0"
16
18
  },
17
19
  size: {
18
- default: "h-9 px-4 py-2 has-[>svg]:px-3",
19
- sm: "h-8 gap-1.5 rounded-md px-3 text-[13px] has-[>svg]:px-2.5",
20
- lg: "h-10 rounded-md px-6 has-[>svg]:px-4",
21
- icon: "size-9",
22
- "icon-sm": "size-8",
23
- "icon-lg": "size-10"
20
+ xs: "h-7 gap-1.5 rounded-sm px-2.5 text-xs [&_svg:not([class*=size-])]:size-3.5",
21
+ sm: "h-8 px-3 text-[13px]",
22
+ default: "h-9 px-3.5",
23
+ lg: "h-10 rounded-lg px-4 text-[15px]",
24
+ icon: "size-9 px-0",
25
+ "icon-sm": "size-8 px-0",
26
+ "icon-lg": "size-10 rounded-lg px-0"
24
27
  }
25
28
  },
26
29
  defaultVariants: {
@@ -28,16 +31,22 @@ var buttonVariants = cva("inline-flex shrink-0 items-center justify-center gap-2
28
31
  size: "default"
29
32
  }
30
33
  });
31
- function Button({ className, variant, size, asChild = false, ...props }) {
34
+ function Button({ className, variant, size, asChild = false, loading = false, disabled, children, ...props }) {
32
35
  const Comp = asChild ? Slot.Root : "button";
33
36
  return /* @__PURE__ */ jsx(Comp, {
34
37
  "data-slot": "button",
38
+ "data-loading": loading ? "" : void 0,
39
+ "aria-busy": loading || void 0,
40
+ disabled: !asChild ? disabled || loading : void 0,
35
41
  className: cn(buttonVariants({
36
42
  variant,
37
- size,
38
- className
39
- })),
40
- ...props
43
+ size
44
+ }), className),
45
+ ...props,
46
+ children: asChild ? children : /* @__PURE__ */ jsxs(Fragment, { children: [loading ? /* @__PURE__ */ jsx("span", {
47
+ "aria-hidden": "true",
48
+ className: "size-3.5 animate-spin rounded-full border-2 border-current border-r-transparent opacity-70"
49
+ }) : null, children] })
41
50
  });
42
51
  }
43
52
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"button.js","names":[],"sources":["../../src/components/button.tsx"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\nimport { Slot } from 'radix-ui';\nimport * as React from 'react';\n\nimport { cn } from '../lib/utils';\n\nconst buttonVariants = cva(\n \"inline-flex shrink-0 items-center justify-center gap-2 rounded-md text-sm font-medium whitespace-nowrap transition-[color,background-color,border-color,box-shadow] outline-none select-none focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n variant: {\n default: 'bg-primary text-primary-foreground shadow-xs hover:bg-primary/90',\n destructive:\n 'bg-destructive text-destructive-foreground shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/30',\n outline:\n 'border border-input bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/20 dark:hover:bg-input/40',\n secondary: 'bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80',\n ghost: 'hover:bg-accent hover:text-accent-foreground',\n link: 'text-brand underline-offset-4 hover:underline',\n },\n size: {\n default: 'h-9 px-4 py-2 has-[>svg]:px-3',\n sm: 'h-8 gap-1.5 rounded-md px-3 text-[13px] has-[>svg]:px-2.5',\n lg: 'h-10 rounded-md px-6 has-[>svg]:px-4',\n icon: 'size-9',\n 'icon-sm': 'size-8',\n 'icon-lg': 'size-10',\n },\n },\n defaultVariants: { variant: 'default', size: 'default' },\n },\n);\n\nexport interface ButtonProps\n extends React.ComponentProps<'button'>, VariantProps<typeof buttonVariants> {\n /** Render the child element instead of a <button>, merging props onto it (e.g. a router link). */\n asChild?: boolean;\n}\n\nfunction Button({ className, variant, size, asChild = false, ...props }: ButtonProps) {\n const Comp = asChild ? Slot.Root : 'button';\n return (\n <Comp\n data-slot=\"button\"\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n );\n}\n\nexport { Button, buttonVariants };\n"],"mappings":";;;;;;AAMA,IAAM,iBAAiB,IACrB,wbACA;CACE,UAAU;EACR,SAAS;GACP,SAAS;GACT,aACE;GACF,SACE;GACF,WAAW;GACX,OAAO;GACP,MAAM;EACR;EACA,MAAM;GACJ,SAAS;GACT,IAAI;GACJ,IAAI;GACJ,MAAM;GACN,WAAW;GACX,WAAW;EACb;CACF;CACA,iBAAiB;EAAE,SAAS;EAAW,MAAM;CAAU;AACzD,CACF;AAQA,SAAS,OAAO,EAAE,WAAW,SAAS,MAAM,UAAU,OAAO,GAAG,SAAsB;CACpF,MAAM,OAAO,UAAU,KAAK,OAAO;CACnC,OACE,oBAAC,MAAD;EACE,aAAU;EACV,WAAW,GAAG,eAAe;GAAE;GAAS;GAAM;EAAU,CAAC,CAAC;EAC1D,GAAI;CACL,CAAA;AAEL"}
1
+ {"version":3,"file":"button.js","names":["_Fragment"],"sources":["../../src/components/button.tsx"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\nimport { Slot } from 'radix-ui';\nimport * as React from 'react';\n\nimport { cn } from '../lib/utils';\n\nconst buttonVariants = cva(\n \"inline-flex shrink-0 items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-semibold tracking-[-0.01em] outline-none transition-[background-color,border-color,color,box-shadow,transform] duration-150 select-none focus-visible:ring-[3px] focus-visible:ring-ring/20 active:translate-y-px disabled:pointer-events-none disabled:opacity-45 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n variant: {\n default:\n 'border border-primary bg-primary text-primary-foreground shadow-xs hover:border-brand-hover hover:bg-brand-hover',\n brand:\n 'border border-brand bg-brand text-white shadow-[0_1px_2px_rgb(68_8_94_/_0.18)] hover:border-brand-hover hover:bg-brand-hover',\n soft: 'border border-brand/15 bg-brand-soft text-brand-soft-foreground hover:bg-brand/15',\n secondary:\n 'border border-border bg-secondary text-secondary-foreground shadow-xs hover:border-border-strong hover:bg-muted',\n outline:\n 'border border-border-strong bg-surface text-foreground shadow-xs hover:border-brand/35 hover:bg-accent/60 hover:text-accent-foreground',\n ghost: 'border border-transparent text-foreground hover:bg-muted',\n destructive:\n 'border border-destructive bg-destructive text-destructive-foreground shadow-xs hover:bg-destructive/90',\n link: 'h-auto rounded-none border-0 p-0 text-brand shadow-none hover:text-brand-hover hover:underline hover:underline-offset-4 active:translate-y-0',\n },\n size: {\n xs: 'h-7 gap-1.5 rounded-sm px-2.5 text-xs [&_svg:not([class*=size-])]:size-3.5',\n sm: 'h-8 px-3 text-[13px]',\n default: 'h-9 px-3.5',\n lg: 'h-10 rounded-lg px-4 text-[15px]',\n icon: 'size-9 px-0',\n 'icon-sm': 'size-8 px-0',\n 'icon-lg': 'size-10 rounded-lg px-0',\n },\n },\n defaultVariants: { variant: 'default', size: 'default' },\n },\n);\n\nexport interface ButtonProps\n extends React.ComponentProps<'button'>, VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n loading?: boolean;\n}\n\nfunction Button({\n className,\n variant,\n size,\n asChild = false,\n loading = false,\n disabled,\n children,\n ...props\n}: ButtonProps) {\n const Comp = asChild ? Slot.Root : 'button';\n\n return (\n <Comp\n data-slot=\"button\"\n data-loading={loading ? '' : undefined}\n aria-busy={loading || undefined}\n disabled={!asChild ? disabled || loading : undefined}\n className={cn(buttonVariants({ variant, size }), className)}\n {...props}\n >\n {asChild ? (\n // Slot needs exactly one child to merge onto, so no spinner here.\n children\n ) : (\n <>\n {loading ? (\n <span\n aria-hidden=\"true\"\n className=\"size-3.5 animate-spin rounded-full border-2 border-current border-r-transparent opacity-70\"\n />\n ) : null}\n {children}\n </>\n )}\n </Comp>\n );\n}\n\nexport { Button, buttonVariants };\n"],"mappings":";;;;;;AAMA,IAAM,iBAAiB,IACrB,ybACA;CACE,UAAU;EACR,SAAS;GACP,SACE;GACF,OACE;GACF,MAAM;GACN,WACE;GACF,SACE;GACF,OAAO;GACP,aACE;GACF,MAAM;EACR;EACA,MAAM;GACJ,IAAI;GACJ,IAAI;GACJ,SAAS;GACT,IAAI;GACJ,MAAM;GACN,WAAW;GACX,WAAW;EACb;CACF;CACA,iBAAiB;EAAE,SAAS;EAAW,MAAM;CAAU;AACzD,CACF;AAQA,SAAS,OAAO,EACd,WACA,SACA,MACA,UAAU,OACV,UAAU,OACV,UACA,UACA,GAAG,SACW;CACd,MAAM,OAAO,UAAU,KAAK,OAAO;CAEnC,OACE,oBAAC,MAAD;EACE,aAAU;EACV,gBAAc,UAAU,KAAK,KAAA;EAC7B,aAAW,WAAW,KAAA;EACtB,UAAU,CAAC,UAAU,YAAY,UAAU,KAAA;EAC3C,WAAW,GAAG,eAAe;GAAE;GAAS;EAAK,CAAC,GAAG,SAAS;EAC1D,GAAI;EAEH,UAAA,UAEC,WAEA,qBAAAA,UAAA,EAAA,UAAA,CACG,UACC,oBAAC,QAAD;GACE,eAAY;GACZ,WAAU;EACX,CAAA,IACC,MACH,QACD,EAAA,CAAA;CAEA,CAAA;AAEV"}
@@ -1,9 +1,17 @@
1
+ import { type VariantProps } from 'class-variance-authority';
1
2
  import * as React from 'react';
2
- declare function Card({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
3
+ declare const cardVariants: (props?: ({
4
+ variant?: "default" | "raised" | "subtle" | "interactive" | "terminal" | null | undefined;
5
+ density?: "default" | "compact" | "roomy" | null | undefined;
6
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
7
+ export interface CardProps extends React.ComponentProps<'div'>, VariantProps<typeof cardVariants> {
8
+ }
9
+ declare function Card({ className, variant, density, ...props }: CardProps): React.JSX.Element;
3
10
  declare function CardHeader({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
11
+ declare function CardEyebrow({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
4
12
  declare function CardTitle({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
5
13
  declare function CardDescription({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
6
14
  declare function CardAction({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
7
15
  declare function CardContent({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
8
16
  declare function CardFooter({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
9
- export { Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle };
17
+ export { Card, CardAction, CardContent, CardDescription, CardEyebrow, CardFooter, CardHeader, CardTitle, cardVariants, };
@@ -1,57 +1,88 @@
1
1
  import { cn } from "../lib/utils.js";
2
2
  import "react";
3
3
  import { jsx } from "react/jsx-runtime";
4
+ import { cva } from "class-variance-authority";
4
5
  //#region src/components/card.tsx
5
- function Card({ className, ...props }) {
6
+ var cardVariants = cva("group/card relative flex flex-col overflow-hidden rounded-lg border text-card-foreground transition-[border-color,background-color,box-shadow,transform] duration-150", {
7
+ variants: {
8
+ variant: {
9
+ default: "border-border bg-card shadow-xs",
10
+ raised: "border-border bg-surface-raised shadow-md",
11
+ subtle: "border-border/70 bg-surface-muted shadow-none",
12
+ interactive: "border-border bg-card shadow-xs hover:-translate-y-0.5 hover:border-brand/30 hover:shadow-md",
13
+ terminal: "border-border-strong bg-code text-code-foreground shadow-md"
14
+ },
15
+ density: {
16
+ compact: "[&_[data-slot=card-header]]:p-4 [&_[data-slot=card-content]]:px-4 [&_[data-slot=card-footer]]:p-4",
17
+ default: "[&_[data-slot=card-header]]:p-5 [&_[data-slot=card-content]]:px-5 [&_[data-slot=card-footer]]:p-5",
18
+ roomy: "[&_[data-slot=card-header]]:p-6 [&_[data-slot=card-content]]:px-6 [&_[data-slot=card-footer]]:p-6"
19
+ }
20
+ },
21
+ defaultVariants: {
22
+ variant: "default",
23
+ density: "default"
24
+ }
25
+ });
26
+ function Card({ className, variant, density, ...props }) {
6
27
  return /* @__PURE__ */ jsx("div", {
7
28
  "data-slot": "card",
8
- className: cn("flex flex-col gap-6 rounded-xl border bg-card py-6 text-card-foreground shadow-sm", className),
29
+ className: cn(cardVariants({
30
+ variant,
31
+ density
32
+ }), className),
9
33
  ...props
10
34
  });
11
35
  }
12
36
  function CardHeader({ className, ...props }) {
13
37
  return /* @__PURE__ */ jsx("div", {
14
38
  "data-slot": "card-header",
15
- className: cn("grid auto-rows-min grid-rows-[auto_auto] items-start gap-1.5 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto]", className),
39
+ className: cn("grid grid-cols-[1fr_auto] items-start gap-x-4 gap-y-1 border-b border-transparent pb-3", className),
40
+ ...props
41
+ });
42
+ }
43
+ function CardEyebrow({ className, ...props }) {
44
+ return /* @__PURE__ */ jsx("div", {
45
+ "data-slot": "card-eyebrow",
46
+ className: cn("col-span-full mb-0.5 text-[11px] font-semibold tracking-[0.12em] text-muted-foreground uppercase", className),
16
47
  ...props
17
48
  });
18
49
  }
19
50
  function CardTitle({ className, ...props }) {
20
51
  return /* @__PURE__ */ jsx("div", {
21
52
  "data-slot": "card-title",
22
- className: cn("leading-none font-semibold tracking-tight", className),
53
+ className: cn("min-w-0 text-sm font-semibold tracking-[-0.015em]", className),
23
54
  ...props
24
55
  });
25
56
  }
26
57
  function CardDescription({ className, ...props }) {
27
58
  return /* @__PURE__ */ jsx("div", {
28
59
  "data-slot": "card-description",
29
- className: cn("text-sm text-muted-foreground", className),
60
+ className: cn("col-start-1 text-sm leading-5 text-muted-foreground", className),
30
61
  ...props
31
62
  });
32
63
  }
33
64
  function CardAction({ className, ...props }) {
34
65
  return /* @__PURE__ */ jsx("div", {
35
66
  "data-slot": "card-action",
36
- className: cn("col-start-2 row-span-2 row-start-1 self-start justify-self-end", className),
67
+ className: cn("col-start-2 row-span-2 row-start-1 self-start", className),
37
68
  ...props
38
69
  });
39
70
  }
40
71
  function CardContent({ className, ...props }) {
41
72
  return /* @__PURE__ */ jsx("div", {
42
73
  "data-slot": "card-content",
43
- className: cn("px-6", className),
74
+ className: cn("pb-5", className),
44
75
  ...props
45
76
  });
46
77
  }
47
78
  function CardFooter({ className, ...props }) {
48
79
  return /* @__PURE__ */ jsx("div", {
49
80
  "data-slot": "card-footer",
50
- className: cn("flex items-center px-6 [.border-t]:pt-6", className),
81
+ className: cn("mt-auto flex items-center gap-2 border-t pt-4", className),
51
82
  ...props
52
83
  });
53
84
  }
54
85
  //#endregion
55
- export { Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle };
86
+ export { Card, CardAction, CardContent, CardDescription, CardEyebrow, CardFooter, CardHeader, CardTitle, cardVariants };
56
87
 
57
88
  //# sourceMappingURL=card.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"card.js","names":[],"sources":["../../src/components/card.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { cn } from '../lib/utils';\n\nfunction Card({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"card\"\n className={cn(\n 'flex flex-col gap-6 rounded-xl border bg-card py-6 text-card-foreground shadow-sm',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction CardHeader({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"card-header\"\n className={cn(\n 'grid auto-rows-min grid-rows-[auto_auto] items-start gap-1.5 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto]',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction CardTitle({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"card-title\"\n className={cn('leading-none font-semibold tracking-tight', className)}\n {...props}\n />\n );\n}\n\nfunction CardDescription({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"card-description\"\n className={cn('text-sm text-muted-foreground', className)}\n {...props}\n />\n );\n}\n\nfunction CardAction({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"card-action\"\n className={cn('col-start-2 row-span-2 row-start-1 self-start justify-self-end', className)}\n {...props}\n />\n );\n}\n\nfunction CardContent({ className, ...props }: React.ComponentProps<'div'>) {\n return <div data-slot=\"card-content\" className={cn('px-6', className)} {...props} />;\n}\n\nfunction CardFooter({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"card-footer\"\n className={cn('flex items-center px-6 [.border-t]:pt-6', className)}\n {...props}\n />\n );\n}\n\nexport { Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle };\n"],"mappings":";;;;AAIA,SAAS,KAAK,EAAE,WAAW,GAAG,SAAsC;CAClE,OACE,oBAAC,OAAD;EACE,aAAU;EACV,WAAW,GACT,qFACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,WAAW,EAAE,WAAW,GAAG,SAAsC;CACxE,OACE,oBAAC,OAAD;EACE,aAAU;EACV,WAAW,GACT,sHACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,UAAU,EAAE,WAAW,GAAG,SAAsC;CACvE,OACE,oBAAC,OAAD;EACE,aAAU;EACV,WAAW,GAAG,6CAA6C,SAAS;EACpE,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,gBAAgB,EAAE,WAAW,GAAG,SAAsC;CAC7E,OACE,oBAAC,OAAD;EACE,aAAU;EACV,WAAW,GAAG,iCAAiC,SAAS;EACxD,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,WAAW,EAAE,WAAW,GAAG,SAAsC;CACxE,OACE,oBAAC,OAAD;EACE,aAAU;EACV,WAAW,GAAG,kEAAkE,SAAS;EACzF,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,YAAY,EAAE,WAAW,GAAG,SAAsC;CACzE,OAAO,oBAAC,OAAD;EAAK,aAAU;EAAe,WAAW,GAAG,QAAQ,SAAS;EAAG,GAAI;CAAQ,CAAA;AACrF;AAEA,SAAS,WAAW,EAAE,WAAW,GAAG,SAAsC;CACxE,OACE,oBAAC,OAAD;EACE,aAAU;EACV,WAAW,GAAG,2CAA2C,SAAS;EAClE,GAAI;CACL,CAAA;AAEL"}
1
+ {"version":3,"file":"card.js","names":[],"sources":["../../src/components/card.tsx"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\nimport * as React from 'react';\n\nimport { cn } from '../lib/utils';\n\nconst cardVariants = cva(\n 'group/card relative flex flex-col overflow-hidden rounded-lg border text-card-foreground transition-[border-color,background-color,box-shadow,transform] duration-150',\n {\n variants: {\n variant: {\n default: 'border-border bg-card shadow-xs',\n raised: 'border-border bg-surface-raised shadow-md',\n subtle: 'border-border/70 bg-surface-muted shadow-none',\n interactive:\n 'border-border bg-card shadow-xs hover:-translate-y-0.5 hover:border-brand/30 hover:shadow-md',\n terminal: 'border-border-strong bg-code text-code-foreground shadow-md',\n },\n density: {\n compact:\n '[&_[data-slot=card-header]]:p-4 [&_[data-slot=card-content]]:px-4 [&_[data-slot=card-footer]]:p-4',\n default:\n '[&_[data-slot=card-header]]:p-5 [&_[data-slot=card-content]]:px-5 [&_[data-slot=card-footer]]:p-5',\n roomy:\n '[&_[data-slot=card-header]]:p-6 [&_[data-slot=card-content]]:px-6 [&_[data-slot=card-footer]]:p-6',\n },\n },\n defaultVariants: { variant: 'default', density: 'default' },\n },\n);\n\nexport interface CardProps extends React.ComponentProps<'div'>, VariantProps<typeof cardVariants> {}\n\nfunction Card({ className, variant, density, ...props }: CardProps) {\n return (\n <div\n data-slot=\"card\"\n className={cn(cardVariants({ variant, density }), className)}\n {...props}\n />\n );\n}\n\nfunction CardHeader({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"card-header\"\n className={cn(\n 'grid grid-cols-[1fr_auto] items-start gap-x-4 gap-y-1 border-b border-transparent pb-3',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction CardEyebrow({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"card-eyebrow\"\n className={cn(\n 'col-span-full mb-0.5 text-[11px] font-semibold tracking-[0.12em] text-muted-foreground uppercase',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction CardTitle({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"card-title\"\n className={cn('min-w-0 text-sm font-semibold tracking-[-0.015em]', className)}\n {...props}\n />\n );\n}\n\nfunction CardDescription({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"card-description\"\n className={cn('col-start-1 text-sm leading-5 text-muted-foreground', className)}\n {...props}\n />\n );\n}\n\nfunction CardAction({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"card-action\"\n className={cn('col-start-2 row-span-2 row-start-1 self-start', className)}\n {...props}\n />\n );\n}\n\nfunction CardContent({ className, ...props }: React.ComponentProps<'div'>) {\n return <div data-slot=\"card-content\" className={cn('pb-5', className)} {...props} />;\n}\n\nfunction CardFooter({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"card-footer\"\n className={cn('mt-auto flex items-center gap-2 border-t pt-4', className)}\n {...props}\n />\n );\n}\n\nexport {\n Card,\n CardAction,\n CardContent,\n CardDescription,\n CardEyebrow,\n CardFooter,\n CardHeader,\n CardTitle,\n cardVariants,\n};\n"],"mappings":";;;;;AAKA,IAAM,eAAe,IACnB,yKACA;CACE,UAAU;EACR,SAAS;GACP,SAAS;GACT,QAAQ;GACR,QAAQ;GACR,aACE;GACF,UAAU;EACZ;EACA,SAAS;GACP,SACE;GACF,SACE;GACF,OACE;EACJ;CACF;CACA,iBAAiB;EAAE,SAAS;EAAW,SAAS;CAAU;AAC5D,CACF;AAIA,SAAS,KAAK,EAAE,WAAW,SAAS,SAAS,GAAG,SAAoB;CAClE,OACE,oBAAC,OAAD;EACE,aAAU;EACV,WAAW,GAAG,aAAa;GAAE;GAAS;EAAQ,CAAC,GAAG,SAAS;EAC3D,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,WAAW,EAAE,WAAW,GAAG,SAAsC;CACxE,OACE,oBAAC,OAAD;EACE,aAAU;EACV,WAAW,GACT,0FACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,YAAY,EAAE,WAAW,GAAG,SAAsC;CACzE,OACE,oBAAC,OAAD;EACE,aAAU;EACV,WAAW,GACT,oGACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,UAAU,EAAE,WAAW,GAAG,SAAsC;CACvE,OACE,oBAAC,OAAD;EACE,aAAU;EACV,WAAW,GAAG,qDAAqD,SAAS;EAC5E,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,gBAAgB,EAAE,WAAW,GAAG,SAAsC;CAC7E,OACE,oBAAC,OAAD;EACE,aAAU;EACV,WAAW,GAAG,uDAAuD,SAAS;EAC9E,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,WAAW,EAAE,WAAW,GAAG,SAAsC;CACxE,OACE,oBAAC,OAAD;EACE,aAAU;EACV,WAAW,GAAG,iDAAiD,SAAS;EACxE,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,YAAY,EAAE,WAAW,GAAG,SAAsC;CACzE,OAAO,oBAAC,OAAD;EAAK,aAAU;EAAe,WAAW,GAAG,QAAQ,SAAS;EAAG,GAAI;CAAQ,CAAA;AACrF;AAEA,SAAS,WAAW,EAAE,WAAW,GAAG,SAAsC;CACxE,OACE,oBAAC,OAAD;EACE,aAAU;EACV,WAAW,GAAG,iDAAiD,SAAS;EACxE,GAAI;CACL,CAAA;AAEL"}
@@ -7,7 +7,7 @@ import Check from "@burtson-labs/icons/react/check";
7
7
  function Checkbox$1({ className, ...props }) {
8
8
  return /* @__PURE__ */ jsx(Checkbox.Root, {
9
9
  "data-slot": "checkbox",
10
- className: cn("peer size-4 shrink-0 rounded-[4px] border border-input shadow-xs transition-shadow outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive data-[state=checked]:border-primary data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground dark:bg-input/20", className),
10
+ className: cn("peer size-4 shrink-0 rounded-xs border border-border-strong bg-surface shadow-xs transition-[border-color,box-shadow] outline-none hover:border-brand/50 focus-visible:ring-[3px] focus-visible:ring-ring/20 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive data-[state=checked]:border-primary data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground", className),
11
11
  ...props,
12
12
  children: /* @__PURE__ */ jsx(Checkbox.Indicator, {
13
13
  "data-slot": "checkbox-indicator",
@@ -1 +1 @@
1
- {"version":3,"file":"checkbox.js","names":["Checkbox","CheckboxPrimitive"],"sources":["../../src/components/checkbox.tsx"],"sourcesContent":["import Check from '@burtson-labs/icons/react/check';\nimport { Checkbox as CheckboxPrimitive } from 'radix-ui';\nimport * as React from 'react';\n\nimport { cn } from '../lib/utils';\n\nfunction Checkbox({ className, ...props }: React.ComponentProps<typeof CheckboxPrimitive.Root>) {\n return (\n <CheckboxPrimitive.Root\n data-slot=\"checkbox\"\n className={cn(\n 'peer size-4 shrink-0 rounded-[4px] border border-input shadow-xs transition-shadow outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive data-[state=checked]:border-primary data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground dark:bg-input/20',\n className,\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator\n data-slot=\"checkbox-indicator\"\n className=\"grid place-content-center text-current\"\n >\n <Check className=\"size-3.5\" strokeWidth={2.5} aria-hidden />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n );\n}\n\nexport { Checkbox };\n"],"mappings":";;;;;;AAMA,SAASA,WAAS,EAAE,WAAW,GAAG,SAA8D;CAC9F,OACE,oBAACC,SAAkB,MAAnB;EACE,aAAU;EACV,WAAW,GACT,yWACA,SACF;EACA,GAAI;EAEJ,UAAA,oBAACA,SAAkB,WAAnB;GACE,aAAU;GACV,WAAU;GAEV,UAAA,oBAAC,OAAD;IAAO,WAAU;IAAW,aAAa;IAAK,eAAA;GAAa,CAAA;EAChC,CAAA;CACP,CAAA;AAE5B"}
1
+ {"version":3,"file":"checkbox.js","names":["Checkbox","CheckboxPrimitive"],"sources":["../../src/components/checkbox.tsx"],"sourcesContent":["import Check from '@burtson-labs/icons/react/check';\nimport { Checkbox as CheckboxPrimitive } from 'radix-ui';\nimport * as React from 'react';\n\nimport { cn } from '../lib/utils';\n\nfunction Checkbox({ className, ...props }: React.ComponentProps<typeof CheckboxPrimitive.Root>) {\n return (\n <CheckboxPrimitive.Root\n data-slot=\"checkbox\"\n className={cn(\n 'peer size-4 shrink-0 rounded-xs border border-border-strong bg-surface shadow-xs transition-[border-color,box-shadow] outline-none hover:border-brand/50 focus-visible:ring-[3px] focus-visible:ring-ring/20 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive data-[state=checked]:border-primary data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground',\n className,\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator\n data-slot=\"checkbox-indicator\"\n className=\"grid place-content-center text-current\"\n >\n <Check className=\"size-3.5\" strokeWidth={2.5} aria-hidden />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n );\n}\n\nexport { Checkbox };\n"],"mappings":";;;;;;AAMA,SAASA,WAAS,EAAE,WAAW,GAAG,SAA8D;CAC9F,OACE,oBAACC,SAAkB,MAAnB;EACE,aAAU;EACV,WAAW,GACT,iZACA,SACF;EACA,GAAI;EAEJ,UAAA,oBAACA,SAAkB,WAAnB;GACE,aAAU;GACV,WAAU;GAEV,UAAA,oBAAC,OAAD;IAAO,WAAU;IAAW,aAAa;IAAK,eAAA;GAAa,CAAA;EAChC,CAAA;CACP,CAAA;AAE5B"}
@@ -8,7 +8,7 @@ import { Command } from "cmdk";
8
8
  function Command$1({ className, ...props }) {
9
9
  return /* @__PURE__ */ jsx(Command, {
10
10
  "data-slot": "command",
11
- className: cn("flex h-full w-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground", className),
11
+ className: cn("flex h-full w-full flex-col overflow-hidden rounded-lg bg-surface-raised text-popover-foreground", className),
12
12
  ...props
13
13
  });
14
14
  }
@@ -17,7 +17,7 @@ function CommandDialog({ title = "Command palette", description = "Search for a
17
17
  return /* @__PURE__ */ jsx(Dialog, {
18
18
  ...props,
19
19
  children: /* @__PURE__ */ jsxs(DialogContent, {
20
- className: cn("top-[20%] translate-y-0 overflow-hidden p-0 sm:max-w-xl", className),
20
+ className: cn("top-[20%] translate-y-0 gap-0 overflow-hidden p-0 sm:max-w-xl sm:p-0", className),
21
21
  showCloseButton: false,
22
22
  children: [/* @__PURE__ */ jsxs(DialogHeader, {
23
23
  className: "sr-only",
@@ -74,14 +74,14 @@ function CommandSeparator({ className, ...props }) {
74
74
  function CommandItem({ className, ...props }) {
75
75
  return /* @__PURE__ */ jsx(Command.Item, {
76
76
  "data-slot": "command-item",
77
- className: cn("relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground", className),
77
+ className: cn("relative flex min-h-8 cursor-default items-center gap-2 rounded-sm px-2 text-[13px] outline-hidden select-none data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 data-[selected=true]:bg-muted data-[selected=true]:text-foreground data-[selected=true]:shadow-[inset_2px_0_0_var(--color-brand)] [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground", className),
78
78
  ...props
79
79
  });
80
80
  }
81
81
  function CommandShortcut({ className, ...props }) {
82
82
  return /* @__PURE__ */ jsx("span", {
83
83
  "data-slot": "command-shortcut",
84
- className: cn("ml-auto text-xs tracking-widest text-muted-foreground", className),
84
+ className: cn("ml-auto rounded-xs border border-border bg-surface-muted px-1.5 font-mono text-[11px] leading-5 text-muted-foreground", className),
85
85
  ...props
86
86
  });
87
87
  }