@david-richard/notify-ds 1.1.1 → 1.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +13 -13
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +13 -13
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/tokens.css +1 -1
package/dist/index.js
CHANGED
|
@@ -365,7 +365,7 @@ var Checkbox = React4__namespace.forwardRef(
|
|
|
365
365
|
className: cn(
|
|
366
366
|
"flex h-[18px] w-[18px] shrink-0 items-center justify-center rounded-[6px]",
|
|
367
367
|
"border-[2px] transition-colors duration-[120ms]",
|
|
368
|
-
showCheck || showDash ? "border-transparent bg-[var(--color-
|
|
368
|
+
showCheck || showDash ? "border-transparent bg-[var(--color-primary,#40CCF2)] text-[var(--color-foreground,#000)]" : "border-[var(--color-primary,#40CCF2)] bg-transparent"
|
|
369
369
|
),
|
|
370
370
|
children: [
|
|
371
371
|
showCheck && /* @__PURE__ */ jsxRuntime.jsx(Check, { size: 12 }),
|
|
@@ -420,7 +420,7 @@ var Radio = React4__namespace.forwardRef(
|
|
|
420
420
|
className: cn(
|
|
421
421
|
"flex h-[18px] w-[18px] shrink-0 items-center justify-center rounded-full",
|
|
422
422
|
"border-[2px] bg-transparent transition-colors duration-[120ms]",
|
|
423
|
-
"border-[var(--color-
|
|
423
|
+
"border-[var(--color-primary,#40CCF2)]"
|
|
424
424
|
),
|
|
425
425
|
children: currentChecked && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "h-[8px] w-[8px] rounded-full bg-[var(--color-foreground,#000)]" })
|
|
426
426
|
}
|
|
@@ -505,9 +505,9 @@ var Toggle = React4__namespace.forwardRef(
|
|
|
505
505
|
// track
|
|
506
506
|
"relative inline-flex h-[19px] w-[45px] shrink-0 cursor-pointer rounded-full",
|
|
507
507
|
"border-0 outline-none transition-colors duration-[180ms] ease-[cubic-bezier(0.2,0,0,1)]",
|
|
508
|
-
"focus-visible:ring-2 focus-visible:ring-[var(--color-
|
|
508
|
+
"focus-visible:ring-2 focus-visible:ring-[var(--color-primary,#40CCF2)] focus-visible:ring-offset-2",
|
|
509
509
|
"disabled:cursor-not-allowed",
|
|
510
|
-
currentOn ? "bg-[var(--color-
|
|
510
|
+
currentOn ? "bg-[var(--color-primary,#40CCF2)]" : "bg-[var(--color-inactive,#DEDEDE)]"
|
|
511
511
|
),
|
|
512
512
|
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
513
513
|
"span",
|
|
@@ -907,8 +907,8 @@ function TrendBadge({ value, decimals = 1, showArrow = true, className, ...props
|
|
|
907
907
|
{
|
|
908
908
|
className: cn(
|
|
909
909
|
"inline-flex items-center gap-1 whitespace-nowrap select-none",
|
|
910
|
-
"font-['Inter'] text-[
|
|
911
|
-
"[&_svg]:size-3",
|
|
910
|
+
"font-['Inter'] text-[13px] font-medium leading-tight",
|
|
911
|
+
"[&_svg]:size-3.5",
|
|
912
912
|
colorClass,
|
|
913
913
|
className
|
|
914
914
|
),
|
|
@@ -934,9 +934,9 @@ function MetricTile({
|
|
|
934
934
|
as: Tag = "div"
|
|
935
935
|
}) {
|
|
936
936
|
const valueSize = {
|
|
937
|
-
sm: "text-[
|
|
938
|
-
md: "text-[
|
|
939
|
-
lg: "text-[
|
|
937
|
+
sm: "text-[22px]",
|
|
938
|
+
md: "text-[28px]",
|
|
939
|
+
lg: "text-[34px]"
|
|
940
940
|
}[size];
|
|
941
941
|
const padding = {
|
|
942
942
|
sm: "p-3",
|
|
@@ -970,7 +970,7 @@ function MetricTile({
|
|
|
970
970
|
"span",
|
|
971
971
|
{
|
|
972
972
|
className: cn(
|
|
973
|
-
"font-['Inter'] text-[
|
|
973
|
+
"font-['Inter'] text-[14px] font-normal leading-tight",
|
|
974
974
|
"text-[var(--color-text-tertiary,#6B7280)]",
|
|
975
975
|
loading && "h-3 w-24 rounded bg-gray-200"
|
|
976
976
|
),
|
|
@@ -991,9 +991,9 @@ function MetricTile({
|
|
|
991
991
|
children: !loading && value
|
|
992
992
|
}
|
|
993
993
|
),
|
|
994
|
-
(trend !== void 0 || trendLabel) && !loading && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-
|
|
995
|
-
trendLabel
|
|
996
|
-
trend !== void 0
|
|
994
|
+
(trend !== void 0 || trendLabel) && !loading && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between gap-2", children: [
|
|
995
|
+
trendLabel ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-['Inter'] text-[13px] text-[var(--color-text-tertiary,#6B7280)]", children: trendLabel }) : /* @__PURE__ */ jsxRuntime.jsx("span", {}),
|
|
996
|
+
trend !== void 0 ? /* @__PURE__ */ jsxRuntime.jsx(TrendBadge, { value: trend }) : /* @__PURE__ */ jsxRuntime.jsx("span", {})
|
|
997
997
|
] }),
|
|
998
998
|
loading && trend !== void 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-1 h-4 w-16 rounded bg-gray-200" })
|
|
999
999
|
]
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../components/utils.ts","../components/button.tsx","../components/icons/arrow-down-2.tsx","../components/icons/arrow-up-2.tsx","../components/icons/check.tsx","../components/icons/chevron-down.tsx","../components/icons/chevron-right.tsx","../components/icons/hide.tsx","../components/icons/info.tsx","../components/icons/minus.tsx","../components/icons/search.tsx","../components/icons/view.tsx","../components/icons/x-circle.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":["twMerge","clsx","cva","React","Slot","jsx","jsxs","React2","React3","React4","React5","React6","React7","React8","React9"],"mappings":"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","file":"index.js","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 type { IconProps } from './types'\n\nexport function ArrowDown2({ size = 24, ...props }: IconProps) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}><path d=\"M22.6667 22.6667L9.33342 22.6667L9.33342 9.33333\" stroke=\"currentColor\" strokeWidth=\"2.67\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/> <path d=\"M22.6667 9.33334L9.33342 22.6667\" stroke=\"currentColor\" strokeWidth=\"2.67\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/></svg>\n )\n}\nArrowDown2.displayName = 'ArrowDown2'\n","import * as React from 'react'\nimport type { IconProps } from './types'\n\nexport function ArrowUp2({ size = 24, ...props }: IconProps) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}><path d=\"M9.33337 9.33333H22.6667V22.6667\" stroke=\"currentColor\" strokeWidth=\"2.67\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/> <path d=\"M9.33337 22.6667L22.6667 9.33333\" stroke=\"currentColor\" strokeWidth=\"2.67\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/></svg>\n )\n}\nArrowUp2.displayName = 'ArrowUp2'\n","import * as React from 'react'\nimport type { IconProps } from './types'\n\nexport function Check({ size = 24, ...props }: IconProps) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}><path d=\"M26.6667 8L12 22.6667L5.33337 16\" stroke=\"currentColor\" strokeWidth=\"2.66667\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/></svg>\n )\n}\nCheck.displayName = 'Check'\n","import * as React from 'react'\nimport type { IconProps } from './types'\n\nexport function ChevronDown({ size = 24, ...props }: IconProps) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}><path d=\"M8 12L16 20L24 12\" stroke=\"currentColor\" strokeWidth=\"2.66667\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/></svg>\n )\n}\nChevronDown.displayName = 'ChevronDown'\n","import * as React from 'react'\nimport type { IconProps } from './types'\n\nexport function ChevronRight({ size = 24, ...props }: IconProps) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}><path d=\"M12 24L20 16L12 8\" stroke=\"currentColor\" strokeWidth=\"2.66667\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/></svg>\n )\n}\nChevronRight.displayName = 'ChevronRight'\n","import * as React from 'react'\nimport type { IconProps } from './types'\n\nexport function Hide({ size = 24, ...props }: IconProps) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}><path d=\"M14.3107 6.768C17.4165 6.39787 20.5581 7.05442 23.2558 8.6374C25.9535 10.2204 28.059 12.6428 29.2507 15.5347C29.3618 15.834 29.3618 16.1633 29.2507 16.4627C28.7607 17.6507 28.1131 18.7673 27.3253 19.7827\" stroke=\"currentColor\" strokeWidth=\"2.66667\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/> <path d=\"M18.7787 18.8773C18.0243 19.606 17.0139 20.0092 15.9651 20C14.9163 19.9909 13.9131 19.5703 13.1715 18.8286C12.4298 18.087 12.0091 17.0837 12 16.0349C11.9909 14.9862 12.3941 13.9758 13.1227 13.2213\" stroke=\"currentColor\" strokeWidth=\"2.66667\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/> <path d=\"M23.3054 23.332C21.5367 24.3797 19.5633 25.0347 17.5192 25.2525C15.475 25.4704 13.408 25.246 11.4582 24.5945C9.50844 23.9431 7.72161 22.8799 6.21897 21.477C4.71633 20.0742 3.53303 18.3645 2.74936 16.464C2.63824 16.1647 2.63824 15.8354 2.74936 15.536C3.93153 12.6692 6.01159 10.263 8.67736 8.67868\" stroke=\"currentColor\" strokeWidth=\"2.66667\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/> <path d=\"M2.66663 2.66666L29.3333 29.3333\" stroke=\"currentColor\" strokeWidth=\"2.66667\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/></svg>\n )\n}\nHide.displayName = 'Hide'\n","import * as React from 'react'\nimport type { IconProps } from './types'\n\nexport function Info({ size = 24, ...props }: IconProps) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}><path d=\"M16.0001 29.3333C23.3639 29.3333 29.3334 23.3638 29.3334 16C29.3334 8.63619 23.3639 2.66666 16.0001 2.66666C8.63628 2.66666 2.66675 8.63619 2.66675 16C2.66675 23.3638 8.63628 29.3333 16.0001 29.3333Z\" stroke=\"currentColor\" strokeWidth=\"2.66667\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/> <path d=\"M16 21.3333V16\" stroke=\"currentColor\" strokeWidth=\"2.66667\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/> <path d=\"M16 10.6667H16.0133\" stroke=\"currentColor\" strokeWidth=\"2.66667\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/></svg>\n )\n}\nInfo.displayName = 'Info'\n","import * as React from 'react'\nimport type { IconProps } from './types'\n\nexport function Minus({ size = 24, ...props }: IconProps) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}><path d=\"M6.66663 16H25.3333\" stroke=\"currentColor\" strokeWidth=\"2.66667\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/></svg>\n )\n}\nMinus.displayName = 'Minus'\n","import * as React from 'react'\nimport type { IconProps } from './types'\n\nexport function Search({ size = 24, ...props }: IconProps) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}><path d=\"M14.6667 25.3333C20.5577 25.3333 25.3333 20.5577 25.3333 14.6667C25.3333 8.77563 20.5577 4 14.6667 4C8.77563 4 4 8.77563 4 14.6667C4 20.5577 8.77563 25.3333 14.6667 25.3333Z\" stroke=\"currentColor\" strokeWidth=\"2.66667\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/> <path d=\"M28 28L22.2 22.2\" stroke=\"currentColor\" strokeWidth=\"2.66667\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/></svg>\n )\n}\nSearch.displayName = 'Search'\n","import * as React from 'react'\nimport type { IconProps } from './types'\n\nexport function View({ size = 24, ...props }: IconProps) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}><path d=\"M2.74936 16.464C2.63824 16.1646 2.63824 15.8353 2.74936 15.536C3.83162 12.9118 5.66871 10.668 8.02772 9.08919C10.3867 7.51034 13.1614 6.66748 16 6.66748C18.8386 6.66748 21.6133 7.51034 23.9723 9.08919C26.3313 10.668 28.1684 12.9118 29.2507 15.536C29.3618 15.8353 29.3618 16.1646 29.2507 16.464C28.1684 19.0882 26.3313 21.3319 23.9723 22.9108C21.6133 24.4897 18.8386 25.3325 16 25.3325C13.1614 25.3325 10.3867 24.4897 8.02772 22.9108C5.66871 21.3319 3.83162 19.0882 2.74936 16.464Z\" stroke=\"currentColor\" strokeWidth=\"2.66667\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/> <path d=\"M16 20C18.2091 20 20 18.2091 20 16C20 13.7909 18.2091 12 16 12C13.7909 12 12 13.7909 12 16C12 18.2091 13.7909 20 16 20Z\" stroke=\"currentColor\" strokeWidth=\"2.66667\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/></svg>\n )\n}\nView.displayName = 'View'\n","import * as React from 'react'\nimport type { IconProps } from './types'\n\nexport function XCircle({ size = 24, ...props }: IconProps) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}><path d=\"M16 29.3333C23.3638 29.3333 29.3333 23.3638 29.3333 16C29.3333 8.63616 23.3638 2.66663 16 2.66663C8.63616 2.66663 2.66663 8.63616 2.66663 16C2.66663 23.3638 8.63616 29.3333 16 29.3333Z\" stroke=\"currentColor\" strokeWidth=\"2.66667\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/> <path d=\"M20 12L12 20\" stroke=\"currentColor\" strokeWidth=\"2.66667\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/> <path d=\"M12 12L20 20\" stroke=\"currentColor\" strokeWidth=\"2.66667\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/></svg>\n )\n}\nXCircle.displayName = 'XCircle'\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"]}
|
|
1
|
+
{"version":3,"sources":["../components/utils.ts","../components/button.tsx","../components/icons/arrow-down-2.tsx","../components/icons/arrow-up-2.tsx","../components/icons/check.tsx","../components/icons/chevron-down.tsx","../components/icons/chevron-right.tsx","../components/icons/hide.tsx","../components/icons/info.tsx","../components/icons/minus.tsx","../components/icons/search.tsx","../components/icons/view.tsx","../components/icons/x-circle.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":["twMerge","clsx","cva","React","Slot","jsx","jsxs","React2","React3","React4","React5","React6","React7","React8","React9"],"mappings":"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","file":"index.js","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 type { IconProps } from './types'\n\nexport function ArrowDown2({ size = 24, ...props }: IconProps) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}><path d=\"M22.6667 22.6667L9.33342 22.6667L9.33342 9.33333\" stroke=\"currentColor\" strokeWidth=\"2.67\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/> <path d=\"M22.6667 9.33334L9.33342 22.6667\" stroke=\"currentColor\" strokeWidth=\"2.67\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/></svg>\n )\n}\nArrowDown2.displayName = 'ArrowDown2'\n","import * as React from 'react'\nimport type { IconProps } from './types'\n\nexport function ArrowUp2({ size = 24, ...props }: IconProps) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}><path d=\"M9.33337 9.33333H22.6667V22.6667\" stroke=\"currentColor\" strokeWidth=\"2.67\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/> <path d=\"M9.33337 22.6667L22.6667 9.33333\" stroke=\"currentColor\" strokeWidth=\"2.67\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/></svg>\n )\n}\nArrowUp2.displayName = 'ArrowUp2'\n","import * as React from 'react'\nimport type { IconProps } from './types'\n\nexport function Check({ size = 24, ...props }: IconProps) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}><path d=\"M26.6667 8L12 22.6667L5.33337 16\" stroke=\"currentColor\" strokeWidth=\"2.66667\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/></svg>\n )\n}\nCheck.displayName = 'Check'\n","import * as React from 'react'\nimport type { IconProps } from './types'\n\nexport function ChevronDown({ size = 24, ...props }: IconProps) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}><path d=\"M8 12L16 20L24 12\" stroke=\"currentColor\" strokeWidth=\"2.66667\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/></svg>\n )\n}\nChevronDown.displayName = 'ChevronDown'\n","import * as React from 'react'\nimport type { IconProps } from './types'\n\nexport function ChevronRight({ size = 24, ...props }: IconProps) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}><path d=\"M12 24L20 16L12 8\" stroke=\"currentColor\" strokeWidth=\"2.66667\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/></svg>\n )\n}\nChevronRight.displayName = 'ChevronRight'\n","import * as React from 'react'\nimport type { IconProps } from './types'\n\nexport function Hide({ size = 24, ...props }: IconProps) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}><path d=\"M14.3107 6.768C17.4165 6.39787 20.5581 7.05442 23.2558 8.6374C25.9535 10.2204 28.059 12.6428 29.2507 15.5347C29.3618 15.834 29.3618 16.1633 29.2507 16.4627C28.7607 17.6507 28.1131 18.7673 27.3253 19.7827\" stroke=\"currentColor\" strokeWidth=\"2.66667\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/> <path d=\"M18.7787 18.8773C18.0243 19.606 17.0139 20.0092 15.9651 20C14.9163 19.9909 13.9131 19.5703 13.1715 18.8286C12.4298 18.087 12.0091 17.0837 12 16.0349C11.9909 14.9862 12.3941 13.9758 13.1227 13.2213\" stroke=\"currentColor\" strokeWidth=\"2.66667\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/> <path d=\"M23.3054 23.332C21.5367 24.3797 19.5633 25.0347 17.5192 25.2525C15.475 25.4704 13.408 25.246 11.4582 24.5945C9.50844 23.9431 7.72161 22.8799 6.21897 21.477C4.71633 20.0742 3.53303 18.3645 2.74936 16.464C2.63824 16.1647 2.63824 15.8354 2.74936 15.536C3.93153 12.6692 6.01159 10.263 8.67736 8.67868\" stroke=\"currentColor\" strokeWidth=\"2.66667\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/> <path d=\"M2.66663 2.66666L29.3333 29.3333\" stroke=\"currentColor\" strokeWidth=\"2.66667\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/></svg>\n )\n}\nHide.displayName = 'Hide'\n","import * as React from 'react'\nimport type { IconProps } from './types'\n\nexport function Info({ size = 24, ...props }: IconProps) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}><path d=\"M16.0001 29.3333C23.3639 29.3333 29.3334 23.3638 29.3334 16C29.3334 8.63619 23.3639 2.66666 16.0001 2.66666C8.63628 2.66666 2.66675 8.63619 2.66675 16C2.66675 23.3638 8.63628 29.3333 16.0001 29.3333Z\" stroke=\"currentColor\" strokeWidth=\"2.66667\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/> <path d=\"M16 21.3333V16\" stroke=\"currentColor\" strokeWidth=\"2.66667\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/> <path d=\"M16 10.6667H16.0133\" stroke=\"currentColor\" strokeWidth=\"2.66667\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/></svg>\n )\n}\nInfo.displayName = 'Info'\n","import * as React from 'react'\nimport type { IconProps } from './types'\n\nexport function Minus({ size = 24, ...props }: IconProps) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}><path d=\"M6.66663 16H25.3333\" stroke=\"currentColor\" strokeWidth=\"2.66667\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/></svg>\n )\n}\nMinus.displayName = 'Minus'\n","import * as React from 'react'\nimport type { IconProps } from './types'\n\nexport function Search({ size = 24, ...props }: IconProps) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}><path d=\"M14.6667 25.3333C20.5577 25.3333 25.3333 20.5577 25.3333 14.6667C25.3333 8.77563 20.5577 4 14.6667 4C8.77563 4 4 8.77563 4 14.6667C4 20.5577 8.77563 25.3333 14.6667 25.3333Z\" stroke=\"currentColor\" strokeWidth=\"2.66667\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/> <path d=\"M28 28L22.2 22.2\" stroke=\"currentColor\" strokeWidth=\"2.66667\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/></svg>\n )\n}\nSearch.displayName = 'Search'\n","import * as React from 'react'\nimport type { IconProps } from './types'\n\nexport function View({ size = 24, ...props }: IconProps) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}><path d=\"M2.74936 16.464C2.63824 16.1646 2.63824 15.8353 2.74936 15.536C3.83162 12.9118 5.66871 10.668 8.02772 9.08919C10.3867 7.51034 13.1614 6.66748 16 6.66748C18.8386 6.66748 21.6133 7.51034 23.9723 9.08919C26.3313 10.668 28.1684 12.9118 29.2507 15.536C29.3618 15.8353 29.3618 16.1646 29.2507 16.464C28.1684 19.0882 26.3313 21.3319 23.9723 22.9108C21.6133 24.4897 18.8386 25.3325 16 25.3325C13.1614 25.3325 10.3867 24.4897 8.02772 22.9108C5.66871 21.3319 3.83162 19.0882 2.74936 16.464Z\" stroke=\"currentColor\" strokeWidth=\"2.66667\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/> <path d=\"M16 20C18.2091 20 20 18.2091 20 16C20 13.7909 18.2091 12 16 12C13.7909 12 12 13.7909 12 16C12 18.2091 13.7909 20 16 20Z\" stroke=\"currentColor\" strokeWidth=\"2.66667\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/></svg>\n )\n}\nView.displayName = 'View'\n","import * as React from 'react'\nimport type { IconProps } from './types'\n\nexport function XCircle({ size = 24, ...props }: IconProps) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}><path d=\"M16 29.3333C23.3638 29.3333 29.3333 23.3638 29.3333 16C29.3333 8.63616 23.3638 2.66663 16 2.66663C8.63616 2.66663 2.66663 8.63616 2.66663 16C2.66663 23.3638 8.63616 29.3333 16 29.3333Z\" stroke=\"currentColor\" strokeWidth=\"2.66667\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/> <path d=\"M20 12L12 20\" stroke=\"currentColor\" strokeWidth=\"2.66667\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/> <path d=\"M12 12L20 20\" stroke=\"currentColor\" strokeWidth=\"2.66667\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/></svg>\n )\n}\nXCircle.displayName = 'XCircle'\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-primary,#40CCF2)] text-[var(--color-foreground,#000)]\"\n : \"border-[var(--color-primary,#40CCF2)] 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-primary,#40CCF2)]\",\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-primary,#40CCF2)] focus-visible:ring-offset-2\",\n \"disabled:cursor-not-allowed\",\n currentOn\n ? \"bg-[var(--color-primary,#40CCF2)]\"\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-[13px] font-medium leading-tight\",\n \"[&_svg]:size-3.5\",\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-[22px]\",\n md: \"text-[28px]\",\n lg: \"text-[34px]\",\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-[14px] 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 (left, gray) + trend (right, colored).\n The trend right-aligns under the chevron above. */}\n {(trend !== undefined || trendLabel) && !loading && (\n <div className=\"flex items-center justify-between gap-2\">\n {trendLabel ? (\n <span className=\"font-['Inter'] text-[13px] text-[var(--color-text-tertiary,#6B7280)]\">\n {trendLabel}\n </span>\n ) : <span />}\n {trend !== undefined ? <TrendBadge value={trend} /> : <span />}\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"]}
|
package/dist/index.mjs
CHANGED
|
@@ -263,7 +263,7 @@ var Checkbox = React4.forwardRef(
|
|
|
263
263
|
className: cn(
|
|
264
264
|
"flex h-[18px] w-[18px] shrink-0 items-center justify-center rounded-[6px]",
|
|
265
265
|
"border-[2px] transition-colors duration-[120ms]",
|
|
266
|
-
showCheck || showDash ? "border-transparent bg-[var(--color-
|
|
266
|
+
showCheck || showDash ? "border-transparent bg-[var(--color-primary,#40CCF2)] text-[var(--color-foreground,#000)]" : "border-[var(--color-primary,#40CCF2)] bg-transparent"
|
|
267
267
|
),
|
|
268
268
|
children: [
|
|
269
269
|
showCheck && /* @__PURE__ */ jsx(Check, { size: 12 }),
|
|
@@ -318,7 +318,7 @@ var Radio = React4.forwardRef(
|
|
|
318
318
|
className: cn(
|
|
319
319
|
"flex h-[18px] w-[18px] shrink-0 items-center justify-center rounded-full",
|
|
320
320
|
"border-[2px] bg-transparent transition-colors duration-[120ms]",
|
|
321
|
-
"border-[var(--color-
|
|
321
|
+
"border-[var(--color-primary,#40CCF2)]"
|
|
322
322
|
),
|
|
323
323
|
children: currentChecked && /* @__PURE__ */ jsx("span", { className: "h-[8px] w-[8px] rounded-full bg-[var(--color-foreground,#000)]" })
|
|
324
324
|
}
|
|
@@ -403,9 +403,9 @@ var Toggle = React4.forwardRef(
|
|
|
403
403
|
// track
|
|
404
404
|
"relative inline-flex h-[19px] w-[45px] shrink-0 cursor-pointer rounded-full",
|
|
405
405
|
"border-0 outline-none transition-colors duration-[180ms] ease-[cubic-bezier(0.2,0,0,1)]",
|
|
406
|
-
"focus-visible:ring-2 focus-visible:ring-[var(--color-
|
|
406
|
+
"focus-visible:ring-2 focus-visible:ring-[var(--color-primary,#40CCF2)] focus-visible:ring-offset-2",
|
|
407
407
|
"disabled:cursor-not-allowed",
|
|
408
|
-
currentOn ? "bg-[var(--color-
|
|
408
|
+
currentOn ? "bg-[var(--color-primary,#40CCF2)]" : "bg-[var(--color-inactive,#DEDEDE)]"
|
|
409
409
|
),
|
|
410
410
|
children: /* @__PURE__ */ jsx(
|
|
411
411
|
"span",
|
|
@@ -805,8 +805,8 @@ function TrendBadge({ value, decimals = 1, showArrow = true, className, ...props
|
|
|
805
805
|
{
|
|
806
806
|
className: cn(
|
|
807
807
|
"inline-flex items-center gap-1 whitespace-nowrap select-none",
|
|
808
|
-
"font-['Inter'] text-[
|
|
809
|
-
"[&_svg]:size-3",
|
|
808
|
+
"font-['Inter'] text-[13px] font-medium leading-tight",
|
|
809
|
+
"[&_svg]:size-3.5",
|
|
810
810
|
colorClass,
|
|
811
811
|
className
|
|
812
812
|
),
|
|
@@ -832,9 +832,9 @@ function MetricTile({
|
|
|
832
832
|
as: Tag = "div"
|
|
833
833
|
}) {
|
|
834
834
|
const valueSize = {
|
|
835
|
-
sm: "text-[
|
|
836
|
-
md: "text-[
|
|
837
|
-
lg: "text-[
|
|
835
|
+
sm: "text-[22px]",
|
|
836
|
+
md: "text-[28px]",
|
|
837
|
+
lg: "text-[34px]"
|
|
838
838
|
}[size];
|
|
839
839
|
const padding = {
|
|
840
840
|
sm: "p-3",
|
|
@@ -868,7 +868,7 @@ function MetricTile({
|
|
|
868
868
|
"span",
|
|
869
869
|
{
|
|
870
870
|
className: cn(
|
|
871
|
-
"font-['Inter'] text-[
|
|
871
|
+
"font-['Inter'] text-[14px] font-normal leading-tight",
|
|
872
872
|
"text-[var(--color-text-tertiary,#6B7280)]",
|
|
873
873
|
loading && "h-3 w-24 rounded bg-gray-200"
|
|
874
874
|
),
|
|
@@ -889,9 +889,9 @@ function MetricTile({
|
|
|
889
889
|
children: !loading && value
|
|
890
890
|
}
|
|
891
891
|
),
|
|
892
|
-
(trend !== void 0 || trendLabel) && !loading && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-
|
|
893
|
-
trendLabel
|
|
894
|
-
trend !== void 0
|
|
892
|
+
(trend !== void 0 || trendLabel) && !loading && /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-2", children: [
|
|
893
|
+
trendLabel ? /* @__PURE__ */ jsx("span", { className: "font-['Inter'] text-[13px] text-[var(--color-text-tertiary,#6B7280)]", children: trendLabel }) : /* @__PURE__ */ jsx("span", {}),
|
|
894
|
+
trend !== void 0 ? /* @__PURE__ */ jsx(TrendBadge, { value: trend }) : /* @__PURE__ */ jsx("span", {})
|
|
895
895
|
] }),
|
|
896
896
|
loading && trend !== void 0 && /* @__PURE__ */ jsx("div", { className: "mt-1 h-4 w-16 rounded bg-gray-200" })
|
|
897
897
|
]
|
package/dist/index.mjs.map
CHANGED
|
@@ -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\"\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"]}
|
|
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-primary,#40CCF2)] text-[var(--color-foreground,#000)]\"\n : \"border-[var(--color-primary,#40CCF2)] 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-primary,#40CCF2)]\",\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-primary,#40CCF2)] focus-visible:ring-offset-2\",\n \"disabled:cursor-not-allowed\",\n currentOn\n ? \"bg-[var(--color-primary,#40CCF2)]\"\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-[13px] font-medium leading-tight\",\n \"[&_svg]:size-3.5\",\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-[22px]\",\n md: \"text-[28px]\",\n lg: \"text-[34px]\",\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-[14px] 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 (left, gray) + trend (right, colored).\n The trend right-aligns under the chevron above. */}\n {(trend !== undefined || trendLabel) && !loading && (\n <div className=\"flex items-center justify-between gap-2\">\n {trendLabel ? (\n <span className=\"font-['Inter'] text-[13px] text-[var(--color-text-tertiary,#6B7280)]\">\n {trendLabel}\n </span>\n ) : <span />}\n {trend !== undefined ? <TrendBadge value={trend} /> : <span />}\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"]}
|
package/package.json
CHANGED
package/tokens.css
CHANGED
|
@@ -169,7 +169,7 @@
|
|
|
169
169
|
--color-primary-pressed: var(--p-brand-stable-blue);
|
|
170
170
|
|
|
171
171
|
/* Secondary button */
|
|
172
|
-
--color-secondary: var(--p-brand-teal);
|
|
172
|
+
--color-secondary: var(--p-brand-teal);
|
|
173
173
|
--color-secondary-border: var(--p-brand-teal);
|
|
174
174
|
--color-secondary-foreground: var(--p-brand-teal);
|
|
175
175
|
--color-secondary-hover: rgba(51, 159, 184, 0.08);
|