@epilot/spark-ui 1.0.0-alpha.7 → 1.0.0-alpha.9

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 (153) hide show
  1. package/dist/components/badge.cjs +2 -2
  2. package/dist/components/badge.cjs.map +1 -1
  3. package/dist/components/badge.d.ts +1 -1
  4. package/dist/components/badge.js +1 -1
  5. package/dist/components/battery-progress-row.d.cts +1 -1
  6. package/dist/components/battery-progress-row.d.ts +1 -1
  7. package/dist/components/bubble.d.cts +1 -1
  8. package/dist/components/bubble.d.ts +1 -1
  9. package/dist/components/button.cjs +5 -4
  10. package/dist/components/button.cjs.map +1 -1
  11. package/dist/components/button.d.cts +4 -17
  12. package/dist/components/button.d.ts +5 -18
  13. package/dist/components/button.js +5 -4
  14. package/dist/components/button.js.map +1 -1
  15. package/dist/components/callout.cjs +4 -4
  16. package/dist/components/callout.cjs.map +1 -1
  17. package/dist/components/callout.d.cts +6 -1
  18. package/dist/components/callout.d.ts +6 -1
  19. package/dist/components/callout.js +4 -4
  20. package/dist/components/callout.js.map +1 -1
  21. package/dist/components/card.cjs +25 -11
  22. package/dist/components/card.cjs.map +1 -1
  23. package/dist/components/card.d.cts +6 -0
  24. package/dist/components/card.d.ts +7 -1
  25. package/dist/components/card.js +25 -11
  26. package/dist/components/card.js.map +1 -1
  27. package/dist/components/checkbox.cjs +2 -2
  28. package/dist/components/checkbox.cjs.map +1 -1
  29. package/dist/components/checkbox.d.ts +1 -1
  30. package/dist/components/checkbox.js +1 -1
  31. package/dist/components/circular-gauge.d.cts +1 -1
  32. package/dist/components/circular-gauge.d.ts +1 -1
  33. package/dist/components/device-card.d.cts +1 -1
  34. package/dist/components/device-card.d.ts +1 -1
  35. package/dist/components/empty-state.cjs +9 -2
  36. package/dist/components/empty-state.cjs.map +1 -1
  37. package/dist/components/empty-state.d.cts +8 -2
  38. package/dist/components/empty-state.d.ts +8 -2
  39. package/dist/components/empty-state.js +10 -2
  40. package/dist/components/empty-state.js.map +1 -1
  41. package/dist/components/energy-bar-chart.d.cts +1 -1
  42. package/dist/components/energy-bar-chart.d.ts +1 -1
  43. package/dist/components/feed-in-hero.d.cts +1 -1
  44. package/dist/components/feed-in-hero.d.ts +1 -1
  45. package/dist/components/field.cjs +3 -3
  46. package/dist/components/field.cjs.map +1 -1
  47. package/dist/components/field.d.ts +1 -1
  48. package/dist/components/field.js +1 -1
  49. package/dist/components/info-block.d.cts +1 -1
  50. package/dist/components/info-block.d.ts +1 -1
  51. package/dist/components/input-group.cjs +2 -2
  52. package/dist/components/input-group.cjs.map +1 -1
  53. package/dist/components/input-group.d.cts +1 -1
  54. package/dist/components/input-group.d.ts +1 -1
  55. package/dist/components/input-group.js +1 -1
  56. package/dist/components/input-otp.cjs +10 -10
  57. package/dist/components/input-otp.cjs.map +1 -1
  58. package/dist/components/input-otp.js +1 -1
  59. package/dist/components/input.cjs +10 -10
  60. package/dist/components/input.cjs.map +1 -1
  61. package/dist/components/input.d.ts +1 -1
  62. package/dist/components/input.js +1 -1
  63. package/dist/components/marker.d.cts +1 -1
  64. package/dist/components/marker.d.ts +1 -1
  65. package/dist/components/message-scroller.cjs +1 -1
  66. package/dist/components/message-scroller.cjs.map +1 -1
  67. package/dist/components/message-scroller.js +1 -1
  68. package/dist/components/message-scroller.js.map +1 -1
  69. package/dist/components/metering-row.d.cts +1 -1
  70. package/dist/components/metering-row.d.ts +1 -1
  71. package/dist/components/number-flow.d.cts +1 -1
  72. package/dist/components/number-flow.d.ts +1 -1
  73. package/dist/components/page-header.d.cts +1 -1
  74. package/dist/components/page-header.d.ts +1 -1
  75. package/dist/components/radio.cjs +3 -3
  76. package/dist/components/radio.cjs.map +1 -1
  77. package/dist/components/radio.d.ts +1 -1
  78. package/dist/components/radio.js +1 -1
  79. package/dist/components/sankey-chart.d.cts +1 -1
  80. package/dist/components/sankey-chart.d.ts +1 -1
  81. package/dist/components/segmented-control.d.ts +1 -1
  82. package/dist/components/select.cjs +2 -2
  83. package/dist/components/select.cjs.map +1 -1
  84. package/dist/components/select.d.ts +1 -1
  85. package/dist/components/select.js +1 -1
  86. package/dist/components/switch.cjs +2 -2
  87. package/dist/components/switch.cjs.map +1 -1
  88. package/dist/components/switch.d.ts +1 -1
  89. package/dist/components/switch.js +1 -1
  90. package/dist/components/theme.cjs +119 -3
  91. package/dist/components/theme.cjs.map +1 -0
  92. package/dist/components/theme.d.cts +1 -3
  93. package/dist/components/theme.d.ts +2 -4
  94. package/dist/components/theme.js +115 -1
  95. package/dist/components/theme.js.map +1 -0
  96. package/dist/components/toast.cjs +158 -65
  97. package/dist/components/toast.cjs.map +1 -1
  98. package/dist/components/toast.d.cts +51 -9
  99. package/dist/components/toast.d.ts +51 -9
  100. package/dist/components/toast.js +158 -65
  101. package/dist/components/toast.js.map +1 -1
  102. package/dist/components/tooltip.cjs +1 -1
  103. package/dist/components/tooltip.cjs.map +1 -1
  104. package/dist/components/tooltip.js +1 -1
  105. package/dist/components/tooltip.js.map +1 -1
  106. package/dist/generate-radix-colors-BW09KT9m.d.ts +33 -0
  107. package/dist/generate-radix-colors-C5mWRWnQ.d.cts +33 -0
  108. package/dist/{accent-colors-CjHCf8fH.cjs → lib/accent-colors.cjs} +3 -7
  109. package/dist/lib/accent-colors.cjs.map +1 -0
  110. package/dist/lib/accent-colors.d.cts +8 -0
  111. package/dist/lib/accent-colors.d.ts +8 -0
  112. package/dist/{accent-colors-Ch2J0EEY.js → lib/accent-colors.js} +2 -2
  113. package/dist/lib/accent-colors.js.map +1 -0
  114. package/dist/lib/accent-theme.cjs +130 -0
  115. package/dist/lib/accent-theme.cjs.map +1 -0
  116. package/dist/lib/accent-theme.d.cts +35 -0
  117. package/dist/lib/accent-theme.d.ts +35 -0
  118. package/dist/lib/accent-theme.js +122 -0
  119. package/dist/lib/accent-theme.js.map +1 -0
  120. package/dist/{theme-ClRJhexF.cjs → lib/generate-radix-colors.cjs} +12 -240
  121. package/dist/lib/generate-radix-colors.cjs.map +1 -0
  122. package/dist/lib/generate-radix-colors.d.cts +4 -0
  123. package/dist/lib/generate-radix-colors.d.ts +4 -0
  124. package/dist/{theme-8PDO9E0S.js → lib/generate-radix-colors.js} +8 -225
  125. package/dist/lib/generate-radix-colors.js.map +1 -0
  126. package/dist/{input-box-variants-ZCtgs-1S.cjs → lib/input-box-variants.cjs} +5 -14
  127. package/dist/lib/input-box-variants.cjs.map +1 -0
  128. package/dist/lib/input-box-variants.d.cts +10 -0
  129. package/dist/lib/input-box-variants.d.ts +10 -0
  130. package/dist/{input-box-variants-DcajYXvo.js → lib/input-box-variants.js} +3 -3
  131. package/dist/lib/input-box-variants.js.map +1 -0
  132. package/dist/lib/theme-types.cjs +1 -0
  133. package/dist/lib/theme-types.d.cts +4 -0
  134. package/dist/lib/theme-types.d.ts +4 -0
  135. package/dist/lib/theme-types.js +2 -0
  136. package/dist/lib/tones.cjs +14 -0
  137. package/dist/lib/tones.cjs.map +1 -0
  138. package/dist/{tones-PXJGlSpe.d.ts → lib/tones.d.cts} +2 -2
  139. package/dist/{tones-DjgKOX3s.d.cts → lib/tones.d.ts} +2 -2
  140. package/dist/lib/tones.js +13 -0
  141. package/dist/lib/tones.js.map +1 -0
  142. package/dist/{number-flow-DMJouddg.d.cts → number-flow-CVIvQhZn.d.cts} +1 -1
  143. package/dist/{number-flow-D9zsxH0-.d.ts → number-flow-DVUHTv9D.d.ts} +1 -1
  144. package/dist/styles/index.css +158 -0
  145. package/dist/styles/spark-default.css +1 -0
  146. package/dist/{theme-types-BDdoRxXa.d.ts → theme-types-BKlzRiyw.d.ts} +1 -1
  147. package/package.json +18 -3
  148. package/dist/accent-colors-Ch2J0EEY.js.map +0 -1
  149. package/dist/accent-colors-CjHCf8fH.cjs.map +0 -1
  150. package/dist/input-box-variants-DcajYXvo.js.map +0 -1
  151. package/dist/input-box-variants-ZCtgs-1S.cjs.map +0 -1
  152. package/dist/theme-8PDO9E0S.js.map +0 -1
  153. package/dist/theme-ClRJhexF.cjs.map +0 -1
@@ -3,26 +3,40 @@ import { cn } from "../utils/cn.js";
3
3
  import * as React$1 from "react";
4
4
  import { jsx, jsxs } from "react/jsx-runtime";
5
5
  import { cva } from "class-variance-authority";
6
+ import { useRender } from "@base-ui/react/use-render";
6
7
  //#region src/components/card.tsx
7
8
  const cardVariants = cva("relative flex w-full flex-col gap-1 rounded-2xl py-3", {
8
9
  variants: { variant: {
9
- ambient: "border-[length:var(--spark-card-border-width,0px)] border-[color:var(--spark-card-border,transparent)] bg-(--spark-card-bg,var(--neutral-a3)) px-[var(--spark-card-px,1rem)]",
10
+ ambient: "border-(length:--spark-card-border-width,0px) border-(--spark-card-border,transparent) bg-(--spark-card-bg,var(--neutral-a3)) px-(--spark-card-px,1rem)",
10
11
  soft: "bg-(--spark-card-c-soft,var(--neutral-a3)) px-4",
11
- surface: "border border-[color:var(--spark-card-c-border,var(--neutral-a6))] bg-(--spark-card-c-surface,var(--neutral-2)) px-4",
12
- outline: "border border-[color:var(--spark-card-c-border,var(--neutral-a6))] px-4",
12
+ surface: "border border-(--spark-card-c-border,var(--neutral-a6)) bg-(--spark-card-c-surface,var(--neutral-2)) px-4",
13
+ outline: "border border-(--spark-card-c-border,var(--neutral-a6)) px-4",
13
14
  ghost: "",
14
15
  solid: "bg-(--spark-card-c-solid,var(--neutral-9)) px-4 [--spark-card-fg-muted:var(--spark-card-c-contrast,var(--neutral-contrast))] [--spark-card-fg:var(--spark-card-c-contrast,var(--neutral-contrast))] [--spark-card-icon:var(--spark-card-c-contrast,var(--neutral-contrast))]"
15
16
  } },
16
17
  defaultVariants: { variant: "ambient" }
17
18
  });
18
- const Card = React$1.forwardRef(({ className, variant, color, ...props }, ref) => /* @__PURE__ */ jsx("div", {
19
- className: cn(cardVariants({ variant }), className),
20
- "data-slot": "card",
21
- "data-variant": variant,
22
- "data-card-color": color === "accent" ? "accent" : void 0,
23
- ref,
24
- ...props
25
- }));
19
+ const Card = React$1.forwardRef(({ className, variant, color, render, ...props }, ref) => {
20
+ const interactive = render != null;
21
+ const resolved = variant ?? "ambient";
22
+ return useRender({
23
+ defaultTagName: "div",
24
+ render,
25
+ props: {
26
+ "data-slot": "card",
27
+ "data-variant": variant,
28
+ "data-card-color": color === "accent" ? "accent" : void 0,
29
+ className: cn(cardVariants({ variant }), interactive && [
30
+ "cursor-pointer text-left no-underline transition-colors motion-reduce:transition-none",
31
+ "focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-hidden",
32
+ "disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50",
33
+ (resolved === "ambient" || resolved === "soft") && "hover:bg-(--spark-card-c-soft-hover,var(--neutral-a4))"
34
+ ], className),
35
+ ref,
36
+ ...props
37
+ }
38
+ });
39
+ });
26
40
  Card.displayName = "Card";
27
41
  const CardHeader = React$1.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx("div", {
28
42
  className: cn("flex items-center gap-4", className),
@@ -1 +1 @@
1
- {"version":3,"file":"card.js","names":["React"],"sources":["../../src/components/card.tsx"],"sourcesContent":["import { cva } from 'class-variance-authority'\nimport * as React from 'react'\nimport type { SparkCardColor, SparkCardVariant } from '../lib/theme-types'\nimport { cn } from '../utils/cn'\n\nconst cardVariants = cva(\n // Layout + constant VERTICAL padding + radius (rounded-2xl tracks the [data-radius]\n // knob). Chrome (bg/border) and HORIZONTAL padding live per-variant so `ghost` sits\n // flush. Container chrome ONLY (contract §11): reads/sets --spark-card-* — never\n // data-style or the --spark-* scale — so styling/colouring a card never repaints the\n // controls inside it.\n 'relative flex w-full flex-col gap-1 rounded-2xl py-3',\n {\n variants: {\n variant: {\n // Prop unset → follow the app-level [data-card-variant] knob; fallbacks == today's look.\n ambient:\n 'border-[length:var(--spark-card-border-width,0px)] border-[color:var(--spark-card-border,transparent)] bg-(--spark-card-bg,var(--neutral-a3)) px-[var(--spark-card-px,1rem)]',\n soft: 'bg-(--spark-card-c-soft,var(--neutral-a3)) px-4',\n surface:\n 'border border-[color:var(--spark-card-c-border,var(--neutral-a6))] bg-(--spark-card-c-surface,var(--neutral-2)) px-4',\n outline:\n 'border border-[color:var(--spark-card-c-border,var(--neutral-a6))] px-4',\n // no horizontal inset (no chrome to pad against); py-3 keeps the vertical rhythm.\n ghost: '',\n // HIDDEN: `SparkCardVariant` excludes `solid` for now (content-contrast TBD).\n // Recipe kept so re-enabling is only widening the type back to SparkStyle.\n solid:\n 'bg-(--spark-card-c-solid,var(--neutral-9)) px-4 [--spark-card-fg-muted:var(--spark-card-c-contrast,var(--neutral-contrast))] [--spark-card-fg:var(--spark-card-c-contrast,var(--neutral-contrast))] [--spark-card-icon:var(--spark-card-c-contrast,var(--neutral-contrast))]',\n },\n },\n defaultVariants: {\n variant: 'ambient',\n },\n },\n)\n\ninterface CardProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Container chrome scoped to this card — NOT the ambient `data-style` knob\n * (that drives controls and would cascade into the card's content). Unset →\n * follows the app-level `[data-card-variant]` knob (default soft-neutral).\n * (`solid` is hidden for now — see `SparkCardVariant`.)\n */\n variant?: SparkCardVariant\n /** Chrome palette. `neutral` (default) tracks the app neutral; `accent` tints with the brand accent. */\n color?: SparkCardColor\n}\n\nconst Card = React.forwardRef<HTMLDivElement, CardProps>(\n ({ className, variant, color, ...props }, ref) => (\n <div\n className={cn(cardVariants({ variant }), className)}\n data-slot=\"card\"\n data-variant={variant}\n data-card-color={color === 'accent' ? 'accent' : undefined}\n ref={ref}\n {...props}\n />\n ),\n)\n\nCard.displayName = 'Card'\n\nconst CardHeader = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n className={cn('flex items-center gap-4', className)}\n ref={ref}\n {...props}\n />\n))\n\nCardHeader.displayName = 'CardHeader'\n\nconst CardIcon = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n className={cn(\n 'flex shrink-0 items-center justify-center text-(--spark-card-icon,var(--spark-a11))',\n className,\n )}\n ref={ref}\n {...props}\n />\n))\n\nCardIcon.displayName = 'CardIcon'\n\nconst CardTitle = React.forwardRef<\n HTMLHeadingElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n <h3\n className={cn(\n 'text-base leading-5 font-medium text-(--spark-card-fg,var(--neutral-a12))',\n className,\n )}\n ref={ref}\n {...props}\n />\n))\n\nCardTitle.displayName = 'CardTitle'\n\nconst CardDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n className={cn(\n 'text-sm leading-5 text-(--spark-card-fg-muted,var(--neutral-a11))',\n className,\n )}\n ref={ref}\n {...props}\n />\n))\n\nCardDescription.displayName = 'CardDescription'\n\nconst CardContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div className={cn('', className)} ref={ref} {...props} />\n))\n\nCardContent.displayName = 'CardContent'\n\nconst CardFooter = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n className={cn(\n 'flex items-center justify-end gap-2 pt-2 text-(--spark-card-fg,var(--neutral-a12))',\n className,\n )}\n ref={ref}\n {...props}\n />\n))\n\nCardFooter.displayName = 'CardFooter'\n\nconst CardSkeleton = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n className={cn(\n 'relative flex w-full items-center gap-4 rounded-2xl bg-spark-a3 p-4 opacity-80',\n className,\n )}\n ref={ref}\n {...props}\n >\n <div className=\"size-10 shrink-0 animate-pulse rounded-full bg-base-gray-soft motion-reduce:animate-none\" />\n <div className=\"flex flex-1 flex-col gap-y-2\">\n <div className=\"h-5 w-1/3 max-w-32 animate-pulse rounded-md bg-base-gray-soft motion-reduce:animate-none\" />\n <div className=\"h-4 w-1/2 max-w-48 animate-pulse rounded-md bg-base-gray-soft motion-reduce:animate-none\" />\n </div>\n </div>\n))\n\nCardSkeleton.displayName = 'CardSkeleton'\n\nexport {\n Card,\n CardContent,\n CardDescription,\n CardFooter,\n CardHeader,\n CardIcon,\n CardSkeleton,\n CardTitle,\n}\nexport type { CardProps }\n"],"mappings":";;;;;;AAKA,MAAM,eAAe,IAMnB,wDACA;CACE,UAAU,EACR,SAAS;EAEP,SACE;EACF,MAAM;EACN,SACE;EACF,SACE;EAEF,OAAO;EAGP,OACE;EACH,EACF;CACD,iBAAiB,EACf,SAAS,WACV;CACF,CACF;AAcD,MAAM,OAAOA,QAAM,YAChB,EAAE,WAAW,SAAS,OAAO,GAAG,SAAS,QACxC,oBAAC,OAAD;CACE,WAAW,GAAG,aAAa,EAAE,SAAS,CAAC,EAAE,UAAU;CACnD,aAAU;CACV,gBAAc;CACd,mBAAiB,UAAU,WAAW,WAAW,KAAA;CAC5C;CACL,GAAI;CACJ,CAAA,CAEL;AAED,KAAK,cAAc;AAEnB,MAAM,aAAaA,QAAM,YAGtB,EAAE,WAAW,GAAG,SAAS,QAC1B,oBAAC,OAAD;CACE,WAAW,GAAG,2BAA2B,UAAU;CAC9C;CACL,GAAI;CACJ,CAAA,CACF;AAEF,WAAW,cAAc;AAEzB,MAAM,WAAWA,QAAM,YAGpB,EAAE,WAAW,GAAG,SAAS,QAC1B,oBAAC,OAAD;CACE,WAAW,GACT,uFACA,UACD;CACI;CACL,GAAI;CACJ,CAAA,CACF;AAEF,SAAS,cAAc;AAEvB,MAAM,YAAYA,QAAM,YAGrB,EAAE,WAAW,GAAG,SAAS,QAC1B,oBAAC,MAAD;CACE,WAAW,GACT,6EACA,UACD;CACI;CACL,GAAI;CACJ,CAAA,CACF;AAEF,UAAU,cAAc;AAExB,MAAM,kBAAkBA,QAAM,YAG3B,EAAE,WAAW,GAAG,SAAS,QAC1B,oBAAC,KAAD;CACE,WAAW,GACT,qEACA,UACD;CACI;CACL,GAAI;CACJ,CAAA,CACF;AAEF,gBAAgB,cAAc;AAE9B,MAAM,cAAcA,QAAM,YAGvB,EAAE,WAAW,GAAG,SAAS,QAC1B,oBAAC,OAAD;CAAK,WAAW,GAAG,IAAI,UAAU;CAAO;CAAK,GAAI;CAAS,CAAA,CAC1D;AAEF,YAAY,cAAc;AAE1B,MAAM,aAAaA,QAAM,YAGtB,EAAE,WAAW,GAAG,SAAS,QAC1B,oBAAC,OAAD;CACE,WAAW,GACT,sFACA,UACD;CACI;CACL,GAAI;CACJ,CAAA,CACF;AAEF,WAAW,cAAc;AAEzB,MAAM,eAAeA,QAAM,YAGxB,EAAE,WAAW,GAAG,SAAS,QAC1B,qBAAC,OAAD;CACE,WAAW,GACT,kFACA,UACD;CACI;CACL,GAAI;WANN,CAQE,oBAAC,OAAD,EAAK,WAAU,4FAA6F,CAAA,EAC5G,qBAAC,OAAD;EAAK,WAAU;YAAf,CACE,oBAAC,OAAD,EAAK,WAAU,4FAA6F,CAAA,EAC5G,oBAAC,OAAD,EAAK,WAAU,4FAA6F,CAAA,CACxG;IACF;GACN;AAEF,aAAa,cAAc"}
1
+ {"version":3,"file":"card.js","names":["React"],"sources":["../../src/components/card.tsx"],"sourcesContent":["import { useRender } from '@base-ui/react/use-render'\nimport { cva } from 'class-variance-authority'\nimport * as React from 'react'\nimport type { SparkCardColor, SparkCardVariant } from '../lib/theme-types'\nimport { cn } from '../utils/cn'\n\nconst cardVariants = cva(\n 'relative flex w-full flex-col gap-1 rounded-2xl py-3',\n {\n variants: {\n variant: {\n ambient:\n 'border-(length:--spark-card-border-width,0px) border-(--spark-card-border,transparent) bg-(--spark-card-bg,var(--neutral-a3)) px-(--spark-card-px,1rem)',\n soft: 'bg-(--spark-card-c-soft,var(--neutral-a3)) px-4',\n surface:\n 'border border-(--spark-card-c-border,var(--neutral-a6)) bg-(--spark-card-c-surface,var(--neutral-2)) px-4',\n outline: 'border border-(--spark-card-c-border,var(--neutral-a6)) px-4',\n ghost: '',\n solid:\n 'bg-(--spark-card-c-solid,var(--neutral-9)) px-4 [--spark-card-fg-muted:var(--spark-card-c-contrast,var(--neutral-contrast))] [--spark-card-fg:var(--spark-card-c-contrast,var(--neutral-contrast))] [--spark-card-icon:var(--spark-card-c-contrast,var(--neutral-contrast))]',\n },\n },\n defaultVariants: {\n variant: 'ambient',\n },\n },\n)\n\ninterface CardProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Container chrome scoped to this card — NOT the ambient `data-style` knob\n * (that drives controls and would cascade into the card's content). Unset →\n * follows the app-level `[data-card-variant]` knob (default soft-neutral).\n * (`solid` is hidden for now — see `SparkCardVariant`.)\n */\n variant?: SparkCardVariant\n /** Chrome palette. `neutral` (default) tracks the app neutral; `accent` tints with the brand accent. */\n color?: SparkCardColor\n /**\n * Base UI polymorphism. Pass `<a href/>` or `<button/>` to make the whole\n * card interactive (hover tint, focus ring, disabled styles). Omit → static.\n */\n render?: useRender.RenderProp\n}\n\nconst Card = React.forwardRef<HTMLDivElement, CardProps>(\n ({ className, variant, color, render, ...props }, ref) => {\n const interactive = render != null\n const resolved = variant ?? 'ambient'\n return useRender({\n defaultTagName: 'div',\n render,\n props: {\n 'data-slot': 'card',\n 'data-variant': variant,\n 'data-card-color': color === 'accent' ? 'accent' : undefined,\n className: cn(\n cardVariants({ variant }),\n interactive && [\n 'cursor-pointer text-left no-underline transition-colors motion-reduce:transition-none',\n 'focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-hidden',\n 'disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50',\n // hover deepens the fill one step; bordered/bare variants only ring\n (resolved === 'ambient' || resolved === 'soft') &&\n 'hover:bg-(--spark-card-c-soft-hover,var(--neutral-a4))',\n ],\n className,\n ),\n ref,\n ...props,\n },\n })\n },\n)\n\nCard.displayName = 'Card'\n\nconst CardHeader = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n className={cn('flex items-center gap-4', className)}\n ref={ref}\n {...props}\n />\n))\n\nCardHeader.displayName = 'CardHeader'\n\nconst CardIcon = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n className={cn(\n 'flex shrink-0 items-center justify-center text-(--spark-card-icon,var(--spark-a11))',\n className,\n )}\n ref={ref}\n {...props}\n />\n))\n\nCardIcon.displayName = 'CardIcon'\n\nconst CardTitle = React.forwardRef<\n HTMLHeadingElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n <h3\n className={cn(\n 'text-base leading-5 font-medium text-(--spark-card-fg,var(--neutral-a12))',\n className,\n )}\n ref={ref}\n {...props}\n />\n))\n\nCardTitle.displayName = 'CardTitle'\n\nconst CardDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n className={cn(\n 'text-sm leading-5 text-(--spark-card-fg-muted,var(--neutral-a11))',\n className,\n )}\n ref={ref}\n {...props}\n />\n))\n\nCardDescription.displayName = 'CardDescription'\n\nconst CardContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div className={cn('', className)} ref={ref} {...props} />\n))\n\nCardContent.displayName = 'CardContent'\n\nconst CardFooter = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n className={cn(\n 'flex items-center justify-end gap-2 pt-2 text-(--spark-card-fg,var(--neutral-a12))',\n className,\n )}\n ref={ref}\n {...props}\n />\n))\n\nCardFooter.displayName = 'CardFooter'\n\nconst CardSkeleton = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n className={cn(\n 'relative flex w-full items-center gap-4 rounded-2xl bg-spark-a3 p-4 opacity-80',\n className,\n )}\n ref={ref}\n {...props}\n >\n <div className=\"size-10 shrink-0 animate-pulse rounded-full bg-base-gray-soft motion-reduce:animate-none\" />\n <div className=\"flex flex-1 flex-col gap-y-2\">\n <div className=\"h-5 w-1/3 max-w-32 animate-pulse rounded-md bg-base-gray-soft motion-reduce:animate-none\" />\n <div className=\"h-4 w-1/2 max-w-48 animate-pulse rounded-md bg-base-gray-soft motion-reduce:animate-none\" />\n </div>\n </div>\n))\n\nCardSkeleton.displayName = 'CardSkeleton'\n\nexport {\n Card,\n CardContent,\n CardDescription,\n CardFooter,\n CardHeader,\n CardIcon,\n CardSkeleton,\n CardTitle,\n}\nexport type { CardProps }\n"],"mappings":";;;;;;;AAMA,MAAM,eAAe,IACnB,wDACA;CACE,UAAU,EACR,SAAS;EACP,SACE;EACF,MAAM;EACN,SACE;EACF,SAAS;EACT,OAAO;EACP,OACE;EACH,EACF;CACD,iBAAiB,EACf,SAAS,WACV;CACF,CACF;AAmBD,MAAM,OAAOA,QAAM,YAChB,EAAE,WAAW,SAAS,OAAO,QAAQ,GAAG,SAAS,QAAQ;CACxD,MAAM,cAAc,UAAU;CAC9B,MAAM,WAAW,WAAW;AAC5B,QAAO,UAAU;EACf,gBAAgB;EAChB;EACA,OAAO;GACL,aAAa;GACb,gBAAgB;GAChB,mBAAmB,UAAU,WAAW,WAAW,KAAA;GACnD,WAAW,GACT,aAAa,EAAE,SAAS,CAAC,EACzB,eAAe;IACb;IACA;IACA;KAEC,aAAa,aAAa,aAAa,WACtC;IACH,EACD,UACD;GACD;GACA,GAAG;GACJ;EACF,CAAC;EAEL;AAED,KAAK,cAAc;AAEnB,MAAM,aAAaA,QAAM,YAGtB,EAAE,WAAW,GAAG,SAAS,QAC1B,oBAAC,OAAD;CACE,WAAW,GAAG,2BAA2B,UAAU;CAC9C;CACL,GAAI;CACJ,CAAA,CACF;AAEF,WAAW,cAAc;AAEzB,MAAM,WAAWA,QAAM,YAGpB,EAAE,WAAW,GAAG,SAAS,QAC1B,oBAAC,OAAD;CACE,WAAW,GACT,uFACA,UACD;CACI;CACL,GAAI;CACJ,CAAA,CACF;AAEF,SAAS,cAAc;AAEvB,MAAM,YAAYA,QAAM,YAGrB,EAAE,WAAW,GAAG,SAAS,QAC1B,oBAAC,MAAD;CACE,WAAW,GACT,6EACA,UACD;CACI;CACL,GAAI;CACJ,CAAA,CACF;AAEF,UAAU,cAAc;AAExB,MAAM,kBAAkBA,QAAM,YAG3B,EAAE,WAAW,GAAG,SAAS,QAC1B,oBAAC,KAAD;CACE,WAAW,GACT,qEACA,UACD;CACI;CACL,GAAI;CACJ,CAAA,CACF;AAEF,gBAAgB,cAAc;AAE9B,MAAM,cAAcA,QAAM,YAGvB,EAAE,WAAW,GAAG,SAAS,QAC1B,oBAAC,OAAD;CAAK,WAAW,GAAG,IAAI,UAAU;CAAO;CAAK,GAAI;CAAS,CAAA,CAC1D;AAEF,YAAY,cAAc;AAE1B,MAAM,aAAaA,QAAM,YAGtB,EAAE,WAAW,GAAG,SAAS,QAC1B,oBAAC,OAAD;CACE,WAAW,GACT,sFACA,UACD;CACI;CACL,GAAI;CACJ,CAAA,CACF;AAEF,WAAW,cAAc;AAEzB,MAAM,eAAeA,QAAM,YAGxB,EAAE,WAAW,GAAG,SAAS,QAC1B,qBAAC,OAAD;CACE,WAAW,GACT,kFACA,UACD;CACI;CACL,GAAI;WANN,CAQE,oBAAC,OAAD,EAAK,WAAU,4FAA6F,CAAA,EAC5G,qBAAC,OAAD;EAAK,WAAU;YAAf,CACE,oBAAC,OAAD,EAAK,WAAU,4FAA6F,CAAA,EAC5G,oBAAC,OAAD,EAAK,WAAU,4FAA6F,CAAA,CACxG;IACF;GACN;AAEF,aAAa,cAAc"}
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const require_chunk = require("../chunk-aJGBMT86.cjs");
4
- const require_accent_colors = require("../accent-colors-CjHCf8fH.cjs");
4
+ const require_lib_accent_colors = require("../lib/accent-colors.cjs");
5
5
  let react = require("react");
6
6
  react = require_chunk.__toESM(react);
7
7
  let react_jsx_runtime = require("react/jsx-runtime");
@@ -10,7 +10,7 @@ let cnfast = require("cnfast");
10
10
  //#region src/components/checkbox.tsx
11
11
  const Checkbox = react.forwardRef(({ className, size: _size, bordered: _bordered, styleVariant, color, ...props }, ref) => {
12
12
  const dataStyle = styleVariant !== void 0 || color !== void 0 ? styleVariant ?? "solid" : void 0;
13
- const dataAccentColor = color ? require_accent_colors.accentByColor[color] : void 0;
13
+ const dataAccentColor = color ? require_lib_accent_colors.accentByColor[color] : void 0;
14
14
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_base_ui_react_checkbox.Checkbox.Root, {
15
15
  "data-style": dataStyle,
16
16
  "data-accent-color": dataAccentColor,
@@ -1 +1 @@
1
- {"version":3,"file":"checkbox.cjs","names":["React","accentByColor","CheckboxPrimitive"],"sources":["../../src/components/checkbox.tsx"],"sourcesContent":["import { Checkbox as CheckboxPrimitive } from '@base-ui/react/checkbox'\nimport * as React from 'react'\nimport { accentByColor } from '../lib/accent-colors'\nimport type { SparkStyle } from '../lib/theme-types'\nimport { cn } from '../utils/cn'\n\nexport type SparkCheckboxColor = 'accent' | 'neutral' | 'danger'\n\ntype CheckboxProps = CheckboxPrimitive.Root.Props & {\n /**\n * @deprecated The checkbox now renders a single 24px size (with a 40px hit\n * area). Accepted for back-compat but ignored.\n */\n size?: 'default' | 'large'\n /**\n * @deprecated The checkbox is always bordered now. Accepted for back-compat\n * but ignored.\n */\n bordered?: boolean\n styleVariant?: SparkStyle\n color?: SparkCheckboxColor\n}\n\nconst Checkbox = React.forwardRef<\n React.ComponentRef<typeof CheckboxPrimitive.Root>,\n CheckboxProps\n>(\n (\n {\n className,\n size: _size,\n bordered: _bordered,\n styleVariant,\n color,\n ...props\n },\n ref,\n ) => {\n const hasLook = styleVariant !== undefined || color !== undefined\n const dataStyle = hasLook ? (styleVariant ?? 'solid') : undefined\n const dataAccentColor = color ? accentByColor[color] : undefined\n\n return (\n <CheckboxPrimitive.Root\n data-style={dataStyle}\n data-accent-color={dataAccentColor}\n className={cn(\n 'peer relative inline-flex size-6 shrink-0 cursor-pointer items-center justify-center border-(length:--spark-style-border-width,2px) transition-colors',\n \"before:absolute before:top-1/2 before:left-1/2 before:size-10 before:-translate-x-1/2 before:-translate-y-1/2 before:content-['']\",\n 'rounded-[min(var(--spark-rounded-sm),40%)]',\n 'focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-hidden',\n 'data-disabled:cursor-not-allowed data-disabled:opacity-50',\n 'border-(--spark-style-idle-border,var(--spark-a7)) bg-base-accent-soft',\n 'data-checked:border-(--spark-style-border,var(--spark-9)) data-checked:bg-(--spark-style-bg,var(--spark-9))',\n 'data-indeterminate:border-(--spark-style-border,var(--spark-9)) data-indeterminate:bg-(--spark-style-bg,var(--spark-9))',\n className,\n )}\n ref={ref}\n {...props}\n >\n <CheckboxPrimitive.Indicator className=\"group inline-flex items-center justify-center text-(--spark-style-fg,var(--spark-on-solid))\">\n {/* custom-drawn glyphs; group-data toggles which one the mounted indicator shows */}\n <svg\n aria-hidden=\"true\"\n className=\"hidden size-5 group-data-checked:block\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <path\n className=\"animate-check-draw [stroke-dasharray:1] motion-reduce:animate-none\"\n d=\"M5.5 12.5 L10 17 L18.5 7.5\"\n pathLength={1}\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2.5}\n />\n </svg>\n <span className=\"hidden h-0.5 w-3 origin-center animate-dash-pop rounded-full bg-current group-data-indeterminate:block motion-reduce:animate-none\" />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n )\n },\n)\n\nCheckbox.displayName = 'Checkbox'\n\nexport { Checkbox }\nexport type { CheckboxProps }\n"],"mappings":";;;;;;;;;;AAuBA,MAAM,WAAWA,MAAM,YAKnB,EACE,WACA,MAAM,OACN,UAAU,WACV,cACA,OACA,GAAG,SAEL,QACG;CAEH,MAAM,YADU,iBAAiB,KAAA,KAAa,UAAU,KAAA,IAC3B,gBAAgB,UAAW,KAAA;CACxD,MAAM,kBAAkB,QAAQC,sBAAAA,cAAc,SAAS,KAAA;AAEvD,QACE,iBAAA,GAAA,kBAAA,KAACC,wBAAAA,SAAkB,MAAnB;EACE,cAAY;EACZ,qBAAmB;EACnB,YAAA,GAAA,OAAA,IACE,yJACA,qIACA,8CACA,iFACA,6DACA,0EACA,+GACA,2HACA,UACD;EACI;EACL,GAAI;YAEJ,iBAAA,GAAA,kBAAA,MAACA,wBAAAA,SAAkB,WAAnB;GAA6B,WAAU;aAAvC,CAEE,iBAAA,GAAA,kBAAA,KAAC,OAAD;IACE,eAAY;IACZ,WAAU;IACV,MAAK;IACL,SAAQ;cAER,iBAAA,GAAA,kBAAA,KAAC,QAAD;KACE,WAAU;KACV,GAAE;KACF,YAAY;KACZ,QAAO;KACP,eAAc;KACd,gBAAe;KACf,aAAa;KACb,CAAA;IACE,CAAA,EACN,iBAAA,GAAA,kBAAA,KAAC,QAAD,EAAM,WAAU,qIAAsI,CAAA,CAC1H;;EACP,CAAA;EAG9B;AAED,SAAS,cAAc"}
1
+ {"version":3,"file":"checkbox.cjs","names":["React","accentByColor","CheckboxPrimitive"],"sources":["../../src/components/checkbox.tsx"],"sourcesContent":["import { Checkbox as CheckboxPrimitive } from '@base-ui/react/checkbox'\nimport * as React from 'react'\nimport { accentByColor } from '../lib/accent-colors'\nimport type { SparkStyle } from '../lib/theme-types'\nimport { cn } from '../utils/cn'\n\nexport type SparkCheckboxColor = 'accent' | 'neutral' | 'danger'\n\ntype CheckboxProps = CheckboxPrimitive.Root.Props & {\n /**\n * @deprecated The checkbox now renders a single 24px size (with a 40px hit\n * area). Accepted for back-compat but ignored.\n */\n size?: 'default' | 'large'\n /**\n * @deprecated The checkbox is always bordered now. Accepted for back-compat\n * but ignored.\n */\n bordered?: boolean\n styleVariant?: SparkStyle\n color?: SparkCheckboxColor\n}\n\nconst Checkbox = React.forwardRef<\n React.ComponentRef<typeof CheckboxPrimitive.Root>,\n CheckboxProps\n>(\n (\n {\n className,\n size: _size,\n bordered: _bordered,\n styleVariant,\n color,\n ...props\n },\n ref,\n ) => {\n const hasLook = styleVariant !== undefined || color !== undefined\n const dataStyle = hasLook ? (styleVariant ?? 'solid') : undefined\n const dataAccentColor = color ? accentByColor[color] : undefined\n\n return (\n <CheckboxPrimitive.Root\n data-style={dataStyle}\n data-accent-color={dataAccentColor}\n className={cn(\n 'peer relative inline-flex size-6 shrink-0 cursor-pointer items-center justify-center border-(length:--spark-style-border-width,2px) transition-colors',\n \"before:absolute before:top-1/2 before:left-1/2 before:size-10 before:-translate-x-1/2 before:-translate-y-1/2 before:content-['']\",\n 'rounded-[min(var(--spark-rounded-sm),40%)]',\n 'focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-hidden',\n 'data-disabled:cursor-not-allowed data-disabled:opacity-50',\n 'border-(--spark-style-idle-border,var(--spark-a7)) bg-base-accent-soft',\n 'data-checked:border-(--spark-style-border,var(--spark-9)) data-checked:bg-(--spark-style-bg,var(--spark-9))',\n 'data-indeterminate:border-(--spark-style-border,var(--spark-9)) data-indeterminate:bg-(--spark-style-bg,var(--spark-9))',\n className,\n )}\n ref={ref}\n {...props}\n >\n <CheckboxPrimitive.Indicator className=\"group inline-flex items-center justify-center text-(--spark-style-fg,var(--spark-on-solid))\">\n {/* custom-drawn glyphs; group-data toggles which one the mounted indicator shows */}\n <svg\n aria-hidden=\"true\"\n className=\"hidden size-5 group-data-checked:block\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <path\n className=\"animate-check-draw [stroke-dasharray:1] motion-reduce:animate-none\"\n d=\"M5.5 12.5 L10 17 L18.5 7.5\"\n pathLength={1}\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2.5}\n />\n </svg>\n <span className=\"hidden h-0.5 w-3 origin-center animate-dash-pop rounded-full bg-current group-data-indeterminate:block motion-reduce:animate-none\" />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n )\n },\n)\n\nCheckbox.displayName = 'Checkbox'\n\nexport { Checkbox }\nexport type { CheckboxProps }\n"],"mappings":";;;;;;;;;;AAuBA,MAAM,WAAWA,MAAM,YAKnB,EACE,WACA,MAAM,OACN,UAAU,WACV,cACA,OACA,GAAG,SAEL,QACG;CAEH,MAAM,YADU,iBAAiB,KAAA,KAAa,UAAU,KAAA,IAC3B,gBAAgB,UAAW,KAAA;CACxD,MAAM,kBAAkB,QAAQC,0BAAAA,cAAc,SAAS,KAAA;AAEvD,QACE,iBAAA,GAAA,kBAAA,KAACC,wBAAAA,SAAkB,MAAnB;EACE,cAAY;EACZ,qBAAmB;EACnB,YAAA,GAAA,OAAA,IACE,yJACA,qIACA,8CACA,iFACA,6DACA,0EACA,+GACA,2HACA,UACD;EACI;EACL,GAAI;YAEJ,iBAAA,GAAA,kBAAA,MAACA,wBAAAA,SAAkB,WAAnB;GAA6B,WAAU;aAAvC,CAEE,iBAAA,GAAA,kBAAA,KAAC,OAAD;IACE,eAAY;IACZ,WAAU;IACV,MAAK;IACL,SAAQ;cAER,iBAAA,GAAA,kBAAA,KAAC,QAAD;KACE,WAAU;KACV,GAAE;KACF,YAAY;KACZ,QAAO;KACP,eAAc;KACd,gBAAe;KACf,aAAa;KACb,CAAA;IACE,CAAA,EACN,iBAAA,GAAA,kBAAA,KAAC,QAAD,EAAM,WAAU,qIAAsI,CAAA,CAC1H;;EACP,CAAA;EAG9B;AAED,SAAS,cAAc"}
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
 
3
- import { u as SparkStyle } from "../theme-types-BDdoRxXa.js";
3
+ import { u as SparkStyle } from "../theme-types-BKlzRiyw.js";
4
4
  import * as React$1 from "react";
5
5
  import { Checkbox as Checkbox$1 } from "@base-ui/react/checkbox";
6
6
 
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { cn } from "../utils/cn.js";
3
- import { t as accentByColor } from "../accent-colors-Ch2J0EEY.js";
3
+ import { accentByColor } from "../lib/accent-colors.js";
4
4
  import * as React$1 from "react";
5
5
  import { jsx, jsxs } from "react/jsx-runtime";
6
6
  import { Checkbox as Checkbox$1 } from "@base-ui/react/checkbox";
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
 
3
- import { t as Tone } from "../tones-DjgKOX3s.cjs";
3
+ import { Tone } from "../lib/tones.cjs";
4
4
  import * as _$react_jsx_runtime0 from "react/jsx-runtime";
5
5
  import * as React$1 from "react";
6
6
 
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
 
3
- import { t as Tone } from "../tones-PXJGlSpe.js";
3
+ import { Tone } from "../lib/tones.js";
4
4
  import * as React$1 from "react";
5
5
  import * as _$react_jsx_runtime0 from "react/jsx-runtime";
6
6
 
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
 
3
3
  import { MaterialSymbolIconName } from "../icons/material-symbol.cjs";
4
- import { t as Tone } from "../tones-DjgKOX3s.cjs";
4
+ import { Tone } from "../lib/tones.cjs";
5
5
  import * as _$react_jsx_runtime0 from "react/jsx-runtime";
6
6
  import * as React$1 from "react";
7
7
 
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
 
3
3
  import { MaterialSymbolIconName } from "../icons/material-symbol.js";
4
- import { t as Tone } from "../tones-PXJGlSpe.js";
4
+ import { Tone } from "../lib/tones.js";
5
5
  import * as React$1 from "react";
6
6
  import * as _$react_jsx_runtime0 from "react/jsx-runtime";
7
7
 
@@ -4,9 +4,16 @@ require("../chunk-aJGBMT86.cjs");
4
4
  const require_icons_material_symbol = require("../icons/material-symbol.cjs");
5
5
  let react_jsx_runtime = require("react/jsx-runtime");
6
6
  //#region src/components/empty-state.tsx
7
- function EmptyState({ action, description, icon, title }) {
7
+ const emptyStateVariants = (0, require("class-variance-authority").cva)("flex flex-col items-center gap-4 px-6 py-12 text-center", {
8
+ variants: { variant: {
9
+ dashed: "rounded-2xl border border-dashed border-gray",
10
+ ghost: ""
11
+ } },
12
+ defaultVariants: { variant: "dashed" }
13
+ });
14
+ function EmptyState({ action, description, icon, title, variant }) {
8
15
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
9
- className: "flex flex-col items-center gap-4 rounded-2xl border border-dashed border-gray px-6 py-12 text-center",
16
+ className: emptyStateVariants({ variant }),
10
17
  children: [
11
18
  icon && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
12
19
  className: "flex size-12 items-center justify-center rounded-xl bg-base-gray-soft",
@@ -1 +1 @@
1
- {"version":3,"file":"empty-state.cjs","names":["MaterialSymbol"],"sources":["../../src/components/empty-state.tsx"],"sourcesContent":["import type { ReactNode } from 'react'\nimport {\n MaterialSymbol,\n type MaterialSymbolIconName,\n} from '../icons/material-symbol'\n\ninterface EmptyStateProps {\n title: string\n description?: string\n icon?: MaterialSymbolIconName\n action?: ReactNode\n}\n\nexport function EmptyState({\n action,\n description,\n icon,\n title,\n}: EmptyStateProps) {\n return (\n <div className=\"flex flex-col items-center gap-4 rounded-2xl border border-dashed border-gray px-6 py-12 text-center\">\n {icon && (\n <div className=\"flex size-12 items-center justify-center rounded-xl bg-base-gray-soft\">\n <MaterialSymbol className=\"text-[20px] text-gray-light\" name={icon} />\n </div>\n )}\n <div className=\"flex flex-col gap-1\">\n <h3 className=\"text-base font-bold text-gray\">{title}</h3>\n {description && (\n <p className=\"mx-auto max-w-md text-sm text-gray-light\">\n {description}\n </p>\n )}\n </div>\n {action}\n </div>\n )\n}\n\nexport type { EmptyStateProps }\n"],"mappings":";;;;;;AAaA,SAAgB,WAAW,EACzB,QACA,aACA,MACA,SACkB;AAClB,QACE,iBAAA,GAAA,kBAAA,MAAC,OAAD;EAAK,WAAU;YAAf;GACG,QACC,iBAAA,GAAA,kBAAA,KAAC,OAAD;IAAK,WAAU;cACb,iBAAA,GAAA,kBAAA,KAACA,8BAAAA,gBAAD;KAAgB,WAAU;KAA8B,MAAM;KAAQ,CAAA;IAClE,CAAA;GAER,iBAAA,GAAA,kBAAA,MAAC,OAAD;IAAK,WAAU;cAAf,CACE,iBAAA,GAAA,kBAAA,KAAC,MAAD;KAAI,WAAU;eAAiC;KAAW,CAAA,EACzD,eACC,iBAAA,GAAA,kBAAA,KAAC,KAAD;KAAG,WAAU;eACV;KACC,CAAA,CAEF;;GACL;GACG"}
1
+ {"version":3,"file":"empty-state.cjs","names":["MaterialSymbol"],"sources":["../../src/components/empty-state.tsx"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority'\nimport type { ReactNode } from 'react'\nimport {\n MaterialSymbol,\n type MaterialSymbolIconName,\n} from '../icons/material-symbol'\n\nconst emptyStateVariants = cva(\n 'flex flex-col items-center gap-4 px-6 py-12 text-center',\n {\n variants: {\n variant: {\n dashed: 'rounded-2xl border border-dashed border-gray',\n ghost: '',\n },\n },\n defaultVariants: {\n variant: 'dashed',\n },\n },\n)\n\ninterface EmptyStateProps extends VariantProps<typeof emptyStateVariants> {\n title: string\n description?: string\n icon?: MaterialSymbolIconName\n action?: ReactNode\n}\n\nexport function EmptyState({\n action,\n description,\n icon,\n title,\n variant,\n}: EmptyStateProps) {\n return (\n <div className={emptyStateVariants({ variant })}>\n {icon && (\n <div className=\"flex size-12 items-center justify-center rounded-xl bg-base-gray-soft\">\n <MaterialSymbol className=\"text-[20px] text-gray-light\" name={icon} />\n </div>\n )}\n <div className=\"flex flex-col gap-1\">\n <h3 className=\"text-base font-bold text-gray\">{title}</h3>\n {description && (\n <p className=\"mx-auto max-w-md text-sm text-gray-light\">\n {description}\n </p>\n )}\n </div>\n {action}\n </div>\n )\n}\n\nexport type { EmptyStateProps }\n"],"mappings":";;;;;;AAOA,MAAM,sBAAA,sCAAA,CAAA,KACJ,2DACA;CACE,UAAU,EACR,SAAS;EACP,QAAQ;EACR,OAAO;EACR,EACF;CACD,iBAAiB,EACf,SAAS,UACV;CACF,CACF;AASD,SAAgB,WAAW,EACzB,QACA,aACA,MACA,OACA,WACkB;AAClB,QACE,iBAAA,GAAA,kBAAA,MAAC,OAAD;EAAK,WAAW,mBAAmB,EAAE,SAAS,CAAC;YAA/C;GACG,QACC,iBAAA,GAAA,kBAAA,KAAC,OAAD;IAAK,WAAU;cACb,iBAAA,GAAA,kBAAA,KAACA,8BAAAA,gBAAD;KAAgB,WAAU;KAA8B,MAAM;KAAQ,CAAA;IAClE,CAAA;GAER,iBAAA,GAAA,kBAAA,MAAC,OAAD;IAAK,WAAU;cAAf,CACE,iBAAA,GAAA,kBAAA,KAAC,MAAD;KAAI,WAAU;eAAiC;KAAW,CAAA,EACzD,eACC,iBAAA,GAAA,kBAAA,KAAC,KAAD;KAAG,WAAU;eACV;KACC,CAAA,CAEF;;GACL;GACG"}
@@ -3,9 +3,14 @@
3
3
  import { MaterialSymbolIconName } from "../icons/material-symbol.cjs";
4
4
  import * as _$react_jsx_runtime0 from "react/jsx-runtime";
5
5
  import { ReactNode } from "react";
6
+ import * as _$class_variance_authority_types0 from "class-variance-authority/types";
7
+ import { VariantProps } from "class-variance-authority";
6
8
 
7
9
  //#region src/components/empty-state.d.ts
8
- interface EmptyStateProps {
10
+ declare const emptyStateVariants: (props?: ({
11
+ variant?: "ghost" | "dashed" | null | undefined;
12
+ } & _$class_variance_authority_types0.ClassProp) | undefined) => string;
13
+ interface EmptyStateProps extends VariantProps<typeof emptyStateVariants> {
9
14
  title: string;
10
15
  description?: string;
11
16
  icon?: MaterialSymbolIconName;
@@ -15,7 +20,8 @@ declare function EmptyState({
15
20
  action,
16
21
  description,
17
22
  icon,
18
- title
23
+ title,
24
+ variant
19
25
  }: EmptyStateProps): _$react_jsx_runtime0.JSX.Element;
20
26
  //#endregion
21
27
  export { EmptyState, type EmptyStateProps };
@@ -3,9 +3,14 @@
3
3
  import { MaterialSymbolIconName } from "../icons/material-symbol.js";
4
4
  import { ReactNode } from "react";
5
5
  import * as _$react_jsx_runtime0 from "react/jsx-runtime";
6
+ import { VariantProps } from "class-variance-authority";
7
+ import * as _$class_variance_authority_types0 from "class-variance-authority/types";
6
8
 
7
9
  //#region src/components/empty-state.d.ts
8
- interface EmptyStateProps {
10
+ declare const emptyStateVariants: (props?: ({
11
+ variant?: "ghost" | "dashed" | null | undefined;
12
+ } & _$class_variance_authority_types0.ClassProp) | undefined) => string;
13
+ interface EmptyStateProps extends VariantProps<typeof emptyStateVariants> {
9
14
  title: string;
10
15
  description?: string;
11
16
  icon?: MaterialSymbolIconName;
@@ -15,7 +20,8 @@ declare function EmptyState({
15
20
  action,
16
21
  description,
17
22
  icon,
18
- title
23
+ title,
24
+ variant
19
25
  }: EmptyStateProps): _$react_jsx_runtime0.JSX.Element;
20
26
  //#endregion
21
27
  export { EmptyState, type EmptyStateProps };
@@ -1,10 +1,18 @@
1
1
  "use client";
2
2
  import { MaterialSymbol } from "../icons/material-symbol.js";
3
3
  import { jsx, jsxs } from "react/jsx-runtime";
4
+ import { cva } from "class-variance-authority";
4
5
  //#region src/components/empty-state.tsx
5
- function EmptyState({ action, description, icon, title }) {
6
+ const emptyStateVariants = cva("flex flex-col items-center gap-4 px-6 py-12 text-center", {
7
+ variants: { variant: {
8
+ dashed: "rounded-2xl border border-dashed border-gray",
9
+ ghost: ""
10
+ } },
11
+ defaultVariants: { variant: "dashed" }
12
+ });
13
+ function EmptyState({ action, description, icon, title, variant }) {
6
14
  return /* @__PURE__ */ jsxs("div", {
7
- className: "flex flex-col items-center gap-4 rounded-2xl border border-dashed border-gray px-6 py-12 text-center",
15
+ className: emptyStateVariants({ variant }),
8
16
  children: [
9
17
  icon && /* @__PURE__ */ jsx("div", {
10
18
  className: "flex size-12 items-center justify-center rounded-xl bg-base-gray-soft",
@@ -1 +1 @@
1
- {"version":3,"file":"empty-state.js","names":[],"sources":["../../src/components/empty-state.tsx"],"sourcesContent":["import type { ReactNode } from 'react'\nimport {\n MaterialSymbol,\n type MaterialSymbolIconName,\n} from '../icons/material-symbol'\n\ninterface EmptyStateProps {\n title: string\n description?: string\n icon?: MaterialSymbolIconName\n action?: ReactNode\n}\n\nexport function EmptyState({\n action,\n description,\n icon,\n title,\n}: EmptyStateProps) {\n return (\n <div className=\"flex flex-col items-center gap-4 rounded-2xl border border-dashed border-gray px-6 py-12 text-center\">\n {icon && (\n <div className=\"flex size-12 items-center justify-center rounded-xl bg-base-gray-soft\">\n <MaterialSymbol className=\"text-[20px] text-gray-light\" name={icon} />\n </div>\n )}\n <div className=\"flex flex-col gap-1\">\n <h3 className=\"text-base font-bold text-gray\">{title}</h3>\n {description && (\n <p className=\"mx-auto max-w-md text-sm text-gray-light\">\n {description}\n </p>\n )}\n </div>\n {action}\n </div>\n )\n}\n\nexport type { EmptyStateProps }\n"],"mappings":";;;;AAaA,SAAgB,WAAW,EACzB,QACA,aACA,MACA,SACkB;AAClB,QACE,qBAAC,OAAD;EAAK,WAAU;YAAf;GACG,QACC,oBAAC,OAAD;IAAK,WAAU;cACb,oBAAC,gBAAD;KAAgB,WAAU;KAA8B,MAAM;KAAQ,CAAA;IAClE,CAAA;GAER,qBAAC,OAAD;IAAK,WAAU;cAAf,CACE,oBAAC,MAAD;KAAI,WAAU;eAAiC;KAAW,CAAA,EACzD,eACC,oBAAC,KAAD;KAAG,WAAU;eACV;KACC,CAAA,CAEF;;GACL;GACG"}
1
+ {"version":3,"file":"empty-state.js","names":[],"sources":["../../src/components/empty-state.tsx"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority'\nimport type { ReactNode } from 'react'\nimport {\n MaterialSymbol,\n type MaterialSymbolIconName,\n} from '../icons/material-symbol'\n\nconst emptyStateVariants = cva(\n 'flex flex-col items-center gap-4 px-6 py-12 text-center',\n {\n variants: {\n variant: {\n dashed: 'rounded-2xl border border-dashed border-gray',\n ghost: '',\n },\n },\n defaultVariants: {\n variant: 'dashed',\n },\n },\n)\n\ninterface EmptyStateProps extends VariantProps<typeof emptyStateVariants> {\n title: string\n description?: string\n icon?: MaterialSymbolIconName\n action?: ReactNode\n}\n\nexport function EmptyState({\n action,\n description,\n icon,\n title,\n variant,\n}: EmptyStateProps) {\n return (\n <div className={emptyStateVariants({ variant })}>\n {icon && (\n <div className=\"flex size-12 items-center justify-center rounded-xl bg-base-gray-soft\">\n <MaterialSymbol className=\"text-[20px] text-gray-light\" name={icon} />\n </div>\n )}\n <div className=\"flex flex-col gap-1\">\n <h3 className=\"text-base font-bold text-gray\">{title}</h3>\n {description && (\n <p className=\"mx-auto max-w-md text-sm text-gray-light\">\n {description}\n </p>\n )}\n </div>\n {action}\n </div>\n )\n}\n\nexport type { EmptyStateProps }\n"],"mappings":";;;;;AAOA,MAAM,qBAAqB,IACzB,2DACA;CACE,UAAU,EACR,SAAS;EACP,QAAQ;EACR,OAAO;EACR,EACF;CACD,iBAAiB,EACf,SAAS,UACV;CACF,CACF;AASD,SAAgB,WAAW,EACzB,QACA,aACA,MACA,OACA,WACkB;AAClB,QACE,qBAAC,OAAD;EAAK,WAAW,mBAAmB,EAAE,SAAS,CAAC;YAA/C;GACG,QACC,oBAAC,OAAD;IAAK,WAAU;cACb,oBAAC,gBAAD;KAAgB,WAAU;KAA8B,MAAM;KAAQ,CAAA;IAClE,CAAA;GAER,qBAAC,OAAD;IAAK,WAAU;cAAf,CACE,oBAAC,MAAD;KAAI,WAAU;eAAiC;KAAW,CAAA,EACzD,eACC,oBAAC,KAAD;KAAG,WAAU;eACV;KACC,CAAA,CAEF;;GACL;GACG"}
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
 
3
3
  import { BarChartCategory, BarChartLineSeries, BarChartSeries } from "./bar-chart.cjs";
4
- import { t as Format } from "../number-flow-DMJouddg.cjs";
4
+ import { t as Format } from "../number-flow-CVIvQhZn.cjs";
5
5
 
6
6
  //#region src/components/energy-bar-chart.d.ts
7
7
  type Category = BarChartCategory;
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
 
3
3
  import { BarChartCategory, BarChartLineSeries, BarChartSeries } from "./bar-chart.js";
4
- import { t as Format } from "../number-flow-D9zsxH0-.js";
4
+ import { t as Format } from "../number-flow-DVUHTv9D.js";
5
5
 
6
6
  //#region src/components/energy-bar-chart.d.ts
7
7
  type Category = BarChartCategory;
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
 
3
- import { t as Tone } from "../tones-DjgKOX3s.cjs";
3
+ import { Tone } from "../lib/tones.cjs";
4
4
  import * as _$react_jsx_runtime0 from "react/jsx-runtime";
5
5
 
6
6
  //#region src/components/feed-in-hero.d.ts
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
 
3
- import { t as Tone } from "../tones-PXJGlSpe.js";
3
+ import { Tone } from "../lib/tones.js";
4
4
  import * as _$react_jsx_runtime0 from "react/jsx-runtime";
5
5
 
6
6
  //#region src/components/feed-in-hero.d.ts
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
4
4
  const require_chunk = require("../chunk-aJGBMT86.cjs");
5
5
  const require_components_separator = require("./separator.cjs");
6
- const require_theme = require("../theme-ClRJhexF.cjs");
6
+ const require_components_theme = require("./theme.cjs");
7
7
  let react = require("react");
8
8
  react = require_chunk.__toESM(react);
9
9
  let react_jsx_runtime = require("react/jsx-runtime");
@@ -16,7 +16,7 @@ function useFieldContext() {
16
16
  }
17
17
  function useFieldControl(options) {
18
18
  const field = useFieldContext();
19
- const theme = require_theme.useTheme();
19
+ const theme = require_components_theme.useTheme();
20
20
  return {
21
21
  field,
22
22
  id: options?.id ?? field?.id,
@@ -121,7 +121,7 @@ const fieldVariants = (0, class_variance_authority.cva)("group/field relative fl
121
121
  function Field({ className, labelPosition: labelPositionProp, inputStyle: inputStyleProp, inputColor: inputColorProp, ...props }) {
122
122
  const id = (0, react.useId)();
123
123
  const [hasDescription, setHasDescription] = react.useState(false);
124
- const theme = require_theme.useTheme();
124
+ const theme = require_components_theme.useTheme();
125
125
  const labelPosition = labelPositionProp ?? theme.labelPosition ?? "inset";
126
126
  const inputStyle = inputStyleProp ?? theme.inputStyle ?? "soft";
127
127
  const inputColor = inputColorProp ?? theme.inputColor ?? "brand";
@@ -1 +1 @@
1
- {"version":3,"file":"field.cjs","names":["React","useTheme","Separator"],"sources":["../../src/components/field.tsx"],"sourcesContent":["'use client'\n\nimport { cva } from 'class-variance-authority'\nimport * as React from 'react'\nimport { useId } from 'react'\nimport type {\n SparkInputColor,\n SparkInputStyle,\n SparkLabelPosition,\n} from '../lib/theme-types'\nimport { cn } from '../utils/cn'\nimport { Separator } from './separator'\nimport { useTheme } from './theme'\n\ntype FieldContextValue = {\n id: string\n descriptionId: string\n hasDescription: boolean\n setHasDescription: (has: boolean) => void\n labelPosition: SparkLabelPosition\n inputStyle: SparkInputStyle\n inputColor: SparkInputColor\n}\n\nconst FieldContext = React.createContext<FieldContextValue | null>(null)\n\nexport function useFieldContext() {\n return React.useContext(FieldContext)\n}\n\n// Field→Theme→default resolution + id/aria-describedby wiring, shared by every\n// control that can sit inside a Field (Input, SelectTrigger, …) so they can't\n// drift on how a style/color/id resolves. `variant` is the control's own\n// per-instance override (already normalized — e.g. Input maps its 'none' to\n// undefined before calling this).\nexport function useFieldControl(options?: {\n id?: string\n ariaDescribedBy?: string\n variant?: SparkInputStyle\n}) {\n const field = useFieldContext()\n const theme = useTheme()\n const id = options?.id ?? field?.id\n const descriptionId = field?.hasDescription ? field.descriptionId : undefined\n const ariaDescribedBy =\n [descriptionId, options?.ariaDescribedBy].filter(Boolean).join(' ') ||\n undefined\n const inputStyle =\n options?.variant ?? field?.inputStyle ?? theme.inputStyle ?? 'soft'\n const inputColor = field?.inputColor ?? theme.inputColor ?? 'brand'\n return { field, id, ariaDescribedBy, inputStyle, inputColor }\n}\n\nfunction FieldSet({ className, ...props }: React.ComponentProps<'fieldset'>) {\n return (\n <fieldset\n data-slot=\"field-set\"\n className={cn('flex flex-col gap-4', className)}\n {...props}\n />\n )\n}\n\nfunction FieldLegend({\n className,\n variant = 'legend',\n ...props\n}: React.ComponentProps<'legend'> & { variant?: 'legend' | 'label' }) {\n return (\n <legend\n data-slot=\"field-legend\"\n data-variant={variant}\n className={cn(\n 'mb-1.5 font-medium text-gray data-[variant=label]:text-sm data-[variant=legend]:text-base',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction FieldGroup({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"field-group\"\n className={cn('group/field-group flex w-full flex-col gap-4', className)}\n {...props}\n />\n )\n}\n\nconst fieldVariants = cva(\n 'group/field relative flex w-full flex-col data-[invalid=true]:text-error-active',\n {\n variants: {\n labelPosition: {\n // inset puts label + input inside one shell, so the shell is the box\n // focus inside inset is the classic underline cue, not a shell ring\n inset: 'gap-y-1 rounded-lg px-4 py-3',\n outset: 'gap-y-2',\n },\n inputStyle: { soft: '', surface: '', outlined: '', ghost: '' },\n inputColor: { brand: '', gray: '' },\n },\n compoundVariants: [\n {\n labelPosition: 'inset',\n inputStyle: 'soft',\n inputColor: 'brand',\n class:\n 'bg-input-base has-[:is(input,[data-slot=select-trigger]):not(:disabled)]:hover:bg-input-base-hover',\n },\n {\n labelPosition: 'inset',\n inputStyle: 'soft',\n inputColor: 'gray',\n class:\n 'bg-base-gray-soft has-[:is(input,[data-slot=select-trigger]):not(:disabled)]:hover:bg-gray-a4',\n },\n {\n labelPosition: 'inset',\n inputStyle: 'surface',\n inputColor: 'brand',\n class: 'border border-input bg-base-accent-surface',\n },\n {\n labelPosition: 'inset',\n inputStyle: 'surface',\n inputColor: 'gray',\n class: 'border border-input-gray bg-base-gray-surface',\n },\n {\n labelPosition: 'inset',\n inputStyle: 'outlined',\n inputColor: 'brand',\n class: 'border border-input',\n },\n {\n labelPosition: 'inset',\n inputStyle: 'outlined',\n inputColor: 'gray',\n class: 'border border-input-gray',\n },\n // ghost inset = bare label + underlined input; the input carries the line\n {\n labelPosition: 'inset',\n inputStyle: 'ghost',\n class: 'rounded-none px-0',\n },\n // shared inset states: filled shells swap bg, bordered shells swap border\n // invalid hover deepens the error tint instead of falling back to accent\n {\n labelPosition: 'inset',\n inputStyle: ['soft', 'surface'],\n class:\n 'data-[disabled=true]:bg-base-gray-soft data-[invalid=true]:bg-base-error-soft data-[invalid=true]:has-[:is(input,[data-slot=select-trigger]):not(:disabled)]:hover:bg-red-a4',\n },\n {\n labelPosition: 'inset',\n inputStyle: ['surface', 'outlined'],\n class:\n 'data-[disabled=true]:border-input-disabled data-[invalid=true]:border-input-invalid',\n },\n ],\n },\n)\n\ninterface FieldProps extends React.ComponentProps<'div'> {\n labelPosition?: SparkLabelPosition\n inputStyle?: SparkInputStyle\n inputColor?: SparkInputColor\n}\n\nfunction Field({\n className,\n labelPosition: labelPositionProp,\n inputStyle: inputStyleProp,\n inputColor: inputColorProp,\n ...props\n}: FieldProps) {\n const id = useId()\n const [hasDescription, setHasDescription] = React.useState(false)\n // knobs are structural (they move the label / pick the box carrier), so they\n // resolve here via the <Theme> context; props override per instance\n const theme = useTheme()\n const labelPosition = labelPositionProp ?? theme.labelPosition ?? 'inset'\n const inputStyle = inputStyleProp ?? theme.inputStyle ?? 'soft'\n const inputColor = inputColorProp ?? theme.inputColor ?? 'brand'\n const value = React.useMemo<FieldContextValue>(\n () => ({\n id: `field-${id}`,\n descriptionId: `field-${id}-description`,\n hasDescription,\n setHasDescription,\n labelPosition,\n inputStyle,\n inputColor,\n }),\n [id, hasDescription, labelPosition, inputStyle, inputColor],\n )\n\n return (\n <FieldContext.Provider value={value}>\n <div\n role=\"group\"\n data-slot=\"field\"\n data-label-position={labelPosition}\n data-input-style={inputStyle}\n data-input-color={inputColor}\n className={cn(\n fieldVariants({ labelPosition, inputStyle, inputColor }),\n className,\n )}\n {...props}\n />\n </FieldContext.Provider>\n )\n}\n\nfunction FieldContent({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"field-content\"\n className={cn(\n 'flex min-w-0 flex-1 flex-col gap-0.5 leading-snug',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction FieldLabel({\n className,\n htmlFor,\n srOnly,\n ...props\n}: React.ComponentProps<'label'> & { srOnly?: boolean }) {\n const field = useFieldContext()\n return (\n <label\n data-slot=\"field-label\"\n className={cn(\n // labels stay full-contrast even when disabled — the control itself\n // (dimmed text, gray shell) signals the state\n 'text-sm leading-5 font-normal text-gray-light transition-all group-data-[invalid=true]/field:text-error-active! motion-reduce:transition-none',\n // visually hidden but kept in the a11y tree (still names + focuses the control)\n srOnly && 'sr-only',\n className,\n )}\n htmlFor={htmlFor ?? field?.id}\n {...props}\n />\n )\n}\n\nfunction FieldValue({\n className,\n id,\n title,\n truncate,\n children,\n ...props\n}: React.ComponentProps<'div'> & { truncate?: boolean }) {\n const field = useFieldContext()\n return (\n <div\n data-slot=\"field-value\"\n id={id ?? field?.id}\n // truncated string values keep the full text reachable on hover\n title={\n title ??\n (truncate && typeof children === 'string' ? children : undefined)\n }\n className={cn(\n // values are content, not controls — disabled dims but stays ≥4.5:1\n 'min-h-8 w-full text-base text-gray tabular-nums group-data-[disabled=true]/field:opacity-70',\n truncate\n ? 'block truncate leading-8'\n : 'inline-flex items-center wrap-anywhere whitespace-pre-wrap',\n className,\n )}\n {...props}\n >\n {children}\n </div>\n )\n}\n\nfunction FieldTitle({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"field-title\"\n className={cn(\n 'flex w-fit items-center gap-2 text-sm font-medium text-gray',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction FieldDescription({\n className,\n id,\n ...props\n}: React.ComponentProps<'div'>) {\n const field = useFieldContext()\n const setHasDescription = field?.setHasDescription\n\n React.useEffect(() => {\n if (!setHasDescription) return\n setHasDescription(true)\n return () => setHasDescription(false)\n }, [setHasDescription])\n\n return (\n <div\n data-slot=\"field-description\"\n id={id ?? field?.descriptionId}\n className={cn('mt-0.5 text-sm leading-normal text-gray-light', className)}\n {...props}\n />\n )\n}\n\nfunction FieldSeparator({\n children,\n className,\n ...props\n}: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"field-separator\"\n data-content={!!children}\n className={cn('relative -my-2 h-5 text-sm', className)}\n {...props}\n >\n <Separator className=\"absolute inset-0 top-1/2\" />\n {children && (\n <span\n className=\"relative mx-auto block w-fit bg-(--spark-background) px-2 text-gray-light\"\n data-slot=\"field-separator-content\"\n >\n {children}\n </span>\n )}\n </div>\n )\n}\n\nfunction FieldError({\n className,\n children,\n errors,\n ...props\n}: React.ComponentProps<'div'> & {\n errors?: Array<{ message?: string } | undefined>\n}) {\n const content = React.useMemo(() => {\n if (children) return children\n if (!errors?.length) return null\n const unique = [\n ...new Map(errors.map((error) => [error?.message, error])).values(),\n ]\n if (unique.length === 1) return unique[0]?.message\n return (\n <ul className=\"ml-4 flex list-disc flex-col gap-1\">\n {unique.map(\n (error, index) =>\n error?.message && <li key={index}>{error.message}</li>,\n )}\n </ul>\n )\n }, [children, errors])\n\n if (!content) return null\n\n return (\n <div\n role=\"alert\"\n data-slot=\"field-error\"\n className={cn('mt-0.5 text-sm font-normal text-error', className)}\n {...props}\n >\n {content}\n </div>\n )\n}\n\nexport {\n Field,\n FieldContent,\n FieldDescription,\n FieldError,\n FieldGroup,\n FieldLabel,\n FieldLegend,\n FieldSeparator,\n FieldSet,\n FieldTitle,\n FieldValue,\n}\nexport type { FieldProps }\n"],"mappings":"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"}
1
+ {"version":3,"file":"field.cjs","names":["React","useTheme","Separator"],"sources":["../../src/components/field.tsx"],"sourcesContent":["'use client'\n\nimport { cva } from 'class-variance-authority'\nimport * as React from 'react'\nimport { useId } from 'react'\nimport type {\n SparkInputColor,\n SparkInputStyle,\n SparkLabelPosition,\n} from '../lib/theme-types'\nimport { cn } from '../utils/cn'\nimport { Separator } from './separator'\nimport { useTheme } from './theme'\n\ntype FieldContextValue = {\n id: string\n descriptionId: string\n hasDescription: boolean\n setHasDescription: (has: boolean) => void\n labelPosition: SparkLabelPosition\n inputStyle: SparkInputStyle\n inputColor: SparkInputColor\n}\n\nconst FieldContext = React.createContext<FieldContextValue | null>(null)\n\nexport function useFieldContext() {\n return React.useContext(FieldContext)\n}\n\n// Field→Theme→default resolution + id/aria-describedby wiring, shared by every\n// control that can sit inside a Field (Input, SelectTrigger, …) so they can't\n// drift on how a style/color/id resolves. `variant` is the control's own\n// per-instance override (already normalized — e.g. Input maps its 'none' to\n// undefined before calling this).\nexport function useFieldControl(options?: {\n id?: string\n ariaDescribedBy?: string\n variant?: SparkInputStyle\n}) {\n const field = useFieldContext()\n const theme = useTheme()\n const id = options?.id ?? field?.id\n const descriptionId = field?.hasDescription ? field.descriptionId : undefined\n const ariaDescribedBy =\n [descriptionId, options?.ariaDescribedBy].filter(Boolean).join(' ') ||\n undefined\n const inputStyle =\n options?.variant ?? field?.inputStyle ?? theme.inputStyle ?? 'soft'\n const inputColor = field?.inputColor ?? theme.inputColor ?? 'brand'\n return { field, id, ariaDescribedBy, inputStyle, inputColor }\n}\n\nfunction FieldSet({ className, ...props }: React.ComponentProps<'fieldset'>) {\n return (\n <fieldset\n data-slot=\"field-set\"\n className={cn('flex flex-col gap-4', className)}\n {...props}\n />\n )\n}\n\nfunction FieldLegend({\n className,\n variant = 'legend',\n ...props\n}: React.ComponentProps<'legend'> & { variant?: 'legend' | 'label' }) {\n return (\n <legend\n data-slot=\"field-legend\"\n data-variant={variant}\n className={cn(\n 'mb-1.5 font-medium text-gray data-[variant=label]:text-sm data-[variant=legend]:text-base',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction FieldGroup({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"field-group\"\n className={cn('group/field-group flex w-full flex-col gap-4', className)}\n {...props}\n />\n )\n}\n\nconst fieldVariants = cva(\n 'group/field relative flex w-full flex-col data-[invalid=true]:text-error-active',\n {\n variants: {\n labelPosition: {\n // inset puts label + input inside one shell, so the shell is the box\n // focus inside inset is the classic underline cue, not a shell ring\n inset: 'gap-y-1 rounded-lg px-4 py-3',\n outset: 'gap-y-2',\n },\n inputStyle: { soft: '', surface: '', outlined: '', ghost: '' },\n inputColor: { brand: '', gray: '' },\n },\n compoundVariants: [\n {\n labelPosition: 'inset',\n inputStyle: 'soft',\n inputColor: 'brand',\n class:\n 'bg-input-base has-[:is(input,[data-slot=select-trigger]):not(:disabled)]:hover:bg-input-base-hover',\n },\n {\n labelPosition: 'inset',\n inputStyle: 'soft',\n inputColor: 'gray',\n class:\n 'bg-base-gray-soft has-[:is(input,[data-slot=select-trigger]):not(:disabled)]:hover:bg-gray-a4',\n },\n {\n labelPosition: 'inset',\n inputStyle: 'surface',\n inputColor: 'brand',\n class: 'border border-input bg-base-accent-surface',\n },\n {\n labelPosition: 'inset',\n inputStyle: 'surface',\n inputColor: 'gray',\n class: 'border border-input-gray bg-base-gray-surface',\n },\n {\n labelPosition: 'inset',\n inputStyle: 'outlined',\n inputColor: 'brand',\n class: 'border border-input',\n },\n {\n labelPosition: 'inset',\n inputStyle: 'outlined',\n inputColor: 'gray',\n class: 'border border-input-gray',\n },\n // ghost inset = bare label + underlined input; the input carries the line\n {\n labelPosition: 'inset',\n inputStyle: 'ghost',\n class: 'rounded-none px-0',\n },\n // shared inset states: filled shells swap bg, bordered shells swap border\n // invalid hover deepens the error tint instead of falling back to accent\n {\n labelPosition: 'inset',\n inputStyle: ['soft', 'surface'],\n class:\n 'data-[disabled=true]:bg-base-gray-soft data-[invalid=true]:bg-base-error-soft data-[invalid=true]:has-[:is(input,[data-slot=select-trigger]):not(:disabled)]:hover:bg-red-a4',\n },\n {\n labelPosition: 'inset',\n inputStyle: ['surface', 'outlined'],\n class:\n 'data-[disabled=true]:border-input-disabled data-[invalid=true]:border-input-invalid',\n },\n ],\n },\n)\n\ninterface FieldProps extends React.ComponentProps<'div'> {\n labelPosition?: SparkLabelPosition\n inputStyle?: SparkInputStyle\n inputColor?: SparkInputColor\n}\n\nfunction Field({\n className,\n labelPosition: labelPositionProp,\n inputStyle: inputStyleProp,\n inputColor: inputColorProp,\n ...props\n}: FieldProps) {\n const id = useId()\n const [hasDescription, setHasDescription] = React.useState(false)\n // knobs are structural (they move the label / pick the box carrier), so they\n // resolve here via the <Theme> context; props override per instance\n const theme = useTheme()\n const labelPosition = labelPositionProp ?? theme.labelPosition ?? 'inset'\n const inputStyle = inputStyleProp ?? theme.inputStyle ?? 'soft'\n const inputColor = inputColorProp ?? theme.inputColor ?? 'brand'\n const value = React.useMemo<FieldContextValue>(\n () => ({\n id: `field-${id}`,\n descriptionId: `field-${id}-description`,\n hasDescription,\n setHasDescription,\n labelPosition,\n inputStyle,\n inputColor,\n }),\n [id, hasDescription, labelPosition, inputStyle, inputColor],\n )\n\n return (\n <FieldContext.Provider value={value}>\n <div\n role=\"group\"\n data-slot=\"field\"\n data-label-position={labelPosition}\n data-input-style={inputStyle}\n data-input-color={inputColor}\n className={cn(\n fieldVariants({ labelPosition, inputStyle, inputColor }),\n className,\n )}\n {...props}\n />\n </FieldContext.Provider>\n )\n}\n\nfunction FieldContent({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"field-content\"\n className={cn(\n 'flex min-w-0 flex-1 flex-col gap-0.5 leading-snug',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction FieldLabel({\n className,\n htmlFor,\n srOnly,\n ...props\n}: React.ComponentProps<'label'> & { srOnly?: boolean }) {\n const field = useFieldContext()\n return (\n <label\n data-slot=\"field-label\"\n className={cn(\n // labels stay full-contrast even when disabled — the control itself\n // (dimmed text, gray shell) signals the state\n 'text-sm leading-5 font-normal text-gray-light transition-all group-data-[invalid=true]/field:text-error-active! motion-reduce:transition-none',\n // visually hidden but kept in the a11y tree (still names + focuses the control)\n srOnly && 'sr-only',\n className,\n )}\n htmlFor={htmlFor ?? field?.id}\n {...props}\n />\n )\n}\n\nfunction FieldValue({\n className,\n id,\n title,\n truncate,\n children,\n ...props\n}: React.ComponentProps<'div'> & { truncate?: boolean }) {\n const field = useFieldContext()\n return (\n <div\n data-slot=\"field-value\"\n id={id ?? field?.id}\n // truncated string values keep the full text reachable on hover\n title={\n title ??\n (truncate && typeof children === 'string' ? children : undefined)\n }\n className={cn(\n // values are content, not controls — disabled dims but stays ≥4.5:1\n 'min-h-8 w-full text-base text-gray tabular-nums group-data-[disabled=true]/field:opacity-70',\n truncate\n ? 'block truncate leading-8'\n : 'inline-flex items-center wrap-anywhere whitespace-pre-wrap',\n className,\n )}\n {...props}\n >\n {children}\n </div>\n )\n}\n\nfunction FieldTitle({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"field-title\"\n className={cn(\n 'flex w-fit items-center gap-2 text-sm font-medium text-gray',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction FieldDescription({\n className,\n id,\n ...props\n}: React.ComponentProps<'div'>) {\n const field = useFieldContext()\n const setHasDescription = field?.setHasDescription\n\n React.useEffect(() => {\n if (!setHasDescription) return\n setHasDescription(true)\n return () => setHasDescription(false)\n }, [setHasDescription])\n\n return (\n <div\n data-slot=\"field-description\"\n id={id ?? field?.descriptionId}\n className={cn('mt-0.5 text-sm leading-normal text-gray-light', className)}\n {...props}\n />\n )\n}\n\nfunction FieldSeparator({\n children,\n className,\n ...props\n}: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"field-separator\"\n data-content={!!children}\n className={cn('relative -my-2 h-5 text-sm', className)}\n {...props}\n >\n <Separator className=\"absolute inset-0 top-1/2\" />\n {children && (\n <span\n className=\"relative mx-auto block w-fit bg-(--spark-background) px-2 text-gray-light\"\n data-slot=\"field-separator-content\"\n >\n {children}\n </span>\n )}\n </div>\n )\n}\n\nfunction FieldError({\n className,\n children,\n errors,\n ...props\n}: React.ComponentProps<'div'> & {\n errors?: Array<{ message?: string } | undefined>\n}) {\n const content = React.useMemo(() => {\n if (children) return children\n if (!errors?.length) return null\n const unique = [\n ...new Map(errors.map((error) => [error?.message, error])).values(),\n ]\n if (unique.length === 1) return unique[0]?.message\n return (\n <ul className=\"ml-4 flex list-disc flex-col gap-1\">\n {unique.map(\n (error, index) =>\n error?.message && <li key={index}>{error.message}</li>,\n )}\n </ul>\n )\n }, [children, errors])\n\n if (!content) return null\n\n return (\n <div\n role=\"alert\"\n data-slot=\"field-error\"\n className={cn('mt-0.5 text-sm font-normal text-error', className)}\n {...props}\n >\n {content}\n </div>\n )\n}\n\nexport {\n Field,\n FieldContent,\n FieldDescription,\n FieldError,\n FieldGroup,\n FieldLabel,\n FieldLegend,\n FieldSeparator,\n FieldSet,\n FieldTitle,\n FieldValue,\n}\nexport type { FieldProps }\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
 
3
- import { a as SparkLabelPosition, i as SparkInputStyle, r as SparkInputColor } from "../theme-types-BDdoRxXa.js";
3
+ import { a as SparkLabelPosition, i as SparkInputStyle, r as SparkInputColor } from "../theme-types-BKlzRiyw.js";
4
4
  import * as React$1 from "react";
5
5
  import * as _$react_jsx_runtime0 from "react/jsx-runtime";
6
6
 
@@ -2,7 +2,7 @@
2
2
  "use client";
3
3
  import { cn } from "../utils/cn.js";
4
4
  import { Separator } from "./separator.js";
5
- import { n as useTheme } from "../theme-8PDO9E0S.js";
5
+ import { useTheme } from "./theme.js";
6
6
  import * as React$1 from "react";
7
7
  import { useId } from "react";
8
8
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -6,7 +6,7 @@ import { VariantProps } from "class-variance-authority";
6
6
 
7
7
  //#region src/components/info-block.d.ts
8
8
  declare const InfoBlock: React$1.ForwardRefExoticComponent<React$1.HTMLAttributes<HTMLDivElement> & VariantProps<(props?: ({
9
- variant?: "bare" | "default" | null | undefined;
9
+ variant?: "default" | "bare" | null | undefined;
10
10
  } & _$class_variance_authority_types0.ClassProp) | undefined) => string> & React$1.RefAttributes<HTMLDivElement>>;
11
11
  declare const InfoBlockIcon: React$1.ForwardRefExoticComponent<React$1.HTMLAttributes<HTMLDivElement> & React$1.RefAttributes<HTMLDivElement>>;
12
12
  declare const InfoBlockContent: React$1.ForwardRefExoticComponent<React$1.HTMLAttributes<HTMLDivElement> & React$1.RefAttributes<HTMLDivElement>>;
@@ -6,7 +6,7 @@ import * as _$class_variance_authority_types0 from "class-variance-authority/typ
6
6
 
7
7
  //#region src/components/info-block.d.ts
8
8
  declare const InfoBlock: React$1.ForwardRefExoticComponent<React$1.HTMLAttributes<HTMLDivElement> & VariantProps<(props?: ({
9
- variant?: "bare" | "default" | null | undefined;
9
+ variant?: "default" | "bare" | null | undefined;
10
10
  } & _$class_variance_authority_types0.ClassProp) | undefined) => string> & React$1.RefAttributes<HTMLDivElement>>;
11
11
  declare const InfoBlockIcon: React$1.ForwardRefExoticComponent<React$1.HTMLAttributes<HTMLDivElement> & React$1.RefAttributes<HTMLDivElement>>;
12
12
  declare const InfoBlockContent: React$1.ForwardRefExoticComponent<React$1.HTMLAttributes<HTMLDivElement> & React$1.RefAttributes<HTMLDivElement>>;
@@ -2,7 +2,7 @@
2
2
  "use client";
3
3
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
4
4
  const require_chunk = require("../chunk-aJGBMT86.cjs");
5
- const require_theme = require("../theme-ClRJhexF.cjs");
5
+ const require_components_theme = require("./theme.cjs");
6
6
  const require_components_field = require("./field.cjs");
7
7
  const require_components_input = require("./input.cjs");
8
8
  let react = require("react");
@@ -107,7 +107,7 @@ const inputGroupVariants = (0, class_variance_authority.cva)("group/input-group
107
107
  });
108
108
  function InputGroup({ className, ...props }) {
109
109
  const field = require_components_field.useFieldContext();
110
- const theme = require_theme.useTheme();
110
+ const theme = require_components_theme.useTheme();
111
111
  const inputStyle = field?.inputStyle ?? theme.inputStyle ?? "soft";
112
112
  const inputColor = field?.inputColor ?? theme.inputColor ?? "brand";
113
113
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
@@ -1 +1 @@
1
- {"version":3,"file":"input-group.cjs","names":["useFieldContext","useTheme","React","Input"],"sources":["../../src/components/input-group.tsx"],"sourcesContent":["'use client'\n\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport * as React from 'react'\nimport { cn } from '../utils/cn'\nimport { useFieldContext } from './field'\nimport { Input, type InputProps } from './input'\nimport { useTheme } from './theme'\n\nconst GHOST =\n 'rounded-none border-0 border-b-2 px-0 focus-within:border-b-input-active has-[[data-slot=input][aria-invalid=true]]:border-b-input-invalid has-[[data-slot=input][aria-invalid=true]]:focus-within:border-b-red-a8! group-data-[invalid=true]/field:border-b-input-invalid! group-data-[invalid=true]/field:focus-within:border-b-red-a8!'\n\nconst inputGroupVariants = cva(\n 'group/input-group relative flex h-10 w-full min-w-0 items-center gap-2 bg-transparent transition-[color,border-color] outline-none motion-reduce:transition-none',\n {\n variants: {\n chrome: {\n // inside an inset field the shell is the box; the group keeps the\n // classic underline (inputs inside stay chrome-less)\n inset: GHOST,\n // h-11 matches the standalone Input box\n box: 'h-11 rounded-lg px-3 transition-all motion-reduce:transition-none',\n },\n inputStyle: { soft: '', surface: '', outlined: '', ghost: '' },\n inputColor: { brand: '', gray: '' },\n },\n compoundVariants: [\n {\n chrome: 'box',\n inputStyle: 'soft',\n // invalid hover deepens the error tint instead of the accent hover\n class:\n 'group-data-[invalid=true]/field:bg-base-error-soft focus-within:ring-2 focus-within:ring-offset-2 group-data-[invalid=true]/field:focus-within:ring-red-a8 has-[[data-slot=input][aria-invalid=true]]:bg-base-error-soft has-[[data-slot=input][aria-invalid=true]]:focus-within:ring-red-a8 has-[[data-slot=input][aria-invalid=true]:not(:disabled)]:hover:bg-red-a4 group-data-[invalid=true]/field:has-[input:not(:disabled)]:hover:bg-red-a4',\n },\n {\n chrome: 'box',\n inputStyle: 'soft',\n inputColor: 'brand',\n class:\n 'bg-input-base focus-within:ring-input-active has-[input:not(:disabled)]:hover:bg-input-base-hover',\n },\n {\n chrome: 'box',\n inputStyle: 'soft',\n inputColor: 'gray',\n class:\n 'bg-base-gray-soft focus-within:ring-gray-a8 has-[input:not(:disabled)]:hover:bg-gray-a4',\n },\n {\n chrome: 'box',\n inputStyle: ['surface', 'outlined'],\n class:\n 'border group-data-[invalid=true]/field:border-input-invalid focus-within:ring-1 group-data-[invalid=true]/field:focus-within:border-input-invalid! group-data-[invalid=true]/field:focus-within:ring-red-a4! has-[[data-slot=input][aria-invalid=true]]:border-input-invalid has-[[data-slot=input][aria-invalid=true]]:focus-within:border-input-invalid! has-[[data-slot=input][aria-invalid=true]]:focus-within:ring-red-a4!',\n },\n {\n chrome: 'box',\n inputStyle: 'surface',\n inputColor: 'brand',\n class:\n 'border-input bg-base-accent-surface focus-within:border-input-active focus-within:ring-spark-a4',\n },\n {\n chrome: 'box',\n inputStyle: 'surface',\n inputColor: 'gray',\n class:\n 'border-input-gray bg-base-gray-surface focus-within:border-gray-a8 focus-within:ring-gray-a4',\n },\n {\n chrome: 'box',\n inputStyle: 'outlined',\n inputColor: 'brand',\n class:\n 'border-input focus-within:border-input-active focus-within:ring-spark-a4',\n },\n {\n chrome: 'box',\n inputStyle: 'outlined',\n inputColor: 'gray',\n class:\n 'border-input-gray focus-within:border-gray-a8 focus-within:ring-gray-a4',\n },\n { chrome: 'box', inputStyle: 'ghost', class: GHOST },\n {\n chrome: 'box',\n inputStyle: 'ghost',\n inputColor: 'brand',\n class: 'border-b-input',\n },\n {\n chrome: 'box',\n inputStyle: 'ghost',\n inputColor: 'gray',\n class: 'border-b-input-gray',\n },\n { chrome: 'inset', inputColor: 'brand', class: 'border-b-input' },\n { chrome: 'inset', inputColor: 'gray', class: 'border-b-input-gray' },\n ],\n },\n)\n\n// The group carries the box + focus/invalid states; inputs inside are\n// chrome-less (variant=\"none\"). Style follows the enclosing Field's knobs,\n// else the <Theme> input-style/input-color knobs.\nfunction InputGroup({ className, ...props }: React.ComponentProps<'div'>) {\n const field = useFieldContext()\n const theme = useTheme()\n const inputStyle = field?.inputStyle ?? theme.inputStyle ?? 'soft'\n const inputColor = field?.inputColor ?? theme.inputColor ?? 'brand'\n const chrome = field?.labelPosition === 'inset' ? 'inset' : 'box'\n return (\n <div\n data-slot=\"input-group\"\n role=\"group\"\n className={cn(\n inputGroupVariants({ chrome, inputStyle, inputColor }),\n className,\n )}\n {...props}\n />\n )\n}\n\nconst inputGroupAddonVariants = cva(\n 'flex h-auto cursor-text items-center justify-center gap-2 py-2 text-sm font-medium text-gray-light select-none [&_svg:not([class*=size-])]:size-4',\n {\n variants: {\n align: {\n // button addons bring their own inner padding — pull them halfway\n // into the group's px so the visual gap matches the text side\n 'inline-start': 'order-first has-[>button]:-ml-2',\n 'inline-end': 'order-last has-[>button]:-mr-2',\n },\n },\n defaultVariants: {\n align: 'inline-start',\n },\n },\n)\n\nfunction InputGroupAddon({\n className,\n align = 'inline-start',\n ...props\n}: React.ComponentProps<'div'> & VariantProps<typeof inputGroupAddonVariants>) {\n return (\n <div\n role=\"group\"\n data-slot=\"input-group-addon\"\n data-align={align}\n className={cn(inputGroupAddonVariants({ align }), className)}\n onClick={(event) => {\n if ((event.target as HTMLElement).closest('button')) return\n event.currentTarget.parentElement?.querySelector('input')?.focus()\n }}\n {...props}\n />\n )\n}\n\nfunction InputGroupText({ className, ...props }: React.ComponentProps<'span'>) {\n return (\n <span\n className={cn(\n 'flex items-center gap-2 text-xs text-gray-light [&_svg]:pointer-events-none [&_svg:not([class*=size-])]:size-4',\n className,\n )}\n {...props}\n />\n )\n}\n\nconst InputGroupInput = React.forwardRef<HTMLInputElement, InputProps>(\n function InputGroupInput({ className, ...props }, ref) {\n return (\n <Input\n data-slot=\"input\"\n variant=\"none\"\n className={cn('flex-1', className)}\n ref={ref}\n {...props}\n />\n )\n },\n)\n\nexport { InputGroup, InputGroupAddon, InputGroupInput, InputGroupText }\n"],"mappings":";;;;;;;;;;;;;AASA,MAAM,QACJ;AAEF,MAAM,sBAAA,GAAA,yBAAA,KACJ,oKACA;CACE,UAAU;EACR,QAAQ;GAGN,OAAO;GAEP,KAAK;GACN;EACD,YAAY;GAAE,MAAM;GAAI,SAAS;GAAI,UAAU;GAAI,OAAO;GAAI;EAC9D,YAAY;GAAE,OAAO;GAAI,MAAM;GAAI;EACpC;CACD,kBAAkB;EAChB;GACE,QAAQ;GACR,YAAY;GAEZ,OACE;GACH;EACD;GACE,QAAQ;GACR,YAAY;GACZ,YAAY;GACZ,OACE;GACH;EACD;GACE,QAAQ;GACR,YAAY;GACZ,YAAY;GACZ,OACE;GACH;EACD;GACE,QAAQ;GACR,YAAY,CAAC,WAAW,WAAW;GACnC,OACE;GACH;EACD;GACE,QAAQ;GACR,YAAY;GACZ,YAAY;GACZ,OACE;GACH;EACD;GACE,QAAQ;GACR,YAAY;GACZ,YAAY;GACZ,OACE;GACH;EACD;GACE,QAAQ;GACR,YAAY;GACZ,YAAY;GACZ,OACE;GACH;EACD;GACE,QAAQ;GACR,YAAY;GACZ,YAAY;GACZ,OACE;GACH;EACD;GAAE,QAAQ;GAAO,YAAY;GAAS,OAAO;GAAO;EACpD;GACE,QAAQ;GACR,YAAY;GACZ,YAAY;GACZ,OAAO;GACR;EACD;GACE,QAAQ;GACR,YAAY;GACZ,YAAY;GACZ,OAAO;GACR;EACD;GAAE,QAAQ;GAAS,YAAY;GAAS,OAAO;GAAkB;EACjE;GAAE,QAAQ;GAAS,YAAY;GAAQ,OAAO;GAAuB;EACtE;CACF,CACF;AAKD,SAAS,WAAW,EAAE,WAAW,GAAG,SAAsC;CACxE,MAAM,QAAQA,yBAAAA,iBAAiB;CAC/B,MAAM,QAAQC,cAAAA,UAAU;CACxB,MAAM,aAAa,OAAO,cAAc,MAAM,cAAc;CAC5D,MAAM,aAAa,OAAO,cAAc,MAAM,cAAc;AAE5D,QACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;EACE,aAAU;EACV,MAAK;EACL,YAAA,GAAA,OAAA,IACE,mBAAmB;GAAE,QANZ,OAAO,kBAAkB,UAAU,UAAU;GAMzB;GAAY;GAAY,CAAC,EACtD,UACD;EACD,GAAI;EACJ,CAAA;;AAIN,MAAM,2BAAA,GAAA,yBAAA,KACJ,qJACA;CACE,UAAU,EACR,OAAO;EAGL,gBAAgB;EAChB,cAAc;EACf,EACF;CACD,iBAAiB,EACf,OAAO,gBACR;CACF,CACF;AAED,SAAS,gBAAgB,EACvB,WACA,QAAQ,gBACR,GAAG,SAC0E;AAC7E,QACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;EACE,MAAK;EACL,aAAU;EACV,cAAY;EACZ,YAAA,GAAA,OAAA,IAAc,wBAAwB,EAAE,OAAO,CAAC,EAAE,UAAU;EAC5D,UAAU,UAAU;AAClB,OAAK,MAAM,OAAuB,QAAQ,SAAS,CAAE;AACrD,SAAM,cAAc,eAAe,cAAc,QAAQ,EAAE,OAAO;;EAEpE,GAAI;EACJ,CAAA;;AAIN,SAAS,eAAe,EAAE,WAAW,GAAG,SAAuC;AAC7E,QACE,iBAAA,GAAA,kBAAA,KAAC,QAAD;EACE,YAAA,GAAA,OAAA,IACE,kHACA,UACD;EACD,GAAI;EACJ,CAAA;;AAIN,MAAM,kBAAkBC,MAAM,WAC5B,SAAS,gBAAgB,EAAE,WAAW,GAAG,SAAS,KAAK;AACrD,QACE,iBAAA,GAAA,kBAAA,KAACC,yBAAAA,OAAD;EACE,aAAU;EACV,SAAQ;EACR,YAAA,GAAA,OAAA,IAAc,UAAU,UAAU;EAC7B;EACL,GAAI;EACJ,CAAA;EAGP"}
1
+ {"version":3,"file":"input-group.cjs","names":["useFieldContext","useTheme","React","Input"],"sources":["../../src/components/input-group.tsx"],"sourcesContent":["'use client'\n\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport * as React from 'react'\nimport { cn } from '../utils/cn'\nimport { useFieldContext } from './field'\nimport { Input, type InputProps } from './input'\nimport { useTheme } from './theme'\n\nconst GHOST =\n 'rounded-none border-0 border-b-2 px-0 focus-within:border-b-input-active has-[[data-slot=input][aria-invalid=true]]:border-b-input-invalid has-[[data-slot=input][aria-invalid=true]]:focus-within:border-b-red-a8! group-data-[invalid=true]/field:border-b-input-invalid! group-data-[invalid=true]/field:focus-within:border-b-red-a8!'\n\nconst inputGroupVariants = cva(\n 'group/input-group relative flex h-10 w-full min-w-0 items-center gap-2 bg-transparent transition-[color,border-color] outline-none motion-reduce:transition-none',\n {\n variants: {\n chrome: {\n // inside an inset field the shell is the box; the group keeps the\n // classic underline (inputs inside stay chrome-less)\n inset: GHOST,\n // h-11 matches the standalone Input box\n box: 'h-11 rounded-lg px-3 transition-all motion-reduce:transition-none',\n },\n inputStyle: { soft: '', surface: '', outlined: '', ghost: '' },\n inputColor: { brand: '', gray: '' },\n },\n compoundVariants: [\n {\n chrome: 'box',\n inputStyle: 'soft',\n // invalid hover deepens the error tint instead of the accent hover\n class:\n 'group-data-[invalid=true]/field:bg-base-error-soft focus-within:ring-2 focus-within:ring-offset-2 group-data-[invalid=true]/field:focus-within:ring-red-a8 has-[[data-slot=input][aria-invalid=true]]:bg-base-error-soft has-[[data-slot=input][aria-invalid=true]]:focus-within:ring-red-a8 has-[[data-slot=input][aria-invalid=true]:not(:disabled)]:hover:bg-red-a4 group-data-[invalid=true]/field:has-[input:not(:disabled)]:hover:bg-red-a4',\n },\n {\n chrome: 'box',\n inputStyle: 'soft',\n inputColor: 'brand',\n class:\n 'bg-input-base focus-within:ring-input-active has-[input:not(:disabled)]:hover:bg-input-base-hover',\n },\n {\n chrome: 'box',\n inputStyle: 'soft',\n inputColor: 'gray',\n class:\n 'bg-base-gray-soft focus-within:ring-gray-a8 has-[input:not(:disabled)]:hover:bg-gray-a4',\n },\n {\n chrome: 'box',\n inputStyle: ['surface', 'outlined'],\n class:\n 'border group-data-[invalid=true]/field:border-input-invalid focus-within:ring-1 group-data-[invalid=true]/field:focus-within:border-input-invalid! group-data-[invalid=true]/field:focus-within:ring-red-a4! has-[[data-slot=input][aria-invalid=true]]:border-input-invalid has-[[data-slot=input][aria-invalid=true]]:focus-within:border-input-invalid! has-[[data-slot=input][aria-invalid=true]]:focus-within:ring-red-a4!',\n },\n {\n chrome: 'box',\n inputStyle: 'surface',\n inputColor: 'brand',\n class:\n 'border-input bg-base-accent-surface focus-within:border-input-active focus-within:ring-spark-a4',\n },\n {\n chrome: 'box',\n inputStyle: 'surface',\n inputColor: 'gray',\n class:\n 'border-input-gray bg-base-gray-surface focus-within:border-gray-a8 focus-within:ring-gray-a4',\n },\n {\n chrome: 'box',\n inputStyle: 'outlined',\n inputColor: 'brand',\n class:\n 'border-input focus-within:border-input-active focus-within:ring-spark-a4',\n },\n {\n chrome: 'box',\n inputStyle: 'outlined',\n inputColor: 'gray',\n class:\n 'border-input-gray focus-within:border-gray-a8 focus-within:ring-gray-a4',\n },\n { chrome: 'box', inputStyle: 'ghost', class: GHOST },\n {\n chrome: 'box',\n inputStyle: 'ghost',\n inputColor: 'brand',\n class: 'border-b-input',\n },\n {\n chrome: 'box',\n inputStyle: 'ghost',\n inputColor: 'gray',\n class: 'border-b-input-gray',\n },\n { chrome: 'inset', inputColor: 'brand', class: 'border-b-input' },\n { chrome: 'inset', inputColor: 'gray', class: 'border-b-input-gray' },\n ],\n },\n)\n\n// The group carries the box + focus/invalid states; inputs inside are\n// chrome-less (variant=\"none\"). Style follows the enclosing Field's knobs,\n// else the <Theme> input-style/input-color knobs.\nfunction InputGroup({ className, ...props }: React.ComponentProps<'div'>) {\n const field = useFieldContext()\n const theme = useTheme()\n const inputStyle = field?.inputStyle ?? theme.inputStyle ?? 'soft'\n const inputColor = field?.inputColor ?? theme.inputColor ?? 'brand'\n const chrome = field?.labelPosition === 'inset' ? 'inset' : 'box'\n return (\n <div\n data-slot=\"input-group\"\n role=\"group\"\n className={cn(\n inputGroupVariants({ chrome, inputStyle, inputColor }),\n className,\n )}\n {...props}\n />\n )\n}\n\nconst inputGroupAddonVariants = cva(\n 'flex h-auto cursor-text items-center justify-center gap-2 py-2 text-sm font-medium text-gray-light select-none [&_svg:not([class*=size-])]:size-4',\n {\n variants: {\n align: {\n // button addons bring their own inner padding — pull them halfway\n // into the group's px so the visual gap matches the text side\n 'inline-start': 'order-first has-[>button]:-ml-2',\n 'inline-end': 'order-last has-[>button]:-mr-2',\n },\n },\n defaultVariants: {\n align: 'inline-start',\n },\n },\n)\n\nfunction InputGroupAddon({\n className,\n align = 'inline-start',\n ...props\n}: React.ComponentProps<'div'> & VariantProps<typeof inputGroupAddonVariants>) {\n return (\n <div\n role=\"group\"\n data-slot=\"input-group-addon\"\n data-align={align}\n className={cn(inputGroupAddonVariants({ align }), className)}\n onClick={(event) => {\n if ((event.target as HTMLElement).closest('button')) return\n event.currentTarget.parentElement?.querySelector('input')?.focus()\n }}\n {...props}\n />\n )\n}\n\nfunction InputGroupText({ className, ...props }: React.ComponentProps<'span'>) {\n return (\n <span\n className={cn(\n 'flex items-center gap-2 text-xs text-gray-light [&_svg]:pointer-events-none [&_svg:not([class*=size-])]:size-4',\n className,\n )}\n {...props}\n />\n )\n}\n\nconst InputGroupInput = React.forwardRef<HTMLInputElement, InputProps>(\n function InputGroupInput({ className, ...props }, ref) {\n return (\n <Input\n data-slot=\"input\"\n variant=\"none\"\n className={cn('flex-1', className)}\n ref={ref}\n {...props}\n />\n )\n },\n)\n\nexport { InputGroup, InputGroupAddon, InputGroupInput, InputGroupText }\n"],"mappings":";;;;;;;;;;;;;AASA,MAAM,QACJ;AAEF,MAAM,sBAAA,GAAA,yBAAA,KACJ,oKACA;CACE,UAAU;EACR,QAAQ;GAGN,OAAO;GAEP,KAAK;GACN;EACD,YAAY;GAAE,MAAM;GAAI,SAAS;GAAI,UAAU;GAAI,OAAO;GAAI;EAC9D,YAAY;GAAE,OAAO;GAAI,MAAM;GAAI;EACpC;CACD,kBAAkB;EAChB;GACE,QAAQ;GACR,YAAY;GAEZ,OACE;GACH;EACD;GACE,QAAQ;GACR,YAAY;GACZ,YAAY;GACZ,OACE;GACH;EACD;GACE,QAAQ;GACR,YAAY;GACZ,YAAY;GACZ,OACE;GACH;EACD;GACE,QAAQ;GACR,YAAY,CAAC,WAAW,WAAW;GACnC,OACE;GACH;EACD;GACE,QAAQ;GACR,YAAY;GACZ,YAAY;GACZ,OACE;GACH;EACD;GACE,QAAQ;GACR,YAAY;GACZ,YAAY;GACZ,OACE;GACH;EACD;GACE,QAAQ;GACR,YAAY;GACZ,YAAY;GACZ,OACE;GACH;EACD;GACE,QAAQ;GACR,YAAY;GACZ,YAAY;GACZ,OACE;GACH;EACD;GAAE,QAAQ;GAAO,YAAY;GAAS,OAAO;GAAO;EACpD;GACE,QAAQ;GACR,YAAY;GACZ,YAAY;GACZ,OAAO;GACR;EACD;GACE,QAAQ;GACR,YAAY;GACZ,YAAY;GACZ,OAAO;GACR;EACD;GAAE,QAAQ;GAAS,YAAY;GAAS,OAAO;GAAkB;EACjE;GAAE,QAAQ;GAAS,YAAY;GAAQ,OAAO;GAAuB;EACtE;CACF,CACF;AAKD,SAAS,WAAW,EAAE,WAAW,GAAG,SAAsC;CACxE,MAAM,QAAQA,yBAAAA,iBAAiB;CAC/B,MAAM,QAAQC,yBAAAA,UAAU;CACxB,MAAM,aAAa,OAAO,cAAc,MAAM,cAAc;CAC5D,MAAM,aAAa,OAAO,cAAc,MAAM,cAAc;AAE5D,QACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;EACE,aAAU;EACV,MAAK;EACL,YAAA,GAAA,OAAA,IACE,mBAAmB;GAAE,QANZ,OAAO,kBAAkB,UAAU,UAAU;GAMzB;GAAY;GAAY,CAAC,EACtD,UACD;EACD,GAAI;EACJ,CAAA;;AAIN,MAAM,2BAAA,GAAA,yBAAA,KACJ,qJACA;CACE,UAAU,EACR,OAAO;EAGL,gBAAgB;EAChB,cAAc;EACf,EACF;CACD,iBAAiB,EACf,OAAO,gBACR;CACF,CACF;AAED,SAAS,gBAAgB,EACvB,WACA,QAAQ,gBACR,GAAG,SAC0E;AAC7E,QACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;EACE,MAAK;EACL,aAAU;EACV,cAAY;EACZ,YAAA,GAAA,OAAA,IAAc,wBAAwB,EAAE,OAAO,CAAC,EAAE,UAAU;EAC5D,UAAU,UAAU;AAClB,OAAK,MAAM,OAAuB,QAAQ,SAAS,CAAE;AACrD,SAAM,cAAc,eAAe,cAAc,QAAQ,EAAE,OAAO;;EAEpE,GAAI;EACJ,CAAA;;AAIN,SAAS,eAAe,EAAE,WAAW,GAAG,SAAuC;AAC7E,QACE,iBAAA,GAAA,kBAAA,KAAC,QAAD;EACE,YAAA,GAAA,OAAA,IACE,kHACA,UACD;EACD,GAAI;EACJ,CAAA;;AAIN,MAAM,kBAAkBC,MAAM,WAC5B,SAAS,gBAAgB,EAAE,WAAW,GAAG,SAAS,KAAK;AACrD,QACE,iBAAA,GAAA,kBAAA,KAACC,yBAAAA,OAAD;EACE,aAAU;EACV,SAAQ;EACR,YAAA,GAAA,OAAA,IAAc,UAAU,UAAU;EAC7B;EACL,GAAI;EACJ,CAAA;EAGP"}
@@ -12,7 +12,7 @@ declare function InputGroup({
12
12
  ...props
13
13
  }: React$1.ComponentProps<'div'>): _$react_jsx_runtime0.JSX.Element;
14
14
  declare const inputGroupAddonVariants: (props?: ({
15
- align?: "inline-end" | "inline-start" | null | undefined;
15
+ align?: "inline-start" | "inline-end" | null | undefined;
16
16
  } & _$class_variance_authority_types0.ClassProp) | undefined) => string;
17
17
  declare function InputGroupAddon({
18
18
  className,
@@ -12,7 +12,7 @@ declare function InputGroup({
12
12
  ...props
13
13
  }: React$1.ComponentProps<'div'>): _$react_jsx_runtime0.JSX.Element;
14
14
  declare const inputGroupAddonVariants: (props?: ({
15
- align?: "inline-end" | "inline-start" | null | undefined;
15
+ align?: "inline-start" | "inline-end" | null | undefined;
16
16
  } & _$class_variance_authority_types0.ClassProp) | undefined) => string;
17
17
  declare function InputGroupAddon({
18
18
  className,