@customercity/react 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (205) hide show
  1. package/dist/components/agent-activity.d.ts +11 -0
  2. package/dist/components/agent-activity.d.ts.map +1 -0
  3. package/dist/components/agent-activity.js +9 -0
  4. package/dist/components/agent-activity.js.map +1 -0
  5. package/dist/components/agent-card.d.ts +11 -0
  6. package/dist/components/agent-card.d.ts.map +1 -0
  7. package/dist/components/agent-card.js +8 -0
  8. package/dist/components/agent-card.js.map +1 -0
  9. package/dist/components/agent-message.d.ts +14 -0
  10. package/dist/components/agent-message.d.ts.map +1 -0
  11. package/dist/components/agent-message.js +15 -0
  12. package/dist/components/agent-message.js.map +1 -0
  13. package/dist/components/alert.d.ts +12 -0
  14. package/dist/components/alert.d.ts.map +1 -0
  15. package/dist/components/alert.js +27 -0
  16. package/dist/components/alert.js.map +1 -0
  17. package/dist/components/avatar.d.ts +11 -0
  18. package/dist/components/avatar.d.ts.map +1 -0
  19. package/dist/components/avatar.js +25 -0
  20. package/dist/components/avatar.js.map +1 -0
  21. package/dist/components/breadcrumbs.d.ts +10 -0
  22. package/dist/components/breadcrumbs.d.ts.map +1 -0
  23. package/dist/components/breadcrumbs.js +10 -0
  24. package/dist/components/breadcrumbs.js.map +1 -0
  25. package/dist/components/button.d.ts +17 -0
  26. package/dist/components/button.d.ts.map +1 -0
  27. package/dist/components/button.js +34 -0
  28. package/dist/components/button.js.map +1 -0
  29. package/dist/components/card.d.ts +19 -0
  30. package/dist/components/card.d.ts.map +1 -0
  31. package/dist/components/card.js +22 -0
  32. package/dist/components/card.js.map +1 -0
  33. package/dist/components/checkbox.d.ts +8 -0
  34. package/dist/components/checkbox.d.ts.map +1 -0
  35. package/dist/components/checkbox.js +16 -0
  36. package/dist/components/checkbox.js.map +1 -0
  37. package/dist/components/chip.d.ts +12 -0
  38. package/dist/components/chip.d.ts.map +1 -0
  39. package/dist/components/chip.js +14 -0
  40. package/dist/components/chip.js.map +1 -0
  41. package/dist/components/citations.d.ts +18 -0
  42. package/dist/components/citations.d.ts.map +1 -0
  43. package/dist/components/citations.js +22 -0
  44. package/dist/components/citations.js.map +1 -0
  45. package/dist/components/code-block.d.ts +9 -0
  46. package/dist/components/code-block.d.ts.map +1 -0
  47. package/dist/components/code-block.js +20 -0
  48. package/dist/components/code-block.js.map +1 -0
  49. package/dist/components/combobox.d.ts +17 -0
  50. package/dist/components/combobox.d.ts.map +1 -0
  51. package/dist/components/combobox.js +41 -0
  52. package/dist/components/combobox.js.map +1 -0
  53. package/dist/components/confidence-meter.d.ts +12 -0
  54. package/dist/components/confidence-meter.d.ts.map +1 -0
  55. package/dist/components/confidence-meter.js +15 -0
  56. package/dist/components/confidence-meter.js.map +1 -0
  57. package/dist/components/data-table.d.ts +17 -0
  58. package/dist/components/data-table.d.ts.map +1 -0
  59. package/dist/components/data-table.js +8 -0
  60. package/dist/components/data-table.js.map +1 -0
  61. package/dist/components/date-picker.d.ts +11 -0
  62. package/dist/components/date-picker.d.ts.map +1 -0
  63. package/dist/components/date-picker.js +6 -0
  64. package/dist/components/date-picker.js.map +1 -0
  65. package/dist/components/dialog.d.ts +10 -0
  66. package/dist/components/dialog.d.ts.map +1 -0
  67. package/dist/components/dialog.js +21 -0
  68. package/dist/components/dialog.js.map +1 -0
  69. package/dist/components/drawer.d.ts +11 -0
  70. package/dist/components/drawer.d.ts.map +1 -0
  71. package/dist/components/drawer.js +18 -0
  72. package/dist/components/drawer.js.map +1 -0
  73. package/dist/components/dropdown-menu.d.ts +10 -0
  74. package/dist/components/dropdown-menu.d.ts.map +1 -0
  75. package/dist/components/dropdown-menu.js +19 -0
  76. package/dist/components/dropdown-menu.js.map +1 -0
  77. package/dist/components/empty-state.d.ts +11 -0
  78. package/dist/components/empty-state.d.ts.map +1 -0
  79. package/dist/components/empty-state.js +6 -0
  80. package/dist/components/empty-state.js.map +1 -0
  81. package/dist/components/epistemic-badge.d.ts +10 -0
  82. package/dist/components/epistemic-badge.d.ts.map +1 -0
  83. package/dist/components/epistemic-badge.js +38 -0
  84. package/dist/components/epistemic-badge.js.map +1 -0
  85. package/dist/components/field.d.ts +25 -0
  86. package/dist/components/field.d.ts.map +1 -0
  87. package/dist/components/field.js +52 -0
  88. package/dist/components/field.js.map +1 -0
  89. package/dist/components/input.d.ts +6 -0
  90. package/dist/components/input.d.ts.map +1 -0
  91. package/dist/components/input.js +6 -0
  92. package/dist/components/input.js.map +1 -0
  93. package/dist/components/insight-callout.d.ts +10 -0
  94. package/dist/components/insight-callout.d.ts.map +1 -0
  95. package/dist/components/insight-callout.js +7 -0
  96. package/dist/components/insight-callout.js.map +1 -0
  97. package/dist/components/link.d.ts +6 -0
  98. package/dist/components/link.d.ts.map +1 -0
  99. package/dist/components/link.js +7 -0
  100. package/dist/components/link.js.map +1 -0
  101. package/dist/components/logo.d.ts +31 -0
  102. package/dist/components/logo.d.ts.map +1 -0
  103. package/dist/components/logo.js +94 -0
  104. package/dist/components/logo.js.map +1 -0
  105. package/dist/components/markdown.d.ts +7 -0
  106. package/dist/components/markdown.d.ts.map +1 -0
  107. package/dist/components/markdown.js +31 -0
  108. package/dist/components/markdown.js.map +1 -0
  109. package/dist/components/memory-reference.d.ts +12 -0
  110. package/dist/components/memory-reference.d.ts.map +1 -0
  111. package/dist/components/memory-reference.js +21 -0
  112. package/dist/components/memory-reference.js.map +1 -0
  113. package/dist/components/menu.d.ts +18 -0
  114. package/dist/components/menu.d.ts.map +1 -0
  115. package/dist/components/menu.js +11 -0
  116. package/dist/components/menu.js.map +1 -0
  117. package/dist/components/motion.d.ts +38 -0
  118. package/dist/components/motion.d.ts.map +1 -0
  119. package/dist/components/motion.js +67 -0
  120. package/dist/components/motion.js.map +1 -0
  121. package/dist/components/pagination.d.ts +10 -0
  122. package/dist/components/pagination.d.ts.map +1 -0
  123. package/dist/components/pagination.js +23 -0
  124. package/dist/components/pagination.js.map +1 -0
  125. package/dist/components/popover.d.ts +7 -0
  126. package/dist/components/popover.d.ts.map +1 -0
  127. package/dist/components/popover.js +11 -0
  128. package/dist/components/popover.js.map +1 -0
  129. package/dist/components/progress.d.ts +11 -0
  130. package/dist/components/progress.d.ts.map +1 -0
  131. package/dist/components/progress.js +13 -0
  132. package/dist/components/progress.js.map +1 -0
  133. package/dist/components/prompt-input.d.ts +14 -0
  134. package/dist/components/prompt-input.d.ts.map +1 -0
  135. package/dist/components/prompt-input.js +29 -0
  136. package/dist/components/prompt-input.js.map +1 -0
  137. package/dist/components/radio.d.ts +9 -0
  138. package/dist/components/radio.d.ts.map +1 -0
  139. package/dist/components/radio.js +17 -0
  140. package/dist/components/radio.js.map +1 -0
  141. package/dist/components/score-badge.d.ts +21 -0
  142. package/dist/components/score-badge.d.ts.map +1 -0
  143. package/dist/components/score-badge.js +36 -0
  144. package/dist/components/score-badge.js.map +1 -0
  145. package/dist/components/select.d.ts +18 -0
  146. package/dist/components/select.d.ts.map +1 -0
  147. package/dist/components/select.js +9 -0
  148. package/dist/components/select.js.map +1 -0
  149. package/dist/components/skeleton.d.ts +4 -0
  150. package/dist/components/skeleton.d.ts.map +1 -0
  151. package/dist/components/skeleton.js +7 -0
  152. package/dist/components/skeleton.js.map +1 -0
  153. package/dist/components/slider.d.ts +4 -0
  154. package/dist/components/slider.d.ts.map +1 -0
  155. package/dist/components/slider.js +11 -0
  156. package/dist/components/slider.js.map +1 -0
  157. package/dist/components/sparkle-badge.d.ts +27 -0
  158. package/dist/components/sparkle-badge.d.ts.map +1 -0
  159. package/dist/components/sparkle-badge.js +23 -0
  160. package/dist/components/sparkle-badge.js.map +1 -0
  161. package/dist/components/spinner.d.ts +9 -0
  162. package/dist/components/spinner.d.ts.map +1 -0
  163. package/dist/components/spinner.js +8 -0
  164. package/dist/components/spinner.js.map +1 -0
  165. package/dist/components/streaming-text.d.ts +13 -0
  166. package/dist/components/streaming-text.d.ts.map +1 -0
  167. package/dist/components/streaming-text.js +26 -0
  168. package/dist/components/streaming-text.js.map +1 -0
  169. package/dist/components/switch.d.ts +8 -0
  170. package/dist/components/switch.d.ts.map +1 -0
  171. package/dist/components/switch.js +15 -0
  172. package/dist/components/switch.js.map +1 -0
  173. package/dist/components/tabs.d.ts +18 -0
  174. package/dist/components/tabs.d.ts.map +1 -0
  175. package/dist/components/tabs.js +29 -0
  176. package/dist/components/tabs.js.map +1 -0
  177. package/dist/components/textarea.d.ts +8 -0
  178. package/dist/components/textarea.d.ts.map +1 -0
  179. package/dist/components/textarea.js +12 -0
  180. package/dist/components/textarea.js.map +1 -0
  181. package/dist/components/toast.d.ts +8 -0
  182. package/dist/components/toast.d.ts.map +1 -0
  183. package/dist/components/toast.js +20 -0
  184. package/dist/components/toast.js.map +1 -0
  185. package/dist/components/tooltip.d.ts +13 -0
  186. package/dist/components/tooltip.d.ts.map +1 -0
  187. package/dist/components/tooltip.js +10 -0
  188. package/dist/components/tooltip.js.map +1 -0
  189. package/dist/components/verified-badge.d.ts +14 -0
  190. package/dist/components/verified-badge.d.ts.map +1 -0
  191. package/dist/components/verified-badge.js +20 -0
  192. package/dist/components/verified-badge.js.map +1 -0
  193. package/dist/index.d.ts +51 -0
  194. package/dist/index.d.ts.map +1 -0
  195. package/dist/index.js +55 -0
  196. package/dist/index.js.map +1 -0
  197. package/dist/lib/types.d.ts +20 -0
  198. package/dist/lib/types.d.ts.map +1 -0
  199. package/dist/lib/types.js +7 -0
  200. package/dist/lib/types.js.map +1 -0
  201. package/dist/lib/utils.d.ts +4 -0
  202. package/dist/lib/utils.d.ts.map +1 -0
  203. package/dist/lib/utils.js +7 -0
  204. package/dist/lib/utils.js.map +1 -0
  205. package/package.json +70 -0
@@ -0,0 +1,9 @@
1
+ import * as React from "react";
2
+ import * as RG from "@radix-ui/react-radio-group";
3
+ export declare const RadioGroup: React.ForwardRefExoticComponent<Omit<RG.RadioGroupProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
4
+ interface RadioProps extends React.ComponentPropsWithoutRef<typeof RG.Item> {
5
+ label?: string;
6
+ }
7
+ export declare const Radio: React.ForwardRefExoticComponent<RadioProps & React.RefAttributes<HTMLButtonElement>>;
8
+ export {};
9
+ //# sourceMappingURL=radio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"radio.d.ts","sourceRoot":"","sources":["../../src/components/radio.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,MAAM,6BAA6B,CAAC;AAGlD,eAAO,MAAM,UAAU,8IAKrB,CAAC;AAGH,UAAU,UAAW,SAAQ,KAAK,CAAC,wBAAwB,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC;IACzE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAGD,eAAO,MAAM,KAAK,sFA2BjB,CAAC"}
@@ -0,0 +1,17 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import * as RG from "@radix-ui/react-radio-group";
5
+ import { cn } from "../lib/utils";
6
+ export const RadioGroup = React.forwardRef(({ className, ...props }, ref) => (_jsx(RG.Root, { ref: ref, className: cn("flex flex-col gap-2", className), ...props })));
7
+ RadioGroup.displayName = "RadioGroup";
8
+ let rId = 0;
9
+ export const Radio = React.forwardRef(({ className, label, id, ...props }, ref) => {
10
+ const [autoId] = React.useState(() => id ?? `radio-${++rId}`);
11
+ const dot = (_jsx(RG.Item, { ref: ref, id: autoId, className: cn("flex h-[18px] w-[18px] shrink-0 items-center justify-center rounded-full border border-border bg-card transition-colors", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand", "data-[state=checked]:border-brand", "disabled:cursor-not-allowed disabled:opacity-50", className), ...props, children: _jsx(RG.Indicator, { className: "block h-2.5 w-2.5 rounded-full bg-brand" }) }));
12
+ if (!label)
13
+ return dot;
14
+ return (_jsxs("label", { htmlFor: autoId, className: "inline-flex cursor-pointer items-center gap-2 text-sm text-foreground", children: [dot, label] }));
15
+ });
16
+ Radio.displayName = "Radio";
17
+ //# sourceMappingURL=radio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"radio.js","sourceRoot":"","sources":["../../src/components/radio.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,MAAM,6BAA6B,CAAC;AAClD,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAElC,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAGxC,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAClC,KAAC,EAAE,CAAC,IAAI,IAAC,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,CAAC,qBAAqB,EAAE,SAAS,CAAC,KAAM,KAAK,GAAI,CAClF,CAAC,CAAC;AACH,UAAU,CAAC,WAAW,GAAG,YAAY,CAAC;AAMtC,IAAI,GAAG,GAAG,CAAC,CAAC;AACZ,MAAM,CAAC,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,CACnC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE;IAC1C,MAAM,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;IAC9D,MAAM,GAAG,GAAG,CACV,KAAC,EAAE,CAAC,IAAI,IACN,GAAG,EAAE,GAAG,EACR,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,EAAE,CACX,yHAAyH,EACzH,0EAA0E,EAC1E,mCAAmC,EACnC,iDAAiD,EACjD,SAAS,CACV,KACG,KAAK,YAET,KAAC,EAAE,CAAC,SAAS,IAAC,SAAS,EAAC,yCAAyC,GAAG,GAC5D,CACX,CAAC;IACF,IAAI,CAAC,KAAK;QAAE,OAAO,GAAG,CAAC;IACvB,OAAO,CACL,iBAAO,OAAO,EAAE,MAAM,EAAE,SAAS,EAAC,uEAAuE,aACtG,GAAG,EACH,KAAK,IACA,CACT,CAAC;AACJ,CAAC,CACF,CAAC;AACF,KAAK,CAAC,WAAW,GAAG,OAAO,CAAC"}
@@ -0,0 +1,21 @@
1
+ interface ScoreBadgeProps {
2
+ score: number;
3
+ max?: number;
4
+ showStar?: boolean;
5
+ size?: "sm" | "md" | "lg";
6
+ className?: string;
7
+ }
8
+ export declare function TrustScoreBadge({ score, max, showStar, size, className, }: ScoreBadgeProps): import("react").JSX.Element;
9
+ interface FitScoreBadgeProps {
10
+ score: number;
11
+ size?: "sm" | "md" | "lg";
12
+ className?: string;
13
+ }
14
+ export declare function FitScoreBadge({ score, size, className }: FitScoreBadgeProps): import("react").JSX.Element;
15
+ interface UrgencyBadgeProps {
16
+ urgency: "high" | "medium" | "low";
17
+ className?: string;
18
+ }
19
+ export declare function UrgencyBadge({ urgency, className }: UrgencyBadgeProps): import("react").JSX.Element;
20
+ export {};
21
+ //# sourceMappingURL=score-badge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"score-badge.d.ts","sourceRoot":"","sources":["../../src/components/score-badge.tsx"],"names":[],"mappings":"AAGA,UAAU,eAAe;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,GAAO,EACP,QAAe,EACf,IAAW,EACX,SAAS,GACV,EAAE,eAAe,+BA2BjB;AAED,UAAU,kBAAkB;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,aAAa,CAAC,EAAE,KAAK,EAAE,IAAW,EAAE,SAAS,EAAE,EAAE,kBAAkB,+BA4BlF;AAED,UAAU,iBAAiB;IACzB,OAAO,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,YAAY,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,iBAAiB,+BAkBrE"}
@@ -0,0 +1,36 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cn } from "../lib/utils";
3
+ import { Star } from "lucide-react";
4
+ export function TrustScoreBadge({ score, max = 5, showStar = true, size = "md", className, }) {
5
+ const colorClass = score >= 4.5 ? "text-green" : score >= 3.5 ? "text-sparkle" : "text-red";
6
+ const sizeClass = {
7
+ sm: "text-xs",
8
+ md: "text-sm",
9
+ lg: "text-[22px] tracking-[-0.02em]",
10
+ };
11
+ return (_jsxs("span", { className: cn("inline-flex items-center gap-1 font-mono font-bold tabular-nums", sizeClass[size], colorClass, size === "lg" && "score-glow", className), children: [showStar && _jsx(Star, { className: "h-3.5 w-3.5 fill-current" }), score.toFixed(1), size === "lg" && (_jsxs("span", { className: "text-[13px] text-muted-foreground font-normal", children: ["/", max.toFixed(1)] }))] }));
12
+ }
13
+ export function FitScoreBadge({ score, size = "md", className }) {
14
+ const bgClass = score >= 85
15
+ ? "bg-green-bg text-green"
16
+ : score >= 70
17
+ ? "bg-brand-light text-brand"
18
+ : score >= 55
19
+ ? "bg-orange-bg text-orange"
20
+ : "bg-accent text-muted";
21
+ const sizeClass = {
22
+ sm: "h-6 w-6 text-[10px]",
23
+ md: "h-8 w-8 text-xs",
24
+ lg: "h-10 w-10 text-sm",
25
+ };
26
+ return (_jsx("span", { className: cn("inline-flex items-center justify-center rounded-full font-mono font-bold tabular-nums", sizeClass[size], bgClass, className), children: score }));
27
+ }
28
+ export function UrgencyBadge({ urgency, className }) {
29
+ const colors = {
30
+ high: "bg-red-bg text-red",
31
+ medium: "bg-orange-bg text-orange",
32
+ low: "bg-accent text-muted",
33
+ };
34
+ return (_jsx("span", { className: cn("inline-flex items-center rounded-full px-2.5 py-0.5 text-[11px] font-semibold capitalize", colors[urgency], className), children: urgency }));
35
+ }
36
+ //# sourceMappingURL=score-badge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"score-badge.js","sourceRoot":"","sources":["../../src/components/score-badge.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAUpC,MAAM,UAAU,eAAe,CAAC,EAC9B,KAAK,EACL,GAAG,GAAG,CAAC,EACP,QAAQ,GAAG,IAAI,EACf,IAAI,GAAG,IAAI,EACX,SAAS,GACO;IAChB,MAAM,UAAU,GACd,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC;IAE3E,MAAM,SAAS,GAAG;QAChB,EAAE,EAAE,SAAS;QACb,EAAE,EAAE,SAAS;QACb,EAAE,EAAE,gCAAgC;KACrC,CAAC;IAEF,OAAO,CACL,gBACE,SAAS,EAAE,EAAE,CACX,iEAAiE,EACjE,SAAS,CAAC,IAAI,CAAC,EACf,UAAU,EACV,IAAI,KAAK,IAAI,IAAI,YAAY,EAC7B,SAAS,CACV,aAEA,QAAQ,IAAI,KAAC,IAAI,IAAC,SAAS,EAAC,0BAA0B,GAAG,EACzD,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAChB,IAAI,KAAK,IAAI,IAAI,CAChB,gBAAM,SAAS,EAAC,+CAA+C,kBAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAQ,CACzF,IACI,CACR,CAAC;AACJ,CAAC;AAQD,MAAM,UAAU,aAAa,CAAC,EAAE,KAAK,EAAE,IAAI,GAAG,IAAI,EAAE,SAAS,EAAsB;IACjF,MAAM,OAAO,GACX,KAAK,IAAI,EAAE;QACT,CAAC,CAAC,wBAAwB;QAC1B,CAAC,CAAC,KAAK,IAAI,EAAE;YACX,CAAC,CAAC,2BAA2B;YAC7B,CAAC,CAAC,KAAK,IAAI,EAAE;gBACX,CAAC,CAAC,0BAA0B;gBAC5B,CAAC,CAAC,sBAAsB,CAAC;IAEjC,MAAM,SAAS,GAAG;QAChB,EAAE,EAAE,qBAAqB;QACzB,EAAE,EAAE,iBAAiB;QACrB,EAAE,EAAE,mBAAmB;KACxB,CAAC;IAEF,OAAO,CACL,eACE,SAAS,EAAE,EAAE,CACX,uFAAuF,EACvF,SAAS,CAAC,IAAI,CAAC,EACf,OAAO,EACP,SAAS,CACV,YAEA,KAAK,GACD,CACR,CAAC;AACJ,CAAC;AAOD,MAAM,UAAU,YAAY,CAAC,EAAE,OAAO,EAAE,SAAS,EAAqB;IACpE,MAAM,MAAM,GAAG;QACb,IAAI,EAAE,oBAAoB;QAC1B,MAAM,EAAE,0BAA0B;QAClC,GAAG,EAAE,sBAAsB;KAC5B,CAAC;IAEF,OAAO,CACL,eACE,SAAS,EAAE,EAAE,CACX,0FAA0F,EAC1F,MAAM,CAAC,OAAO,CAAC,EACf,SAAS,CACV,YAEA,OAAO,GACH,CACR,CAAC;AACJ,CAAC"}
@@ -0,0 +1,18 @@
1
+ import * as React from "react";
2
+ export interface SelectOption {
3
+ value: string;
4
+ label: string;
5
+ }
6
+ interface SelectProps {
7
+ options: SelectOption[];
8
+ value?: string;
9
+ defaultValue?: string;
10
+ onValueChange?: (value: string) => void;
11
+ placeholder?: string;
12
+ disabled?: boolean;
13
+ error?: boolean;
14
+ className?: string;
15
+ }
16
+ export declare function Select({ options, value, defaultValue, onValueChange, placeholder, disabled, error, className, }: SelectProps): React.JSX.Element;
17
+ export {};
18
+ //# sourceMappingURL=select.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../../src/components/select.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,UAAU,WAAW;IACnB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,MAAM,CAAC,EACrB,OAAO,EACP,KAAK,EACL,YAAY,EACZ,aAAa,EACb,WAAuB,EACvB,QAAQ,EACR,KAAK,EACL,SAAS,GACV,EAAE,WAAW,qBA6Cb"}
@@ -0,0 +1,9 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as RS from "@radix-ui/react-select";
4
+ import { Check, ChevronDown } from "lucide-react";
5
+ import { cn } from "../lib/utils";
6
+ export function Select({ options, value, defaultValue, onValueChange, placeholder = "Select…", disabled, error, className, }) {
7
+ return (_jsxs(RS.Root, { value: value, defaultValue: defaultValue, onValueChange: onValueChange, disabled: disabled, children: [_jsxs(RS.Trigger, { "aria-invalid": error || undefined, className: cn("inline-flex h-10 w-full items-center justify-between gap-2 rounded-md border bg-card px-3 text-sm text-foreground transition-colors", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand", "disabled:cursor-not-allowed disabled:opacity-50 data-[placeholder]:text-muted-foreground", error ? "border-red" : "border-border", className), children: [_jsx(RS.Value, { placeholder: placeholder }), _jsx(RS.Icon, { children: _jsx(ChevronDown, { className: "h-4 w-4 text-muted" }) })] }), _jsx(RS.Portal, { children: _jsx(RS.Content, { position: "popper", sideOffset: 4, className: "z-[1400] max-h-72 min-w-[var(--radix-select-trigger-width)] overflow-hidden rounded-lg border border-border bg-card card-shadow-lg", children: _jsx(RS.Viewport, { className: "p-1.5", children: options.map((opt) => (_jsxs(RS.Item, { value: opt.value, className: cn("relative flex cursor-pointer select-none items-center rounded-md px-3 py-2 pr-8 text-[13px] text-foreground outline-none", "data-[highlighted]:bg-accent data-[state=checked]:font-medium data-[state=checked]:text-brand"), children: [_jsx(RS.ItemText, { children: opt.label }), _jsx(RS.ItemIndicator, { className: "absolute right-2", children: _jsx(Check, { className: "h-4 w-4 text-brand" }) })] }, opt.value))) }) }) })] }));
8
+ }
9
+ //# sourceMappingURL=select.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"select.js","sourceRoot":"","sources":["../../src/components/select.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAGb,OAAO,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAkBlC,MAAM,UAAU,MAAM,CAAC,EACrB,OAAO,EACP,KAAK,EACL,YAAY,EACZ,aAAa,EACb,WAAW,GAAG,SAAS,EACvB,QAAQ,EACR,KAAK,EACL,SAAS,GACG;IACZ,OAAO,CACL,MAAC,EAAE,CAAC,IAAI,IAAC,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,aACjG,MAAC,EAAE,CAAC,OAAO,oBACK,KAAK,IAAI,SAAS,EAChC,SAAS,EAAE,EAAE,CACX,qIAAqI,EACrI,0EAA0E,EAC1E,0FAA0F,EAC1F,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,eAAe,EACtC,SAAS,CACV,aAED,KAAC,EAAE,CAAC,KAAK,IAAC,WAAW,EAAE,WAAW,GAAI,EACtC,KAAC,EAAE,CAAC,IAAI,cACN,KAAC,WAAW,IAAC,SAAS,EAAC,oBAAoB,GAAG,GACtC,IACC,EACb,KAAC,EAAE,CAAC,MAAM,cACR,KAAC,EAAE,CAAC,OAAO,IACT,QAAQ,EAAC,QAAQ,EACjB,UAAU,EAAE,CAAC,EACb,SAAS,EAAC,oIAAoI,YAE9I,KAAC,EAAE,CAAC,QAAQ,IAAC,SAAS,EAAC,OAAO,YAC3B,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CACpB,MAAC,EAAE,CAAC,IAAI,IAEN,KAAK,EAAE,GAAG,CAAC,KAAK,EAChB,SAAS,EAAE,EAAE,CACX,0HAA0H,EAC1H,+FAA+F,CAChG,aAED,KAAC,EAAE,CAAC,QAAQ,cAAE,GAAG,CAAC,KAAK,GAAe,EACtC,KAAC,EAAE,CAAC,aAAa,IAAC,SAAS,EAAC,kBAAkB,YAC5C,KAAC,KAAK,IAAC,SAAS,EAAC,oBAAoB,GAAG,GACvB,KAVd,GAAG,CAAC,KAAK,CAWN,CACX,CAAC,GACU,GACH,GACH,IACJ,CACX,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import * as React from "react";
2
+ /** Loading placeholder using the shimmer `.skeleton` class from tokens.css. */
3
+ export declare function Skeleton({ className, ...props }: React.HTMLAttributes<HTMLDivElement>): React.JSX.Element;
4
+ //# sourceMappingURL=skeleton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skeleton.d.ts","sourceRoot":"","sources":["../../src/components/skeleton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,+EAA+E;AAC/E,wBAAgB,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,qBAErF"}
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { cn } from "../lib/utils";
3
+ /** Loading placeholder using the shimmer `.skeleton` class from tokens.css. */
4
+ export function Skeleton({ className, ...props }) {
5
+ return _jsx("div", { className: cn("skeleton rounded-md", className), "aria-hidden": true, ...props });
6
+ }
7
+ //# sourceMappingURL=skeleton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skeleton.js","sourceRoot":"","sources":["../../src/components/skeleton.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAElC,+EAA+E;AAC/E,MAAM,UAAU,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAwC;IACpF,OAAO,cAAK,SAAS,EAAE,EAAE,CAAC,qBAAqB,EAAE,SAAS,CAAC,0BAAkB,KAAK,GAAI,CAAC;AACzF,CAAC"}
@@ -0,0 +1,4 @@
1
+ import * as React from "react";
2
+ import * as RS from "@radix-ui/react-slider";
3
+ export declare const Slider: React.ForwardRefExoticComponent<Omit<RS.SliderProps & React.RefAttributes<HTMLSpanElement>, "ref"> & React.RefAttributes<HTMLSpanElement>>;
4
+ //# sourceMappingURL=slider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slider.d.ts","sourceRoot":"","sources":["../../src/components/slider.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAG7C,eAAO,MAAM,MAAM,4IAuBjB,CAAC"}
@@ -0,0 +1,11 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import * as RS from "@radix-ui/react-slider";
5
+ import { cn } from "../lib/utils";
6
+ export const Slider = React.forwardRef(({ className, ...props }, ref) => {
7
+ const count = props.value?.length ?? props.defaultValue?.length ?? 1;
8
+ return (_jsxs(RS.Root, { ref: ref, className: cn("relative flex w-full touch-none select-none items-center", className), ...props, children: [_jsx(RS.Track, { className: "relative h-1.5 w-full grow overflow-hidden rounded-full bg-border", children: _jsx(RS.Range, { className: "absolute h-full rounded-full bg-brand" }) }), Array.from({ length: count }).map((_, i) => (_jsx(RS.Thumb, { className: "block h-4 w-4 rounded-full border-2 border-brand bg-card shadow transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand disabled:opacity-50", "aria-label": "Value" }, i)))] }));
9
+ });
10
+ Slider.displayName = "Slider";
11
+ //# sourceMappingURL=slider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slider.js","sourceRoot":"","sources":["../../src/components/slider.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAC7C,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAElC,MAAM,CAAC,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,CAGpC,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE;IACjC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,MAAM,IAAI,KAAK,CAAC,YAAY,EAAE,MAAM,IAAI,CAAC,CAAC;IACrE,OAAO,CACL,MAAC,EAAE,CAAC,IAAI,IACN,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CAAC,0DAA0D,EAAE,SAAS,CAAC,KAChF,KAAK,aAET,KAAC,EAAE,CAAC,KAAK,IAAC,SAAS,EAAC,mEAAmE,YACrF,KAAC,EAAE,CAAC,KAAK,IAAC,SAAS,EAAC,uCAAuC,GAAG,GACrD,EACV,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAC3C,KAAC,EAAE,CAAC,KAAK,IAEP,SAAS,EAAC,gLAAgL,gBAC/K,OAAO,IAFb,CAAC,CAGN,CACH,CAAC,IACM,CACX,CAAC;AACJ,CAAC,CAAC,CAAC;AACH,MAAM,CAAC,WAAW,GAAG,QAAQ,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Customer City agent identity sparkle — violet → purple → pink gradient.
3
+ * (blue→teal→pink was the prior Meta-derived identity; this is the CC identity.)
4
+ */
5
+ export declare function MetaSparkle({ size, className }: {
6
+ size?: number;
7
+ className?: string;
8
+ }): import("react").JSX.Element;
9
+ /** Mini single-color sparkle for inline use next to names. */
10
+ export declare function MetaSparkleMini({ size, color, className }: {
11
+ size?: number;
12
+ color?: string;
13
+ className?: string;
14
+ }): import("react").JSX.Element;
15
+ interface SparkleBadgeProps {
16
+ size?: "sm" | "md" | "lg";
17
+ className?: string;
18
+ }
19
+ export declare function SparkleBadge({ size, className }: SparkleBadgeProps): import("react").JSX.Element;
20
+ interface AgentNameProps {
21
+ name: string;
22
+ size?: "sm" | "md" | "lg";
23
+ className?: string;
24
+ }
25
+ export declare function AgentName({ name, size, className }: AgentNameProps): import("react").JSX.Element;
26
+ export {};
27
+ //# sourceMappingURL=sparkle-badge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sparkle-badge.d.ts","sourceRoot":"","sources":["../../src/components/sparkle-badge.tsx"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,WAAW,CAAC,EAAE,IAAS,EAAE,SAAS,EAAE,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,+BAwB1F;AAED,8DAA8D;AAC9D,wBAAgB,eAAe,CAAC,EAAE,IAAS,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,+BAarH;AAED,UAAU,iBAAiB;IACzB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,YAAY,CAAC,EAAE,IAAW,EAAE,SAAS,EAAE,EAAE,iBAAiB,+BAGzE;AAED,UAAU,cAAc;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,SAAS,CAAC,EAAE,IAAI,EAAE,IAAW,EAAE,SAAS,EAAE,EAAE,cAAc,+BAQzE"}
@@ -0,0 +1,23 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cn } from "../lib/utils";
3
+ /**
4
+ * Customer City agent identity sparkle — violet → purple → pink gradient.
5
+ * (blue→teal→pink was the prior Meta-derived identity; this is the CC identity.)
6
+ */
7
+ export function MetaSparkle({ size = 16, className }) {
8
+ const gradId = `ccAgentGrad-${size}`;
9
+ return (_jsxs("svg", { width: size, height: size, viewBox: "0 0 24 24", fill: "none", className: cn("shrink-0 sparkle-pulse", className), "aria-label": "AI Agent", children: [_jsx("defs", { children: _jsxs("linearGradient", { id: gradId, x1: "0%", y1: "0%", x2: "100%", y2: "100%", children: [_jsx("stop", { offset: "0%", stopColor: "#AA00FF" }), _jsx("stop", { offset: "50%", stopColor: "#7637FF" }), _jsx("stop", { offset: "100%", stopColor: "#D500F9" })] }) }), _jsx("path", { d: "M12 2L14.4 9.6L22 12L14.4 14.4L12 22L9.6 14.4L2 12L9.6 9.6Z", fill: `url(#${gradId})` })] }));
10
+ }
11
+ /** Mini single-color sparkle for inline use next to names. */
12
+ export function MetaSparkleMini({ size = 12, color, className }) {
13
+ return (_jsx("svg", { width: size, height: size, viewBox: "0 0 16 16", fill: color || "currentColor", className: cn("shrink-0 text-sparkle", className), "aria-label": "AI Agent", children: _jsx("path", { d: "M8 1L9.6 6.4L15 8L9.6 9.6L8 15L6.4 9.6L1 8L6.4 6.4Z" }) }));
14
+ }
15
+ export function SparkleBadge({ size = "md", className }) {
16
+ const sizeMap = { sm: 10, md: 14, lg: 18 };
17
+ return _jsx(MetaSparkle, { size: sizeMap[size], className: className });
18
+ }
19
+ export function AgentName({ name, size = "md", className }) {
20
+ const sizeMap = { sm: 9, md: 12, lg: 14 };
21
+ return (_jsxs("span", { className: cn("inline-flex items-center gap-1", className), children: [name, _jsx(MetaSparkleMini, { size: sizeMap[size] })] }));
22
+ }
23
+ //# sourceMappingURL=sparkle-badge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sparkle-badge.js","sourceRoot":"","sources":["../../src/components/sparkle-badge.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAElC;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,EAAE,IAAI,GAAG,EAAE,EAAE,SAAS,EAAyC;IACzF,MAAM,MAAM,GAAG,eAAe,IAAI,EAAE,CAAC;IACrC,OAAO,CACL,eACE,KAAK,EAAE,IAAI,EACX,MAAM,EAAE,IAAI,EACZ,OAAO,EAAC,WAAW,EACnB,IAAI,EAAC,MAAM,EACX,SAAS,EAAE,EAAE,CAAC,wBAAwB,EAAE,SAAS,CAAC,gBACvC,UAAU,aAErB,yBACE,0BAAgB,EAAE,EAAE,MAAM,EAAE,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,MAAM,EAAC,EAAE,EAAC,MAAM,aAC7D,eAAM,MAAM,EAAC,IAAI,EAAC,SAAS,EAAC,SAAS,GAAG,EACxC,eAAM,MAAM,EAAC,KAAK,EAAC,SAAS,EAAC,SAAS,GAAG,EACzC,eAAM,MAAM,EAAC,MAAM,EAAC,SAAS,EAAC,SAAS,GAAG,IAC3B,GACZ,EACP,eACE,CAAC,EAAC,6DAA6D,EAC/D,IAAI,EAAE,QAAQ,MAAM,GAAG,GACvB,IACE,CACP,CAAC;AACJ,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,eAAe,CAAC,EAAE,IAAI,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,EAAyD;IACpH,OAAO,CACL,cACE,KAAK,EAAE,IAAI,EACX,MAAM,EAAE,IAAI,EACZ,OAAO,EAAC,WAAW,EACnB,IAAI,EAAE,KAAK,IAAI,cAAc,EAC7B,SAAS,EAAE,EAAE,CAAC,uBAAuB,EAAE,SAAS,CAAC,gBACtC,UAAU,YAErB,eAAM,CAAC,EAAC,qDAAqD,GAAG,GAC5D,CACP,CAAC;AACJ,CAAC;AAOD,MAAM,UAAU,YAAY,CAAC,EAAE,IAAI,GAAG,IAAI,EAAE,SAAS,EAAqB;IACxE,MAAM,OAAO,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;IAC3C,OAAO,KAAC,WAAW,IAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,SAAS,GAAI,CAAC;AACpE,CAAC;AAQD,MAAM,UAAU,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,SAAS,EAAkB;IACxE,MAAM,OAAO,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;IAC1C,OAAO,CACL,gBAAM,SAAS,EAAE,EAAE,CAAC,gCAAgC,EAAE,SAAS,CAAC,aAC7D,IAAI,EACL,KAAC,eAAe,IAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,GAAI,IACnC,CACR,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ import * as React from "react";
2
+ interface SpinnerProps {
3
+ size?: "sm" | "md" | "lg";
4
+ label?: string;
5
+ className?: string;
6
+ }
7
+ export declare function Spinner({ size, label, className }: SpinnerProps): React.JSX.Element;
8
+ export {};
9
+ //# sourceMappingURL=spinner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner.d.ts","sourceRoot":"","sources":["../../src/components/spinner.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,UAAU,YAAY;IACpB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAID,wBAAgB,OAAO,CAAC,EAAE,IAAW,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,YAAY,qBAOtE"}
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Loader2 } from "lucide-react";
3
+ import { cn } from "../lib/utils";
4
+ const sizeClass = { sm: "h-4 w-4", md: "h-6 w-6", lg: "h-8 w-8" };
5
+ export function Spinner({ size = "md", label, className }) {
6
+ return (_jsxs("span", { role: "status", "aria-label": label ?? "Loading", className: cn("inline-flex items-center gap-2 text-muted", className), children: [_jsx(Loader2, { className: cn("animate-spin text-brand", sizeClass[size]) }), label && _jsx("span", { className: "text-[13px]", children: label })] }));
7
+ }
8
+ //# sourceMappingURL=spinner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner.js","sourceRoot":"","sources":["../../src/components/spinner.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAQlC,MAAM,SAAS,GAAG,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC;AAElE,MAAM,UAAU,OAAO,CAAC,EAAE,IAAI,GAAG,IAAI,EAAE,KAAK,EAAE,SAAS,EAAgB;IACrE,OAAO,CACL,gBAAM,IAAI,EAAC,QAAQ,gBAAa,KAAK,IAAI,SAAS,EAAE,SAAS,EAAE,EAAE,CAAC,2CAA2C,EAAE,SAAS,CAAC,aACvH,KAAC,OAAO,IAAC,SAAS,EAAE,EAAE,CAAC,yBAAyB,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,GAAI,EACrE,KAAK,IAAI,eAAM,SAAS,EAAC,aAAa,YAAE,KAAK,GAAQ,IACjD,CACR,CAAC;AACJ,CAAC"}
@@ -0,0 +1,13 @@
1
+ import * as React from "react";
2
+ interface StreamingTextProps {
3
+ text: string;
4
+ /** When true, reveal progressively with a trailing caret. */
5
+ isStreaming?: boolean;
6
+ /** ms per character. */
7
+ speed?: number;
8
+ className?: string;
9
+ }
10
+ /** Presentational token-by-token reveal. No real LLM — drives off `text` + `isStreaming`. */
11
+ export declare function StreamingText({ text, isStreaming, speed, className }: StreamingTextProps): React.JSX.Element;
12
+ export {};
13
+ //# sourceMappingURL=streaming-text.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streaming-text.d.ts","sourceRoot":"","sources":["../../src/components/streaming-text.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,UAAU,kBAAkB;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,wBAAwB;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,6FAA6F;AAC7F,wBAAgB,aAAa,CAAC,EAAE,IAAI,EAAE,WAAmB,EAAE,KAAU,EAAE,SAAS,EAAE,EAAE,kBAAkB,qBA2BrG"}
@@ -0,0 +1,26 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { cn } from "../lib/utils";
5
+ /** Presentational token-by-token reveal. No real LLM — drives off `text` + `isStreaming`. */
6
+ export function StreamingText({ text, isStreaming = false, speed = 18, className }) {
7
+ const [shown, setShown] = React.useState(isStreaming ? 0 : text.length);
8
+ React.useEffect(() => {
9
+ if (!isStreaming) {
10
+ setShown(text.length);
11
+ return;
12
+ }
13
+ setShown(0);
14
+ let i = 0;
15
+ const id = setInterval(() => {
16
+ i += 1;
17
+ setShown(i);
18
+ if (i >= text.length)
19
+ clearInterval(id);
20
+ }, speed);
21
+ return () => clearInterval(id);
22
+ }, [text, isStreaming, speed]);
23
+ const done = shown >= text.length;
24
+ return (_jsxs("span", { className: cn("text-[14px] leading-relaxed text-foreground", className), children: [text.slice(0, shown), isStreaming && !done && (_jsx("span", { className: "ml-0.5 inline-block h-[1em] w-[2px] -translate-y-[1px] animate-pulse bg-sparkle align-middle", "aria-hidden": true }))] }));
25
+ }
26
+ //# sourceMappingURL=streaming-text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streaming-text.js","sourceRoot":"","sources":["../../src/components/streaming-text.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAWlC,6FAA6F;AAC7F,MAAM,UAAU,aAAa,CAAC,EAAE,IAAI,EAAE,WAAW,GAAG,KAAK,EAAE,KAAK,GAAG,EAAE,EAAE,SAAS,EAAsB;IACpG,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAExE,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACtB,OAAO;QACT,CAAC;QACD,QAAQ,CAAC,CAAC,CAAC,CAAC;QACZ,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE;YAC1B,CAAC,IAAI,CAAC,CAAC;YACP,QAAQ,CAAC,CAAC,CAAC,CAAC;YACZ,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM;gBAAE,aAAa,CAAC,EAAE,CAAC,CAAC;QAC1C,CAAC,EAAE,KAAK,CAAC,CAAC;QACV,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IACjC,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC;IAE/B,MAAM,IAAI,GAAG,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC;IAClC,OAAO,CACL,gBAAM,SAAS,EAAE,EAAE,CAAC,6CAA6C,EAAE,SAAS,CAAC,aAC1E,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,EACpB,WAAW,IAAI,CAAC,IAAI,IAAI,CACvB,eAAM,SAAS,EAAC,8FAA8F,wBAAe,CAC9H,IACI,CACR,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ import * as React from "react";
2
+ import * as RS from "@radix-ui/react-switch";
3
+ interface SwitchProps extends React.ComponentPropsWithoutRef<typeof RS.Root> {
4
+ label?: string;
5
+ }
6
+ export declare const Switch: React.ForwardRefExoticComponent<SwitchProps & React.RefAttributes<HTMLButtonElement>>;
7
+ export {};
8
+ //# sourceMappingURL=switch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"switch.d.ts","sourceRoot":"","sources":["../../src/components/switch.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAG7C,UAAU,WAAY,SAAQ,KAAK,CAAC,wBAAwB,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC;IAC1E,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAGD,eAAO,MAAM,MAAM,uFA2BlB,CAAC"}
@@ -0,0 +1,15 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import * as RS from "@radix-ui/react-switch";
5
+ import { cn } from "../lib/utils";
6
+ let swId = 0;
7
+ export const Switch = React.forwardRef(({ className, label, id, ...props }, ref) => {
8
+ const [autoId] = React.useState(() => id ?? `switch-${++swId}`);
9
+ const sw = (_jsx(RS.Root, { ref: ref, id: autoId, className: cn("relative h-[22px] w-[40px] shrink-0 rounded-full border border-transparent bg-border transition-colors", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand", "data-[state=checked]:bg-brand", "disabled:cursor-not-allowed disabled:opacity-50", className), ...props, children: _jsx(RS.Thumb, { className: "block h-[18px] w-[18px] translate-x-0.5 rounded-full bg-white shadow transition-transform data-[state=checked]:translate-x-[19px]" }) }));
10
+ if (!label)
11
+ return sw;
12
+ return (_jsxs("label", { htmlFor: autoId, className: "inline-flex cursor-pointer items-center gap-2.5 text-sm text-foreground", children: [sw, label] }));
13
+ });
14
+ Switch.displayName = "Switch";
15
+ //# sourceMappingURL=switch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"switch.js","sourceRoot":"","sources":["../../src/components/switch.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAC7C,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAMlC,IAAI,IAAI,GAAG,CAAC,CAAC;AACb,MAAM,CAAC,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,CACpC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE;IAC1C,MAAM,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;IAChE,MAAM,EAAE,GAAG,CACT,KAAC,EAAE,CAAC,IAAI,IACN,GAAG,EAAE,GAAG,EACR,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,EAAE,CACX,wGAAwG,EACxG,0EAA0E,EAC1E,+BAA+B,EAC/B,iDAAiD,EACjD,SAAS,CACV,KACG,KAAK,YAET,KAAC,EAAE,CAAC,KAAK,IAAC,SAAS,EAAC,mIAAmI,GAAG,GAClJ,CACX,CAAC;IACF,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACtB,OAAO,CACL,iBAAO,OAAO,EAAE,MAAM,EAAE,SAAS,EAAC,yEAAyE,aACxG,EAAE,EACF,KAAK,IACA,CACT,CAAC;AACJ,CAAC,CACF,CAAC;AACF,MAAM,CAAC,WAAW,GAAG,QAAQ,CAAC"}
@@ -0,0 +1,18 @@
1
+ export interface TabItem {
2
+ value: string;
3
+ label: string;
4
+ count?: number;
5
+ badge?: string;
6
+ }
7
+ interface TabsProps {
8
+ tabs: TabItem[];
9
+ value: string;
10
+ onChange: (value: string) => void;
11
+ size?: "sm" | "md";
12
+ className?: string;
13
+ id?: string;
14
+ }
15
+ /** Accessible tab strip: role=tab, roving tabindex, arrow/Home/End keys. */
16
+ export declare function Tabs({ tabs, value, onChange, size, className, id }: TabsProps): import("react").JSX.Element;
17
+ export {};
18
+ //# sourceMappingURL=tabs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tabs.d.ts","sourceRoot":"","sources":["../../src/components/tabs.tsx"],"names":[],"mappings":"AAKA,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,SAAS;IACjB,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,4EAA4E;AAC5E,wBAAgB,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAW,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,SAAS,+BAwDpF"}
@@ -0,0 +1,29 @@
1
+ "use client";
2
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
3
+ import { useRef, useCallback } from "react";
4
+ import { cn } from "../lib/utils";
5
+ /** Accessible tab strip: role=tab, roving tabindex, arrow/Home/End keys. */
6
+ export function Tabs({ tabs, value, onChange, size = "md", className, id }) {
7
+ const listRef = useRef(null);
8
+ const handleKeyDown = useCallback((e, currentIndex) => {
9
+ let next = null;
10
+ if (e.key === "ArrowRight")
11
+ next = (currentIndex + 1) % tabs.length;
12
+ else if (e.key === "ArrowLeft")
13
+ next = (currentIndex - 1 + tabs.length) % tabs.length;
14
+ else if (e.key === "Home")
15
+ next = 0;
16
+ else if (e.key === "End")
17
+ next = tabs.length - 1;
18
+ if (next !== null) {
19
+ e.preventDefault();
20
+ onChange(tabs[next].value);
21
+ listRef.current?.querySelectorAll('[role="tab"]')[next]?.focus();
22
+ }
23
+ }, [tabs, onChange]);
24
+ return (_jsx("div", { ref: listRef, role: "tablist", "aria-label": "Tabs", className: cn("flex border-b border-border", className), children: tabs.map((tab, index) => {
25
+ const isActive = tab.value === value;
26
+ return (_jsxs("button", { id: id ? `${id}-tab-${tab.value}` : undefined, role: "tab", "aria-selected": isActive, tabIndex: isActive ? 0 : -1, onClick: () => onChange(tab.value), onKeyDown: (e) => handleKeyDown(e, index), className: cn("relative px-4 py-2.5 text-[13px] font-medium transition-colors duration-150 focus:outline-none focus-visible:ring-2 focus-visible:ring-brand focus-visible:ring-inset", isActive ? "text-brand" : "text-muted hover:text-foreground hover:bg-accent/50"), children: [_jsxs("span", { className: "flex items-center gap-1.5", children: [tab.label, tab.count !== undefined && (_jsxs("span", { className: cn("text-[12px] font-normal", isActive ? "text-brand/70" : "text-muted-foreground"), children: ["(", tab.count, ")"] })), tab.badge && (_jsx("span", { className: "ml-1 inline-flex h-[18px] min-w-[18px] items-center justify-center rounded-[10px] bg-red px-[5px] text-[10px] font-bold text-white", children: tab.badge }))] }), isActive && _jsx("span", { className: "absolute inset-x-0 bottom-0 h-0.5 rounded-t-full bg-brand" })] }, tab.value));
27
+ }) }));
28
+ }
29
+ //# sourceMappingURL=tabs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tabs.js","sourceRoot":"","sources":["../../src/components/tabs.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAkBlC,4EAA4E;AAC5E,MAAM,UAAU,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,GAAG,IAAI,EAAE,SAAS,EAAE,EAAE,EAAa;IACnF,MAAM,OAAO,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAE7C,MAAM,aAAa,GAAG,WAAW,CAC/B,CAAC,CAAsB,EAAE,YAAoB,EAAE,EAAE;QAC/C,IAAI,IAAI,GAAkB,IAAI,CAAC;QAC/B,IAAI,CAAC,CAAC,GAAG,KAAK,YAAY;YAAE,IAAI,GAAG,CAAC,YAAY,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;aAC/D,IAAI,CAAC,CAAC,GAAG,KAAK,WAAW;YAAE,IAAI,GAAG,CAAC,YAAY,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;aACjF,IAAI,CAAC,CAAC,GAAG,KAAK,MAAM;YAAE,IAAI,GAAG,CAAC,CAAC;aAC/B,IAAI,CAAC,CAAC,GAAG,KAAK,KAAK;YAAE,IAAI,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QACjD,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC;YAC3B,OAAO,CAAC,OAAO,EAAE,gBAAgB,CAAoB,cAAc,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC;QACtF,CAAC;IACH,CAAC,EACD,CAAC,IAAI,EAAE,QAAQ,CAAC,CACjB,CAAC;IAEF,OAAO,CACL,cAAK,GAAG,EAAE,OAAO,EAAE,IAAI,EAAC,SAAS,gBAAY,MAAM,EAAC,SAAS,EAAE,EAAE,CAAC,6BAA6B,EAAE,SAAS,CAAC,YACxG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;YACvB,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,KAAK,KAAK,CAAC;YACrC,OAAO,CACL,kBAEE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,QAAQ,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,EAC7C,IAAI,EAAC,KAAK,mBACK,QAAQ,EACvB,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAC3B,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAClC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,KAAK,CAAC,EACzC,SAAS,EAAE,EAAE,CACX,uKAAuK,EACvK,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,qDAAqD,CAChF,aAED,gBAAM,SAAS,EAAC,2BAA2B,aACxC,GAAG,CAAC,KAAK,EACT,GAAG,CAAC,KAAK,KAAK,SAAS,IAAI,CAC1B,gBAAM,SAAS,EAAE,EAAE,CAAC,yBAAyB,EAAE,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,uBAAuB,CAAC,kBAChG,GAAG,CAAC,KAAK,SACN,CACR,EACA,GAAG,CAAC,KAAK,IAAI,CACZ,eAAM,SAAS,EAAC,oIAAoI,YACjJ,GAAG,CAAC,KAAK,GACL,CACR,IACI,EACN,QAAQ,IAAI,eAAM,SAAS,EAAC,2DAA2D,GAAG,KAzBtF,GAAG,CAAC,KAAK,CA0BP,CACV,CAAC;QACJ,CAAC,CAAC,GACE,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ import * as React from "react";
2
+ export interface TextareaProps extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {
3
+ error?: boolean;
4
+ /** Show a "current/max" character counter (requires maxLength). */
5
+ showCount?: boolean;
6
+ }
7
+ export declare const Textarea: React.ForwardRefExoticComponent<TextareaProps & React.RefAttributes<HTMLTextAreaElement>>;
8
+ //# sourceMappingURL=textarea.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textarea.d.ts","sourceRoot":"","sources":["../../src/components/textarea.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,MAAM,WAAW,aAAc,SAAQ,KAAK,CAAC,sBAAsB,CAAC,mBAAmB,CAAC;IACtF,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,mEAAmE;IACnE,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,eAAO,MAAM,QAAQ,2FAmCpB,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import { cn } from "../lib/utils";
4
+ export const Textarea = React.forwardRef(({ className, error, showCount, maxLength, value, defaultValue, ...props }, ref) => {
5
+ const [count, setCount] = React.useState(String(value ?? defaultValue ?? "").length);
6
+ return (_jsxs("div", { children: [_jsx("textarea", { ref: ref, maxLength: maxLength, value: value, defaultValue: defaultValue, "aria-invalid": error || undefined, onChange: (e) => {
7
+ setCount(e.target.value.length);
8
+ props.onChange?.(e);
9
+ }, className: cn("min-h-[80px] w-full rounded-md border bg-card px-3 py-2 text-sm text-foreground transition-colors", "placeholder:text-muted-foreground", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand", "disabled:cursor-not-allowed disabled:opacity-50", error ? "border-red" : "border-border", className), ...props }), showCount && maxLength && (_jsxs("div", { className: "mt-1 text-right font-mono text-[11px] text-muted-foreground tabular-nums", children: [count, "/", maxLength] }))] }));
10
+ });
11
+ Textarea.displayName = "Textarea";
12
+ //# sourceMappingURL=textarea.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textarea.js","sourceRoot":"","sources":["../../src/components/textarea.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAQlC,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CACtC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE;IACjF,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC,QAAQ,CACtC,MAAM,CAAC,KAAK,IAAI,YAAY,IAAI,EAAE,CAAC,CAAC,MAAM,CAC3C,CAAC;IACF,OAAO,CACL,0BACE,mBACE,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,KAAK,EACZ,YAAY,EAAE,YAAY,kBACZ,KAAK,IAAI,SAAS,EAChC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;oBACd,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oBAChC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;gBACtB,CAAC,EACD,SAAS,EAAE,EAAE,CACX,mGAAmG,EACnG,mCAAmC,EACnC,0EAA0E,EAC1E,iDAAiD,EACjD,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,eAAe,EACtC,SAAS,CACV,KACG,KAAK,GACT,EACD,SAAS,IAAI,SAAS,IAAI,CACzB,eAAK,SAAS,EAAC,0EAA0E,aACtF,KAAK,OAAG,SAAS,IACd,CACP,IACG,CACP,CAAC;AACJ,CAAC,CACF,CAAC;AACF,QAAQ,CAAC,WAAW,GAAG,UAAU,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { toast } from "sonner";
2
+ /**
3
+ * Token-themed Sonner toaster. Mount one <Toaster /> near the app root,
4
+ * then call toast.success/error/info/message from anywhere.
5
+ */
6
+ export declare function Toaster(): import("react").JSX.Element;
7
+ export { toast };
8
+ //# sourceMappingURL=toast.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toast.d.ts","sourceRoot":"","sources":["../../src/components/toast.tsx"],"names":[],"mappings":"AAEA,OAAO,EAA4B,KAAK,EAAE,MAAM,QAAQ,CAAC;AAEzD;;;GAGG;AACH,wBAAgB,OAAO,gCAgBtB;AAED,OAAO,EAAE,KAAK,EAAE,CAAC"}
@@ -0,0 +1,20 @@
1
+ "use client";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { Toaster as SonnerToaster, toast } from "sonner";
4
+ /**
5
+ * Token-themed Sonner toaster. Mount one <Toaster /> near the app root,
6
+ * then call toast.success/error/info/message from anywhere.
7
+ */
8
+ export function Toaster() {
9
+ return (_jsx(SonnerToaster, { position: "bottom-right", toastOptions: {
10
+ classNames: {
11
+ toast: "!bg-card !border !border-border !text-foreground !rounded-lg !card-shadow-lg",
12
+ title: "!text-foreground !text-[13px] !font-semibold",
13
+ description: "!text-muted !text-[12px]",
14
+ actionButton: "!bg-brand !text-white",
15
+ cancelButton: "!bg-accent !text-foreground",
16
+ },
17
+ } }));
18
+ }
19
+ export { toast };
20
+ //# sourceMappingURL=toast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toast.js","sourceRoot":"","sources":["../../src/components/toast.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAEzD;;;GAGG;AACH,MAAM,UAAU,OAAO;IACrB,OAAO,CACL,KAAC,aAAa,IACZ,QAAQ,EAAC,cAAc,EACvB,YAAY,EAAE;YACZ,UAAU,EAAE;gBACV,KAAK,EACH,8EAA8E;gBAChF,KAAK,EAAE,8CAA8C;gBACrD,WAAW,EAAE,0BAA0B;gBACvC,YAAY,EAAE,uBAAuB;gBACrC,YAAY,EAAE,6BAA6B;aAC5C;SACF,GACD,CACH,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,KAAK,EAAE,CAAC"}
@@ -0,0 +1,13 @@
1
+ import * as React from "react";
2
+ import * as RT from "@radix-ui/react-tooltip";
3
+ export declare const TooltipProvider: React.FC<RT.TooltipProviderProps>;
4
+ interface TooltipProps {
5
+ content: React.ReactNode;
6
+ children: React.ReactNode;
7
+ side?: "top" | "right" | "bottom" | "left";
8
+ className?: string;
9
+ }
10
+ /** Simple tooltip wrapper. Wrap with a single <TooltipProvider> near the root. */
11
+ export declare function Tooltip({ content, children, side, className }: TooltipProps): React.JSX.Element;
12
+ export {};
13
+ //# sourceMappingURL=tooltip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tooltip.d.ts","sourceRoot":"","sources":["../../src/components/tooltip.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAG9C,eAAO,MAAM,eAAe,mCAAc,CAAC;AAE3C,UAAU,YAAY;IACpB,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,IAAI,CAAC,EAAE,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,kFAAkF;AAClF,wBAAgB,OAAO,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAY,EAAE,SAAS,EAAE,EAAE,YAAY,qBAqBnF"}
@@ -0,0 +1,10 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as RT from "@radix-ui/react-tooltip";
4
+ import { cn } from "../lib/utils";
5
+ export const TooltipProvider = RT.Provider;
6
+ /** Simple tooltip wrapper. Wrap with a single <TooltipProvider> near the root. */
7
+ export function Tooltip({ content, children, side = "top", className }) {
8
+ return (_jsx(RT.Provider, { delayDuration: 200, children: _jsxs(RT.Root, { children: [_jsx(RT.Trigger, { asChild: true, children: children }), _jsx(RT.Portal, { children: _jsxs(RT.Content, { side: side, sideOffset: 6, className: cn("z-[1600] rounded-md bg-navy px-2.5 py-1.5 text-[12px] font-medium text-white card-shadow-lg", className), children: [content, _jsx(RT.Arrow, { className: "fill-navy" })] }) })] }) }));
9
+ }
10
+ //# sourceMappingURL=tooltip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tooltip.js","sourceRoot":"","sources":["../../src/components/tooltip.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAGb,OAAO,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAC9C,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAElC,MAAM,CAAC,MAAM,eAAe,GAAG,EAAE,CAAC,QAAQ,CAAC;AAS3C,kFAAkF;AAClF,MAAM,UAAU,OAAO,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,GAAG,KAAK,EAAE,SAAS,EAAgB;IAClF,OAAO,CACL,KAAC,EAAE,CAAC,QAAQ,IAAC,aAAa,EAAE,GAAG,YAC7B,MAAC,EAAE,CAAC,IAAI,eACN,KAAC,EAAE,CAAC,OAAO,IAAC,OAAO,kBAAE,QAAQ,GAAc,EAC3C,KAAC,EAAE,CAAC,MAAM,cACR,MAAC,EAAE,CAAC,OAAO,IACT,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,CAAC,EACb,SAAS,EAAE,EAAE,CACX,6FAA6F,EAC7F,SAAS,CACV,aAEA,OAAO,EACR,KAAC,EAAE,CAAC,KAAK,IAAC,SAAS,EAAC,WAAW,GAAG,IACvB,GACH,IACJ,GACE,CACf,CAAC;AACJ,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { VerificationLevel } from "../lib/types";
2
+ interface VerifiedBadgeProps {
3
+ level: VerificationLevel;
4
+ size?: "sm" | "md";
5
+ className?: string;
6
+ }
7
+ export declare function VerifiedBadge({ level, size, className }: VerifiedBadgeProps): import("react").JSX.Element | null;
8
+ interface OfficeStatusBadgeProps {
9
+ status: "unclaimed" | "claimed" | "premium";
10
+ className?: string;
11
+ }
12
+ export declare function OfficeStatusBadge({ status, className }: OfficeStatusBadgeProps): import("react").JSX.Element | null;
13
+ export {};
14
+ //# sourceMappingURL=verified-badge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verified-badge.d.ts","sourceRoot":"","sources":["../../src/components/verified-badge.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEtD,UAAU,kBAAkB;IAC1B,KAAK,EAAE,iBAAiB,CAAC;IACzB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,aAAa,CAAC,EAAE,KAAK,EAAE,IAAW,EAAE,SAAS,EAAE,EAAE,kBAAkB,sCAkClF;AAED,UAAU,sBAAsB;IAC9B,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,iBAAiB,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,sBAAsB,sCAc9E"}
@@ -0,0 +1,20 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { ShieldCheck, Crown } from "lucide-react";
3
+ import { cn } from "../lib/utils";
4
+ export function VerifiedBadge({ level, size = "md", className }) {
5
+ if (level === "none")
6
+ return null;
7
+ const sizeClass = size === "sm" ? "text-[10px] px-1.5 py-0.5 gap-1" : "text-xs px-2 py-0.5 gap-1.5";
8
+ const iconSize = size === "sm" ? "h-3 w-3" : "h-3.5 w-3.5";
9
+ if (level === "premium") {
10
+ return (_jsxs("span", { className: cn("inline-flex items-center rounded-full bg-sparkle-bg text-sparkle font-semibold", sizeClass, className), children: [_jsx(Crown, { className: iconSize }), "Premium"] }));
11
+ }
12
+ return (_jsxs("span", { className: cn("inline-flex items-center rounded-full bg-sparkle-bg text-sparkle font-semibold", sizeClass, className), children: [_jsx(ShieldCheck, { className: iconSize }), "Verified"] }));
13
+ }
14
+ export function OfficeStatusBadge({ status, className }) {
15
+ if (status === "unclaimed") {
16
+ return (_jsx("span", { className: cn("inline-flex items-center rounded-full bg-accent px-2 py-0.5 text-[10px] font-medium text-muted-foreground", className), children: "Unclaimed" }));
17
+ }
18
+ return null;
19
+ }
20
+ //# sourceMappingURL=verified-badge.js.map