@exxatdesignux/ui 0.5.0 → 0.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/CHANGELOG.md +47 -0
  2. package/dist/components/data-table/filter-text-value-input.js +1 -1
  3. package/dist/components/data-table/filter-text-value-input.js.map +1 -1
  4. package/dist/components/data-table/index.js +3 -3
  5. package/dist/components/data-table/index.js.map +1 -1
  6. package/dist/components/data-table/pagination.js +3 -3
  7. package/dist/components/data-table/pagination.js.map +1 -1
  8. package/dist/components/data-views/data-row-list.js +1 -1
  9. package/dist/components/data-views/data-row-list.js.map +1 -1
  10. package/dist/components/data-views/hub-table.js +6 -6
  11. package/dist/components/data-views/hub-table.js.map +1 -1
  12. package/dist/components/data-views/index.js +6 -6
  13. package/dist/components/data-views/index.js.map +1 -1
  14. package/dist/components/table-properties/column-row.js +1 -1
  15. package/dist/components/table-properties/column-row.js.map +1 -1
  16. package/dist/components/table-properties/drawer-button.js +5 -5
  17. package/dist/components/table-properties/drawer-button.js.map +1 -1
  18. package/dist/components/table-properties/drawer.js +5 -5
  19. package/dist/components/table-properties/drawer.js.map +1 -1
  20. package/dist/components/table-properties/filter-card.js +2 -2
  21. package/dist/components/table-properties/filter-card.js.map +1 -1
  22. package/dist/components/table-properties/index.js +5 -5
  23. package/dist/components/table-properties/index.js.map +1 -1
  24. package/dist/components/table-properties/sort-card.js +1 -1
  25. package/dist/components/table-properties/sort-card.js.map +1 -1
  26. package/dist/components/templates/index.js +4 -4
  27. package/dist/components/templates/index.js.map +1 -1
  28. package/dist/components/templates/list-page.js +4 -4
  29. package/dist/components/templates/list-page.js.map +1 -1
  30. package/dist/components/ui/banner.js +1 -1
  31. package/dist/components/ui/banner.js.map +1 -1
  32. package/dist/components/ui/coach-mark.js +1 -1
  33. package/dist/components/ui/coach-mark.js.map +1 -1
  34. package/dist/components/ui/context-menu.js +1 -1
  35. package/dist/components/ui/context-menu.js.map +1 -1
  36. package/dist/components/ui/date-picker-field.js +1 -1
  37. package/dist/components/ui/date-picker-field.js.map +1 -1
  38. package/dist/components/ui/dropdown-menu.js +2 -2
  39. package/dist/components/ui/dropdown-menu.js.map +1 -1
  40. package/dist/components/ui/export-drawer.js +3 -3
  41. package/dist/components/ui/export-drawer.js.map +1 -1
  42. package/dist/components/ui/hover-card.js +1 -1
  43. package/dist/components/ui/hover-card.js.map +1 -1
  44. package/dist/components/ui/key-metrics.js +6 -6
  45. package/dist/components/ui/key-metrics.js.map +1 -1
  46. package/dist/components/ui/page-header.js +1 -1
  47. package/dist/components/ui/page-header.js.map +1 -1
  48. package/dist/components/ui/popover.js +1 -1
  49. package/dist/components/ui/popover.js.map +1 -1
  50. package/dist/components/ui/select.js +1 -1
  51. package/dist/components/ui/select.js.map +1 -1
  52. package/dist/components/ui/sheet.js +1 -1
  53. package/dist/components/ui/sheet.js.map +1 -1
  54. package/dist/components/ui/sidebar.d.ts +1 -1
  55. package/dist/components/ui/sidebar.js +3 -3
  56. package/dist/components/ui/sidebar.js.map +1 -1
  57. package/dist/components/ui/tip.js +1 -1
  58. package/dist/components/ui/tip.js.map +1 -1
  59. package/dist/components/ui/tooltip.js +1 -1
  60. package/dist/components/ui/tooltip.js.map +1 -1
  61. package/dist/components/ui/view-segmented-control.js +1 -1
  62. package/dist/components/ui/view-segmented-control.js.map +1 -1
  63. package/dist/index.js +16 -16
  64. package/dist/index.js.map +1 -1
  65. package/package.json +1 -1
  66. package/src/components/data-views/data-row-list.tsx +1 -1
  67. package/src/components/ui/banner.tsx +0 -2
  68. package/src/components/ui/coach-mark.tsx +1 -2
  69. package/src/components/ui/context-menu.tsx +1 -1
  70. package/src/components/ui/dropdown-menu.tsx +2 -2
  71. package/src/components/ui/hover-card.tsx +1 -1
  72. package/src/components/ui/key-metrics.tsx +4 -4
  73. package/src/components/ui/popover.tsx +1 -1
  74. package/src/components/ui/select.tsx +1 -1
  75. package/src/components/ui/sheet.tsx +1 -1
  76. package/src/components/ui/sidebar.tsx +3 -3
  77. package/src/components/ui/tooltip.tsx +1 -1
  78. package/template/package.json +10 -0
  79. package/tokens/hooks-index.json +2 -2
@@ -84,7 +84,7 @@ function TooltipContent({
84
84
  "data-slot": "tooltip-content",
85
85
  sideOffset,
86
86
  className: cn(
87
- "z-50 inline-flex w-fit max-w-xs origin-(--radix-tooltip-content-transform-origin) items-center gap-1.5 rounded-md bg-foreground px-3 py-1.5 text-xs text-background has-data-[slot=kbd]:pe-1.5 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 **:data-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-50 **:data-[slot=kbd]:rounded-sm data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
87
+ "z-50 inline-flex w-fit max-w-xs origin-(--radix-tooltip-content-transform-origin) items-center gap-1.5 rounded-md bg-foreground px-3 py-1.5 text-xs text-background has-data-[slot=kbd]:pe-1.5 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-end-2 data-[side=right]:slide-in-from-start-2 data-[side=top]:slide-in-from-bottom-2 **:data-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-50 **:data-[slot=kbd]:rounded-sm data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
88
88
  className
89
89
  ),
90
90
  ...props,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/utils.ts","../../../src/components/ui/button.tsx","../../../src/components/ui/tooltip.tsx","../../../src/components/ui/tip.tsx","../../../src/components/ui/banner.tsx"],"names":["React","jsx","TooltipPrimitive","jsxs","cva"],"mappings":"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","file":"banner.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 { cva, type VariantProps } from \"class-variance-authority\"\nimport { Slot } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst buttonVariants = cva(\n \"group/button inline-flex shrink-0 cursor-pointer items-center justify-center rounded-md border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/80\",\n outline:\n \"border-input bg-background hover:bg-interactive-hover hover:text-interactive-hover-foreground aria-expanded:bg-interactive-hover aria-expanded:text-interactive-hover-foreground dark:bg-input/15 dark:hover:bg-input/25\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground\",\n ghost:\n \"hover:bg-interactive-hover hover:text-interactive-hover-foreground aria-expanded:bg-interactive-hover aria-expanded:text-interactive-hover-foreground dark:hover:bg-interactive-hover-subtle\",\n destructive:\n \"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default:\n \"h-9 gap-1.5 px-3 has-data-[icon=inline-end]:pe-2.5 has-data-[icon=inline-start]:ps-2.5\",\n xs: \"h-6 gap-1 px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pe-1.5 has-data-[icon=inline-start]:ps-1.5 [&_svg:not([class*='size-'])]:size-3\",\n sm: \"h-8 gap-1 px-3 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pe-2 has-data-[icon=inline-start]:ps-2 [&_svg:not([class*='size-'])]:size-3.5\",\n lg: \"h-10 gap-1.5 px-4 has-data-[icon=inline-end]:pe-3.5 has-data-[icon=inline-start]:ps-3.5\",\n icon: \"size-9\",\n \"icon-xs\":\n \"size-6 in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3\",\n \"icon-sm\":\n \"size-8 in-data-[slot=button-group]:rounded-lg\",\n \"icon-lg\": \"size-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nconst Button = React.forwardRef<\n HTMLButtonElement,\n React.ComponentProps<\"button\"> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean\n }\n>(({ className, variant = \"default\", size = \"default\", asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot.Root : \"button\"\n\n return (\n <Comp\n ref={ref}\n data-slot=\"button\"\n data-variant={variant}\n data-size={size}\n className={cn(buttonVariants({ variant, size }), className)}\n {...props}\n />\n )\n})\nButton.displayName = \"Button\"\n\nexport { Button, buttonVariants }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Tooltip as TooltipPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction TooltipProvider({\n delayDuration = 0,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n return (\n <TooltipPrimitive.Provider\n data-slot=\"tooltip-provider\"\n delayDuration={delayDuration}\n {...props}\n />\n )\n}\n\nfunction Tooltip({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n return <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\n}\n\nfunction TooltipTrigger({\n className,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n return (\n <TooltipPrimitive.Trigger\n data-slot=\"tooltip-trigger\"\n suppressHydrationWarning\n className={cn(\"cursor-pointer\", className)}\n {...props}\n />\n )\n}\n\nfunction TooltipContent({\n className,\n sideOffset = 0,\n children,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\n \"z-50 inline-flex w-fit max-w-xs origin-(--radix-tooltip-content-transform-origin) items-center gap-1.5 rounded-md bg-foreground px-3 py-1.5 text-xs text-background has-data-[slot=kbd]:pe-1.5 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 **:data-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-50 **:data-[slot=kbd]:rounded-sm data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n className\n )}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow className=\"z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px] bg-foreground fill-foreground\" />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n )\n}\n\nexport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger }\n","\"use client\"\nimport * as React from \"react\"\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"./tooltip\"\n\ninterface TipProps {\n /** Plain string or text + `<Kbd />` — see `.cursor/rules/exxat-kbd-shortcuts.mdc` */\n label: React.ReactNode\n children: React.ReactNode\n side?: \"top\" | \"bottom\" | \"left\" | \"right\"\n}\n\nexport function Tip({ label, children, side = \"top\" }: TipProps) {\n return (\n <Tooltip>\n <TooltipTrigger asChild>{children}</TooltipTrigger>\n <TooltipContent side={side} className=\"flex flex-wrap items-center gap-1.5\">\n {label}\n </TooltipContent>\n </Tooltip>\n )\n}\n","\"use client\"\n\n/**\n * Banner — two types of banner for system-level and local-level messaging.\n *\n * 1. SystemBanner: full-width strip at the very top of the app (above sidebar).\n * Used for maintenance notices, feature promotions, global alerts.\n *\n * 2. LocalBanner: inline alert within a page section.\n * Used for page-specific errors, warnings, and informational messages.\n *\n * Both support: info, warning, error, success, and promo variants.\n * Both are dismissible and accessible (role=\"alert\" / role=\"status\").\n */\n\nimport * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"../../lib/utils\"\nimport { Button } from \"./button\"\nimport { Tip } from \"./tip\"\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Variant definitions\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst VARIANT_CONFIG = {\n info: {\n icon: \"fa-circle-info\",\n prefix: \"fa-light\",\n role: \"status\" as const,\n live: \"polite\" as const,\n },\n warning: {\n icon: \"fa-triangle-exclamation\",\n prefix: \"fa-light\",\n role: \"alert\" as const,\n live: \"assertive\" as const,\n },\n error: {\n icon: \"fa-circle-exclamation\",\n prefix: \"fa-light\",\n role: \"alert\" as const,\n live: \"assertive\" as const,\n },\n success: {\n icon: \"fa-circle-check\",\n prefix: \"fa-light\",\n role: \"status\" as const,\n live: \"polite\" as const,\n },\n promo: {\n icon: \"fa-star-christmas text-brand\",\n prefix: \"fa-duotone fa-solid\",\n role: \"status\" as const,\n live: \"polite\" as const,\n },\n}\n\ntype BannerVariant = keyof typeof VARIANT_CONFIG\n\n// ─────────────────────────────────────────────────────────────────────────────\n// SystemBanner — inline at the top of the main content area\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst systemBannerVariants = cva(\n // No `overflow-hidden` on root — it clips promo `boxShadow` (glow). Clip `decorativeOverlay` in a nested layer instead.\n \"relative isolate flex rounded-lg border text-sm transition-all\",\n {\n variants: {\n variant: {\n /* Prominent defaults — darker shells + light foreground copy for ≥4.5:1 on the fill. */\n info: \"bg-blue-900 text-blue-50 border-blue-950/35 dark:bg-blue-950 dark:text-blue-50 dark:border-blue-900/60\",\n warning: \"bg-amber-900 text-amber-50 border-amber-950/35 dark:bg-amber-950 dark:text-amber-50 dark:border-amber-900/60\",\n error: \"bg-red-900 text-red-50 border-red-950/35 dark:bg-red-950 dark:text-red-50 dark:border-red-900/60\",\n success: \"bg-emerald-900 text-emerald-50 border-emerald-950/35 dark:bg-emerald-950 dark:text-emerald-50 dark:border-emerald-900/60\",\n promo: \"bg-gradient-to-r from-brand/14 via-brand/8 to-brand/5 text-foreground border-brand/22 dark:from-brand/20 dark:via-brand/12 dark:to-brand/7 dark:border-brand/26\",\n },\n /** Emphasis — \"prominent\" uses dark solid fills; \"subtle\" uses soft tinted bg. */\n emphasis: {\n prominent: \"\",\n subtle: \"\",\n },\n /** Action placement: \"inline\" puts the action to the right; \"bottom\" puts it below the text */\n actionPosition: {\n // flex-wrap so the action button drops to a second line at 200%+ zoom instead of overflowing\n inline: \"flex-wrap items-center gap-3 px-4 py-2.5\",\n bottom: \"flex-col gap-2 px-4 py-3\",\n },\n },\n compoundVariants: [\n { emphasis: \"subtle\", variant: \"info\", class: \"bg-blue-500/5 text-blue-800 border-blue-500/30 dark:bg-blue-500/10 dark:text-blue-200 dark:border-blue-500/20\" },\n { emphasis: \"subtle\", variant: \"warning\", class: \"bg-amber-500/5 text-amber-800 border-amber-500/30 dark:bg-amber-500/10 dark:text-amber-200 dark:border-amber-500/20\" },\n { emphasis: \"subtle\", variant: \"error\", class: \"bg-red-500/5 text-red-800 border-red-500/30 dark:bg-red-500/10 dark:text-red-200 dark:border-red-500/20\" },\n { emphasis: \"subtle\", variant: \"success\", class: \"bg-emerald-500/5 text-emerald-800 border-emerald-500/30 dark:bg-emerald-500/10 dark:text-emerald-200 dark:border-emerald-500/20\" },\n { emphasis: \"subtle\", variant: \"promo\", class: \"bg-brand/5 text-foreground border-brand/30 dark:bg-brand/10 dark:border-brand/20\" },\n ],\n defaultVariants: { variant: \"info\", emphasis: \"prominent\", actionPosition: \"inline\" },\n }\n)\n\nexport interface SystemBannerProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof systemBannerVariants> {\n /** Banner title (optional — adds a bold heading) */\n title?: string\n /** The banner message */\n children: React.ReactNode\n /** Whether the banner can be dismissed */\n dismissible?: boolean\n /** Callback when dismissed */\n onDismiss?: () => void\n /** Optional action — renders as a link-style button. Use href for server components, onClick for client. */\n action?: {\n label: string\n href?: string\n onClick?: () => void\n }\n /** Where to place the action: \"inline\" (right side) or \"bottom\" (below text) */\n actionPosition?: \"inline\" | \"bottom\"\n /** Override the default icon */\n icon?: string\n /** Optional absolutely-positioned decorative layer (e.g. `<AiThinkingOverlay />`). */\n decorativeOverlay?: React.ReactNode\n}\n\nexport function SystemBanner({\n children,\n title,\n variant = \"info\",\n emphasis = \"prominent\",\n dismissible = true,\n onDismiss,\n action,\n actionPosition = \"inline\",\n icon,\n decorativeOverlay,\n className,\n style,\n ...props\n}: SystemBannerProps) {\n const [dismissed, setDismissed] = React.useState(false)\n const config = VARIANT_CONFIG[variant ?? \"info\"]\n\n function handleDismiss() {\n setDismissed(true)\n onDismiss?.()\n }\n\n if (dismissed) return null\n\n const actionEl = action && (\n action.href ? (\n <a\n href={action.href}\n className=\"inline-flex shrink-0 items-center gap-1 text-xs font-semibold underline underline-offset-2 hover:no-underline\"\n suppressHydrationWarning\n >\n {action.label}\n <i className=\"fa-light fa-arrow-right text-xs\" aria-hidden=\"true\" />\n </a>\n ) : (\n <Button\n size=\"xs\"\n variant=\"link\"\n onClick={action.onClick}\n className=\"h-auto shrink-0 px-0 text-xs font-semibold underline underline-offset-2 hover:no-underline\"\n >\n {action.label}\n <i className=\"fa-light fa-arrow-right text-xs ms-0.5\" aria-hidden=\"true\" />\n </Button>\n )\n )\n\n /** Outside-only brand halo (no inset fill — glow does not paint inside the banner). */\n const promoOuterShadow =\n emphasis === \"subtle\"\n ? \"0 10px 36px -6px oklch(from var(--brand-color) l c h / 0.2), 0 2px 12px -4px oklch(from var(--brand-color) l c h / 0.12)\"\n : \"0 14px 48px -8px oklch(from var(--brand-color) l c h / 0.26), 0 4px 18px -4px oklch(from var(--brand-color) l c h / 0.16)\"\n\n return (\n <div\n role={config.role}\n aria-live={config.live}\n className={cn(systemBannerVariants({ variant, emphasis, actionPosition }), className)}\n style={{\n ...(variant === \"promo\" ? { boxShadow: promoOuterShadow } : null),\n ...style,\n }}\n suppressHydrationWarning\n {...props}\n >\n {decorativeOverlay ? (\n <div\n className=\"pointer-events-none absolute inset-0 z-0 overflow-hidden rounded-lg\"\n aria-hidden\n >\n {decorativeOverlay}\n </div>\n ) : null}\n {/* Icon */}\n <i\n className={cn(\n config.prefix,\n icon ?? config.icon,\n \"relative z-[1] shrink-0 text-[14px]\",\n actionPosition === \"bottom\" ? \"mt-0.5\" : \"\",\n )}\n aria-hidden=\"true\"\n />\n\n {/* Content + inline action */}\n {actionPosition === \"inline\" ? (\n <>\n <div className=\"relative z-[1] min-w-0 flex-1\">\n {title && <span className=\"font-semibold me-1.5\">{title}</span>}\n <span className=\"opacity-90\">{children}</span>\n </div>\n {actionEl ? <span className=\"relative z-[1] inline-flex shrink-0\">{actionEl}</span> : null}\n </>\n ) : (\n <div className=\"relative z-[1] min-w-0 flex-1\">\n {title && <p className=\"font-semibold leading-tight mb-0.5\">{title}</p>}\n <p className=\"opacity-90 leading-relaxed\">{children}</p>\n {actionEl && <div className=\"mt-1.5\">{actionEl}</div>}\n </div>\n )}\n\n {/* Dismiss */}\n {dismissible && (\n <Tip label=\"Dismiss\" side=\"bottom\">\n <button\n type=\"button\"\n aria-label=\"Dismiss banner\"\n onClick={handleDismiss}\n className={cn(\n \"relative z-[2] inline-flex size-5 shrink-0 items-center justify-center rounded transition-colors\",\n actionPosition === \"bottom\" ? \"absolute top-2.5 right-2.5\" : \"\",\n \"hover:bg-current/10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n )}\n >\n <i className=\"fa-light fa-xmark text-xs\" aria-hidden=\"true\" />\n </button>\n </Tip>\n )}\n </div>\n )\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// LocalBanner — inline, within page sections\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst localBannerVariants = cva(\n \"flex items-start gap-3 rounded-lg border px-4 py-3 text-sm transition-all\",\n {\n variants: {\n variant: {\n info: \"border-blue-500/30 bg-blue-500/5 text-blue-800 dark:bg-blue-500/10 dark:text-blue-200 dark:border-blue-500/20\",\n warning: \"border-amber-500/30 bg-amber-500/5 text-amber-800 dark:bg-amber-500/10 dark:text-amber-200 dark:border-amber-500/20\",\n error: \"border-red-500/30 bg-red-500/5 text-red-800 dark:bg-red-500/10 dark:text-red-200 dark:border-red-500/20\",\n success: \"border-emerald-500/30 bg-emerald-500/5 text-emerald-800 dark:bg-emerald-500/10 dark:text-emerald-200 dark:border-emerald-500/20\",\n promo: \"border-brand/30 bg-brand/5 text-foreground dark:bg-brand/10 dark:border-brand/20\",\n },\n },\n defaultVariants: { variant: \"info\" },\n }\n)\n\nexport interface LocalBannerProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof localBannerVariants> {\n /** Banner title (optional) */\n title?: string\n /** Banner message */\n children: React.ReactNode\n /** Whether the banner can be dismissed */\n dismissible?: boolean\n /** Callback when dismissed */\n onDismiss?: () => void\n /** Optional action — renders as link (href) or button (onClick) */\n action?: {\n label: string\n href?: string\n onClick?: () => void\n }\n /** Optional retry action for error states */\n retry?: {\n label?: string\n onClick: () => void\n }\n /** Override the default icon */\n icon?: string\n}\n\nexport function LocalBanner({\n children,\n title,\n variant = \"info\",\n dismissible = false,\n onDismiss,\n action,\n retry,\n icon,\n className,\n ...props\n}: LocalBannerProps) {\n const [dismissed, setDismissed] = React.useState(false)\n const config = VARIANT_CONFIG[variant ?? \"info\"]\n\n function handleDismiss() {\n setDismissed(true)\n onDismiss?.()\n }\n\n if (dismissed) return null\n\n return (\n <div\n role={config.role}\n aria-live={config.live}\n className={cn(localBannerVariants({ variant }), className)}\n {...props}\n >\n {/* Icon */}\n <i\n className={cn(config.prefix, icon ?? config.icon, \"text-[15px] shrink-0 mt-0.5\")}\n aria-hidden=\"true\"\n />\n\n {/* Content */}\n <div className=\"flex-1 min-w-0\">\n {title && (\n <p className=\"font-semibold leading-tight mb-0.5\">{title}</p>\n )}\n <div className=\"text-sm leading-relaxed opacity-90\">{children}</div>\n\n {/* Actions */}\n {(action || retry) && (\n <div className=\"flex items-center gap-2 mt-2.5\">\n {retry && (\n <Button size=\"xs\" variant=\"outline\" onClick={retry.onClick}>\n <i className=\"fa-light fa-arrow-rotate-right text-xs\" aria-hidden=\"true\" />\n {retry.label ?? \"Retry\"}\n </Button>\n )}\n {action && (\n action.href ? (\n <a href={action.href} className=\"inline-flex items-center gap-1 text-xs font-semibold underline underline-offset-2 hover:no-underline\">\n {action.label} <i className=\"fa-light fa-arrow-right text-xs\" aria-hidden=\"true\" />\n </a>\n ) : (\n <Button size=\"xs\" variant=\"outline\" onClick={action.onClick}>\n {action.label}\n </Button>\n )\n )}\n </div>\n )}\n </div>\n\n {/* Dismiss */}\n {dismissible && (\n <Tip label=\"Dismiss\" side=\"left\">\n <button\n type=\"button\"\n aria-label=\"Dismiss\"\n onClick={handleDismiss}\n className={cn(\n \"inline-flex items-center justify-center size-5 rounded transition-colors shrink-0\",\n \"hover:bg-current/10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n )}\n >\n <i className=\"fa-light fa-xmark text-xs\" aria-hidden=\"true\" />\n </button>\n </Tip>\n )}\n </div>\n )\n}\n"]}
1
+ {"version":3,"sources":["../../../src/lib/utils.ts","../../../src/components/ui/button.tsx","../../../src/components/ui/tooltip.tsx","../../../src/components/ui/tip.tsx","../../../src/components/ui/banner.tsx"],"names":["React","jsx","TooltipPrimitive","jsxs","cva"],"mappings":"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","file":"banner.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 { cva, type VariantProps } from \"class-variance-authority\"\nimport { Slot } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst buttonVariants = cva(\n \"group/button inline-flex shrink-0 cursor-pointer items-center justify-center rounded-md border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/80\",\n outline:\n \"border-input bg-background hover:bg-interactive-hover hover:text-interactive-hover-foreground aria-expanded:bg-interactive-hover aria-expanded:text-interactive-hover-foreground dark:bg-input/15 dark:hover:bg-input/25\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground\",\n ghost:\n \"hover:bg-interactive-hover hover:text-interactive-hover-foreground aria-expanded:bg-interactive-hover aria-expanded:text-interactive-hover-foreground dark:hover:bg-interactive-hover-subtle\",\n destructive:\n \"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default:\n \"h-9 gap-1.5 px-3 has-data-[icon=inline-end]:pe-2.5 has-data-[icon=inline-start]:ps-2.5\",\n xs: \"h-6 gap-1 px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pe-1.5 has-data-[icon=inline-start]:ps-1.5 [&_svg:not([class*='size-'])]:size-3\",\n sm: \"h-8 gap-1 px-3 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pe-2 has-data-[icon=inline-start]:ps-2 [&_svg:not([class*='size-'])]:size-3.5\",\n lg: \"h-10 gap-1.5 px-4 has-data-[icon=inline-end]:pe-3.5 has-data-[icon=inline-start]:ps-3.5\",\n icon: \"size-9\",\n \"icon-xs\":\n \"size-6 in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3\",\n \"icon-sm\":\n \"size-8 in-data-[slot=button-group]:rounded-lg\",\n \"icon-lg\": \"size-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nconst Button = React.forwardRef<\n HTMLButtonElement,\n React.ComponentProps<\"button\"> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean\n }\n>(({ className, variant = \"default\", size = \"default\", asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot.Root : \"button\"\n\n return (\n <Comp\n ref={ref}\n data-slot=\"button\"\n data-variant={variant}\n data-size={size}\n className={cn(buttonVariants({ variant, size }), className)}\n {...props}\n />\n )\n})\nButton.displayName = \"Button\"\n\nexport { Button, buttonVariants }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Tooltip as TooltipPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction TooltipProvider({\n delayDuration = 0,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n return (\n <TooltipPrimitive.Provider\n data-slot=\"tooltip-provider\"\n delayDuration={delayDuration}\n {...props}\n />\n )\n}\n\nfunction Tooltip({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n return <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\n}\n\nfunction TooltipTrigger({\n className,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n return (\n <TooltipPrimitive.Trigger\n data-slot=\"tooltip-trigger\"\n suppressHydrationWarning\n className={cn(\"cursor-pointer\", className)}\n {...props}\n />\n )\n}\n\nfunction TooltipContent({\n className,\n sideOffset = 0,\n children,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\n \"z-50 inline-flex w-fit max-w-xs origin-(--radix-tooltip-content-transform-origin) items-center gap-1.5 rounded-md bg-foreground px-3 py-1.5 text-xs text-background has-data-[slot=kbd]:pe-1.5 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-end-2 data-[side=right]:slide-in-from-start-2 data-[side=top]:slide-in-from-bottom-2 **:data-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-50 **:data-[slot=kbd]:rounded-sm data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n className\n )}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow className=\"z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px] bg-foreground fill-foreground\" />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n )\n}\n\nexport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger }\n","\"use client\"\nimport * as React from \"react\"\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"./tooltip\"\n\ninterface TipProps {\n /** Plain string or text + `<Kbd />` — see `.cursor/rules/exxat-kbd-shortcuts.mdc` */\n label: React.ReactNode\n children: React.ReactNode\n side?: \"top\" | \"bottom\" | \"left\" | \"right\"\n}\n\nexport function Tip({ label, children, side = \"top\" }: TipProps) {\n return (\n <Tooltip>\n <TooltipTrigger asChild>{children}</TooltipTrigger>\n <TooltipContent side={side} className=\"flex flex-wrap items-center gap-1.5\">\n {label}\n </TooltipContent>\n </Tooltip>\n )\n}\n","\"use client\"\n\n/**\n * Banner — two types of banner for system-level and local-level messaging.\n *\n * 1. SystemBanner: full-width strip at the very top of the app (above sidebar).\n * Used for maintenance notices, feature promotions, global alerts.\n *\n * 2. LocalBanner: inline alert within a page section.\n * Used for page-specific errors, warnings, and informational messages.\n *\n * Both support: info, warning, error, success, and promo variants.\n * Both are dismissible and accessible (role=\"alert\" / role=\"status\").\n */\n\nimport * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"../../lib/utils\"\nimport { Button } from \"./button\"\nimport { Tip } from \"./tip\"\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Variant definitions\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst VARIANT_CONFIG = {\n info: {\n icon: \"fa-circle-info\",\n prefix: \"fa-light\",\n role: \"status\" as const,\n live: \"polite\" as const,\n },\n warning: {\n icon: \"fa-triangle-exclamation\",\n prefix: \"fa-light\",\n role: \"alert\" as const,\n live: \"assertive\" as const,\n },\n error: {\n icon: \"fa-circle-exclamation\",\n prefix: \"fa-light\",\n role: \"alert\" as const,\n live: \"assertive\" as const,\n },\n success: {\n icon: \"fa-circle-check\",\n prefix: \"fa-light\",\n role: \"status\" as const,\n live: \"polite\" as const,\n },\n promo: {\n icon: \"fa-star-christmas text-brand\",\n prefix: \"fa-duotone fa-solid\",\n role: \"status\" as const,\n live: \"polite\" as const,\n },\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// SystemBanner — inline at the top of the main content area\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst systemBannerVariants = cva(\n // No `overflow-hidden` on root — it clips promo `boxShadow` (glow). Clip `decorativeOverlay` in a nested layer instead.\n \"relative isolate flex rounded-lg border text-sm transition-all\",\n {\n variants: {\n variant: {\n /* Prominent defaults — darker shells + light foreground copy for ≥4.5:1 on the fill. */\n info: \"bg-blue-900 text-blue-50 border-blue-950/35 dark:bg-blue-950 dark:text-blue-50 dark:border-blue-900/60\",\n warning: \"bg-amber-900 text-amber-50 border-amber-950/35 dark:bg-amber-950 dark:text-amber-50 dark:border-amber-900/60\",\n error: \"bg-red-900 text-red-50 border-red-950/35 dark:bg-red-950 dark:text-red-50 dark:border-red-900/60\",\n success: \"bg-emerald-900 text-emerald-50 border-emerald-950/35 dark:bg-emerald-950 dark:text-emerald-50 dark:border-emerald-900/60\",\n promo: \"bg-gradient-to-r from-brand/14 via-brand/8 to-brand/5 text-foreground border-brand/22 dark:from-brand/20 dark:via-brand/12 dark:to-brand/7 dark:border-brand/26\",\n },\n /** Emphasis — \"prominent\" uses dark solid fills; \"subtle\" uses soft tinted bg. */\n emphasis: {\n prominent: \"\",\n subtle: \"\",\n },\n /** Action placement: \"inline\" puts the action to the right; \"bottom\" puts it below the text */\n actionPosition: {\n // flex-wrap so the action button drops to a second line at 200%+ zoom instead of overflowing\n inline: \"flex-wrap items-center gap-3 px-4 py-2.5\",\n bottom: \"flex-col gap-2 px-4 py-3\",\n },\n },\n compoundVariants: [\n { emphasis: \"subtle\", variant: \"info\", class: \"bg-blue-500/5 text-blue-800 border-blue-500/30 dark:bg-blue-500/10 dark:text-blue-200 dark:border-blue-500/20\" },\n { emphasis: \"subtle\", variant: \"warning\", class: \"bg-amber-500/5 text-amber-800 border-amber-500/30 dark:bg-amber-500/10 dark:text-amber-200 dark:border-amber-500/20\" },\n { emphasis: \"subtle\", variant: \"error\", class: \"bg-red-500/5 text-red-800 border-red-500/30 dark:bg-red-500/10 dark:text-red-200 dark:border-red-500/20\" },\n { emphasis: \"subtle\", variant: \"success\", class: \"bg-emerald-500/5 text-emerald-800 border-emerald-500/30 dark:bg-emerald-500/10 dark:text-emerald-200 dark:border-emerald-500/20\" },\n { emphasis: \"subtle\", variant: \"promo\", class: \"bg-brand/5 text-foreground border-brand/30 dark:bg-brand/10 dark:border-brand/20\" },\n ],\n defaultVariants: { variant: \"info\", emphasis: \"prominent\", actionPosition: \"inline\" },\n }\n)\n\nexport interface SystemBannerProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof systemBannerVariants> {\n /** Banner title (optional — adds a bold heading) */\n title?: string\n /** The banner message */\n children: React.ReactNode\n /** Whether the banner can be dismissed */\n dismissible?: boolean\n /** Callback when dismissed */\n onDismiss?: () => void\n /** Optional action — renders as a link-style button. Use href for server components, onClick for client. */\n action?: {\n label: string\n href?: string\n onClick?: () => void\n }\n /** Where to place the action: \"inline\" (right side) or \"bottom\" (below text) */\n actionPosition?: \"inline\" | \"bottom\"\n /** Override the default icon */\n icon?: string\n /** Optional absolutely-positioned decorative layer (e.g. `<AiThinkingOverlay />`). */\n decorativeOverlay?: React.ReactNode\n}\n\nexport function SystemBanner({\n children,\n title,\n variant = \"info\",\n emphasis = \"prominent\",\n dismissible = true,\n onDismiss,\n action,\n actionPosition = \"inline\",\n icon,\n decorativeOverlay,\n className,\n style,\n ...props\n}: SystemBannerProps) {\n const [dismissed, setDismissed] = React.useState(false)\n const config = VARIANT_CONFIG[variant ?? \"info\"]\n\n function handleDismiss() {\n setDismissed(true)\n onDismiss?.()\n }\n\n if (dismissed) return null\n\n const actionEl = action && (\n action.href ? (\n <a\n href={action.href}\n className=\"inline-flex shrink-0 items-center gap-1 text-xs font-semibold underline underline-offset-2 hover:no-underline\"\n suppressHydrationWarning\n >\n {action.label}\n <i className=\"fa-light fa-arrow-right text-xs\" aria-hidden=\"true\" />\n </a>\n ) : (\n <Button\n size=\"xs\"\n variant=\"link\"\n onClick={action.onClick}\n className=\"h-auto shrink-0 px-0 text-xs font-semibold underline underline-offset-2 hover:no-underline\"\n >\n {action.label}\n <i className=\"fa-light fa-arrow-right text-xs ms-0.5\" aria-hidden=\"true\" />\n </Button>\n )\n )\n\n /** Outside-only brand halo (no inset fill — glow does not paint inside the banner). */\n const promoOuterShadow =\n emphasis === \"subtle\"\n ? \"0 10px 36px -6px oklch(from var(--brand-color) l c h / 0.2), 0 2px 12px -4px oklch(from var(--brand-color) l c h / 0.12)\"\n : \"0 14px 48px -8px oklch(from var(--brand-color) l c h / 0.26), 0 4px 18px -4px oklch(from var(--brand-color) l c h / 0.16)\"\n\n return (\n <div\n role={config.role}\n aria-live={config.live}\n className={cn(systemBannerVariants({ variant, emphasis, actionPosition }), className)}\n style={{\n ...(variant === \"promo\" ? { boxShadow: promoOuterShadow } : null),\n ...style,\n }}\n suppressHydrationWarning\n {...props}\n >\n {decorativeOverlay ? (\n <div\n className=\"pointer-events-none absolute inset-0 z-0 overflow-hidden rounded-lg\"\n aria-hidden\n >\n {decorativeOverlay}\n </div>\n ) : null}\n {/* Icon */}\n <i\n className={cn(\n config.prefix,\n icon ?? config.icon,\n \"relative z-[1] shrink-0 text-[14px]\",\n actionPosition === \"bottom\" ? \"mt-0.5\" : \"\",\n )}\n aria-hidden=\"true\"\n />\n\n {/* Content + inline action */}\n {actionPosition === \"inline\" ? (\n <>\n <div className=\"relative z-[1] min-w-0 flex-1\">\n {title && <span className=\"font-semibold me-1.5\">{title}</span>}\n <span className=\"opacity-90\">{children}</span>\n </div>\n {actionEl ? <span className=\"relative z-[1] inline-flex shrink-0\">{actionEl}</span> : null}\n </>\n ) : (\n <div className=\"relative z-[1] min-w-0 flex-1\">\n {title && <p className=\"font-semibold leading-tight mb-0.5\">{title}</p>}\n <p className=\"opacity-90 leading-relaxed\">{children}</p>\n {actionEl && <div className=\"mt-1.5\">{actionEl}</div>}\n </div>\n )}\n\n {/* Dismiss */}\n {dismissible && (\n <Tip label=\"Dismiss\" side=\"bottom\">\n <button\n type=\"button\"\n aria-label=\"Dismiss banner\"\n onClick={handleDismiss}\n className={cn(\n \"relative z-[2] inline-flex size-5 shrink-0 items-center justify-center rounded transition-colors\",\n actionPosition === \"bottom\" ? \"absolute top-2.5 right-2.5\" : \"\",\n \"hover:bg-current/10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n )}\n >\n <i className=\"fa-light fa-xmark text-xs\" aria-hidden=\"true\" />\n </button>\n </Tip>\n )}\n </div>\n )\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// LocalBanner — inline, within page sections\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst localBannerVariants = cva(\n \"flex items-start gap-3 rounded-lg border px-4 py-3 text-sm transition-all\",\n {\n variants: {\n variant: {\n info: \"border-blue-500/30 bg-blue-500/5 text-blue-800 dark:bg-blue-500/10 dark:text-blue-200 dark:border-blue-500/20\",\n warning: \"border-amber-500/30 bg-amber-500/5 text-amber-800 dark:bg-amber-500/10 dark:text-amber-200 dark:border-amber-500/20\",\n error: \"border-red-500/30 bg-red-500/5 text-red-800 dark:bg-red-500/10 dark:text-red-200 dark:border-red-500/20\",\n success: \"border-emerald-500/30 bg-emerald-500/5 text-emerald-800 dark:bg-emerald-500/10 dark:text-emerald-200 dark:border-emerald-500/20\",\n promo: \"border-brand/30 bg-brand/5 text-foreground dark:bg-brand/10 dark:border-brand/20\",\n },\n },\n defaultVariants: { variant: \"info\" },\n }\n)\n\nexport interface LocalBannerProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof localBannerVariants> {\n /** Banner title (optional) */\n title?: string\n /** Banner message */\n children: React.ReactNode\n /** Whether the banner can be dismissed */\n dismissible?: boolean\n /** Callback when dismissed */\n onDismiss?: () => void\n /** Optional action — renders as link (href) or button (onClick) */\n action?: {\n label: string\n href?: string\n onClick?: () => void\n }\n /** Optional retry action for error states */\n retry?: {\n label?: string\n onClick: () => void\n }\n /** Override the default icon */\n icon?: string\n}\n\nexport function LocalBanner({\n children,\n title,\n variant = \"info\",\n dismissible = false,\n onDismiss,\n action,\n retry,\n icon,\n className,\n ...props\n}: LocalBannerProps) {\n const [dismissed, setDismissed] = React.useState(false)\n const config = VARIANT_CONFIG[variant ?? \"info\"]\n\n function handleDismiss() {\n setDismissed(true)\n onDismiss?.()\n }\n\n if (dismissed) return null\n\n return (\n <div\n role={config.role}\n aria-live={config.live}\n className={cn(localBannerVariants({ variant }), className)}\n {...props}\n >\n {/* Icon */}\n <i\n className={cn(config.prefix, icon ?? config.icon, \"text-[15px] shrink-0 mt-0.5\")}\n aria-hidden=\"true\"\n />\n\n {/* Content */}\n <div className=\"flex-1 min-w-0\">\n {title && (\n <p className=\"font-semibold leading-tight mb-0.5\">{title}</p>\n )}\n <div className=\"text-sm leading-relaxed opacity-90\">{children}</div>\n\n {/* Actions */}\n {(action || retry) && (\n <div className=\"flex items-center gap-2 mt-2.5\">\n {retry && (\n <Button size=\"xs\" variant=\"outline\" onClick={retry.onClick}>\n <i className=\"fa-light fa-arrow-rotate-right text-xs\" aria-hidden=\"true\" />\n {retry.label ?? \"Retry\"}\n </Button>\n )}\n {action && (\n action.href ? (\n <a href={action.href} className=\"inline-flex items-center gap-1 text-xs font-semibold underline underline-offset-2 hover:no-underline\">\n {action.label} <i className=\"fa-light fa-arrow-right text-xs\" aria-hidden=\"true\" />\n </a>\n ) : (\n <Button size=\"xs\" variant=\"outline\" onClick={action.onClick}>\n {action.label}\n </Button>\n )\n )}\n </div>\n )}\n </div>\n\n {/* Dismiss */}\n {dismissible && (\n <Tip label=\"Dismiss\" side=\"left\">\n <button\n type=\"button\"\n aria-label=\"Dismiss\"\n onClick={handleDismiss}\n className={cn(\n \"inline-flex items-center justify-center size-5 rounded transition-colors shrink-0\",\n \"hover:bg-current/10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n )}\n >\n <i className=\"fa-light fa-xmark text-xs\" aria-hidden=\"true\" />\n </button>\n </Tip>\n )}\n </div>\n )\n}\n"]}
@@ -201,7 +201,7 @@ function CoachMark({
201
201
  "data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
202
202
  "data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
203
203
  "data-[side=bottom]:slide-in-from-top-2 data-[side=top]:slide-in-from-bottom-2",
204
- "data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2",
204
+ "data-[side=left]:slide-in-from-end-2 data-[side=right]:slide-in-from-start-2",
205
205
  className
206
206
  ),
207
207
  children: [
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/utils.ts","../../../src/components/ui/coach-mark.tsx"],"names":["PopoverPrimitive"],"mappings":"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","file":"coach-mark.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","\"use client\"\n\n/**\n * CoachMark — contextual onboarding / feature-discovery popover\n *\n * Targets elements by CSS selector, scrolls them into view, and positions\n * the popover relative to the target using Radix's virtual anchor.\n *\n * Variants:\n * • single — standalone tip anchored to a target element\n * • flow — multi-step walkthrough with prev/next and step indicator\n * • image — includes a hero image above the content\n * • no-image — text-only (title + description)\n *\n * Brand-colored background with spotlight overlay on the target element.\n *\n * WCAG 2.1 AA:\n * • Focus trapped inside while open\n * • Escape dismisses\n * • aria-labelledby / aria-describedby wired automatically\n * • Step indicator announced via aria-live\n */\n\nimport * as React from \"react\"\nimport { createPortal } from \"react-dom\"\nimport { Popover as PopoverPrimitive } from \"radix-ui\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { Button } from \"./button\"\nimport { cn } from \"../../lib/utils\"\nimport type { CoachMarkState } from \"../../hooks/use-coach-mark\"\n\n/* ── Variant styles ─────────────────────────────────────────────────────── */\n\nconst coachMarkVariants = cva(\n \"z-[60] flex flex-col overflow-hidden rounded-xl bg-brand-deep text-white shadow-xl outline-none hc:!bg-background hc:!text-foreground hc:!border-2 hc:!border-foreground hc:!shadow-none\",\n {\n variants: {\n size: {\n default: \"w-[320px]\",\n sm: \"w-[260px]\",\n lg: \"w-[400px]\",\n },\n },\n defaultVariants: {\n size: \"default\",\n },\n }\n)\n\n/* ── Sub-components ─────────────────────────────────────────────────────── */\n\nfunction CoachMarkImage({\n src,\n alt,\n}: {\n src: string\n alt: string\n}) {\n return (\n <div className=\"relative w-full overflow-hidden\">\n <img\n src={src}\n alt={alt}\n className=\"h-[160px] w-full object-cover\"\n />\n </div>\n )\n}\n\nfunction CoachMarkStepIndicator({\n current,\n total,\n}: {\n current: number\n total: number\n}) {\n return (\n <div\n className=\"flex items-center gap-1\"\n role=\"status\"\n aria-live=\"polite\"\n aria-label={`Step ${current + 1} of ${total}`}\n >\n {Array.from({ length: total }, (_, i) => (\n <span\n key={i}\n className={cn(\n \"h-1.5 rounded-full transition-all duration-200\",\n i === current\n ? \"w-4 bg-white hc:bg-foreground\"\n : \"w-1.5 bg-white/30 hc:bg-foreground/40\"\n )}\n aria-hidden=\"true\"\n />\n ))}\n </div>\n )\n}\n\n/* ── Spotlight overlay — highlights the target element ──────────────────── */\n\nfunction SpotlightOverlay({\n rect,\n maskId,\n}: {\n rect: { x: number; y: number; width: number; height: number }\n /** Unique per coach instance — multiple flows on one page must not duplicate SVG mask ids. */\n maskId: string\n}) {\n const padding = 6\n const borderRadius = 8\n const x = rect.x - padding\n const y = rect.y - padding\n const w = rect.width + padding * 2\n const h = rect.height + padding * 2\n const maskUrl = `url(#${maskId})`\n\n return createPortal(\n <div\n className=\"fixed inset-0 z-[55]\"\n aria-hidden=\"true\"\n >\n {/* Semi-transparent overlay with a cutout for the target */}\n <svg className=\"absolute inset-0 w-full h-full\">\n <defs>\n <mask id={maskId}>\n <rect width=\"100%\" height=\"100%\" fill=\"white\" />\n <rect\n x={x}\n y={y}\n width={w}\n height={h}\n rx={borderRadius}\n ry={borderRadius}\n fill=\"black\"\n />\n </mask>\n </defs>\n <rect\n width=\"100%\"\n height=\"100%\"\n fill=\"rgba(0,0,0,0.5)\"\n mask={maskUrl}\n />\n </svg>\n\n {/* Highlight ring around the target */}\n <div\n className=\"absolute rounded-lg ring-2 ring-brand hc:ring-foreground shadow-[0_0_0_4px_rgba(0,0,0,0.3)] hc:shadow-none\"\n style={{\n left: x,\n top: y,\n width: w,\n height: h,\n borderRadius,\n }}\n />\n </div>,\n document.body\n )\n}\n\n/* ── Main component ─────────────────────────────────────────────────────── */\n\nexport interface CoachMarkProps\n extends VariantProps<typeof coachMarkVariants> {\n /** State from useCoachMark hook */\n state: CoachMarkState\n /** Default popover placement side (step-level side takes priority) */\n side?: \"top\" | \"bottom\" | \"left\" | \"right\"\n /** Default popover alignment (step-level align takes priority) */\n align?: \"start\" | \"center\" | \"end\"\n /** Offset from anchor element in px */\n sideOffset?: number\n /** Label for the primary (next/done) button — defaults to \"Next\" / \"Got it\" */\n nextLabel?: string\n /** Label for the skip button — defaults to \"Skip\" */\n skipLabel?: string\n /** Extra className for the content container */\n className?: string\n}\n\nexport function CoachMark({\n state,\n side = \"bottom\",\n align = \"center\",\n sideOffset = 12,\n nextLabel,\n skipLabel = \"Skip\",\n size,\n className,\n}: CoachMarkProps) {\n const spotlightMaskId = React.useId().replace(/:/g, \"\")\n const {\n isOpen,\n step,\n currentStep,\n totalSteps,\n isFlow,\n isFirst,\n isLast,\n next,\n prev,\n skip,\n anchorRect,\n } = state\n\n if (!isOpen || !step) return null\n if (!anchorRect) return null\n\n const titleId = `coach-mark-title-${step.id}`\n const descId = `coach-mark-desc-${step.id}`\n const hasImage = Boolean(step.image)\n const primaryLabel = nextLabel ?? (isLast ? \"Got it\" : \"Next\")\n const resolvedSide = step.side ?? side\n const resolvedAlign = step.align ?? align\n\n return (\n <>\n {/* Spotlight overlay */}\n <SpotlightOverlay rect={anchorRect} maskId={`coach-spotlight-${spotlightMaskId}`} />\n\n {/* Popover with virtual anchor */}\n <PopoverPrimitive.Root open>\n <PopoverPrimitive.Anchor\n virtualRef={{\n current: {\n getBoundingClientRect: () => ({\n x: anchorRect.x,\n y: anchorRect.y,\n top: anchorRect.y,\n left: anchorRect.x,\n bottom: anchorRect.y + anchorRect.height,\n right: anchorRect.x + anchorRect.width,\n width: anchorRect.width,\n height: anchorRect.height,\n toJSON: () => {},\n }),\n },\n }}\n />\n\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n data-slot=\"coach-mark\"\n side={resolvedSide}\n align={resolvedAlign}\n sideOffset={sideOffset}\n onOpenAutoFocus={(e) => e.preventDefault()}\n onInteractOutside={(e) => e.preventDefault()}\n onEscapeKeyDown={() => skip()}\n aria-labelledby={titleId}\n aria-describedby={descId}\n className={cn(\n coachMarkVariants({ size }),\n /* animations */\n \"data-[state=open]:animate-in data-[state=closed]:animate-out\",\n \"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n \"data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95\",\n \"data-[side=bottom]:slide-in-from-top-2 data-[side=top]:slide-in-from-bottom-2\",\n \"data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2\",\n className\n )}\n >\n {/* Image (optional) */}\n {hasImage && (\n <CoachMarkImage\n src={step.image!}\n alt={step.imageAlt ?? step.title}\n />\n )}\n\n {/* Body */}\n <div className=\"flex flex-col gap-3 p-4\">\n {/* Title + close */}\n <div className=\"flex items-start gap-2\">\n <div className=\"flex-1 min-w-0\">\n <h3\n id={titleId}\n className=\"text-sm font-semibold text-white leading-snug\"\n >\n {step.title}\n </h3>\n </div>\n <button\n type=\"button\"\n onClick={skip}\n className=\"shrink-0 -mt-0.5 -me-1 flex h-6 w-6 items-center justify-center rounded-md text-white/60 hover:bg-white/15 hover:text-white transition-colors focus-visible:outline-2 focus-visible:outline-white hc:!text-foreground hc:hover:!bg-foreground/10\"\n aria-label=\"Dismiss\"\n >\n <i className=\"fa-light fa-xmark text-xs\" aria-hidden=\"true\" />\n </button>\n </div>\n\n {/* Description */}\n <p\n id={descId}\n className=\"text-sm text-white/80 leading-relaxed\"\n >\n {step.description}\n </p>\n\n {/* Footer: step indicator + actions */}\n <div className=\"flex items-center justify-between gap-3 pt-1\">\n {/* Left: step dots (flow only) */}\n <div className=\"flex-1\">\n {isFlow && (\n <CoachMarkStepIndicator\n current={currentStep}\n total={totalSteps}\n />\n )}\n </div>\n\n {/* Right: buttons */}\n <div className=\"flex items-center gap-2 shrink-0\">\n {isFlow && !isLast && (\n <button\n type=\"button\"\n onClick={skip}\n className=\"h-8 px-3 text-xs font-medium text-white/60 hover:text-white transition-colors rounded-md focus-visible:outline-2 focus-visible:outline-white hc:!text-foreground hc:hover:!text-foreground/80\"\n >\n {skipLabel}\n </button>\n )}\n {isFlow && !isFirst && (\n <button\n type=\"button\"\n onClick={prev}\n className=\"inline-flex items-center gap-1.5 h-8 px-3 text-xs font-medium text-white bg-white/15 hover:bg-white/25 rounded-md border border-white/20 transition-colors focus-visible:outline-2 focus-visible:outline-white hc:!bg-background hc:!text-foreground hc:!border-foreground\"\n >\n <i className=\"fa-light fa-arrow-left text-xs\" aria-hidden=\"true\" />\n Back\n </button>\n )}\n <button\n type=\"button\"\n onClick={next}\n className=\"inline-flex items-center gap-1.5 h-8 px-3 text-xs font-medium text-brand-deep bg-white hover:bg-white/90 rounded-md transition-colors focus-visible:outline-2 focus-visible:outline-white hc:!bg-foreground hc:!text-background hc:border hc:border-foreground\"\n >\n {primaryLabel}\n {isFlow && !isLast && (\n <i className=\"fa-light fa-arrow-right text-xs\" aria-hidden=\"true\" />\n )}\n </button>\n </div>\n </div>\n </div>\n\n {/* Arrow */}\n <PopoverPrimitive.Arrow\n className=\"fill-brand-deep drop-shadow-sm hc:fill-background\"\n width={12}\n height={6}\n />\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </PopoverPrimitive.Root>\n </>\n )\n}\n"]}
1
+ {"version":3,"sources":["../../../src/lib/utils.ts","../../../src/components/ui/coach-mark.tsx"],"names":["PopoverPrimitive"],"mappings":"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","file":"coach-mark.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","\"use client\"\n\n/**\n * CoachMark — contextual onboarding / feature-discovery popover\n *\n * Targets elements by CSS selector, scrolls them into view, and positions\n * the popover relative to the target using Radix's virtual anchor.\n *\n * Variants:\n * • single — standalone tip anchored to a target element\n * • flow — multi-step walkthrough with prev/next and step indicator\n * • image — includes a hero image above the content\n * • no-image — text-only (title + description)\n *\n * Brand-colored background with spotlight overlay on the target element.\n *\n * WCAG 2.1 AA:\n * • Focus trapped inside while open\n * • Escape dismisses\n * • aria-labelledby / aria-describedby wired automatically\n * • Step indicator announced via aria-live\n */\n\nimport * as React from \"react\"\nimport { createPortal } from \"react-dom\"\nimport { Popover as PopoverPrimitive } from \"radix-ui\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"../../lib/utils\"\nimport type { CoachMarkState } from \"../../hooks/use-coach-mark\"\n\n/* ── Variant styles ─────────────────────────────────────────────────────── */\n\nconst coachMarkVariants = cva(\n \"z-[60] flex flex-col overflow-hidden rounded-xl bg-brand-deep text-white shadow-xl outline-none hc:!bg-background hc:!text-foreground hc:!border-2 hc:!border-foreground hc:!shadow-none\",\n {\n variants: {\n size: {\n default: \"w-[320px]\",\n sm: \"w-[260px]\",\n lg: \"w-[400px]\",\n },\n },\n defaultVariants: {\n size: \"default\",\n },\n }\n)\n\n/* ── Sub-components ─────────────────────────────────────────────────────── */\n\nfunction CoachMarkImage({\n src,\n alt,\n}: {\n src: string\n alt: string\n}) {\n return (\n <div className=\"relative w-full overflow-hidden\">\n <img\n src={src}\n alt={alt}\n className=\"h-[160px] w-full object-cover\"\n />\n </div>\n )\n}\n\nfunction CoachMarkStepIndicator({\n current,\n total,\n}: {\n current: number\n total: number\n}) {\n return (\n <div\n className=\"flex items-center gap-1\"\n role=\"status\"\n aria-live=\"polite\"\n aria-label={`Step ${current + 1} of ${total}`}\n >\n {Array.from({ length: total }, (_, i) => (\n <span\n key={i}\n className={cn(\n \"h-1.5 rounded-full transition-all duration-200\",\n i === current\n ? \"w-4 bg-white hc:bg-foreground\"\n : \"w-1.5 bg-white/30 hc:bg-foreground/40\"\n )}\n aria-hidden=\"true\"\n />\n ))}\n </div>\n )\n}\n\n/* ── Spotlight overlay — highlights the target element ──────────────────── */\n\nfunction SpotlightOverlay({\n rect,\n maskId,\n}: {\n rect: { x: number; y: number; width: number; height: number }\n /** Unique per coach instance — multiple flows on one page must not duplicate SVG mask ids. */\n maskId: string\n}) {\n const padding = 6\n const borderRadius = 8\n const x = rect.x - padding\n const y = rect.y - padding\n const w = rect.width + padding * 2\n const h = rect.height + padding * 2\n const maskUrl = `url(#${maskId})`\n\n return createPortal(\n <div\n className=\"fixed inset-0 z-[55]\"\n aria-hidden=\"true\"\n >\n {/* Semi-transparent overlay with a cutout for the target */}\n <svg className=\"absolute inset-0 w-full h-full\">\n <defs>\n <mask id={maskId}>\n <rect width=\"100%\" height=\"100%\" fill=\"white\" />\n <rect\n x={x}\n y={y}\n width={w}\n height={h}\n rx={borderRadius}\n ry={borderRadius}\n fill=\"black\"\n />\n </mask>\n </defs>\n <rect\n width=\"100%\"\n height=\"100%\"\n fill=\"rgba(0,0,0,0.5)\"\n mask={maskUrl}\n />\n </svg>\n\n {/* Highlight ring around the target */}\n <div\n className=\"absolute rounded-lg ring-2 ring-brand hc:ring-foreground shadow-[0_0_0_4px_rgba(0,0,0,0.3)] hc:shadow-none\"\n style={{\n left: x,\n top: y,\n width: w,\n height: h,\n borderRadius,\n }}\n />\n </div>,\n document.body\n )\n}\n\n/* ── Main component ─────────────────────────────────────────────────────── */\n\nexport interface CoachMarkProps\n extends VariantProps<typeof coachMarkVariants> {\n /** State from useCoachMark hook */\n state: CoachMarkState\n /** Default popover placement side (step-level side takes priority) */\n side?: \"top\" | \"bottom\" | \"left\" | \"right\"\n /** Default popover alignment (step-level align takes priority) */\n align?: \"start\" | \"center\" | \"end\"\n /** Offset from anchor element in px */\n sideOffset?: number\n /** Label for the primary (next/done) button — defaults to \"Next\" / \"Got it\" */\n nextLabel?: string\n /** Label for the skip button — defaults to \"Skip\" */\n skipLabel?: string\n /** Extra className for the content container */\n className?: string\n}\n\nexport function CoachMark({\n state,\n side = \"bottom\",\n align = \"center\",\n sideOffset = 12,\n nextLabel,\n skipLabel = \"Skip\",\n size,\n className,\n}: CoachMarkProps) {\n const spotlightMaskId = React.useId().replace(/:/g, \"\")\n const {\n isOpen,\n step,\n currentStep,\n totalSteps,\n isFlow,\n isFirst,\n isLast,\n next,\n prev,\n skip,\n anchorRect,\n } = state\n\n if (!isOpen || !step) return null\n if (!anchorRect) return null\n\n const titleId = `coach-mark-title-${step.id}`\n const descId = `coach-mark-desc-${step.id}`\n const hasImage = Boolean(step.image)\n const primaryLabel = nextLabel ?? (isLast ? \"Got it\" : \"Next\")\n const resolvedSide = step.side ?? side\n const resolvedAlign = step.align ?? align\n\n return (\n <>\n {/* Spotlight overlay */}\n <SpotlightOverlay rect={anchorRect} maskId={`coach-spotlight-${spotlightMaskId}`} />\n\n {/* Popover with virtual anchor */}\n <PopoverPrimitive.Root open>\n <PopoverPrimitive.Anchor\n virtualRef={{\n current: {\n getBoundingClientRect: () => ({\n x: anchorRect.x,\n y: anchorRect.y,\n top: anchorRect.y,\n left: anchorRect.x,\n bottom: anchorRect.y + anchorRect.height,\n right: anchorRect.x + anchorRect.width,\n width: anchorRect.width,\n height: anchorRect.height,\n toJSON: () => {},\n }),\n },\n }}\n />\n\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n data-slot=\"coach-mark\"\n side={resolvedSide}\n align={resolvedAlign}\n sideOffset={sideOffset}\n onOpenAutoFocus={(e) => e.preventDefault()}\n onInteractOutside={(e) => e.preventDefault()}\n onEscapeKeyDown={() => skip()}\n aria-labelledby={titleId}\n aria-describedby={descId}\n className={cn(\n coachMarkVariants({ size }),\n /* animations */\n \"data-[state=open]:animate-in data-[state=closed]:animate-out\",\n \"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n \"data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95\",\n \"data-[side=bottom]:slide-in-from-top-2 data-[side=top]:slide-in-from-bottom-2\",\n \"data-[side=left]:slide-in-from-end-2 data-[side=right]:slide-in-from-start-2\",\n className\n )}\n >\n {/* Image (optional) */}\n {hasImage && (\n <CoachMarkImage\n src={step.image!}\n alt={step.imageAlt ?? step.title}\n />\n )}\n\n {/* Body */}\n <div className=\"flex flex-col gap-3 p-4\">\n {/* Title + close */}\n <div className=\"flex items-start gap-2\">\n <div className=\"flex-1 min-w-0\">\n <h3\n id={titleId}\n className=\"text-sm font-semibold text-white leading-snug\"\n >\n {step.title}\n </h3>\n </div>\n <button\n type=\"button\"\n onClick={skip}\n className=\"shrink-0 -mt-0.5 -me-1 flex h-6 w-6 items-center justify-center rounded-md text-white/60 hover:bg-white/15 hover:text-white transition-colors focus-visible:outline-2 focus-visible:outline-white hc:!text-foreground hc:hover:!bg-foreground/10\"\n aria-label=\"Dismiss\"\n >\n <i className=\"fa-light fa-xmark text-xs\" aria-hidden=\"true\" />\n </button>\n </div>\n\n {/* Description */}\n <p\n id={descId}\n className=\"text-sm text-white/80 leading-relaxed\"\n >\n {step.description}\n </p>\n\n {/* Footer: step indicator + actions */}\n <div className=\"flex items-center justify-between gap-3 pt-1\">\n {/* Left: step dots (flow only) */}\n <div className=\"flex-1\">\n {isFlow && (\n <CoachMarkStepIndicator\n current={currentStep}\n total={totalSteps}\n />\n )}\n </div>\n\n {/* Right: buttons */}\n <div className=\"flex items-center gap-2 shrink-0\">\n {isFlow && !isLast && (\n <button\n type=\"button\"\n onClick={skip}\n className=\"h-8 px-3 text-xs font-medium text-white/60 hover:text-white transition-colors rounded-md focus-visible:outline-2 focus-visible:outline-white hc:!text-foreground hc:hover:!text-foreground/80\"\n >\n {skipLabel}\n </button>\n )}\n {isFlow && !isFirst && (\n <button\n type=\"button\"\n onClick={prev}\n className=\"inline-flex items-center gap-1.5 h-8 px-3 text-xs font-medium text-white bg-white/15 hover:bg-white/25 rounded-md border border-white/20 transition-colors focus-visible:outline-2 focus-visible:outline-white hc:!bg-background hc:!text-foreground hc:!border-foreground\"\n >\n <i className=\"fa-light fa-arrow-left text-xs\" aria-hidden=\"true\" />\n Back\n </button>\n )}\n <button\n type=\"button\"\n onClick={next}\n className=\"inline-flex items-center gap-1.5 h-8 px-3 text-xs font-medium text-brand-deep bg-white hover:bg-white/90 rounded-md transition-colors focus-visible:outline-2 focus-visible:outline-white hc:!bg-foreground hc:!text-background hc:border hc:border-foreground\"\n >\n {primaryLabel}\n {isFlow && !isLast && (\n <i className=\"fa-light fa-arrow-right text-xs\" aria-hidden=\"true\" />\n )}\n </button>\n </div>\n </div>\n </div>\n\n {/* Arrow */}\n <PopoverPrimitive.Arrow\n className=\"fill-brand-deep drop-shadow-sm hc:fill-background\"\n width={12}\n height={6}\n />\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </PopoverPrimitive.Root>\n </>\n )\n}\n"]}
@@ -102,7 +102,7 @@ function ContextMenuContent({
102
102
  {
103
103
  "data-slot": "context-menu-content",
104
104
  className: cn(
105
- "z-50 max-h-(--radix-context-menu-content-available-height) origin-(--radix-context-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-lg bg-popover p-1 text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
105
+ "z-50 max-h-(--radix-context-menu-content-available-height) origin-(--radix-context-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-lg bg-popover p-1 text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-end-2 data-[side=right]:slide-in-from-start-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
106
106
  DROPDOWN_MENU_CONTENT_SURFACE_CLASS,
107
107
  className
108
108
  ),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/utils.ts","../../../src/lib/dropdown-menu-surface.ts","../../../src/components/ui/context-menu.tsx"],"names":["ContextMenuPrimitive"],"mappings":";;;;;;AAGO,SAAS,MAAM,MAAA,EAAsB;AAC1C,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;;;ACMO,IAAM,mCAAA,GACX,oDAAA;ACkBF,SAAS,WAAA,CAAY;AAAA,EACnB,GAAG;AACL,CAAA,EAA2D;AACzD,EAAA,2BAAQA,aAAA,CAAqB,IAAA,EAArB,EAA0B,WAAA,EAAU,cAAA,EAAgB,GAAG,KAAA,EAAO,CAAA;AACxE;AAEA,SAAS,kBAAA,CAAmB;AAAA,EAC1B,GAAG;AACL,CAAA,EAA8D;AAC5D,EAAA,uBACE,GAAA;AAAA,IAACA,aAAA,CAAqB,OAAA;AAAA,IAArB;AAAA,MACC,WAAA,EAAU,sBAAA;AAAA,MACT,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,SAAS,gBAAA,CAAiB;AAAA,EACxB,GAAG;AACL,CAAA,EAA4D;AAC1D,EAAA,2BAAQA,aAAA,CAAqB,KAAA,EAArB,EAA2B,WAAA,EAAU,oBAAA,EAAsB,GAAG,KAAA,EAAO,CAAA;AAC/E;AAEA,SAAS,iBAAA,CAAkB;AAAA,EACzB,GAAG;AACL,CAAA,EAA6D;AAC3D,EAAA,2BACGA,aAAA,CAAqB,MAAA,EAArB,EAA4B,WAAA,EAAU,qBAAA,EAAuB,GAAG,KAAA,EAAO,CAAA;AAE5E;AAEA,SAAS,cAAA,CAAe;AAAA,EACtB,GAAG;AACL,CAAA,EAA0D;AACxD,EAAA,2BAAQA,aAAA,CAAqB,GAAA,EAArB,EAAyB,WAAA,EAAU,kBAAA,EAAoB,GAAG,KAAA,EAAO,CAAA;AAC3E;AAEA,SAAS,qBAAA,CAAsB;AAAA,EAC7B,GAAG;AACL,CAAA,EAAiE;AAC/D,EAAA,uBACE,GAAA;AAAA,IAACA,aAAA,CAAqB,UAAA;AAAA,IAArB;AAAA,MACC,WAAA,EAAU,0BAAA;AAAA,MACT,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,SAAS,qBAAA,CAAsB;AAAA,EAC7B,SAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAEG;AACD,EAAA,uBACE,IAAA;AAAA,IAACA,aAAA,CAAqB,UAAA;AAAA,IAArB;AAAA,MACC,WAAA,EAAU,0BAAA;AAAA,MACV,YAAA,EAAY,KAAA;AAAA,MACZ,SAAA,EAAW,EAAA;AAAA,QACT,iWAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG,KAAA;AAAA,MAEH,QAAA,EAAA;AAAA,QAAA,QAAA;AAAA,wBACD,GAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAU,sCAAA,EAAuC,eAAY,MAAA,EAAO;AAAA;AAAA;AAAA,GACpF;AAEJ;AAEA,SAAS,qBAAA,CAAsB;AAAA,EAC7B,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAiE;AAC/D,EAAA,uBACE,GAAA;AAAA,IAACA,aAAA,CAAqB,UAAA;AAAA,IAArB;AAAA,MACC,WAAA,EAAU,0BAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,iTAAA;AAAA,QACA,mCAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,SAAS,kBAAA,CAAmB;AAAA,EAC1B,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA8D;AAC5D,EAAA,uBACE,GAAA,CAACA,aAAA,CAAqB,MAAA,EAArB,EACC,QAAA,kBAAA,GAAA;AAAA,IAACA,aAAA,CAAqB,OAAA;AAAA,IAArB;AAAA,MACC,WAAA,EAAU,sBAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,yhBAAA;AAAA,QACA,mCAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN,EACF,CAAA;AAEJ;AAEA,SAAS,eAAA,CAAgB;AAAA,EACvB,SAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA,GAAU,SAAA;AAAA,EACV,GAAG;AACL,CAAA,EAGG;AACD,EAAA,uBACE,GAAA;AAAA,IAACA,aAAA,CAAqB,IAAA;AAAA,IAArB;AAAA,MACC,WAAA,EAAU,mBAAA;AAAA,MACV,YAAA,EAAY,KAAA;AAAA,MACZ,cAAA,EAAc,OAAA;AAAA,MACd,SAAA,EAAW,EAAA;AAAA,QACT,4pBAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,SAAS,uBAAA,CAAwB;AAAA,EAC/B,SAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,GAAG;AACL,CAAA,EAEG;AACD,EAAA,uBACE,IAAA;AAAA,IAACA,aAAA,CAAqB,YAAA;AAAA,IAArB;AAAA,MACC,WAAA,EAAU,4BAAA;AAAA,MACV,YAAA,EAAY,KAAA;AAAA,MACZ,SAAA,EAAW,EAAA;AAAA,QACT,qYAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,OAAA;AAAA,MACC,GAAG,KAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,qEAAA;AAAA,YACV,WAAA,EAAU,sCAAA;AAAA,YAEV,QAAA,kBAAA,GAAA,CAACA,aAAA,CAAqB,aAAA,EAArB,EACC,QAAA,kBAAA,GAAA,CAAC,OAAE,SAAA,EAAU,mBAAA,EAAoB,aAAA,EAAY,MAAA,EAAO,CAAA,EACtD;AAAA;AAAA,SACF;AAAA,QACC;AAAA;AAAA;AAAA,GACH;AAEJ;AAEA,SAAS,oBAAA,CAAqB;AAAA,EAC5B,SAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,GAAG;AACL,CAAA,EAEG;AACD,EAAA,uBACE,IAAA;AAAA,IAACA,aAAA,CAAqB,SAAA;AAAA,IAArB;AAAA,MACC,WAAA,EAAU,yBAAA;AAAA,MACV,YAAA,EAAY,KAAA;AAAA,MACZ,SAAA,EAAW,EAAA;AAAA,QACT,qYAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG,KAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,qEAAA;AAAA,YACV,WAAA,EAAU,mCAAA;AAAA,YAEV,QAAA,kBAAA,GAAA,CAACA,aAAA,CAAqB,aAAA,EAArB,EACC,QAAA,kBAAA,GAAA,CAAC,OAAE,SAAA,EAAU,mBAAA,EAAoB,aAAA,EAAY,MAAA,EAAO,CAAA,EACtD;AAAA;AAAA,SACF;AAAA,QACC;AAAA;AAAA;AAAA,GACH;AAEJ;AAEA,SAAS,gBAAA,CAAiB;AAAA,EACxB,SAAA;AAAA,EACA,KAAA;AAAA,EACA,GAAG;AACL,CAAA,EAEG;AACD,EAAA,uBACE,GAAA;AAAA,IAACA,aAAA,CAAqB,KAAA;AAAA,IAArB;AAAA,MACC,WAAA,EAAU,oBAAA;AAAA,MACV,YAAA,EAAY,KAAA;AAAA,MACZ,SAAA,EAAW,EAAA;AAAA,QACT,uEAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,SAAS,oBAAA,CAAqB;AAAA,EAC5B,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAgE;AAC9D,EAAA,uBACE,GAAA;AAAA,IAACA,aAAA,CAAqB,SAAA;AAAA,IAArB;AAAA,MACC,WAAA,EAAU,wBAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,2BAAA,EAA6B,SAAS,CAAA;AAAA,MACnD,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,SAAS,mBAAA,CAAoB;AAAA,EAC3B,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAiC;AAC/B,EAAA,uBACE,GAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,uBAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,uDAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ","file":"context-menu.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","/**\n * Default surface sizing for product dropdown menus (view settings, row ⋯, column menus, etc.).\n *\n * Uses **pure CSS** (`w-max` + `min-w-*` + `max-w-*`) so width follows labels and shortcuts\n * without **ResizeObserver** or layout thrash.\n *\n * Override when you need a fixed rail, for example:\n * - `className=\"w-20\"` — page-size picker in `DataTablePaginated`\n * - `className=\"w-(--radix-dropdown-menu-trigger-width) min-w-60\"` — account / identity menus\n * - `className=\"!w-max min-w-72 …\"` — very wide school/program switcher\n */\nexport const DROPDOWN_MENU_CONTENT_SURFACE_CLASS =\n \"min-w-52 w-max max-w-[min(24rem,calc(100vw-2rem))]\" as const\n","\"use client\"\n\n/**\n * ContextMenu — right-click + long-press menu surface backed by Radix\n * `ContextMenu`. Visual surface mirrors `DropdownMenu` so the two read as\n * a consistent menu family across the product (same item heights, same\n * tints, same separator + label rhythm).\n *\n * Use for **secondary, contextual actions** on a specific row, card, or\n * editable region — duplicate, rename, archive, copy link. The primary\n * action SHOULD still be reachable by click / keyboard via a visible\n * trigger; the context menu is an accelerator, not a replacement.\n *\n * Accessibility:\n * - Radix handles the right-click trigger, long-press on touch, the\n * `aria-haspopup` / `aria-expanded` wiring, and arrow-key navigation\n * between items.\n * - Items announce as `role=\"menuitem\"`; `CheckboxItem` and `RadioItem`\n * expose checked / selected state correctly.\n * - Pair with a visible alternative (a `…` overflow `DropdownMenu`) so\n * keyboard-only users can reach the same actions without a pointer.\n */\n\nimport * as React from \"react\"\nimport { ContextMenu as ContextMenuPrimitive } from \"radix-ui\"\nimport { ChevronRight } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\nimport { DROPDOWN_MENU_CONTENT_SURFACE_CLASS } from \"../../lib/dropdown-menu-surface\"\n\nfunction ContextMenu({\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Root>) {\n return <ContextMenuPrimitive.Root data-slot=\"context-menu\" {...props} />\n}\n\nfunction ContextMenuTrigger({\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Trigger>) {\n return (\n <ContextMenuPrimitive.Trigger\n data-slot=\"context-menu-trigger\"\n {...props}\n />\n )\n}\n\nfunction ContextMenuGroup({\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Group>) {\n return <ContextMenuPrimitive.Group data-slot=\"context-menu-group\" {...props} />\n}\n\nfunction ContextMenuPortal({\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Portal>) {\n return (\n <ContextMenuPrimitive.Portal data-slot=\"context-menu-portal\" {...props} />\n )\n}\n\nfunction ContextMenuSub({\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Sub>) {\n return <ContextMenuPrimitive.Sub data-slot=\"context-menu-sub\" {...props} />\n}\n\nfunction ContextMenuRadioGroup({\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.RadioGroup>) {\n return (\n <ContextMenuPrimitive.RadioGroup\n data-slot=\"context-menu-radio-group\"\n {...props}\n />\n )\n}\n\nfunction ContextMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.SubTrigger> & {\n inset?: boolean\n}) {\n return (\n <ContextMenuPrimitive.SubTrigger\n data-slot=\"context-menu-sub-trigger\"\n data-inset={inset}\n className={cn(\n \"flex cursor-default items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground data-inset:ps-7 [&_svg]:pointer-events-none [&_i]:pointer-events-none [&_svg]:shrink-0 [&_i]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n >\n {children}\n <ChevronRight className=\"ms-auto size-4 text-muted-foreground\" aria-hidden=\"true\" />\n </ContextMenuPrimitive.SubTrigger>\n )\n}\n\nfunction ContextMenuSubContent({\n className,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.SubContent>) {\n return (\n <ContextMenuPrimitive.SubContent\n data-slot=\"context-menu-sub-content\"\n className={cn(\n \"z-50 min-w-32 origin-(--radix-context-menu-content-transform-origin) overflow-hidden rounded-lg bg-popover p-1 text-popover-foreground shadow-md ring-1 ring-foreground/10 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n DROPDOWN_MENU_CONTENT_SURFACE_CLASS,\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction ContextMenuContent({\n className,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Content>) {\n return (\n <ContextMenuPrimitive.Portal>\n <ContextMenuPrimitive.Content\n data-slot=\"context-menu-content\"\n className={cn(\n \"z-50 max-h-(--radix-context-menu-content-available-height) origin-(--radix-context-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-lg bg-popover p-1 text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n DROPDOWN_MENU_CONTENT_SURFACE_CLASS,\n className,\n )}\n {...props}\n />\n </ContextMenuPrimitive.Portal>\n )\n}\n\nfunction ContextMenuItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Item> & {\n inset?: boolean\n variant?: \"default\" | \"destructive\"\n}) {\n return (\n <ContextMenuPrimitive.Item\n data-slot=\"context-menu-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"relative flex cursor-default items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:ps-7 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_i]:pointer-events-none [&_svg]:shrink-0 [&_i]:shrink-0 [&_svg:not([class*='size-'])]:size-4 data-[variant=destructive]:*:[svg]:text-destructive\",\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction ContextMenuCheckboxItem({\n className,\n children,\n checked,\n inset,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.CheckboxItem> & {\n inset?: boolean\n}) {\n return (\n <ContextMenuPrimitive.CheckboxItem\n data-slot=\"context-menu-checkbox-item\"\n data-inset={inset}\n className={cn(\n \"relative flex cursor-default items-center gap-1.5 rounded-md py-1 pe-8 ps-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:ps-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_i]:pointer-events-none [&_svg]:shrink-0 [&_i]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n checked={checked}\n {...props}\n >\n <span\n className=\"pointer-events-none absolute end-2 flex items-center justify-center\"\n data-slot=\"context-menu-checkbox-item-indicator\"\n >\n <ContextMenuPrimitive.ItemIndicator>\n <i className=\"fa-light fa-check\" aria-hidden=\"true\" />\n </ContextMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </ContextMenuPrimitive.CheckboxItem>\n )\n}\n\nfunction ContextMenuRadioItem({\n className,\n children,\n inset,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.RadioItem> & {\n inset?: boolean\n}) {\n return (\n <ContextMenuPrimitive.RadioItem\n data-slot=\"context-menu-radio-item\"\n data-inset={inset}\n className={cn(\n \"relative flex cursor-default items-center gap-1.5 rounded-md py-1 pe-8 ps-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:ps-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_i]:pointer-events-none [&_svg]:shrink-0 [&_i]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n >\n <span\n className=\"pointer-events-none absolute end-2 flex items-center justify-center\"\n data-slot=\"context-menu-radio-item-indicator\"\n >\n <ContextMenuPrimitive.ItemIndicator>\n <i className=\"fa-light fa-check\" aria-hidden=\"true\" />\n </ContextMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </ContextMenuPrimitive.RadioItem>\n )\n}\n\nfunction ContextMenuLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Label> & {\n inset?: boolean\n}) {\n return (\n <ContextMenuPrimitive.Label\n data-slot=\"context-menu-label\"\n data-inset={inset}\n className={cn(\n \"px-1.5 py-1 text-xs font-medium text-muted-foreground data-inset:ps-7\",\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction ContextMenuSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Separator>) {\n return (\n <ContextMenuPrimitive.Separator\n data-slot=\"context-menu-separator\"\n className={cn(\"-mx-1 my-1 h-px bg-border\", className)}\n {...props}\n />\n )\n}\n\nfunction ContextMenuShortcut({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"context-menu-shortcut\"\n className={cn(\n \"ms-auto text-xs tracking-widest text-muted-foreground\",\n className,\n )}\n {...props}\n />\n )\n}\n\nexport {\n ContextMenu,\n ContextMenuTrigger,\n ContextMenuContent,\n ContextMenuItem,\n ContextMenuCheckboxItem,\n ContextMenuRadioGroup,\n ContextMenuRadioItem,\n ContextMenuLabel,\n ContextMenuSeparator,\n ContextMenuShortcut,\n ContextMenuGroup,\n ContextMenuPortal,\n ContextMenuSub,\n ContextMenuSubContent,\n ContextMenuSubTrigger,\n}\n"]}
1
+ {"version":3,"sources":["../../../src/lib/utils.ts","../../../src/lib/dropdown-menu-surface.ts","../../../src/components/ui/context-menu.tsx"],"names":["ContextMenuPrimitive"],"mappings":"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","file":"context-menu.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","/**\n * Default surface sizing for product dropdown menus (view settings, row ⋯, column menus, etc.).\n *\n * Uses **pure CSS** (`w-max` + `min-w-*` + `max-w-*`) so width follows labels and shortcuts\n * without **ResizeObserver** or layout thrash.\n *\n * Override when you need a fixed rail, for example:\n * - `className=\"w-20\"` — page-size picker in `DataTablePaginated`\n * - `className=\"w-(--radix-dropdown-menu-trigger-width) min-w-60\"` — account / identity menus\n * - `className=\"!w-max min-w-72 …\"` — very wide school/program switcher\n */\nexport const DROPDOWN_MENU_CONTENT_SURFACE_CLASS =\n \"min-w-52 w-max max-w-[min(24rem,calc(100vw-2rem))]\" as const\n","\"use client\"\n\n/**\n * ContextMenu — right-click + long-press menu surface backed by Radix\n * `ContextMenu`. Visual surface mirrors `DropdownMenu` so the two read as\n * a consistent menu family across the product (same item heights, same\n * tints, same separator + label rhythm).\n *\n * Use for **secondary, contextual actions** on a specific row, card, or\n * editable region — duplicate, rename, archive, copy link. The primary\n * action SHOULD still be reachable by click / keyboard via a visible\n * trigger; the context menu is an accelerator, not a replacement.\n *\n * Accessibility:\n * - Radix handles the right-click trigger, long-press on touch, the\n * `aria-haspopup` / `aria-expanded` wiring, and arrow-key navigation\n * between items.\n * - Items announce as `role=\"menuitem\"`; `CheckboxItem` and `RadioItem`\n * expose checked / selected state correctly.\n * - Pair with a visible alternative (a `…` overflow `DropdownMenu`) so\n * keyboard-only users can reach the same actions without a pointer.\n */\n\nimport * as React from \"react\"\nimport { ContextMenu as ContextMenuPrimitive } from \"radix-ui\"\nimport { ChevronRight } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\nimport { DROPDOWN_MENU_CONTENT_SURFACE_CLASS } from \"../../lib/dropdown-menu-surface\"\n\nfunction ContextMenu({\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Root>) {\n return <ContextMenuPrimitive.Root data-slot=\"context-menu\" {...props} />\n}\n\nfunction ContextMenuTrigger({\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Trigger>) {\n return (\n <ContextMenuPrimitive.Trigger\n data-slot=\"context-menu-trigger\"\n {...props}\n />\n )\n}\n\nfunction ContextMenuGroup({\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Group>) {\n return <ContextMenuPrimitive.Group data-slot=\"context-menu-group\" {...props} />\n}\n\nfunction ContextMenuPortal({\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Portal>) {\n return (\n <ContextMenuPrimitive.Portal data-slot=\"context-menu-portal\" {...props} />\n )\n}\n\nfunction ContextMenuSub({\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Sub>) {\n return <ContextMenuPrimitive.Sub data-slot=\"context-menu-sub\" {...props} />\n}\n\nfunction ContextMenuRadioGroup({\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.RadioGroup>) {\n return (\n <ContextMenuPrimitive.RadioGroup\n data-slot=\"context-menu-radio-group\"\n {...props}\n />\n )\n}\n\nfunction ContextMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.SubTrigger> & {\n inset?: boolean\n}) {\n return (\n <ContextMenuPrimitive.SubTrigger\n data-slot=\"context-menu-sub-trigger\"\n data-inset={inset}\n className={cn(\n \"flex cursor-default items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground data-inset:ps-7 [&_svg]:pointer-events-none [&_i]:pointer-events-none [&_svg]:shrink-0 [&_i]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n >\n {children}\n <ChevronRight className=\"ms-auto size-4 text-muted-foreground\" aria-hidden=\"true\" />\n </ContextMenuPrimitive.SubTrigger>\n )\n}\n\nfunction ContextMenuSubContent({\n className,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.SubContent>) {\n return (\n <ContextMenuPrimitive.SubContent\n data-slot=\"context-menu-sub-content\"\n className={cn(\n \"z-50 min-w-32 origin-(--radix-context-menu-content-transform-origin) overflow-hidden rounded-lg bg-popover p-1 text-popover-foreground shadow-md ring-1 ring-foreground/10 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n DROPDOWN_MENU_CONTENT_SURFACE_CLASS,\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction ContextMenuContent({\n className,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Content>) {\n return (\n <ContextMenuPrimitive.Portal>\n <ContextMenuPrimitive.Content\n data-slot=\"context-menu-content\"\n className={cn(\n \"z-50 max-h-(--radix-context-menu-content-available-height) origin-(--radix-context-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-lg bg-popover p-1 text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-end-2 data-[side=right]:slide-in-from-start-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n DROPDOWN_MENU_CONTENT_SURFACE_CLASS,\n className,\n )}\n {...props}\n />\n </ContextMenuPrimitive.Portal>\n )\n}\n\nfunction ContextMenuItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Item> & {\n inset?: boolean\n variant?: \"default\" | \"destructive\"\n}) {\n return (\n <ContextMenuPrimitive.Item\n data-slot=\"context-menu-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"relative flex cursor-default items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:ps-7 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_i]:pointer-events-none [&_svg]:shrink-0 [&_i]:shrink-0 [&_svg:not([class*='size-'])]:size-4 data-[variant=destructive]:*:[svg]:text-destructive\",\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction ContextMenuCheckboxItem({\n className,\n children,\n checked,\n inset,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.CheckboxItem> & {\n inset?: boolean\n}) {\n return (\n <ContextMenuPrimitive.CheckboxItem\n data-slot=\"context-menu-checkbox-item\"\n data-inset={inset}\n className={cn(\n \"relative flex cursor-default items-center gap-1.5 rounded-md py-1 pe-8 ps-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:ps-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_i]:pointer-events-none [&_svg]:shrink-0 [&_i]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n checked={checked}\n {...props}\n >\n <span\n className=\"pointer-events-none absolute end-2 flex items-center justify-center\"\n data-slot=\"context-menu-checkbox-item-indicator\"\n >\n <ContextMenuPrimitive.ItemIndicator>\n <i className=\"fa-light fa-check\" aria-hidden=\"true\" />\n </ContextMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </ContextMenuPrimitive.CheckboxItem>\n )\n}\n\nfunction ContextMenuRadioItem({\n className,\n children,\n inset,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.RadioItem> & {\n inset?: boolean\n}) {\n return (\n <ContextMenuPrimitive.RadioItem\n data-slot=\"context-menu-radio-item\"\n data-inset={inset}\n className={cn(\n \"relative flex cursor-default items-center gap-1.5 rounded-md py-1 pe-8 ps-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:ps-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_i]:pointer-events-none [&_svg]:shrink-0 [&_i]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n >\n <span\n className=\"pointer-events-none absolute end-2 flex items-center justify-center\"\n data-slot=\"context-menu-radio-item-indicator\"\n >\n <ContextMenuPrimitive.ItemIndicator>\n <i className=\"fa-light fa-check\" aria-hidden=\"true\" />\n </ContextMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </ContextMenuPrimitive.RadioItem>\n )\n}\n\nfunction ContextMenuLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Label> & {\n inset?: boolean\n}) {\n return (\n <ContextMenuPrimitive.Label\n data-slot=\"context-menu-label\"\n data-inset={inset}\n className={cn(\n \"px-1.5 py-1 text-xs font-medium text-muted-foreground data-inset:ps-7\",\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction ContextMenuSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Separator>) {\n return (\n <ContextMenuPrimitive.Separator\n data-slot=\"context-menu-separator\"\n className={cn(\"-mx-1 my-1 h-px bg-border\", className)}\n {...props}\n />\n )\n}\n\nfunction ContextMenuShortcut({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"context-menu-shortcut\"\n className={cn(\n \"ms-auto text-xs tracking-widest text-muted-foreground\",\n className,\n )}\n {...props}\n />\n )\n}\n\nexport {\n ContextMenu,\n ContextMenuTrigger,\n ContextMenuContent,\n ContextMenuItem,\n ContextMenuCheckboxItem,\n ContextMenuRadioGroup,\n ContextMenuRadioItem,\n ContextMenuLabel,\n ContextMenuSeparator,\n ContextMenuShortcut,\n ContextMenuGroup,\n ContextMenuPortal,\n ContextMenuSub,\n ContextMenuSubContent,\n ContextMenuSubTrigger,\n}\n"]}
@@ -405,7 +405,7 @@ function PopoverContent({
405
405
  "data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
406
406
  "data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
407
407
  "data-[side=bottom]:slide-in-from-top-2 data-[side=top]:slide-in-from-bottom-2",
408
- "data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2",
408
+ "data-[side=left]:slide-in-from-end-2 data-[side=right]:slide-in-from-start-2",
409
409
  className
410
410
  ),
411
411
  ...props