@david-richard/notify-ds 1.0.4 → 1.1.1

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 (59) hide show
  1. package/assets/icons/alert-circle.svg +5 -0
  2. package/assets/icons/alert-triangle.svg +5 -0
  3. package/assets/icons/arrow-down-2.svg +4 -0
  4. package/assets/icons/arrow-down.svg +3 -0
  5. package/assets/icons/arrow-left.svg +3 -0
  6. package/assets/icons/arrow-right.svg +3 -0
  7. package/assets/icons/arrow-up-2.svg +4 -0
  8. package/assets/icons/arrow-up.svg +3 -3
  9. package/assets/icons/bell.svg +4 -3
  10. package/assets/icons/calendar.svg +6 -3
  11. package/assets/icons/check-badge.svg +4 -0
  12. package/assets/icons/check-circle.svg +4 -0
  13. package/assets/icons/check.svg +3 -0
  14. package/assets/icons/chevron-down.svg +3 -0
  15. package/assets/icons/chevron-left.svg +3 -3
  16. package/assets/icons/chevron-right.svg +3 -0
  17. package/assets/icons/chevron-up.svg +3 -0
  18. package/assets/icons/clock.svg +4 -0
  19. package/assets/icons/close.svg +4 -0
  20. package/assets/icons/dashboard.svg +6 -3
  21. package/assets/icons/download.svg +5 -0
  22. package/assets/icons/extend.svg +5 -0
  23. package/assets/icons/face-id.svg +9 -0
  24. package/assets/icons/filter.svg +3 -3
  25. package/assets/icons/help-circle.svg +5 -0
  26. package/assets/icons/hide.svg +6 -0
  27. package/assets/icons/info.svg +5 -0
  28. package/assets/icons/local.svg +4 -0
  29. package/assets/icons/lock.svg +5 -0
  30. package/assets/icons/menu.svg +5 -0
  31. package/assets/icons/minus.svg +3 -0
  32. package/assets/icons/more-horizontal.svg +5 -0
  33. package/assets/icons/more-vertical.svg +5 -0
  34. package/assets/icons/open-lock.svg +5 -0
  35. package/assets/icons/package.svg +6 -0
  36. package/assets/icons/plus.svg +4 -0
  37. package/assets/icons/refresh.svg +6 -0
  38. package/assets/icons/search.svg +4 -3
  39. package/assets/icons/sliders.svg +11 -0
  40. package/assets/icons/store.svg +5 -3
  41. package/assets/icons/trending-down.svg +11 -3
  42. package/assets/icons/trending-up.svg +11 -3
  43. package/assets/icons/upload.svg +5 -0
  44. package/assets/icons/user.svg +4 -0
  45. package/assets/icons/view.svg +4 -0
  46. package/assets/icons/x-circle.svg +5 -0
  47. package/dist/chunk-O55YYDMU.mjs +407 -0
  48. package/dist/chunk-O55YYDMU.mjs.map +1 -0
  49. package/dist/icons/index.d.mts +244 -0
  50. package/dist/icons/index.d.ts +244 -0
  51. package/dist/icons/index.js +455 -0
  52. package/dist/icons/index.js.map +1 -0
  53. package/dist/icons/index.mjs +3 -0
  54. package/dist/icons/index.mjs.map +1 -0
  55. package/dist/index.js +90 -74
  56. package/dist/index.js.map +1 -1
  57. package/dist/index.mjs +11 -75
  58. package/dist/index.mjs.map +1 -1
  59. package/package.json +6 -1
package/dist/index.mjs CHANGED
@@ -1,3 +1,4 @@
1
+ import { Search, Hide, View, XCircle, Info, Check, Minus, ChevronDown, ChevronRight, ArrowUp2, ArrowDown2 } from './chunk-O55YYDMU.mjs';
1
2
  import * as React4 from 'react';
2
3
  import { Slot } from '@radix-ui/react-slot';
3
4
  import { cva } from 'class-variance-authority';
@@ -5,7 +6,6 @@ import { clsx } from 'clsx';
5
6
  import { twMerge } from 'tailwind-merge';
6
7
  import { jsx, jsxs } from 'react/jsx-runtime';
7
8
 
8
- // components/button.tsx
9
9
  function cn(...inputs) {
10
10
  return twMerge(clsx(inputs));
11
11
  }
@@ -154,7 +154,7 @@ var InputField = React4.forwardRef(
154
154
  required && /* @__PURE__ */ jsx("span", { className: "text-[var(--color-brand-red,#EF2149)]", "aria-hidden": "true", children: " *" })
155
155
  ] }),
156
156
  /* @__PURE__ */ jsxs("div", { className: pillVariants({ state }), children: [
157
- type === "search" && /* @__PURE__ */ jsx("span", { className: cn("shrink-0", iconColor), "aria-hidden": "true", children: /* @__PURE__ */ jsx(SearchIcon, {}) }),
157
+ type === "search" && /* @__PURE__ */ jsx("span", { className: cn("shrink-0", iconColor), "aria-hidden": "true", children: /* @__PURE__ */ jsx(Search, { size: 16 }) }),
158
158
  /* @__PURE__ */ jsx(
159
159
  "input",
160
160
  {
@@ -187,7 +187,7 @@ var InputField = React4.forwardRef(
187
187
  onClick: () => setShowPassword((v) => !v),
188
188
  className: cn("shrink-0 cursor-pointer", iconColor),
189
189
  "aria-label": showPassword ? "Hide password" : "Show password",
190
- children: showPassword ? /* @__PURE__ */ jsx(EyeOffIcon, {}) : /* @__PURE__ */ jsx(EyeIcon, {})
190
+ children: showPassword ? /* @__PURE__ */ jsx(Hide, { size: 16 }) : /* @__PURE__ */ jsx(View, { size: 16 })
191
191
  }
192
192
  ),
193
193
  !rightSlot && type === "search" && hasValue && !disabled && /* @__PURE__ */ jsx(
@@ -198,10 +198,10 @@ var InputField = React4.forwardRef(
198
198
  onClick: () => setHasValue(false),
199
199
  className: cn("shrink-0 cursor-pointer", iconColor),
200
200
  "aria-label": "Clear search",
201
- children: /* @__PURE__ */ jsx(XCircleIcon, {})
201
+ children: /* @__PURE__ */ jsx(XCircle, { size: 16 })
202
202
  }
203
203
  ),
204
- !rightSlot && state === "error" && type !== "password" && /* @__PURE__ */ jsx("span", { className: cn("shrink-0", iconColor), "aria-hidden": "true", children: /* @__PURE__ */ jsx(InfoCircleIcon, {}) })
204
+ !rightSlot && state === "error" && type !== "password" && /* @__PURE__ */ jsx("span", { className: cn("shrink-0", iconColor), "aria-hidden": "true", children: /* @__PURE__ */ jsx(Info, { size: 16 }) })
205
205
  ] }),
206
206
  (errorMessage || helperText) && /* @__PURE__ */ jsx(
207
207
  "p",
@@ -217,39 +217,6 @@ var InputField = React4.forwardRef(
217
217
  }
218
218
  );
219
219
  InputField.displayName = "InputField";
220
- function SearchIcon() {
221
- return /* @__PURE__ */ jsxs("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", children: [
222
- /* @__PURE__ */ jsx("circle", { cx: "7", cy: "7", r: "4.5" }),
223
- /* @__PURE__ */ jsx("line", { x1: "10.5", y1: "10.5", x2: "14", y2: "14" })
224
- ] });
225
- }
226
- function EyeIcon() {
227
- return /* @__PURE__ */ jsxs("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", children: [
228
- /* @__PURE__ */ jsx("path", { d: "M1 8s2.5-5 7-5 7 5 7 5-2.5 5-7 5-7-5-7-5Z" }),
229
- /* @__PURE__ */ jsx("circle", { cx: "8", cy: "8", r: "2" })
230
- ] });
231
- }
232
- function EyeOffIcon() {
233
- return /* @__PURE__ */ jsxs("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", children: [
234
- /* @__PURE__ */ jsx("path", { d: "M2 2l12 12M6.5 6.5A2 2 0 0 0 9.5 9.5" }),
235
- /* @__PURE__ */ jsx("path", { d: "M4.2 4.2C2.6 5.2 1 8 1 8s2.5 5 7 5c1.4 0 2.7-.4 3.8-1" }),
236
- /* @__PURE__ */ jsx("path", { d: "M9.8 3.2C12.2 4.2 15 8 15 8s-.7 1.4-1.8 2.6" })
237
- ] });
238
- }
239
- function XCircleIcon() {
240
- return /* @__PURE__ */ jsxs("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", children: [
241
- /* @__PURE__ */ jsx("circle", { cx: "8", cy: "8", r: "6.5" }),
242
- /* @__PURE__ */ jsx("line", { x1: "5.5", y1: "5.5", x2: "10.5", y2: "10.5" }),
243
- /* @__PURE__ */ jsx("line", { x1: "10.5", y1: "5.5", x2: "5.5", y2: "10.5" })
244
- ] });
245
- }
246
- function InfoCircleIcon() {
247
- return /* @__PURE__ */ jsxs("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", children: [
248
- /* @__PURE__ */ jsx("circle", { cx: "8", cy: "8", r: "6.5" }),
249
- /* @__PURE__ */ jsx("line", { x1: "8", y1: "7", x2: "8", y2: "11" }),
250
- /* @__PURE__ */ jsx("circle", { cx: "8", cy: "5", r: "0.5", fill: "currentColor", stroke: "none" })
251
- ] });
252
- }
253
220
  var Checkbox = React4.forwardRef(
254
221
  ({ label, indeterminate, helperText, disabled, checked, defaultChecked, className, onChange, ...props }, ref) => {
255
222
  const internalRef = React4.useRef(null);
@@ -299,8 +266,8 @@ var Checkbox = React4.forwardRef(
299
266
  showCheck || showDash ? "border-transparent bg-[var(--color-secondary,#339FB8)] text-[var(--color-foreground,#000)]" : "border-[var(--color-secondary,#339FB8)] bg-transparent"
300
267
  ),
301
268
  children: [
302
- showCheck && /* @__PURE__ */ jsx(CheckIcon, {}),
303
- showDash && /* @__PURE__ */ jsx(DashIcon, {})
269
+ showCheck && /* @__PURE__ */ jsx(Check, { size: 12 }),
270
+ showDash && /* @__PURE__ */ jsx(Minus, { size: 12 })
304
271
  ]
305
272
  }
306
273
  ),
@@ -314,12 +281,6 @@ var Checkbox = React4.forwardRef(
314
281
  }
315
282
  );
316
283
  Checkbox.displayName = "Checkbox";
317
- function CheckIcon() {
318
- return /* @__PURE__ */ jsx("svg", { width: "11", height: "8", viewBox: "0 0 11 8", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx("polyline", { points: "1,4 4,7 10,1" }) });
319
- }
320
- function DashIcon() {
321
- return /* @__PURE__ */ jsx("svg", { width: "10", height: "2", viewBox: "0 0 10 2", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", children: /* @__PURE__ */ jsx("line", { x1: "1", y1: "1", x2: "9", y2: "1" }) });
322
- }
323
284
  var Radio = React4.forwardRef(
324
285
  ({ label, helperText, disabled, checked, defaultChecked, className, onChange, ...props }, ref) => {
325
286
  const [isChecked, setIsChecked] = React4.useState(!!defaultChecked);
@@ -562,8 +523,9 @@ var Selector = React4.forwardRef(
562
523
  icon && /* @__PURE__ */ jsx("span", { className: "shrink-0 [&_svg]:size-4", children: icon }),
563
524
  /* @__PURE__ */ jsx("span", { children: label }),
564
525
  /* @__PURE__ */ jsx(
565
- ChevronDownIcon,
526
+ ChevronDown,
566
527
  {
528
+ size: 12,
567
529
  className: cn(
568
530
  "shrink-0 transition-transform duration-[120ms]",
569
531
  open && "rotate-180"
@@ -579,23 +541,6 @@ Selector.displayName = "Selector";
579
541
  function SelectorGroup({ children, className }) {
580
542
  return /* @__PURE__ */ jsx("div", { className: cn("flex flex-wrap items-center gap-2", className), children });
581
543
  }
582
- function ChevronDownIcon({ className }) {
583
- return /* @__PURE__ */ jsx(
584
- "svg",
585
- {
586
- width: "12",
587
- height: "12",
588
- viewBox: "0 0 12 12",
589
- fill: "none",
590
- stroke: "currentColor",
591
- strokeWidth: "1.5",
592
- strokeLinecap: "round",
593
- strokeLinejoin: "round",
594
- className,
595
- children: /* @__PURE__ */ jsx("polyline", { points: "2,4 6,8 10,4" })
596
- }
597
- );
598
- }
599
544
  function TabBar({
600
545
  tabs,
601
546
  value,
@@ -854,7 +799,7 @@ function Badge({ variant, size, icon, children, className, ...props }) {
854
799
  function TrendBadge({ value, decimals = 1, showArrow = true, className, ...props }) {
855
800
  const colorClass = value > 0 ? "text-[var(--color-success,#16A34A)]" : value < 0 ? "text-[var(--color-destructive,#EF2149)]" : "text-[var(--color-text-tertiary,#6B7280)]";
856
801
  const formatted = `${value > 0 ? "+" : ""}${value.toFixed(decimals)}%`;
857
- const arrow = showArrow ? value > 0 ? /* @__PURE__ */ jsx(ArrowUpIcon, {}) : value < 0 ? /* @__PURE__ */ jsx(ArrowDownIcon, {}) : null : null;
802
+ const arrow = showArrow ? value > 0 ? /* @__PURE__ */ jsx(ArrowUp2, {}) : value < 0 ? /* @__PURE__ */ jsx(ArrowDown2, {}) : null : null;
858
803
  return /* @__PURE__ */ jsxs(
859
804
  "span",
860
805
  {
@@ -873,12 +818,6 @@ function TrendBadge({ value, decimals = 1, showArrow = true, className, ...props
873
818
  }
874
819
  );
875
820
  }
876
- function ArrowUpIcon() {
877
- return /* @__PURE__ */ jsx("svg", { width: "10", height: "10", viewBox: "0 0 10 10", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx("polyline", { points: "2,7 5,3 8,7" }) });
878
- }
879
- function ArrowDownIcon() {
880
- return /* @__PURE__ */ jsx("svg", { width: "10", height: "10", viewBox: "0 0 10 10", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx("polyline", { points: "2,3 5,7 8,3" }) });
881
- }
882
821
  function MetricTile({
883
822
  label,
884
823
  value,
@@ -936,7 +875,7 @@ function MetricTile({
936
875
  children: !loading && label
937
876
  }
938
877
  ),
939
- !loading && (icon ? /* @__PURE__ */ jsx("span", { className: "shrink-0 text-[var(--color-text-tertiary,#6B7280)] [&_svg]:size-4", "aria-hidden": "true", children: icon }) : onClick ? /* @__PURE__ */ jsx("span", { className: "shrink-0 text-[var(--color-text-tertiary,#6B7280)] [&_svg]:size-3.5", "aria-hidden": "true", children: /* @__PURE__ */ jsx(ChevronRightIcon, {}) }) : null)
878
+ !loading && (icon ? /* @__PURE__ */ jsx("span", { className: "shrink-0 text-[var(--color-text-tertiary,#6B7280)] [&_svg]:size-4", "aria-hidden": "true", children: icon }) : onClick ? /* @__PURE__ */ jsx("span", { className: "shrink-0 text-[var(--color-text-tertiary,#6B7280)]", "aria-hidden": "true", children: /* @__PURE__ */ jsx(ChevronRight, { size: 14 }) }) : null)
940
879
  ] }),
941
880
  /* @__PURE__ */ jsx(
942
881
  "span",
@@ -968,9 +907,6 @@ function MetricTileGrid({ cols = 2, children, className }) {
968
907
  }[cols];
969
908
  return /* @__PURE__ */ jsx("div", { className: cn("grid gap-3", colClass, className), children });
970
909
  }
971
- function ChevronRightIcon() {
972
- return /* @__PURE__ */ jsx("svg", { viewBox: "0 0 14 14", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: /* @__PURE__ */ jsx("polyline", { points: "5,3 9,7 5,11" }) });
973
- }
974
910
 
975
911
  export { Badge, BottomNav, BottomNavContainer, Button, Checkbox, IconButton, InputField, MetricTile, MetricTileGrid, Radio, RadioGroup, Selector, SelectorGroup, Switcher, TabBar, TabPanel, TabPanels, Toggle, TrendBadge, buttonVariants };
976
912
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../components/utils.ts","../components/button.tsx","../components/input.tsx","../components/checkbox.tsx","../components/radio.tsx","../components/toggle.tsx","../components/selector.tsx","../components/tabs.tsx","../components/switcher.tsx","../components/bottom-nav.tsx","../components/badge.tsx","../components/metric-tile.tsx"],"names":["React","cva","React2","jsx","React3","jsxs","React5","React6","React7","React8","React9"],"mappings":"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","file":"index.mjs","sourcesContent":["import { clsx, type ClassValue } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"./utils\"\n\n/**\n * Button — shadcn-style primitive backed by the semantic tokens in tokens.css.\n *\n * Matrix:\n * variant: primary | secondary | tertiary | link\n * size: xsm | sm | md | lg\n * state: active (default) | inactive | disabled — driven by `data-state` + `disabled`\n *\n * Use `<Button iconOnly />` (or `<IconButton />` below) to render the icon-only square form.\n */\nconst buttonVariants = cva(\n [\n // base\n \"inline-flex items-center justify-center whitespace-nowrap select-none\",\n \"rounded-[var(--button-radius)] font-medium font-[var(--font-family-secondary)]\", // Red Hat Text Medium per spec\n \"transition-colors duration-[var(--p-duration-fast)] ease-[var(--p-easing-standard)]\",\n \"outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-ring)] focus-visible:ring-offset-2\",\n \"disabled:pointer-events-none disabled:opacity-[var(--p-opacity-disabled)]\",\n // icon child sizing\n \"[&_svg]:shrink-0\",\n ],\n {\n variants: {\n variant: {\n primary: [\n \"bg-[var(--color-primary)] text-[var(--color-primary-foreground)]\",\n \"hover:bg-[var(--color-primary-hover)] active:bg-[var(--color-primary-pressed)]\",\n \"data-[state=inactive]:bg-[var(--color-inactive)] data-[state=inactive]:text-[var(--color-inactive-foreground)]\",\n ],\n secondary: [\n \"bg-transparent text-[var(--color-secondary-foreground)]\",\n \"border border-[var(--color-secondary-border)]\",\n \"hover:bg-[var(--color-secondary-hover)] active:bg-[var(--color-secondary-pressed)]\",\n \"data-[state=inactive]:text-[var(--color-inactive-foreground)] data-[state=inactive]:border-[var(--color-inactive-border)]\",\n ],\n tertiary: [\n \"bg-transparent text-[var(--color-tertiary-foreground)]\",\n \"hover:bg-[var(--color-tertiary-hover)]\",\n \"data-[state=inactive]:text-[var(--color-inactive-foreground)]\",\n ],\n link: [\n \"bg-transparent text-[var(--color-link-foreground)] underline underline-offset-4\",\n \"hover:decoration-2\",\n \"data-[state=inactive]:text-[var(--color-inactive-foreground)]\",\n ],\n },\n size: {\n xsm: \"h-[var(--button-xsm-h)] px-[var(--button-xsm-px)] gap-[var(--button-xsm-gap)] text-[length:var(--button-xsm-fs)] leading-[var(--button-xsm-lh)] [&_svg]:size-3\",\n sm: \"h-[var(--button-sm-h)] px-[var(--button-sm-px)] gap-[var(--button-sm-gap)] text-[length:var(--button-sm-fs)] leading-[var(--button-sm-lh)] [&_svg]:size-[14px]\",\n md: \"h-[var(--button-md-h)] px-[var(--button-md-px)] gap-[var(--button-md-gap)] text-[length:var(--button-md-fs)] leading-[var(--button-md-lh)] [&_svg]:size-4\",\n lg: \"h-[var(--button-lg-h)] px-[var(--button-lg-px)] gap-[var(--button-lg-gap)] text-[length:var(--button-lg-fs)] leading-[var(--button-lg-lh)] [&_svg]:size-5\",\n },\n iconOnly: {\n true: \"px-0 aspect-square rounded-[var(--button-icon-radius)]\",\n false: \"\",\n },\n },\n compoundVariants: [\n // Link variant has no horizontal padding — it's text-like.\n { variant: \"link\", iconOnly: false, class: \"px-0 h-auto\" },\n // Tertiary should hug its text vertically.\n { variant: \"tertiary\", iconOnly: false, class: \"\" },\n ],\n defaultVariants: {\n variant: \"primary\",\n size: \"md\",\n iconOnly: false,\n },\n },\n)\n\ntype ButtonState = \"active\" | \"inactive\"\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean\n state?: ButtonState\n}\n\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, iconOnly, state = \"active\", asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\"\n return (\n <Comp\n ref={ref}\n data-state={state}\n className={cn(buttonVariants({ variant, size, iconOnly }), className)}\n {...props}\n />\n )\n },\n)\nButton.displayName = \"Button\"\n\nexport const IconButton = React.forwardRef<HTMLButtonElement, Omit<ButtonProps, \"iconOnly\">>(\n (props, ref) => <Button ref={ref} iconOnly {...props} />,\n)\nIconButton.displayName = \"IconButton\"\n\nexport { buttonVariants }\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"./utils\"\n\n/**\n * Input — pill-shaped form field matching the Qu Notify Input component set.\n *\n * Matrix:\n * type: default | password | search\n * state: normal | active | filled | error | disabled | readonly\n *\n * Anatomy (top → bottom):\n * <label> — Red Hat Text Medium 18px, required asterisk in brand-red\n * <pill> — full-radius container, white bg, 1.5px stroke\n * [left-icon] — search icon (search type only)\n * <input> — Inter Regular 16px placeholder / filled text\n * [right-icon] — eye/eye-off toggle (password), x-circle clear (search filled), info (error)\n * <helper> — Inter Regular 12px, gray or red\n *\n * Usage:\n * <InputField label=\"Email\" placeholder=\"you@example.com\" />\n * <InputField type=\"password\" label=\"Password\" required />\n * <InputField type=\"search\" placeholder=\"Search checks...\" />\n * <InputField state=\"error\" errorMessage=\"Invalid email address\" />\n */\n\n// ── pill shell ──────────────────────────────────────────────────────────────\nconst pillVariants = cva(\n [\n \"flex items-center gap-2\",\n \"h-12 w-full rounded-full px-4\",\n \"border-[1.5px] bg-[var(--color-input-bg,#fff)]\",\n \"transition-colors duration-[120ms]\",\n ],\n {\n variants: {\n state: {\n normal: \"border-[var(--color-input-border-default,#C9C9C9)]\",\n active: \"border-[var(--color-input-border-active,#40CCF2)] ring-0\",\n filled: \"border-[var(--color-input-border-default,#C9C9C9)]\",\n error: \"border-[var(--color-input-border-error,#EF2149)]\",\n disabled: \"border-[var(--color-input-border-default,#C9C9C9)] bg-[var(--color-input-bg-disabled,#F4F4F4)] cursor-not-allowed opacity-50\",\n readonly: \"border-[var(--color-input-border-default,#C9C9C9)] bg-[var(--color-input-bg-disabled,#F4F4F4)]\",\n },\n },\n defaultVariants: { state: \"normal\" },\n },\n)\n\ntype InputState = \"normal\" | \"active\" | \"filled\" | \"error\" | \"disabled\" | \"readonly\"\ntype InputType = \"default\" | \"password\" | \"search\"\n\nexport interface InputFieldProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"type\"> {\n /** Visual input type — controls icons and keyboard on mobile */\n type?: InputType\n /** Controlled state override — set automatically on focus/blur if uncontrolled */\n state?: InputState\n label?: string\n /** Whether to show the red required asterisk */\n required?: boolean\n helperText?: string\n errorMessage?: string\n /** Slot for a custom right-side icon/action */\n rightSlot?: React.ReactNode\n}\n\nexport const InputField = React.forwardRef<HTMLInputElement, InputFieldProps>(\n (\n {\n type = \"default\",\n state: stateProp,\n label,\n required,\n helperText,\n errorMessage,\n rightSlot,\n className,\n onFocus,\n onBlur,\n onChange,\n value,\n defaultValue,\n disabled,\n readOnly,\n placeholder,\n ...props\n },\n ref,\n ) => {\n // ── internal state for uncontrolled focus/fill tracking ──\n const [focused, setFocused] = React.useState(false)\n const [hasValue, setHasValue] = React.useState(!!defaultValue || !!value)\n const [showPassword, setShowPassword] = React.useState(false)\n\n // Derive visual state\n const state: InputState =\n stateProp ??\n (disabled ? \"disabled\"\n : readOnly ? \"readonly\"\n : errorMessage ? \"error\"\n : focused ? \"active\"\n : hasValue ? \"filled\"\n : \"normal\")\n\n const nativeType =\n type === \"password\" ? (showPassword ? \"text\" : \"password\") :\n type === \"search\" ? \"search\" :\n \"text\"\n\n const handleFocus = (e: React.FocusEvent<HTMLInputElement>) => {\n setFocused(true)\n onFocus?.(e)\n }\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n setFocused(false)\n onBlur?.(e)\n }\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setHasValue(e.target.value.length > 0)\n onChange?.(e)\n }\n\n // ── icon colors ──────────────────────────────────────────────────────────\n const iconColor =\n state === \"active\" ? \"text-[var(--color-input-icon-active,#40CCF2)]\" :\n state === \"error\" ? \"text-[var(--color-input-icon-error,#EF2149)]\" :\n \"text-[var(--color-input-icon-default,#B1B1B1)]\"\n\n return (\n <div className={cn(\"flex w-full flex-col gap-1.5\", className)}>\n\n {/* Label row */}\n {label && (\n <label className=\"flex items-center gap-0.5 font-['Red_Hat_Text'] text-[18px] font-medium leading-tight text-[var(--color-text-primary,#000)]\">\n {label}\n {required && (\n <span className=\"text-[var(--color-brand-red,#EF2149)]\" aria-hidden=\"true\"> *</span>\n )}\n </label>\n )}\n\n {/* Pill */}\n <div className={pillVariants({ state })}>\n\n {/* Left icon — search only */}\n {type === \"search\" && (\n <span className={cn(\"shrink-0\", iconColor)} aria-hidden=\"true\">\n <SearchIcon />\n </span>\n )}\n\n {/* Native input */}\n <input\n ref={ref}\n type={nativeType}\n disabled={disabled || state === \"disabled\"}\n readOnly={readOnly || state === \"readonly\"}\n placeholder={placeholder}\n value={value}\n defaultValue={defaultValue}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onChange={handleChange}\n className={cn(\n \"min-w-0 flex-1 bg-transparent outline-none\",\n \"font-['Inter'] text-[16px] font-normal\",\n \"text-[var(--color-input-text,#000)] placeholder:text-[var(--color-input-placeholder,#B1B1B1)]\",\n \"disabled:cursor-not-allowed\",\n )}\n aria-invalid={state === \"error\" || undefined}\n {...props}\n />\n\n {/* Right slot — custom override */}\n {rightSlot}\n\n {/* Right icon — contextual */}\n {!rightSlot && type === \"password\" && (\n <button\n type=\"button\"\n tabIndex={-1}\n onClick={() => setShowPassword(v => !v)}\n className={cn(\"shrink-0 cursor-pointer\", iconColor)}\n aria-label={showPassword ? \"Hide password\" : \"Show password\"}\n >\n {showPassword ? <EyeOffIcon /> : <EyeIcon />}\n </button>\n )}\n {!rightSlot && type === \"search\" && hasValue && !disabled && (\n <button\n type=\"button\"\n tabIndex={-1}\n onClick={() => setHasValue(false)}\n className={cn(\"shrink-0 cursor-pointer\", iconColor)}\n aria-label=\"Clear search\"\n >\n <XCircleIcon />\n </button>\n )}\n {!rightSlot && state === \"error\" && type !== \"password\" && (\n <span className={cn(\"shrink-0\", iconColor)} aria-hidden=\"true\">\n <InfoCircleIcon />\n </span>\n )}\n </div>\n\n {/* Helper / error text */}\n {(errorMessage || helperText) && (\n <p\n className={cn(\n \"font-['Inter'] text-[12px] font-normal leading-tight px-1\",\n errorMessage\n ? \"text-[var(--color-input-text-error,#EF2149)]\"\n : \"text-[var(--color-text-tertiary,#6B7280)]\",\n )}\n >\n {errorMessage ?? helperText}\n </p>\n )}\n </div>\n )\n },\n)\nInputField.displayName = \"InputField\"\n\n// ── inline icon components (16×16 stroke, matches Figma set) ─────────────────\n\nfunction SearchIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"7\" cy=\"7\" r=\"4.5\" />\n <line x1=\"10.5\" y1=\"10.5\" x2=\"14\" y2=\"14\" />\n </svg>\n )\n}\n\nfunction EyeIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M1 8s2.5-5 7-5 7 5 7 5-2.5 5-7 5-7-5-7-5Z\" />\n <circle cx=\"8\" cy=\"8\" r=\"2\" />\n </svg>\n )\n}\n\nfunction EyeOffIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M2 2l12 12M6.5 6.5A2 2 0 0 0 9.5 9.5\" />\n <path d=\"M4.2 4.2C2.6 5.2 1 8 1 8s2.5 5 7 5c1.4 0 2.7-.4 3.8-1\" />\n <path d=\"M9.8 3.2C12.2 4.2 15 8 15 8s-.7 1.4-1.8 2.6\" />\n </svg>\n )\n}\n\nfunction XCircleIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"8\" cy=\"8\" r=\"6.5\" />\n <line x1=\"5.5\" y1=\"5.5\" x2=\"10.5\" y2=\"10.5\" />\n <line x1=\"10.5\" y1=\"5.5\" x2=\"5.5\" y2=\"10.5\" />\n </svg>\n )\n}\n\nfunction InfoCircleIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"8\" cy=\"8\" r=\"6.5\" />\n <line x1=\"8\" y1=\"7\" x2=\"8\" y2=\"11\" />\n <circle cx=\"8\" cy=\"5\" r=\"0.5\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n )\n}\n","import * as React from \"react\"\nimport { cn } from \"./utils\"\n\n/**\n * Checkbox — Qu Notify form control.\n *\n * States: unchecked | checked | indeterminate | disabled\n * - Unchecked: transparent fill, 1.5px teal (#339FB8) stroke, 4px radius\n * - Checked: cyan (#40CCF2) fill, white checkmark, no stroke\n * - Indeterminate: cyan fill, white dash, no stroke\n * - Disabled: opacity 0.5 on full component\n *\n * Usage:\n * <Checkbox label=\"Remember me\" />\n * <Checkbox checked label=\"Agreed to terms\" />\n * <Checkbox indeterminate label=\"Select all\" />\n * <Checkbox disabled label=\"Unavailable option\" />\n */\n\nexport interface CheckboxProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"type\"> {\n label?: string\n indeterminate?: boolean\n helperText?: string\n}\n\nexport const Checkbox = React.forwardRef<HTMLInputElement, CheckboxProps>(\n ({ label, indeterminate, helperText, disabled, checked, defaultChecked, className, onChange, ...props }, ref) => {\n const internalRef = React.useRef<HTMLInputElement>(null)\n const resolvedRef = (ref as React.RefObject<HTMLInputElement>) ?? internalRef\n\n const [isChecked, setIsChecked] = React.useState(!!defaultChecked || !!checked)\n const isControlled = checked !== undefined\n const currentChecked = isControlled ? !!checked : isChecked\n\n React.useEffect(() => {\n if (resolvedRef.current) {\n resolvedRef.current.indeterminate = !!indeterminate\n }\n }, [indeterminate, resolvedRef])\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (!isControlled) setIsChecked(e.target.checked)\n onChange?.(e)\n }\n\n const showCheck = !indeterminate && currentChecked\n const showDash = !!indeterminate\n\n return (\n <label\n className={cn(\n \"inline-flex items-center gap-2 cursor-pointer select-none\",\n disabled && \"opacity-50 cursor-not-allowed\",\n className,\n )}\n >\n {/* Hidden native input for a11y / form submission */}\n <input\n ref={resolvedRef}\n type=\"checkbox\"\n checked={isControlled ? checked : isChecked}\n disabled={disabled}\n onChange={handleChange}\n className=\"sr-only\"\n {...props}\n />\n\n {/* Visual control */}\n <span\n aria-hidden=\"true\"\n className={cn(\n \"flex h-[18px] w-[18px] shrink-0 items-center justify-center rounded-[6px]\",\n \"border-[2px] transition-colors duration-[120ms]\",\n (showCheck || showDash)\n ? \"border-transparent bg-[var(--color-secondary,#339FB8)] text-[var(--color-foreground,#000)]\"\n : \"border-[var(--color-secondary,#339FB8)] bg-transparent\",\n )}\n >\n {showCheck && <CheckIcon />}\n {showDash && <DashIcon />}\n </span>\n\n {/* Label + helper */}\n {(label || helperText) && (\n <span className=\"flex flex-col gap-0.5\">\n {label && (\n <span className=\"font-['Red_Hat_Text'] text-[14px] font-normal leading-tight text-[var(--color-text-primary,#000)]\">\n {label}\n </span>\n )}\n {helperText && (\n <span className=\"font-['Inter'] text-[12px] text-[var(--color-text-tertiary,#6B7280)]\">\n {helperText}\n </span>\n )}\n </span>\n )}\n </label>\n )\n },\n)\nCheckbox.displayName = \"Checkbox\"\n\n// ── icons ────────────────────────────────────────────────────────────────────\n\nfunction CheckIcon() {\n return (\n <svg width=\"11\" height=\"8\" viewBox=\"0 0 11 8\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"1,4 4,7 10,1\" />\n </svg>\n )\n}\n\nfunction DashIcon() {\n return (\n <svg width=\"10\" height=\"2\" viewBox=\"0 0 10 2\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\">\n <line x1=\"1\" y1=\"1\" x2=\"9\" y2=\"1\" />\n </svg>\n )\n}\n","import * as React from \"react\"\nimport { cn } from \"./utils\"\n\n/**\n * Radio — Qu Notify form control.\n *\n * States: unselected | selected | disabled\n * - Unselected: transparent fill, 1.5px teal (#339FB8) stroke, full radius\n * - Selected: cyan (#40CCF2) fill, white center dot, no stroke\n * - Disabled: opacity 0.5 on full component\n *\n * Usage (uncontrolled, group via same `name`):\n * <Radio name=\"time\" value=\"day\" label=\"Day\" />\n * <Radio name=\"time\" value=\"week\" label=\"Week\" defaultChecked />\n * <Radio name=\"time\" value=\"month\" label=\"Month\" />\n *\n * Usage (controlled):\n * <Radio name=\"x\" value=\"a\" checked={val === \"a\"} onChange={() => setVal(\"a\")} label=\"Option A\" />\n */\n\nexport interface RadioProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"type\"> {\n label?: string\n helperText?: string\n}\n\nexport const Radio = React.forwardRef<HTMLInputElement, RadioProps>(\n ({ label, helperText, disabled, checked, defaultChecked, className, onChange, ...props }, ref) => {\n const [isChecked, setIsChecked] = React.useState(!!defaultChecked)\n const isControlled = checked !== undefined\n const currentChecked = isControlled ? !!checked : isChecked\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (!isControlled) setIsChecked(e.target.checked)\n onChange?.(e)\n }\n\n return (\n <label\n className={cn(\n \"inline-flex items-center gap-2 cursor-pointer select-none\",\n disabled && \"opacity-50 cursor-not-allowed\",\n className,\n )}\n >\n {/* Hidden native input */}\n <input\n ref={ref}\n type=\"radio\"\n checked={isControlled ? checked : isChecked}\n disabled={disabled}\n onChange={handleChange}\n className=\"sr-only\"\n {...props}\n />\n\n {/* Visual control */}\n <span\n aria-hidden=\"true\"\n className={cn(\n \"flex h-[18px] w-[18px] shrink-0 items-center justify-center rounded-full\",\n \"border-[2px] bg-transparent transition-colors duration-[120ms]\",\n \"border-[var(--color-secondary,#339FB8)]\",\n )}\n >\n {currentChecked && (\n <span className=\"h-[8px] w-[8px] rounded-full bg-[var(--color-foreground,#000)]\" />\n )}\n </span>\n\n {/* Label + helper */}\n {(label || helperText) && (\n <span className=\"flex flex-col gap-0.5\">\n {label && (\n <span className=\"font-['Red_Hat_Text'] text-[14px] font-normal leading-tight text-[var(--color-text-primary,#000)]\">\n {label}\n </span>\n )}\n {helperText && (\n <span className=\"font-['Inter'] text-[12px] text-[var(--color-text-tertiary,#6B7280)]\">\n {helperText}\n </span>\n )}\n </span>\n )}\n </label>\n )\n },\n)\nRadio.displayName = \"Radio\"\n\n/**\n * RadioGroup — convenience wrapper for a labelled set of Radio options.\n *\n * Usage:\n * <RadioGroup label=\"Time period\" name=\"period\" value={val} onChange={setVal}>\n * <Radio value=\"day\" label=\"Day\" />\n * <Radio value=\"week\" label=\"Week\" />\n * <Radio value=\"month\" label=\"Month\" />\n * </RadioGroup>\n */\nexport interface RadioGroupProps {\n label?: string\n name: string\n value?: string\n onChange?: (value: string) => void\n children: React.ReactNode\n className?: string\n orientation?: \"horizontal\" | \"vertical\"\n}\n\nexport function RadioGroup({\n label,\n name,\n value,\n onChange,\n children,\n className,\n orientation = \"vertical\",\n}: RadioGroupProps) {\n const cloned = React.Children.map(children, (child) => {\n if (!React.isValidElement(child)) return child\n const el = child as React.ReactElement<RadioProps>\n return React.cloneElement(el, {\n name,\n checked: value !== undefined ? el.props.value === value : undefined,\n onChange: (e: React.ChangeEvent<HTMLInputElement>) => {\n if (e.target.checked) onChange?.(e.target.value as string)\n el.props.onChange?.(e)\n },\n })\n })\n\n return (\n <fieldset className={cn(\"border-none p-0 m-0\", className)}>\n {label && (\n <legend className=\"mb-2 font-['Red_Hat_Text'] text-[18px] font-medium text-[var(--color-text-primary,#000)]\">\n {label}\n </legend>\n )}\n <div className={cn(\"flex gap-3\", orientation === \"vertical\" ? \"flex-col\" : \"flex-row flex-wrap\")}>\n {cloned}\n </div>\n </fieldset>\n )\n}\n","import * as React from \"react\"\nimport { cn } from \"./utils\"\n\n/**\n * Toggle — iOS-style switch. Qu Notify form control.\n *\n * States: off | on | disabled-off | disabled-on\n * - Off: gray-100 (#DEDEDE) track, white knob positioned left\n * - On: cyan (#40CCF2) track, white knob positioned right\n * - Disabled: opacity 0.5 on full component\n *\n * Track: 44×24px, full-radius pill\n * Knob: 20×20px white circle, 2px from edge, animates on toggle\n *\n * Usage:\n * <Toggle label=\"Enable notifications\" />\n * <Toggle checked label=\"Push alerts\" />\n * <Toggle disabled label=\"Feature unavailable\" />\n *\n * Controlled:\n * <Toggle checked={enabled} onChange={(v) => setEnabled(v)} label=\"Face ID\" />\n */\n\nexport interface ToggleProps {\n checked?: boolean\n defaultChecked?: boolean\n disabled?: boolean\n label?: string\n /** Label position relative to the toggle */\n labelPosition?: \"right\" | \"left\"\n helperText?: string\n onChange?: (checked: boolean) => void\n className?: string\n id?: string\n}\n\nexport const Toggle = React.forwardRef<HTMLButtonElement, ToggleProps>(\n (\n {\n checked,\n defaultChecked = false,\n disabled = false,\n label,\n labelPosition = \"right\",\n helperText,\n onChange,\n className,\n id: idProp,\n },\n ref,\n ) => {\n const generatedId = React.useId()\n const id = idProp ?? generatedId\n\n const [isOn, setIsOn] = React.useState(defaultChecked)\n const isControlled = checked !== undefined\n const currentOn = isControlled ? !!checked : isOn\n\n const handleClick = () => {\n if (disabled) return\n const next = !currentOn\n if (!isControlled) setIsOn(next)\n onChange?.(next)\n }\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLButtonElement>) => {\n if (e.key === \" \" || e.key === \"Enter\") {\n e.preventDefault()\n handleClick()\n }\n }\n\n const track = (\n <button\n ref={ref}\n id={id}\n role=\"switch\"\n type=\"button\"\n aria-checked={currentOn}\n disabled={disabled}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n className={cn(\n // track\n \"relative inline-flex h-[19px] w-[45px] shrink-0 cursor-pointer rounded-full\",\n \"border-0 outline-none transition-colors duration-[180ms] ease-[cubic-bezier(0.2,0,0,1)]\",\n \"focus-visible:ring-2 focus-visible:ring-[var(--color-secondary,#339FB8)] focus-visible:ring-offset-2\",\n \"disabled:cursor-not-allowed\",\n currentOn\n ? \"bg-[var(--color-secondary,#339FB8)]\"\n : \"bg-[var(--color-inactive,#DEDEDE)]\",\n )}\n >\n {/* Knob */}\n <span\n aria-hidden=\"true\"\n className={cn(\n \"absolute top-[2px] h-[15px] w-[24px] rounded-full bg-white shadow-sm\",\n \"transition-transform duration-[180ms] ease-[cubic-bezier(0.2,0,0,1)]\",\n currentOn ? \"translate-x-[19px]\" : \"translate-x-[2px]\",\n )}\n />\n </button>\n )\n\n if (!label && !helperText) {\n return <span className={cn(disabled && \"opacity-50\", className)}>{track}</span>\n }\n\n const labelContent = (\n <label\n htmlFor={id}\n className={cn(\n \"flex flex-col gap-0.5 cursor-pointer\",\n disabled && \"cursor-not-allowed\",\n )}\n >\n <span className=\"font-['Red_Hat_Text'] text-[14px] font-normal leading-tight text-[var(--color-text-primary,#000)]\">\n {label}\n </span>\n {helperText && (\n <span className=\"font-['Inter'] text-[12px] text-[var(--color-text-tertiary,#6B7280)]\">\n {helperText}\n </span>\n )}\n </label>\n )\n\n return (\n <div\n className={cn(\n \"inline-flex items-center gap-2.5\",\n disabled && \"opacity-50\",\n className,\n )}\n >\n {labelPosition === \"left\" && labelContent}\n {track}\n {labelPosition === \"right\" && labelContent}\n </div>\n )\n },\n)\nToggle.displayName = \"Toggle\"\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"./utils\"\n\n/**\n * Selector — pill-shaped dropdown trigger. Qu Notify filter/store-picker control.\n *\n * Variants:\n * variant: primary | secondary\n * state: active | inactive | disabled\n *\n * Primary Active: cyan (#40CCF2) fill, black text\n * Primary Inactive: gray-100 fill, primary text\n * Secondary Active: teal outline, teal text\n * Secondary Inactive: gray-200 outline, secondary text\n *\n * The component is a styled button — wire up a Popover/DropdownMenu to it externally.\n * The `open` prop controls the chevron rotation only.\n *\n * Usage:\n * <Selector label=\"All Stores\" />\n * <Selector label=\"This Week\" variant=\"secondary\" state=\"active\" />\n * <Selector label=\"Location\" open />\n * <Selector label=\"Date Range\" state=\"disabled\" />\n */\n\nconst selectorVariants = cva(\n [\n \"inline-flex items-center gap-1.5 rounded-xl select-none cursor-pointer\",\n \"py-2 pl-3.5 pr-2.5\",\n \"font-['Red_Hat_Text'] text-[14px] font-medium leading-tight\",\n \"border-[1.5px] transition-colors duration-[120ms]\",\n \"outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-ring,#40CCF2)] focus-visible:ring-offset-1\",\n \"disabled:pointer-events-none disabled:opacity-50\",\n ],\n {\n variants: {\n variant: {\n primary: \"\",\n secondary: \"\",\n },\n state: {\n active: \"\",\n inactive: \"\",\n disabled: \"\",\n },\n },\n compoundVariants: [\n // Primary\n {\n variant: \"primary\",\n state: \"active\",\n class: \"bg-[var(--color-primary,#40CCF2)] border-transparent text-[var(--color-text-primary,#000)]\",\n },\n {\n variant: \"primary\",\n state: [\"inactive\", \"disabled\"],\n class: \"bg-[var(--color-inactive,#DEDEDE)] border-transparent text-[var(--color-text-primary,#000)]\",\n },\n // Secondary\n {\n variant: \"secondary\",\n state: \"active\",\n class: \"bg-transparent border-[var(--color-secondary-border,#339FB8)] text-[var(--color-secondary-foreground,#339FB8)]\",\n },\n {\n variant: \"secondary\",\n state: [\"inactive\", \"disabled\"],\n class: \"bg-transparent border-[var(--color-border,#C9C9C9)] text-[var(--color-text-secondary,#6B7280)]\",\n },\n ],\n defaultVariants: {\n variant: \"primary\",\n state: \"active\",\n },\n },\n)\n\nexport interface SelectorProps\n extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, \"children\">,\n VariantProps<typeof selectorVariants> {\n label: string\n /** Controlled open state — rotates chevron 180° */\n open?: boolean\n /** Icon to show before the label (optional) */\n icon?: React.ReactNode\n}\n\nexport const Selector = React.forwardRef<HTMLButtonElement, SelectorProps>(\n ({ label, variant = \"primary\", state = \"active\", open = false, icon, className, disabled, ...props }, ref) => {\n const isDisabled = disabled || state === \"disabled\"\n\n return (\n <button\n ref={ref}\n type=\"button\"\n disabled={isDisabled}\n aria-expanded={open}\n aria-haspopup=\"listbox\"\n className={cn(selectorVariants({ variant, state: isDisabled ? \"disabled\" : state }), className)}\n {...props}\n >\n {icon && <span className=\"shrink-0 [&_svg]:size-4\">{icon}</span>}\n <span>{label}</span>\n <ChevronDownIcon\n className={cn(\n \"shrink-0 transition-transform duration-[120ms]\",\n open && \"rotate-180\",\n )}\n />\n </button>\n )\n },\n)\nSelector.displayName = \"Selector\"\n\n// ── Selector Group — renders a horizontal row of Selectors ───────────────────\nexport interface SelectorGroupProps {\n children: React.ReactNode\n className?: string\n}\nexport function SelectorGroup({ children, className }: SelectorGroupProps) {\n return (\n <div className={cn(\"flex flex-wrap items-center gap-2\", className)}>\n {children}\n </div>\n )\n}\n\n// ── icon ─────────────────────────────────────────────────────────────────────\nfunction ChevronDownIcon({ className }: { className?: string }) {\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <polyline points=\"2,4 6,8 10,4\" />\n </svg>\n )\n}\n","import * as React from \"react\"\nimport { cn } from \"./utils\"\n\n/**\n * TabBar — Qu Notify top-level tab selector (L1).\n *\n * Visual spec:\n * Layout: standalone pills sitting in a row with gaps (no outer container).\n * Selected tab: black fill, white text, full-radius pill.\n * Unselected tab: gray-100 fill, primary text, full-radius pill.\n * Font: Inter Medium 14px.\n *\n * Differs from Switcher: TabBar is for primary page-level navigation where\n * each tab reads as its own standalone affordance. Switcher is for inline\n * filters where the segments share an outer track.\n *\n * Usage (uncontrolled):\n * <TabBar tabs={[\"Sales\", \"Labor\", \"Store\"]} defaultValue=\"Sales\" />\n *\n * Usage (controlled):\n * <TabBar\n * tabs={[\"Sales\", \"Labor\", \"Store\", \"Product\"]}\n * value={activeTab}\n * onValueChange={setActiveTab}\n * />\n *\n * Usage with content panels:\n * <TabBar tabs={tabs} value={active} onValueChange={setActive} />\n * {active === \"Sales\" && <SalesPanel />}\n */\n\nexport interface TabBarProps {\n tabs: string[]\n value?: string\n defaultValue?: string\n onValueChange?: (value: string) => void\n className?: string\n /** Make all tabs equal width (fills container) */\n stretch?: boolean\n}\n\nexport function TabBar({\n tabs,\n value,\n defaultValue,\n onValueChange,\n className,\n stretch = false,\n}: TabBarProps) {\n const [selected, setSelected] = React.useState(defaultValue ?? tabs[0])\n const isControlled = value !== undefined\n const current = isControlled ? value : selected\n\n const handleSelect = (tab: string) => {\n if (!isControlled) setSelected(tab)\n onValueChange?.(tab)\n }\n\n return (\n <div\n role=\"tablist\"\n aria-label=\"Tabs\"\n className={cn(\n \"inline-flex items-center gap-2\",\n stretch && \"w-full\",\n className,\n )}\n >\n {tabs.map((tab) => {\n const isSelected = tab === current\n return (\n <button\n key={tab}\n role=\"tab\"\n type=\"button\"\n aria-selected={isSelected}\n onClick={() => handleSelect(tab)}\n className={cn(\n \"rounded-full px-4 py-[7px] cursor-pointer select-none\",\n \"font-['Inter'] text-[14px] font-medium leading-tight\",\n \"outline-none transition-colors duration-[120ms]\",\n \"focus-visible:ring-2 focus-visible:ring-[var(--color-ring,#40CCF2)] focus-visible:ring-offset-1\",\n stretch && \"flex-1 text-center\",\n isSelected\n ? \"bg-[var(--color-foreground,#000)] text-white\"\n : \"bg-[var(--color-inactive,#DEDEDE)] text-[var(--color-text-primary,#000)] hover:brightness-95\",\n )}\n >\n {tab}\n </button>\n )\n })}\n </div>\n )\n}\n\n/**\n * TabPanels — optional declarative panel companion for TabBar.\n *\n * Usage:\n * <TabBar tabs={[\"Sales\",\"Labor\"]} value={tab} onValueChange={setTab} />\n * <TabPanels value={tab}>\n * <TabPanel value=\"Sales\"><SalesContent /></TabPanel>\n * <TabPanel value=\"Labor\"><LaborContent /></TabPanel>\n * </TabPanels>\n */\nexport interface TabPanelsProps {\n value: string\n children: React.ReactNode\n className?: string\n}\nexport function TabPanels({ value, children, className }: TabPanelsProps) {\n return (\n <div className={className}>\n {React.Children.map(children, (child) => {\n if (!React.isValidElement(child)) return null\n const el = child as React.ReactElement<TabPanelProps>\n return el.props.value === value ? el : null\n })}\n </div>\n )\n}\n\nexport interface TabPanelProps {\n value: string\n children: React.ReactNode\n className?: string\n}\nexport function TabPanel({ children, className }: TabPanelProps) {\n return <div role=\"tabpanel\" className={className}>{children}</div>\n}\n","import * as React from \"react\"\nimport { cn } from \"./utils\"\n\n/**\n * Switcher — Qu Notify segmented control (L2 — inline data filter).\n *\n * Visual spec:\n * Container: gray-100 (#DEDEDE) bg, full-radius pill, 3px padding\n * Selected segment: black fill, white text, full-radius pill\n * Unselected segment: transparent, primary text (black)\n * Font: Inter Medium 14px\n *\n * Differs from TabBar:\n * - TabBar: standalone pill tabs, no outer container — primary page navigation\n * - Switcher: outer pill container holding inner pill segments — inline\n * data filters (e.g. Day / Week / Month, Net / Gross, All / Open / Closed)\n *\n * Usage (uncontrolled):\n * <Switcher segments={[\"Day\", \"Week\", \"Month\"]} defaultValue=\"Week\" />\n *\n * Usage (controlled):\n * <Switcher\n * segments={[\"Net\", \"Gross\"]}\n * value={metric}\n * onValueChange={setMetric}\n * />\n *\n * Usage with icon segments:\n * <Switcher\n * segments={[\n * { value: \"list\", label: \"List\", icon: <ListIcon /> },\n * { value: \"grid\", label: \"Grid\", icon: <GridIcon /> },\n * ]}\n * value={view}\n * onValueChange={setView}\n * />\n */\n\ntype Segment = string | { value: string; label: string; icon?: React.ReactNode }\n\nfunction segmentValue(s: Segment): string {\n return typeof s === \"string\" ? s : s.value\n}\nfunction segmentLabel(s: Segment): string {\n return typeof s === \"string\" ? s : s.label\n}\nfunction segmentIcon(s: Segment): React.ReactNode | undefined {\n return typeof s === \"string\" ? undefined : s.icon\n}\n\nexport interface SwitcherProps {\n segments: Segment[]\n value?: string\n defaultValue?: string\n onValueChange?: (value: string) => void\n className?: string\n /** Stretch to fill container width */\n stretch?: boolean\n}\n\nexport function Switcher({\n segments,\n value,\n defaultValue,\n onValueChange,\n className,\n stretch = false,\n}: SwitcherProps) {\n const [selected, setSelected] = React.useState(\n defaultValue ?? segmentValue(segments[0]),\n )\n const isControlled = value !== undefined\n const current = isControlled ? value : selected\n\n const handleSelect = (val: string) => {\n if (!isControlled) setSelected(val)\n onValueChange?.(val)\n }\n\n return (\n <div\n role=\"group\"\n className={cn(\n \"inline-flex items-center gap-0.5 rounded-full p-[3px]\",\n \"bg-[var(--color-inactive,#DEDEDE)]\",\n stretch && \"w-full\",\n className,\n )}\n >\n {segments.map((seg) => {\n const val = segmentValue(seg)\n const label = segmentLabel(seg)\n const icon = segmentIcon(seg)\n const isSelected = val === current\n\n return (\n <button\n key={val}\n type=\"button\"\n role=\"radio\"\n aria-checked={isSelected}\n onClick={() => handleSelect(val)}\n className={cn(\n \"inline-flex items-center justify-center gap-1.5 rounded-full\",\n \"px-4 py-[7px] cursor-pointer select-none\",\n \"font-['Inter'] text-[14px] font-medium leading-tight\",\n \"outline-none transition-colors duration-[120ms]\",\n \"focus-visible:ring-2 focus-visible:ring-[var(--color-ring,#40CCF2)] focus-visible:ring-offset-1\",\n stretch && \"flex-1\",\n isSelected\n ? \"bg-[var(--color-foreground,#000)] text-white\"\n : \"bg-transparent text-[var(--color-text-primary,#000)] hover:bg-black/5\",\n )}\n >\n {icon && <span className=\"shrink-0 [&_svg]:size-[14px]\">{icon}</span>}\n {label}\n </button>\n )\n })}\n </div>\n )\n}\n","import * as React from \"react\"\nimport { cn } from \"./utils\"\n\n/**\n * BottomNav — Qu Notify floating bottom navigation bar.\n *\n * Visual spec:\n * Container: glass gradient pill (180deg, rgba(220,220,220,0.2) → rgba(118,118,118,0.2))\n * box-shadow: 0 4px 4px rgba(0,0,0,0.14)\n * border-radius: 60px\n * max-width: 360px, height: 72px\n * Selected item: black fill pill, white icon + label (Semi Bold)\n * Unselected item: transparent, gray icon + label (Regular)\n * Font: Inter — label 10px\n * Icon: 20×20px\n *\n * Usage (controlled — you manage routing):\n * const [active, setActive] = useState(\"dashboard\")\n *\n * <BottomNav\n * items={[\n * { value: \"dashboard\", label: \"Dashboard\", icon: <DashboardIcon /> },\n * { value: \"inventory\", label: \"Inventory\", icon: <BoxIcon /> },\n * { value: \"menu\", label: \"Menu\", icon: <MenuIcon /> },\n * ]}\n * value={active}\n * onValueChange={setActive}\n * />\n *\n * Usage with React Router / Next.js:\n * <BottomNav\n * items={navItems}\n * value={pathname}\n * onValueChange={(v) => router.push(v)}\n * />\n *\n * Positioning:\n * Wrap in a <div className=\"fixed bottom-6 left-1/2 -translate-x-1/2 w-full max-w-sm px-4 z-50\">\n * for the standard bottom-floating placement used in the app.\n */\n\nexport interface NavItem {\n value: string\n label: string\n icon: React.ReactNode\n /** Notification indicator */\n badge?: boolean | number\n}\n\nexport interface BottomNavProps {\n items: NavItem[]\n value?: string\n defaultValue?: string\n onValueChange?: (value: string) => void\n className?: string\n}\n\nexport function BottomNav({\n items,\n value,\n defaultValue,\n onValueChange,\n className,\n}: BottomNavProps) {\n const [selected, setSelected] = React.useState(\n defaultValue ?? items[0]?.value,\n )\n const isControlled = value !== undefined\n const current = isControlled ? value : selected\n\n const handleSelect = (val: string) => {\n if (!isControlled) setSelected(val)\n onValueChange?.(val)\n }\n\n return (\n <nav\n aria-label=\"Main navigation\"\n className={cn(\n // Glass pill container\n \"flex items-center justify-between\",\n \"w-full max-w-[360px] h-[72px] rounded-[60px]\",\n \"px-3 py-2\",\n // Glass gradient\n \"bg-gradient-to-b from-[rgba(220,220,220,0.20)] to-[rgba(118,118,118,0.20)]\",\n \"backdrop-blur-md\",\n // Shadow\n \"shadow-[0_4px_4px_rgba(0,0,0,0.14)]\",\n className,\n )}\n >\n {items.map((item) => {\n const isSelected = item.value === current\n return (\n <NavItemButton\n key={item.value}\n item={item}\n isSelected={isSelected}\n onClick={() => handleSelect(item.value)}\n />\n )\n })}\n </nav>\n )\n}\n\n// ── Internal nav item ─────────────────────────────────────────────────────────\ninterface NavItemButtonProps {\n item: NavItem\n isSelected: boolean\n onClick: () => void\n}\n\nfunction NavItemButton({ item, isSelected, onClick }: NavItemButtonProps) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n aria-current={isSelected ? \"page\" : undefined}\n className={cn(\n \"relative inline-flex flex-col items-center justify-center gap-[3px]\",\n \"rounded-full py-2 px-4 cursor-pointer select-none\",\n \"outline-none transition-colors duration-[120ms]\",\n \"focus-visible:ring-2 focus-visible:ring-[var(--color-ring,#40CCF2)] focus-visible:ring-offset-1\",\n isSelected\n ? \"bg-[var(--color-foreground,#000)] text-white\"\n : \"bg-transparent text-[var(--color-muted-foreground,#6B7280)]\",\n )}\n >\n {/* Badge dot */}\n {item.badge && (\n <span\n aria-label={typeof item.badge === \"number\" ? `${item.badge} notifications` : \"New notification\"}\n className={cn(\n \"absolute right-2 top-2 flex items-center justify-center\",\n \"rounded-full bg-[var(--color-destructive,#EF2149)] text-white\",\n typeof item.badge === \"number\"\n ? \"h-4 min-w-4 px-1 font-['Inter'] text-[10px] font-semibold\"\n : \"h-2 w-2\",\n )}\n >\n {typeof item.badge === \"number\" ? item.badge : null}\n </span>\n )}\n\n {/* Icon */}\n <span className=\"[&_svg]:size-5\" aria-hidden=\"true\">\n {item.icon}\n </span>\n\n {/* Label */}\n <span\n className={cn(\n \"font-['Inter'] text-[10px] leading-tight\",\n isSelected ? \"font-semibold\" : \"font-normal\",\n )}\n >\n {item.label}\n </span>\n </button>\n )\n}\n\n// ── Positioning wrapper — use as-is for the standard app layout ───────────────\nexport function BottomNavContainer({ children }: { children: React.ReactNode }) {\n return (\n <div className=\"fixed bottom-6 left-1/2 z-50 flex w-full max-w-[402px] -translate-x-1/2 items-center justify-center px-4\">\n {children}\n </div>\n )\n}\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"./utils\"\n\n/**\n * Badge — Qu Notify status/trend pill label.\n *\n * Variants:\n * variant: default | success | error | warning | alert | info | neutral\n * size: sm | md\n *\n * Usage:\n * <Badge>Open</Badge>\n * <Badge variant=\"success\">+11.8%</Badge>\n * <Badge variant=\"error\">-5.6%</Badge>\n * <Badge variant=\"warning\">Delayed</Badge>\n * <Badge icon={<TrendUpIcon />} variant=\"success\">Net Sales</Badge>\n */\n\nconst badgeVariants = cva(\n [\n \"inline-flex items-center gap-1 rounded-full font-['Inter'] font-medium whitespace-nowrap\",\n \"select-none leading-tight\",\n ],\n {\n variants: {\n variant: {\n default: \"bg-[var(--color-inactive,#DEDEDE)] text-[var(--color-text-primary,#000)]\",\n success: \"bg-[var(--color-success-soft,#B3F5D1)] text-[var(--color-success,#16A34A)]\",\n error: \"bg-[var(--color-error-soft,#FFC9C9)] text-[var(--color-destructive,#EF2149)]\",\n warning: \"bg-[var(--color-warning-soft,#FFF085)] text-[#92680E]\",\n alert: \"bg-[var(--color-alert-soft,#EAC1C3)] text-[var(--color-alert,#FA6A0A)]\",\n info: \"bg-[var(--color-info-soft,#BEDBFF)] text-[var(--color-info,#2F80ED)]\",\n neutral: \"bg-transparent text-[var(--color-text-secondary,#6B7280)] border border-[var(--color-border,#C9C9C9)]\",\n // Brand accent fills — used for status tags in Kitchen Intelligence\n brand: \"bg-[var(--color-primary,#40CCF2)] text-[var(--color-text-primary,#000)]\",\n },\n size: {\n sm: \"h-5 px-2 text-[11px]\",\n md: \"h-6 px-2.5 text-[12px]\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"md\",\n },\n },\n)\n\nexport interface BadgeProps\n extends React.HTMLAttributes<HTMLSpanElement>,\n VariantProps<typeof badgeVariants> {\n icon?: React.ReactNode\n}\n\nexport function Badge({ variant, size, icon, children, className, ...props }: BadgeProps) {\n return (\n <span className={cn(badgeVariants({ variant, size }), className)} {...props}>\n {icon && <span className=\"shrink-0 [&_svg]:size-3\" aria-hidden=\"true\">{icon}</span>}\n {children}\n </span>\n )\n}\n\n/**\n * TrendBadge — inline trend indicator. Bare colored text + arrow, no pill bg.\n *\n * Used inside MetricTile and anywhere a percent delta needs to appear next to\n * a primary value. The bare style keeps the trend visually subordinate to the\n * value above it (the headline number is the hero; the trend is supporting\n * commentary). For a pill-shaped status label, use <Badge> directly.\n *\n * Usage:\n * <TrendBadge value={11.8} /> → green \"↗ +11.8%\"\n * <TrendBadge value={-5.6} /> → red \"↘ −5.6%\"\n * <TrendBadge value={0} /> → neutral \"0.0%\"\n */\nexport interface TrendBadgeProps extends React.HTMLAttributes<HTMLSpanElement> {\n value: number\n /** Number of decimal places (default: 1) */\n decimals?: number\n /** Show arrow icon (default: true) */\n showArrow?: boolean\n}\n\nexport function TrendBadge({ value, decimals = 1, showArrow = true, className, ...props }: TrendBadgeProps) {\n const colorClass =\n value > 0 ? \"text-[var(--color-success,#16A34A)]\" :\n value < 0 ? \"text-[var(--color-destructive,#EF2149)]\" :\n \"text-[var(--color-text-tertiary,#6B7280)]\"\n\n const formatted = `${value > 0 ? \"+\" : \"\"}${value.toFixed(decimals)}%`\n\n const arrow = showArrow ? (\n value > 0 ? <ArrowUpIcon /> :\n value < 0 ? <ArrowDownIcon /> :\n null\n ) : null\n\n return (\n <span\n className={cn(\n \"inline-flex items-center gap-1 whitespace-nowrap select-none\",\n \"font-['Inter'] text-[12px] font-medium leading-tight\",\n \"[&_svg]:size-3\",\n colorClass,\n className,\n )}\n {...props}\n >\n {arrow}\n {formatted}\n </span>\n )\n}\n\n// ── icons ─────────────────────────────────────────────────────────────────────\nfunction ArrowUpIcon() {\n return (\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"2,7 5,3 8,7\" />\n </svg>\n )\n}\nfunction ArrowDownIcon() {\n return (\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"2,3 5,7 8,3\" />\n </svg>\n )\n}\n","import * as React from \"react\"\nimport { cn } from \"./utils\"\nimport { TrendBadge } from \"./badge\"\n\n/**\n * MetricTile — the core data display unit of the Qu Notify dashboard.\n *\n * Visual spec:\n * Container: white card, 16px border-radius, shadow: 0 4px 4px rgba(0,0,0,0.06)\n * Label: Inter Regular 12px, gray (#6B7280)\n * Value: Inter SemiBold 24px, black (#000)\n * Trend: TrendBadge (green/red/neutral)\n * Sub-label: Inter Regular 12px, gray — secondary context (e.g. \"vs last week\")\n *\n * Variants:\n * size: sm | md | lg\n * loading: skeleton state\n *\n * Usage (minimal):\n * <MetricTile label=\"Net Sales\" value=\"$42,810\" />\n *\n * Usage (with trend):\n * <MetricTile label=\"Average Check\" value=\"$18.42\" trend={11.8} trendLabel=\"vs last week\" />\n *\n * Usage (with icon and custom value color):\n * <MetricTile\n * label=\"Labor %\"\n * value=\"24.1%\"\n * trend={-2.3}\n * icon={<UserIcon />}\n * valueColor=\"var(--color-success,#16A34A)\"\n * />\n *\n * Usage (loading):\n * <MetricTile label=\"Net Sales\" value=\"...\" loading />\n *\n * Usage (grid):\n * <MetricTileGrid cols={2}>\n * <MetricTile label=\"Net Sales\" value=\"$42,810\" trend={11.8} />\n * <MetricTile label=\"Avg Check\" value=\"$18.42\" trend={-1.2} />\n * <MetricTile label=\"Checks\" value=\"2,324\" />\n * <MetricTile label=\"Speed of Svc\" value=\"3m 12s\" />\n * </MetricTileGrid>\n */\n\nexport interface MetricTileProps {\n label: string\n value: string | number\n /** Percentage change. Positive = green, negative = red. */\n trend?: number\n trendLabel?: string\n icon?: React.ReactNode\n /** Override the value text color (e.g. for KPI goal states) */\n valueColor?: string\n size?: \"sm\" | \"md\" | \"lg\"\n loading?: boolean\n /** Click handler — makes the tile interactive */\n onClick?: () => void\n className?: string\n /** Render as a specific element */\n as?: \"div\" | \"article\"\n}\n\nexport function MetricTile({\n label,\n value,\n trend,\n trendLabel,\n icon,\n valueColor,\n size = \"md\",\n loading = false,\n onClick,\n className,\n as: Tag = \"div\",\n}: MetricTileProps) {\n const valueSize = {\n sm: \"text-[18px]\",\n md: \"text-[24px]\",\n lg: \"text-[30px]\",\n }[size]\n\n const padding = {\n sm: \"p-3\",\n md: \"p-4\",\n lg: \"p-5\",\n }[size]\n\n return (\n <Tag\n onClick={onClick}\n role={onClick ? \"button\" : undefined}\n tabIndex={onClick ? 0 : undefined}\n onKeyDown={onClick ? (e) => { if (e.key === \"Enter\" || e.key === \" \") onClick() } : undefined}\n className={cn(\n // Card shell\n \"flex flex-col gap-1 rounded-[16px] bg-white\",\n \"shadow-[0_4px_4px_rgba(0,0,0,0.06)]\",\n padding,\n // Interactive\n onClick && \"cursor-pointer outline-none hover:shadow-[0_4px_12px_rgba(0,0,0,0.10)] transition-shadow duration-[120ms]\",\n onClick && \"focus-visible:ring-2 focus-visible:ring-[var(--color-ring,#40CCF2)] focus-visible:ring-offset-2\",\n // Loading\n loading && \"animate-pulse\",\n className,\n )}\n >\n {/* Label row */}\n <div className=\"flex items-center justify-between gap-2\">\n <span\n className={cn(\n \"font-['Inter'] text-[12px] font-normal leading-tight\",\n \"text-[var(--color-text-tertiary,#6B7280)]\",\n loading && \"h-3 w-24 rounded bg-gray-200\",\n )}\n >\n {!loading && label}\n </span>\n {!loading && (icon ? (\n <span className=\"shrink-0 text-[var(--color-text-tertiary,#6B7280)] [&_svg]:size-4\" aria-hidden=\"true\">\n {icon}\n </span>\n ) : onClick ? (\n <span className=\"shrink-0 text-[var(--color-text-tertiary,#6B7280)] [&_svg]:size-3.5\" aria-hidden=\"true\">\n <ChevronRightIcon />\n </span>\n ) : null)}\n </div>\n\n {/* Value */}\n <span\n className={cn(\n \"font-['Inter'] font-semibold leading-tight tracking-tight\",\n valueSize,\n loading && \"mt-1 h-7 w-28 rounded bg-gray-200\",\n )}\n style={valueColor && !loading ? { color: valueColor } : undefined}\n >\n {!loading && value}\n </span>\n\n {/* Metadata row — prior-period value first, then trend. Both gray-toned so\n the headline value above stays the hero. */}\n {(trend !== undefined || trendLabel) && !loading && (\n <div className=\"flex items-center gap-1.5\">\n {trendLabel && (\n <span className=\"font-['Inter'] text-[12px] text-[var(--color-text-tertiary,#6B7280)]\">\n {trendLabel}\n </span>\n )}\n {trend !== undefined && <TrendBadge value={trend} />}\n </div>\n )}\n {loading && trend !== undefined && (\n <div className=\"mt-1 h-4 w-16 rounded bg-gray-200\" />\n )}\n </Tag>\n )\n}\n\n/**\n * MetricTileGrid — responsive grid wrapper.\n *\n * Usage:\n * <MetricTileGrid cols={2}> ... </MetricTileGrid>\n */\nexport interface MetricTileGridProps {\n cols?: 1 | 2 | 3 | 4\n children: React.ReactNode\n className?: string\n}\n\nexport function MetricTileGrid({ cols = 2, children, className }: MetricTileGridProps) {\n const colClass = {\n 1: \"grid-cols-1\",\n 2: \"grid-cols-2\",\n 3: \"grid-cols-3\",\n 4: \"grid-cols-4\",\n }[cols]\n\n return (\n <div className={cn(\"grid gap-3\", colClass, className)}>\n {children}\n </div>\n )\n}\n\nfunction ChevronRightIcon() {\n return (\n <svg viewBox=\"0 0 14 14\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <polyline points=\"5,3 9,7 5,11\" />\n </svg>\n )\n}\n"]}
1
+ {"version":3,"sources":["../components/utils.ts","../components/button.tsx","../components/input.tsx","../components/checkbox.tsx","../components/radio.tsx","../components/toggle.tsx","../components/selector.tsx","../components/tabs.tsx","../components/switcher.tsx","../components/bottom-nav.tsx","../components/badge.tsx","../components/metric-tile.tsx"],"names":["React","cva","React2","jsx","React3","jsxs","React5","React6","React7","React8","React9"],"mappings":"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","file":"index.mjs","sourcesContent":["import { clsx, type ClassValue } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"./utils\"\n\n/**\n * Button — shadcn-style primitive backed by the semantic tokens in tokens.css.\n *\n * Matrix:\n * variant: primary | secondary | tertiary | link\n * size: xsm | sm | md | lg\n * state: active (default) | inactive | disabled — driven by `data-state` + `disabled`\n *\n * Use `<Button iconOnly />` (or `<IconButton />` below) to render the icon-only square form.\n */\nconst buttonVariants = cva(\n [\n // base\n \"inline-flex items-center justify-center whitespace-nowrap select-none\",\n \"rounded-[var(--button-radius)] font-medium font-[var(--font-family-secondary)]\", // Red Hat Text Medium per spec\n \"transition-colors duration-[var(--p-duration-fast)] ease-[var(--p-easing-standard)]\",\n \"outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-ring)] focus-visible:ring-offset-2\",\n \"disabled:pointer-events-none disabled:opacity-[var(--p-opacity-disabled)]\",\n // icon child sizing\n \"[&_svg]:shrink-0\",\n ],\n {\n variants: {\n variant: {\n primary: [\n \"bg-[var(--color-primary)] text-[var(--color-primary-foreground)]\",\n \"hover:bg-[var(--color-primary-hover)] active:bg-[var(--color-primary-pressed)]\",\n \"data-[state=inactive]:bg-[var(--color-inactive)] data-[state=inactive]:text-[var(--color-inactive-foreground)]\",\n ],\n secondary: [\n \"bg-transparent text-[var(--color-secondary-foreground)]\",\n \"border border-[var(--color-secondary-border)]\",\n \"hover:bg-[var(--color-secondary-hover)] active:bg-[var(--color-secondary-pressed)]\",\n \"data-[state=inactive]:text-[var(--color-inactive-foreground)] data-[state=inactive]:border-[var(--color-inactive-border)]\",\n ],\n tertiary: [\n \"bg-transparent text-[var(--color-tertiary-foreground)]\",\n \"hover:bg-[var(--color-tertiary-hover)]\",\n \"data-[state=inactive]:text-[var(--color-inactive-foreground)]\",\n ],\n link: [\n \"bg-transparent text-[var(--color-link-foreground)] underline underline-offset-4\",\n \"hover:decoration-2\",\n \"data-[state=inactive]:text-[var(--color-inactive-foreground)]\",\n ],\n },\n size: {\n xsm: \"h-[var(--button-xsm-h)] px-[var(--button-xsm-px)] gap-[var(--button-xsm-gap)] text-[length:var(--button-xsm-fs)] leading-[var(--button-xsm-lh)] [&_svg]:size-3\",\n sm: \"h-[var(--button-sm-h)] px-[var(--button-sm-px)] gap-[var(--button-sm-gap)] text-[length:var(--button-sm-fs)] leading-[var(--button-sm-lh)] [&_svg]:size-[14px]\",\n md: \"h-[var(--button-md-h)] px-[var(--button-md-px)] gap-[var(--button-md-gap)] text-[length:var(--button-md-fs)] leading-[var(--button-md-lh)] [&_svg]:size-4\",\n lg: \"h-[var(--button-lg-h)] px-[var(--button-lg-px)] gap-[var(--button-lg-gap)] text-[length:var(--button-lg-fs)] leading-[var(--button-lg-lh)] [&_svg]:size-5\",\n },\n iconOnly: {\n true: \"px-0 aspect-square rounded-[var(--button-icon-radius)]\",\n false: \"\",\n },\n },\n compoundVariants: [\n // Link variant has no horizontal padding — it's text-like.\n { variant: \"link\", iconOnly: false, class: \"px-0 h-auto\" },\n // Tertiary should hug its text vertically.\n { variant: \"tertiary\", iconOnly: false, class: \"\" },\n ],\n defaultVariants: {\n variant: \"primary\",\n size: \"md\",\n iconOnly: false,\n },\n },\n)\n\ntype ButtonState = \"active\" | \"inactive\"\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean\n state?: ButtonState\n}\n\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, iconOnly, state = \"active\", asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\"\n return (\n <Comp\n ref={ref}\n data-state={state}\n className={cn(buttonVariants({ variant, size, iconOnly }), className)}\n {...props}\n />\n )\n },\n)\nButton.displayName = \"Button\"\n\nexport const IconButton = React.forwardRef<HTMLButtonElement, Omit<ButtonProps, \"iconOnly\">>(\n (props, ref) => <Button ref={ref} iconOnly {...props} />,\n)\nIconButton.displayName = \"IconButton\"\n\nexport { buttonVariants }\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"./utils\"\nimport { Search, View, Hide, XCircle, Info } from \"./icons\"\n\n/**\n * Input — pill-shaped form field matching the Qu Notify Input component set.\n *\n * Matrix:\n * type: default | password | search\n * state: normal | active | filled | error | disabled | readonly\n *\n * Anatomy (top → bottom):\n * <label> — Red Hat Text Medium 18px, required asterisk in brand-red\n * <pill> — full-radius container, white bg, 1.5px stroke\n * [left-icon] — search icon (search type only)\n * <input> — Inter Regular 16px placeholder / filled text\n * [right-icon] — eye/eye-off toggle (password), x-circle clear (search filled), info (error)\n * <helper> — Inter Regular 12px, gray or red\n *\n * Usage:\n * <InputField label=\"Email\" placeholder=\"you@example.com\" />\n * <InputField type=\"password\" label=\"Password\" required />\n * <InputField type=\"search\" placeholder=\"Search checks...\" />\n * <InputField state=\"error\" errorMessage=\"Invalid email address\" />\n */\n\n// ── pill shell ──────────────────────────────────────────────────────────────\nconst pillVariants = cva(\n [\n \"flex items-center gap-2\",\n \"h-12 w-full rounded-full px-4\",\n \"border-[1.5px] bg-[var(--color-input-bg,#fff)]\",\n \"transition-colors duration-[120ms]\",\n ],\n {\n variants: {\n state: {\n normal: \"border-[var(--color-input-border-default,#C9C9C9)]\",\n active: \"border-[var(--color-input-border-active,#40CCF2)] ring-0\",\n filled: \"border-[var(--color-input-border-default,#C9C9C9)]\",\n error: \"border-[var(--color-input-border-error,#EF2149)]\",\n disabled: \"border-[var(--color-input-border-default,#C9C9C9)] bg-[var(--color-input-bg-disabled,#F4F4F4)] cursor-not-allowed opacity-50\",\n readonly: \"border-[var(--color-input-border-default,#C9C9C9)] bg-[var(--color-input-bg-disabled,#F4F4F4)]\",\n },\n },\n defaultVariants: { state: \"normal\" },\n },\n)\n\ntype InputState = \"normal\" | \"active\" | \"filled\" | \"error\" | \"disabled\" | \"readonly\"\ntype InputType = \"default\" | \"password\" | \"search\"\n\nexport interface InputFieldProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"type\"> {\n /** Visual input type — controls icons and keyboard on mobile */\n type?: InputType\n /** Controlled state override — set automatically on focus/blur if uncontrolled */\n state?: InputState\n label?: string\n /** Whether to show the red required asterisk */\n required?: boolean\n helperText?: string\n errorMessage?: string\n /** Slot for a custom right-side icon/action */\n rightSlot?: React.ReactNode\n}\n\nexport const InputField = React.forwardRef<HTMLInputElement, InputFieldProps>(\n (\n {\n type = \"default\",\n state: stateProp,\n label,\n required,\n helperText,\n errorMessage,\n rightSlot,\n className,\n onFocus,\n onBlur,\n onChange,\n value,\n defaultValue,\n disabled,\n readOnly,\n placeholder,\n ...props\n },\n ref,\n ) => {\n // ── internal state for uncontrolled focus/fill tracking ──\n const [focused, setFocused] = React.useState(false)\n const [hasValue, setHasValue] = React.useState(!!defaultValue || !!value)\n const [showPassword, setShowPassword] = React.useState(false)\n\n // Derive visual state\n const state: InputState =\n stateProp ??\n (disabled ? \"disabled\"\n : readOnly ? \"readonly\"\n : errorMessage ? \"error\"\n : focused ? \"active\"\n : hasValue ? \"filled\"\n : \"normal\")\n\n const nativeType =\n type === \"password\" ? (showPassword ? \"text\" : \"password\") :\n type === \"search\" ? \"search\" :\n \"text\"\n\n const handleFocus = (e: React.FocusEvent<HTMLInputElement>) => {\n setFocused(true)\n onFocus?.(e)\n }\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n setFocused(false)\n onBlur?.(e)\n }\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setHasValue(e.target.value.length > 0)\n onChange?.(e)\n }\n\n // ── icon colors ──────────────────────────────────────────────────────────\n const iconColor =\n state === \"active\" ? \"text-[var(--color-input-icon-active,#40CCF2)]\" :\n state === \"error\" ? \"text-[var(--color-input-icon-error,#EF2149)]\" :\n \"text-[var(--color-input-icon-default,#B1B1B1)]\"\n\n return (\n <div className={cn(\"flex w-full flex-col gap-1.5\", className)}>\n\n {/* Label row */}\n {label && (\n <label className=\"flex items-center gap-0.5 font-['Red_Hat_Text'] text-[18px] font-medium leading-tight text-[var(--color-text-primary,#000)]\">\n {label}\n {required && (\n <span className=\"text-[var(--color-brand-red,#EF2149)]\" aria-hidden=\"true\"> *</span>\n )}\n </label>\n )}\n\n {/* Pill */}\n <div className={pillVariants({ state })}>\n\n {/* Left icon — search only */}\n {type === \"search\" && (\n <span className={cn(\"shrink-0\", iconColor)} aria-hidden=\"true\">\n <Search size={16} />\n </span>\n )}\n\n {/* Native input */}\n <input\n ref={ref}\n type={nativeType}\n disabled={disabled || state === \"disabled\"}\n readOnly={readOnly || state === \"readonly\"}\n placeholder={placeholder}\n value={value}\n defaultValue={defaultValue}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onChange={handleChange}\n className={cn(\n \"min-w-0 flex-1 bg-transparent outline-none\",\n \"font-['Inter'] text-[16px] font-normal\",\n \"text-[var(--color-input-text,#000)] placeholder:text-[var(--color-input-placeholder,#B1B1B1)]\",\n \"disabled:cursor-not-allowed\",\n )}\n aria-invalid={state === \"error\" || undefined}\n {...props}\n />\n\n {/* Right slot — custom override */}\n {rightSlot}\n\n {/* Right icon — contextual */}\n {!rightSlot && type === \"password\" && (\n <button\n type=\"button\"\n tabIndex={-1}\n onClick={() => setShowPassword(v => !v)}\n className={cn(\"shrink-0 cursor-pointer\", iconColor)}\n aria-label={showPassword ? \"Hide password\" : \"Show password\"}\n >\n {showPassword ? <Hide size={16} /> : <View size={16} />}\n </button>\n )}\n {!rightSlot && type === \"search\" && hasValue && !disabled && (\n <button\n type=\"button\"\n tabIndex={-1}\n onClick={() => setHasValue(false)}\n className={cn(\"shrink-0 cursor-pointer\", iconColor)}\n aria-label=\"Clear search\"\n >\n <XCircle size={16} />\n </button>\n )}\n {!rightSlot && state === \"error\" && type !== \"password\" && (\n <span className={cn(\"shrink-0\", iconColor)} aria-hidden=\"true\">\n <Info size={16} />\n </span>\n )}\n </div>\n\n {/* Helper / error text */}\n {(errorMessage || helperText) && (\n <p\n className={cn(\n \"font-['Inter'] text-[12px] font-normal leading-tight px-1\",\n errorMessage\n ? \"text-[var(--color-input-text-error,#EF2149)]\"\n : \"text-[var(--color-text-tertiary,#6B7280)]\",\n )}\n >\n {errorMessage ?? helperText}\n </p>\n )}\n </div>\n )\n },\n)\nInputField.displayName = \"InputField\"\n","import * as React from \"react\"\nimport { cn } from \"./utils\"\nimport { Check, Minus } from \"./icons\"\n\n/**\n * Checkbox — Qu Notify form control.\n *\n * States: unchecked | checked | indeterminate | disabled\n * - Unchecked: transparent fill, 1.5px teal (#339FB8) stroke, 4px radius\n * - Checked: cyan (#40CCF2) fill, white checkmark, no stroke\n * - Indeterminate: cyan fill, white dash, no stroke\n * - Disabled: opacity 0.5 on full component\n *\n * Usage:\n * <Checkbox label=\"Remember me\" />\n * <Checkbox checked label=\"Agreed to terms\" />\n * <Checkbox indeterminate label=\"Select all\" />\n * <Checkbox disabled label=\"Unavailable option\" />\n */\n\nexport interface CheckboxProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"type\"> {\n label?: string\n indeterminate?: boolean\n helperText?: string\n}\n\nexport const Checkbox = React.forwardRef<HTMLInputElement, CheckboxProps>(\n ({ label, indeterminate, helperText, disabled, checked, defaultChecked, className, onChange, ...props }, ref) => {\n const internalRef = React.useRef<HTMLInputElement>(null)\n const resolvedRef = (ref as React.RefObject<HTMLInputElement>) ?? internalRef\n\n const [isChecked, setIsChecked] = React.useState(!!defaultChecked || !!checked)\n const isControlled = checked !== undefined\n const currentChecked = isControlled ? !!checked : isChecked\n\n React.useEffect(() => {\n if (resolvedRef.current) {\n resolvedRef.current.indeterminate = !!indeterminate\n }\n }, [indeterminate, resolvedRef])\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (!isControlled) setIsChecked(e.target.checked)\n onChange?.(e)\n }\n\n const showCheck = !indeterminate && currentChecked\n const showDash = !!indeterminate\n\n return (\n <label\n className={cn(\n \"inline-flex items-center gap-2 cursor-pointer select-none\",\n disabled && \"opacity-50 cursor-not-allowed\",\n className,\n )}\n >\n {/* Hidden native input for a11y / form submission */}\n <input\n ref={resolvedRef}\n type=\"checkbox\"\n checked={isControlled ? checked : isChecked}\n disabled={disabled}\n onChange={handleChange}\n className=\"sr-only\"\n {...props}\n />\n\n {/* Visual control */}\n <span\n aria-hidden=\"true\"\n className={cn(\n \"flex h-[18px] w-[18px] shrink-0 items-center justify-center rounded-[6px]\",\n \"border-[2px] transition-colors duration-[120ms]\",\n (showCheck || showDash)\n ? \"border-transparent bg-[var(--color-secondary,#339FB8)] text-[var(--color-foreground,#000)]\"\n : \"border-[var(--color-secondary,#339FB8)] bg-transparent\",\n )}\n >\n {showCheck && <Check size={12} />}\n {showDash && <Minus size={12} />}\n </span>\n\n {/* Label + helper */}\n {(label || helperText) && (\n <span className=\"flex flex-col gap-0.5\">\n {label && (\n <span className=\"font-['Red_Hat_Text'] text-[14px] font-normal leading-tight text-[var(--color-text-primary,#000)]\">\n {label}\n </span>\n )}\n {helperText && (\n <span className=\"font-['Inter'] text-[12px] text-[var(--color-text-tertiary,#6B7280)]\">\n {helperText}\n </span>\n )}\n </span>\n )}\n </label>\n )\n },\n)\nCheckbox.displayName = \"Checkbox\"\n\n","import * as React from \"react\"\nimport { cn } from \"./utils\"\n\n/**\n * Radio — Qu Notify form control.\n *\n * States: unselected | selected | disabled\n * - Unselected: transparent fill, 1.5px teal (#339FB8) stroke, full radius\n * - Selected: cyan (#40CCF2) fill, white center dot, no stroke\n * - Disabled: opacity 0.5 on full component\n *\n * Usage (uncontrolled, group via same `name`):\n * <Radio name=\"time\" value=\"day\" label=\"Day\" />\n * <Radio name=\"time\" value=\"week\" label=\"Week\" defaultChecked />\n * <Radio name=\"time\" value=\"month\" label=\"Month\" />\n *\n * Usage (controlled):\n * <Radio name=\"x\" value=\"a\" checked={val === \"a\"} onChange={() => setVal(\"a\")} label=\"Option A\" />\n */\n\nexport interface RadioProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"type\"> {\n label?: string\n helperText?: string\n}\n\nexport const Radio = React.forwardRef<HTMLInputElement, RadioProps>(\n ({ label, helperText, disabled, checked, defaultChecked, className, onChange, ...props }, ref) => {\n const [isChecked, setIsChecked] = React.useState(!!defaultChecked)\n const isControlled = checked !== undefined\n const currentChecked = isControlled ? !!checked : isChecked\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (!isControlled) setIsChecked(e.target.checked)\n onChange?.(e)\n }\n\n return (\n <label\n className={cn(\n \"inline-flex items-center gap-2 cursor-pointer select-none\",\n disabled && \"opacity-50 cursor-not-allowed\",\n className,\n )}\n >\n {/* Hidden native input */}\n <input\n ref={ref}\n type=\"radio\"\n checked={isControlled ? checked : isChecked}\n disabled={disabled}\n onChange={handleChange}\n className=\"sr-only\"\n {...props}\n />\n\n {/* Visual control */}\n <span\n aria-hidden=\"true\"\n className={cn(\n \"flex h-[18px] w-[18px] shrink-0 items-center justify-center rounded-full\",\n \"border-[2px] bg-transparent transition-colors duration-[120ms]\",\n \"border-[var(--color-secondary,#339FB8)]\",\n )}\n >\n {currentChecked && (\n <span className=\"h-[8px] w-[8px] rounded-full bg-[var(--color-foreground,#000)]\" />\n )}\n </span>\n\n {/* Label + helper */}\n {(label || helperText) && (\n <span className=\"flex flex-col gap-0.5\">\n {label && (\n <span className=\"font-['Red_Hat_Text'] text-[14px] font-normal leading-tight text-[var(--color-text-primary,#000)]\">\n {label}\n </span>\n )}\n {helperText && (\n <span className=\"font-['Inter'] text-[12px] text-[var(--color-text-tertiary,#6B7280)]\">\n {helperText}\n </span>\n )}\n </span>\n )}\n </label>\n )\n },\n)\nRadio.displayName = \"Radio\"\n\n/**\n * RadioGroup — convenience wrapper for a labelled set of Radio options.\n *\n * Usage:\n * <RadioGroup label=\"Time period\" name=\"period\" value={val} onChange={setVal}>\n * <Radio value=\"day\" label=\"Day\" />\n * <Radio value=\"week\" label=\"Week\" />\n * <Radio value=\"month\" label=\"Month\" />\n * </RadioGroup>\n */\nexport interface RadioGroupProps {\n label?: string\n name: string\n value?: string\n onChange?: (value: string) => void\n children: React.ReactNode\n className?: string\n orientation?: \"horizontal\" | \"vertical\"\n}\n\nexport function RadioGroup({\n label,\n name,\n value,\n onChange,\n children,\n className,\n orientation = \"vertical\",\n}: RadioGroupProps) {\n const cloned = React.Children.map(children, (child) => {\n if (!React.isValidElement(child)) return child\n const el = child as React.ReactElement<RadioProps>\n return React.cloneElement(el, {\n name,\n checked: value !== undefined ? el.props.value === value : undefined,\n onChange: (e: React.ChangeEvent<HTMLInputElement>) => {\n if (e.target.checked) onChange?.(e.target.value as string)\n el.props.onChange?.(e)\n },\n })\n })\n\n return (\n <fieldset className={cn(\"border-none p-0 m-0\", className)}>\n {label && (\n <legend className=\"mb-2 font-['Red_Hat_Text'] text-[18px] font-medium text-[var(--color-text-primary,#000)]\">\n {label}\n </legend>\n )}\n <div className={cn(\"flex gap-3\", orientation === \"vertical\" ? \"flex-col\" : \"flex-row flex-wrap\")}>\n {cloned}\n </div>\n </fieldset>\n )\n}\n","import * as React from \"react\"\nimport { cn } from \"./utils\"\n\n/**\n * Toggle — iOS-style switch. Qu Notify form control.\n *\n * States: off | on | disabled-off | disabled-on\n * - Off: gray-100 (#DEDEDE) track, white knob positioned left\n * - On: cyan (#40CCF2) track, white knob positioned right\n * - Disabled: opacity 0.5 on full component\n *\n * Track: 44×24px, full-radius pill\n * Knob: 20×20px white circle, 2px from edge, animates on toggle\n *\n * Usage:\n * <Toggle label=\"Enable notifications\" />\n * <Toggle checked label=\"Push alerts\" />\n * <Toggle disabled label=\"Feature unavailable\" />\n *\n * Controlled:\n * <Toggle checked={enabled} onChange={(v) => setEnabled(v)} label=\"Face ID\" />\n */\n\nexport interface ToggleProps {\n checked?: boolean\n defaultChecked?: boolean\n disabled?: boolean\n label?: string\n /** Label position relative to the toggle */\n labelPosition?: \"right\" | \"left\"\n helperText?: string\n onChange?: (checked: boolean) => void\n className?: string\n id?: string\n}\n\nexport const Toggle = React.forwardRef<HTMLButtonElement, ToggleProps>(\n (\n {\n checked,\n defaultChecked = false,\n disabled = false,\n label,\n labelPosition = \"right\",\n helperText,\n onChange,\n className,\n id: idProp,\n },\n ref,\n ) => {\n const generatedId = React.useId()\n const id = idProp ?? generatedId\n\n const [isOn, setIsOn] = React.useState(defaultChecked)\n const isControlled = checked !== undefined\n const currentOn = isControlled ? !!checked : isOn\n\n const handleClick = () => {\n if (disabled) return\n const next = !currentOn\n if (!isControlled) setIsOn(next)\n onChange?.(next)\n }\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLButtonElement>) => {\n if (e.key === \" \" || e.key === \"Enter\") {\n e.preventDefault()\n handleClick()\n }\n }\n\n const track = (\n <button\n ref={ref}\n id={id}\n role=\"switch\"\n type=\"button\"\n aria-checked={currentOn}\n disabled={disabled}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n className={cn(\n // track\n \"relative inline-flex h-[19px] w-[45px] shrink-0 cursor-pointer rounded-full\",\n \"border-0 outline-none transition-colors duration-[180ms] ease-[cubic-bezier(0.2,0,0,1)]\",\n \"focus-visible:ring-2 focus-visible:ring-[var(--color-secondary,#339FB8)] focus-visible:ring-offset-2\",\n \"disabled:cursor-not-allowed\",\n currentOn\n ? \"bg-[var(--color-secondary,#339FB8)]\"\n : \"bg-[var(--color-inactive,#DEDEDE)]\",\n )}\n >\n {/* Knob */}\n <span\n aria-hidden=\"true\"\n className={cn(\n \"absolute top-[2px] h-[15px] w-[24px] rounded-full bg-white shadow-sm\",\n \"transition-transform duration-[180ms] ease-[cubic-bezier(0.2,0,0,1)]\",\n currentOn ? \"translate-x-[19px]\" : \"translate-x-[2px]\",\n )}\n />\n </button>\n )\n\n if (!label && !helperText) {\n return <span className={cn(disabled && \"opacity-50\", className)}>{track}</span>\n }\n\n const labelContent = (\n <label\n htmlFor={id}\n className={cn(\n \"flex flex-col gap-0.5 cursor-pointer\",\n disabled && \"cursor-not-allowed\",\n )}\n >\n <span className=\"font-['Red_Hat_Text'] text-[14px] font-normal leading-tight text-[var(--color-text-primary,#000)]\">\n {label}\n </span>\n {helperText && (\n <span className=\"font-['Inter'] text-[12px] text-[var(--color-text-tertiary,#6B7280)]\">\n {helperText}\n </span>\n )}\n </label>\n )\n\n return (\n <div\n className={cn(\n \"inline-flex items-center gap-2.5\",\n disabled && \"opacity-50\",\n className,\n )}\n >\n {labelPosition === \"left\" && labelContent}\n {track}\n {labelPosition === \"right\" && labelContent}\n </div>\n )\n },\n)\nToggle.displayName = \"Toggle\"\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"./utils\"\nimport { ChevronDown } from \"./icons\"\n\n/**\n * Selector — pill-shaped dropdown trigger. Qu Notify filter/store-picker control.\n *\n * Variants:\n * variant: primary | secondary\n * state: active | inactive | disabled\n *\n * Primary Active: cyan (#40CCF2) fill, black text\n * Primary Inactive: gray-100 fill, primary text\n * Secondary Active: teal outline, teal text\n * Secondary Inactive: gray-200 outline, secondary text\n *\n * The component is a styled button — wire up a Popover/DropdownMenu to it externally.\n * The `open` prop controls the chevron rotation only.\n *\n * Usage:\n * <Selector label=\"All Stores\" />\n * <Selector label=\"This Week\" variant=\"secondary\" state=\"active\" />\n * <Selector label=\"Location\" open />\n * <Selector label=\"Date Range\" state=\"disabled\" />\n */\n\nconst selectorVariants = cva(\n [\n \"inline-flex items-center gap-1.5 rounded-xl select-none cursor-pointer\",\n \"py-2 pl-3.5 pr-2.5\",\n \"font-['Red_Hat_Text'] text-[14px] font-medium leading-tight\",\n \"border-[1.5px] transition-colors duration-[120ms]\",\n \"outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-ring,#40CCF2)] focus-visible:ring-offset-1\",\n \"disabled:pointer-events-none disabled:opacity-50\",\n ],\n {\n variants: {\n variant: {\n primary: \"\",\n secondary: \"\",\n },\n state: {\n active: \"\",\n inactive: \"\",\n disabled: \"\",\n },\n },\n compoundVariants: [\n // Primary\n {\n variant: \"primary\",\n state: \"active\",\n class: \"bg-[var(--color-primary,#40CCF2)] border-transparent text-[var(--color-text-primary,#000)]\",\n },\n {\n variant: \"primary\",\n state: [\"inactive\", \"disabled\"],\n class: \"bg-[var(--color-inactive,#DEDEDE)] border-transparent text-[var(--color-text-primary,#000)]\",\n },\n // Secondary\n {\n variant: \"secondary\",\n state: \"active\",\n class: \"bg-transparent border-[var(--color-secondary-border,#339FB8)] text-[var(--color-secondary-foreground,#339FB8)]\",\n },\n {\n variant: \"secondary\",\n state: [\"inactive\", \"disabled\"],\n class: \"bg-transparent border-[var(--color-border,#C9C9C9)] text-[var(--color-text-secondary,#6B7280)]\",\n },\n ],\n defaultVariants: {\n variant: \"primary\",\n state: \"active\",\n },\n },\n)\n\nexport interface SelectorProps\n extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, \"children\">,\n VariantProps<typeof selectorVariants> {\n label: string\n /** Controlled open state — rotates chevron 180° */\n open?: boolean\n /** Icon to show before the label (optional) */\n icon?: React.ReactNode\n}\n\nexport const Selector = React.forwardRef<HTMLButtonElement, SelectorProps>(\n ({ label, variant = \"primary\", state = \"active\", open = false, icon, className, disabled, ...props }, ref) => {\n const isDisabled = disabled || state === \"disabled\"\n\n return (\n <button\n ref={ref}\n type=\"button\"\n disabled={isDisabled}\n aria-expanded={open}\n aria-haspopup=\"listbox\"\n className={cn(selectorVariants({ variant, state: isDisabled ? \"disabled\" : state }), className)}\n {...props}\n >\n {icon && <span className=\"shrink-0 [&_svg]:size-4\">{icon}</span>}\n <span>{label}</span>\n <ChevronDown\n size={12}\n className={cn(\n \"shrink-0 transition-transform duration-[120ms]\",\n open && \"rotate-180\",\n )}\n />\n </button>\n )\n },\n)\nSelector.displayName = \"Selector\"\n\n// ── Selector Group — renders a horizontal row of Selectors ───────────────────\nexport interface SelectorGroupProps {\n children: React.ReactNode\n className?: string\n}\nexport function SelectorGroup({ children, className }: SelectorGroupProps) {\n return (\n <div className={cn(\"flex flex-wrap items-center gap-2\", className)}>\n {children}\n </div>\n )\n}\n\n","import * as React from \"react\"\nimport { cn } from \"./utils\"\n\n/**\n * TabBar — Qu Notify top-level tab selector (L1).\n *\n * Visual spec:\n * Layout: standalone pills sitting in a row with gaps (no outer container).\n * Selected tab: black fill, white text, full-radius pill.\n * Unselected tab: gray-100 fill, primary text, full-radius pill.\n * Font: Inter Medium 14px.\n *\n * Differs from Switcher: TabBar is for primary page-level navigation where\n * each tab reads as its own standalone affordance. Switcher is for inline\n * filters where the segments share an outer track.\n *\n * Usage (uncontrolled):\n * <TabBar tabs={[\"Sales\", \"Labor\", \"Store\"]} defaultValue=\"Sales\" />\n *\n * Usage (controlled):\n * <TabBar\n * tabs={[\"Sales\", \"Labor\", \"Store\", \"Product\"]}\n * value={activeTab}\n * onValueChange={setActiveTab}\n * />\n *\n * Usage with content panels:\n * <TabBar tabs={tabs} value={active} onValueChange={setActive} />\n * {active === \"Sales\" && <SalesPanel />}\n */\n\nexport interface TabBarProps {\n tabs: string[]\n value?: string\n defaultValue?: string\n onValueChange?: (value: string) => void\n className?: string\n /** Make all tabs equal width (fills container) */\n stretch?: boolean\n}\n\nexport function TabBar({\n tabs,\n value,\n defaultValue,\n onValueChange,\n className,\n stretch = false,\n}: TabBarProps) {\n const [selected, setSelected] = React.useState(defaultValue ?? tabs[0])\n const isControlled = value !== undefined\n const current = isControlled ? value : selected\n\n const handleSelect = (tab: string) => {\n if (!isControlled) setSelected(tab)\n onValueChange?.(tab)\n }\n\n return (\n <div\n role=\"tablist\"\n aria-label=\"Tabs\"\n className={cn(\n \"inline-flex items-center gap-2\",\n stretch && \"w-full\",\n className,\n )}\n >\n {tabs.map((tab) => {\n const isSelected = tab === current\n return (\n <button\n key={tab}\n role=\"tab\"\n type=\"button\"\n aria-selected={isSelected}\n onClick={() => handleSelect(tab)}\n className={cn(\n \"rounded-full px-4 py-[7px] cursor-pointer select-none\",\n \"font-['Inter'] text-[14px] font-medium leading-tight\",\n \"outline-none transition-colors duration-[120ms]\",\n \"focus-visible:ring-2 focus-visible:ring-[var(--color-ring,#40CCF2)] focus-visible:ring-offset-1\",\n stretch && \"flex-1 text-center\",\n isSelected\n ? \"bg-[var(--color-foreground,#000)] text-white\"\n : \"bg-[var(--color-inactive,#DEDEDE)] text-[var(--color-text-primary,#000)] hover:brightness-95\",\n )}\n >\n {tab}\n </button>\n )\n })}\n </div>\n )\n}\n\n/**\n * TabPanels — optional declarative panel companion for TabBar.\n *\n * Usage:\n * <TabBar tabs={[\"Sales\",\"Labor\"]} value={tab} onValueChange={setTab} />\n * <TabPanels value={tab}>\n * <TabPanel value=\"Sales\"><SalesContent /></TabPanel>\n * <TabPanel value=\"Labor\"><LaborContent /></TabPanel>\n * </TabPanels>\n */\nexport interface TabPanelsProps {\n value: string\n children: React.ReactNode\n className?: string\n}\nexport function TabPanels({ value, children, className }: TabPanelsProps) {\n return (\n <div className={className}>\n {React.Children.map(children, (child) => {\n if (!React.isValidElement(child)) return null\n const el = child as React.ReactElement<TabPanelProps>\n return el.props.value === value ? el : null\n })}\n </div>\n )\n}\n\nexport interface TabPanelProps {\n value: string\n children: React.ReactNode\n className?: string\n}\nexport function TabPanel({ children, className }: TabPanelProps) {\n return <div role=\"tabpanel\" className={className}>{children}</div>\n}\n","import * as React from \"react\"\nimport { cn } from \"./utils\"\n\n/**\n * Switcher — Qu Notify segmented control (L2 — inline data filter).\n *\n * Visual spec:\n * Container: gray-100 (#DEDEDE) bg, full-radius pill, 3px padding\n * Selected segment: black fill, white text, full-radius pill\n * Unselected segment: transparent, primary text (black)\n * Font: Inter Medium 14px\n *\n * Differs from TabBar:\n * - TabBar: standalone pill tabs, no outer container — primary page navigation\n * - Switcher: outer pill container holding inner pill segments — inline\n * data filters (e.g. Day / Week / Month, Net / Gross, All / Open / Closed)\n *\n * Usage (uncontrolled):\n * <Switcher segments={[\"Day\", \"Week\", \"Month\"]} defaultValue=\"Week\" />\n *\n * Usage (controlled):\n * <Switcher\n * segments={[\"Net\", \"Gross\"]}\n * value={metric}\n * onValueChange={setMetric}\n * />\n *\n * Usage with icon segments:\n * <Switcher\n * segments={[\n * { value: \"list\", label: \"List\", icon: <ListIcon /> },\n * { value: \"grid\", label: \"Grid\", icon: <GridIcon /> },\n * ]}\n * value={view}\n * onValueChange={setView}\n * />\n */\n\ntype Segment = string | { value: string; label: string; icon?: React.ReactNode }\n\nfunction segmentValue(s: Segment): string {\n return typeof s === \"string\" ? s : s.value\n}\nfunction segmentLabel(s: Segment): string {\n return typeof s === \"string\" ? s : s.label\n}\nfunction segmentIcon(s: Segment): React.ReactNode | undefined {\n return typeof s === \"string\" ? undefined : s.icon\n}\n\nexport interface SwitcherProps {\n segments: Segment[]\n value?: string\n defaultValue?: string\n onValueChange?: (value: string) => void\n className?: string\n /** Stretch to fill container width */\n stretch?: boolean\n}\n\nexport function Switcher({\n segments,\n value,\n defaultValue,\n onValueChange,\n className,\n stretch = false,\n}: SwitcherProps) {\n const [selected, setSelected] = React.useState(\n defaultValue ?? segmentValue(segments[0]),\n )\n const isControlled = value !== undefined\n const current = isControlled ? value : selected\n\n const handleSelect = (val: string) => {\n if (!isControlled) setSelected(val)\n onValueChange?.(val)\n }\n\n return (\n <div\n role=\"group\"\n className={cn(\n \"inline-flex items-center gap-0.5 rounded-full p-[3px]\",\n \"bg-[var(--color-inactive,#DEDEDE)]\",\n stretch && \"w-full\",\n className,\n )}\n >\n {segments.map((seg) => {\n const val = segmentValue(seg)\n const label = segmentLabel(seg)\n const icon = segmentIcon(seg)\n const isSelected = val === current\n\n return (\n <button\n key={val}\n type=\"button\"\n role=\"radio\"\n aria-checked={isSelected}\n onClick={() => handleSelect(val)}\n className={cn(\n \"inline-flex items-center justify-center gap-1.5 rounded-full\",\n \"px-4 py-[7px] cursor-pointer select-none\",\n \"font-['Inter'] text-[14px] font-medium leading-tight\",\n \"outline-none transition-colors duration-[120ms]\",\n \"focus-visible:ring-2 focus-visible:ring-[var(--color-ring,#40CCF2)] focus-visible:ring-offset-1\",\n stretch && \"flex-1\",\n isSelected\n ? \"bg-[var(--color-foreground,#000)] text-white\"\n : \"bg-transparent text-[var(--color-text-primary,#000)] hover:bg-black/5\",\n )}\n >\n {icon && <span className=\"shrink-0 [&_svg]:size-[14px]\">{icon}</span>}\n {label}\n </button>\n )\n })}\n </div>\n )\n}\n","import * as React from \"react\"\nimport { cn } from \"./utils\"\n\n/**\n * BottomNav — Qu Notify floating bottom navigation bar.\n *\n * Visual spec:\n * Container: glass gradient pill (180deg, rgba(220,220,220,0.2) → rgba(118,118,118,0.2))\n * box-shadow: 0 4px 4px rgba(0,0,0,0.14)\n * border-radius: 60px\n * max-width: 360px, height: 72px\n * Selected item: black fill pill, white icon + label (Semi Bold)\n * Unselected item: transparent, gray icon + label (Regular)\n * Font: Inter — label 10px\n * Icon: 20×20px\n *\n * Usage (controlled — you manage routing):\n * const [active, setActive] = useState(\"dashboard\")\n *\n * <BottomNav\n * items={[\n * { value: \"dashboard\", label: \"Dashboard\", icon: <DashboardIcon /> },\n * { value: \"inventory\", label: \"Inventory\", icon: <BoxIcon /> },\n * { value: \"menu\", label: \"Menu\", icon: <MenuIcon /> },\n * ]}\n * value={active}\n * onValueChange={setActive}\n * />\n *\n * Usage with React Router / Next.js:\n * <BottomNav\n * items={navItems}\n * value={pathname}\n * onValueChange={(v) => router.push(v)}\n * />\n *\n * Positioning:\n * Wrap in a <div className=\"fixed bottom-6 left-1/2 -translate-x-1/2 w-full max-w-sm px-4 z-50\">\n * for the standard bottom-floating placement used in the app.\n */\n\nexport interface NavItem {\n value: string\n label: string\n icon: React.ReactNode\n /** Notification indicator */\n badge?: boolean | number\n}\n\nexport interface BottomNavProps {\n items: NavItem[]\n value?: string\n defaultValue?: string\n onValueChange?: (value: string) => void\n className?: string\n}\n\nexport function BottomNav({\n items,\n value,\n defaultValue,\n onValueChange,\n className,\n}: BottomNavProps) {\n const [selected, setSelected] = React.useState(\n defaultValue ?? items[0]?.value,\n )\n const isControlled = value !== undefined\n const current = isControlled ? value : selected\n\n const handleSelect = (val: string) => {\n if (!isControlled) setSelected(val)\n onValueChange?.(val)\n }\n\n return (\n <nav\n aria-label=\"Main navigation\"\n className={cn(\n // Glass pill container\n \"flex items-center justify-between\",\n \"w-full max-w-[360px] h-[72px] rounded-[60px]\",\n \"px-3 py-2\",\n // Glass gradient\n \"bg-gradient-to-b from-[rgba(220,220,220,0.20)] to-[rgba(118,118,118,0.20)]\",\n \"backdrop-blur-md\",\n // Shadow\n \"shadow-[0_4px_4px_rgba(0,0,0,0.14)]\",\n className,\n )}\n >\n {items.map((item) => {\n const isSelected = item.value === current\n return (\n <NavItemButton\n key={item.value}\n item={item}\n isSelected={isSelected}\n onClick={() => handleSelect(item.value)}\n />\n )\n })}\n </nav>\n )\n}\n\n// ── Internal nav item ─────────────────────────────────────────────────────────\ninterface NavItemButtonProps {\n item: NavItem\n isSelected: boolean\n onClick: () => void\n}\n\nfunction NavItemButton({ item, isSelected, onClick }: NavItemButtonProps) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n aria-current={isSelected ? \"page\" : undefined}\n className={cn(\n \"relative inline-flex flex-col items-center justify-center gap-[3px]\",\n \"rounded-full py-2 px-4 cursor-pointer select-none\",\n \"outline-none transition-colors duration-[120ms]\",\n \"focus-visible:ring-2 focus-visible:ring-[var(--color-ring,#40CCF2)] focus-visible:ring-offset-1\",\n isSelected\n ? \"bg-[var(--color-foreground,#000)] text-white\"\n : \"bg-transparent text-[var(--color-muted-foreground,#6B7280)]\",\n )}\n >\n {/* Badge dot */}\n {item.badge && (\n <span\n aria-label={typeof item.badge === \"number\" ? `${item.badge} notifications` : \"New notification\"}\n className={cn(\n \"absolute right-2 top-2 flex items-center justify-center\",\n \"rounded-full bg-[var(--color-destructive,#EF2149)] text-white\",\n typeof item.badge === \"number\"\n ? \"h-4 min-w-4 px-1 font-['Inter'] text-[10px] font-semibold\"\n : \"h-2 w-2\",\n )}\n >\n {typeof item.badge === \"number\" ? item.badge : null}\n </span>\n )}\n\n {/* Icon */}\n <span className=\"[&_svg]:size-5\" aria-hidden=\"true\">\n {item.icon}\n </span>\n\n {/* Label */}\n <span\n className={cn(\n \"font-['Inter'] text-[10px] leading-tight\",\n isSelected ? \"font-semibold\" : \"font-normal\",\n )}\n >\n {item.label}\n </span>\n </button>\n )\n}\n\n// ── Positioning wrapper — use as-is for the standard app layout ───────────────\nexport function BottomNavContainer({ children }: { children: React.ReactNode }) {\n return (\n <div className=\"fixed bottom-6 left-1/2 z-50 flex w-full max-w-[402px] -translate-x-1/2 items-center justify-center px-4\">\n {children}\n </div>\n )\n}\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"./utils\"\nimport { ArrowUp2, ArrowDown2 } from \"./icons\"\n\n/**\n * Badge — Qu Notify status/trend pill label.\n *\n * Variants:\n * variant: default | success | error | warning | alert | info | neutral\n * size: sm | md\n *\n * Usage:\n * <Badge>Open</Badge>\n * <Badge variant=\"success\">+11.8%</Badge>\n * <Badge variant=\"error\">-5.6%</Badge>\n * <Badge variant=\"warning\">Delayed</Badge>\n * <Badge icon={<TrendUpIcon />} variant=\"success\">Net Sales</Badge>\n */\n\nconst badgeVariants = cva(\n [\n \"inline-flex items-center gap-1 rounded-full font-['Inter'] font-medium whitespace-nowrap\",\n \"select-none leading-tight\",\n ],\n {\n variants: {\n variant: {\n default: \"bg-[var(--color-inactive,#DEDEDE)] text-[var(--color-text-primary,#000)]\",\n success: \"bg-[var(--color-success-soft,#B3F5D1)] text-[var(--color-success,#16A34A)]\",\n error: \"bg-[var(--color-error-soft,#FFC9C9)] text-[var(--color-destructive,#EF2149)]\",\n warning: \"bg-[var(--color-warning-soft,#FFF085)] text-[#92680E]\",\n alert: \"bg-[var(--color-alert-soft,#EAC1C3)] text-[var(--color-alert,#FA6A0A)]\",\n info: \"bg-[var(--color-info-soft,#BEDBFF)] text-[var(--color-info,#2F80ED)]\",\n neutral: \"bg-transparent text-[var(--color-text-secondary,#6B7280)] border border-[var(--color-border,#C9C9C9)]\",\n // Brand accent fills — used for status tags in Kitchen Intelligence\n brand: \"bg-[var(--color-primary,#40CCF2)] text-[var(--color-text-primary,#000)]\",\n },\n size: {\n sm: \"h-5 px-2 text-[11px]\",\n md: \"h-6 px-2.5 text-[12px]\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"md\",\n },\n },\n)\n\nexport interface BadgeProps\n extends React.HTMLAttributes<HTMLSpanElement>,\n VariantProps<typeof badgeVariants> {\n icon?: React.ReactNode\n}\n\nexport function Badge({ variant, size, icon, children, className, ...props }: BadgeProps) {\n return (\n <span className={cn(badgeVariants({ variant, size }), className)} {...props}>\n {icon && <span className=\"shrink-0 [&_svg]:size-3\" aria-hidden=\"true\">{icon}</span>}\n {children}\n </span>\n )\n}\n\n/**\n * TrendBadge — inline trend indicator. Bare colored text + arrow, no pill bg.\n *\n * Used inside MetricTile and anywhere a percent delta needs to appear next to\n * a primary value. The bare style keeps the trend visually subordinate to the\n * value above it (the headline number is the hero; the trend is supporting\n * commentary). For a pill-shaped status label, use <Badge> directly.\n *\n * Usage:\n * <TrendBadge value={11.8} /> → green \"↗ +11.8%\"\n * <TrendBadge value={-5.6} /> → red \"↘ −5.6%\"\n * <TrendBadge value={0} /> → neutral \"0.0%\"\n */\nexport interface TrendBadgeProps extends React.HTMLAttributes<HTMLSpanElement> {\n value: number\n /** Number of decimal places (default: 1) */\n decimals?: number\n /** Show arrow icon (default: true) */\n showArrow?: boolean\n}\n\nexport function TrendBadge({ value, decimals = 1, showArrow = true, className, ...props }: TrendBadgeProps) {\n const colorClass =\n value > 0 ? \"text-[var(--color-success,#16A34A)]\" :\n value < 0 ? \"text-[var(--color-destructive,#EF2149)]\" :\n \"text-[var(--color-text-tertiary,#6B7280)]\"\n\n const formatted = `${value > 0 ? \"+\" : \"\"}${value.toFixed(decimals)}%`\n\n const arrow = showArrow ? (\n value > 0 ? <ArrowUp2 /> :\n value < 0 ? <ArrowDown2 /> :\n null\n ) : null\n\n return (\n <span\n className={cn(\n \"inline-flex items-center gap-1 whitespace-nowrap select-none\",\n \"font-['Inter'] text-[12px] font-medium leading-tight\",\n \"[&_svg]:size-3\",\n colorClass,\n className,\n )}\n {...props}\n >\n {arrow}\n {formatted}\n </span>\n )\n}\n\n","import * as React from \"react\"\nimport { cn } from \"./utils\"\nimport { TrendBadge } from \"./badge\"\nimport { ChevronRight } from \"./icons\"\n\n/**\n * MetricTile — the core data display unit of the Qu Notify dashboard.\n *\n * Visual spec:\n * Container: white card, 16px border-radius, shadow: 0 4px 4px rgba(0,0,0,0.06)\n * Label: Inter Regular 12px, gray (#6B7280)\n * Value: Inter SemiBold 24px, black (#000)\n * Trend: TrendBadge (green/red/neutral)\n * Sub-label: Inter Regular 12px, gray — secondary context (e.g. \"vs last week\")\n *\n * Variants:\n * size: sm | md | lg\n * loading: skeleton state\n *\n * Usage (minimal):\n * <MetricTile label=\"Net Sales\" value=\"$42,810\" />\n *\n * Usage (with trend):\n * <MetricTile label=\"Average Check\" value=\"$18.42\" trend={11.8} trendLabel=\"vs last week\" />\n *\n * Usage (with icon and custom value color):\n * <MetricTile\n * label=\"Labor %\"\n * value=\"24.1%\"\n * trend={-2.3}\n * icon={<UserIcon />}\n * valueColor=\"var(--color-success,#16A34A)\"\n * />\n *\n * Usage (loading):\n * <MetricTile label=\"Net Sales\" value=\"...\" loading />\n *\n * Usage (grid):\n * <MetricTileGrid cols={2}>\n * <MetricTile label=\"Net Sales\" value=\"$42,810\" trend={11.8} />\n * <MetricTile label=\"Avg Check\" value=\"$18.42\" trend={-1.2} />\n * <MetricTile label=\"Checks\" value=\"2,324\" />\n * <MetricTile label=\"Speed of Svc\" value=\"3m 12s\" />\n * </MetricTileGrid>\n */\n\nexport interface MetricTileProps {\n label: string\n value: string | number\n /** Percentage change. Positive = green, negative = red. */\n trend?: number\n trendLabel?: string\n icon?: React.ReactNode\n /** Override the value text color (e.g. for KPI goal states) */\n valueColor?: string\n size?: \"sm\" | \"md\" | \"lg\"\n loading?: boolean\n /** Click handler — makes the tile interactive */\n onClick?: () => void\n className?: string\n /** Render as a specific element */\n as?: \"div\" | \"article\"\n}\n\nexport function MetricTile({\n label,\n value,\n trend,\n trendLabel,\n icon,\n valueColor,\n size = \"md\",\n loading = false,\n onClick,\n className,\n as: Tag = \"div\",\n}: MetricTileProps) {\n const valueSize = {\n sm: \"text-[18px]\",\n md: \"text-[24px]\",\n lg: \"text-[30px]\",\n }[size]\n\n const padding = {\n sm: \"p-3\",\n md: \"p-4\",\n lg: \"p-5\",\n }[size]\n\n return (\n <Tag\n onClick={onClick}\n role={onClick ? \"button\" : undefined}\n tabIndex={onClick ? 0 : undefined}\n onKeyDown={onClick ? (e) => { if (e.key === \"Enter\" || e.key === \" \") onClick() } : undefined}\n className={cn(\n // Card shell\n \"flex flex-col gap-1 rounded-[16px] bg-white\",\n \"shadow-[0_4px_4px_rgba(0,0,0,0.06)]\",\n padding,\n // Interactive\n onClick && \"cursor-pointer outline-none hover:shadow-[0_4px_12px_rgba(0,0,0,0.10)] transition-shadow duration-[120ms]\",\n onClick && \"focus-visible:ring-2 focus-visible:ring-[var(--color-ring,#40CCF2)] focus-visible:ring-offset-2\",\n // Loading\n loading && \"animate-pulse\",\n className,\n )}\n >\n {/* Label row */}\n <div className=\"flex items-center justify-between gap-2\">\n <span\n className={cn(\n \"font-['Inter'] text-[12px] font-normal leading-tight\",\n \"text-[var(--color-text-tertiary,#6B7280)]\",\n loading && \"h-3 w-24 rounded bg-gray-200\",\n )}\n >\n {!loading && label}\n </span>\n {!loading && (icon ? (\n <span className=\"shrink-0 text-[var(--color-text-tertiary,#6B7280)] [&_svg]:size-4\" aria-hidden=\"true\">\n {icon}\n </span>\n ) : onClick ? (\n <span className=\"shrink-0 text-[var(--color-text-tertiary,#6B7280)]\" aria-hidden=\"true\">\n <ChevronRight size={14} />\n </span>\n ) : null)}\n </div>\n\n {/* Value */}\n <span\n className={cn(\n \"font-['Inter'] font-semibold leading-tight tracking-tight\",\n valueSize,\n loading && \"mt-1 h-7 w-28 rounded bg-gray-200\",\n )}\n style={valueColor && !loading ? { color: valueColor } : undefined}\n >\n {!loading && value}\n </span>\n\n {/* Metadata row — prior-period value first, then trend. Both gray-toned so\n the headline value above stays the hero. */}\n {(trend !== undefined || trendLabel) && !loading && (\n <div className=\"flex items-center gap-1.5\">\n {trendLabel && (\n <span className=\"font-['Inter'] text-[12px] text-[var(--color-text-tertiary,#6B7280)]\">\n {trendLabel}\n </span>\n )}\n {trend !== undefined && <TrendBadge value={trend} />}\n </div>\n )}\n {loading && trend !== undefined && (\n <div className=\"mt-1 h-4 w-16 rounded bg-gray-200\" />\n )}\n </Tag>\n )\n}\n\n/**\n * MetricTileGrid — responsive grid wrapper.\n *\n * Usage:\n * <MetricTileGrid cols={2}> ... </MetricTileGrid>\n */\nexport interface MetricTileGridProps {\n cols?: 1 | 2 | 3 | 4\n children: React.ReactNode\n className?: string\n}\n\nexport function MetricTileGrid({ cols = 2, children, className }: MetricTileGridProps) {\n const colClass = {\n 1: \"grid-cols-1\",\n 2: \"grid-cols-2\",\n 3: \"grid-cols-3\",\n 4: \"grid-cols-4\",\n }[cols]\n\n return (\n <div className={cn(\"grid gap-3\", colClass, className)}>\n {children}\n </div>\n )\n}\n\n"]}