@vectramindnpm/unified-design-system 0.1.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/tokens/designTokens.js","../src/tokens/semanticTokens.js","../src/tokens/componentTokens.js","../src/types/view-mode.ts","../src/lib/utils.ts","../src/components/ui/avatar.tsx","../src/components/ui/badge.tsx","../src/components/ui/button.tsx","../src/components/ui/tooltip.tsx","../src/components/ui/buttonIcon.tsx","../src/components/ui/iconTokens.ts","../src/components/ui/card.tsx","../src/components/ui/checkbox.tsx","../src/components/ui/delete-action.tsx","../src/components/ui/icon.tsx","../src/components/ui/dialog.tsx","../src/components/ui/dropdown-menu.tsx","../src/components/ui/expandable-search.tsx","../src/components/ui/input.tsx","../src/components/ui/file-input.tsx","../src/components/ui/form-field.tsx","../src/components/ui/list.tsx","../src/components/ui/loader.tsx","../src/components/ui/popover.tsx","../src/components/ui/radio.tsx","../src/components/ui/scroll-area.tsx","../src/components/ui/scroll-to-field-error.tsx","../src/components/ui/switch.tsx","../src/components/ui/tab.tsx","../src/components/ui/table.tsx","../src/components/ui/textarea.tsx","../src/components/ui/time-picker.tsx","../src/components/ui/toast.tsx","../src/components/ui/truncated-text.tsx","../src/components/ui/view-toggle.tsx"],"sourcesContent":["// ---------------------------------------------------------------------------\n// @vmcare/ui — public entry point\n// ---------------------------------------------------------------------------\n\n// Design tokens (raw → semantic → component level)\nexport { designTokens, semanticTokens, componentTokens } from \"./tokens\";\n\n// Shared types\nexport { EViewMode } from \"./types/view-mode\";\n\n// Utilities\nexport { cn } from \"./lib/utils\";\n\n// Components\nexport { Avatar, AvatarImage, AvatarFallback } from \"./components/ui/avatar\";\nexport { Badge, badgeVariants, type BadgeProps } from \"./components/ui/badge\";\nexport { Button, buttonVariants, type ButtonProps } from \"./components/ui/button\";\nexport { ButtonIcon, type IconProps as ButtonIconProps } from \"./components/ui/buttonIcon\";\nexport {\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardDescription,\n CardContent,\n} from \"./components/ui/card\";\nexport {\n Checkbox,\n CheckboxIndicator,\n type CheckboxProps,\n type CheckboxIndicatorProps,\n type CheckboxColorVariant,\n type CheckboxSize,\n type CheckBoxRoundedVariant,\n} from \"./components/ui/checkbox\";\nexport { default as DeleteAction } from \"./components/ui/delete-action\";\nexport {\n Dialog,\n DialogPortal,\n DialogOverlay,\n DialogClose,\n DialogTrigger,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n} from \"./components/ui/dialog\";\nexport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuGroup,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuRadioGroup,\n} from \"./components/ui/dropdown-menu\";\nexport { ExpandableSearch } from \"./components/ui/expandable-search\";\nexport { FileInput, type FileInputProps } from \"./components/ui/file-input\";\nexport { default as FormField } from \"./components/ui/form-field\";\nexport { Icon, type IconProps } from \"./components/ui/icon\";\nexport {\n iconVariants,\n getIconColorProps,\n actionColorTokens,\n type IconColor,\n type IconBgColor,\n type ActionColor,\n} from \"./components/ui/iconTokens\";\nexport { Input, type InputProps } from \"./components/ui/input\";\nexport { AppList, AppListHeader, AppListBody, AppListItem, AppListCell } from \"./components/ui/list\";\nexport { default as Loader } from \"./components/ui/loader\";\nexport { Popover, PopoverTrigger, PopoverContent } from \"./components/ui/popover\";\nexport {\n RadioButton,\n type RadioButtonProps,\n type RadioColorVariant,\n type RadioSize,\n} from \"./components/ui/radio\";\nexport { ScrollArea, ScrollBar } from \"./components/ui/scroll-area\";\nexport { default as ScrollToFieldError } from \"./components/ui/scroll-to-field-error\";\nexport { Switch } from \"./components/ui/switch\";\nexport { Tab, tabVariants, type TabProps } from \"./components/ui/tab\";\nexport {\n Table,\n tableVariants,\n type TableProps,\n type TableHeaderItem,\n} from \"./components/ui/table\";\nexport { Textarea, type TextareaProps } from \"./components/ui/textarea\";\nexport { default as TimePicker, type TimePickerProps } from \"./components/ui/time-picker\";\nexport { Toast, type ToastProps } from \"./components/ui/toast\";\nexport {\n Tooltip,\n TooltipTrigger,\n TooltipContent,\n TooltipProvider,\n} from \"./components/ui/tooltip\";\nexport { TruncatedText, CARD_TEXT_LIMIT } from \"./components/ui/truncated-text\";\nexport { ViewToggle, useViewMode, type ViewMode } from \"./components/ui/view-toggle\";\n","const font = {\r\n family: {\r\n base: \"Inter, Helvetica, Arial, sans-serif\",\r\n },\r\n\r\n // Single source of truth for the type scale — also exported below as `text` (alias)\r\n // so any existing consumer of designTokens.text keeps working unchanged.\r\n size: {\r\n \"2xs\": \"0.625rem\",\r\n xs: \"0.6875rem\",\r\n sm: \"0.8125rem\",\r\n base: \"1rem\",\r\n md: \"1.0625rem\",\r\n lg: \"1.125rem\",\r\n xl: \"1.3125rem\",\r\n \"2xl\": \"1.5rem\",\r\n \"3xl\": \"1.75rem\",\r\n \"4xl\": \"2rem\",\r\n hero: \"2.5rem\",\r\n },\r\n\r\n lineHeight: {\r\n tight: \"1\",\r\n snug: \"1.15\",\r\n normal: \"1.3\",\r\n },\r\n\r\n weight: {\r\n regular: \"400\",\r\n medium: \"500\",\r\n semibold: \"600\",\r\n bold: \"700\",\r\n },\r\n};\r\n\r\nconst radiusXs = \"0.375rem\";\r\nconst radiusLg = \"1.25rem\";\r\n\r\nconst designTokens = Object.freeze({\r\n color: {\r\n brand: {\r\n purple: \"#5D62B5\",\r\n purple700: \"#424784\",\r\n purple600: \"#4A4F99\",\r\n red: \"#ff686a\",\r\n blue: \"#5c62bc\"\r\n },\r\n\r\n // Numeric shades ordered light -> dark by real lightness. `white`, `gray` and `muted`\r\n // are kept as named exceptions alongside the ramp (matching how Tailwind separates\r\n // white/black from its numeric gray scale).\r\n neutral: {\r\n white: \"#ffffff\",\r\n 100: \"#f9fafb\",\r\n 200: \"#f3f4f6\",\r\n 300: \"#e9eef6\",\r\n muted: \"#f1f1f1\",\r\n 350: \"#e5e7eb\",\r\n 400: \"#dddddd\",\r\n 450: \"#d1d5db\",\r\n 500: \"#ced4da\",\r\n 600: \"#9ca3af\",\r\n gray: \"#6b7280\",\r\n 700: \"#374151\",\r\n 800: \"#263238\",\r\n 900: \"#111827\",\r\n },\r\n\r\n status: {\r\n success: \"#63B58F\",\r\n danger: \"#F2726F\",\r\n warning: \"#F5A623\",\r\n },\r\n\r\n gradient: {\r\n brand:\r\n \"linear-gradient(145deg, #5D62B5 0%, #7B7FD4 50%, #8E92DD 100%)\",\r\n },\r\n\r\n // Chart/dashboard palette colors intentionally do NOT live here — this shared design-token\r\n // architecture (variables.css / designTokens.js / semanticTokens.js / componentTokens.js) is\r\n // scoped to common application UI only. Chart-only colors live in\r\n // src/pages/shared/chartColors.ts, isolated within the Dashboard/Charts implementation.\r\n },\r\n\r\n spacing: {\r\n xs: \"0.25rem\",\r\n sm: \"0.5rem\",\r\n md: \"0.75rem\",\r\n lg: \"1rem\",\r\n xl: \"1.3125rem\",\r\n xxl: \"2rem\",\r\n },\r\n\r\n font,\r\n\r\n // Deprecated alias of font.size — do not add new entries here, extend font.size instead.\r\n text: font.size,\r\n\r\n ctrl: {\r\n xs: \"1.5rem\",\r\n sm: \"1.75rem\",\r\n md: \"2.25rem\",\r\n lg: \"2.75rem\",\r\n xl: \"3rem\",\r\n \"2xl\": \"3.5rem\",\r\n },\r\n\r\n radius: {\r\n xs: radiusXs,\r\n sm: radiusXs, // alias of xs — identical value, kept for backward compatibility\r\n md: \"0.625rem\",\r\n lg: radiusLg,\r\n xl: radiusLg, // alias of lg — identical value, kept for backward compatibility\r\n \"2xl\": \"1.5rem\",\r\n pill: \"9999px\",\r\n },\r\n\r\n shadow: {\r\n sm: \"0 1px 2px rgba(0,0,0,0.05)\",\r\n md: \"0 4px 16px rgba(0,0,0,0.10)\",\r\n lg: \"0 4px 24px rgba(0,0,0,0.08)\",\r\n },\r\n\r\n opacity: {\r\n low: \"0.10\",\r\n mid: \"0.18\",\r\n },\r\n\r\n zIndex: {\r\n overlay: 9999,\r\n modal: 1111,\r\n dropdown: 1021,\r\n },\r\n\r\n motion: {\r\n duration: {\r\n fast: \"150ms\",\r\n normal: \"200ms\",\r\n slow: \"300ms\",\r\n },\r\n\r\n easing: {\r\n standard: \"ease-in-out\",\r\n accel: \"ease-out\",\r\n },\r\n },\r\n});\r\n\r\nexport default designTokens;\r\n","import { designTokens } from \"./index\";\r\nconst { color, radius, spacing, font, shadow, zIndex, motion, opacity } = designTokens;\r\n\r\nconst semanticTokens = Object.freeze({\r\n color: {\r\n text: {\r\n primary: color.neutral[900], // realigned to match the production value already live in variables.css (--color-text-primary)\r\n muted: color.neutral[600], // realigned to match the production value already live in variables.css (--color-text-muted)\r\n refreshIcon: color.brand.purple,\r\n cancel: color.brand.red,\r\n gray: color.neutral.gray,\r\n blue: color.brand.blue,\r\n secondary: color.neutral[700], \r\n white: color.neutral.white,\r\n },\r\n\r\n background: {\r\n surface: color.neutral.white,\r\n card: color.neutral[100],\r\n },\r\n\r\n border: {\r\n default: color.neutral.muted, // matches --color-border-default already declared in variables.css\r\n card: color.neutral[450], // matches --component-card-border-color, the value actually used across the app\r\n primary: color.neutral[350], // corrected — was neutral[900] before the neutral scale was reordered\r\n },\r\n\r\n interactive: {\r\n brand: color.brand.purple,\r\n brandHover: color.brand.purple700,\r\n brandActive: color.brand.purple600, // fills the previously-missing pressed/active state\r\n },\r\n\r\n status: {\r\n success: color.status.success,\r\n danger: color.status.danger,\r\n warning: color.status.warning,\r\n },\r\n\r\n gradient: {\r\n brand: color.gradient.brand,\r\n },\r\n },\r\n\r\n spacing: {\r\n componentGap: spacing.md,\r\n formControl: spacing.sm,\r\n buttonX: spacing.xl,\r\n cardPadding: spacing.lg,\r\n },\r\n\r\n font: {\r\n bodySize: font.size.sm,\r\n labelSize: font.size.xs,\r\n headingSize: font.size.lg,\r\n },\r\n\r\n radius: {\r\n card: radius.lg,\r\n control: radius.md,\r\n modal: radius.lg, // lets componentTokens source modal radius from the semantic layer instead of designTokens directly\r\n },\r\n\r\n shadow: {\r\n elevation1: shadow.sm,\r\n elevation2: shadow.md,\r\n },\r\n\r\n zIndex: {\r\n modal: zIndex.modal,\r\n overlay: zIndex.overlay,\r\n },\r\n\r\n motion: {\r\n duration: {\r\n short: motion.duration.fast,\r\n default: motion.duration.normal,\r\n },\r\n },\r\n\r\n disabled: {\r\n opacity: opacity.mid,\r\n },\r\n\r\n focus: {\r\n ring: color.brand.purple,\r\n },\r\n});\r\n\r\nexport default semanticTokens;\r\n","import { semanticTokens } from \"./index\";\r\nconst { color, spacing, shadow, zIndex, radius } = semanticTokens;\r\n\r\nconst componentTokens = Object.freeze({\r\n component: {\r\n button: {\r\n paddingX: spacing.buttonX,\r\n paddingY: spacing.formControl,\r\n background: color.interactive.brand,\r\n backgroundHover: color.interactive.brandHover,\r\n textColor: color.background.surface,\r\n radius: radius.control,\r\n shadow: shadow.elevation1,\r\n },\r\n\r\n card: {\r\n padding: spacing.cardPadding,\r\n background: color.background.card,\r\n borderColor: color.border.card,\r\n radius: radius.card,\r\n shadow: shadow.elevation1,\r\n },\r\n\r\n modal: {\r\n overlayZ: zIndex.overlay,\r\n z: zIndex.modal,\r\n contentRadius: radius.modal,\r\n },\r\n\r\n // The tokens below are utility CSS custom properties defined in responsive.css / tailwind.css.\r\n // They sit outside the designTokens -> semanticTokens -> componentTokens hierarchy and are\r\n // re-exposed here for convenience only; there is no backing JS design/semantic token for them.\r\n panel: {\r\n xs: \"var(--panel-xs)\",\r\n sm: \"var(--panel-sm)\",\r\n md: \"var(--panel-md)\",\r\n lg: \"var(--panel-lg)\",\r\n xl: \"var(--panel-xl)\",\r\n \"2xl\": \"var(--panel-2xl)\",\r\n dash: \"var(--panel-dash)\",\r\n },\r\n\r\n sticky: {\r\n table: {\r\n top: \"var(--sticky-table-top)\",\r\n },\r\n },\r\n\r\n sp: {\r\n 0: \"var(--sp-0)\",\r\n \"0-5\": \"var(--sp-0-5)\",\r\n 1: \"var(--sp-1)\",\r\n \"1-5\": \"var(--sp-1-5)\",\r\n 2: \"var(--sp-2)\",\r\n \"2-5\": \"var(--sp-2-5)\",\r\n 3: \"var(--sp-3)\",\r\n 4: \"var(--sp-4)\",\r\n 5: \"var(--sp-5)\",\r\n 6: \"var(--sp-6)\",\r\n 7: \"var(--sp-7)\",\r\n 8: \"var(--sp-8)\",\r\n 10: \"var(--sp-10)\",\r\n 12: \"var(--sp-12)\",\r\n 16: \"var(--sp-16)\",\r\n 20: \"var(--sp-20)\",\r\n px: \"var(--sp-px)\",\r\n },\r\n\r\n radius: {\r\n full: \"var(--radius-full)\",\r\n },\r\n\r\n z: {\r\n base: \"var(--z-base)\",\r\n dropdown: \"var(--z-dropdown)\",\r\n sticky: \"var(--z-sticky)\",\r\n overlay: \"var(--z-overlay)\",\r\n drawer: \"var(--z-drawer)\",\r\n modal: \"var(--z-modal)\",\r\n toast: \"var(--z-toast)\",\r\n },\r\n\r\n animation: {\r\n delay: \"var(--animation-delay)\",\r\n },\r\n\r\n duration: \"var(--duration)\",\r\n\r\n animate: {\r\n spin: \"var(--animate-spin)\",\r\n },\r\n\r\n shimmer: {\r\n width: \"var(--shimmer-width)\",\r\n },\r\n\r\n space: {\r\n page: {\r\n x: \"var(--space-page-x)\",\r\n y: \"var(--space-page-y)\",\r\n },\r\n card: \"var(--space-card)\",\r\n },\r\n\r\n content: {\r\n max: {\r\n width: \"var(--content-max-width)\",\r\n },\r\n },\r\n },\r\n});\r\n\r\nexport default componentTokens;\r\n","// Standalone stand-in for the app's `models/utilitiesModel.EViewMode`.\n// Kept minimal and local to this package so components don't depend on the app's model layer.\nexport enum EViewMode {\n GRID = \"grid\",\n LIST = \"list\",\n}\n","import { type ClassValue, clsx } from \"clsx\";\r\nimport { twMerge } from \"tailwind-merge\";\r\n\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs));\r\n}\r\n","import * as React from \"react\";\r\nimport { cn } from \"../../lib/utils\";\r\n\r\nconst Avatar = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement>\r\n>(({ className, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n className={cn(\r\n \"relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full\",\r\n className,\r\n )}\r\n {...props}\r\n />\r\n));\r\nAvatar.displayName = \"Avatar\";\r\n\r\nconst AvatarImage = React.forwardRef<\r\n HTMLImageElement,\r\n React.ImgHTMLAttributes<HTMLImageElement>\r\n>(({ className, ...props }, ref) => (\r\n <img\r\n ref={ref}\r\n className={cn(\"aspect-square h-full w-full object-cover\", className)}\r\n {...props}\r\n />\r\n));\r\nAvatarImage.displayName = \"AvatarImage\";\r\n\r\nconst AvatarFallback = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement>\r\n>(({ className, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n className={cn(\r\n \"flex h-full w-full items-center justify-center rounded-full bg-muted\",\r\n className,\r\n )}\r\n {...props}\r\n />\r\n));\r\nAvatarFallback.displayName = \"AvatarFallback\";\r\n\r\nexport { Avatar, AvatarImage, AvatarFallback };\r\n","import { type VariantProps, cva } from \"class-variance-authority\";\r\nimport * as React from \"react\";\r\nimport { cn } from \"../../lib/utils\";\r\n\r\nconst badgeVariants = cva(\r\n \"\",\r\n {\r\n variants: {\r\n variant: {\r\n default: \"\",\r\n secondary: \"\",\r\n destructive: \"\",\r\n outline: \"\",\r\n hold: \"\",\r\n transfer: \"\",\r\n noShow: \"\",\r\n success: \"\",\r\n normal: \"\",\r\n pending: \"\",\r\n tag: \"\",\r\n active: \"\",\r\n inactive: \"\",\r\n count: \"\",\r\n code: \"\",\r\n },\r\n },\r\n defaultVariants: {\r\n variant: \"default\",\r\n },\r\n },\r\n);\r\n\r\nexport interface BadgeProps\r\n extends React.HTMLAttributes<HTMLDivElement>,\r\n VariantProps<typeof badgeVariants> {\r\n dot?: boolean;\r\n}\r\n\r\nfunction Badge({ className, variant, style, dot, children, ...props }: BadgeProps) {\r\n const base = 'inline-flex items-center justify-center px-2 py-0.5 rounded-full text-xs font-medium';\r\n const variantClass =\r\n variant === 'destructive'\r\n ? 'text-status-danger bg-status-danger/10'\r\n : variant === 'secondary'\r\n ? 'text-text-muted bg-transparent'\r\n : variant === 'outline'\r\n ? 'border border-border-default text-foreground bg-transparent'\r\n : variant === 'hold'\r\n ? 'text-[var(--component-table-pill-hold-text)] bg-[var(--component-table-pill-hold-bg)]'\r\n : variant === 'transfer'\r\n ? 'text-[var(--component-table-pill-transfer-text)] bg-[var(--component-table-pill-transfer-bg)]'\r\n : variant === 'noShow'\r\n ? 'text-[var(--component-table-pill-noshow-text)] bg-[var(--component-table-pill-noshow-bg)]'\r\n : variant === 'success'\r\n ? 'text-[var(--component-table-pill-success-text)] bg-[var(--component-table-pill-success-bg)]'\r\n : variant === 'pending'\r\n ? 'text-[var(--component-table-pill-hold-text)] bg-[var(--component-table-pill-hold-bg)] border border-[var(--component-table-pill-hold-border)] font-[700] text-[0.625rem] !py-[0.125rem] !px-[0.5rem]'\r\n : variant === 'normal'\r\n ? 'text-[var(--component-table-pill-neutral-text)] bg-[var(--color-neutral-200)]'\r\n : variant === 'tag'\r\n ? 'text-[var(--component-pill-tag-text)] bg-[var(--component-pill-tag-bg)] border border-[var(--component-pill-tag-border)] gap-1 font-semibold text-[0.6875rem] leading-none !rounded-md !px-2 !py-0.5'\r\n : variant === 'active'\r\n ? 'text-[var(--component-pill-active-text)] bg-[var(--component-pill-active-bg)] border border-[var(--component-pill-active-border)] gap-1.5 font-medium text-[0.6875rem] leading-none !px-[0.625rem] !py-1'\r\n : variant === 'inactive'\r\n ? 'text-[var(--component-pill-inactive-text)] bg-[var(--component-pill-inactive-bg)] border border-[var(--component-pill-inactive-border)] gap-1.5 font-medium text-[0.6875rem] leading-none !px-[0.625rem] !py-1'\r\n : variant === 'count'\r\n ? 'text-white bg-[var(--color-brand-purple)] font-medium leading-none !w-[1.125rem] !h-[1.125rem] !px-0 !py-0 !text-[0.625rem]'\r\n : variant === 'code'\r\n ? 'text-[var(--color-brand-teal)] bg-[var(--color-brand-teal-tint)] font-medium uppercase truncate shrink-0 !px-3 !py-1'\r\n : '';\r\n\r\n return (\r\n <div className={cn(base, variantClass, badgeVariants({ variant }), className)} style={style} {...props}>\r\n {dot && <span className=\"w-1.5 h-1.5 rounded-full bg-current shrink-0\" />}\r\n {children}\r\n </div>\r\n );\r\n}\r\n\r\nexport { Badge, badgeVariants };\r\n","import { type VariantProps, cva } from \"class-variance-authority\";\r\nimport * as React from \"react\";\r\nimport { cn } from \"../../lib/utils\";\r\nimport { semanticTokens } from \"../../tokens\";\r\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"./tooltip\";\r\n\r\nconst { color }: any = semanticTokens;\r\n\r\n/**\r\n * Button's variant surface is intentionally small — six semantic colors × five sizes ×\r\n * two shapes, all independently composable, instead of one flat enum. It used to carry\r\n * 19 `variant` values that actually conflated four unrelated things: color/emphasis\r\n * (primary/secondary/destructive/...), shape (pill vs. rounded), fixed footer sizing\r\n * (cancel/save/close, formButtonSubmit/Cancel/Back), and one-off page-specific skins\r\n * (lang, submenu, deptedit) — see the README for the full before/after mapping and how\r\n * to reproduce any of those removed one-offs with `className`.\r\n *\r\n * `refreshIcon`/`selectedIcon` were dropped entirely rather than folded in: an icon-only\r\n * refresh/selected button already has a proper home in `ButtonIcon` (`variant=\"refresh\"`),\r\n * so Button doesn't need to duplicate that.\r\n */\r\n// Deliberately empty: all real classes are composed by hand below via `composed`. This is\r\n// only called for its className merge convenience — filling this in duplicates `baseClasses`\r\n// (specifically `text-body`), and since `text-body` isn't a Tailwind-recognized font-size\r\n// token, tailwind-merge treats it as a *text-color* utility — a later duplicate of it then\r\n// wins over and silently erases `text-white`/etc. from `variantClasses`. Ask me how I know.\r\nconst buttonVariants = cva(\r\n \"\",\r\n {\r\n variants: {\r\n variant: {\r\n primary: \"\",\r\n secondary: \"\",\r\n destructive: \"\",\r\n outline: \"\",\r\n ghost: \"\",\r\n link: \"\",\r\n },\r\n size: {\r\n default: \"\",\r\n sm: \"\",\r\n lg: \"\",\r\n icon: \"\",\r\n iconLg: \"\",\r\n },\r\n shape: {\r\n default: \"\",\r\n pill: \"rounded-full\",\r\n },\r\n selected: {\r\n true: \"\",\r\n false: \"\",\r\n },\r\n },\r\n defaultVariants: {\r\n variant: \"primary\",\r\n size: \"default\",\r\n shape: \"default\",\r\n },\r\n },\r\n);\r\n\r\nexport interface ButtonProps\r\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\r\n VariantProps<typeof buttonVariants> {\r\n asChild?: boolean;\r\n selected?: boolean;\r\n /** Wraps the button in a Tooltip showing this text, instead of requiring a separate Tooltip wrapper at every call site. */\r\n tooltipText?: string;\r\n}\r\n\r\n// Color/emphasis only — shape and size are handled entirely separately below, so none of\r\n// these carry padding, radius, or height.\r\nconst variantClasses = {\r\n primary: \"bg-interactive-brand text-white hover:bg-interactive-brand-hover\",\r\n secondary: \"bg-neutral-white border border-[var(--btn-secondary-color)] text-[var(--btn-secondary-color)] hover:bg-popover\",\r\n destructive: \"bg-destructive text-destructive-foreground hover:brightness-95\",\r\n outline: \"bg-transparent border border-border-default text-foreground hover:bg-popover\",\r\n ghost: \"bg-transparent text-foreground hover:bg-popover\",\r\n link: \"bg-transparent text-interactive-brand underline-offset-4 hover:underline\",\r\n} as const;\r\n\r\nconst variantStyles: Partial<Record<keyof typeof variantClasses, React.CSSProperties>> = {\r\n secondary: { [\"--btn-secondary-color\" as any]: color.text.cancel },\r\n};\r\n\r\nconst sizeClasses = {\r\n default: \"px-4 py-1\",\r\n sm: \"h-8 px-3 py-2 rounded-md\",\r\n lg: \"h-10 px-8 py-2 text-lg rounded-lg\",\r\n icon: \"p-[0.5rem] rounded-lg\",\r\n iconLg: \"h-9 w-9 p-0\",\r\n} as const;\r\n\r\n// Same size names, but pill shape's own (slightly more compact) padding scale — matches\r\n// the original dedicated `pill` variant's sizing exactly.\r\nconst pillSizeClasses = {\r\n default: \"px-3.5 py-2 text-[0.8125rem]\",\r\n sm: \"px-3 py-1 text-[0.75rem]\",\r\n lg: \"px-4 py-2 text-[0.9375rem]\",\r\n icon: \"h-10 w-10 p-0\",\r\n iconLg: \"h-12 w-12 p-0\",\r\n} as const;\r\n\r\nconst pillUnselected = \"bg-neutral-white border border-neutral-350 text-neutral-600 hover:border-interactive-brand hover:text-interactive-brand\";\r\nconst pillSelected = \"bg-[var(--pill-selected-bg)] border border-interactive-brand text-interactive-brand\";\r\nconst pillDisabled = \"opacity-50 cursor-not-allowed\";\r\n\r\n// Non-pill `selected` — the shared gradient treatment, unchanged from before.\r\nconst selectedGradient = \"border border-interactive-brand bg-gradient-to-r from-[var(--color-button-selected-gradient-start)] via-[var(--color-button-selected-gradient-mid)] to-interactive-brand text-white font-extrabold\";\r\n\r\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\r\n ({ className, variant, size, shape, asChild = false, children, style, selected, tooltipText, ...props }, ref) => {\r\n const finalVariant = variant ?? \"primary\";\r\n const finalSize = size ?? \"default\";\r\n const isPill = shape === \"pill\";\r\n const isLink = finalVariant === \"link\";\r\n const isIconButton = finalSize === \"icon\" || finalSize === \"iconLg\";\r\n\r\n const baseClasses = cn(\r\n \"inline-flex items-center justify-center gap-2 font-medium text-body rounded-md disabled:opacity-50\",\r\n isIconButton\r\n ? \"focus:outline-none focus:ring-0 focus:ring-offset-0 focus-visible:outline-none focus-visible:ring-0 focus-visible:ring-offset-0 focus-within:ring-0\"\r\n : \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-interactive-brand\",\r\n );\r\n\r\n const composed = cn(\r\n baseClasses,\r\n isPill ? \"rounded-full\" : \"\",\r\n variantClasses[finalVariant],\r\n // Link never carries the size scale's own padding/height — it reads as inline text.\r\n isLink ? \"h-auto p-0\" : isPill ? pillSizeClasses[finalSize] : sizeClasses[finalSize],\r\n isPill ? (selected ? pillSelected : pillUnselected) : selected ? selectedGradient : \"\",\r\n isPill && (props as any).disabled ? pillDisabled : \"\",\r\n buttonVariants({ variant: finalVariant, size: finalSize, shape, className }),\r\n );\r\n\r\n const mergedStyle: React.CSSProperties = {\r\n ...variantStyles[finalVariant],\r\n ...(isPill && selected ? { [\"--pill-selected-bg\" as any]: `${color.text.blue}24` } : undefined),\r\n ...style,\r\n };\r\n\r\n const element =\r\n asChild && React.isValidElement(children) ? (\r\n React.cloneElement(children as React.ReactElement<any>, {\r\n className: cn(composed, (children as any).props?.className),\r\n ref,\r\n ...props,\r\n })\r\n ) : (\r\n <button className={cn(composed)} ref={ref} style={mergedStyle} {...props}>\r\n {children}\r\n </button>\r\n );\r\n\r\n if (!tooltipText) {\r\n return element;\r\n }\r\n\r\n return (\r\n <Tooltip>\r\n <TooltipTrigger asChild>{element}</TooltipTrigger>\r\n <TooltipContent>\r\n <small>{tooltipText}</small>\r\n </TooltipContent>\r\n </Tooltip>\r\n );\r\n },\r\n);\r\nButton.displayName = \"Button\";\r\n\r\nexport { Button, buttonVariants };\r\n","import * as React from \"react\"\r\nimport { createPortal } from \"react-dom\"\r\nimport { cn } from \"../../lib/utils\"\r\n\r\ninterface TooltipContextValue {\r\n open: boolean\r\n setOpen: (open: boolean) => void\r\n triggerRef: React.RefObject<HTMLDivElement | null>\r\n delayDuration?: number\r\n}\r\n\r\nconst TooltipContext = React.createContext<TooltipContextValue | undefined>(undefined)\r\n\r\nfunction useTooltip() {\r\n const context = React.useContext(TooltipContext)\r\n if (!context) {\r\n throw new Error(\"Tooltip components must be used within Tooltip\")\r\n }\r\n return context\r\n}\r\n\r\nconst TooltipProvider = ({ children }: { children: React.ReactNode; delayDuration?: number }) => {\r\n return <>{children}</>\r\n}\r\n\r\ninterface TooltipProps {\r\n open?: boolean\r\n onOpenChange?: (open: boolean) => void\r\n children: React.ReactNode\r\n delayDuration?: number\r\n}\r\n\r\nconst Tooltip = ({ open: controlledOpen, onOpenChange, children, delayDuration = 200 }: TooltipProps) => {\r\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(false)\r\n const triggerRef = React.useRef<HTMLDivElement | null>(null)\r\n const open = controlledOpen !== undefined ? controlledOpen : uncontrolledOpen\r\n const setOpen = onOpenChange || setUncontrolledOpen\r\n\r\n return (\r\n <TooltipContext.Provider value={{ open, setOpen, triggerRef, delayDuration }}>\r\n {children}\r\n </TooltipContext.Provider>\r\n )\r\n}\r\n\r\nconst TooltipTrigger = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement> & { asChild?: boolean }\r\n>(({ children, asChild = false, ...props }, ref) => {\r\n const { setOpen, triggerRef, delayDuration } = useTooltip()\r\n const timeoutRef = React.useRef<NodeJS.Timeout | undefined>(undefined)\r\n\r\n const handleMouseEnter = () => {\r\n if (timeoutRef.current) {\r\n clearTimeout(timeoutRef.current)\r\n }\r\n timeoutRef.current = setTimeout(() => {\r\n setOpen(true)\r\n }, delayDuration)\r\n }\r\n\r\n const handleMouseLeave = () => {\r\n if (timeoutRef.current) {\r\n clearTimeout(timeoutRef.current)\r\n }\r\n setOpen(false)\r\n }\r\n\r\n React.useEffect(() => {\r\n return () => {\r\n if (timeoutRef.current) {\r\n clearTimeout(timeoutRef.current)\r\n }\r\n }\r\n }, [])\r\n\r\n if (asChild && React.isValidElement(children)) {\r\n return React.cloneElement(children as React.ReactElement<any>, {\r\n ref: (node: HTMLDivElement) => {\r\n triggerRef.current = node\r\n if (ref) {\r\n if (typeof ref === 'function') {\r\n ref(node)\r\n } else {\r\n ref.current = node\r\n }\r\n }\r\n },\r\n onMouseEnter: handleMouseEnter,\r\n onMouseLeave: handleMouseLeave,\r\n ...props,\r\n })\r\n }\r\n\r\n return (\r\n <div\r\n ref={(node) => {\r\n triggerRef.current = node\r\n if (ref) {\r\n if (typeof ref === 'function') {\r\n ref(node)\r\n } else {\r\n ref.current = node\r\n }\r\n }\r\n }}\r\n onMouseEnter={handleMouseEnter}\r\n onMouseLeave={handleMouseLeave}\r\n {...props}\r\n >\r\n {children}\r\n </div>\r\n )\r\n})\r\nTooltipTrigger.displayName = \"TooltipTrigger\"\r\n\r\nconst TooltipContent = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement> & {\r\n sideOffset?: number\r\n side?: \"top\" | \"right\" | \"bottom\" | \"left\"\r\n }\r\n>(({ className, sideOffset = 8, side = \"top\", ...props }, ref) => {\r\n const { open, setOpen, triggerRef } = useTooltip()\r\n const contentRef = React.useRef<HTMLDivElement>(null)\r\n const [tooltipPosition, setTooltipPosition] = React.useState({ top: 0, left: 0 })\r\n const [isPositioned, setIsPositioned] = React.useState(false)\r\n\r\n React.useImperativeHandle(ref, () => contentRef.current!)\r\n\r\n React.useEffect(() => {\r\n if (!open || !triggerRef.current) {\r\n setIsPositioned(false)\r\n return\r\n }\r\n\r\n const updatePosition = () => {\r\n if (!triggerRef.current || !contentRef.current) return\r\n\r\n const triggerRect = triggerRef.current.getBoundingClientRect()\r\n const contentRect = contentRef.current.getBoundingClientRect()\r\n\r\n if (contentRect.width === 0 || contentRect.height === 0) {\r\n return\r\n }\r\n\r\n let top = 0\r\n let left = 0\r\n\r\n switch (side) {\r\n case \"top\":\r\n top = triggerRect.top - contentRect.height - sideOffset\r\n left = triggerRect.left + (triggerRect.width - contentRect.width) / 2\r\n break\r\n case \"bottom\":\r\n top = triggerRect.bottom + sideOffset\r\n left = triggerRect.left + (triggerRect.width - contentRect.width) / 2\r\n break\r\n case \"left\":\r\n top = triggerRect.top + (triggerRect.height - contentRect.height) / 2\r\n left = triggerRect.left - contentRect.width - sideOffset\r\n break\r\n case \"right\":\r\n top = triggerRect.top + (triggerRect.height - contentRect.height) / 2\r\n left = triggerRect.right + sideOffset\r\n break\r\n }\r\n\r\n const viewportWidth = window.innerWidth\r\n const viewportHeight = window.innerHeight\r\n\r\n if (left + contentRect.width > viewportWidth - 8) {\r\n left = viewportWidth - contentRect.width - 8\r\n }\r\n if (left < 8) {\r\n left = 8\r\n }\r\n\r\n if (top + contentRect.height > viewportHeight - 8) {\r\n if (side === \"bottom\") {\r\n top = triggerRect.top - contentRect.height - sideOffset\r\n } else if (side === \"right\" || side === \"left\") {\r\n top = viewportHeight - contentRect.height - 8\r\n }\r\n }\r\n if (top < 8) {\r\n top = 8\r\n }\r\n\r\n setTooltipPosition({ top, left })\r\n setIsPositioned(true)\r\n }\r\n\r\n requestAnimationFrame(() => {\r\n updatePosition()\r\n const timer1 = setTimeout(updatePosition, 10)\r\n const timer2 = setTimeout(updatePosition, 50)\r\n const timer3 = setTimeout(updatePosition, 100)\r\n\r\n return () => {\r\n clearTimeout(timer1)\r\n clearTimeout(timer2)\r\n clearTimeout(timer3)\r\n }\r\n })\r\n\r\n window.addEventListener(\"scroll\", updatePosition, true)\r\n window.addEventListener(\"resize\", updatePosition)\r\n\r\n return () => {\r\n window.removeEventListener(\"scroll\", updatePosition, true)\r\n window.removeEventListener(\"resize\", updatePosition)\r\n }\r\n }, [open, sideOffset, side, triggerRef])\r\n\r\n React.useEffect(() => {\r\n if (!open) return\r\n\r\n const handleMouseEnter = () => {\r\n setOpen(true)\r\n }\r\n\r\n const handleMouseLeave = () => {\r\n setOpen(false)\r\n }\r\n\r\n const contentEl = contentRef.current\r\n if (contentEl) {\r\n contentEl.addEventListener(\"mouseenter\", handleMouseEnter)\r\n contentEl.addEventListener(\"mouseleave\", handleMouseLeave)\r\n\r\n return () => {\r\n contentEl.removeEventListener(\"mouseenter\", handleMouseEnter)\r\n contentEl.removeEventListener(\"mouseleave\", handleMouseLeave)\r\n }\r\n }\r\n }, [open, setOpen])\r\n\r\n const isMobileOrTablet =\r\n typeof window !== \"undefined\" && window.innerWidth < 1024\r\n\r\nif (isMobileOrTablet) return null\r\n\r\n if (!open) return null\r\n\r\n const portalRoot = document.getElementById('fpneo') || document.body\r\n\r\n return createPortal(\r\n <div\r\n ref={contentRef}\r\n className={cn(\r\n \"fixed z-[var(--zindex-overlay)] overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-body text-popover-foreground shadow-md transition-opacity duration-150 max-w-[25ch]\",\r\n isPositioned ? \"opacity-100\" : \"opacity-0\",\r\n className\r\n )}\r\n style={{\r\n top: `${tooltipPosition.top}px`,\r\n left: `${tooltipPosition.left}px`,\r\n fontSize: '0.75rem',\r\n whiteSpace: 'pre-line',\r\n wordBreak: 'break-word',\r\n lineHeight: 1\r\n }}\r\n {...props}\r\n />,\r\n portalRoot\r\n )\r\n})\r\nTooltipContent.displayName = \"TooltipContent\"\r\n\r\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\r\n","import * as React from \"react\";\r\nimport { type VariantProps } from \"class-variance-authority\";\r\n\r\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"./tooltip\";\r\nimport { cn } from \"../../lib/utils\";\r\nimport { iconVariants, getIconColorProps, actionColorTokens, type IconColor, type ActionColor } from \"./iconTokens\";\r\n\r\nexport interface IconProps\r\n extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, \"color\">,\r\n VariantProps<typeof iconVariants> {\r\n name: string;\r\n\r\n color?: IconColor;\r\n hoverColor?: IconColor;\r\n // Escape hatch for icon buttons whose fill color IS the semantic signal (e.g. a per-action\r\n // colored circle) and doesn't map onto the named `color` values — takes over the background\r\n // (with a white glyph) instead of `color`/`hoverColor`'s text-color treatment.\r\n bgColor?: string;\r\n bgHoverColor?: string;\r\n // Named shortcut for the row-action circle colors (call/end/hold/transfer/noShow/activate/success).\r\n // Ignored if bgColor is explicitly set.\r\n actionColor?: ActionColor;\r\n\r\n tooltipText?: string;\r\n showTooltip?: boolean;\r\n}\r\n\r\nconst ButtonIcon = React.forwardRef<HTMLButtonElement, IconProps>(\r\n (\r\n {\r\n name,\r\n variant,\r\n size,\r\n color = \"primary\",\r\n hoverColor,\r\n bgColor,\r\n bgHoverColor,\r\n actionColor,\r\n tooltipText,\r\n showTooltip = false,\r\n disabled,\r\n className,\r\n type = \"button\", // Prevent accidental form submission\r\n style,\r\n children,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const isModalClose = variant === \"modalClose\";\r\n // Single source of truth for \"Refresh\" buttons app-wide (see iconTokens.ts) — pins\r\n // size/color/hoverColor/tooltip so every <ButtonIcon variant=\"refresh\" /> is identical,\r\n // regardless of what a caller passes for those props.\r\n const isRefresh = variant === \"refresh\";\r\n const resolvedBg = bgColor\r\n ? { base: bgColor, hover: bgHoverColor }\r\n : actionColor\r\n ? actionColorTokens[actionColor]\r\n : undefined;\r\n const effectiveSize = isRefresh ? \"sm\" : size;\r\n const effectiveColor = isRefresh ? \"primary\" : color;\r\n const effectiveHoverColor = isRefresh ? \"primary\" : isModalClose ? \"danger\" : hoverColor;\r\n const effectiveShowTooltip = isRefresh ? true : showTooltip;\r\n // No fallback here (matches the source app's current behavior) — if `showTooltip`/\r\n // `isRefresh` end up true with no `tooltipText` passed, the tooltip renders empty.\r\n // Pass `tooltipText` explicitly at every call site that shows one.\r\n const effectiveTooltipText = tooltipText;\r\n const colorProps = getIconColorProps(effectiveColor, effectiveHoverColor, resolvedBg);\r\n\r\n const icon = (\r\n <button\r\n ref={ref}\r\n type={type}\r\n disabled={disabled}\r\n style={{ ...colorProps.style, ...style }}\r\n aria-label={effectiveTooltipText}\r\n className={cn(\r\n iconVariants({ variant, size: effectiveSize }),\r\n colorProps.className,\r\n \"inline-flex items-center justify-center\",\r\n // No icon button ever shows a focus ring/outline/shadow — keyboard focusability and\r\n // click behavior are unaffected, only the visual ring is suppressed.\r\n \"focus:outline-none focus:ring-0 focus:ring-offset-0 focus-visible:outline-none focus-visible:ring-0 focus-visible:ring-offset-0 focus-visible:shadow-none focus-within:ring-0\",\r\n !disabled && \"cursor-pointer\",\r\n disabled && \"cursor-not-allowed opacity-50\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n {children ?? <i className={name} aria-hidden=\"true\" />}\r\n </button>\r\n );\r\n\r\n if (!effectiveShowTooltip) {\r\n return icon;\r\n }\r\n\r\n return (\r\n <Tooltip>\r\n <TooltipTrigger asChild>{icon}</TooltipTrigger>\r\n\r\n <TooltipContent>\r\n <small>{effectiveTooltipText}</small>\r\n </TooltipContent>\r\n </Tooltip>\r\n );\r\n }\r\n);\r\n\r\nButtonIcon.displayName = \"ButtonIcon\";\r\n\r\nexport { ButtonIcon, iconVariants };\r\n","import { cva } from \"class-variance-authority\";\r\nimport { semanticTokens } from \"../../tokens\";\r\n\r\nconst { color }: any = semanticTokens;\r\n\r\nexport const iconVariants = cva(\r\n \"inline-flex items-center justify-center transition-all duration-200\",\r\n {\r\n variants: {\r\n variant: {\r\n plain: \"\",\r\n ghost: \"bg-transparent\",\r\n outlined: \"p-2 rounded-lg border border-border-default bg-neutral-white\",\r\n filled: \"p-2 rounded-lg bg-interactive-brand text-neutral-white hover:opacity-[0.85]\",\r\n circle: \"w-8 h-8 rounded-full\",\r\n modalClose: \"p-2 rounded-lg border border-border-default bg-neutral-white mt-0.5\",\r\n refresh: \"p-2 rounded-lg border border-border-default bg-neutral-white\",\r\n },\r\n size: {\r\n xs: \"text-[0.625rem]\",\r\n sm: \"text-[0.875rem]\",\r\n md: \"text-[0.9375rem]\",\r\n lg: \"text-[1.125rem]\",\r\n xl: \"text-[1.5rem]\",\r\n },\r\n },\r\n defaultVariants: {\r\n variant: \"outlined\",\r\n size: \"md\",\r\n },\r\n }\r\n);\r\n\r\nexport type IconColor =\r\n | \"primary\"\r\n | \"secondary\"\r\n | \"danger\"\r\n | \"success\"\r\n | \"warning\"\r\n | \"muted\"\r\n | \"white\";\r\n\r\ninterface IconColorEntry {\r\n base: string;\r\n hover: string;\r\n hoverBg?: string;\r\n hoverBorder?: string;\r\n}\r\n\r\nconst colorTokens: Record<IconColor, IconColorEntry> = {\r\n primary: {\r\n base: color.text.gray,\r\n hover: color.text.blue,\r\n hoverBg: `${color.interactive.brand}10`,\r\n hoverBorder: color.interactive.brand,\r\n },\r\n secondary: {\r\n base: color.text.secondary,\r\n hover: color.text.secondary,\r\n },\r\n muted: {\r\n base: color.text.muted,\r\n hover: color.text.primary,\r\n },\r\n danger: {\r\n base: color.status.danger,\r\n hover: color.status.danger,\r\n hoverBg: `${color.status.danger}1A`,\r\n hoverBorder: `${color.status.danger}66`,\r\n },\r\n success: {\r\n base: color.status.success,\r\n hover: color.status.success,\r\n hoverBg: `${color.status.success}1A`,\r\n hoverBorder: `${color.status.success}66`,\r\n },\r\n warning: {\r\n base: color.status.warning,\r\n hover: color.status.warning,\r\n hoverBg: `${color.status.warning}1A`,\r\n hoverBorder: `${color.status.warning}66`,\r\n },\r\n white: {\r\n base: color.text.white,\r\n hover: color.text.white,\r\n },\r\n};\r\n\r\nexport interface IconBgColor {\r\n base: string;\r\n hover?: string;\r\n}\r\n\r\nexport type ActionColor =\r\n | \"call\"\r\n | \"end\"\r\n | \"hold\"\r\n | \"transfer\"\r\n | \"noShow\"\r\n | \"activate\"\r\n | \"success\";\r\n\r\nexport const actionColorTokens: Record<ActionColor, IconBgColor> = {\r\n call: { base: \"var(--component-table-action-call-bg)\", hover: \"var(--component-table-action-call-hover)\" },\r\n end: { base: \"var(--component-table-action-end-bg)\", hover: \"var(--component-table-action-end-hover)\" },\r\n hold: { base: \"var(--component-table-action-hold-bg)\", hover: \"var(--component-table-action-hold-hover)\" },\r\n transfer: { base: \"var(--component-table-action-transfer-bg)\", hover: \"var(--component-table-action-transfer-hover)\" },\r\n noShow: { base: \"var(--component-table-action-noshow-bg)\", hover: \"var(--component-table-action-noshow-hover)\" },\r\n activate: { base: \"var(--component-table-action-activate-bg)\", hover: \"var(--component-table-action-activate-hover)\" },\r\n success: { base: \"var(--component-table-action-success-bg)\", hover: \"var(--component-table-action-success-hover)\" },\r\n};\r\n\r\nexport function getIconColorProps(colorName: IconColor, hoverColorName?: IconColor, bgColor?: IconBgColor) {\r\n if (bgColor) {\r\n const classes = [\"text-neutral-white\", \"bg-[var(--icon-bg-color)]\", \"hover:opacity-[0.85]\"];\r\n const style: Record<string, string> = { \"--icon-bg-color\": bgColor.base };\r\n return { className: classes.join(\" \"), style };\r\n }\r\n\r\n const classes = [\"text-[var(--icon-color)]\"];\r\n const style: Record<string, string> = {\r\n \"--icon-color\": colorTokens[colorName].base,\r\n };\r\n\r\n if (hoverColorName) {\r\n const hoverEntry = colorTokens[hoverColorName];\r\n\r\n classes.push(\"hover:text-[var(--icon-hover-color)]\");\r\n style[\"--icon-hover-color\"] = hoverEntry.hover;\r\n\r\n if (hoverEntry.hoverBg && hoverEntry.hoverBorder) {\r\n classes.push(\"hover:bg-[var(--icon-hover-bg)] hover:border-[var(--icon-hover-border)]\");\r\n style[\"--icon-hover-bg\"] = hoverEntry.hoverBg;\r\n style[\"--icon-hover-border\"] = hoverEntry.hoverBorder;\r\n }\r\n }\r\n\r\n return { className: classes.join(\" \"), style };\r\n}\r\n","import * as React from \"react\";\r\nimport { cn } from \"../../lib/utils\";\r\n\r\n/**\r\n * Base Card — intentionally unstyled so it works as a generic layout div.\r\n * Pass className to apply any styles (e.g. \"app-card\", \"user-card\", etc.).\r\n * Pass `editing` to append the shared `.app-card--editing` modifier.\r\n */\r\ninterface CardProps extends React.HTMLAttributes<HTMLDivElement> {\r\n /** Appends `.app-card--editing` when true */\r\n editing?: boolean;\r\n}\r\n\r\nconst Card = React.forwardRef<HTMLDivElement, CardProps>(\r\n ({ className, editing, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n className={cn(editing && \"app-card--editing\", className)}\r\n {...props}\r\n />\r\n )\r\n);\r\nCard.displayName = \"Card\";\r\n\r\nconst CardHeader = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement>\r\n>(({ className, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n className={cn(\"flex flex-col space-y-1.5 p-6\", className)}\r\n {...props}\r\n />\r\n));\r\nCardHeader.displayName = \"CardHeader\";\r\n\r\nconst CardTitle = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement>\r\n>(({ className, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n className={cn(\"font-semibold leading-none tracking-tight\", className)}\r\n {...props}\r\n />\r\n));\r\nCardTitle.displayName = \"CardTitle\";\r\n\r\nconst CardDescription = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement>\r\n>(({ className, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n className={cn(\"text-body text-muted-foreground\", className)}\r\n {...props}\r\n />\r\n));\r\nCardDescription.displayName = \"CardDescription\";\r\n\r\nconst CardContent = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement>\r\n>(({ className, ...props }, ref) => (\r\n <div ref={ref} className={cn(\"\", className)} {...props} />\r\n));\r\nCardContent.displayName = \"CardContent\";\r\n\r\nconst CardFooter = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement>\r\n>(({ className, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n className={cn(\"flex items-center\", className)}\r\n {...props}\r\n />\r\n));\r\nCardFooter.displayName = \"CardFooter\";\r\n\r\nexport {\r\n Card,\r\n CardHeader,\r\n CardFooter,\r\n CardTitle,\r\n CardDescription,\r\n CardContent,\r\n};\r\n","import * as React from \"react\";\r\nimport { cn } from \"../../lib/utils\";\r\nimport { semanticTokens } from \"../../tokens\";\r\n\r\nconst { color }: any = semanticTokens;\r\n\r\nexport type CheckboxColorVariant = \"green\" | \"blue\" | \"purple\";\r\nexport type CheckboxSize = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\" | \"3xl\";\r\nexport type CheckBoxRoundedVariant = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\" | \"3xl\";\r\n\r\nconst boxSizeClasses: Record<CheckboxSize, string> = {\r\n sm: \"w-3.5 h-3.5\",\r\n md: \"w-4 h-4\",\r\n lg: \"w-5 h-5\",\r\n xl: \"w-10 h-10\",\r\n \"2xl\": \"w-8 h-8\",\r\n \"3xl\": \"w-9 h-9\",\r\n};\r\n\r\nconst iconSizeClasses: Record<CheckboxSize, string> = {\r\n sm: \"text-[0.5rem]\",\r\n md: \"text-[0.625rem]\",\r\n lg: \"text-[0.75rem]\",\r\n xl: \"text-[0.875rem]\",\r\n \"2xl\": \"text-[1rem]\",\r\n \"3xl\": \"text-[1.125rem]\"\r\n};\r\n\r\nconst dashSizeClasses: Record<CheckboxSize, string> = {\r\n sm: \"w-1.5 h-[0.09375rem]\",\r\n md: \"w-2 h-0.5\",\r\n lg: \"w-2.5 h-0.5\",\r\n xl: \"w-3 h-[0.1875rem]\",\r\n \"2xl\": \"w-3.5 h-[0.1875rem]\",\r\n \"3xl\": \"w-4 h-[0.1875rem]\",\r\n};\r\nconst roundedClasses: Record<CheckBoxRoundedVariant, string> = {\r\n sm: \"rounded-sm\",\r\n md: \"rounded-md\",\r\n lg: \"rounded-lg\",\r\n xl: \"rounded-xl\",\r\n \"2xl\": \"rounded-2xl\",\r\n \"3xl\": \"rounded-3xl\",\r\n};\r\n\r\nfunction getCheckboxVisualProps(\r\n active: boolean,\r\n disabled: boolean | undefined,\r\n colorVariant: CheckboxColorVariant,\r\n roundedVariant?: CheckBoxRoundedVariant\r\n) {\r\n const style: React.CSSProperties | undefined =\r\n colorVariant === \"blue\" ? { [\"--checkbox-checked-color\" as any]: color.text.blue }\r\n : colorVariant === \"purple\" ? { [\"--checkbox-checked-color\" as any]: color.interactive.brand }\r\n : undefined;\r\n\r\n const activeClasses =\r\n colorVariant === \"blue\" || colorVariant === \"purple\"\r\n ? \"bg-[var(--checkbox-checked-color)] border-[var(--checkbox-checked-color)]\"\r\n : \"bg-status-success border-status-success\";\r\n const roundedClass = roundedVariant ? roundedClasses[roundedVariant] : \"rounded\";\r\n const boxClasses = cn(\r\n // \"rounded border-2 flex items-center justify-center transition-colors\",\r\n ` ${roundedClass} border flex items-center justify-center transition-colors`,\r\n active\r\n ? disabled\r\n ? \"bg-neutral-600 border-neutral-600 opacity-60\"\r\n : cn(activeClasses, \"border-transparent\")\r\n : disabled\r\n ? \"bg-neutral-200 border-neutral-350 opacity-60\"\r\n : \"bg-neutral-white border-neutral-450\"\r\n );\r\n\r\n return { style, boxClasses };\r\n}\r\n\r\ninterface CheckboxGlyphProps {\r\n checked?: boolean;\r\n indeterminate?: boolean;\r\n size?: CheckboxSize;\r\n}\r\n\r\nconst CheckboxGlyph = ({ checked, indeterminate, size = \"md\" }: CheckboxGlyphProps) => {\r\n if (indeterminate) {\r\n return <span className={cn(\"block rounded-sm bg-neutral-white\", dashSizeClasses[size])} />;\r\n }\r\n if (checked) {\r\n return <i className={cn(\"icon-neo-check text-neutral-white\", iconSizeClasses[size])} />;\r\n }\r\n return null;\r\n};\r\n\r\nexport interface CheckboxIndicatorProps {\r\n checked?: boolean;\r\n indeterminate?: boolean;\r\n disabled?: boolean;\r\n colorVariant?: CheckboxColorVariant;\r\n size?: CheckboxSize;\r\n className?: string;\r\n roundedVariant?: CheckBoxRoundedVariant;\r\n}\r\n\r\nconst CheckboxIndicator = React.forwardRef<HTMLSpanElement, CheckboxIndicatorProps>(\r\n ({ checked, indeterminate = false, disabled, colorVariant = \"blue\", size = \"md\", className, roundedVariant }, ref) => {\r\n const active = !!checked || indeterminate;\r\n const { style, boxClasses } = getCheckboxVisualProps(active, disabled, colorVariant, roundedVariant);\r\n return (\r\n <span\r\n ref={ref}\r\n aria-hidden=\"true\"\r\n className={cn(boxSizeClasses[size], boxClasses, \"shrink-0\", className)}\r\n style={style}\r\n >\r\n <CheckboxGlyph checked={checked} indeterminate={indeterminate} size={size} />\r\n </span>\r\n );\r\n }\r\n);\r\nCheckboxIndicator.displayName = \"CheckboxIndicator\";\r\n\r\nexport interface CheckboxProps\r\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"type\" | \"size\"> {\r\n colorVariant?: CheckboxColorVariant;\r\n size?: CheckboxSize;\r\n indeterminate?: boolean;\r\n label?: React.ReactNode;\r\n wrapperClassName?: string;\r\n labelClassName?: string;\r\n roundedVariant?: CheckBoxRoundedVariant;\r\n}\r\n\r\nconst Checkbox = React.forwardRef<HTMLInputElement, CheckboxProps>(\r\n (\r\n {\r\n className,\r\n wrapperClassName,\r\n labelClassName,\r\n colorVariant = \"blue\",\r\n size = \"md\",\r\n indeterminate = false,\r\n disabled,\r\n checked,\r\n label,\r\n style,\r\n roundedVariant,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const internalRef = React.useRef<HTMLInputElement>(null);\r\n React.useImperativeHandle(ref, () => internalRef.current as HTMLInputElement);\r\n\r\n // `indeterminate` is a DOM property, not an HTML attribute — React can't set it via props.\r\n React.useEffect(() => {\r\n if (internalRef.current) internalRef.current.indeterminate = indeterminate;\r\n }, [indeterminate]);\r\n\r\n const active = !!checked || indeterminate;\r\n const { style: colorStyle, boxClasses } = getCheckboxVisualProps(active, disabled, colorVariant, roundedVariant);\r\n\r\n // Only wrap in a <label> when this component owns the text — many call sites already\r\n // nest the checkbox inside their own <label> (or a click-handled row) to pair it with\r\n // adjacent text, and a <label> can't validly contain another <label>.\r\n const Wrapper = label ? \"label\" : \"span\";\r\n\r\n return (\r\n <Wrapper\r\n className={cn(\r\n \"inline-flex items-center gap-2.5 select-none\",\r\n label && \"cursor-pointer\",\r\n disabled && \"cursor-not-allowed\",\r\n wrapperClassName\r\n )}\r\n >\r\n <span\r\n className={cn(\"relative inline-flex shrink-0\", boxSizeClasses[size])}\r\n style={{ ...colorStyle, ...style }}\r\n >\r\n <input\r\n ref={internalRef}\r\n type=\"checkbox\"\r\n checked={checked}\r\n disabled={disabled}\r\n className={cn(\r\n \"peer absolute inset-0 w-full h-full opacity-0 cursor-pointer disabled:cursor-not-allowed\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n <span\r\n aria-hidden=\"true\"\r\n className={cn(\r\n boxClasses,\r\n \"w-full h-full peer-focus-visible:ring-2 peer-focus-visible:ring-interactive-brand peer-focus-visible:ring-offset-2\"\r\n )}\r\n >\r\n <CheckboxGlyph checked={checked} indeterminate={indeterminate} size={size} />\r\n </span>\r\n </span>\r\n {label && <span className={cn(\"text-[0.8125rem] text-neutral-700 font-normal\", labelClassName)}>{label}</span>}\r\n </Wrapper>\r\n );\r\n }\r\n);\r\nCheckbox.displayName = \"Checkbox\";\r\n\r\nexport { Checkbox, CheckboxIndicator };\r\n","import React from \"react\";\r\nimport { Icon } from \"./icon\";\r\n\r\ninterface DeleteActionProps {\r\n onClick: () => void;\r\n tooltipText?: string;\r\n showTooltip?: boolean;\r\n className?: string;\r\n}\r\n\r\nconst DeleteAction: React.FC<DeleteActionProps> = ({ onClick, tooltipText, showTooltip = true, className }) => {\r\n return (\r\n <Icon\r\n name=\"icon-neo-trash\"\r\n hoverColor=\"danger\"\r\n onClick={onClick}\r\n showTooltip={showTooltip}\r\n tooltipText={tooltipText || \"Delete\"}\r\n className={className}\r\n />\r\n );\r\n};\r\n\r\nexport default DeleteAction;\r\n","import * as React from \"react\";\r\nimport { type VariantProps } from \"class-variance-authority\";\r\n\r\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"./tooltip\";\r\nimport { cn } from \"../../lib/utils\";\r\nimport { iconVariants, getIconColorProps, type IconColor } from \"./iconTokens\";\r\n\r\nexport interface IconProps\r\n extends Omit<React.HTMLAttributes<HTMLElement>, \"color\">,\r\n VariantProps<typeof iconVariants> {\r\n name: string;\r\n\r\n color?: IconColor;\r\n hoverColor?: IconColor;\r\n\r\n tooltipText?: string;\r\n showTooltip?: boolean;\r\n disabled?: boolean;\r\n}\r\n\r\nconst Icon = React.forwardRef<HTMLElement, IconProps>(\r\n (\r\n {\r\n name,\r\n variant,\r\n size,\r\n color = \"primary\",\r\n hoverColor,\r\n tooltipText,\r\n showTooltip = false,\r\n disabled,\r\n className,\r\n onClick,\r\n style,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const colorProps = getIconColorProps(color, hoverColor);\r\n\r\n const icon = (\r\n <i\r\n ref={ref}\r\n className={cn(\r\n `${name}`,\r\n iconVariants({ variant, size }),\r\n colorProps.className,\r\n onClick && !disabled && \"cursor-pointer\",\r\n className\r\n )}\r\n onClick={onClick}\r\n style={{ ...colorProps.style, ...style }}\r\n role={onClick ? \"button\" : undefined}\r\n tabIndex={onClick ? 0 : undefined}\r\n aria-label={tooltipText || name}\r\n onKeyDown={(e) => {\r\n if (!onClick) return;\r\n\r\n if (e.key === \"Enter\" || e.key === \" \") {\r\n e.preventDefault();\r\n (onClick as React.MouseEventHandler<HTMLElement>)(\r\n e as unknown as React.MouseEvent<HTMLElement>\r\n );\r\n }\r\n }}\r\n {...props}\r\n />\r\n );\r\n\r\n if (!showTooltip) {\r\n return icon;\r\n }\r\n\r\n return (\r\n <Tooltip>\r\n <TooltipTrigger asChild>\r\n {icon}\r\n </TooltipTrigger>\r\n\r\n <TooltipContent>\r\n <small>{tooltipText || name}</small>\r\n </TooltipContent>\r\n </Tooltip>\r\n );\r\n }\r\n);\r\n\r\nIcon.displayName = \"Icon\";\r\n\r\nexport { Icon, iconVariants };\r\n","import * as React from \"react\"\r\nimport { cn } from \"../../lib/utils\"\r\nimport { Button } from \"../ui/button\"\r\nimport { ButtonIcon } from \"./buttonIcon\"\r\n\r\ninterface DialogContextValue {\r\n open: boolean\r\n onOpenChange: (open: boolean) => void\r\n}\r\n\r\nconst DialogContext = React.createContext<DialogContextValue | undefined>(undefined)\r\n\r\nfunction useDialog() {\r\n const context = React.useContext(DialogContext)\r\n if (!context) {\r\n throw new Error(\"Dialog components must be used within Dialog\")\r\n }\r\n return context\r\n}\r\n\r\ninterface DialogProps {\r\n open?: boolean\r\n onOpenChange?: (open: boolean) => void\r\n children: React.ReactNode\r\n}\r\n\r\nconst Dialog = ({ open: controlledOpen, onOpenChange, children }: DialogProps) => {\r\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(false)\r\n const open = controlledOpen !== undefined ? controlledOpen : uncontrolledOpen\r\n const setOpen = onOpenChange || setUncontrolledOpen\r\n\r\n return (\r\n <DialogContext.Provider value={{ open, onOpenChange: setOpen }}>\r\n {children}\r\n </DialogContext.Provider>\r\n )\r\n}\r\n\r\nconst DialogTrigger = React.forwardRef<\r\n HTMLButtonElement,\r\n React.ButtonHTMLAttributes<HTMLButtonElement>\r\n>(({ onClick, ...props }, ref) => {\r\n const { onOpenChange } = useDialog()\r\n return (\r\n <Button\r\n ref={ref}\r\n onClick={(e) => {\r\n onOpenChange(true)\r\n onClick?.(e)\r\n }}\r\n variant=\"ghost\"\r\n size=\"default\"\r\n {...props}\r\n />\r\n )\r\n})\r\nDialogTrigger.displayName = \"DialogTrigger\"\r\n\r\nconst DialogPortal = ({ children }: { children: React.ReactNode }) => {\r\n const { open } = useDialog()\r\n if (!open) return null\r\n return <>{children}</>\r\n}\r\n\r\nconst DialogClose = React.forwardRef<\r\n HTMLButtonElement,\r\n React.ButtonHTMLAttributes<HTMLButtonElement>\r\n>(({ onClick, ...props }, ref) => {\r\n const { onOpenChange } = useDialog()\r\n return (\r\n <Button\r\n ref={ref}\r\n onClick={(e) => {\r\n onOpenChange(false)\r\n onClick?.(e)\r\n }}\r\n variant=\"ghost\"\r\n size=\"default\"\r\n {...props}\r\n />\r\n )\r\n})\r\nDialogClose.displayName = \"DialogClose\"\r\n\r\ninterface DialogOverlayProps extends React.HTMLAttributes<HTMLDivElement> {\r\n /** Set false to prevent clicking the overlay from closing the dialog\r\n * (e.g. confirmation/form dialogs that must not lose input to a stray click). */\r\n closeOnClick?: boolean\r\n}\r\n\r\nconst DialogOverlay = React.forwardRef<\r\n HTMLDivElement,\r\n DialogOverlayProps\r\n>(({ className, onClick, closeOnClick = true, ...props }, ref) => {\r\n const { onOpenChange } = useDialog()\r\n return (\r\n <div\r\n ref={ref}\r\n className={cn(\r\n \"fixed inset-0 z-[var(--zindex-modal)] bg-[var(--color-ext-00000080)] animate-in fade-in-0\",\r\n className\r\n )}\r\n onClick={(e) => {\r\n if (closeOnClick) onOpenChange(false)\r\n onClick?.(e)\r\n }}\r\n {...props}\r\n />\r\n )\r\n})\r\nDialogOverlay.displayName = \"DialogOverlay\"\r\n\r\ninterface DialogContentProps extends React.HTMLAttributes<HTMLDivElement> {\r\n /** Set false when the modal renders its own close control in a custom header. */\r\n showCloseButton?: boolean\r\n /** Set false to prevent the Escape key from closing the dialog. Default true. */\r\n closeOnEscape?: boolean\r\n /** Set false to prevent clicking the overlay from closing the dialog. Default true. */\r\n closeOnOverlayClick?: boolean\r\n}\r\n\r\nconst DialogContent = React.forwardRef<\r\n HTMLDivElement,\r\n DialogContentProps\r\n>(({ className, children, showCloseButton = true, closeOnEscape = true, closeOnOverlayClick = true, ...props }, ref) => {\r\n const { onOpenChange } = useDialog()\r\n\r\n React.useEffect(() => {\r\n if (!closeOnEscape) return\r\n const handleEscape = (e: KeyboardEvent) => {\r\n if (e.key === \"Escape\") {\r\n onOpenChange(false)\r\n }\r\n }\r\n document.addEventListener(\"keydown\", handleEscape)\r\n return () => document.removeEventListener(\"keydown\", handleEscape)\r\n }, [onOpenChange, closeOnEscape])\r\n\r\n return (\r\n <DialogPortal>\r\n <DialogOverlay closeOnClick={closeOnOverlayClick} />\r\n <div\r\n ref={ref}\r\n className={cn(\r\n \"fixed left-[50%] top-[50%] z-[var(--zindex-modal)] grid w-full max-w-6xl translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 animate-in fade-in-0 zoom-in-95 rounded-lg\",\r\n className\r\n )}\r\n onClick={(e) => e.stopPropagation()}\r\n {...props}\r\n >\r\n {children}\r\n {showCloseButton && (\r\n <ButtonIcon\r\n type=\"button\"\r\n name=\"icon-neo-close\"\r\n variant=\"modalClose\"\r\n className=\"absolute right-4 top-4\"\r\n onClick={() => onOpenChange(false)}\r\n />\r\n )}\r\n </div>\r\n </DialogPortal>\r\n )\r\n})\r\nDialogContent.displayName = \"DialogContent\"\r\n\r\nconst DialogHeader = ({\r\n className,\r\n ...props\r\n}: React.HTMLAttributes<HTMLDivElement>) => (\r\n <div\r\n className={cn(\r\n \"flex flex-col space-y-1.5 text-center sm:text-left\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n)\r\nDialogHeader.displayName = \"DialogHeader\"\r\n\r\nconst DialogFooter = ({\r\n className,\r\n ...props\r\n}: React.HTMLAttributes<HTMLDivElement>) => (\r\n <div\r\n className={cn(\r\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n)\r\nDialogFooter.displayName = \"DialogFooter\"\r\n\r\nconst DialogTitle = React.forwardRef<\r\n HTMLHeadingElement,\r\n React.HTMLAttributes<HTMLHeadingElement>\r\n>(({ className, ...props }, ref) => (\r\n <h2\r\n ref={ref}\r\n className={cn(\r\n \"text-heading font-semibold leading-none tracking-tight\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nDialogTitle.displayName = \"DialogTitle\"\r\n\r\nconst DialogDescription = React.forwardRef<\r\n HTMLParagraphElement,\r\n React.HTMLAttributes<HTMLParagraphElement>\r\n>(({ className, ...props }, ref) => (\r\n <p\r\n ref={ref}\r\n className={cn(\"text-body text-muted-foreground\", className)}\r\n {...props}\r\n />\r\n))\r\nDialogDescription.displayName = \"DialogDescription\"\r\n\r\nexport {\r\n Dialog,\r\n DialogPortal,\r\n DialogOverlay,\r\n DialogClose,\r\n DialogTrigger,\r\n DialogContent,\r\n DialogHeader,\r\n DialogFooter,\r\n DialogTitle,\r\n DialogDescription,\r\n}\r\n","import * as React from \"react\"\r\nimport { createPortal } from \"react-dom\"\r\nimport { Check, ChevronRight, Circle } from \"lucide-react\"\r\nimport { cn } from \"../../lib/utils\"\r\nimport { Button } from \"../ui/button\"\r\n\r\ninterface DropdownMenuContextValue {\r\n open: boolean\r\n setOpen: (open: boolean) => void\r\n triggerRef: React.RefObject<HTMLElement | null>\r\n}\r\n\r\nconst DropdownMenuContext = React.createContext<DropdownMenuContextValue | undefined>(undefined)\r\n\r\nfunction useDropdownMenu() {\r\n const context = React.useContext(DropdownMenuContext)\r\n if (!context) {\r\n throw new Error(\"DropdownMenu components must be used within DropdownMenu\")\r\n }\r\n return context\r\n}\r\n\r\ninterface DropdownMenuProps {\r\n open?: boolean\r\n onOpenChange?: (open: boolean) => void\r\n children: React.ReactNode\r\n}\r\n\r\nconst DropdownMenu = ({ open: controlledOpen, onOpenChange, children }: DropdownMenuProps) => {\r\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(false)\r\n const open = controlledOpen !== undefined ? controlledOpen : uncontrolledOpen\r\n const setOpen = onOpenChange || setUncontrolledOpen\r\n const triggerRef = React.useRef<HTMLElement | null>(null)\r\n\r\n return (\r\n <DropdownMenuContext.Provider value={{ open, setOpen, triggerRef }}>\r\n {children}\r\n </DropdownMenuContext.Provider>\r\n )\r\n}\r\n\r\nconst DropdownMenuTrigger = React.forwardRef<\r\n HTMLButtonElement,\r\n React.ButtonHTMLAttributes<HTMLButtonElement> & { asChild?: boolean }\r\n>(({ onClick, children, asChild, ...props }, ref) => {\r\n const { setOpen, open, triggerRef } = useDropdownMenu()\r\n\r\n if (asChild && React.isValidElement(children)) {\r\n return React.cloneElement(children as React.ReactElement<any>, {\r\n ref: (node: HTMLElement) => {\r\n triggerRef.current = node\r\n if (ref) {\r\n if (typeof ref === 'function') {\r\n ref(node as any)\r\n } else {\r\n ref.current = node as any\r\n }\r\n }\r\n },\r\n onClick: (e: React.MouseEvent) => {\r\n setOpen(!open)\r\n const childOnClick = (children as any).props?.onClick\r\n childOnClick?.(e)\r\n onClick?.(e as React.MouseEvent<HTMLButtonElement>)\r\n },\r\n })\r\n }\r\n\r\n return (\r\n <Button\r\n ref={(node) => {\r\n triggerRef.current = node\r\n if (ref) {\r\n if (typeof ref === 'function') {\r\n ref(node)\r\n } else {\r\n ref.current = node\r\n }\r\n }\r\n }}\r\n onClick={(e) => {\r\n setOpen(!open)\r\n onClick?.(e)\r\n }}\r\n variant=\"ghost\"\r\n {...props}\r\n >\r\n {children}\r\n </Button>\r\n )\r\n})\r\nDropdownMenuTrigger.displayName = \"DropdownMenuTrigger\"\r\n\r\nconst DropdownMenuGroup = ({ children }: { children: React.ReactNode }) => {\r\n return <div role=\"group\">{children}</div>\r\n}\r\n\r\nconst DropdownMenuPortal = ({ children }: { children: React.ReactNode }) => {\r\n const portalRoot = document.getElementById('fpneo') || document.body\r\n return createPortal(children, portalRoot)\r\n}\r\n\r\nconst DropdownMenuSub = ({ children }: { children: React.ReactNode }) => {\r\n return <>{children}</>\r\n}\r\n\r\nconst DropdownMenuRadioGroup = ({ children }: { children: React.ReactNode }) => {\r\n return <div role=\"radiogroup\">{children}</div>\r\n}\r\n\r\nconst DropdownMenuSubTrigger = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement> & { inset?: boolean }\r\n>(({ className, inset, children, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n className={cn(\r\n \"flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-body outline-none focus:bg-accent\",\r\n inset && \"pl-8\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n <ChevronRight className=\"ml-auto h-4 w-4\" />\r\n </div>\r\n))\r\nDropdownMenuSubTrigger.displayName = \"DropdownMenuSubTrigger\"\r\n\r\nconst DropdownMenuSubContent = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement>\r\n>(({ className, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n className={cn(\r\n \"z-[var(--zindex-modal)] min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nDropdownMenuSubContent.displayName = \"DropdownMenuSubContent\"\r\n\r\nconst DropdownMenuContent = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement> & { sideOffset?: number; align?: \"start\" | \"center\" | \"end\" }\r\n>(({ className, sideOffset = 4, align = \"end\", ...props }, ref) => {\r\n const { open, setOpen, triggerRef } = useDropdownMenu()\r\n const contentRef = React.useRef<HTMLDivElement>(null)\r\n const [position, setPosition] = React.useState({ top: 0, left: 0 })\r\n const [isPositioned, setIsPositioned] = React.useState(false)\r\n\r\n React.useImperativeHandle(ref, () => contentRef.current!)\r\n\r\n React.useEffect(() => {\r\n if (!open || !triggerRef.current) {\r\n setIsPositioned(false)\r\n return\r\n }\r\n\r\n const updatePosition = () => {\r\n if (!triggerRef.current || !contentRef.current) return\r\n\r\n const contentWidth = contentRef.current.offsetWidth || 0\r\n const contentHeight = contentRef.current.offsetHeight || 0\r\n\r\n if (contentWidth === 0 || contentHeight === 0) {\r\n return\r\n }\r\n\r\n const triggerRect = triggerRef.current.getBoundingClientRect()\r\n\r\n let left = triggerRect.left\r\n let top = triggerRect.bottom + sideOffset\r\n\r\n if (align === \"end\") {\r\n left = triggerRect.right - contentWidth\r\n } else if (align === \"center\") {\r\n left = triggerRect.left + (triggerRect.width - contentWidth) / 2\r\n }\r\n\r\n const viewportWidth = window.innerWidth\r\n const viewportHeight = window.innerHeight\r\n\r\n if (left + contentWidth > viewportWidth - 8) {\r\n left = viewportWidth - contentWidth - 8\r\n }\r\n if (left < 8) {\r\n left = 8\r\n }\r\n\r\n if (top + contentHeight > viewportHeight - 8) {\r\n top = triggerRect.top - contentHeight - sideOffset\r\n }\r\n if (top < 8) {\r\n top = triggerRect.bottom + sideOffset\r\n }\r\n\r\n setPosition({ top, left })\r\n setIsPositioned(true)\r\n }\r\n\r\n requestAnimationFrame(() => {\r\n updatePosition()\r\n const timer1 = setTimeout(updatePosition, 10)\r\n const timer2 = setTimeout(updatePosition, 50)\r\n const timer3 = setTimeout(updatePosition, 100)\r\n\r\n return () => {\r\n clearTimeout(timer1)\r\n clearTimeout(timer2)\r\n clearTimeout(timer3)\r\n }\r\n })\r\n\r\n window.addEventListener(\"scroll\", updatePosition, true)\r\n window.addEventListener(\"resize\", updatePosition)\r\n\r\n return () => {\r\n window.removeEventListener(\"scroll\", updatePosition, true)\r\n window.removeEventListener(\"resize\", updatePosition)\r\n }\r\n }, [open, sideOffset, align, triggerRef])\r\n\r\n React.useEffect(() => {\r\n if (!open) return\r\n\r\n const handleClickOutside = (e: MouseEvent) => {\r\n if (\r\n contentRef.current &&\r\n !contentRef.current.contains(e.target as Node) &&\r\n triggerRef.current &&\r\n !triggerRef.current.contains(e.target as Node)\r\n ) {\r\n setOpen(false)\r\n }\r\n }\r\n\r\n const handleEscape = (e: KeyboardEvent) => {\r\n if (e.key === \"Escape\") {\r\n setOpen(false)\r\n }\r\n }\r\n\r\n document.addEventListener(\"mousedown\", handleClickOutside)\r\n document.addEventListener(\"keydown\", handleEscape)\r\n\r\n return () => {\r\n document.removeEventListener(\"mousedown\", handleClickOutside)\r\n document.removeEventListener(\"keydown\", handleEscape)\r\n }\r\n }, [open, setOpen, triggerRef])\r\n\r\n if (!open) return null\r\n\r\n return (\r\n <DropdownMenuPortal>\r\n <div\r\n ref={contentRef}\r\n className={cn(\r\n \"dropdownHead\",\r\n isPositioned ? \"opacity-100\" : \"opacity-0\",\r\n className\r\n )}\r\n style={{\r\n top: `${position.top}px`,\r\n left: `${position.left}px`,\r\n }}\r\n {...props}\r\n />\r\n </DropdownMenuPortal>\r\n )\r\n})\r\nDropdownMenuContent.displayName = \"DropdownMenuContent\"\r\n\r\nconst DropdownMenuItem = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement> & { inset?: boolean }\r\n>(({ className, inset, onClick, ...props }, ref) => {\r\n const { setOpen } = useDropdownMenu()\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n className={cn(\r\n \"dropdownInner\",\r\n inset && \"pl-8\",\r\n className\r\n )}\r\n onClick={(e) => {\r\n onClick?.(e)\r\n setOpen(false)\r\n }}\r\n {...props}\r\n />\r\n )\r\n})\r\nDropdownMenuItem.displayName = \"DropdownMenuItem\"\r\n\r\nconst DropdownMenuCheckboxItem = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement> & { checked?: boolean }\r\n>(({ className, children, checked, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n className={cn(\r\n \"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-body transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\r\n {checked && <Check className=\"h-4 w-4\" />}\r\n </span>\r\n {children}\r\n </div>\r\n))\r\nDropdownMenuCheckboxItem.displayName = \"DropdownMenuCheckboxItem\"\r\n\r\nconst DropdownMenuRadioItem = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement>\r\n>(({ className, children, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n className={cn(\r\n \"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-body outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\r\n <Circle className=\"h-2 w-2 fill-current\" />\r\n </span>\r\n {children}\r\n </div>\r\n))\r\nDropdownMenuRadioItem.displayName = \"DropdownMenuRadioItem\"\r\n\r\nconst DropdownMenuLabel = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement> & { inset?: boolean }\r\n>(({ className, inset, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n className={cn(\r\n \"px-2 py-1.5 text-label font-semibold\",\r\n inset && \"pl-8\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nDropdownMenuLabel.displayName = \"DropdownMenuLabel\"\r\n\r\nconst DropdownMenuSeparator = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement>\r\n>(({ className, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n className={cn(\"my-1 h-px bg-neutral-350\", className)}\r\n {...props}\r\n />\r\n))\r\nDropdownMenuSeparator.displayName = \"DropdownMenuSeparator\"\r\n\r\nconst DropdownMenuShortcut = ({\r\n className,\r\n ...props\r\n}: React.HTMLAttributes<HTMLSpanElement>) => {\r\n return (\r\n <span\r\n className={cn(\"ml-auto text-label tracking-widest opacity-60\", className)}\r\n {...props}\r\n />\r\n )\r\n}\r\nDropdownMenuShortcut.displayName = \"DropdownMenuShortcut\"\r\n\r\nexport {\r\n DropdownMenu,\r\n DropdownMenuTrigger,\r\n DropdownMenuContent,\r\n DropdownMenuItem,\r\n DropdownMenuCheckboxItem,\r\n DropdownMenuRadioItem,\r\n DropdownMenuLabel,\r\n DropdownMenuSeparator,\r\n DropdownMenuShortcut,\r\n DropdownMenuGroup,\r\n DropdownMenuPortal,\r\n DropdownMenuSub,\r\n DropdownMenuSubContent,\r\n DropdownMenuSubTrigger,\r\n DropdownMenuRadioGroup,\r\n}\r\n","import React, { useEffect, useRef, useState } from \"react\";\r\nimport { Button } from \"../ui/button\";\r\nimport { Input } from \"./input\";\r\n\r\ninterface ExpandableSearchProps {\r\n onSearch: (value: string) => void;\r\n placeholder?: string;\r\n className?: string;\r\n}\r\n\r\nexport const ExpandableSearch = ({ onSearch, placeholder = \"Search...\", className = \"\" }: ExpandableSearchProps): React.JSX.Element => {\r\n const [isExpanded, setIsExpanded] = useState(false);\r\n const [searchValue, setSearchValue] = useState(\"\");\r\n const inputRef = useRef<HTMLInputElement>(null);\r\n\r\n useEffect(() => {\r\n if (isExpanded && inputRef.current) {\r\n inputRef.current.focus();\r\n }\r\n }, [isExpanded]);\r\n\r\n const handleToggle = () => {\r\n if (isExpanded && searchValue) {\r\n setSearchValue(\"\");\r\n onSearch(\"\");\r\n }\r\n setIsExpanded(!isExpanded);\r\n };\r\n\r\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const value = e.target.value;\r\n setSearchValue(value);\r\n onSearch(value);\r\n };\r\n\r\n const handleClear = () => {\r\n setSearchValue(\"\");\r\n onSearch(\"\");\r\n if (inputRef.current) {\r\n inputRef.current.focus();\r\n }\r\n };\r\n\r\n return (\r\n <div className={`flex items-center ${className}`}>\r\n {isExpanded ? (\r\n <div className=\"flex items-center gap-2 transition-all duration-300 ease-in-out\">\r\n <div className=\"relative flex justify-center items-center\">\r\n {/* <i className=\"icon-neo-search absolute right-5 text-[0.875rem]\" /> */}\r\n <Input\r\n ref={inputRef}\r\n type=\"text\"\r\n value={searchValue}\r\n onChange={handleChange}\r\n placeholder={placeholder}\r\n className=\"formfield__search\"\r\n />\r\n {searchValue && (\r\n <Button\r\n onClick={handleClear}\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-neutral-600 hover:text-[var(--color-ext-4b5563)] transition-colors\"\r\n >\r\n <i className=\"icon-neo-close text-[0.875rem]\" />\r\n </Button>\r\n )}\r\n </div>\r\n <Button variant=\"ghost\" size=\"icon\" onClick={handleToggle}>\r\n <i className=\"icon-neo-close text-[0.875rem]\" />\r\n </Button>\r\n </div>\r\n ) : (\r\n <Button variant=\"ghost\" size=\"icon\" onClick={handleToggle} className=\"header__round-btn\">\r\n {/* <Search className=\"h-5 w-5\" /> */}\r\n <i className=\"icon-neo-search\" />\r\n </Button>\r\n )}\r\n </div>\r\n );\r\n};\r\n","import * as React from \"react\";\r\nimport { Field } from \"formik\";\r\nimport { cn } from \"../../lib/utils\";\r\n\r\nexport interface InputProps\r\n extends React.InputHTMLAttributes<HTMLInputElement> {\r\n error?: boolean;\r\n as?: \"input\" | \"field\";\r\n innerRef?: React.Ref<HTMLInputElement>;\r\n}\r\n\r\nconst baseClasses = [\r\n \"flex h-[2.571rem] w-full items-center rounded-[0.65rem] px-4 py-0\",\r\n \"text-[0.8125rem] text-[var(--color-neutral-800)]\",\r\n \"placeholder:text-[0.8125rem]\",\r\n \"placeholder:text-neutral-400\",\r\n \"bg-background-card\",\r\n \"border border-neutral-300\",\r\n \"transition-colors\",\r\n \"file:border-0 file:bg-transparent file:text-body file:font-medium\",\r\n \"focus-visible:outline-none\",\r\n \"focus-visible:border-[var(--focus-ring-color)]\",\r\n \"focus-visible:ring-1\",\r\n \"focus-visible:ring-[var(--focus-ring-color-soft)]\",\r\n \"disabled:cursor-not-allowed\",\r\n \"disabled:opacity-50\",\r\n].join(\" \");\r\n\r\nexport const Input = React.forwardRef<HTMLInputElement, InputProps>(\r\n (\r\n {\r\n as = \"input\",\r\n className,\r\n error,\r\n type = \"text\",\r\n style,\r\n autoFocus=false,\r\n innerRef,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const internalRef = React.useRef<HTMLInputElement>(null);\r\n React.useImperativeHandle(ref, () => internalRef.current as HTMLInputElement);\r\n React.useImperativeHandle(innerRef, () => internalRef.current as HTMLInputElement);\r\n\r\n React.useEffect(() => {\r\n if (autoFocus) {\r\n internalRef.current?.focus();\r\n }\r\n }, [autoFocus]);\r\n\r\n const classes = cn(\r\n baseClasses,\r\n error && \"border-status-danger focus-visible:ring-status-danger\",\r\n className\r\n );\r\n\r\n if (as === \"field\") {\r\n return (\r\n <Field\r\n innerRef={internalRef}\r\n type={type}\r\n className={classes}\r\n style={style}\r\n autoFocus={autoFocus}\r\n {...props}\r\n />\r\n );\r\n }\r\n\r\n return (\r\n <input\r\n ref={internalRef}\r\n type={type}\r\n className={classes}\r\n style={style}\r\n autoFocus={autoFocus}\r\n {...props}\r\n />\r\n );\r\n }\r\n);\r\n\r\nInput.displayName = \"Input\";\r\n","import * as React from \"react\";\r\nimport { cn } from \"../../lib/utils\";\r\n\r\nexport interface FileInputProps\r\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"type\" | \"size\"> {\r\n // The clickable trigger UI (button, avatar overlay, drop-zone, …). Every existing file-upload\r\n // site already builds its own bespoke trigger — this component only owns the hidden native\r\n // input + <label htmlFor> wiring, not the trigger's visual design, so each consumer keeps its\r\n // exact current look by passing its existing trigger markup here unchanged.\r\n children?: React.ReactNode;\r\n wrapperClassName?: string;\r\n labelClassName?: string;\r\n labelStyle?: React.CSSProperties;\r\n // Escape hatch for the rarer cases that put extra behavior directly on the trigger label\r\n // (e.g. a focusable label tracking its own blur for form-touched state).\r\n labelProps?: Omit<React.LabelHTMLAttributes<HTMLLabelElement>, \"htmlFor\" | \"className\" | \"style\">;\r\n}\r\n\r\nconst FileInput = React.forwardRef<HTMLInputElement, FileInputProps>(\r\n (\r\n {\r\n id,\r\n className,\r\n wrapperClassName,\r\n labelClassName,\r\n labelStyle,\r\n labelProps,\r\n children,\r\n disabled,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const generatedId = React.useId();\r\n const inputId = id ?? generatedId;\r\n\r\n const content = (\r\n <>\r\n <input\r\n ref={ref}\r\n type=\"file\"\r\n id={inputId}\r\n disabled={disabled}\r\n className={cn(\"hidden\", className)}\r\n {...props}\r\n />\r\n {children && (\r\n <label htmlFor={inputId} className={labelClassName} style={labelStyle} {...labelProps}>\r\n {children}\r\n </label>\r\n )}\r\n </>\r\n );\r\n\r\n // No wrapper element unless a consumer opts in — several existing upload sites position the\r\n // trigger label relative to a specific ancestor further up the tree, so introducing an extra\r\n // div here unconditionally could change that positioning context.\r\n return wrapperClassName ? <div className={wrapperClassName}>{content}</div> : content;\r\n }\r\n);\r\nFileInput.displayName = \"FileInput\";\r\n\r\nexport { FileInput };\r\n","import React from \"react\";\r\nimport { ErrorMessage } from \"formik\";\r\nimport { cn } from \"../../lib/utils\";\r\n\r\ninterface FormFieldProps {\r\n label?: string;\r\n required?: boolean;\r\n /** Formik field name — renders <ErrorMessage> automatically */\r\n errorName?: string;\r\n /** Manual error node/string for non-Formik usage */\r\n error?: React.ReactNode;\r\n hint?: string;\r\n children: React.ReactNode;\r\n className?: string;\r\n}\r\n\r\n/**\r\n * Reusable form field wrapper — consistent label, field, and error layout.\r\n *\r\n * With Formik (recommended):\r\n * <FormField label=\"Name\" required errorName=\"name\" className=\"form__field\">\r\n * <Field name=\"name\" className=\"formfield__input\" />\r\n * </FormField>\r\n *\r\n * With React Select:\r\n * <FormField label=\"Flow\" required errorName=\"flowId\" className=\"form__field\">\r\n * <MySelect className=\"formfield__select\" classNamePrefix=\"rs\" ... />\r\n * </FormField>\r\n *\r\n * Manual error (non-Formik):\r\n * <FormField label=\"Name\" error={touched.x && errors.x}>\r\n * <input className=\"formfield__input\" />\r\n * </FormField>\r\n */\r\nconst FormField: React.FC<FormFieldProps> = ({\r\n label,\r\n required,\r\n errorName,\r\n error,\r\n hint,\r\n children,\r\n className,\r\n}) => (\r\n <div className={cn(\"form__field\", className)}>\r\n {label && (\r\n <label className=\"formfield__label\">\r\n {label}\r\n {required && <span className=\"required-field\">*</span>}\r\n </label>\r\n )}\r\n {children}\r\n {hint && <p className=\"text-[0.75rem] text-neutral-600 mt-1\">{hint}</p>}\r\n {errorName && <ErrorMessage name={errorName} component=\"p\" className=\"form-error\" />}\r\n {!errorName && error && <p className=\"form-error\">{error}</p>}\r\n </div>\r\n);\r\n\r\nexport default FormField;\r\n\r\n","import * as React from \"react\";\r\nimport { cn } from \"../../lib/utils\";\r\n\r\n/**\r\n * AppList — wraps the list/table view container (.app-list-wrapper).\r\n * Compose with AppListHeader and AppListBody.\r\n */\r\nconst AppList = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement>\r\n>(({ className, ...props }, ref) => (\r\n <div ref={ref} className={cn(\"app-list-wrapper\", className)} {...props} />\r\n));\r\nAppList.displayName = \"AppList\";\r\n\r\n/**\r\n * AppListHeader — sticky header row (.app-list-header).\r\n * style grid-template-columns on the element or a wrapper inside.\r\n */\r\nconst AppListHeader = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement>\r\n>(({ className, ...props }, ref) => (\r\n <div ref={ref} className={cn(\"app-list-header\", className)} {...props} />\r\n));\r\nAppListHeader.displayName = \"AppListHeader\";\r\n\r\n/**\r\n * AppListBody — contains the rows.\r\n */\r\nconst AppListBody = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement>\r\n>(({ className, ...props }, ref) => (\r\n <div ref={ref} className={cn(\"app-list-body\", className)} {...props} />\r\n));\r\nAppListBody.displayName = \"AppListBody\";\r\n\r\n/**\r\n * AppListItem — a single data row (.app-list-row).\r\n * Pass `editing` to apply the editing highlight modifier.\r\n */\r\ninterface AppListItemProps extends React.HTMLAttributes<HTMLDivElement> {\r\n editing?: boolean;\r\n}\r\n\r\nconst AppListItem = React.forwardRef<HTMLDivElement, AppListItemProps>(\r\n ({ className, editing, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n className={cn(\r\n \"app-list-row\",\r\n editing && \"app-list-row--editing\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n);\r\nAppListItem.displayName = \"AppListItem\";\r\n\r\n/**\r\n * AppListCell — a cell inside a list row (.app-list-cell).\r\n * Pass `muted` for de-emphasised text, `actions` for right-aligned action buttons.\r\n */\r\ninterface AppListCellProps extends React.HTMLAttributes<HTMLDivElement> {\r\n muted?: boolean;\r\n actions?: boolean;\r\n}\r\n\r\nconst AppListCell = React.forwardRef<HTMLDivElement, AppListCellProps>(\r\n ({ className, muted, actions, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n className={cn(\r\n \"app-list-cell\",\r\n muted && \"app-list-cell--muted\",\r\n actions && \"app-list-cell--actions\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n);\r\nAppListCell.displayName = \"AppListCell\";\r\n\r\nexport { AppList, AppListHeader, AppListBody, AppListItem, AppListCell };\r\n","import React from \"react\";\nimport loaderGif from \"../../assets/fp-loader.gif\";\n\ninterface LoaderProps {\n isLoading: boolean;\n}\n\nconst Loader: React.FC<LoaderProps> = ({ isLoading }) => {\n if (!isLoading) return null;\n\n return (\n <div className=\"fp-loader-overlay fp-loader-overlay--visible\">\n <div className=\"fp-loader-content\">\n <img\n src={loaderGif}\n alt=\"\"\n className=\"fp-loader-gif\"\n />\n </div>\n </div>\n );\n};\nexport default Loader;\n","import * as React from \"react\"\r\nimport { createPortal } from \"react-dom\"\r\nimport { cn } from \"../../lib/utils\"\r\n\r\ninterface PopoverContextValue {\r\n open: boolean\r\n onOpenChange: (open: boolean) => void\r\n triggerRef: React.RefObject<HTMLElement | null>\r\n}\r\n\r\nconst PopoverContext = React.createContext<PopoverContextValue | undefined>(undefined)\r\n\r\nfunction usePopoverContext() {\r\n const context = React.useContext(PopoverContext)\r\n if (!context) {\r\n throw new Error(\"Popover components must be used within a Popover\")\r\n }\r\n return context\r\n}\r\n\r\ninterface PopoverProps {\r\n open?: boolean\r\n onOpenChange?: (open: boolean) => void\r\n children: React.ReactNode\r\n}\r\n\r\nfunction Popover({ open: controlledOpen, onOpenChange, children }: PopoverProps) {\r\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(false)\r\n const triggerRef = React.useRef<HTMLElement>(null)\r\n\r\n const open = controlledOpen ?? uncontrolledOpen\r\n const handleOpenChange = onOpenChange ?? setUncontrolledOpen\r\n\r\n return (\r\n <PopoverContext.Provider value={{ open, onOpenChange: handleOpenChange, triggerRef }}>\r\n {children}\r\n </PopoverContext.Provider>\r\n )\r\n}\r\n\r\ninterface PopoverTriggerProps {\r\n asChild?: boolean\r\n children: React.ReactElement\r\n}\r\n\r\nconst PopoverTrigger = React.forwardRef<HTMLElement, PopoverTriggerProps>(\r\n ({ asChild = false, children, ...props }, ref) => {\r\n const { triggerRef } = usePopoverContext()\r\n\r\n const combinedRef = React.useCallback(\r\n (node: HTMLElement | null) => {\r\n (triggerRef as React.MutableRefObject<HTMLElement | null>).current = node\r\n if (typeof ref === \"function\") {\r\n ref(node)\r\n } else if (ref) {\r\n (ref as React.MutableRefObject<HTMLElement | null>).current = node\r\n }\r\n },\r\n [ref, triggerRef]\r\n )\r\n\r\n if (asChild && React.isValidElement(children)) {\r\n return React.cloneElement(children, {\r\n ...props,\r\n ...(children.props as object),\r\n ref: combinedRef,\r\n } as any)\r\n }\r\n\r\n return children\r\n }\r\n)\r\nPopoverTrigger.displayName = \"PopoverTrigger\"\r\n\r\ninterface PopoverContentProps extends React.HTMLAttributes<HTMLDivElement> {\r\n side?: \"top\" | \"right\" | \"bottom\" | \"left\"\r\n align?: \"start\" | \"center\" | \"end\"\r\n sideOffset?: number\r\n onMouseEnter?: () => void\r\n onMouseLeave?: () => void\r\n}\r\n\r\nconst PopoverContent = React.forwardRef<HTMLDivElement, PopoverContentProps>(\r\n ({ className, side = \"bottom\", align = \"center\", sideOffset = 4, children, onMouseEnter, onMouseLeave, ...props }, ref) => {\r\n const { open, triggerRef } = usePopoverContext()\r\n const contentRef = React.useRef<HTMLDivElement>(null)\r\n const [position, setPosition] = React.useState({ top: 0, left: 0 })\r\n const [isPositioned, setIsPositioned] = React.useState(false)\r\n\r\n React.useEffect(() => {\r\n if (!open || !triggerRef.current) {\r\n setIsPositioned(false)\r\n return\r\n }\r\n\r\n const updatePosition = () => {\r\n if (!triggerRef.current || !contentRef.current) return\r\n\r\n const triggerRect = triggerRef.current.getBoundingClientRect()\r\n const contentRect = contentRef.current.getBoundingClientRect()\r\n\r\n if (contentRect.width === 0 || contentRect.height === 0) {\r\n return\r\n }\r\n\r\n let top = 0\r\n let left = 0\r\n\r\n switch (side) {\r\n case \"top\":\r\n top = triggerRect.top - contentRect.height - sideOffset\r\n break\r\n case \"bottom\":\r\n top = triggerRect.bottom + sideOffset\r\n break\r\n case \"left\":\r\n left = triggerRect.left - contentRect.width - sideOffset\r\n break\r\n case \"right\":\r\n left = triggerRect.right + sideOffset\r\n break\r\n }\r\n\r\n if (side === \"top\" || side === \"bottom\") {\r\n switch (align) {\r\n case \"start\":\r\n left = triggerRect.left\r\n break\r\n case \"center\":\r\n left = triggerRect.left + triggerRect.width / 2 - contentRect.width / 2\r\n break\r\n case \"end\":\r\n left = triggerRect.right - contentRect.width\r\n break\r\n }\r\n } else {\r\n switch (align) {\r\n case \"start\":\r\n top = triggerRect.top\r\n break\r\n case \"center\":\r\n top = triggerRect.top + triggerRect.height / 2 - contentRect.height / 2\r\n break\r\n case \"end\":\r\n top = triggerRect.bottom - contentRect.height\r\n break\r\n }\r\n }\r\n\r\n const viewportWidth = window.innerWidth\r\n const viewportHeight = window.innerHeight\r\n\r\n if (left + contentRect.width > viewportWidth - 8) {\r\n left = viewportWidth - contentRect.width - 8\r\n }\r\n if (left < 8) {\r\n left = 8\r\n }\r\n\r\n if (top + contentRect.height > viewportHeight - 8) {\r\n if (side === \"bottom\") {\r\n top = triggerRect.top - contentRect.height - sideOffset\r\n } else if (side === \"right\" || side === \"left\") {\r\n top = viewportHeight - contentRect.height - 8\r\n }\r\n }\r\n if (top < 8) {\r\n top = 8\r\n }\r\n\r\n setPosition({ top, left })\r\n setIsPositioned(true)\r\n }\r\n\r\n requestAnimationFrame(() => {\r\n updatePosition()\r\n const timer1 = setTimeout(updatePosition, 10)\r\n const timer2 = setTimeout(updatePosition, 50)\r\n const timer3 = setTimeout(updatePosition, 100)\r\n\r\n return () => {\r\n clearTimeout(timer1)\r\n clearTimeout(timer2)\r\n clearTimeout(timer3)\r\n }\r\n })\r\n\r\n window.addEventListener(\"scroll\", updatePosition, true)\r\n window.addEventListener(\"resize\", updatePosition)\r\n\r\n return () => {\r\n window.removeEventListener(\"scroll\", updatePosition, true)\r\n window.removeEventListener(\"resize\", updatePosition)\r\n }\r\n }, [open, side, align, sideOffset])\r\n\r\n if (!open) return null\r\n\r\n const portalRoot = document.getElementById('fpneo') || document.body\r\n\r\n return createPortal(\r\n <div\r\n ref={(node) => {\r\n (contentRef as React.MutableRefObject<HTMLDivElement | null>).current = node\r\n if (typeof ref === \"function\") {\r\n ref(node)\r\n } else if (ref) {\r\n (ref as React.MutableRefObject<HTMLDivElement | null>).current = node\r\n }\r\n }}\r\n className={cn(\r\n \"fixed z-[var(--zindex-overlay)] w-72 rounded-[0.625rem] border border-neutral-350 bg-neutral-white p-4 shadow-lg outline-none transition-opacity duration-150\",\r\n isPositioned ? \"opacity-100\" : \"opacity-0\",\r\n className\r\n )}\r\n style={{\r\n top: `${position.top}px`,\r\n left: `${position.left}px`,\r\n }}\r\n onMouseEnter={onMouseEnter}\r\n onMouseLeave={onMouseLeave}\r\n {...props}\r\n >\r\n {children}\r\n </div>,\r\n portalRoot\r\n )\r\n }\r\n)\r\nPopoverContent.displayName = \"PopoverContent\"\r\n\r\nexport { Popover, PopoverTrigger, PopoverContent }\r\n","import * as React from \"react\";\r\nimport { cn } from \"../../lib/utils\";\r\n\r\nexport type RadioColorVariant = \"brand\" | \"blue\";\r\nexport type RadioSize = \"sm\" | \"md\" | \"lg\";\r\n\r\nconst sizeClasses: Record<RadioSize, string> = {\r\n sm: \"w-3.5 h-3.5\",\r\n md: \"w-4 h-4\",\r\n lg: \"w-5 h-5\",\r\n};\r\n\r\n// Native radio rendering (browser-drawn dot + `accent-color`) rather than Checkbox's fully\r\n// custom-drawn box+glyph — matches what every existing radio usage in the app already renders,\r\n// so consumers only need to swap the element, not their visual design.\r\nconst colorClasses: Record<RadioColorVariant, string> = {\r\n brand: \"accent-interactive-brand\",\r\n blue: \"text-[var(--color-ext-2563eb)] focus:ring-[var(--color-ext-3b82f6)]\",\r\n};\r\n\r\nexport interface RadioButtonProps\r\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"type\" | \"size\"> {\r\n colorVariant?: RadioColorVariant;\r\n size?: RadioSize;\r\n label?: React.ReactNode;\r\n wrapperClassName?: string;\r\n labelClassName?: string;\r\n}\r\n\r\nconst RadioButton = React.forwardRef<HTMLInputElement, RadioButtonProps>(\r\n (\r\n {\r\n className,\r\n wrapperClassName,\r\n labelClassName,\r\n colorVariant = \"brand\",\r\n size = \"md\",\r\n label,\r\n disabled,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const input = (\r\n <input\r\n ref={ref}\r\n type=\"radio\"\r\n disabled={disabled}\r\n className={cn(sizeClasses[size], colorClasses[colorVariant], className)}\r\n {...props}\r\n />\r\n );\r\n\r\n // No wrapper at all unless this component owns the label text — many call sites already\r\n // nest the radio inside their own <label> (a <label> can't validly contain another <label>),\r\n // and wrapping the bare input in an extra element would change its position among siblings.\r\n if (!label) return input;\r\n\r\n return (\r\n <label\r\n className={cn(\r\n \"inline-flex items-center gap-2 select-none cursor-pointer\",\r\n disabled && \"cursor-not-allowed\",\r\n wrapperClassName\r\n )}\r\n >\r\n {input}\r\n <span className={cn(\"text-[0.8125rem] text-neutral-700 font-normal\", labelClassName)}>\r\n {label}\r\n </span>\r\n </label>\r\n );\r\n }\r\n);\r\nRadioButton.displayName = \"RadioButton\";\r\n\r\nexport { RadioButton };\r\n","import * as React from \"react\";\r\nimport { cn } from \"../../lib/utils\";\r\n\r\nconst ScrollArea = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement>\r\n>(({ className, children, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n className={cn(\r\n \"relative overflow-y-auto overflow-x-hidden\",\r\n \"[&::-webkit-scrollbar]:w-[0.375rem]\",\r\n \"[&::-webkit-scrollbar-track]:bg-transparent\",\r\n \"[&::-webkit-scrollbar-thumb]:bg-[var(--color-ext-d1d5db80)]\",\r\n \"[&::-webkit-scrollbar-thumb]:rounded-full\",\r\n \"[&::-webkit-scrollbar-thumb]:border-2\",\r\n \"[&::-webkit-scrollbar-thumb]:border-solid\",\r\n \"[&::-webkit-scrollbar-thumb]:border-transparent\",\r\n \"[&::-webkit-scrollbar-thumb]:bg-clip-padding\",\r\n \"hover:[&::-webkit-scrollbar-thumb]:bg-[var(--color-ext-9ca3afb3)]\",\r\n \"[&::-webkit-scrollbar-thumb]:transition-colors\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n <div className=\"h-full w-full\">\r\n {children}\r\n </div>\r\n </div>\r\n));\r\nScrollArea.displayName = \"ScrollArea\";\r\n\r\nconst ScrollBar = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement> & { orientation?: \"vertical\" | \"horizontal\" }\r\n>(({ className, orientation = \"vertical\", ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n className={cn(\r\n \"flex touch-none select-none transition-colors\",\r\n orientation === \"vertical\" &&\r\n \"h-full w-2.5 border-l border-l-transparent p-[0.0625rem]\",\r\n orientation === \"horizontal\" &&\r\n \"h-2.5 flex-col border-t border-t-transparent p-[0.0625rem]\",\r\n className,\r\n )}\r\n {...props}\r\n >\r\n <div className=\"relative flex-1 rounded-full bg-border\" />\r\n </div>\r\n));\r\nScrollBar.displayName = \"ScrollBar\";\r\n\r\nexport { ScrollArea, ScrollBar };\r\n","import { useEffect, useRef } from \"react\";\r\nimport { useFormikContext } from \"formik\";\r\n\r\n/** Auto-scrolls & focuses the first Formik error field only within the action panel on form submit */\r\nconst ScrollToFieldError: React.FC = () => {\r\n const { submitCount, errors } = useFormikContext();\r\n const prevSubmitCount = useRef(submitCount);\r\n\r\n useEffect(() => {\r\n // Only act when submitCount actually increments (i.e. user clicked submit)\r\n if (submitCount === prevSubmitCount.current) return;\r\n prevSubmitCount.current = submitCount;\r\n\r\n // Small delay to allow DOM to update after validation\r\n const timer = setTimeout(() => {\r\n const errorKeys = Object.keys(errors);\r\n if (errorKeys.length === 0) return;\r\n\r\n const firstErrorKey = errorKeys[0];\r\n const el =\r\n document.querySelector<HTMLElement>(`[name=\"${firstErrorKey}\"]`) ||\r\n document.getElementById(firstErrorKey);\r\n if (!el) return;\r\n\r\n // Only scroll within the action panel's own scrollable container\r\n // Look for the form's scrollable body, NOT the main layout #scroll\r\n const scrollable =\r\n el.closest<HTMLElement>(\".edit-panel__body\") ||\r\n el.closest<HTMLElement>(\".dept-modal__panel-backdrop\") ||\r\n el.closest<HTMLElement>(\".dept-modal__backdrop\") ||\r\n el.closest<HTMLElement>(\"[class*='overflow-y-auto']\");\r\n\r\n if (scrollable && scrollable.id !== \"scroll\") {\r\n const elRect = el.getBoundingClientRect();\r\n const scrollRect = scrollable.getBoundingClientRect();\r\n const offset = elRect.top - scrollRect.top - scrollable.clientHeight / 2 + el.clientHeight / 2;\r\n scrollable.scrollBy({ top: offset, behavior: \"smooth\" });\r\n } else {\r\n // Fallback: scroll element into view only within its own visible area\r\n el.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\r\n }\r\n\r\n setTimeout(() => el.focus(), 350);\r\n }, 100);\r\n\r\n return () => clearTimeout(timer);\r\n }, [submitCount, errors]);\r\n\r\n return null;\r\n};\r\n\r\nexport default ScrollToFieldError;\r\n","import * as React from \"react\"\r\nimport { cn } from \"../../lib/utils\"\r\n\r\ninterface SwitchProps extends Omit<React.HTMLAttributes<HTMLLabelElement>, 'onChange'> {\r\n checked?: boolean\r\n disabled?: boolean\r\n onCheckedChange?: (checked: boolean) => void\r\n}\r\n\r\nconst Switch = React.forwardRef<HTMLLabelElement, SwitchProps>(\r\n ({ className, checked, disabled, onCheckedChange, ...props }, ref) => {\r\n const [internalChecked, setInternalChecked] = React.useState(false)\r\n\r\n const isControlled = checked !== undefined\r\n const isChecked = isControlled ? checked : internalChecked\r\n\r\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const newValue = e.target.checked\r\n if (!isControlled) {\r\n setInternalChecked(newValue)\r\n }\r\n onCheckedChange?.(newValue)\r\n }\r\n\r\n return (\r\n <label\r\n ref={ref}\r\n className={cn(\r\n \"switch-pill\",\r\n isChecked ? \"switch-pill--on\" : \"switch-pill--off\",\r\n disabled && \"switch-pill--disabled\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n <input\r\n type=\"checkbox\"\r\n className=\"switch-pill__input\"\r\n checked={isChecked}\r\n disabled={disabled}\r\n onChange={handleChange}\r\n />\r\n <span\r\n className={cn(\r\n \"switch-pill__thumb\",\r\n isChecked ? \"switch-pill__thumb--on\" : \"switch-pill__thumb--off\"\r\n )}\r\n />\r\n </label>\r\n )\r\n }\r\n)\r\nSwitch.displayName = \"Switch\"\r\n\r\nexport { Switch }\r\n","import * as React from \"react\";\r\nimport { cva, type VariantProps } from \"class-variance-authority\";\r\nimport { cn } from \"../../lib/utils\";\r\n\r\nconst tabVariants = cva(\r\n [\r\n \"relative inline-flex items-center justify-center gap-2\",\r\n \"whitespace-nowrap select-none\",\r\n \"transition-all duration-200\",\r\n \"outline-none\",\r\n \"cursor-pointer\",\r\n \"font-medium\",\r\n \"focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-interactive-brand\",\r\n \"disabled:pointer-events-none disabled:opacity-50\",\r\n ].join(\" \"),\r\n {\r\n variants: {\r\n variant: {\r\n default:\r\n \"text-text-muted hover:text-text-primary\",\r\n\r\n active:\r\n \"text-text-primary\",\r\n\r\n primary:\r\n \"text-primary hover:text-primary\",\r\n\r\n secondary:\r\n \"text-muted-foreground hover:text-foreground\",\r\n },\r\n\r\n size: {\r\n sm: \"min-w-[6.25rem] py-2 px-3 text-sm\",\r\n\r\n md: \"min-w-[8.125rem] py-3 px-4 text-sm\",\r\n\r\n lg: \"min-w-[10rem] py-4 px-5 text-base\",\r\n },\r\n },\r\n\r\n defaultVariants: {\r\n variant: \"default\",\r\n size: \"md\",\r\n },\r\n }\r\n);\r\n\r\nexport interface TabProps\r\n extends VariantProps<typeof tabVariants> {\r\n active?: boolean;\r\n icon?: React.ReactNode;\r\n children: React.ReactNode;\r\n className?: string;\r\n disabled?: boolean;\r\n onClick?: () => void;\r\n}\r\n\r\nconst Tab = React.forwardRef<HTMLDivElement, TabProps>(\r\n (\r\n {\r\n active = false,\r\n icon,\r\n children,\r\n className,\r\n variant,\r\n size,\r\n disabled,\r\n onClick,\r\n },\r\n ref\r\n ) => {\r\n const handleKeyDown = (\r\n e: React.KeyboardEvent<HTMLDivElement>\r\n ) => {\r\n if (disabled) return;\r\n\r\n if (e.key === \"Enter\" || e.key === \" \") {\r\n e.preventDefault();\r\n onClick?.();\r\n }\r\n };\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n role=\"tab\"\r\n aria-selected={active}\r\n aria-disabled={disabled}\r\n tabIndex={disabled ? -1 : active ? 0 : -1}\r\n onClick={!disabled ? onClick : undefined}\r\n onKeyDown={handleKeyDown}\r\n className={cn(\r\n tabVariants({\r\n variant: active ? \"active\" : variant,\r\n size,\r\n }),\r\n className\r\n )}\r\n >\r\n {icon}\r\n\r\n <span>{children}</span>\r\n\r\n {active && (\r\n <span className=\"absolute bottom-0 left-0 h-[0.1875rem] w-full rounded-full bg-interactive-brand\" />\r\n )}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nTab.displayName = \"Tab\";\r\n\r\nexport { Tab, tabVariants };","import * as React from \"react\";\r\nimport InfiniteScroll, {\r\n type Props as InfiniteScrollProps,\r\n} from \"react-infinite-scroll-component\";\r\nimport { cva, type VariantProps } from \"class-variance-authority\";\r\nimport { cn } from \"../../lib/utils\";\r\n\r\nconst tableVariants = cva(\"item-table__head\", {\r\n variants: {\r\n variant: {\r\n default: \"\",\r\n flows: \"flows-cols\",\r\n users: \"users-cols\",\r\n departments: \"dept-cols\",\r\n queues: \"queue-cols\",\r\n devices: \"devices-cols\",\r\n reports: \"reports-cols\",\r\n appointments: \"appt-cols\",\r\n doctors: \"doctors-cols\",\r\n roles: \"roles-cols\",\r\n feedbackForms: \"feedback-forms-list-cols\",\r\n feedbackConfig: \"feedback-config-cols\",\r\n alertConfig: \"alert-config-list-cols\",\r\n escalationConfig: \"escalation-config-list-cols\",\r\n kiosks: \"kiosk-cols\",\r\n displayBoards: \"displayboard-cols\",\r\n reportDownloadLinks: \"reports-download-links-cols\",\r\n activeUsers: \"active-users-cols\",\r\n servingTokens: \"serving-cols\",\r\n tokenServing: \"token-serving-cols\",\r\n floatingTokens: \"floating-tokens-cols\",\r\n ordersPending: \"orders-pending-cols\",\r\n },\r\n density: {\r\n compact: \"\",\r\n comfortable: \"item-table__head--comfortable\",\r\n },\r\n },\r\n defaultVariants: {\r\n variant: \"default\",\r\n density: \"compact\",\r\n },\r\n});\r\n\r\nexport interface TableHeaderItem {\r\n key: string;\r\n title: React.ReactNode;\r\n className?: string;\r\n sticky?: \"left\" | \"right\";\r\n style?: React.CSSProperties;\r\n}\r\n\r\nexport interface TableProps\r\n extends React.HTMLAttributes<HTMLDivElement>,\r\n VariantProps<typeof tableVariants> {\r\n headers: TableHeaderItem[];\r\n\r\n children: React.ReactNode;\r\n\r\n infiniteScrollProps: Omit<\r\n InfiniteScrollProps,\r\n \"children\"\r\n >;\r\n\r\n wrapperClassName?: string;\r\n\r\n // id applied to the scrolling `.item-table__wrapper` element — needed when a page uses\r\n // its own local scroll container (via infiniteScrollProps.scrollableTarget) instead of\r\n // the app-wide \"#scroll\" container the default consumers rely on.\r\n wrapperId?: string;\r\n\r\n bodyClassName?: string;\r\n\r\n enableHorizontalScroll?: boolean;\r\n\r\n contentClassName?: string;\r\n\r\n headerClassName?: string;\r\n\r\n stickyHeader?: boolean;\r\n\r\n /**\r\n * Default = false\r\n *\r\n * false -> Header is rendered outside InfiniteScroll\r\n * (existing behaviour used by FlowsViewManager)\r\n *\r\n * true -> Header is rendered inside InfiniteScroll\r\n * (required by ServingTab to have a single scroll container)\r\n */\r\n headerInsideScroll?: boolean;\r\n}\r\n\r\nconst Table = React.forwardRef<HTMLDivElement, TableProps>(\r\n (\r\n {\r\n variant,\r\n density,\r\n headers,\r\n children,\r\n className,\r\n wrapperClassName,\r\n wrapperId,\r\n bodyClassName,\r\n infiniteScrollProps,\r\n stickyHeader,\r\n enableHorizontalScroll,\r\n contentClassName,\r\n headerClassName,\r\n headerInsideScroll = false,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n\r\n const renderHeader = React.useCallback(() => {\r\n return (\r\n <div\r\n className={cn(\r\n tableVariants({ variant, density }),\r\n density === \"comfortable\" &&\r\n enableHorizontalScroll &&\r\n \"item-table__head--scrollable\",\r\n stickyHeader &&\r\n \"sticky top-0 z-[var(--z-sticky)] bg-background-surface\",\r\n headerClassName\r\n )}\r\n >\r\n {headers.map((header) => (\r\n <div\r\n key={header.key}\r\n className={cn(\r\n header.className,\r\n header.sticky === \"left\" &&\r\n \"sticky left-0 z-20 bg-background-surface\",\r\n header.sticky === \"right\" &&\r\n \"sticky right-0 z-20 bg-background-surface\"\r\n )}\r\n style={header.style}\r\n >\r\n {header.title}\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n }, [\r\n headers,\r\n variant,\r\n density,\r\n stickyHeader,\r\n headerClassName,\r\n enableHorizontalScroll,\r\n ]);\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n className={cn(\"item-table\", className)}\r\n {...props}\r\n >\r\n {!headerInsideScroll ? (\r\n <>\r\n {renderHeader()}\r\n\r\n <div\r\n id={wrapperId}\r\n className={cn(\r\n \"item-table__wrapper\",\r\n density === \"comfortable\" && \"item-table__wrapper--comfortable\",\r\n enableHorizontalScroll && \"overflow-x-auto\",\r\n wrapperClassName\r\n )}\r\n >\r\n <div\r\n className={cn(\r\n \"item-table__body\",\r\n bodyClassName\r\n )}\r\n >\r\n <InfiniteScroll\r\n {...infiniteScrollProps}\r\n style={{\r\n overflow: \"visible\",\r\n display: \"contents\",\r\n }}\r\n >\r\n <div\r\n className={cn(\r\n density === \"comfortable\" && \"item-table__content--comfortable px-3\",\r\n contentClassName\r\n )}\r\n >\r\n {children}\r\n </div>\r\n </InfiniteScroll>\r\n </div>\r\n </div>\r\n </>\r\n ) : (\r\n <div\r\n id={wrapperId}\r\n className={cn(\r\n \"item-table__wrapper\",\r\n density === \"comfortable\" && \"item-table__wrapper--comfortable\",\r\n enableHorizontalScroll && \"overflow-x-auto\",\r\n wrapperClassName\r\n )}\r\n >\r\n <InfiniteScroll\r\n {...infiniteScrollProps}\r\n style={{\r\n overflow: \"visible\",\r\n display: \"contents\",\r\n }}\r\n >\r\n <div\r\n className={cn(\r\n \"item-table__body\",\r\n bodyClassName\r\n )}\r\n >\r\n {renderHeader()}\r\n\r\n <div\r\n className={cn(\r\n density === \"comfortable\" && \"item-table__content--comfortable px-3\",\r\n contentClassName\r\n )}\r\n >\r\n {children}\r\n </div>\r\n </div>\r\n </InfiniteScroll>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nTable.displayName = \"Table\";\r\n\r\nexport { Table, tableVariants };","// import * as React from \"react\";\r\n// import { Field } from \"formik\";\r\n// import { cn } from \"../../lib/utils\";\r\n\r\n// export interface TextareaProps\r\n// extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {\r\n// /** Opt-in error/invalid styling (red border). */\r\n// error?: boolean;\r\n\r\n// /** Render as native textarea or Formik Field */\r\n// as?: \"textarea\" | \"field\";\r\n// }\r\n\r\n// const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\r\n// (\r\n// {\r\n// className,\r\n// style,\r\n// error,\r\n// as = \"textarea\",\r\n// rows = 4,\r\n// ...props\r\n// },\r\n// ref\r\n// ) => {\r\n// const classes = cn(\r\n// // Layout\r\n// \"flex w-full min-h-[96px] rounded-lg px-3 py-2\",\r\n\r\n// // Typography\r\n// \"text-[0.8125rem] text-body\",\r\n// \"placeholder:text-[0.8125rem] placeholder:text-neutral-400\",\r\n\r\n// // Appearance\r\n// \"bg-background-card border border-neutral-300\",\r\n\r\n// // Focus\r\n// \"focus-visible:outline-none\",\r\n// \"focus-visible:ring-2\",\r\n// \"focus-visible:ring-ring\",\r\n// \"focus-visible:ring-offset-2\",\r\n\r\n// // Resize\r\n// \"resize-y\",\r\n\r\n// // Disabled\r\n// \"disabled:cursor-not-allowed disabled:opacity-50\",\r\n\r\n// // Error\r\n// error &&\r\n// \"border-status-danger focus-visible:ring-status-danger\",\r\n\r\n// // Consumer overrides\r\n// className\r\n// );\r\n\r\n// if (as === \"field\") {\r\n// return (\r\n// <Field\r\n// as=\"textarea\"\r\n// innerRef={ref}\r\n// rows={rows}\r\n// className={classes}\r\n// style={style}\r\n// {...props}\r\n// />\r\n// );\r\n// }\r\n\r\n// return (\r\n// <textarea\r\n// ref={ref}\r\n// rows={rows}\r\n// className={classes}\r\n// style={style}\r\n// {...props}\r\n// />\r\n// );\r\n// }\r\n// );\r\n\r\n// Textarea.displayName = \"Textarea\";\r\n\r\n// export { Textarea };\r\n\r\nimport * as React from \"react\";\r\nimport { Field } from \"formik\";\r\nimport { cn } from \"../../lib/utils\";\r\n\r\nexport interface TextareaProps\r\n extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {\r\n /** Opt-in error/invalid styling (red border). */\r\n error?: boolean;\r\n\r\n /** Render as native textarea or Formik Field */\r\n as?: \"textarea\" | \"field\";\r\n}\r\n\r\nconst Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\r\n (\r\n {\r\n className,\r\n style,\r\n error,\r\n as = \"textarea\",\r\n rows = 4,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const classes = cn(\r\n // Layout\r\n \"w-full rounded-lg\",\r\n \"px-3 py-2\",\r\n \"min-h-24 max-h-[12.5rem]\",\r\n \"resize-y overflow-auto\",\r\n\r\n // Typography\r\n \"!text-[0.8125rem] font-normal text-body\",\r\n \"placeholder:!text-[0.8125rem]\",\r\n \"placeholder:text-neutral-500\",\r\n\r\n // Appearance\r\n \"bg-background-surface\",\r\n \"border border-neutral-300\",\r\n \"ring-offset-background\",\r\n\r\n // Focus\r\n \"focus-visible:outline-none\",\r\n \"focus-visible:ring-2\",\r\n \"focus-visible:ring-ring\",\r\n \"focus-visible:ring-offset-2\",\r\n\r\n // Disabled\r\n \"disabled:cursor-not-allowed\",\r\n \"disabled:opacity-50\",\r\n\r\n // Error\r\n error &&\r\n \"border-status-danger focus-visible:ring-status-danger\",\r\n\r\n // Consumer overrides\r\n className\r\n );\r\n\r\n if (as === \"field\") {\r\n return (\r\n <Field\r\n as=\"textarea\"\r\n innerRef={ref}\r\n rows={rows}\r\n className={classes}\r\n style={style}\r\n {...props}\r\n />\r\n );\r\n }\r\n\r\n return (\r\n <textarea\r\n ref={ref}\r\n rows={rows}\r\n className={classes}\r\n style={style}\r\n {...props}\r\n />\r\n );\r\n }\r\n);\r\n\r\nTextarea.displayName = \"Textarea\";\r\n\r\nexport { Textarea };","import React from 'react';\r\nimport dayjs from 'dayjs';\r\n\r\nimport { ButtonIcon } from './buttonIcon';\r\nimport './time-picker.css';\r\n\r\nexport interface TimePickerProps {\r\n value: Date | null;\r\n onChange: (d: Date | null) => void;\r\n placeholder?: string;\r\n minTime?: Date | null;\r\n maxTime?: Date | null;\r\n disabled?: boolean;\r\n isClearable?: boolean;\r\n /** Minute-column step, e.g. 5 renders :00,:05,...,:55. Defaults to 1 (every minute). */\r\n minuteInterval?: number;\r\n}\r\n\r\nconst HOURS = Array.from({ length: 24 }, (_, i) => i);\r\nconst pad = (n: number) => String(n).padStart(2, '0');\r\n\r\n/**\r\n * Shared hour/minute scroller time picker — originally Admin Configuration's\r\n * Optometrist Working Hours picker, promoted here so every time-of-day field\r\n * in the app (Kiosk start/end time, Alert Configuration schedule times, ...)\r\n * shares one implementation instead of each page hand-rolling its own. A\r\n * native <input type=\"time\"> can't have its click-to-open popup restyled at\r\n * all (browser/OS chrome), so a custom-rendered popup like this one is needed\r\n * for the selected-state color inside the picker to be stylable.\r\n *\r\n * The popup stays a normal position:absolute child of the field (not\r\n * portaled) — it opens upward instead of downward when there isn't enough\r\n * viewport room below, and each column scrolls internally within a fixed\r\n * max-height, so the whole thing stays visible and usable without needing to\r\n * escape its container.\r\n */\r\nexport const TimePicker: React.FC<TimePickerProps> = ({\r\n value,\r\n onChange,\r\n placeholder,\r\n isClearable = true,\r\n minTime,\r\n maxTime,\r\n disabled,\r\n minuteInterval = 1,\r\n}) => {\r\n const [open, setOpen] = React.useState(false);\r\n const [openUpward, setOpenUpward] = React.useState(false);\r\n const ref = React.useRef<HTMLDivElement>(null);\r\n const popupRef = React.useRef<HTMLDivElement>(null);\r\n const hourListRef = React.useRef<HTMLDivElement>(null);\r\n const minuteListRef = React.useRef<HTMLDivElement>(null);\r\n\r\n const minutes = React.useMemo(\r\n () => Array.from({ length: Math.ceil(60 / minuteInterval) }, (_, i) => i * minuteInterval),\r\n [minuteInterval],\r\n );\r\n\r\n React.useEffect(() => {\r\n const handleClickOutside = (event: MouseEvent) => {\r\n if (ref.current && !ref.current.contains(event.target as Node)) setOpen(false);\r\n };\r\n document.addEventListener('mousedown', handleClickOutside);\r\n return () => document.removeEventListener('mousedown', handleClickOutside);\r\n }, []);\r\n\r\n // Decide above vs. below from the field's position in the viewport — the\r\n // popup is still a plain absolutely-positioned child of the field, this\r\n // just picks the side more likely to have room (e.g. near the bottom of a\r\n // scrollable modal), same idea as this app's own react-datepicker/rmdp\r\n // popovers auto-flipping.\r\n React.useLayoutEffect(() => {\r\n if (!open || !ref.current) return;\r\n const rect = ref.current.getBoundingClientRect();\r\n const estimatedPopupHeight = popupRef.current?.offsetHeight ?? 216;\r\n const spaceBelow = window.innerHeight - rect.bottom;\r\n setOpenUpward(spaceBelow < estimatedPopupHeight + 8 && rect.top > estimatedPopupHeight + 8);\r\n }, [open]);\r\n\r\n React.useEffect(() => {\r\n if (!open) return;\r\n hourListRef.current?.querySelector<HTMLElement>('[data-selected=\"true\"]')?.scrollIntoView({ block: 'center' });\r\n minuteListRef.current?.querySelector<HTMLElement>('[data-selected=\"true\"]')?.scrollIntoView({ block: 'center' });\r\n }, [open]);\r\n\r\n const isHourDisabled = (h: number) =>\r\n (!!minTime && h < minTime.getHours()) || (!!maxTime && h > maxTime.getHours());\r\n const isMinuteDisabled = (h: number, m: number) =>\r\n isHourDisabled(h) ||\r\n (!!minTime && h === minTime.getHours() && m < minTime.getMinutes()) ||\r\n (!!maxTime && h === maxTime.getHours() && m > maxTime.getMinutes());\r\n\r\n const clamp = (d: Date) => {\r\n if (minTime && d < minTime) return minTime;\r\n if (maxTime && d > maxTime) return maxTime;\r\n return d;\r\n };\r\n\r\n const selectHour = (h: number) => {\r\n const d = new Date();\r\n d.setHours(h, value ? value.getMinutes() : 0, 0, 0);\r\n onChange(clamp(d));\r\n };\r\n const selectMinute = (m: number) => {\r\n const d = new Date();\r\n d.setHours(value ? value.getHours() : 0, m, 0, 0);\r\n onChange(clamp(d));\r\n };\r\n\r\n const selectedLabel = value ? dayjs(value).format('HH:mm') : null;\r\n\r\n return (\r\n <div ref={ref} className=\"relative\">\r\n <div\r\n className={`shared-time-picker__field${disabled ? ' pointer-events-none' : ''}`}\r\n data-open={open}\r\n data-disabled={disabled}\r\n onClick={() => !disabled && setOpen(!open)}\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter' || e.key === ' ') {\r\n e.preventDefault();\r\n if (!disabled) setOpen(!open);\r\n }\r\n if (e.key === 'Escape') setOpen(false);\r\n }}\r\n role=\"button\"\r\n tabIndex={0}\r\n >\r\n <span className=\"shared-time-picker__value\" data-filled={!!selectedLabel}>\r\n {selectedLabel ?? placeholder}\r\n </span>\r\n <div className=\"flex shrink-0 items-center gap-2\">\r\n {isClearable && value && (\r\n <ButtonIcon\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onChange(null);\r\n }}\r\n name=\"icon-neo-close\"\r\n color=\"muted\"\r\n size=\"xs\"\r\n />\r\n )}\r\n <i className=\"icon-neo-time-four shared-time-picker__icon\" />\r\n </div>\r\n </div>\r\n {open && (\r\n <div\r\n ref={popupRef}\r\n className={`shared-time-picker__popup${openUpward ? ' shared-time-picker__popup--up' : ''}`}\r\n >\r\n {([\r\n { list: HOURS, ref: hourListRef, current: value?.getHours(), disabledFn: isHourDisabled, onPick: selectHour },\r\n {\r\n list: minutes,\r\n ref: minuteListRef,\r\n current: value?.getMinutes(),\r\n disabledFn: (m: number) => isMinuteDisabled(value ? value.getHours() : 0, m),\r\n onPick: selectMinute,\r\n },\r\n ] as const).map((col, colIdx) => (\r\n <React.Fragment key={colIdx}>\r\n {colIdx === 1 && <div className=\"shared-time-picker__sep\">:</div>}\r\n <div ref={col.ref} className=\"shared-time-picker__col\">\r\n {col.list.map((n) => {\r\n const isSelected = value != null && col.current === n;\r\n const isDisabled = col.disabledFn(n);\r\n return (\r\n <div\r\n key={n}\r\n data-selected={isSelected ? 'true' : 'false'}\r\n data-disabled={isDisabled ? 'true' : 'false'}\r\n className=\"shared-time-picker__option\"\r\n onClick={() => !isDisabled && col.onPick(n)}\r\n >\r\n {pad(n)}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </React.Fragment>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nexport default React.memo(TimePicker);\r\n"," import * as React from \"react\"\r\nimport { cn } from \"../../lib/utils\"\r\nimport { ButtonIcon } from \"./buttonIcon\"\r\n\r\n export interface ToastProps {\r\n title?: string\r\n description?: React.ReactNode\r\n type?: \"success\" | \"error\" | \"info\" | \"warning\"\r\n duration?: number\r\n isRTL?: boolean\r\n onClose: () => void\r\n }\r\n\r\n export function Toast({\r\n description,\r\n type = \"success\",\r\n duration = 3000,\r\n isRTL = false,\r\n onClose,\r\n }: ToastProps) {\r\n const [isVisible, setIsVisible] = React.useState(false)\r\n\r\n React.useEffect(() => {\r\n const enterTimeout = setTimeout(() => setIsVisible(true), 10)\r\n\r\n const closeTimeout = setTimeout(() => {\r\n handleClose()\r\n }, duration)\r\n\r\n return () => {\r\n clearTimeout(enterTimeout)\r\n clearTimeout(closeTimeout)\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [duration])\r\n\r\n\r\n\r\n const handleClose = () => {\r\n setIsVisible(false)\r\n setTimeout(onClose, 300)\r\n }\r\n\r\n\r\n\r\n return (\r\n <div\r\n className=\"fixed top-20 z-[var(--zindex-overlay)] max-w-[24.375rem] w-[calc(100vw-3rem)] sm:w-[24.375rem]\"\r\n style={isRTL ? { left: '1.5rem' } : { right: '1.5rem' }}\r\n >\r\n <div\r\n className={cn(\r\n \"pointer-events-auto w-full rounded-xl shadow-lg transition-all duration-300 ease-out\",\r\n type === \"success\" && \"bg-[var(--color-toast-success-bg)]\",\r\n type === \"error\" && \"bg-[var(--color-toast-danger-bg)]\",\r\n type === \"info\" && \"bg-[var(--color-toast-info-bg)]\",\r\n type === \"warning\" && \"bg-[var(--color-toast-warning-bg)]\",\r\n isVisible\r\n ? \"translate-y-0 opacity-100\"\r\n : \"-translate-y-4 opacity-0\"\r\n )}\r\n >\r\n <div className={`flex items-center gap-4 px-5 py-2 text-white`}>\r\n {type === \"success\" && (\r\n <i className=\"icon-neo-check\"></i>\r\n )}\r\n {type === \"error\" && (\r\n <i className=\"icon-neo-close_solid\"></i>\r\n )}\r\n {type === \"warning\" && (\r\n <i className=\"icon-neo-warning\"></i>\r\n )}\r\n\r\n <div className=\"flex-1 min-w-0\">\r\n {description && <div className=\"text-sm leading-snug\">{description}</div>}\r\n </div>\r\n\r\n <ButtonIcon\r\n onClick={handleClose}\r\n name=\"icon-neo-close\"\r\n color=\"danger\"\r\n size=\"xs\"\r\n />\r\n </div>\r\n\r\n </div>\r\n </div>\r\n )\r\n }\r\n\r\n // Note: the original app's `useToast()` hook dispatched into that app's own Redux alert\r\n // store (`alertActionRequest`) — that's app-specific state wiring, not a reusable UI\r\n // primitive, so it isn't included here. Consumers should drive `<Toast />` from their own\r\n // state (e.g. a small `useState`/context toggle) and pass `onClose` directly.\r\n","import * as React from 'react';\r\nimport { cn } from '../../lib/utils';\r\nimport { Tooltip, TooltipContent, TooltipTrigger } from '../ui/tooltip';\r\nimport { EViewMode } from '../../types/view-mode';\r\n\r\nconst CARD_TEXT_LIMIT = 20;\r\n\r\ninterface TruncatedTextProps {\r\n /** The full text to display. */\r\n text: any;\r\n maxLength?: number;\r\n className?: string;\r\n /** Current grid/list view mode — pass this from whatever state manages it in your app. */\r\n viewMode?: EViewMode;\r\n}\r\n\r\nconst TruncatedText: React.FC<TruncatedTextProps> = ({ text, maxLength, className, viewMode = EViewMode.GRID }) => {\r\n maxLength = viewMode === EViewMode.LIST ? maxLength : CARD_TEXT_LIMIT;\r\n if (maxLength === undefined) {\r\n return <TruncatedTextByWidth text={text} className={className} />;\r\n }\r\n\r\n if (!text || text.length <= maxLength) {\r\n return <span className={cn('cursor-default', className)}>{text || ''}</span>;\r\n }\r\n\r\n return (\r\n <Tooltip>\r\n <TooltipTrigger asChild>\r\n <span>\r\n {text.slice(0, maxLength)}…\r\n </span>\r\n </TooltipTrigger>\r\n <TooltipContent\r\n side=\"top\"\r\n sideOffset={0}\r\n className=\"max-w-[21.875rem] max-h-[18.75rem] overflow-y-auto whitespace-normal break-words pointer-events-auto\"\r\n >\r\n <small className=\"text-label text-text-muted\">{text}</small>\r\n </TooltipContent>\r\n </Tooltip>\r\n );\r\n};\r\n\r\nconst TruncatedTextByWidth: React.FC<{ text: any; className?: string }> = ({ text, className }) => {\r\n const ref = React.useRef<HTMLSpanElement>(null);\r\n const [isOverflowing, setIsOverflowing] = React.useState(false);\r\n\r\n React.useEffect(() => {\r\n const el = ref.current;\r\n if (!el) return;\r\n\r\n const checkOverflow = () => setIsOverflowing(el.scrollWidth > el.clientWidth);\r\n checkOverflow();\r\n\r\n const observer = new ResizeObserver(checkOverflow);\r\n observer.observe(el);\r\n return () => observer.disconnect();\r\n }, [text]);\r\n\r\n if (!text) {\r\n return <span className={cn('cursor-default', className)}>{''}</span>;\r\n }\r\n\r\n const textSpan = (\r\n <span ref={ref} className={cn('block w-full truncate', className)}>\r\n {text}\r\n </span>\r\n );\r\n\r\n return (\r\n <Tooltip>\r\n {/* TooltipTrigger's own wrapper div has no width/min-width by default, so as a flex or\r\n grid item it falls back to its content's unwrapped min-content size — which, for a\r\n nowrap-truncated span, is the FULL text width. That silently blocks the span's own\r\n truncation from ever taking effect. min-w-0 + w-full let it shrink like the span does. */}\r\n <TooltipTrigger className=\"min-w-0 w-full\">{textSpan}</TooltipTrigger>\r\n {isOverflowing && (\r\n <TooltipContent\r\n side=\"top\"\r\n sideOffset={0}\r\n className=\"max-w-[21.875rem] max-h-[18.75rem] overflow-y-auto whitespace-normal break-words pointer-events-auto\"\r\n >\r\n <small className=\"text-label text-text-muted\">{text}</small>\r\n </TooltipContent>\r\n )}\r\n </Tooltip>\r\n );\r\n};\r\n\r\nexport { TruncatedText, CARD_TEXT_LIMIT };\r\n","import * as React from \"react\";\nimport { Button } from \"../ui/button\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"../ui/tooltip\";\nimport { EViewMode } from \"../../types/view-mode\";\n\nexport type ViewMode = EViewMode;\n\nconst VIEW_MODE_KEY = \"fp_view_mode\";\n\nexport const useViewMode = (): [EViewMode, (mode: EViewMode) => void] => {\n const [viewMode, setViewMode] = React.useState<EViewMode>(() => {\n const stored = localStorage.getItem(VIEW_MODE_KEY);\n if (stored === EViewMode.LIST || stored === EViewMode.GRID) return stored;\n return EViewMode.GRID;\n });\n\n const setAndPersist = React.useCallback((mode: EViewMode) => {\n setViewMode(mode);\n localStorage.setItem(VIEW_MODE_KEY, mode);\n }, []);\n\n return [viewMode, setAndPersist];\n};\n\ninterface ViewToggleProps {\n /** Current view mode. Defaults to GRID if not provided (uncontrolled callers can pair this with `useViewMode`). */\n viewMode?: EViewMode;\n onViewModeChange: (mode: EViewMode) => void;\n}\n\n/**\n * Reusable grid / list view-mode toggle used across all manager pages.\n */\nconst ViewToggle: React.FC<ViewToggleProps> = ({ viewMode = EViewMode.GRID, onViewModeChange }) => {\n return (\n <div className=\"view-toggle\">\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n type=\"button\"\n onClick={() => onViewModeChange(EViewMode.GRID)}\n className={`view-toggle__btn${viewMode === EViewMode.GRID ? \" view-toggle__btn--active\" : \"\"}`}\n variant=\"ghost\"\n size=\"icon\"\n >\n <i className=\"icon-neo-grid\"></i>\n </Button>\n </TooltipTrigger>\n <TooltipContent>Grid view</TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n type=\"button\"\n onClick={() => onViewModeChange(EViewMode.LIST)}\n className={`view-toggle__btn${viewMode === EViewMode.LIST ? \" view-toggle__btn--active\" : \"\"}`}\n variant=\"ghost\"\n size=\"icon\"\n >\n <i className=\"icon-neo-list\"></i>\n </Button>\n </TooltipTrigger>\n <TooltipContent>List view</TooltipContent>\n </Tooltip>\n </div>\n );\n};\n\nViewToggle.displayName = \"ViewToggle\";\n\nexport { ViewToggle };\n"],"mappings":"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","names":["font","color","spacing","shadow","zIndex","radius","EViewMode","React","import_jsx_runtime","import_class_variance_authority","React","React","import_jsx_runtime","import_jsx_runtime","color","baseClasses","React","import_class_variance_authority","import_class_variance_authority","color","classes","style","import_jsx_runtime","color","React","import_jsx_runtime","React","import_jsx_runtime","color","React","import_class_variance_authority","import_jsx_runtime","color","import_jsx_runtime","React","import_jsx_runtime","React","import_react_dom","import_jsx_runtime","import_react","React","import_jsx_runtime","import_jsx_runtime","React","import_jsx_runtime","import_react","import_formik","import_jsx_runtime","React","import_jsx_runtime","import_react","import_jsx_runtime","React","import_react_dom","import_jsx_runtime","React","import_jsx_runtime","sizeClasses","React","import_jsx_runtime","import_react","import_formik","React","import_jsx_runtime","React","import_class_variance_authority","import_jsx_runtime","React","import_class_variance_authority","import_jsx_runtime","InfiniteScroll","React","import_formik","import_jsx_runtime","import_react","import_jsx_runtime","React","dayjs","React","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime"]}
package/dist/index.css ADDED
@@ -0,0 +1,95 @@
1
+ /* src/components/ui/time-picker.css */
2
+ .shared-time-picker__field {
3
+ position: relative;
4
+ display: flex;
5
+ height: 2.25rem;
6
+ width: 100%;
7
+ cursor: pointer;
8
+ align-items: center;
9
+ justify-content: space-between;
10
+ gap: 0.5rem;
11
+ border-radius: 0.5rem;
12
+ padding-left: 0.75rem;
13
+ padding-right: 0.75rem;
14
+ font-size: 0.8125rem;
15
+ border: 1px solid var(--color-neutral-350);
16
+ background: var(--color-ext-f8f8fb);
17
+ }
18
+ .shared-time-picker__field[data-open=true] {
19
+ border-color: var(--color-brand-blue);
20
+ box-shadow: 0 0 0 1px var(--color-ext-5c62bc40);
21
+ }
22
+ .shared-time-picker__field[data-disabled=true] {
23
+ opacity: 0.5;
24
+ pointer-events: none;
25
+ }
26
+ .shared-time-picker__value {
27
+ white-space: nowrap;
28
+ overflow: hidden;
29
+ text-overflow: ellipsis;
30
+ color: var(--color-neutral-600);
31
+ font-weight: 400;
32
+ }
33
+ .shared-time-picker__value[data-filled=true] {
34
+ color: var(--color-brand-blue);
35
+ font-weight: 600;
36
+ }
37
+ .shared-time-picker__icon {
38
+ font-size: 0.875rem;
39
+ color: var(--color-neutral-gray);
40
+ flex-shrink: 0;
41
+ }
42
+ .shared-time-picker__popup {
43
+ position: absolute;
44
+ top: calc(100% + 4px);
45
+ left: 0;
46
+ z-index: 30;
47
+ display: flex;
48
+ background: var(--color-neutral-white);
49
+ border-radius: 0.5rem;
50
+ box-shadow: 0 4px 24px rgba(0, 0, 0, 0.08);
51
+ border: 1px solid var(--color-neutral-350);
52
+ overflow: hidden;
53
+ }
54
+ .shared-time-picker__popup--up {
55
+ top: auto;
56
+ bottom: calc(100% + 4px);
57
+ }
58
+ .shared-time-picker__col {
59
+ max-height: 200px;
60
+ overflow-y: auto;
61
+ width: 56px;
62
+ scrollbar-width: none;
63
+ -ms-overflow-style: none;
64
+ }
65
+ .shared-time-picker__col::-webkit-scrollbar {
66
+ display: none;
67
+ }
68
+ .shared-time-picker__sep {
69
+ display: flex;
70
+ align-items: center;
71
+ color: var(--color-neutral-gray);
72
+ font-weight: 600;
73
+ }
74
+ .shared-time-picker__option {
75
+ text-align: center;
76
+ font-size: 0.8125rem;
77
+ padding: 6px 0;
78
+ color: var(--color-neutral-700);
79
+ cursor: pointer;
80
+ }
81
+ .shared-time-picker__option:hover:not([data-selected=true]):not([data-disabled=true]) {
82
+ background: var(--color-neutral-200);
83
+ }
84
+ .shared-time-picker__option[data-selected=true] {
85
+ background: rgba(92, 98, 188, 0.1);
86
+ color: var(--color-brand-blue);
87
+ font-weight: 700;
88
+ }
89
+ .shared-time-picker__option[data-disabled=true] {
90
+ color: var(--color-neutral-600);
91
+ opacity: 0.5;
92
+ pointer-events: none;
93
+ cursor: default;
94
+ }
95
+ /*# sourceMappingURL=index.css.map */
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/ui/time-picker.css"],"sourcesContent":["/* ── Shared TimePicker (components/ui/time-picker.tsx) ──────────────────────\n Page-agnostic hour/minute scroller — self-contained field look so it works\n consistently wherever it's used, without depending on any host app's own\n form-field base class. Colocated with, and imported directly by, the\n component.\n\n Converted from the source app's time-picker.scss: flattened out of Sass\n nesting and out from under that app's `#fpneo` Tailwind-important wrapper\n (a host-app-specific selector that would never match here), and with its\n `@apply` utilities inlined as plain CSS so this file has zero build-step\n dependency on Tailwind. */\n\n.shared-time-picker__field {\n position: relative;\n display: flex;\n height: 2.25rem;\n width: 100%;\n cursor: pointer;\n align-items: center;\n justify-content: space-between;\n gap: 0.5rem;\n border-radius: 0.5rem;\n padding-left: 0.75rem;\n padding-right: 0.75rem;\n font-size: 0.8125rem;\n border: 1px solid var(--color-neutral-350);\n background: var(--color-ext-f8f8fb);\n}\n\n.shared-time-picker__field[data-open='true'] {\n border-color: var(--color-brand-blue);\n box-shadow: 0 0 0 1px var(--color-ext-5c62bc40);\n}\n\n.shared-time-picker__field[data-disabled='true'] {\n opacity: 0.5;\n pointer-events: none;\n}\n\n.shared-time-picker__value {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n color: var(--color-neutral-600);\n font-weight: 400;\n}\n\n.shared-time-picker__value[data-filled='true'] {\n color: var(--color-brand-blue);\n font-weight: 600;\n}\n\n.shared-time-picker__icon {\n font-size: 0.875rem;\n color: var(--color-neutral-gray);\n flex-shrink: 0;\n}\n\n.shared-time-picker__popup {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n z-index: 30;\n display: flex;\n background: var(--color-neutral-white);\n border-radius: 0.5rem;\n box-shadow: 0 4px 24px rgba(0, 0, 0, 0.08);\n border: 1px solid var(--color-neutral-350);\n overflow: hidden;\n}\n\n.shared-time-picker__popup--up {\n top: auto;\n bottom: calc(100% + 4px);\n}\n\n.shared-time-picker__col {\n max-height: 200px;\n overflow-y: auto;\n width: 56px;\n scrollbar-width: none; /* Firefox */\n -ms-overflow-style: none; /* legacy Edge/IE */\n}\n\n.shared-time-picker__col::-webkit-scrollbar {\n display: none; /* Chrome/Safari/WebKit */\n}\n\n.shared-time-picker__sep {\n display: flex;\n align-items: center;\n color: var(--color-neutral-gray);\n font-weight: 600;\n}\n\n.shared-time-picker__option {\n text-align: center;\n font-size: 0.8125rem;\n padding: 6px 0;\n color: var(--color-neutral-700);\n cursor: pointer;\n}\n\n.shared-time-picker__option:hover:not([data-selected='true']):not([data-disabled='true']) {\n background: var(--color-neutral-200);\n}\n\n.shared-time-picker__option[data-selected='true'] {\n background: rgba(92, 98, 188, 0.1);\n color: var(--color-brand-blue);\n font-weight: 700;\n}\n\n.shared-time-picker__option[data-disabled='true'] {\n color: var(--color-neutral-600);\n opacity: 0.5;\n pointer-events: none;\n cursor: default;\n}\n"],"mappings":";AAYA,CAAC;AACC,YAAU;AACV,WAAS;AACT,UAAQ;AACR,SAAO;AACP,UAAQ;AACR,eAAa;AACb,mBAAiB;AACjB,OAAK;AACL,iBAAe;AACf,gBAAc;AACd,iBAAe;AACf,aAAW;AACX,UAAQ,IAAI,MAAM,IAAI;AACtB,cAAY,IAAI;AAClB;AAEA,CAjBC,yBAiByB,CAAC;AACzB,gBAAc,IAAI;AAClB,cAAY,EAAE,EAAE,EAAE,IAAI,IAAI;AAC5B;AAEA,CAtBC,yBAsByB,CAAC;AACzB,WAAS;AACT,kBAAgB;AAClB;AAEA,CAAC;AACC,eAAa;AACb,YAAU;AACV,iBAAe;AACf,SAAO,IAAI;AACX,eAAa;AACf;AAEA,CARC,yBAQyB,CAAC;AACzB,SAAO,IAAI;AACX,eAAa;AACf;AAEA,CAAC;AACC,aAAW;AACX,SAAO,IAAI;AACX,eAAa;AACf;AAEA,CAAC;AACC,YAAU;AACV,OAAK,KAAK,KAAK,EAAE;AACjB,QAAM;AACN,WAAS;AACT,WAAS;AACT,cAAY,IAAI;AAChB,iBAAe;AACf,cAAY,EAAE,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;AACrC,UAAQ,IAAI,MAAM,IAAI;AACtB,YAAU;AACZ;AAEA,CAAC;AACC,OAAK;AACL,UAAQ,KAAK,KAAK,EAAE;AACtB;AAEA,CAAC;AACC,cAAY;AACZ,cAAY;AACZ,SAAO;AACP,mBAAiB;AACjB,sBAAoB;AACtB;AAEA,CARC,uBAQuB;AACtB,WAAS;AACX;AAEA,CAAC;AACC,WAAS;AACT,eAAa;AACb,SAAO,IAAI;AACX,eAAa;AACf;AAEA,CAAC;AACC,cAAY;AACZ,aAAW;AACX,WAAS,IAAI;AACb,SAAO,IAAI;AACX,UAAQ;AACV;AAEA,CARC,0BAQ0B,MAAM,KAAK,CAAC,oBAAsB,KAAK,CAAC;AACjE,cAAY,IAAI;AAClB;AAEA,CAZC,0BAY0B,CAAC;AAC1B,cAAY,KAAK,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE;AAC9B,SAAO,IAAI;AACX,eAAa;AACf;AAEA,CAlBC,0BAkB0B,CAAC;AAC1B,SAAO,IAAI;AACX,WAAS;AACT,kBAAgB;AAChB,UAAQ;AACV;","names":[]}