@mindtris/ui 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":["../lib/utils.ts","../lib/animation-utils.ts","../lib/focus-utils.ts","../lib/variant-utils.ts","../lib/a11y-utils.ts","../lib/performance-utils.ts","../lib/validation-patterns.ts","../lib/component-api-patterns.ts","../contexts/app-provider.tsx","../hooks/use-window-width.ts","../hooks/use-media-query.ts","../hooks/use-click-outside.ts","../hooks/use-debounce.ts","../hooks/use-prefers-reduced-motion.ts","../hooks/use-transition-state.ts","../hooks/use-focus-trap.ts","../hooks/use-focus-return.ts","../hooks/use-async-state.ts","../hooks/use-toggle.ts","../hooks/use-counter.ts","../hooks/use-aria-live.ts","../hooks/use-throttle.ts","../hooks/use-form-validation.ts","../theme/use-theme-manager.ts","../theme/constants.ts","../theme/presets.ts","../theme/theme-data.ts","../theme/utils/hsl-transform.ts","../theme/utils/shadow-utils.ts","../theme/apply-theme.ts","../theme/utils/persistence.ts","../theme/utils/debounce.ts","../theme/utils/validation.ts","../components/theme-customizer/index.tsx","../components/ui/button.tsx","../components/ui/tooltip.tsx","../components/ui/button-group.tsx","../components/ui/toggle-group.tsx","../components/ui/accordion.tsx","../components/ui/accordion-group.tsx","../components/ui/avatar.tsx","../components/ui/alert.tsx","../components/ui/aspect-ratio.tsx","../components/ui/badge.tsx","../components/ui/breadcrumb.tsx","../components/ui/pagination.tsx","../components/ui/card.tsx","../components/ui/input.tsx","../components/ui/input-otp.tsx","../components/ui/file-input.tsx","../components/ui/input-group.tsx","../components/ui/textarea.tsx","../components/ui/popover.tsx","../components/ui/switch.tsx","../components/ui/checkbox.tsx","../components/ui/radio-group.tsx","../components/ui/chip.tsx","../components/ui/select.tsx","../components/ui/native-select.tsx","../components/ui/field.tsx","../components/ui/label.tsx","../components/ui/empty.tsx","../components/ui/carousel.tsx","../components/ui/combobox.tsx","../components/ui/command.tsx","../components/ui/dialog.tsx","../components/ui/separator.tsx","../components/ui/drawer.tsx","../components/ui/menubar.tsx","../components/ui/context-menu.tsx","../components/ui/dropdown.tsx","../components/ui/logo.tsx","../components/ui/sidebar.tsx","../components/ui/alert-dialog.tsx","../components/ui/modal.tsx","../components/ui/sheet.tsx","../components/ui/table.tsx","../components/ui/hover-card.tsx","../components/ui/card-decorator.tsx","../components/ui/progress.tsx","../components/ui/slider.tsx","../components/ui/skeleton.tsx","../components/ui/loading-spinner.tsx","../components/ui/error-boundary.tsx","../components/ui/calendar.tsx","../components/ui/datepicker.tsx","../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/constants.js","../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/constructFrom.js","../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/toDate.js","../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/_lib/defaultOptions.js","../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startOfWeek.js","../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startOfISOWeek.js","../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getISOWeekYear.js","../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/_lib/getTimezoneOffsetInMilliseconds.js","../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/_lib/normalizeDates.js","../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startOfDay.js","../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceInCalendarDays.js","../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startOfISOWeekYear.js","../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isDate.js","../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isValid.js","../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startOfYear.js","../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/en-US/_lib/formatDistance.js","../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/_lib/buildFormatLongFn.js","../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/en-US/_lib/formatLong.js","../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/en-US/_lib/formatRelative.js","../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/_lib/buildLocalizeFn.js","../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/en-US/_lib/localize.js","../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/_lib/buildMatchFn.js","../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/_lib/buildMatchPatternFn.js","../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/en-US/_lib/match.js","../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/en-US.js","../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getDayOfYear.js","../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getISOWeek.js","../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getWeekYear.js","../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startOfWeekYear.js","../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getWeek.js","../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/_lib/addLeadingZeros.js","../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/_lib/format/lightFormatters.js","../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/_lib/format/formatters.js","../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/_lib/format/longFormatters.js","../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/_lib/protectedTokens.js","../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/format.js","../components/ui/header.tsx","../components/ui/navbar.tsx","../components/ui/tabs.tsx","../components/ui/tabs-radix.tsx","../components/ui/collapsible-section.tsx","../components/ui/collapsible.tsx","../components/ui/chart.tsx","../components/ui/form.tsx","../components/ui/navigation-menu.tsx","../components/ui/theme-toggle-icon.tsx","../components/ui/icon.tsx","../lib/icon-constants.ts","../components/ui/kbd.tsx","../components/ui/scroll-area.tsx","../components/ui/resizable.tsx","../components/ui/typography.tsx","../components/ui/toggle.tsx","../components/ui/sonner.tsx","../../../node_modules/.pnpm/sonner@2.0.7_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/sonner/dist/index.mjs","../components/ui/select-radix.tsx","../components/ui/button-tooltip.tsx","../components/theme-customizer/theme-tab.tsx","../components/theme-customizer/colors-panel.tsx","../components/theme-customizer/color-input.tsx","../components/theme-customizer/layout-tab.tsx","../components/theme-customizer/other-panel.tsx","../components/theme-customizer/import-modal.tsx","../components/theme-customizer/typography-panel.tsx","../theme/google-fonts.ts","../layout-primitives.tsx","../blocks/header/header-block.tsx","../blocks/footer/footer-block.tsx"],"sourcesContent":["import { clsx, type ClassValue } from 'clsx'\r\nimport { twMerge } from 'tailwind-merge'\r\n\r\n/**\r\n * Merge class names with Tailwind conflict resolution.\r\n * Required for design-system components (variants + theme classes).\r\n */\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs))\r\n}\r\n","/**\r\n * Animation utilities\r\n * Helper functions for working with animation tokens and transitions\r\n */\r\n\r\n/**\r\n * Get transition class string from animation tokens\r\n * Uses CSS custom properties from tokens/base/animations.css\r\n * \r\n * @param property - CSS property to transition (default: 'all')\r\n * @param duration - Duration token name (default: 'normal')\r\n * @param easing - Easing token name (default: 'ease-out')\r\n * @returns Transition CSS string\r\n * \r\n * @example\r\n * ```tsx\r\n * const transition = getTransitionClass('colors', 'fast', 'ease-out')\r\n * // Returns: 'color 100ms cubic-bezier(0, 0, 0.2, 1), background-color 100ms cubic-bezier(0, 0, 0.2, 1), border-color 100ms cubic-bezier(0, 0, 0.2, 1)'\r\n * ```\r\n */\r\nexport function getTransitionClass(\r\n property: 'all' | 'colors' | 'opacity' | 'transform' | string = 'all',\r\n duration: 'fast' | 'base' | 'normal' | 'slow' | 'slower' = 'normal',\r\n easing: 'linear' | 'ease-in' | 'ease-out' | 'ease-in-out' | 'ease-bounce' = 'ease-out'\r\n): string {\r\n const durationMap = {\r\n fast: 'var(--duration-fast)',\r\n base: 'var(--duration-base)',\r\n normal: 'var(--duration-normal)',\r\n slow: 'var(--duration-slow)',\r\n slower: 'var(--duration-slower)',\r\n }\r\n\r\n const easingMap = {\r\n linear: 'var(--ease-linear)',\r\n 'ease-in': 'var(--ease-in)',\r\n 'ease-out': 'var(--ease-out)',\r\n 'ease-in-out': 'var(--ease-in-out)',\r\n 'ease-bounce': 'var(--ease-bounce)',\r\n }\r\n\r\n const durationValue = durationMap[duration] || durationMap.normal\r\n const easingValue = easingMap[easing] || easingMap['ease-out']\r\n\r\n // Use preset transitions for common properties\r\n if (property === 'colors') {\r\n return 'var(--transition-colors)'\r\n }\r\n if (property === 'opacity') {\r\n return 'var(--transition-opacity)'\r\n }\r\n if (property === 'transform') {\r\n return 'var(--transition-transform)'\r\n }\r\n if (property === 'all') {\r\n return 'var(--transition-all)'\r\n }\r\n\r\n // Custom property transition\r\n return `${property} ${durationValue} ${easingValue}`\r\n}\r\n\r\n/**\r\n * Check if user prefers reduced motion\r\n * Safe to call on server (returns false)\r\n * \r\n * @returns boolean - true if user prefers reduced motion\r\n */\r\nexport function shouldReduceMotion(): boolean {\r\n if (typeof window === 'undefined') return false\r\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches\r\n}\r\n\r\n/**\r\n * Get animation duration respecting reduced motion preference\r\n * \r\n * @param duration - Desired duration in milliseconds\r\n * @param respectPreference - Whether to respect reduced motion (default: true)\r\n * @returns Effective duration (0 if reduced motion preferred)\r\n */\r\nexport function getRespectfulDuration(\r\n duration: number,\r\n respectPreference: boolean = true\r\n): number {\r\n if (respectPreference && shouldReduceMotion()) {\r\n return 0\r\n }\r\n return duration\r\n}\r\n\r\n/**\r\n * Create a keyframe animation string from animation tokens\r\n * \r\n * @param animationName - Name of keyframe animation (fadeIn, fadeOut, slideUp, slideDown, spin, pulse, bounce)\r\n * @returns Animation CSS string\r\n * \r\n * @example\r\n * ```tsx\r\n * const animation = createKeyframe('fadeIn')\r\n * // Returns: 'fadeIn 200ms cubic-bezier(0, 0, 0.2, 1)'\r\n * ```\r\n */\r\nexport function createKeyframe(\r\n animationName: 'fadeIn' | 'fadeOut' | 'slideUp' | 'slideDown' | 'spin' | 'pulse' | 'bounce'\r\n): string {\r\n const animationMap = {\r\n fadeIn: 'var(--animate-fade-in)',\r\n fadeOut: 'var(--animate-fade-out)',\r\n slideUp: 'var(--animate-slide-up)',\r\n slideDown: 'var(--animate-slide-down)',\r\n spin: 'var(--animate-spin)',\r\n pulse: 'var(--animate-pulse)',\r\n bounce: 'var(--animate-bounce)',\r\n }\r\n\r\n return animationMap[animationName] || animationMap.fadeIn\r\n}\r\n","/**\r\n * Focus utilities\r\n * Helper functions for managing focus and focusable elements\r\n */\r\n\r\n/**\r\n * Get all focusable elements within a container\r\n * \r\n * @param container - Container element to search within\r\n * @returns Array of focusable HTMLElements\r\n */\r\nexport function getFocusableElements(container: HTMLElement | Document = document): HTMLElement[] {\r\n const selector = [\r\n 'a[href]',\r\n 'button:not([disabled])',\r\n 'textarea:not([disabled])',\r\n 'input:not([disabled])',\r\n 'select:not([disabled])',\r\n '[tabindex]:not([tabindex=\"-1\"])',\r\n ].join(', ')\r\n\r\n return Array.from(container.querySelectorAll<HTMLElement>(selector)).filter((el) => {\r\n // Filter out hidden elements\r\n const style = window.getComputedStyle(el)\r\n return (\r\n style.display !== 'none' &&\r\n style.visibility !== 'hidden' &&\r\n !el.hasAttribute('inert') &&\r\n !el.hasAttribute('aria-hidden')\r\n )\r\n })\r\n}\r\n\r\n/**\r\n * Focus the first focusable element in a container\r\n * \r\n * @param container - Container element to search within\r\n * @returns The focused element, or null if none found\r\n */\r\nexport function focusFirstElement(container: HTMLElement | Document = document): HTMLElement | null {\r\n const focusableElements = getFocusableElements(container)\r\n if (focusableElements.length === 0) return null\r\n\r\n const firstElement = focusableElements[0]\r\n firstElement.focus()\r\n return firstElement\r\n}\r\n\r\n/**\r\n * Focus the last focusable element in a container\r\n * \r\n * @param container - Container element to search within\r\n * @returns The focused element, or null if none found\r\n */\r\nexport function focusLastElement(container: HTMLElement | Document = document): HTMLElement | null {\r\n const focusableElements = getFocusableElements(container)\r\n if (focusableElements.length === 0) return null\r\n\r\n const lastElement = focusableElements[focusableElements.length - 1]\r\n lastElement.focus()\r\n return lastElement\r\n}\r\n\r\n/**\r\n * Focus the next focusable element after the current one\r\n * \r\n * @param currentElement - Current focused element\r\n * @param container - Container to search within (default: document)\r\n * @returns The focused element, or null if none found\r\n */\r\nexport function focusNextElement(\r\n currentElement: HTMLElement,\r\n container: HTMLElement | Document = document\r\n): HTMLElement | null {\r\n const focusableElements = getFocusableElements(container)\r\n const currentIndex = focusableElements.indexOf(currentElement)\r\n\r\n if (currentIndex === -1 || currentIndex === focusableElements.length - 1) {\r\n return focusFirstElement(container)\r\n }\r\n\r\n const nextElement = focusableElements[currentIndex + 1]\r\n nextElement.focus()\r\n return nextElement\r\n}\r\n\r\n/**\r\n * Focus the previous focusable element before the current one\r\n * \r\n * @param currentElement - Current focused element\r\n * @param container - Container to search within (default: document)\r\n * @returns The focused element, or null if none found\r\n */\r\nexport function focusPreviousElement(\r\n currentElement: HTMLElement,\r\n container: HTMLElement | Document = document\r\n): HTMLElement | null {\r\n const focusableElements = getFocusableElements(container)\r\n const currentIndex = focusableElements.indexOf(currentElement)\r\n\r\n if (currentIndex === -1 || currentIndex === 0) {\r\n return focusLastElement(container)\r\n }\r\n\r\n const previousElement = focusableElements[currentIndex - 1]\r\n previousElement.focus()\r\n return previousElement\r\n}\r\n\r\n/**\r\n * Check if an element is focusable\r\n * \r\n * @param element - Element to check\r\n * @returns true if element is focusable\r\n */\r\nexport function isFocusable(element: HTMLElement): boolean {\r\n const focusableElements = getFocusableElements(element.ownerDocument)\r\n return focusableElements.includes(element)\r\n}\r\n","import { type ClassValue, clsx } from 'clsx'\r\nimport { twMerge } from 'tailwind-merge'\r\nimport { cn } from './utils'\r\n\r\n/**\r\n * Variant configuration for component variants\r\n */\r\nexport interface VariantConfig<T extends string> {\r\n base?: ClassValue\r\n variants: Record<string, Record<T | string, ClassValue>>\r\n defaultVariants?: Partial<Record<string, T | string>>\r\n compoundVariants?: Array<{\r\n variants: Partial<Record<string, T | string>>\r\n class: ClassValue\r\n }>\r\n}\r\n\r\n/**\r\n * Create a variant function for type-safe component variants\r\n * Combines base classes with variant classes and compound variants\r\n * \r\n * @param config - Variant configuration\r\n * @returns Function that generates className strings from variant props\r\n * \r\n * @example\r\n * ```tsx\r\n * const buttonVariants = createVariants({\r\n * base: \"px-4 py-2 rounded font-medium\",\r\n * variants: {\r\n * variant: {\r\n * primary: \"bg-primary text-primary-foreground\",\r\n * secondary: \"bg-secondary text-secondary-foreground\",\r\n * },\r\n * size: {\r\n * sm: \"text-sm px-3 py-1\",\r\n * md: \"px-4 py-2\",\r\n * lg: \"text-lg px-6 py-3\",\r\n * },\r\n * },\r\n * defaultVariants: {\r\n * variant: \"primary\",\r\n * size: \"md\",\r\n * },\r\n * compoundVariants: [\r\n * {\r\n * variants: { variant: \"primary\", size: \"lg\" },\r\n * class: \"shadow-lg\",\r\n * },\r\n * ],\r\n * })\r\n * \r\n * // Usage\r\n * const className = buttonVariants({ variant: \"primary\", size: \"lg\" })\r\n * ```\r\n */\r\nexport function createVariants<T extends string>(\r\n config: VariantConfig<T>\r\n): (props?: Partial<Record<string, T | string | undefined>>) => string {\r\n return (props = {}) => {\r\n const { base, variants, defaultVariants = {}, compoundVariants = [] } = config\r\n\r\n // Merge props with defaults\r\n const mergedProps = { ...defaultVariants, ...props }\r\n\r\n // Build class array\r\n const classes: ClassValue[] = []\r\n\r\n // Add base classes\r\n if (base) {\r\n classes.push(base)\r\n }\r\n\r\n // Add variant classes\r\n Object.entries(variants).forEach(([variantKey, variantMap]) => {\r\n const value = mergedProps[variantKey]\r\n if (value && variantMap[value]) {\r\n classes.push(variantMap[value])\r\n }\r\n })\r\n\r\n // Add compound variant classes\r\n compoundVariants.forEach((compound) => {\r\n const matches = Object.entries(compound.variants).every(\r\n ([key, value]) => mergedProps[key] === value\r\n )\r\n if (matches) {\r\n classes.push(compound.class)\r\n }\r\n })\r\n\r\n return cn(classes)\r\n }\r\n}\r\n\r\n/**\r\n * Generate variant class names from variant props\r\n * Simpler version without compound variants\r\n * \r\n * @param base - Base classes\r\n * @param variants - Variant class maps\r\n * @param props - Variant props\r\n * @returns Merged className string\r\n * \r\n * @example\r\n * ```tsx\r\n * const className = variantClassNames(\r\n * \"px-4 py-2\",\r\n * {\r\n * variant: {\r\n * primary: \"bg-primary\",\r\n * secondary: \"bg-secondary\",\r\n * },\r\n * },\r\n * { variant: \"primary\" }\r\n * )\r\n * ```\r\n */\r\nexport function variantClassNames(\r\n base: ClassValue,\r\n variants: Record<string, Record<string, ClassValue>>,\r\n props: Record<string, string | undefined>\r\n): string {\r\n const classes: ClassValue[] = [base]\r\n\r\n Object.entries(variants).forEach(([variantKey, variantMap]) => {\r\n const value = props[variantKey]\r\n if (value && variantMap[value]) {\r\n classes.push(variantMap[value])\r\n }\r\n })\r\n\r\n return cn(classes)\r\n}\r\n","/**\r\n * Accessibility utilities\r\n * Helper functions for ARIA attributes, IDs, and screen reader support\r\n */\r\n\r\nlet idCounter = 0\r\n\r\n/**\r\n * Generate a unique ID for use in ARIA attributes\r\n * Safe to call on server (uses counter instead of random)\r\n * \r\n * @param prefix - Prefix for the ID\r\n * @returns Unique ID string\r\n * \r\n * @example\r\n * ```tsx\r\n * const id = generateId('input')\r\n * // Returns: 'input-1', 'input-2', etc.\r\n * ```\r\n */\r\nexport function generateId(prefix: string = 'id'): string {\r\n idCounter += 1\r\n return `${prefix}-${idCounter}`\r\n}\r\n\r\n/**\r\n * Get ARIA label from various sources\r\n * Prioritizes explicit label, then aria-label, then aria-labelledby\r\n * \r\n * @param options - Label options\r\n * @returns Label string or undefined\r\n */\r\nexport function getAriaLabel(options: {\r\n label?: string\r\n 'aria-label'?: string\r\n 'aria-labelledby'?: string\r\n element?: HTMLElement\r\n}): string | undefined {\r\n if (options.label) return options.label\r\n if (options['aria-label']) return options['aria-label']\r\n if (options['aria-labelledby'] && options.element) {\r\n const labelledByElement = options.element.ownerDocument.getElementById(\r\n options['aria-labelledby']\r\n )\r\n return labelledByElement?.textContent || undefined\r\n }\r\n return undefined\r\n}\r\n\r\n/**\r\n * Get ARIA described by ID from helper text or error message\r\n * \r\n * @param options - Description options\r\n * @returns ID string or undefined\r\n */\r\nexport function getAriaDescribedBy(options: {\r\n helperTextId?: string\r\n errorId?: string\r\n hasError?: boolean\r\n}): string | undefined {\r\n const { helperTextId, errorId, hasError } = options\r\n if (hasError && errorId) return errorId\r\n if (helperTextId) return helperTextId\r\n return undefined\r\n}\r\n\r\n/**\r\n * Announce a message to screen readers via ARIA live region\r\n * Creates a temporary live region element and announces the message\r\n * \r\n * @param message - Message to announce\r\n * @param priority - Priority level ('polite' or 'assertive')\r\n * \r\n * @example\r\n * ```tsx\r\n * announceToScreenReader('Form submitted successfully', 'polite')\r\n * announceToScreenReader('Error: Invalid input', 'assertive')\r\n * ```\r\n */\r\nexport function announceToScreenReader(\r\n message: string,\r\n priority: 'polite' | 'assertive' = 'polite'\r\n): void {\r\n if (typeof window === 'undefined') return\r\n\r\n const liveRegion = document.createElement('div')\r\n liveRegion.setAttribute('role', 'status')\r\n liveRegion.setAttribute('aria-live', priority)\r\n liveRegion.setAttribute('aria-atomic', 'true')\r\n liveRegion.className = 'sr-only'\r\n liveRegion.style.cssText = `\r\n position: absolute;\r\n width: 1px;\r\n height: 1px;\r\n padding: 0;\r\n margin: -1px;\r\n overflow: hidden;\r\n clip: rect(0, 0, 0, 0);\r\n white-space: nowrap;\r\n border-width: 0;\r\n `\r\n\r\n document.body.appendChild(liveRegion)\r\n\r\n // Use setTimeout to ensure the element is in the DOM before setting text\r\n setTimeout(() => {\r\n liveRegion.textContent = message\r\n\r\n // Remove after announcement (screen readers typically read within 1-2 seconds)\r\n setTimeout(() => {\r\n document.body.removeChild(liveRegion)\r\n }, 1000)\r\n }, 100)\r\n}\r\n\r\n/**\r\n * Check if an element is visible to screen readers\r\n * \r\n * @param element - Element to check\r\n * @returns true if element is visible to screen readers\r\n */\r\nexport function isVisibleToScreenReader(element: HTMLElement): boolean {\r\n const style = window.getComputedStyle(element)\r\n const hasAriaHidden = element.getAttribute('aria-hidden') === 'true'\r\n const hasDisplayNone = style.display === 'none'\r\n const hasVisibilityHidden = style.visibility === 'hidden'\r\n const hasOpacityZero = style.opacity === '0'\r\n\r\n return !hasAriaHidden && !hasDisplayNone && !hasVisibilityHidden && !hasOpacityZero\r\n}\r\n\r\n/**\r\n * Get accessible name for an element\r\n * Uses ARIA naming algorithm: aria-label > aria-labelledby > visible text content\r\n * \r\n * @param element - Element to get name for\r\n * @returns Accessible name or undefined\r\n */\r\nexport function getAccessibleName(element: HTMLElement): string | undefined {\r\n // Check aria-label\r\n const ariaLabel = element.getAttribute('aria-label')\r\n if (ariaLabel) return ariaLabel\r\n\r\n // Check aria-labelledby\r\n const ariaLabelledBy = element.getAttribute('aria-labelledby')\r\n if (ariaLabelledBy) {\r\n const labelledByElement = element.ownerDocument.getElementById(ariaLabelledBy)\r\n if (labelledByElement) {\r\n return labelledByElement.textContent || undefined\r\n }\r\n }\r\n\r\n // Check for visible text content\r\n const textContent = element.textContent?.trim()\r\n if (textContent) return textContent\r\n\r\n // Check for associated label (for form inputs)\r\n if (element.id) {\r\n const label = element.ownerDocument.querySelector(`label[for=\"${element.id}\"]`)\r\n if (label) {\r\n return label.textContent?.trim() || undefined\r\n }\r\n }\r\n\r\n return undefined\r\n}\r\n","/**\r\n * Performance utilities\r\n * Helper functions for performance optimization\r\n */\r\n\r\n/**\r\n * Throttle a function call\r\n * Ensures function is called at most once per delay period\r\n * \r\n * @param func - Function to throttle\r\n * @param delay - Delay in milliseconds\r\n * @returns Throttled function\r\n * \r\n * @example\r\n * ```tsx\r\n * const throttledScroll = throttle((event) => {\r\n * console.log('Scroll')\r\n * }, 100)\r\n * ```\r\n */\r\nexport function throttle<T extends (...args: any[]) => any>(\r\n func: T,\r\n delay: number\r\n): (...args: Parameters<T>) => void {\r\n let lastCall = 0\r\n let timeoutId: ReturnType<typeof setTimeout> | null = null\r\n\r\n return (...args: Parameters<T>) => {\r\n const now = Date.now()\r\n const timeSinceLastCall = now - lastCall\r\n\r\n if (timeSinceLastCall >= delay) {\r\n lastCall = now\r\n func(...args)\r\n } else {\r\n if (timeoutId) {\r\n clearTimeout(timeoutId)\r\n }\r\n timeoutId = setTimeout(() => {\r\n lastCall = Date.now()\r\n func(...args)\r\n }, delay - timeSinceLastCall)\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Debounce a function call\r\n * Delays execution until after delay has passed since last call\r\n * \r\n * @param func - Function to debounce\r\n * @param delay - Delay in milliseconds\r\n * @returns Debounced function\r\n * \r\n * @example\r\n * ```tsx\r\n * const debouncedSearch = debounce((query) => {\r\n * performSearch(query)\r\n * }, 300)\r\n * ```\r\n */\r\nexport function debounce<T extends (...args: any[]) => any>(\r\n func: T,\r\n delay: number\r\n): (...args: Parameters<T>) => void {\r\n let timeoutId: ReturnType<typeof setTimeout> | null = null\r\n\r\n return (...args: Parameters<T>) => {\r\n if (timeoutId) {\r\n clearTimeout(timeoutId)\r\n }\r\n timeoutId = setTimeout(() => {\r\n func(...args)\r\n }, delay)\r\n }\r\n}\r\n\r\n/**\r\n * Request animation frame wrapper\r\n * Provides a clean way to use requestAnimationFrame\r\n * \r\n * @param callback - Callback to execute on next frame\r\n * @returns Function to cancel the animation frame\r\n * \r\n * @example\r\n * ```tsx\r\n * const cancel = raf(() => {\r\n * updatePosition()\r\n * })\r\n * ```\r\n */\r\nexport function raf(callback: () => void): () => void {\r\n const id = requestAnimationFrame(callback)\r\n return () => cancelAnimationFrame(id)\r\n}\r\n\r\n/**\r\n * Double request animation frame\r\n * Useful for ensuring DOM updates are complete\r\n * \r\n * @param callback - Callback to execute after two frames\r\n * @returns Function to cancel\r\n */\r\nexport function doubleRaf(callback: () => void): () => void {\r\n let id1: number\r\n let id2: number\r\n\r\n id1 = requestAnimationFrame(() => {\r\n id2 = requestAnimationFrame(callback)\r\n })\r\n\r\n return () => {\r\n cancelAnimationFrame(id1)\r\n cancelAnimationFrame(id2)\r\n }\r\n}\r\n","/**\r\n * Validation patterns\r\n * Common validation rules and utilities for form validation\r\n */\r\n\r\nexport type ValidationRule<T = string> = (value: T) => string | undefined\r\n\r\n/**\r\n * Required field validation\r\n */\r\nexport const required: ValidationRule = (value) => {\r\n if (!value || (typeof value === 'string' && value.trim() === '')) {\r\n return 'This field is required'\r\n }\r\n return undefined\r\n}\r\n\r\n/**\r\n * Email validation\r\n */\r\nexport const email: ValidationRule<string> = (value) => {\r\n if (!value) return undefined // Let required handle empty values\r\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\r\n if (!emailRegex.test(value)) {\r\n return 'Please enter a valid email address'\r\n }\r\n return undefined\r\n}\r\n\r\n/**\r\n * Minimum length validation\r\n */\r\nexport const minLength = (min: number): ValidationRule<string> => {\r\n return (value) => {\r\n if (!value) return undefined\r\n if (value.length < min) {\r\n return `Must be at least ${min} characters`\r\n }\r\n return undefined\r\n }\r\n}\r\n\r\n/**\r\n * Maximum length validation\r\n */\r\nexport const maxLength = (max: number): ValidationRule<string> => {\r\n return (value) => {\r\n if (!value) return undefined\r\n if (value.length > max) {\r\n return `Must be no more than ${max} characters`\r\n }\r\n return undefined\r\n }\r\n}\r\n\r\n/**\r\n * Pattern validation (regex)\r\n */\r\nexport const pattern = (regex: RegExp, message: string): ValidationRule<string> => {\r\n return (value) => {\r\n if (!value) return undefined\r\n if (!regex.test(value)) {\r\n return message\r\n }\r\n return undefined\r\n }\r\n}\r\n\r\n/**\r\n * Number range validation\r\n */\r\nexport const numberRange = (min: number, max: number): ValidationRule<number> => {\r\n return (value) => {\r\n if (value === undefined || value === null) return undefined\r\n if (value < min || value > max) {\r\n return `Must be between ${min} and ${max}`\r\n }\r\n return undefined\r\n }\r\n}\r\n\r\n/**\r\n * Minimum value validation\r\n */\r\nexport const min = (minimum: number): ValidationRule<number> => {\r\n return (value) => {\r\n if (value === undefined || value === null) return undefined\r\n if (value < minimum) {\r\n return `Must be at least ${minimum}`\r\n }\r\n return undefined\r\n }\r\n}\r\n\r\n/**\r\n * Maximum value validation\r\n */\r\nexport const max = (maximum: number): ValidationRule<number> => {\r\n return (value) => {\r\n if (value === undefined || value === null) return undefined\r\n if (value > maximum) {\r\n return `Must be no more than ${maximum}`\r\n }\r\n return undefined\r\n }\r\n}\r\n\r\n/**\r\n * URL validation\r\n */\r\nexport const url: ValidationRule<string> = (value) => {\r\n if (!value) return undefined\r\n try {\r\n new URL(value)\r\n return undefined\r\n } catch {\r\n return 'Please enter a valid URL'\r\n }\r\n}\r\n\r\n/**\r\n * Combine multiple validation rules\r\n */\r\nexport const combine = <T>(...rules: ValidationRule<T>[]): ValidationRule<T> => {\r\n return (value) => {\r\n for (const rule of rules) {\r\n const error = rule(value)\r\n if (error) return error\r\n }\r\n return undefined\r\n }\r\n}\r\n\r\n/**\r\n * Conditional validation\r\n * Only validate if condition is true\r\n */\r\nexport const conditional = <T>(\r\n condition: (value: T) => boolean,\r\n rule: ValidationRule<T>\r\n): ValidationRule<T> => {\r\n return (value) => {\r\n if (!condition(value)) return undefined\r\n return rule(value)\r\n }\r\n}\r\n\r\n/**\r\n * Custom validation rule creator\r\n */\r\nexport const createRule = <T>(\r\n validator: (value: T) => boolean,\r\n message: string\r\n): ValidationRule<T> => {\r\n return (value) => {\r\n if (!validator(value)) {\r\n return message\r\n }\r\n return undefined\r\n }\r\n}\r\n","import { type ReactNode } from 'react'\r\n\r\n/**\r\n * Standard component props pattern\r\n * Base props that most components should include\r\n */\r\nexport interface StandardComponentProps {\r\n /**\r\n * Additional CSS classes\r\n */\r\n className?: string\r\n /**\r\n * Child elements\r\n */\r\n children?: ReactNode\r\n /**\r\n * Test ID for testing\r\n */\r\n 'data-testid'?: string\r\n}\r\n\r\n/**\r\n * Polymorphic component props\r\n * Allows component to render as different HTML elements\r\n */\r\nexport interface PolymorphicProps<T extends React.ElementType = 'div'> extends StandardComponentProps {\r\n /**\r\n * Element type to render as\r\n */\r\n as?: T\r\n}\r\n\r\n/**\r\n * Variant component props pattern\r\n * Components with variants should follow this pattern\r\n */\r\nexport interface VariantComponentProps extends StandardComponentProps {\r\n /**\r\n * Visual variant\r\n */\r\n variant?: string\r\n /**\r\n * Size variant\r\n */\r\n size?: string\r\n}\r\n\r\n/**\r\n * Form component props pattern\r\n * Base props for form input components\r\n */\r\nexport interface FormComponentProps extends StandardComponentProps {\r\n /**\r\n * Field name (for form submission)\r\n */\r\n name?: string\r\n /**\r\n * Field value\r\n */\r\n value?: string | number\r\n /**\r\n * Default value (uncontrolled)\r\n */\r\n defaultValue?: string | number\r\n /**\r\n * Whether field is disabled\r\n */\r\n disabled?: boolean\r\n /**\r\n * Whether field is required\r\n */\r\n required?: boolean\r\n /**\r\n * Whether field has error\r\n */\r\n error?: boolean\r\n /**\r\n * Error message\r\n */\r\n errorMessage?: string\r\n /**\r\n * Helper text\r\n */\r\n helperText?: string\r\n /**\r\n * ARIA label\r\n */\r\n 'aria-label'?: string\r\n /**\r\n * ARIA described by (for helper text/error)\r\n */\r\n 'aria-describedby'?: string\r\n}\r\n\r\n/**\r\n * Interactive component props pattern\r\n * Base props for clickable/interactive components\r\n */\r\nexport interface InteractiveComponentProps extends StandardComponentProps {\r\n /**\r\n * Click handler\r\n */\r\n onClick?: (event: React.MouseEvent) => void\r\n /**\r\n * Whether component is disabled\r\n */\r\n disabled?: boolean\r\n /**\r\n * ARIA label (required for icon-only buttons)\r\n */\r\n 'aria-label'?: string\r\n}\r\n\r\n/**\r\n * Create standard props with defaults\r\n */\r\nexport function createStandardProps(\r\n props: StandardComponentProps,\r\n defaults?: Partial<StandardComponentProps>\r\n): StandardComponentProps {\r\n return {\r\n ...defaults,\r\n ...props,\r\n className: props.className || defaults?.className,\r\n }\r\n}\r\n","'use client'\r\n\r\nimport { createContext, Dispatch, SetStateAction, useContext, useState } from 'react'\r\n\r\ninterface AppContextProps {\r\n sidebarOpen: boolean\r\n setSidebarOpen: Dispatch<SetStateAction<boolean>>\r\n sidebarExpanded: boolean\r\n setSidebarExpanded: Dispatch<SetStateAction<boolean>>\r\n}\r\n\r\nconst AppContext = createContext<AppContextProps>({\r\n sidebarOpen: false,\r\n setSidebarOpen: (): boolean => false,\r\n sidebarExpanded: false,\r\n setSidebarExpanded: (): boolean => false\r\n})\r\n\r\nexport default function AppProvider({\r\n children,\r\n}: {\r\n children: React.ReactNode\r\n}) {\r\n const [sidebarOpen, setSidebarOpen] = useState<boolean>(false)\r\n const [sidebarExpanded, setSidebarExpanded] = useState<boolean>(false)\r\n return (\r\n <AppContext.Provider value={{ sidebarOpen, setSidebarOpen, sidebarExpanded, setSidebarExpanded }}>\r\n {children}\r\n </AppContext.Provider>\r\n )\r\n}\r\n\r\nexport const useAppProvider = () => useContext(AppContext)\r\n","'use client'\r\n\r\nimport { useState, useEffect } from 'react'\r\n\r\nexport function useWindowWidth(): number | undefined {\r\n const [windowWidth, setWindowWidth] = useState<number | undefined>(\r\n typeof window !== 'undefined' ? window.innerWidth : undefined\r\n )\r\n\r\n useEffect(() => {\r\n if (typeof window === 'undefined') return\r\n\r\n const handleResize = () => {\r\n setWindowWidth(window.innerWidth)\r\n }\r\n\r\n window.addEventListener('resize', handleResize)\r\n handleResize()\r\n return () => window.removeEventListener('resize', handleResize)\r\n }, [])\r\n\r\n return windowWidth\r\n}\r\n","'use client'\r\n\r\nimport { useState, useEffect } from 'react'\r\n\r\n/**\r\n * useMediaQuery\r\n * Hook to track media query matches\r\n */\r\nexport function useMediaQuery(query: string): boolean {\r\n const [matches, setMatches] = useState<boolean>(false)\r\n\r\n useEffect(() => {\r\n if (typeof window === 'undefined') return\r\n\r\n const mediaQuery = window.matchMedia(query)\r\n setMatches(mediaQuery.matches)\r\n\r\n const handler = (event: MediaQueryListEvent) => {\r\n setMatches(event.matches)\r\n }\r\n\r\n // Modern browsers\r\n if (mediaQuery.addEventListener) {\r\n mediaQuery.addEventListener('change', handler)\r\n return () => mediaQuery.removeEventListener('change', handler)\r\n } else {\r\n // Fallback for older browsers\r\n mediaQuery.addListener(handler)\r\n return () => mediaQuery.removeListener(handler)\r\n }\r\n }, [query])\r\n\r\n return matches\r\n}\r\n\r\n/**\r\n * useBreakpoint\r\n * Hook to track common breakpoints\r\n */\r\nexport function useBreakpoint(): {\r\n isMobile: boolean\r\n isTablet: boolean\r\n isDesktop: boolean\r\n isLarge: boolean\r\n} {\r\n const isMobile = useMediaQuery('(max-width: 640px)')\r\n const isTablet = useMediaQuery('(min-width: 641px) and (max-width: 1024px)')\r\n const isDesktop = useMediaQuery('(min-width: 1025px) and (max-width: 1280px)')\r\n const isLarge = useMediaQuery('(min-width: 1281px)')\r\n\r\n return {\r\n isMobile,\r\n isTablet,\r\n isDesktop,\r\n isLarge,\r\n }\r\n}\r\n","'use client'\r\n\r\nimport { useEffect, RefObject } from 'react'\r\n\r\n/**\r\n * useClickOutside\r\n * Hook to detect clicks outside a referenced element\r\n */\r\nexport function useClickOutside<T extends HTMLElement = HTMLElement>(\r\n ref: RefObject<T>,\r\n handler: (event: MouseEvent | TouchEvent) => void\r\n): void {\r\n useEffect(() => {\r\n const listener = (event: MouseEvent | TouchEvent) => {\r\n const el = ref?.current\r\n if (!el || el.contains(event.target as Node)) {\r\n return\r\n }\r\n handler(event)\r\n }\r\n\r\n document.addEventListener('mousedown', listener)\r\n document.addEventListener('touchstart', listener)\r\n\r\n return () => {\r\n document.removeEventListener('mousedown', listener)\r\n document.removeEventListener('touchstart', listener)\r\n }\r\n }, [ref, handler])\r\n}\r\n","'use client'\r\n\r\nimport { useState, useEffect } from 'react'\r\n\r\n/**\r\n * useDebounce\r\n * Hook to debounce a value\r\n */\r\nexport function useDebounce<T>(value: T, delay: number = 300): T {\r\n const [debouncedValue, setDebouncedValue] = useState<T>(value)\r\n\r\n useEffect(() => {\r\n const handler = setTimeout(() => {\r\n setDebouncedValue(value)\r\n }, delay)\r\n\r\n return () => {\r\n clearTimeout(handler)\r\n }\r\n }, [value, delay])\r\n\r\n return debouncedValue\r\n}\r\n","'use client'\r\n\r\nimport { useState, useEffect } from 'react'\r\n\r\n/**\r\n * usePrefersReducedMotion\r\n * Hook to detect user's preference for reduced motion\r\n * Respects prefers-reduced-motion media query for accessibility\r\n * \r\n * @returns boolean - true if user prefers reduced motion\r\n * \r\n * @example\r\n * ```tsx\r\n * const prefersReducedMotion = usePrefersReducedMotion()\r\n * const animationDuration = prefersReducedMotion ? 0 : 200\r\n * ```\r\n */\r\nexport function usePrefersReducedMotion(): boolean {\r\n const [prefersReducedMotion, setPrefersReducedMotion] = useState<boolean>(false)\r\n\r\n useEffect(() => {\r\n if (typeof window === 'undefined') return\r\n\r\n const mediaQuery = window.matchMedia('(prefers-reduced-motion: reduce)')\r\n setPrefersReducedMotion(mediaQuery.matches)\r\n\r\n const handler = (event: MediaQueryListEvent) => {\r\n setPrefersReducedMotion(event.matches)\r\n }\r\n\r\n if (mediaQuery.addEventListener) {\r\n mediaQuery.addEventListener('change', handler)\r\n return () => mediaQuery.removeEventListener('change', handler)\r\n } else {\r\n mediaQuery.addListener(handler)\r\n return () => mediaQuery.removeListener(handler)\r\n }\r\n }, [])\r\n\r\n return prefersReducedMotion\r\n}\r\n","'use client'\r\n\r\nimport { useState, useEffect, useRef } from 'react'\r\nimport { usePrefersReducedMotion } from './use-prefers-reduced-motion'\r\n\r\nexport type TransitionState = 'entering' | 'entered' | 'exiting' | 'exited'\r\n\r\nexport interface UseTransitionStateOptions {\r\n /**\r\n * Duration of enter transition in milliseconds\r\n * @default 200\r\n */\r\n enterDuration?: number\r\n /**\r\n * Duration of exit transition in milliseconds\r\n * @default 150\r\n */\r\n exitDuration?: number\r\n /**\r\n * Whether to mount the component initially\r\n * @default false\r\n */\r\n initialMount?: boolean\r\n /**\r\n * Whether to respect prefers-reduced-motion\r\n * @default true\r\n */\r\n respectReducedMotion?: boolean\r\n}\r\n\r\n/**\r\n * useTransitionState\r\n * Hook to manage enter/exit transition states for components\r\n * Useful for modals, dropdowns, tooltips, and other animated components\r\n * \r\n * @param isOpen - Whether the component should be visible\r\n * @param options - Transition configuration options\r\n * @returns Object with transition state and control functions\r\n * \r\n * @example\r\n * ```tsx\r\n * const { state, shouldMount, endTransition } = useTransitionState(isOpen)\r\n * \r\n * return shouldMount && (\r\n * <div className={state === 'entered' ? 'opacity-100' : 'opacity-0'}>\r\n * Content\r\n * </div>\r\n * )\r\n * ```\r\n */\r\nexport function useTransitionState(\r\n isOpen: boolean,\r\n options: UseTransitionStateOptions = {}\r\n): {\r\n state: TransitionState\r\n shouldMount: boolean\r\n endTransition: () => void\r\n} {\r\n const {\r\n enterDuration = 200,\r\n exitDuration = 150,\r\n initialMount = false,\r\n respectReducedMotion = true,\r\n } = options\r\n\r\n const prefersReducedMotion = usePrefersReducedMotion()\r\n const [state, setState] = useState<TransitionState>(\r\n initialMount ? (isOpen ? 'entered' : 'exited') : 'exited'\r\n )\r\n const [shouldMount, setShouldMount] = useState(initialMount || isOpen)\r\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null)\r\n\r\n useEffect(() => {\r\n // Clear any pending timeouts\r\n if (timeoutRef.current) {\r\n clearTimeout(timeoutRef.current)\r\n timeoutRef.current = null\r\n }\r\n\r\n const effectiveEnterDuration = respectReducedMotion && prefersReducedMotion ? 0 : enterDuration\r\n const effectiveExitDuration = respectReducedMotion && prefersReducedMotion ? 0 : exitDuration\r\n\r\n if (isOpen) {\r\n // Opening: mount immediately, then enter\r\n setShouldMount(true)\r\n // Use requestAnimationFrame to ensure DOM is ready\r\n requestAnimationFrame(() => {\r\n setState('entering')\r\n timeoutRef.current = setTimeout(() => {\r\n setState('entered')\r\n }, effectiveEnterDuration)\r\n })\r\n } else {\r\n // Closing: exit, then unmount\r\n if (shouldMount) {\r\n setState('exiting')\r\n timeoutRef.current = setTimeout(() => {\r\n setState('exited')\r\n setShouldMount(false)\r\n }, effectiveExitDuration)\r\n }\r\n }\r\n\r\n return () => {\r\n if (timeoutRef.current) {\r\n clearTimeout(timeoutRef.current)\r\n }\r\n }\r\n }, [isOpen, enterDuration, exitDuration, shouldMount, prefersReducedMotion, respectReducedMotion])\r\n\r\n const endTransition = () => {\r\n if (timeoutRef.current) {\r\n clearTimeout(timeoutRef.current)\r\n timeoutRef.current = null\r\n }\r\n if (isOpen) {\r\n setState('entered')\r\n } else {\r\n setState('exited')\r\n setShouldMount(false)\r\n }\r\n }\r\n\r\n return { state, shouldMount, endTransition }\r\n}\r\n","'use client'\r\n\r\nimport { useEffect, useRef } from 'react'\r\n\r\n/**\r\n * useFocusTrap\r\n * Hook to trap focus within a container element\r\n * Useful for modals, dialogs, and other overlay components\r\n * \r\n * @param isActive - Whether the focus trap should be active\r\n * @param containerRef - Ref to the container element\r\n * @param options - Configuration options\r\n * \r\n * @example\r\n * ```tsx\r\n * const containerRef = useRef<HTMLDivElement>(null)\r\n * useFocusTrap(isOpen, containerRef)\r\n * \r\n * return (\r\n * <div ref={containerRef}>\r\n * <button>First</button>\r\n * <button>Last</button>\r\n * </div>\r\n * )\r\n * ```\r\n */\r\nexport function useFocusTrap(\r\n isActive: boolean,\r\n containerRef: React.RefObject<HTMLElement>,\r\n options: {\r\n /**\r\n * Whether to return focus to the previously focused element on deactivate\r\n * @default true\r\n */\r\n returnFocus?: boolean\r\n /**\r\n * Initial element to focus when trap activates\r\n * @default first focusable element\r\n */\r\n initialFocus?: HTMLElement | null\r\n } = {}\r\n): void {\r\n const { returnFocus = true, initialFocus = null } = options\r\n const previousActiveElementRef = useRef<HTMLElement | null>(null)\r\n\r\n useEffect(() => {\r\n if (!isActive || !containerRef.current) return\r\n\r\n const container = containerRef.current\r\n\r\n // Store the previously focused element\r\n if (returnFocus && document.activeElement instanceof HTMLElement) {\r\n previousActiveElementRef.current = document.activeElement\r\n }\r\n\r\n // Get all focusable elements within the container\r\n const getFocusableElements = (): HTMLElement[] => {\r\n const selector = [\r\n 'a[href]',\r\n 'button:not([disabled])',\r\n 'textarea:not([disabled])',\r\n 'input:not([disabled])',\r\n 'select:not([disabled])',\r\n '[tabindex]:not([tabindex=\"-1\"])',\r\n ].join(', ')\r\n\r\n return Array.from(container.querySelectorAll<HTMLElement>(selector)).filter(\r\n (el) => {\r\n // Filter out hidden elements\r\n const style = window.getComputedStyle(el)\r\n return style.display !== 'none' && style.visibility !== 'hidden'\r\n }\r\n )\r\n }\r\n\r\n const focusableElements = getFocusableElements()\r\n if (focusableElements.length === 0) return\r\n\r\n // Focus initial element or first focusable element\r\n const elementToFocus = initialFocus || focusableElements[0]\r\n if (elementToFocus) {\r\n elementToFocus.focus()\r\n }\r\n\r\n const handleKeyDown = (event: KeyboardEvent) => {\r\n if (event.key !== 'Tab') return\r\n\r\n const firstElement = focusableElements[0]\r\n const lastElement = focusableElements[focusableElements.length - 1]\r\n\r\n if (event.shiftKey) {\r\n // Shift + Tab: focus previous element\r\n if (document.activeElement === firstElement) {\r\n event.preventDefault()\r\n lastElement.focus()\r\n }\r\n } else {\r\n // Tab: focus next element\r\n if (document.activeElement === lastElement) {\r\n event.preventDefault()\r\n firstElement.focus()\r\n }\r\n }\r\n }\r\n\r\n // Prevent focus from escaping the container\r\n const handleFocusIn = (event: FocusEvent) => {\r\n const target = event.target as HTMLElement\r\n if (!container.contains(target)) {\r\n event.preventDefault()\r\n const firstElement = focusableElements[0]\r\n if (firstElement) {\r\n firstElement.focus()\r\n }\r\n }\r\n }\r\n\r\n container.addEventListener('keydown', handleKeyDown)\r\n container.addEventListener('focusin', handleFocusIn)\r\n\r\n return () => {\r\n container.removeEventListener('keydown', handleKeyDown)\r\n container.removeEventListener('focusin', handleFocusIn)\r\n\r\n // Return focus to the previously focused element\r\n if (returnFocus && previousActiveElementRef.current) {\r\n previousActiveElementRef.current.focus()\r\n previousActiveElementRef.current = null\r\n }\r\n }\r\n }, [isActive, containerRef, returnFocus, initialFocus])\r\n}\r\n","'use client'\r\n\r\nimport { useEffect, useRef } from 'react'\r\n\r\n/**\r\n * useFocusReturn\r\n * Hook to return focus to a previously focused element\r\n * Useful for modals, dropdowns, and other overlay components that close\r\n * \r\n * @param shouldReturn - Whether to return focus (typically when component closes)\r\n * @param fallbackElement - Element to focus if previous element is not available\r\n * \r\n * @example\r\n * ```tsx\r\n * const [isOpen, setIsOpen] = useState(false)\r\n * const triggerRef = useRef<HTMLButtonElement>(null)\r\n * \r\n * useFocusReturn(!isOpen, triggerRef.current)\r\n * \r\n * return (\r\n * <>\r\n * <button ref={triggerRef} onClick={() => setIsOpen(true)}>Open</button>\r\n * {isOpen && <Modal onClose={() => setIsOpen(false)} />}\r\n * </>\r\n * )\r\n * ```\r\n */\r\nexport function useFocusReturn(\r\n shouldReturn: boolean,\r\n fallbackElement?: HTMLElement | null\r\n): void {\r\n const previousActiveElementRef = useRef<HTMLElement | null>(null)\r\n\r\n useEffect(() => {\r\n if (shouldReturn) {\r\n // Store the currently focused element before it changes\r\n if (document.activeElement instanceof HTMLElement) {\r\n previousActiveElementRef.current = document.activeElement\r\n }\r\n } else {\r\n // Return focus when component closes\r\n const elementToFocus = previousActiveElementRef.current || fallbackElement\r\n\r\n if (elementToFocus) {\r\n // Use requestAnimationFrame to ensure DOM is ready\r\n requestAnimationFrame(() => {\r\n if (elementToFocus && document.body.contains(elementToFocus)) {\r\n elementToFocus.focus()\r\n } else if (fallbackElement && document.body.contains(fallbackElement)) {\r\n fallbackElement.focus()\r\n }\r\n })\r\n }\r\n\r\n previousActiveElementRef.current = null\r\n }\r\n }, [shouldReturn, fallbackElement])\r\n}\r\n","'use client'\r\n\r\nimport { useState, useCallback, useRef, useEffect } from 'react'\r\n\r\nexport type AsyncState<T> =\r\n | { status: 'idle' }\r\n | { status: 'loading' }\r\n | { status: 'success'; data: T }\r\n | { status: 'error'; error: Error }\r\n\r\nexport interface UseAsyncStateOptions<T> {\r\n /**\r\n * Initial data value\r\n */\r\n initialData?: T\r\n /**\r\n * Whether to reset state when component unmounts\r\n * @default false\r\n */\r\n resetOnUnmount?: boolean\r\n /**\r\n * Callback when async operation succeeds\r\n */\r\n onSuccess?: (data: T) => void\r\n /**\r\n * Callback when async operation fails\r\n */\r\n onError?: (error: Error) => void\r\n}\r\n\r\n/**\r\n * useAsyncState\r\n * Hook to manage async operation state (loading, success, error)\r\n * Useful for API calls, form submissions, and other async operations\r\n * \r\n * @param options - Configuration options\r\n * @returns Object with state and control functions\r\n * \r\n * @example\r\n * ```tsx\r\n * const { state, execute, reset } = useAsyncState()\r\n * \r\n * const handleSubmit = async () => {\r\n * execute(async () => {\r\n * const data = await api.createUser(formData)\r\n * return data\r\n * })\r\n * }\r\n * \r\n * return (\r\n * <div>\r\n * {state.status === 'loading' && <Spinner />}\r\n * {state.status === 'error' && <Error message={state.error.message} />}\r\n * {state.status === 'success' && <Success data={state.data} />}\r\n * </div>\r\n * )\r\n * ```\r\n */\r\nexport function useAsyncState<T = unknown>(\r\n options: UseAsyncStateOptions<T> = {}\r\n): {\r\n state: AsyncState<T>\r\n execute: (asyncFn: () => Promise<T>) => Promise<T | undefined>\r\n reset: () => void\r\n setData: (data: T) => void\r\n setError: (error: Error) => void\r\n} {\r\n const {\r\n initialData,\r\n resetOnUnmount = false,\r\n onSuccess,\r\n onError,\r\n } = options\r\n\r\n const [state, setState] = useState<AsyncState<T>>(\r\n initialData !== undefined ? { status: 'success', data: initialData } : { status: 'idle' }\r\n )\r\n const isMountedRef = useRef(true)\r\n\r\n useEffect(() => {\r\n isMountedRef.current = true\r\n return () => {\r\n isMountedRef.current = false\r\n if (resetOnUnmount) {\r\n setState(initialData !== undefined ? { status: 'success', data: initialData } : { status: 'idle' })\r\n }\r\n }\r\n }, [resetOnUnmount, initialData])\r\n\r\n const execute = useCallback(\r\n async (asyncFn: () => Promise<T>): Promise<T | undefined> => {\r\n if (!isMountedRef.current) return undefined\r\n\r\n setState({ status: 'loading' })\r\n\r\n try {\r\n const data = await asyncFn()\r\n if (!isMountedRef.current) return undefined\r\n\r\n setState({ status: 'success', data })\r\n onSuccess?.(data)\r\n return data\r\n } catch (error) {\r\n if (!isMountedRef.current) return undefined\r\n\r\n const err = error instanceof Error ? error : new Error(String(error))\r\n setState({ status: 'error', error: err })\r\n onError?.(err)\r\n throw err\r\n }\r\n },\r\n [onSuccess, onError]\r\n )\r\n\r\n const reset = useCallback(() => {\r\n setState(initialData !== undefined ? { status: 'success', data: initialData } : { status: 'idle' })\r\n }, [initialData])\r\n\r\n const setData = useCallback((data: T) => {\r\n setState({ status: 'success', data })\r\n }, [])\r\n\r\n const setError = useCallback((error: Error) => {\r\n setState({ status: 'error', error })\r\n }, [])\r\n\r\n return { state, execute, reset, setData, setError }\r\n}\r\n","'use client'\r\n\r\nimport { useState, useCallback } from 'react'\r\n\r\n/**\r\n * useToggle\r\n * Hook to manage boolean state with toggle, setTrue, and setFalse functions\r\n * Useful for modals, dropdowns, checkboxes, and other boolean states\r\n * \r\n * @param initialValue - Initial boolean value\r\n * @returns Object with value and control functions\r\n * \r\n * @example\r\n * ```tsx\r\n * const { value: isOpen, toggle, setTrue, setFalse } = useToggle(false)\r\n * \r\n * return (\r\n * <>\r\n * <button onClick={toggle}>Toggle</button>\r\n * <button onClick={setTrue}>Open</button>\r\n * <button onClick={setFalse}>Close</button>\r\n * {isOpen && <Modal />}\r\n * </>\r\n * )\r\n * ```\r\n */\r\nexport function useToggle(initialValue: boolean = false): {\r\n value: boolean\r\n toggle: () => void\r\n setTrue: () => void\r\n setFalse: () => void\r\n setValue: (value: boolean) => void\r\n} {\r\n const [value, setValue] = useState(initialValue)\r\n\r\n const toggle = useCallback(() => {\r\n setValue((prev) => !prev)\r\n }, [])\r\n\r\n const setTrue = useCallback(() => {\r\n setValue(true)\r\n }, [])\r\n\r\n const setFalse = useCallback(() => {\r\n setValue(false)\r\n }, [])\r\n\r\n return {\r\n value,\r\n toggle,\r\n setTrue,\r\n setFalse,\r\n setValue,\r\n }\r\n}\r\n","'use client'\r\n\r\nimport { useState, useCallback } from 'react'\r\n\r\nexport interface UseCounterOptions {\r\n /**\r\n * Initial counter value\r\n * @default 0\r\n */\r\n initialValue?: number\r\n /**\r\n * Minimum value (inclusive)\r\n */\r\n min?: number\r\n /**\r\n * Maximum value (inclusive)\r\n */\r\n max?: number\r\n /**\r\n * Step value for increment/decrement\r\n * @default 1\r\n */\r\n step?: number\r\n}\r\n\r\n/**\r\n * useCounter\r\n * Hook to manage numeric counter state with increment, decrement, and reset functions\r\n * Useful for quantity selectors, pagination, and other numeric inputs\r\n * \r\n * @param options - Configuration options\r\n * @returns Object with value and control functions\r\n * \r\n * @example\r\n * ```tsx\r\n * const { value, increment, decrement, reset, setValue } = useCounter({\r\n * initialValue: 0,\r\n * min: 0,\r\n * max: 10,\r\n * step: 1\r\n * })\r\n * \r\n * return (\r\n * <div>\r\n * <button onClick={decrement}>-</button>\r\n * <span>{value}</span>\r\n * <button onClick={increment}>+</button>\r\n * </div>\r\n * )\r\n * ```\r\n */\r\nexport function useCounter(options: UseCounterOptions = {}): {\r\n value: number\r\n increment: () => void\r\n decrement: () => void\r\n reset: () => void\r\n setValue: (value: number) => void\r\n} {\r\n const {\r\n initialValue = 0,\r\n min,\r\n max,\r\n step = 1,\r\n } = options\r\n\r\n const [value, setValue] = useState(initialValue)\r\n\r\n const increment = useCallback(() => {\r\n setValue((prev) => {\r\n const next = prev + step\r\n return max !== undefined ? Math.min(next, max) : next\r\n })\r\n }, [step, max])\r\n\r\n const decrement = useCallback(() => {\r\n setValue((prev) => {\r\n const next = prev - step\r\n return min !== undefined ? Math.max(next, min) : next\r\n })\r\n }, [step, min])\r\n\r\n const reset = useCallback(() => {\r\n setValue(initialValue)\r\n }, [initialValue])\r\n\r\n const setValueWithBounds = useCallback(\r\n (newValue: number) => {\r\n let boundedValue = newValue\r\n if (min !== undefined) {\r\n boundedValue = Math.max(boundedValue, min)\r\n }\r\n if (max !== undefined) {\r\n boundedValue = Math.min(boundedValue, max)\r\n }\r\n setValue(boundedValue)\r\n },\r\n [min, max]\r\n )\r\n\r\n return {\r\n value,\r\n increment,\r\n decrement,\r\n reset,\r\n setValue: setValueWithBounds,\r\n }\r\n}\r\n","'use client'\r\n\r\nimport { useEffect, useRef } from 'react'\r\nimport { announceToScreenReader } from '../lib/a11y-utils'\r\n\r\n/**\r\n * useAriaLive\r\n * Hook to manage ARIA live region for screen reader announcements\r\n * Creates a persistent live region element\r\n * \r\n * @param priority - Priority level ('polite' or 'assertive')\r\n * @returns Function to announce messages\r\n * \r\n * @example\r\n * ```tsx\r\n * const announce = useAriaLive('polite')\r\n * \r\n * useEffect(() => {\r\n * if (success) {\r\n * announce('Operation completed successfully')\r\n * }\r\n * }, [success, announce])\r\n * ```\r\n */\r\nexport function useAriaLive(priority: 'polite' | 'assertive' = 'polite'): (message: string) => void {\r\n const liveRegionRef = useRef<HTMLDivElement | null>(null)\r\n\r\n useEffect(() => {\r\n if (typeof window === 'undefined') return\r\n\r\n // Create live region element\r\n const liveRegion = document.createElement('div')\r\n liveRegion.setAttribute('role', 'status')\r\n liveRegion.setAttribute('aria-live', priority)\r\n liveRegion.setAttribute('aria-atomic', 'true')\r\n liveRegion.className = 'sr-only'\r\n liveRegion.style.cssText = `\r\n position: absolute;\r\n width: 1px;\r\n height: 1px;\r\n padding: 0;\r\n margin: -1px;\r\n overflow: hidden;\r\n clip: rect(0, 0, 0, 0);\r\n white-space: nowrap;\r\n border-width: 0;\r\n `\r\n\r\n document.body.appendChild(liveRegion)\r\n liveRegionRef.current = liveRegion\r\n\r\n return () => {\r\n if (liveRegionRef.current && document.body.contains(liveRegionRef.current)) {\r\n document.body.removeChild(liveRegionRef.current)\r\n }\r\n }\r\n }, [priority])\r\n\r\n const announce = (message: string) => {\r\n if (liveRegionRef.current) {\r\n // Clear and set new message to trigger announcement\r\n liveRegionRef.current.textContent = ''\r\n setTimeout(() => {\r\n if (liveRegionRef.current) {\r\n liveRegionRef.current.textContent = message\r\n }\r\n }, 100)\r\n } else {\r\n // Fallback to one-time announcement\r\n announceToScreenReader(message, priority)\r\n }\r\n }\r\n\r\n return announce\r\n}\r\n","'use client'\r\n\r\nimport { useRef, useCallback } from 'react'\r\n\r\n/**\r\n * useThrottle\r\n * Hook to throttle a callback function\r\n * Useful for scroll handlers, resize handlers, and other frequent events\r\n * \r\n * @param callback - Function to throttle\r\n * @param delay - Throttle delay in milliseconds\r\n * @returns Throttled callback function\r\n * \r\n * @example\r\n * ```tsx\r\n * const throttledScroll = useThrottle((event) => {\r\n * console.log('Scroll position:', window.scrollY)\r\n * }, 100)\r\n * \r\n * useEffect(() => {\r\n * window.addEventListener('scroll', throttledScroll)\r\n * return () => window.removeEventListener('scroll', throttledScroll)\r\n * }, [throttledScroll])\r\n * ```\r\n */\r\nexport function useThrottle<T extends (...args: any[]) => any>(\r\n callback: T,\r\n delay: number\r\n): T {\r\n const lastRunRef = useRef<number>(0)\r\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null)\r\n\r\n const throttledCallback = useCallback(\r\n ((...args: Parameters<T>) => {\r\n const now = Date.now()\r\n const timeSinceLastRun = now - lastRunRef.current\r\n\r\n if (timeSinceLastRun >= delay) {\r\n // Enough time has passed, execute immediately\r\n lastRunRef.current = now\r\n callback(...args)\r\n } else {\r\n // Schedule execution for the remaining time\r\n if (timeoutRef.current) {\r\n clearTimeout(timeoutRef.current)\r\n }\r\n timeoutRef.current = setTimeout(() => {\r\n lastRunRef.current = Date.now()\r\n callback(...args)\r\n }, delay - timeSinceLastRun)\r\n }\r\n }) as T,\r\n [callback, delay]\r\n )\r\n\r\n return throttledCallback\r\n}\r\n","'use client'\r\n\r\nimport { useState, useCallback, useRef } from 'react'\r\nimport type { ValidationRule } from '../lib/validation-patterns'\r\n\r\nexport interface FieldValidation<T = unknown> {\r\n value: T\r\n error?: string\r\n touched: boolean\r\n rules?: ValidationRule<any>[]\r\n}\r\n\r\nexport interface UseFormValidationOptions {\r\n /**\r\n * Whether to validate on change (in addition to blur)\r\n * @default false\r\n */\r\n validateOnChange?: boolean\r\n /**\r\n * Whether to validate on blur\r\n * @default true\r\n */\r\n validateOnBlur?: boolean\r\n}\r\n\r\n/**\r\n * useFormValidation\r\n * Hook to manage form field validation\r\n * Provides validation state and handlers for form fields\r\n * \r\n * @param options - Validation options\r\n * @returns Object with validation state and handlers\r\n * \r\n * @example\r\n * ```tsx\r\n * const { fields, setFieldValue, setFieldError, validateField, validateForm } = useFormValidation()\r\n * \r\n * const handleSubmit = () => {\r\n * if (validateForm()) {\r\n * // Form is valid, submit\r\n * }\r\n * }\r\n * \r\n * return (\r\n * <form onSubmit={handleSubmit}>\r\n * <input\r\n * value={fields.email?.value || ''}\r\n * onChange={(e) => setFieldValue('email', e.target.value, [required, email])}\r\n * onBlur={() => validateField('email')}\r\n * />\r\n * {fields.email?.error && <span>{fields.email.error}</span>}\r\n * </form>\r\n * )\r\n * ```\r\n */\r\nexport function useFormValidation(\r\n options: UseFormValidationOptions = {}\r\n): {\r\n fields: Record<string, FieldValidation>\r\n setFieldValue: <T>(\r\n name: string,\r\n value: T,\r\n rules?: ValidationRule<T>[]\r\n ) => void\r\n setFieldError: (name: string, error: string | undefined) => void\r\n validateField: (name: string) => boolean\r\n validateForm: () => boolean\r\n resetField: (name: string) => void\r\n resetForm: () => void\r\n getFieldValue: <T>(name: string) => T | undefined\r\n} {\r\n const { validateOnChange = false, validateOnBlur = true } = options\r\n const [fields, setFields] = useState<Record<string, FieldValidation>>({})\r\n const validationRulesRef = useRef<Record<string, ValidationRule<any>[]>>({})\r\n\r\n const validateField = useCallback((name: string): boolean => {\r\n const field = fields[name]\r\n if (!field) return true\r\n\r\n const rules = validationRulesRef.current[name] || field.rules || []\r\n if (rules.length === 0) return true\r\n\r\n for (const rule of rules) {\r\n const error = rule(field.value)\r\n if (error) {\r\n setFields((prev) => ({\r\n ...prev,\r\n [name]: { ...prev[name], error, touched: true },\r\n }))\r\n return false\r\n }\r\n }\r\n\r\n // No errors\r\n setFields((prev) => ({\r\n ...prev,\r\n [name]: { ...prev[name], error: undefined, touched: true },\r\n }))\r\n return true\r\n }, [fields])\r\n\r\n const setFieldValue = useCallback(\r\n <T,>(name: string, value: T, rules?: ValidationRule<T>[]) => {\r\n setFields((prev) => {\r\n const existingField = prev[name]\r\n const newField: FieldValidation = {\r\n value,\r\n touched: existingField?.touched || false,\r\n error: existingField?.error,\r\n rules: rules as ValidationRule<any>[] | undefined,\r\n }\r\n\r\n // Store rules for validation\r\n if (rules) {\r\n validationRulesRef.current[name] = rules as ValidationRule<any>[]\r\n }\r\n\r\n // Validate on change if enabled\r\n if (validateOnChange && (existingField?.touched || false)) {\r\n const validationRules = (rules as ValidationRule<any>[] | undefined) || validationRulesRef.current[name] || []\r\n for (const rule of validationRules) {\r\n const error = rule(value)\r\n if (error) {\r\n newField.error = error\r\n return { ...prev, [name]: newField }\r\n }\r\n }\r\n newField.error = undefined\r\n }\r\n\r\n return { ...prev, [name]: newField }\r\n })\r\n },\r\n [validateOnChange]\r\n )\r\n\r\n const setFieldError = useCallback((name: string, error: string | undefined) => {\r\n setFields((prev) => {\r\n const field = prev[name]\r\n if (!field) return prev\r\n return {\r\n ...prev,\r\n [name]: { ...field, error, touched: true },\r\n }\r\n })\r\n }, [])\r\n\r\n const validateForm = useCallback((): boolean => {\r\n let isValid = true\r\n const fieldNames = Object.keys(fields)\r\n\r\n for (const name of fieldNames) {\r\n const fieldValid = validateField(name)\r\n if (!fieldValid) {\r\n isValid = false\r\n }\r\n }\r\n\r\n return isValid\r\n }, [fields, validateField])\r\n\r\n const resetField = useCallback((name: string) => {\r\n setFields((prev) => {\r\n const { [name]: _, ...rest } = prev\r\n return rest\r\n })\r\n delete validationRulesRef.current[name]\r\n }, [])\r\n\r\n const resetForm = useCallback(() => {\r\n setFields({})\r\n validationRulesRef.current = {}\r\n }, [])\r\n\r\n const getFieldValue = useCallback(<T,>(name: string): T | undefined => {\r\n return fields[name]?.value as T | undefined\r\n }, [fields])\r\n\r\n // Handle blur validation\r\n const handleBlur = useCallback(\r\n (name: string) => {\r\n if (validateOnBlur) {\r\n validateField(name)\r\n } else {\r\n // Mark as touched even if not validating\r\n setFields((prev) => {\r\n const field = prev[name]\r\n if (!field) return prev\r\n return {\r\n ...prev,\r\n [name]: { ...field, touched: true },\r\n }\r\n })\r\n }\r\n },\r\n [validateOnBlur, validateField]\r\n )\r\n\r\n return {\r\n fields,\r\n setFieldValue,\r\n setFieldError,\r\n validateField,\r\n validateForm,\r\n resetField,\r\n resetForm,\r\n getFieldValue,\r\n }\r\n}\r\n","\"use client\"\r\n\r\nimport React from 'react'\r\nimport { useTheme } from 'next-themes'\r\nimport { baseColors } from './constants'\r\nimport { colorThemes } from './theme-data'\r\nimport {\r\n resetTheme,\r\n applyThemePreset,\r\n applyImportedTheme,\r\n applyCustomThemeArtifact,\r\n applyRadius,\r\n handleColorChange as applyColorChange,\r\n} from './apply-theme'\r\nimport type { ThemePreset, ImportedTheme, CustomThemeArtifactV1, CustomThemeLayoutOverrides } from './types'\r\nimport { getStoredTheme, storeTheme, getStoredCustomTheme, storeCustomTheme } from './utils/persistence'\r\nimport { debounce } from './utils/debounce'\r\nimport { validateImportedTheme, validateCustomThemeArtifact } from './utils/validation'\r\nimport { themePresets } from './presets'\r\nimport { applyHSLToThemeStyles } from './utils/hsl-transform'\r\nimport { THEME_VAR_KEYS } from './apply-theme'\r\n\r\ntype LastAppliedTheme =\r\n | { kind: 'preset'; themeValue: string }\r\n | { kind: 'imported'; theme: ImportedTheme }\r\n | { kind: 'custom'; theme: CustomThemeArtifactV1; value: string }\r\n | null\r\n\r\nexport function useThemeManager() {\r\n const { theme, setTheme } = useTheme()\r\n const [brandColorsValues, setBrandColorsValues] = React.useState<Record<string, string>>({})\r\n const [currentThemeValue, setCurrentThemeValue] = React.useState<string | null>(null)\r\n const [error, setError] = React.useState<string | null>(null)\r\n const [lastApplied, setLastApplied] = React.useState<LastAppliedTheme>(null)\r\n const [customTheme, setCustomTheme] = React.useState<CustomThemeArtifactV1 | null>(null)\r\n const [customThemeValue, setCustomThemeValue] = React.useState<string | null>(null)\r\n\r\n // Simple, reliable theme detection - just follow the theme provider\r\n const isDarkMode = React.useMemo(() => {\r\n if (theme === \"dark\") return true\r\n if (theme === \"light\") return false\r\n return typeof window !== \"undefined\" && window.matchMedia(\"(prefers-color-scheme: dark)\").matches\r\n }, [theme])\r\n\r\n const updateBrandColorsFromTheme = React.useCallback((styles: Record<string, string>) => {\r\n const newValues: Record<string, string> = {}\r\n baseColors.forEach(color => {\r\n const cssVar = color.cssVar.replace('--', '')\r\n if (styles[cssVar]) {\r\n newValues[color.cssVar] = styles[cssVar]\r\n }\r\n })\r\n setBrandColorsValues(newValues)\r\n }, [])\r\n\r\n // Load persisted theme on mount\r\n React.useEffect(() => {\r\n try {\r\n const storedTheme = getStoredTheme()\r\n const storedCustom = getStoredCustomTheme()\r\n if (storedCustom) {\r\n const customValidation = validateCustomThemeArtifact(storedCustom)\r\n if (customValidation.isValid) {\r\n const ct = storedCustom as CustomThemeArtifactV1\r\n setCustomTheme(ct)\r\n setCustomThemeValue(`custom:${ct.name.toLowerCase().replace(/\\s+/g, '-')}`)\r\n }\r\n }\r\n \r\n if (storedTheme) {\r\n setCurrentThemeValue(storedTheme)\r\n // Apply theme if it's valid (preset or custom)\r\n if (storedTheme.startsWith('custom:') && storedCustom) {\r\n const customValidation = validateCustomThemeArtifact(storedCustom)\r\n if (customValidation.isValid) {\r\n applyCustomThemeArtifact(storedCustom as CustomThemeArtifactV1, isDarkMode)\r\n setLastApplied({ kind: 'custom', theme: storedCustom as CustomThemeArtifactV1, value: storedTheme })\r\n }\r\n } else {\r\n const themeObj = colorThemes.find(t => t.value === storedTheme)\r\n if (themeObj) {\r\n applyThemePreset(themeObj.preset, isDarkMode)\r\n updateBrandColorsFromTheme(isDarkMode ? themeObj.preset.styles.dark : themeObj.preset.styles.light)\r\n setLastApplied({ kind: 'preset', themeValue: storedTheme })\r\n }\r\n }\r\n }\r\n } catch (err) {\r\n console.warn('Failed to load persisted theme:', err)\r\n setError('Failed to load saved theme preferences')\r\n }\r\n }, [isDarkMode, updateBrandColorsFromTheme])\r\n\r\n // Debounced theme application for rapid changes\r\n const debouncedApplyTheme = React.useMemo(\r\n () => debounce((themeValue: string, darkMode: boolean) => {\r\n try {\r\n if (themeValue.startsWith('custom:')) {\r\n if (!customTheme) {\r\n setError('Custom theme not found')\r\n return\r\n }\r\n applyCustomThemeArtifact(customTheme, darkMode)\r\n updateBrandColorsFromTheme(darkMode ? customTheme.base.type === 'preset'\r\n ? (themePresets[customTheme.base.value]?.styles.dark ?? themePresets.default.styles.dark)\r\n : customTheme.base.theme.dark\r\n : customTheme.base.type === 'preset'\r\n ? (themePresets[customTheme.base.value]?.styles.light ?? themePresets.default.styles.light)\r\n : customTheme.base.theme.light)\r\n setCurrentThemeValue(themeValue)\r\n setLastApplied({ kind: 'custom', theme: customTheme, value: themeValue })\r\n storeTheme(themeValue)\r\n setError(null)\r\n return\r\n }\r\n\r\n const theme = colorThemes.find(t => t.value === themeValue)\r\n if (!theme) {\r\n setError(`Theme \"${themeValue}\" not found`)\r\n return\r\n }\r\n\r\n applyThemePreset(theme.preset, darkMode)\r\n updateBrandColorsFromTheme(darkMode ? theme.preset.styles.dark : theme.preset.styles.light)\r\n setCurrentThemeValue(themeValue)\r\n setLastApplied({ kind: 'preset', themeValue })\r\n storeTheme(themeValue)\r\n setError(null)\r\n } catch (err) {\r\n console.error('Failed to apply theme:', err)\r\n setError(`Failed to apply theme: ${err instanceof Error ? err.message : 'Unknown error'}`)\r\n }\r\n }, 100),\r\n [customTheme, isDarkMode, updateBrandColorsFromTheme]\r\n )\r\n\r\n const applyTheme = React.useCallback((themeValue: string, darkMode: boolean) => {\r\n debouncedApplyTheme(themeValue, darkMode)\r\n }, [debouncedApplyTheme])\r\n\r\n const applyTweakcnTheme = React.useCallback((themePreset: ThemePreset, darkMode: boolean) => {\r\n try {\r\n applyThemePreset(themePreset, darkMode)\r\n updateBrandColorsFromTheme(darkMode ? themePreset.styles.dark : themePreset.styles.light)\r\n setError(null)\r\n } catch (err) {\r\n console.error('Failed to apply tweakcn theme:', err)\r\n setError(`Failed to apply theme: ${err instanceof Error ? err.message : 'Unknown error'}`)\r\n }\r\n }, [updateBrandColorsFromTheme])\r\n\r\n const applyImportedThemeHandler = React.useCallback((themeData: ImportedTheme, darkMode: boolean) => {\r\n try {\r\n // Validate imported theme\r\n const validation = validateImportedTheme(themeData)\r\n if (!validation.isValid) {\r\n setError(validation.error || 'Invalid theme format')\r\n return\r\n }\r\n\r\n applyImportedTheme(themeData, darkMode)\r\n setLastApplied({ kind: 'imported', theme: themeData })\r\n \r\n // Update brand colors values for the customizer UI\r\n const themeVars = darkMode ? themeData.dark : themeData.light\r\n const newBrandColors: Record<string, string> = {}\r\n baseColors.forEach(color => {\r\n const varName = color.cssVar.replace('--', '')\r\n if (themeVars[varName]) {\r\n newBrandColors[color.cssVar] = themeVars[varName]\r\n }\r\n })\r\n setBrandColorsValues(newBrandColors)\r\n setError(null)\r\n } catch (err) {\r\n console.error('Failed to apply imported theme:', err)\r\n setError(`Failed to apply imported theme: ${err instanceof Error ? err.message : 'Unknown error'}`)\r\n }\r\n }, [])\r\n\r\n const getComputedVarsForMode = React.useCallback((dark: boolean): Record<string, string> => {\r\n if (typeof document === 'undefined') return {}\r\n const root = document.documentElement\r\n const hadDark = root.classList.contains('dark')\r\n try {\r\n if (dark) root.classList.add('dark')\r\n else root.classList.remove('dark')\r\n const styles = getComputedStyle(root)\r\n const out: Record<string, string> = {}\r\n THEME_VAR_KEYS.forEach((k) => {\r\n const v = styles.getPropertyValue(`--${k}`).trim()\r\n if (v) out[k] = v\r\n })\r\n // Also capture tweakcn knobs\r\n ;['hue-shift', 'saturation-mult', 'lightness-mult'].forEach((k) => {\r\n const v = styles.getPropertyValue(`--${k}`).trim()\r\n if (v) out[k] = v\r\n })\r\n return out\r\n } finally {\r\n if (hadDark) root.classList.add('dark')\r\n else root.classList.remove('dark')\r\n }\r\n }, [])\r\n\r\n const saveCustomThemeArtifactFromCurrent = React.useCallback((name = 'Custom', layout?: CustomThemeLayoutOverrides): CustomThemeArtifactV1 | null => {\r\n if (typeof document === 'undefined') return null\r\n if (!lastApplied) return null\r\n\r\n const otherKeys = new Set([\r\n 'hue-shift', 'saturation-mult', 'lightness-mult',\r\n 'spacing', 'tracking-normal',\r\n 'shadow-color', 'shadow-opacity', 'shadow-blur', 'shadow-spread', 'shadow-x', 'shadow-y',\r\n 'radius',\r\n ])\r\n\r\n const computedLight = getComputedVarsForMode(false)\r\n const computedDark = getComputedVarsForMode(true)\r\n\r\n const other: Record<string, string> = {}\r\n otherKeys.forEach((k) => {\r\n const v = computedLight[k] ?? computedDark[k]\r\n if (v) other[k] = v\r\n })\r\n\r\n const hueShift = parseFloat(other['hue-shift'] ?? '0') || 0\r\n const saturationMult = parseFloat(other['saturation-mult'] ?? '1') || 1\r\n const lightnessMult = parseFloat(other['lightness-mult'] ?? '1') || 1\r\n\r\n const resolveBaseVars = (): { light: Record<string, string>; dark: Record<string, string>; base: CustomThemeArtifactV1['base'] } => {\r\n if (lastApplied.kind === 'preset') {\r\n const preset = themePresets[lastApplied.themeValue] ?? themePresets.default\r\n return { light: preset.styles.light, dark: preset.styles.dark, base: { type: 'preset', value: lastApplied.themeValue } }\r\n }\r\n if (lastApplied.kind === 'imported') {\r\n return { light: lastApplied.theme.light, dark: lastApplied.theme.dark, base: { type: 'imported', theme: lastApplied.theme } }\r\n }\r\n if (lastApplied.kind === 'custom') {\r\n // If saving on top of custom, keep its base.\r\n const baseVars =\r\n lastApplied.theme.base.type === 'preset'\r\n ? (themePresets[lastApplied.theme.base.value]?.styles ?? themePresets.default.styles)\r\n : lastApplied.theme.base.theme\r\n return { light: baseVars.light, dark: baseVars.dark, base: lastApplied.theme.base }\r\n }\r\n return { light: themePresets.default.styles.light, dark: themePresets.default.styles.dark, base: { type: 'preset', value: 'default' } }\r\n }\r\n\r\n const { light: baseLight, dark: baseDark, base } = resolveBaseVars()\r\n\r\n const baseLightAfterHsl =\r\n hueShift !== 0 || saturationMult !== 1 || lightnessMult !== 1\r\n ? applyHSLToThemeStyles(baseLight, hueShift, saturationMult, lightnessMult)\r\n : baseLight\r\n const baseDarkAfterHsl =\r\n hueShift !== 0 || saturationMult !== 1 || lightnessMult !== 1\r\n ? applyHSLToThemeStyles(baseDark, hueShift, saturationMult, lightnessMult)\r\n : baseDark\r\n\r\n const diff = (computed: Record<string, string>, baseVars: Record<string, string>): Record<string, string> => {\r\n const out: Record<string, string> = {}\r\n for (const k of Object.keys(baseVars)) {\r\n if (otherKeys.has(k)) continue\r\n const cv = computed[k]\r\n const bv = baseVars[k]\r\n if (cv && bv && cv !== bv) out[k] = cv\r\n }\r\n return out\r\n }\r\n\r\n const overridesLight = diff(computedLight, baseLightAfterHsl)\r\n const overridesDark = diff(computedDark, baseDarkAfterHsl)\r\n\r\n const artifact: CustomThemeArtifactV1 = {\r\n version: 1,\r\n name,\r\n base,\r\n overrides: {\r\n other,\r\n light: Object.keys(overridesLight).length ? overridesLight : undefined,\r\n dark: Object.keys(overridesDark).length ? overridesDark : undefined,\r\n layout,\r\n },\r\n }\r\n\r\n storeCustomTheme(artifact)\r\n setCustomTheme(artifact)\r\n setCustomThemeValue(`custom:${name.toLowerCase().replace(/\\s+/g, '-')}`)\r\n return artifact\r\n }, [getComputedVarsForMode, lastApplied])\r\n\r\n const importCustomThemeArtifact = React.useCallback((theme: CustomThemeArtifactV1) => {\r\n try {\r\n const validation = validateCustomThemeArtifact(theme)\r\n if (!validation.isValid) {\r\n setError(validation.error || 'Invalid custom theme format')\r\n return\r\n }\r\n\r\n const value = `custom:${theme.name.toLowerCase().replace(/\\s+/g, '-')}`\r\n storeCustomTheme(theme)\r\n setCustomTheme(theme)\r\n setCustomThemeValue(value)\r\n setCurrentThemeValue(value)\r\n setLastApplied({ kind: 'custom', theme, value })\r\n storeTheme(value)\r\n\r\n applyCustomThemeArtifact(theme, isDarkMode)\r\n setError(null)\r\n } catch (err) {\r\n console.error('Failed to import custom theme artifact:', err)\r\n setError(`Failed to import custom theme: ${err instanceof Error ? err.message : 'Unknown error'}`)\r\n }\r\n }, [isDarkMode])\r\n\r\n // Debounced color change handler\r\n const debouncedColorChange = React.useMemo(\r\n () => debounce((cssVar: string, value: string) => {\r\n try {\r\n applyColorChange(cssVar, value)\r\n // Update brand colors if this is a brand color\r\n const brandColor = baseColors.find(c => c.cssVar === cssVar)\r\n if (brandColor) {\r\n setBrandColorsValues(prev => ({\r\n ...prev,\r\n [cssVar]: value\r\n }))\r\n }\r\n // If HSL adjustments changed, re-apply the last-applied theme so colors update live (tweakcn behavior).\r\n if (\r\n cssVar === '--hue-shift' ||\r\n cssVar === '--saturation-mult' ||\r\n cssVar === '--lightness-mult'\r\n ) {\r\n if (lastApplied?.kind === 'preset') {\r\n const theme = colorThemes.find((t) => t.value === lastApplied.themeValue)\r\n if (theme) {\r\n applyThemePreset(theme.preset, isDarkMode)\r\n }\r\n } else if (lastApplied?.kind === 'imported') {\r\n applyImportedTheme(lastApplied.theme, isDarkMode)\r\n } else if (lastApplied?.kind === 'custom') {\r\n applyCustomThemeArtifact(lastApplied.theme, isDarkMode)\r\n }\r\n }\r\n\r\n setError(null)\r\n } catch (err) {\r\n console.error(`Failed to change color ${cssVar}:`, err)\r\n setError(`Failed to update color: ${err instanceof Error ? err.message : 'Unknown error'}`)\r\n }\r\n }, 150),\r\n [isDarkMode, lastApplied, updateBrandColorsFromTheme]\r\n )\r\n\r\n const handleColorChange = React.useCallback((cssVar: string, value: string) => {\r\n debouncedColorChange(cssVar, value)\r\n }, [debouncedColorChange])\r\n\r\n const handleRadiusChange = React.useCallback((radius: string) => {\r\n try {\r\n applyRadius(radius)\r\n setError(null)\r\n } catch (err) {\r\n console.error('Failed to change radius:', err)\r\n setError(`Failed to update radius: ${err instanceof Error ? err.message : 'Unknown error'}`)\r\n }\r\n }, [])\r\n\r\n return {\r\n theme,\r\n setTheme,\r\n isDarkMode,\r\n brandColorsValues,\r\n setBrandColorsValues,\r\n currentThemeValue,\r\n customThemeValue,\r\n customThemeName: customTheme?.name ?? null,\r\n customThemeArtifact: customTheme,\r\n error,\r\n resetTheme,\r\n applyTheme,\r\n applyTweakcnTheme,\r\n applyImportedTheme: applyImportedThemeHandler,\r\n saveCustomThemeArtifactFromCurrent,\r\n importCustomThemeArtifact,\r\n applyRadius: handleRadiusChange,\r\n handleColorChange,\r\n updateBrandColorsFromTheme,\r\n clearError: () => setError(null)\r\n }\r\n}\r\n","/**\r\n * Design system theme constants\r\n * Radius options and brand colors for theme customizer\r\n */\r\n\r\nimport type { RadiusOption, BrandColor, SidebarVariant, SidebarCollapsibleOption, SidebarSideOption, ColorGroup } from './types'\r\n\r\n// Radius options\r\nexport const radiusOptions: RadiusOption[] = [\r\n { name: \"0\", value: \"0rem\" },\r\n { name: \"0.3\", value: \"0.3rem\" },\r\n { name: \"0.5\", value: \"0.5rem\" },\r\n { name: \"0.75\", value: \"0.75rem\" },\r\n { name: \"1.0\", value: \"1rem\" },\r\n]\r\n\r\n// Define brand colors for custom color inputs\r\nexport const baseColors: BrandColor[] = [\r\n { name: \"Primary\", cssVar: \"--primary\" },\r\n { name: \"Primary Foreground\", cssVar: \"--primary-foreground\" },\r\n { name: \"Secondary\", cssVar: \"--secondary\" },\r\n { name: \"Secondary Foreground\", cssVar: \"--secondary-foreground\" },\r\n { name: \"Accent\", cssVar: \"--accent\" },\r\n { name: \"Accent Foreground\", cssVar: \"--accent-foreground\" },\r\n { name: \"Muted\", cssVar: \"--muted\" },\r\n { name: \"Muted Foreground\", cssVar: \"--muted-foreground\" },\r\n]\r\n\r\n/** Color groups for tweakcn-style sidebar. Vars match Mindtris UI presets in presets.ts. */\r\nexport const colorGroups: ColorGroup[] = [\r\n { title: \"Primary Colors\", colors: [{ name: \"Primary\", cssVar: \"--primary\" }, { name: \"Primary Foreground\", cssVar: \"--primary-foreground\" }] },\r\n { title: \"Secondary Colors\", colors: [{ name: \"Secondary\", cssVar: \"--secondary\" }, { name: \"Secondary Foreground\", cssVar: \"--secondary-foreground\" }] },\r\n { title: \"Accent Colors\", colors: [{ name: \"Accent\", cssVar: \"--accent\" }, { name: \"Accent Foreground\", cssVar: \"--accent-foreground\" }] },\r\n { title: \"Base Colors\", colors: [{ name: \"Background\", cssVar: \"--background\" }, { name: \"Foreground\", cssVar: \"--foreground\" }] },\r\n { title: \"Card Colors\", colors: [{ name: \"Card Background\", cssVar: \"--card\" }, { name: \"Card Foreground\", cssVar: \"--card-foreground\" }] },\r\n { title: \"Popover Colors\", colors: [{ name: \"Popover Background\", cssVar: \"--popover\" }, { name: \"Popover Foreground\", cssVar: \"--popover-foreground\" }] },\r\n { title: \"Muted Colors\", colors: [{ name: \"Muted\", cssVar: \"--muted\" }, { name: \"Muted Foreground\", cssVar: \"--muted-foreground\" }] },\r\n { title: \"Destructive Colors\", colors: [{ name: \"Destructive\", cssVar: \"--destructive\" }, { name: \"Destructive Foreground\", cssVar: \"--destructive-foreground\" }] },\r\n { title: \"Border & Input Colors\", colors: [{ name: \"Border\", cssVar: \"--border\" }, { name: \"Input\", cssVar: \"--input\" }, { name: \"Ring\", cssVar: \"--ring\" }] },\r\n { title: \"Chart Colors\", colors: [{ name: \"Chart 1\", cssVar: \"--chart-1\" }, { name: \"Chart 2\", cssVar: \"--chart-2\" }, { name: \"Chart 3\", cssVar: \"--chart-3\" }, { name: \"Chart 4\", cssVar: \"--chart-4\" }, { name: \"Chart 5\", cssVar: \"--chart-5\" }] },\r\n { title: \"Sidebar Colors\", colors: [{ name: \"Sidebar Background\", cssVar: \"--sidebar\" }, { name: \"Sidebar Foreground\", cssVar: \"--sidebar-foreground\" }, { name: \"Sidebar Primary\", cssVar: \"--sidebar-primary\" }, { name: \"Sidebar Primary Foreground\", cssVar: \"--sidebar-primary-foreground\" }, { name: \"Sidebar Accent\", cssVar: \"--sidebar-accent\" }, { name: \"Sidebar Accent Foreground\", cssVar: \"--sidebar-accent-foreground\" }, { name: \"Sidebar Border\", cssVar: \"--sidebar-border\" }, { name: \"Sidebar Ring\", cssVar: \"--sidebar-ring\" }] },\r\n]\r\n\r\n/** Typography options — font-sans, font-mono in presets.ts. Letter spacing not in preset. */\r\nexport const fontSansOptions = [\r\n { value: 'var(--font-inter, \"Inter\", ui-sans-serif, system-ui, sans-serif)', label: 'Inter (default)' },\r\n { value: 'ui-sans-serif, system-ui, sans-serif, \"Segoe UI\", Roboto, sans-serif', label: 'System UI' },\r\n { value: '\"Helvetica Neue\", Helvetica, Arial, sans-serif', label: 'Helvetica' },\r\n] as const\r\n\r\nexport const fontMonoOptions = [\r\n { value: 'ui-monospace, SFMono-Regular, Consolas, monospace', label: 'Consolas (default)' },\r\n { value: '\"Fira Code\", \"Fira Mono\", monospace', label: 'Fira Mono' },\r\n] as const\r\n\r\nexport const fontSerifOptions = [\r\n { value: 'ui-serif, Georgia, Cambria, \"Times New Roman\", Times, serif', label: 'Georgia' },\r\n { value: '\"Times New Roman\", Times, serif', label: 'Times New Roman' },\r\n] as const\r\n\r\n// Sidebar variant options (optional - for layout tab)\r\nexport const sidebarVariants: SidebarVariant[] = [\r\n { name: \"Default\", value: \"sidebar\", description: \"Standard sidebar layout\" },\r\n { name: \"Floating\", value: \"floating\", description: \"Floating sidebar with border\" },\r\n { name: \"Inset\", value: \"inset\", description: \"Inset sidebar with rounded corners\" },\r\n]\r\n\r\n// Sidebar collapsible options\r\nexport const sidebarCollapsibleOptions: SidebarCollapsibleOption[] = [\r\n { name: \"Off Canvas\", value: \"offcanvas\", description: \"Slides out of view\" },\r\n { name: \"Icon\", value: \"icon\", description: \"Collapses to icon only\" },\r\n { name: \"None\", value: \"none\", description: \"Always visible\" },\r\n]\r\n\r\n// Sidebar side options\r\nexport const sidebarSideOptions: SidebarSideOption[] = [\r\n { name: \"Left\", value: \"left\" },\r\n { name: \"Right\", value: \"right\" },\r\n]\r\n","/**\r\n * Design system theme presets\r\n * Built-in themes only (no third-party product names)\r\n */\r\n\r\nimport type { ThemePreset } from './types'\r\n\r\nexport const themePresets: Record<string, ThemePreset> = ({\r\n default: {\r\n label: \"Default\",\r\n source: \"BUILT_IN\",\r\n styles: {\r\n light: {\r\n background: \"#ffffff\",\r\n foreground: \"#0a0a0a\",\r\n card: \"#ffffff\",\r\n \"card-foreground\": \"#0a0a0a\",\r\n popover: \"#ffffff\",\r\n \"popover-foreground\": \"#0a0a0a\",\r\n primary: \"#171717\",\r\n \"primary-foreground\": \"#fafafa\",\r\n secondary: \"#f5f5f5\",\r\n \"secondary-foreground\": \"#171717\",\r\n muted: \"#f5f5f5\",\r\n \"muted-foreground\": \"#737373\",\r\n accent: \"#f5f5f5\",\r\n \"accent-foreground\": \"#171717\",\r\n destructive: \"#e7000b\",\r\n \"destructive-foreground\": \"#ffffff\",\r\n border: \"#e5e5e5\",\r\n input: \"#e5e5e5\",\r\n ring: \"#a1a1a1\",\r\n \"chart-1\": \"#91c5ff\",\r\n \"chart-2\": \"#3a81f6\",\r\n \"chart-3\": \"#2563ef\",\r\n \"chart-4\": \"#1a4eda\",\r\n \"chart-5\": \"#1f3fad\",\r\n sidebar: \"#fafafa\",\r\n \"sidebar-foreground\": \"#0a0a0a\",\r\n \"sidebar-primary\": \"#171717\",\r\n \"sidebar-primary-foreground\": \"#fafafa\",\r\n \"sidebar-accent\": \"#f5f5f5\",\r\n \"sidebar-accent-foreground\": \"#171717\",\r\n \"sidebar-border\": \"#e5e5e5\",\r\n \"sidebar-ring\": \"#a1a1a1\",\r\n \"font-sans\": \"Inter, ui-sans-serif, sans-serif, system-ui\",\r\n \"font-serif\": \"ui-serif, Georgia, Cambria, \\\"Times New Roman\\\", Times, serif\",\r\n \"font-mono\":\r\n \"ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\",\r\n radius: \"0.625rem\",\r\n \"shadow-x\": \"0\",\r\n \"shadow-y\": \"1px\",\r\n \"shadow-blur\": \"3px\",\r\n \"shadow-spread\": \"0px\",\r\n \"shadow-opacity\": \"0.1\",\r\n \"shadow-color\": \"oklch(0 0 0)\",\r\n \"shadow-2xs\": \"0 1px 3px 0px hsl(0 0% 0% / 0.05)\",\r\n \"shadow-xs\": \"0 1px 3px 0px hsl(0 0% 0% / 0.05)\",\r\n \"shadow-sm\": \"0 1px 3px 0px hsl(0 0% 0% / 0.10), 0 1px 2px -1px hsl(0 0% 0% / 0.10)\",\r\n shadow: \"0 1px 3px 0px hsl(0 0% 0% / 0.10), 0 1px 2px -1px hsl(0 0% 0% / 0.10)\",\r\n \"shadow-md\": \"0 1px 3px 0px hsl(0 0% 0% / 0.10), 0 2px 4px -1px hsl(0 0% 0% / 0.10)\",\r\n \"shadow-lg\": \"0 1px 3px 0px hsl(0 0% 0% / 0.10), 0 4px 6px -1px hsl(0 0% 0% / 0.10)\",\r\n \"shadow-xl\": \"0 1px 3px 0px hsl(0 0% 0% / 0.10), 0 8px 10px -1px hsl(0 0% 0% / 0.10)\",\r\n \"shadow-2xl\": \"0 1px 3px 0px hsl(0 0% 0% / 0.25)\",\r\n \"tracking-normal\": \"0em\",\r\n spacing: \"0.25rem\",\r\n },\r\n dark: {\r\n background: \"#0a0a0a\",\r\n foreground: \"#fafafa\",\r\n card: \"#171717\",\r\n \"card-foreground\": \"#fafafa\",\r\n popover: \"#262626\",\r\n \"popover-foreground\": \"#fafafa\",\r\n primary: \"#e5e5e5\",\r\n \"primary-foreground\": \"#171717\",\r\n secondary: \"#262626\",\r\n \"secondary-foreground\": \"#fafafa\",\r\n muted: \"#262626\",\r\n \"muted-foreground\": \"#a1a1a1\",\r\n accent: \"#404040\",\r\n \"accent-foreground\": \"#fafafa\",\r\n destructive: \"#ff6467\",\r\n \"destructive-foreground\": \"#fafafa\",\r\n border: \"#282828\",\r\n input: \"#343434\",\r\n ring: \"#737373\",\r\n \"chart-1\": \"#91c5ff\",\r\n \"chart-2\": \"#3a81f6\",\r\n \"chart-3\": \"#2563ef\",\r\n \"chart-4\": \"#1a4eda\",\r\n \"chart-5\": \"#1f3fad\",\r\n sidebar: \"#171717\",\r\n \"sidebar-foreground\": \"#fafafa\",\r\n \"sidebar-primary\": \"#1447e6\",\r\n \"sidebar-primary-foreground\": \"#fafafa\",\r\n \"sidebar-accent\": \"#262626\",\r\n \"sidebar-accent-foreground\": \"#fafafa\",\r\n \"sidebar-border\": \"#282828\",\r\n \"sidebar-ring\": \"#525252\",\r\n \"font-sans\": \"Inter, ui-sans-serif, sans-serif, system-ui\",\r\n \"font-serif\": \"ui-serif, Georgia, Cambria, \\\"Times New Roman\\\", Times, serif\",\r\n \"font-mono\":\r\n \"ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\",\r\n radius: \"0.625rem\",\r\n \"shadow-x\": \"0\",\r\n \"shadow-y\": \"1px\",\r\n \"shadow-blur\": \"3px\",\r\n \"shadow-spread\": \"0px\",\r\n \"shadow-opacity\": \"0.1\",\r\n \"shadow-color\": \"oklch(0 0 0)\",\r\n \"shadow-2xs\": \"0 1px 3px 0px hsl(0 0% 0% / 0.05)\",\r\n \"shadow-xs\": \"0 1px 3px 0px hsl(0 0% 0% / 0.05)\",\r\n \"shadow-sm\": \"0 1px 3px 0px hsl(0 0% 0% / 0.10), 0 1px 2px -1px hsl(0 0% 0% / 0.10)\",\r\n shadow: \"0 1px 3px 0px hsl(0 0% 0% / 0.10), 0 1px 2px -1px hsl(0 0% 0% / 0.10)\",\r\n \"shadow-md\": \"0 1px 3px 0px hsl(0 0% 0% / 0.10), 0 2px 4px -1px hsl(0 0% 0% / 0.10)\",\r\n \"shadow-lg\": \"0 1px 3px 0px hsl(0 0% 0% / 0.10), 0 4px 6px -1px hsl(0 0% 0% / 0.10)\",\r\n \"shadow-xl\": \"0 1px 3px 0px hsl(0 0% 0% / 0.10), 0 8px 10px -1px hsl(0 0% 0% / 0.10)\",\r\n \"shadow-2xl\": \"0 1px 3px 0px hsl(0 0% 0% / 0.25)\",\r\n },\r\n },\r\n },\r\n \"mindtris-ui\": {\r\n label: \"Mindtris UI\",\r\n source: \"BUILT_IN\",\r\n styles: {\r\n light: {\r\n background: \"#f3f4f6\",\r\n foreground: \"#4b5563\",\r\n card: \"#ffffff\",\r\n \"card-foreground\": \"#1f2937\",\r\n popover: \"#ffffff\",\r\n \"popover-foreground\": \"#1f2937\",\r\n primary: \"#111827\",\r\n \"primary-foreground\": \"#f9fafb\",\r\n secondary: \"#ffffff\",\r\n \"secondary-foreground\": \"#1f2937\",\r\n muted: \"#f3f4f6\",\r\n \"muted-foreground\": \"#6b7280\",\r\n accent: \"#f1eeff\",\r\n \"accent-foreground\": \"#5d47de\",\r\n destructive: \"#ff5656\",\r\n \"destructive-foreground\": \"#ffffff\",\r\n border: \"#e5e7eb\",\r\n input: \"#e5e7eb\",\r\n ring: \"#111827\",\r\n \"chart-1\": \"#755ff8\",\r\n \"chart-2\": \"#56b1f3\",\r\n \"chart-3\": \"#34bd68\",\r\n \"chart-4\": \"#f0bb33\",\r\n \"chart-5\": \"#ff5656\",\r\n radius: \"0.5rem\",\r\n \"font-sans\": \"var(--font-inter, \\\"Inter\\\", ui-sans-serif, system-ui, sans-serif)\",\r\n \"font-mono\": \"ui-monospace, SFMono-Regular, Consolas, monospace\",\r\n sidebar: \"#ffffff\",\r\n \"sidebar-foreground\": \"#1f2937\",\r\n \"sidebar-primary\": \"#755ff8\",\r\n \"sidebar-primary-foreground\": \"#ffffff\",\r\n \"sidebar-accent\": \"#f1eeff\",\r\n \"sidebar-accent-foreground\": \"#5d47de\",\r\n \"sidebar-border\": \"#e5e7eb\",\r\n \"sidebar-ring\": \"#111827\",\r\n },\r\n dark: {\r\n background: \"#111827\",\r\n foreground: \"#9ca3af\",\r\n card: \"#1f2937\",\r\n \"card-foreground\": \"#f3f4f6\",\r\n popover: \"#1f2937\",\r\n \"popover-foreground\": \"#f3f4f6\",\r\n primary: \"#8470ff\",\r\n \"primary-foreground\": \"#ffffff\",\r\n secondary: \"#374151\",\r\n \"secondary-foreground\": \"#f3f4f6\",\r\n muted: \"#374151\",\r\n \"muted-foreground\": \"#9ca3af\",\r\n accent: \"#4634b1\",\r\n \"accent-foreground\": \"#f1eeff\",\r\n destructive: \"#ff6467\",\r\n \"destructive-foreground\": \"#ffffff\",\r\n border: \"#374151\",\r\n input: \"#374151\",\r\n ring: \"#f3f4f6\",\r\n \"chart-1\": \"#8470ff\",\r\n \"chart-2\": \"#67bfff\",\r\n \"chart-3\": \"#3ec972\",\r\n \"chart-4\": \"#f7cd4c\",\r\n \"chart-5\": \"#ff6467\",\r\n radius: \"0.5rem\",\r\n \"font-sans\": \"var(--font-inter, \\\"Inter\\\", ui-sans-serif, system-ui, sans-serif)\",\r\n \"font-mono\": \"ui-monospace, SFMono-Regular, Consolas, monospace\",\r\n sidebar: \"#1f2937\",\r\n \"sidebar-foreground\": \"#f3f4f6\",\r\n \"sidebar-primary\": \"#8470ff\",\r\n \"sidebar-primary-foreground\": \"#ffffff\",\r\n \"sidebar-accent\": \"#4634b1\",\r\n \"sidebar-accent-foreground\": \"#f1eeff\",\r\n \"sidebar-border\": \"#374151\",\r\n \"sidebar-ring\": \"#f3f4f6\",\r\n }\r\n }\r\n },\r\n amber: {\r\n label: \"Amber\",\r\n source: \"BUILT_IN\",\r\n styles: {\r\n light: {\r\n background: \"#ffffff\",\r\n foreground: \"#262626\",\r\n card: \"#ffffff\",\r\n \"card-foreground\": \"#262626\",\r\n popover: \"#ffffff\",\r\n \"popover-foreground\": \"#262626\",\r\n primary: \"#f59e0b\",\r\n \"primary-foreground\": \"#000000\",\r\n secondary: \"#f3f4f6\",\r\n \"secondary-foreground\": \"#4b5563\",\r\n muted: \"#f9fafb\",\r\n \"muted-foreground\": \"#6b7280\",\r\n accent: \"#fffbeb\",\r\n \"accent-foreground\": \"#92400e\",\r\n destructive: \"#ef4444\",\r\n \"destructive-foreground\": \"#ffffff\",\r\n border: \"#e5e7eb\",\r\n input: \"#e5e7eb\",\r\n ring: \"#f59e0b\",\r\n \"chart-1\": \"#f59e0b\",\r\n \"chart-2\": \"#d97706\",\r\n \"chart-3\": \"#b45309\",\r\n \"chart-4\": \"#92400e\",\r\n \"chart-5\": \"#78350f\",\r\n sidebar: \"#f9fafb\",\r\n \"sidebar-foreground\": \"#262626\",\r\n \"sidebar-primary\": \"#f59e0b\",\r\n \"sidebar-primary-foreground\": \"#ffffff\",\r\n \"sidebar-accent\": \"#fffbeb\",\r\n \"sidebar-accent-foreground\": \"#92400e\",\r\n \"sidebar-border\": \"#e5e7eb\",\r\n \"sidebar-ring\": \"#f59e0b\",\r\n \"font-sans\": \"Inter, sans-serif\",\r\n \"font-serif\": \"Source Serif 4, serif\",\r\n \"font-mono\": \"JetBrains Mono, monospace\",\r\n radius: \"0.375rem\",\r\n \"shadow-x\": \"0px\",\r\n \"shadow-y\": \"4px\",\r\n \"shadow-blur\": \"8px\",\r\n \"shadow-spread\": \"-1px\",\r\n \"shadow-opacity\": \"0.1\",\r\n \"shadow-color\": \"hsl(0 0% 0%)\",\r\n \"shadow-2xs\": \"0px 4px 8px -1px hsl(0 0% 0% / 0.05)\",\r\n \"shadow-xs\": \"0px 4px 8px -1px hsl(0 0% 0% / 0.05)\",\r\n \"shadow-sm\": \"0px 4px 8px -1px hsl(0 0% 0% / 0.10), 0px 1px 2px -2px hsl(0 0% 0% / 0.10)\",\r\n shadow: \"0px 4px 8px -1px hsl(0 0% 0% / 0.10), 0px 1px 2px -2px hsl(0 0% 0% / 0.10)\",\r\n \"shadow-md\": \"0px 4px 8px -1px hsl(0 0% 0% / 0.10), 0px 2px 4px -2px hsl(0 0% 0% / 0.10)\",\r\n \"shadow-lg\": \"0px 4px 8px -1px hsl(0 0% 0% / 0.10), 0px 4px 6px -2px hsl(0 0% 0% / 0.10)\",\r\n \"shadow-xl\": \"0px 4px 8px -1px hsl(0 0% 0% / 0.10), 0px 8px 10px -2px hsl(0 0% 0% / 0.10)\",\r\n \"shadow-2xl\": \"0px 4px 8px -1px hsl(0 0% 0% / 0.25)\",\r\n \"tracking-normal\": \"0em\",\r\n spacing: \"0.25rem\",\r\n },\r\n dark: {\r\n background: \"#171717\",\r\n foreground: \"#e5e5e5\",\r\n card: \"#262626\",\r\n \"card-foreground\": \"#e5e5e5\",\r\n popover: \"#262626\",\r\n \"popover-foreground\": \"#e5e5e5\",\r\n primary: \"#f59e0b\",\r\n \"primary-foreground\": \"#000000\",\r\n secondary: \"#262626\",\r\n \"secondary-foreground\": \"#e5e5e5\",\r\n muted: \"#1f1f1f\",\r\n \"muted-foreground\": \"#a3a3a3\",\r\n accent: \"#92400e\",\r\n \"accent-foreground\": \"#fde68a\",\r\n destructive: \"#ef4444\",\r\n \"destructive-foreground\": \"#ffffff\",\r\n border: \"#404040\",\r\n input: \"#404040\",\r\n ring: \"#f59e0b\",\r\n \"chart-1\": \"#fbbf24\",\r\n \"chart-2\": \"#d97706\",\r\n \"chart-3\": \"#92400e\",\r\n \"chart-4\": \"#b45309\",\r\n \"chart-5\": \"#92400e\",\r\n sidebar: \"#0f0f0f\",\r\n \"sidebar-foreground\": \"#e5e5e5\",\r\n \"sidebar-primary\": \"#f59e0b\",\r\n \"sidebar-primary-foreground\": \"#ffffff\",\r\n \"sidebar-accent\": \"#92400e\",\r\n \"sidebar-accent-foreground\": \"#fde68a\",\r\n \"sidebar-border\": \"#404040\",\r\n \"sidebar-ring\": \"#f59e0b\",\r\n \"font-sans\": \"Inter, sans-serif\",\r\n \"font-serif\": \"Source Serif 4, serif\",\r\n \"font-mono\": \"JetBrains Mono, monospace\",\r\n radius: \"0.375rem\",\r\n \"shadow-x\": \"0px\",\r\n \"shadow-y\": \"4px\",\r\n \"shadow-blur\": \"8px\",\r\n \"shadow-spread\": \"-1px\",\r\n \"shadow-opacity\": \"0.1\",\r\n \"shadow-color\": \"hsl(0 0% 0%)\",\r\n \"shadow-2xs\": \"0px 4px 8px -1px hsl(0 0% 0% / 0.05)\",\r\n \"shadow-xs\": \"0px 4px 8px -1px hsl(0 0% 0% / 0.05)\",\r\n \"shadow-sm\": \"0px 4px 8px -1px hsl(0 0% 0% / 0.10), 0px 1px 2px -2px hsl(0 0% 0% / 0.10)\",\r\n shadow: \"0px 4px 8px -1px hsl(0 0% 0% / 0.10), 0px 1px 2px -2px hsl(0 0% 0% / 0.10)\",\r\n \"shadow-md\": \"0px 4px 8px -1px hsl(0 0% 0% / 0.10), 0px 2px 4px -2px hsl(0 0% 0% / 0.10)\",\r\n \"shadow-lg\": \"0px 4px 8px -1px hsl(0 0% 0% / 0.10), 0px 4px 6px -2px hsl(0 0% 0% / 0.10)\",\r\n \"shadow-xl\": \"0px 4px 8px -1px hsl(0 0% 0% / 0.10), 0px 8px 10px -2px hsl(0 0% 0% / 0.10)\",\r\n \"shadow-2xl\": \"0px 4px 8px -1px hsl(0 0% 0% / 0.25)\",\r\n },\r\n }\r\n },\r\n simplifi: {\r\n label: \"Simplifi\",\r\n source: \"BUILT_IN\",\r\n styles: {\r\n light: {\r\n // Canvas + control surfaces are distinct in this theme.\r\n background: \"#f7f5f2\",\r\n foreground: \"#1b1b1b\",\r\n card: \"#ffffff\",\r\n \"card-foreground\": \"#1b1b1b\",\r\n popover: \"#ffffff\",\r\n \"popover-foreground\": \"#1b1b1b\",\r\n field: \"#ffffff\",\r\n primary: \"#1b1b1b\",\r\n \"primary-foreground\": \"#ffffff\",\r\n secondary: \"#dedede\",\r\n \"secondary-foreground\": \"#1b1b1b\",\r\n // Used by `bg-muted` / `hover:bg-muted` (e.g. header menu hover surface).\r\n muted: \"#dedede\",\r\n \"muted-foreground\": \"#616161\",\r\n // Accent is a subtle highlight surface (selection, focus backgrounds).\r\n accent: \"#f4effa\",\r\n \"accent-foreground\": \"#2f184b\",\r\n destructive: \"#ea4335\",\r\n \"destructive-foreground\": \"#ffffff\",\r\n border: \"#dedede\",\r\n input: \"#dedede\",\r\n // Focus ring uses the accent scale (not primary).\r\n ring: \"#9b72cf\",\r\n \"chart-1\": \"#4285f4\",\r\n \"chart-2\": \"#34a853\",\r\n \"chart-3\": \"#fbbc04\",\r\n \"chart-4\": \"#ea4335\",\r\n \"chart-5\": \"#532b88\",\r\n sidebar: \"#ffffff\",\r\n \"sidebar-foreground\": \"#1b1b1b\",\r\n \"sidebar-primary\": \"#1b1b1b\",\r\n \"sidebar-primary-foreground\": \"#ffffff\",\r\n \"sidebar-accent\": \"#f4effa\",\r\n \"sidebar-accent-foreground\": \"#2f184b\",\r\n \"sidebar-border\": \"#dedede\",\r\n \"sidebar-ring\": \"#c8b1e4\",\r\n \"font-sans\": \"Inter, sans-serif\",\r\n \"font-serif\": \"Source Serif 4, serif\",\r\n \"font-mono\": \"JetBrains Mono, monospace\",\r\n radius: \"0.375rem\",\r\n \"shadow-x\": \"0px\",\r\n \"shadow-y\": \"4px\",\r\n \"shadow-blur\": \"8px\",\r\n \"shadow-spread\": \"-1px\",\r\n \"shadow-opacity\": \"0.1\",\r\n \"shadow-color\": \"hsl(0 0% 0%)\",\r\n \"shadow-2xs\": \"0px 4px 8px -1px hsl(0 0% 0% / 0.05)\",\r\n \"shadow-xs\": \"0px 4px 8px -1px hsl(0 0% 0% / 0.05)\",\r\n \"shadow-sm\": \"0px 4px 8px -1px hsl(0 0% 0% / 0.10), 0px 1px 2px -2px hsl(0 0% 0% / 0.10)\",\r\n shadow: \"0px 4px 8px -1px hsl(0 0% 0% / 0.10), 0px 1px 2px -2px hsl(0 0% 0% / 0.10)\",\r\n \"shadow-md\": \"0px 4px 8px -1px hsl(0 0% 0% / 0.10), 0px 2px 4px -2px hsl(0 0% 0% / 0.10)\",\r\n \"shadow-lg\": \"0px 4px 8px -1px hsl(0 0% 0% / 0.10), 0px 4px 6px -2px hsl(0 0% 0% / 0.10)\",\r\n \"shadow-xl\": \"0px 4px 8px -1px hsl(0 0% 0% / 0.10), 0px 8px 10px -2px hsl(0 0% 0% / 0.10)\",\r\n \"shadow-2xl\": \"0px 4px 8px -1px hsl(0 0% 0% / 0.25)\",\r\n \"tracking-normal\": \"0em\",\r\n spacing: \"0.25rem\",\r\n },\r\n dark: {\r\n background: \"#1b1b1b\",\r\n foreground: \"#ffffff\",\r\n card: \"#000000\",\r\n \"card-foreground\": \"#ffffff\",\r\n popover: \"#000000\",\r\n \"popover-foreground\": \"#ffffff\",\r\n field: \"#000000\",\r\n primary: \"#dedede\",\r\n \"primary-foreground\": \"#1b1b1b\",\r\n secondary: \"#616161\",\r\n \"secondary-foreground\": \"#ffffff\",\r\n muted: \"#616161\",\r\n \"muted-foreground\": \"#dedede\",\r\n accent: \"#2f184b\",\r\n \"accent-foreground\": \"#f4effa\",\r\n destructive: \"#ea4335\",\r\n \"destructive-foreground\": \"#ffffff\",\r\n border: \"#616161\",\r\n input: \"#616161\",\r\n ring: \"#c8b1e4\",\r\n \"chart-1\": \"#4285f4\",\r\n \"chart-2\": \"#34a853\",\r\n \"chart-3\": \"#fbbc04\",\r\n \"chart-4\": \"#ea4335\",\r\n \"chart-5\": \"#9b72cf\",\r\n sidebar: \"#1b1b1b\",\r\n \"sidebar-foreground\": \"#ffffff\",\r\n \"sidebar-primary\": \"#1b1b1b\",\r\n \"sidebar-primary-foreground\": \"#ffffff\",\r\n \"sidebar-accent\": \"#532b88\",\r\n \"sidebar-accent-foreground\": \"#f4effa\",\r\n \"sidebar-border\": \"#616161\",\r\n \"sidebar-ring\": \"#c8b1e4\",\r\n \"font-sans\": \"Inter, sans-serif\",\r\n \"font-serif\": \"Source Serif 4, serif\",\r\n \"font-mono\": \"JetBrains Mono, monospace\",\r\n radius: \"0.375rem\",\r\n \"shadow-x\": \"0px\",\r\n \"shadow-y\": \"4px\",\r\n \"shadow-blur\": \"8px\",\r\n \"shadow-spread\": \"-1px\",\r\n \"shadow-opacity\": \"0.1\",\r\n \"shadow-color\": \"hsl(0 0% 0%)\",\r\n \"shadow-2xs\": \"0px 4px 8px -1px hsl(0 0% 0% / 0.05)\",\r\n \"shadow-xs\": \"0px 4px 8px -1px hsl(0 0% 0% / 0.05)\",\r\n \"shadow-sm\": \"0px 4px 8px -1px hsl(0 0% 0% / 0.10), 0px 1px 2px -2px hsl(0 0% 0% / 0.10)\",\r\n shadow: \"0px 4px 8px -1px hsl(0 0% 0% / 0.10), 0px 1px 2px -2px hsl(0 0% 0% / 0.10)\",\r\n \"shadow-md\": \"0px 4px 8px -1px hsl(0 0% 0% / 0.10), 0px 2px 4px -2px hsl(0 0% 0% / 0.10)\",\r\n \"shadow-lg\": \"0px 4px 8px -1px hsl(0 0% 0% / 0.10), 0px 4px 6px -2px hsl(0 0% 0% / 0.10)\",\r\n \"shadow-xl\": \"0px 4px 8px -1px hsl(0 0% 0% / 0.10), 0px 8px 10px -2px hsl(0 0% 0% / 0.10)\",\r\n \"shadow-2xl\": \"0px 4px 8px -1px hsl(0 0% 0% / 0.25)\",\r\n },\r\n },\r\n },\r\n} as any)\r\n","/**\r\n * Design system theme data\r\n * Converts presets to ColorTheme[] for dropdown\r\n */\r\n\r\nimport { themePresets } from './presets'\r\nimport type { ColorTheme } from './types'\r\n\r\n// Theme presets for the dropdown\r\n// Deduplicate by value to prevent duplicate entries\r\nexport const colorThemes: ColorTheme[] = Object.entries(themePresets)\r\n .map(([key, preset]) => ({\r\n name: preset.label || key,\r\n value: key,\r\n preset: preset\r\n }))\r\n .filter((theme, index, self) => \r\n index === self.findIndex(t => t.value === theme.value)\r\n )\r\n","/**\r\n * HSL transformation utilities\r\n * Applies HSL adjustments (hue-shift, saturation-mult, lightness-mult) to colors\r\n * Similar to tweakcn implementation\r\n */\r\n\r\n/**\r\n * Convert hex color to HSL\r\n */\r\nfunction hexToHsl(hex: string): { h: number; s: number; l: number } | null {\r\n // Remove # if present\r\n const cleanHex = hex.replace('#', '')\r\n \r\n // Handle 3-digit hex\r\n const fullHex = cleanHex.length === 3\r\n ? cleanHex.split('').map(char => char + char).join('')\r\n : cleanHex\r\n\r\n if (fullHex.length !== 6) {\r\n return null\r\n }\r\n\r\n const r = parseInt(fullHex.substring(0, 2), 16) / 255\r\n const g = parseInt(fullHex.substring(2, 4), 16) / 255\r\n const b = parseInt(fullHex.substring(4, 6), 16) / 255\r\n\r\n const max = Math.max(r, g, b)\r\n const min = Math.min(r, g, b)\r\n let h = 0\r\n let s = 0\r\n const l = (max + min) / 2\r\n\r\n if (max !== min) {\r\n const d = max - min\r\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min)\r\n\r\n switch (max) {\r\n case r:\r\n h = ((g - b) / d + (g < b ? 6 : 0)) / 6\r\n break\r\n case g:\r\n h = ((b - r) / d + 2) / 6\r\n break\r\n case b:\r\n h = ((r - g) / d + 4) / 6\r\n break\r\n }\r\n }\r\n\r\n return {\r\n h: h * 360,\r\n s: s * 100,\r\n l: l * 100\r\n }\r\n}\r\n\r\n/**\r\n * Convert HSL to hex\r\n */\r\nfunction hslToHex(h: number, s: number, l: number): string {\r\n h = h % 360\r\n if (h < 0) h += 360\r\n\r\n s = Math.max(0, Math.min(100, s)) / 100\r\n l = Math.max(0, Math.min(100, l)) / 100\r\n\r\n const c = (1 - Math.abs(2 * l - 1)) * s\r\n const x = c * (1 - Math.abs(((h / 60) % 2) - 1))\r\n const m = l - c / 2\r\n\r\n let r = 0\r\n let g = 0\r\n let b = 0\r\n\r\n if (h >= 0 && h < 60) {\r\n r = c\r\n g = x\r\n b = 0\r\n } else if (h >= 60 && h < 120) {\r\n r = x\r\n g = c\r\n b = 0\r\n } else if (h >= 120 && h < 180) {\r\n r = 0\r\n g = c\r\n b = x\r\n } else if (h >= 180 && h < 240) {\r\n r = 0\r\n g = x\r\n b = c\r\n } else if (h >= 240 && h < 300) {\r\n r = x\r\n g = 0\r\n b = c\r\n } else if (h >= 300 && h < 360) {\r\n r = c\r\n g = 0\r\n b = x\r\n }\r\n\r\n r = Math.round((r + m) * 255)\r\n g = Math.round((g + m) * 255)\r\n b = Math.round((b + m) * 255)\r\n\r\n return `#${[r, g, b].map(x => {\r\n const hex = x.toString(16)\r\n return hex.length === 1 ? '0' + hex : hex\r\n }).join('')}`\r\n}\r\n\r\n/**\r\n * Parse RGB/RGBA color\r\n */\r\nfunction parseRgb(color: string): { r: number; g: number; b: number } | null {\r\n const match = color.match(/rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)/)\r\n if (!match) return null\r\n\r\n return {\r\n r: parseInt(match[1], 10),\r\n g: parseInt(match[2], 10),\r\n b: parseInt(match[3], 10)\r\n }\r\n}\r\n\r\n/**\r\n * Apply HSL adjustments to a color value\r\n */\r\nexport function applyHSLAdjustments(\r\n colorValue: string,\r\n hueShift: number = 0,\r\n saturationMult: number = 1,\r\n lightnessMult: number = 1\r\n): string {\r\n if (!colorValue || colorValue.trim() === '') {\r\n return colorValue\r\n }\r\n\r\n const trimmed = colorValue.trim()\r\n\r\n // Skip if already a CSS variable or special value\r\n if (trimmed.startsWith('var(') || trimmed === 'transparent' || trimmed === 'currentColor') {\r\n return colorValue\r\n }\r\n\r\n // Try to parse as hex\r\n let hsl = hexToHsl(trimmed)\r\n \r\n // Try to parse as RGB\r\n if (!hsl) {\r\n const rgb = parseRgb(trimmed)\r\n if (rgb) {\r\n hsl = hexToHsl(hslToHex(0, 0, 0)) // Convert RGB to hex first\r\n if (hsl) {\r\n // Convert RGB to HSL manually\r\n const r = rgb.r / 255\r\n const g = rgb.g / 255\r\n const b = rgb.b / 255\r\n const max = Math.max(r, g, b)\r\n const min = Math.min(r, g, b)\r\n let h = 0\r\n let s = 0\r\n const l = (max + min) / 2\r\n\r\n if (max !== min) {\r\n const d = max - min\r\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min)\r\n switch (max) {\r\n case r:\r\n h = ((g - b) / d + (g < b ? 6 : 0)) / 6\r\n break\r\n case g:\r\n h = ((b - r) / d + 2) / 6\r\n break\r\n case b:\r\n h = ((r - g) / d + 4) / 6\r\n break\r\n }\r\n }\r\n\r\n hsl = {\r\n h: h * 360,\r\n s: s * 100,\r\n l: l * 100\r\n }\r\n }\r\n }\r\n }\r\n\r\n // If we couldn't parse the color, return as-is\r\n if (!hsl) {\r\n return colorValue\r\n }\r\n\r\n // Apply adjustments\r\n let adjustedH = hsl.h + hueShift\r\n let adjustedS = Math.max(0, Math.min(100, hsl.s * saturationMult))\r\n let adjustedL = Math.max(0, Math.min(100, hsl.l * lightnessMult))\r\n\r\n // Convert back to hex\r\n return hslToHex(adjustedH, adjustedS, adjustedL)\r\n}\r\n\r\n/**\r\n * Apply HSL adjustments to all color values in a theme style object\r\n */\r\nexport function applyHSLToThemeStyles(\r\n styles: Record<string, string>,\r\n hueShift: number = 0,\r\n saturationMult: number = 1,\r\n lightnessMult: number = 1\r\n): Record<string, string> {\r\n const adjusted: Record<string, string> = {}\r\n\r\n // Color variables that should be adjusted\r\n const colorVars = [\r\n 'background', 'foreground', 'card', 'card-foreground',\r\n 'popover', 'popover-foreground', 'primary', 'primary-foreground',\r\n 'secondary', 'secondary-foreground', 'muted', 'muted-foreground',\r\n 'accent', 'accent-foreground', 'destructive', 'destructive-foreground',\r\n 'border', 'input', 'ring',\r\n 'chart-1', 'chart-2', 'chart-3', 'chart-4', 'chart-5',\r\n 'sidebar', 'sidebar-foreground', 'sidebar-primary', 'sidebar-primary-foreground',\r\n 'sidebar-accent', 'sidebar-accent-foreground', 'sidebar-border', 'sidebar-ring'\r\n ]\r\n\r\n for (const [key, value] of Object.entries(styles)) {\r\n if (colorVars.includes(key) && value) {\r\n adjusted[key] = applyHSLAdjustments(value, hueShift, saturationMult, lightnessMult)\r\n } else {\r\n adjusted[key] = value\r\n }\r\n }\r\n\r\n return adjusted\r\n}\r\n","/**\r\n * Shadow utilities\r\n * Connects shadow component variables to shadow tokens dynamically\r\n */\r\n\r\n/**\r\n * Build shadow value from component variables\r\n */\r\nexport function buildShadowValue(\r\n color: string = 'hsl(0 0% 0%)',\r\n opacity: string = '0.1',\r\n blur: string = '3px',\r\n spread: string = '0px',\r\n x: string = '0px',\r\n y: string = '1px'\r\n): string {\r\n // Parse opacity\r\n const opacityNum = parseFloat(opacity) || 0.1\r\n const opacityValue = Math.max(0, Math.min(1, opacityNum))\r\n\r\n // Convert color to rgba if needed\r\n let shadowColor = color\r\n if (color.startsWith('hsl(')) {\r\n // Convert HSL to RGBA\r\n const hslMatch = color.match(/hsl\\((\\d+),\\s*(\\d+)%,\\s*(\\d+)%\\)/)\r\n if (hslMatch) {\r\n const h = parseInt(hslMatch[1], 10)\r\n const s = parseInt(hslMatch[2], 10) / 100\r\n const l = parseInt(hslMatch[3], 10) / 100\r\n \r\n const c = (1 - Math.abs(2 * l - 1)) * s\r\n const x = c * (1 - Math.abs(((h / 60) % 2) - 1))\r\n const m = l - c / 2\r\n \r\n let r = 0, g = 0, b = 0\r\n if (h >= 0 && h < 60) {\r\n r = c; g = x; b = 0\r\n } else if (h >= 60 && h < 120) {\r\n r = x; g = c; b = 0\r\n } else if (h >= 120 && h < 180) {\r\n r = 0; g = c; b = x\r\n } else if (h >= 180 && h < 240) {\r\n r = 0; g = x; b = c\r\n } else if (h >= 240 && h < 300) {\r\n r = x; g = 0; b = c\r\n } else {\r\n r = c; g = 0; b = x\r\n }\r\n \r\n r = Math.round((r + m) * 255)\r\n g = Math.round((g + m) * 255)\r\n b = Math.round((b + m) * 255)\r\n \r\n shadowColor = `rgba(${r}, ${g}, ${b}, ${opacityValue})`\r\n } else {\r\n shadowColor = `rgba(0, 0, 0, ${opacityValue})`\r\n }\r\n } else if (color.startsWith('oklch(')) {\r\n // For oklch, use as-is and append opacity\r\n shadowColor = color.replace(')', ` / ${opacityValue})`)\r\n } else if (color.startsWith('#')) {\r\n // Convert hex to rgba\r\n const hex = color.replace('#', '')\r\n const r = parseInt(hex.substring(0, 2), 16)\r\n const g = parseInt(hex.substring(2, 4), 16)\r\n const b = parseInt(hex.substring(4, 6), 16)\r\n shadowColor = `rgba(${r}, ${g}, ${b}, ${opacityValue})`\r\n } else if (color.startsWith('rgb(')) {\r\n shadowColor = color.replace('rgb(', 'rgba(').replace(')', `, ${opacityValue})`)\r\n } else {\r\n shadowColor = `rgba(0, 0, 0, ${opacityValue})`\r\n }\r\n\r\n return `${x} ${y} ${blur} ${spread} ${shadowColor}`\r\n}\r\n\r\n/**\r\n * Update shadow tokens from component variables\r\n */\r\nexport function updateShadowTokens(): void {\r\n if (typeof document === 'undefined') {\r\n return\r\n }\r\n\r\n const root = document.documentElement\r\n const styles = getComputedStyle(root)\r\n\r\n const shadowColor = styles.getPropertyValue('--shadow-color').trim() || 'hsl(0 0% 0%)'\r\n const shadowOpacity = styles.getPropertyValue('--shadow-opacity').trim() || '0.1'\r\n const shadowBlur = styles.getPropertyValue('--shadow-blur').trim() || '3px'\r\n const shadowSpread = styles.getPropertyValue('--shadow-spread').trim() || '0px'\r\n const shadowX = styles.getPropertyValue('--shadow-x').trim() || '0px'\r\n const shadowY = styles.getPropertyValue('--shadow-y').trim() || '1px'\r\n\r\n // Build shadow values for different sizes\r\n const baseShadow = buildShadowValue(shadowColor, shadowOpacity, shadowBlur, shadowSpread, shadowX, shadowY)\r\n \r\n // Only update if component variables are set (not empty)\r\n if (shadowColor && shadowOpacity && shadowBlur) {\r\n // Update shadow tokens with calculated values\r\n // These are used by components that reference --shadow-sm, --shadow-md, etc.\r\n root.style.setProperty('--shadow-sm', baseShadow)\r\n root.style.setProperty('--shadow-md', baseShadow)\r\n root.style.setProperty('--shadow-lg', baseShadow)\r\n }\r\n}\r\n","/**\r\n * Apply theme preset to document.documentElement\r\n * Writes preset's light/dark object to CSS variables\r\n * Includes HSL transformations and shadow updates\r\n */\r\n\r\nimport type { ThemePreset, ImportedTheme, CustomThemeArtifactV1 } from './types'\r\nimport { applyHSLToThemeStyles } from './utils/hsl-transform'\r\nimport { updateShadowTokens } from './utils/shadow-utils'\r\nimport { themePresets } from './presets'\r\n\r\n/**\r\n * Reset all CSS variables that could be set by themes\r\n */\r\nexport function resetTheme(): void {\r\n const root = document.documentElement\r\n const allPossibleVars = [\r\n // Standard shadcn/ui variables\r\n 'background', 'foreground', 'card', 'card-foreground', 'popover', 'popover-foreground',\r\n 'primary', 'primary-foreground', 'secondary', 'secondary-foreground', 'muted', 'muted-foreground',\r\n 'accent', 'accent-foreground', 'destructive', 'destructive-foreground', 'border', 'input',\r\n // Field surface (inputs, textareas, etc.)\r\n 'field',\r\n 'ring', 'radius',\r\n \r\n // Chart variables\r\n 'chart-1', 'chart-2', 'chart-3', 'chart-4', 'chart-5',\r\n \r\n // Sidebar variables\r\n 'sidebar', 'sidebar-foreground', 'sidebar-primary', 'sidebar-primary-foreground',\r\n 'sidebar-accent', 'sidebar-accent-foreground', 'sidebar-border', 'sidebar-ring',\r\n \r\n // Font variables\r\n 'font-sans', 'font-serif', 'font-mono',\r\n \r\n // Shadow variables\r\n 'shadow-2xs', 'shadow-xs', 'shadow-sm', 'shadow', 'shadow-md', 'shadow-lg', 'shadow-xl', 'shadow-2xl',\r\n \r\n // Spacing variables\r\n 'spacing', 'tracking-normal',\r\n // Shadow (single token or component-level, tweakcn-style)\r\n 'shadow-color', 'shadow-opacity', 'shadow-blur', 'shadow-spread', 'shadow-x', 'shadow-y',\r\n ]\r\n \r\n // Remove all possible CSS variables\r\n allPossibleVars.forEach(varName => {\r\n root.style.removeProperty(`--${varName}`)\r\n })\r\n}\r\n\r\nexport const THEME_VAR_KEYS: readonly string[] = [\r\n // Standard shadcn/ui variables\r\n 'background', 'foreground', 'card', 'card-foreground', 'popover', 'popover-foreground',\r\n 'primary', 'primary-foreground', 'secondary', 'secondary-foreground', 'muted', 'muted-foreground',\r\n 'accent', 'accent-foreground', 'destructive', 'destructive-foreground', 'border', 'input',\r\n // Field surface (inputs, textareas, etc.)\r\n 'field',\r\n 'ring', 'radius',\r\n\r\n // Chart variables\r\n 'chart-1', 'chart-2', 'chart-3', 'chart-4', 'chart-5',\r\n\r\n // Sidebar variables\r\n 'sidebar', 'sidebar-foreground', 'sidebar-primary', 'sidebar-primary-foreground',\r\n 'sidebar-accent', 'sidebar-accent-foreground', 'sidebar-border', 'sidebar-ring',\r\n\r\n // Font variables\r\n 'font-sans', 'font-serif', 'font-mono',\r\n\r\n // Shadow variables\r\n 'shadow-2xs', 'shadow-xs', 'shadow-sm', 'shadow', 'shadow-md', 'shadow-lg', 'shadow-xl', 'shadow-2xl',\r\n\r\n // Spacing variables\r\n 'spacing', 'tracking-normal',\r\n // Shadow (single token or component-level, tweakcn-style)\r\n 'shadow-color', 'shadow-opacity', 'shadow-blur', 'shadow-spread', 'shadow-x', 'shadow-y',\r\n]\r\n\r\nfunction readComputedNumberVar(varName: string, fallback: number): number {\r\n try {\r\n const raw = getComputedStyle(document.documentElement).getPropertyValue(`--${varName}`).trim()\r\n const n = parseFloat(raw)\r\n return Number.isFinite(n) ? n : fallback\r\n } catch {\r\n return fallback\r\n }\r\n}\r\n\r\nfunction readComputedStringVar(varName: string): string {\r\n try {\r\n return getComputedStyle(document.documentElement).getPropertyValue(`--${varName}`).trim()\r\n } catch {\r\n return ''\r\n }\r\n}\r\n\r\nconst PRESERVE_VARS_ACROSS_THEME_APPLY: readonly string[] = [\r\n // tweakcn knobs\r\n 'hue-shift',\r\n 'saturation-mult',\r\n 'lightness-mult',\r\n 'spacing',\r\n 'tracking-normal',\r\n 'shadow-color',\r\n 'shadow-opacity',\r\n 'shadow-blur',\r\n 'shadow-spread',\r\n 'shadow-x',\r\n 'shadow-y',\r\n // radius is treated as a knob in the editor\r\n 'radius',\r\n]\r\n\r\n/**\r\n * Apply a theme preset to the document\r\n * Includes HSL transformations and shadow updates\r\n */\r\nexport function applyThemePreset(preset: ThemePreset, darkMode: boolean): void {\r\n try {\r\n // Preserve tweakcn “Other” knobs across theme re-application.\r\n const preserved: Record<string, string> = {}\r\n PRESERVE_VARS_ACROSS_THEME_APPLY.forEach((k) => {\r\n const v = readComputedStringVar(k)\r\n if (v) preserved[k] = v\r\n })\r\n\r\n // Read adjustments BEFORE reset so they persist across theme switches.\r\n const hueShift = parseFloat(preserved['hue-shift'] ?? '0') || 0\r\n const saturationMult = parseFloat(preserved['saturation-mult'] ?? '1') || 1\r\n const lightnessMult = parseFloat(preserved['lightness-mult'] ?? '1') || 1\r\n\r\n resetTheme()\r\n let styles = darkMode ? preset.styles.dark : preset.styles.light\r\n const root = document.documentElement\r\n\r\n // Apply HSL adjustments if any are set\r\n if (hueShift !== 0 || saturationMult !== 1 || lightnessMult !== 1) {\r\n styles = applyHSLToThemeStyles(styles, hueShift, saturationMult, lightnessMult)\r\n }\r\n\r\n // Apply theme variables\r\n Object.entries(styles).forEach(([key, value]) => {\r\n if (value) {\r\n root.style.setProperty(`--${key}`, value)\r\n }\r\n })\r\n\r\n // Restore preserved knob vars last so user adjustments remain intact.\r\n Object.entries(preserved).forEach(([k, v]) => {\r\n root.style.setProperty(`--${k}`, v)\r\n })\r\n\r\n // Update shadow tokens from component variables\r\n updateShadowTokens()\r\n } catch (error) {\r\n console.error('Failed to apply theme preset:', error)\r\n // Fallback: try to apply without HSL adjustments\r\n try {\r\n resetTheme()\r\n const styles = darkMode ? preset.styles.dark : preset.styles.light\r\n const root = document.documentElement\r\n Object.entries(styles).forEach(([key, value]) => {\r\n if (value) {\r\n root.style.setProperty(`--${key}`, value)\r\n }\r\n })\r\n } catch (fallbackError) {\r\n console.error('Fallback theme application also failed:', fallbackError)\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Apply an imported theme to the document\r\n * Includes HSL transformations and shadow updates\r\n */\r\nexport function applyImportedTheme(themeData: ImportedTheme, darkMode: boolean): void {\r\n try {\r\n // Preserve tweakcn “Other” knobs across theme re-application.\r\n const preserved: Record<string, string> = {}\r\n PRESERVE_VARS_ACROSS_THEME_APPLY.forEach((k) => {\r\n const v = readComputedStringVar(k)\r\n if (v) preserved[k] = v\r\n })\r\n\r\n // Read adjustments BEFORE reset so they persist across theme switches.\r\n const hueShift = parseFloat(preserved['hue-shift'] ?? '0') || 0\r\n const saturationMult = parseFloat(preserved['saturation-mult'] ?? '1') || 1\r\n const lightnessMult = parseFloat(preserved['lightness-mult'] ?? '1') || 1\r\n\r\n resetTheme()\r\n const root = document.documentElement\r\n let themeVars = darkMode ? themeData.dark : themeData.light\r\n \r\n // Apply HSL adjustments if any are set\r\n if (hueShift !== 0 || saturationMult !== 1 || lightnessMult !== 1) {\r\n themeVars = applyHSLToThemeStyles(themeVars, hueShift, saturationMult, lightnessMult)\r\n }\r\n \r\n // Apply all variables from the theme\r\n Object.entries(themeVars).forEach(([variable, value]) => {\r\n // Remove -- prefix if present\r\n const varName = variable.startsWith('--') ? variable.slice(2) : variable\r\n if (value) {\r\n root.style.setProperty(`--${varName}`, value)\r\n }\r\n })\r\n\r\n // Restore preserved knob vars last so user adjustments remain intact.\r\n Object.entries(preserved).forEach(([k, v]) => {\r\n root.style.setProperty(`--${k}`, v)\r\n })\r\n\r\n // Update shadow tokens from component variables\r\n updateShadowTokens()\r\n } catch (error) {\r\n console.error('Failed to apply imported theme:', error)\r\n // Fallback: try to apply without HSL adjustments\r\n try {\r\n resetTheme()\r\n const root = document.documentElement\r\n const themeVars = darkMode ? themeData.dark : themeData.light\r\n Object.entries(themeVars).forEach(([variable, value]) => {\r\n const varName = variable.startsWith('--') ? variable.slice(2) : variable\r\n if (value) {\r\n root.style.setProperty(`--${varName}`, value)\r\n }\r\n })\r\n } catch (fallbackError) {\r\n console.error('Fallback theme application also failed:', fallbackError)\r\n }\r\n }\r\n}\r\n\r\nfunction normalizeVarKey(key: string): string {\r\n return key.trim().replace(/^--/, '')\r\n}\r\n\r\nexport function applyCustomThemeArtifact(theme: CustomThemeArtifactV1, darkMode: boolean): void {\r\n try {\r\n const root = document.documentElement\r\n\r\n const other = theme.overrides?.other ?? {}\r\n const hueShift = parseFloat(other['hue-shift'] ?? '0') || 0\r\n const saturationMult = parseFloat(other['saturation-mult'] ?? '1') || 1\r\n const lightnessMult = parseFloat(other['lightness-mult'] ?? '1') || 1\r\n\r\n const baseVars =\r\n theme.base.type === 'preset'\r\n ? (themePresets[theme.base.value]?.styles ?? themePresets.default.styles)\r\n : theme.base.theme\r\n\r\n let styles = darkMode ? baseVars.dark : baseVars.light\r\n\r\n // Apply HSL adjustments first (tweakcn behavior), then per-mode overrides win.\r\n if (hueShift !== 0 || saturationMult !== 1 || lightnessMult !== 1) {\r\n styles = applyHSLToThemeStyles(styles, hueShift, saturationMult, lightnessMult)\r\n }\r\n\r\n const modeOverrides = darkMode ? theme.overrides?.dark ?? {} : theme.overrides?.light ?? {}\r\n const merged: Record<string, string> = { ...styles, ...modeOverrides }\r\n\r\n resetTheme()\r\n\r\n // Apply mode-agnostic overrides first (so shadow token build can see them).\r\n Object.entries(other).forEach(([k, v]) => {\r\n const key = normalizeVarKey(k)\r\n if (v) root.style.setProperty(`--${key}`, v)\r\n })\r\n\r\n // Apply resolved theme vars.\r\n Object.entries(merged).forEach(([k, v]) => {\r\n const key = normalizeVarKey(k)\r\n if (v) root.style.setProperty(`--${key}`, v)\r\n })\r\n\r\n updateShadowTokens()\r\n } catch (error) {\r\n console.error('Failed to apply custom theme artifact:', error)\r\n }\r\n}\r\n\r\n/**\r\n * Apply radius value\r\n */\r\nexport function applyRadius(radius: string): void {\r\n document.documentElement.style.setProperty('--radius', radius)\r\n}\r\n\r\n/**\r\n * Single entry point for any theme CSS variable (colors, typography, radius, HSL, spacing, shadow).\r\n * Use this from all customizer panels so one component controls the design tokens.\r\n * Includes validation and shadow updates.\r\n */\r\nexport function handleColorChange(cssVar: string, value: string): void {\r\n try {\r\n const varName = cssVar.startsWith('--') ? cssVar : `--${cssVar}`\r\n document.documentElement.style.setProperty(varName, value)\r\n\r\n // If HSL adjustments changed, reapply theme with adjustments\r\n if (cssVar === '--hue-shift' || cssVar === '--saturation-mult' || cssVar === '--lightness-mult') {\r\n // Trigger shadow update\r\n updateShadowTokens()\r\n // Note: Full theme reapplication with HSL would require storing current theme\r\n // This is handled at theme application time\r\n }\r\n\r\n // If shadow component variables changed, update shadow tokens\r\n if (cssVar.startsWith('--shadow-') && (cssVar.includes('color') || cssVar.includes('opacity') || cssVar.includes('blur') || cssVar.includes('spread') || cssVar.includes('x') || cssVar.includes('y'))) {\r\n updateShadowTokens()\r\n }\r\n } catch (error) {\r\n console.error(`Failed to set CSS variable ${cssVar}:`, error)\r\n }\r\n}\r\n","/**\r\n * Theme persistence utilities\r\n * Stores theme preferences in localStorage\r\n * Follows CONTRIBUTING.md: error handling, defensive programming\r\n */\r\n\r\nconst STORAGE_KEY_THEME = 'mindtris-ui-theme'\r\nconst STORAGE_KEY_RADIUS = 'mindtris-ui-radius'\r\nconst STORAGE_KEY_CUSTOM_THEME = 'mindtris-ui-custom-theme'\r\n\r\n/**\r\n * Get stored theme preference\r\n */\r\nexport function getStoredTheme(): string | null {\r\n if (typeof window === 'undefined') {\r\n return null\r\n }\r\n\r\n try {\r\n return localStorage.getItem(STORAGE_KEY_THEME)\r\n } catch (error) {\r\n console.warn('Failed to read theme from localStorage:', error)\r\n return null\r\n }\r\n}\r\n\r\n/**\r\n * Store theme preference\r\n */\r\nexport function storeTheme(themeValue: string): void {\r\n if (typeof window === 'undefined') {\r\n return\r\n }\r\n\r\n try {\r\n localStorage.setItem(STORAGE_KEY_THEME, themeValue)\r\n } catch (error) {\r\n console.warn('Failed to store theme in localStorage:', error)\r\n }\r\n}\r\n\r\n/**\r\n * Get stored radius preference\r\n */\r\nexport function getStoredRadius(): string | null {\r\n if (typeof window === 'undefined') {\r\n return null\r\n }\r\n\r\n try {\r\n return localStorage.getItem(STORAGE_KEY_RADIUS)\r\n } catch (error) {\r\n console.warn('Failed to read radius from localStorage:', error)\r\n return null\r\n }\r\n}\r\n\r\n/**\r\n * Store radius preference\r\n */\r\nexport function storeRadius(radius: string): void {\r\n if (typeof window === 'undefined') {\r\n return\r\n }\r\n\r\n try {\r\n localStorage.setItem(STORAGE_KEY_RADIUS, radius)\r\n } catch (error) {\r\n console.warn('Failed to store radius in localStorage:', error)\r\n }\r\n}\r\n\r\n/**\r\n * Get stored custom theme (imported theme)\r\n */\r\nexport function getStoredCustomTheme(): unknown {\r\n if (typeof window === 'undefined') {\r\n return null\r\n }\r\n\r\n try {\r\n const stored = localStorage.getItem(STORAGE_KEY_CUSTOM_THEME)\r\n if (!stored) return null\r\n return JSON.parse(stored)\r\n } catch (error) {\r\n console.warn('Failed to read custom theme from localStorage:', error)\r\n return null\r\n }\r\n}\r\n\r\n/**\r\n * Store custom theme (imported theme)\r\n */\r\nexport function storeCustomTheme(theme: unknown): void {\r\n if (typeof window === 'undefined') {\r\n return\r\n }\r\n\r\n try {\r\n localStorage.setItem(STORAGE_KEY_CUSTOM_THEME, JSON.stringify(theme))\r\n } catch (error) {\r\n console.warn('Failed to store custom theme in localStorage:', error)\r\n }\r\n}\r\n\r\n/**\r\n * Clear all stored theme preferences\r\n */\r\nexport function clearStoredTheme(): void {\r\n if (typeof window === 'undefined') {\r\n return\r\n }\r\n\r\n try {\r\n localStorage.removeItem(STORAGE_KEY_THEME)\r\n localStorage.removeItem(STORAGE_KEY_RADIUS)\r\n localStorage.removeItem(STORAGE_KEY_CUSTOM_THEME)\r\n } catch (error) {\r\n console.warn('Failed to clear theme preferences from localStorage:', error)\r\n }\r\n}\r\n","/**\r\n * Debounce utility for theme changes\r\n * Prevents excessive updates during rapid changes\r\n */\r\n\r\nexport function debounce<T extends (...args: any[]) => void>(\r\n func: T,\r\n wait: number\r\n): (...args: Parameters<T>) => void {\r\n let timeout: ReturnType<typeof setTimeout> | null = null\r\n\r\n return function executedFunction(...args: Parameters<T>) {\r\n const later = () => {\r\n timeout = null\r\n func(...args)\r\n }\r\n\r\n if (timeout) {\r\n clearTimeout(timeout)\r\n }\r\n timeout = setTimeout(later, wait)\r\n }\r\n}\r\n","/**\r\n * Validation utilities for theme values\r\n * Follows CONTRIBUTING.md: defensive programming, error handling\r\n */\r\n\r\nexport interface ValidationResult {\r\n isValid: boolean\r\n error?: string\r\n}\r\n\r\n/**\r\n * Validate HSL adjustment values\r\n */\r\nexport function validateHSLValue(value: string, type: 'hue' | 'saturation' | 'lightness'): ValidationResult {\r\n if (!value || value.trim() === '') {\r\n return { isValid: true } // Empty is allowed (will use default)\r\n }\r\n\r\n const numValue = parseFloat(value)\r\n \r\n if (isNaN(numValue)) {\r\n return {\r\n isValid: false,\r\n error: `${type} must be a number`\r\n }\r\n }\r\n\r\n if (type === 'hue') {\r\n // Hue can be any number (degrees, can be negative or > 360)\r\n return { isValid: true }\r\n }\r\n\r\n if (type === 'saturation' || type === 'lightness') {\r\n // Multipliers should typically be positive, but allow 0\r\n if (numValue < 0) {\r\n return {\r\n isValid: false,\r\n error: `${type} multiplier cannot be negative`\r\n }\r\n }\r\n return { isValid: true }\r\n }\r\n\r\n return { isValid: true }\r\n}\r\n\r\n/**\r\n * Validate color value (hex, rgb, hsl, oklch, etc.)\r\n */\r\nexport function validateColorValue(value: string): ValidationResult {\r\n if (!value || value.trim() === '') {\r\n return {\r\n isValid: false,\r\n error: 'Color value cannot be empty'\r\n }\r\n }\r\n\r\n const trimmed = value.trim()\r\n\r\n // Check for valid color formats\r\n const hexPattern = /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/\r\n const rgbPattern = /^rgb\\((\\d+),\\s*(\\d+),\\s*(\\d+)\\)$/\r\n const rgbaPattern = /^rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)(?:,\\s*[\\d.]+)?\\)$/\r\n const hslPattern = /^hsl\\((\\d+),\\s*(\\d+)%,\\s*(\\d+)%\\)$/\r\n const hslaPattern = /^hsla?\\((\\d+),\\s*(\\d+)%,\\s*(\\d+)%(?:,\\s*[\\d.]+)?\\)$/\r\n const oklchPattern = /^oklch\\([\\d.]+%?\\s+[\\d.]+\\s+[\\d.]+\\)$/\r\n const cssVarPattern = /^var\\(--[\\w-]+\\)$/\r\n\r\n if (\r\n hexPattern.test(trimmed) ||\r\n rgbPattern.test(trimmed) ||\r\n rgbaPattern.test(trimmed) ||\r\n hslPattern.test(trimmed) ||\r\n hslaPattern.test(trimmed) ||\r\n oklchPattern.test(trimmed) ||\r\n cssVarPattern.test(trimmed) ||\r\n trimmed === 'transparent' ||\r\n trimmed === 'currentColor'\r\n ) {\r\n return { isValid: true }\r\n }\r\n\r\n return {\r\n isValid: false,\r\n error: 'Invalid color format. Use hex (#ffffff), rgb(), hsl(), or oklch()'\r\n }\r\n}\r\n\r\n/**\r\n * Validate radius value\r\n */\r\nexport function validateRadiusValue(value: string): ValidationResult {\r\n if (!value || value.trim() === '') {\r\n return {\r\n isValid: false,\r\n error: 'Radius value cannot be empty'\r\n }\r\n }\r\n\r\n const trimmed = value.trim()\r\n \r\n // Check for valid CSS length units\r\n const lengthPattern = /^[\\d.]+(px|rem|em|ch|ex|vh|vw|vmin|vmax|%)$/\r\n const zeroPattern = /^0(px|rem|em)?$/\r\n\r\n if (lengthPattern.test(trimmed) || zeroPattern.test(trimmed)) {\r\n const numValue = parseFloat(trimmed)\r\n if (numValue < 0) {\r\n return {\r\n isValid: false,\r\n error: 'Radius cannot be negative'\r\n }\r\n }\r\n return { isValid: true }\r\n }\r\n\r\n return {\r\n isValid: false,\r\n error: 'Invalid radius format. Use CSS length units (e.g., 0.5rem, 8px)'\r\n }\r\n}\r\n\r\n/**\r\n * Validate spacing value\r\n */\r\nexport function validateSpacingValue(value: string): ValidationResult {\r\n if (!value || value.trim() === '') {\r\n return { isValid: true } // Empty is allowed\r\n }\r\n\r\n const trimmed = value.trim()\r\n const lengthPattern = /^[\\d.]+(px|rem|em|ch|ex|vh|vw|vmin|vmax|%)$/\r\n const zeroPattern = /^0(px|rem|em)?$/\r\n\r\n if (lengthPattern.test(trimmed) || zeroPattern.test(trimmed)) {\r\n const numValue = parseFloat(trimmed)\r\n if (numValue < 0) {\r\n return {\r\n isValid: false,\r\n error: 'Spacing cannot be negative'\r\n }\r\n }\r\n return { isValid: true }\r\n }\r\n\r\n return {\r\n isValid: false,\r\n error: 'Invalid spacing format. Use CSS length units (e.g., 0.25rem, 4px)'\r\n }\r\n}\r\n\r\n/**\r\n * Validate shadow value (opacity, blur, spread, offset)\r\n */\r\nexport function validateShadowValue(value: string, type: 'opacity' | 'blur' | 'spread' | 'offset'): ValidationResult {\r\n if (!value || value.trim() === '') {\r\n return { isValid: true } // Empty is allowed\r\n }\r\n\r\n const trimmed = value.trim()\r\n\r\n if (type === 'opacity') {\r\n const numValue = parseFloat(trimmed)\r\n if (isNaN(numValue)) {\r\n return {\r\n isValid: false,\r\n error: 'Opacity must be a number'\r\n }\r\n }\r\n if (numValue < 0 || numValue > 1) {\r\n return {\r\n isValid: false,\r\n error: 'Opacity must be between 0 and 1'\r\n }\r\n }\r\n return { isValid: true }\r\n }\r\n\r\n // For blur, spread, offset - check for CSS length units\r\n const lengthPattern = /^[\\d.]+(px|rem|em|ch|ex|vh|vw|vmin|vmax|%)$/\r\n const zeroPattern = /^0(px|rem|em)?$/\r\n\r\n if (lengthPattern.test(trimmed) || zeroPattern.test(trimmed)) {\r\n return { isValid: true }\r\n }\r\n\r\n return {\r\n isValid: false,\r\n error: `Invalid ${type} format. Use CSS length units (e.g., 3px, 0.5rem)`\r\n }\r\n}\r\n\r\n/**\r\n * Validate imported theme structure\r\n */\r\nexport function validateImportedTheme(theme: unknown): ValidationResult {\r\n if (!theme || typeof theme !== 'object') {\r\n return {\r\n isValid: false,\r\n error: 'Theme must be an object'\r\n }\r\n }\r\n\r\n const themeObj = theme as Record<string, unknown>\r\n\r\n if (!themeObj.light || typeof themeObj.light !== 'object') {\r\n return {\r\n isValid: false,\r\n error: 'Theme must have a \"light\" property with an object'\r\n }\r\n }\r\n\r\n if (!themeObj.dark || typeof themeObj.dark !== 'object') {\r\n return {\r\n isValid: false,\r\n error: 'Theme must have a \"dark\" property with an object'\r\n }\r\n }\r\n\r\n const light = themeObj.light as Record<string, unknown>\r\n const dark = themeObj.dark as Record<string, unknown>\r\n\r\n // Check for required color variables\r\n const requiredVars = ['background', 'foreground', 'primary', 'primary-foreground']\r\n \r\n for (const varName of requiredVars) {\r\n if (!light[varName] || typeof light[varName] !== 'string') {\r\n return {\r\n isValid: false,\r\n error: `Missing required variable in light theme: ${varName}`\r\n }\r\n }\r\n \r\n const colorValidation = validateColorValue(light[varName] as string)\r\n if (!colorValidation.isValid) {\r\n return {\r\n isValid: false,\r\n error: `Invalid color value for ${varName} in light theme: ${colorValidation.error}`\r\n }\r\n }\r\n }\r\n\r\n for (const varName of requiredVars) {\r\n if (!dark[varName] || typeof dark[varName] !== 'string') {\r\n return {\r\n isValid: false,\r\n error: `Missing required variable in dark theme: ${varName}`\r\n }\r\n }\r\n \r\n const colorValidation = validateColorValue(dark[varName] as string)\r\n if (!colorValidation.isValid) {\r\n return {\r\n isValid: false,\r\n error: `Invalid color value for ${varName} in dark theme: ${colorValidation.error}`\r\n }\r\n }\r\n }\r\n\r\n return { isValid: true }\r\n}\r\n\r\nexport function validateCustomThemeArtifact(theme: unknown): ValidationResult {\r\n if (!theme || typeof theme !== 'object') {\r\n return { isValid: false, error: 'Custom theme must be an object' }\r\n }\r\n\r\n const t = theme as Record<string, unknown>\r\n if (t.version !== 1) {\r\n return { isValid: false, error: 'Custom theme must have version: 1' }\r\n }\r\n if (!t.name || typeof t.name !== 'string') {\r\n return { isValid: false, error: 'Custom theme must have a name' }\r\n }\r\n if (!t.base || typeof t.base !== 'object') {\r\n return { isValid: false, error: 'Custom theme must have a base' }\r\n }\r\n\r\n const base = t.base as Record<string, unknown>\r\n const baseType = base.type\r\n if (baseType !== 'preset' && baseType !== 'imported') {\r\n return { isValid: false, error: 'Custom theme base.type must be \"preset\" or \"imported\"' }\r\n }\r\n if (baseType === 'preset') {\r\n if (!base.value || typeof base.value !== 'string') {\r\n return { isValid: false, error: 'Custom theme base.value must be a string' }\r\n }\r\n } else {\r\n if (!base.theme || typeof base.theme !== 'object') {\r\n return { isValid: false, error: 'Custom theme base.theme must be an object' }\r\n }\r\n const importedValidation = validateImportedTheme(base.theme)\r\n if (!importedValidation.isValid) {\r\n return importedValidation\r\n }\r\n }\r\n\r\n if (!t.overrides || typeof t.overrides !== 'object') {\r\n return { isValid: false, error: 'Custom theme must have overrides' }\r\n }\r\n\r\n const overrides = t.overrides as Record<string, unknown>\r\n const maybeMaps: Array<['light' | 'dark' | 'other', unknown]> = [\r\n ['light', overrides.light],\r\n ['dark', overrides.dark],\r\n ['other', overrides.other],\r\n ]\r\n\r\n for (const [key, val] of maybeMaps) {\r\n if (val == null) continue\r\n if (typeof val !== 'object') {\r\n return { isValid: false, error: `Custom theme overrides.${key} must be an object` }\r\n }\r\n for (const [k, v] of Object.entries(val as Record<string, unknown>)) {\r\n if (typeof v !== 'string') {\r\n return { isValid: false, error: `Custom theme overrides.${key}.${k} must be a string` }\r\n }\r\n }\r\n }\r\n\r\n return { isValid: true }\r\n}\r\n","\"use client\"\r\n\r\nimport React from 'react'\r\nimport { Settings, X } from 'lucide-react'\r\nimport { Button } from '../ui'\r\nimport { useThemeManager } from '../../theme/use-theme-manager'\r\nimport { ThemeTab } from './theme-tab'\r\nimport { LayoutTab } from './layout-tab'\r\nimport { OtherPanel } from './other-panel'\r\nimport { ImportModal } from './import-modal'\r\nimport type { ImportedTheme } from '../../theme/types'\r\n\r\n/** Section when used under Colors / Typography / Others tabs (like tweakcn). No Theme/Layout tabs. */\r\nexport type ThemeCustomizerSection = 'colors' | 'typography' | 'others'\r\n\r\ninterface ThemeCustomizerProps {\r\n open: boolean\r\n onOpenChange: (open: boolean) => void\r\n /** When true, render as inline content (no fixed overlay/backdrop). Use in sidebar layout. */\r\n inline?: boolean\r\n /** When true, hide the internal header (Customizer title + Reset). Use when the host provides its own top bar. */\r\n hideHeader?: boolean\r\n /** When set (e.g. by theme sidebar), render only this section. Theme/Layout tabs are removed; content lives under Colors, Typography, Others. */\r\n section?: ThemeCustomizerSection\r\n /** When true, preset selector is in parent header; Colors section won't show preset (avoid duplicate). */\r\n presetInHeader?: boolean\r\n /** Controlled preset (when preset is in parent header). */\r\n selectedTheme?: string\r\n setSelectedTheme?: (value: string) => void\r\n // Optional: Pass sidebar config if you have sidebar state management\r\n sidebarConfig?: {\r\n variant?: \"sidebar\" | \"floating\" | \"inset\";\r\n collapsible?: \"offcanvas\" | \"icon\" | \"none\";\r\n side?: \"left\" | \"right\";\r\n };\r\n onSidebarConfigChange?: (config: {\r\n variant?: \"sidebar\" | \"floating\" | \"inset\";\r\n collapsible?: \"offcanvas\" | \"icon\" | \"none\";\r\n side?: \"left\" | \"right\";\r\n }) => void;\r\n /** When true, Import is not shown inside Others tab (e.g. when host provides Import in top bar). */\r\n hideImportInOthers?: boolean;\r\n /** When true, Layout (Sidebar Variant / Collapsible / Position) is not shown in Others tab. */\r\n hideLayoutSection?: boolean;\r\n}\r\n\r\nexport function ThemeCustomizer({ \r\n open, \r\n onOpenChange,\r\n inline = false,\r\n hideHeader = false,\r\n section: sectionProp,\r\n presetInHeader = false,\r\n selectedTheme: selectedThemeProp,\r\n setSelectedTheme: setSelectedThemeProp,\r\n sidebarConfig,\r\n onSidebarConfigChange,\r\n hideImportInOthers = false,\r\n hideLayoutSection = false,\r\n}: ThemeCustomizerProps) {\r\n const { applyImportedTheme, isDarkMode, resetTheme, applyRadius, setBrandColorsValues, applyTheme } = useThemeManager()\r\n\r\n const [internalTheme, setInternalTheme] = React.useState(\"mindtris-ui\")\r\n const selectedTheme = selectedThemeProp ?? internalTheme\r\n const setSelectedTheme = setSelectedThemeProp ?? setInternalTheme\r\n const [selectedRadius, setSelectedRadius] = React.useState(\"0.5rem\")\r\n const [importModalOpen, setImportModalOpen] = React.useState(false)\r\n const [importedTheme, setImportedTheme] = React.useState<ImportedTheme | null>(null)\r\n\r\n const handleReset = () => {\r\n // Complete reset to application defaults\r\n setSelectedTheme(\"mindtris-ui\")\r\n setSelectedRadius(\"0.5rem\")\r\n setImportedTheme(null)\r\n setBrandColorsValues({})\r\n resetTheme()\r\n applyRadius(\"0.5rem\")\r\n }\r\n\r\n const handleImport = (themeData: ImportedTheme) => {\r\n setImportedTheme(themeData)\r\n setSelectedTheme(\"\")\r\n applyImportedTheme(themeData, isDarkMode)\r\n }\r\n\r\n // Re-apply themes when theme mode changes\r\n React.useEffect(() => {\r\n if (importedTheme) {\r\n applyImportedTheme(importedTheme, isDarkMode)\r\n } else if (selectedTheme) {\r\n applyTheme(selectedTheme, isDarkMode)\r\n }\r\n }, [isDarkMode, importedTheme, selectedTheme, applyImportedTheme, applyTheme])\r\n\r\n // Apply initial theme and radius on mount so preview reflects defaults\r\n React.useEffect(() => {\r\n if (importedTheme) {\r\n applyImportedTheme(importedTheme, isDarkMode)\r\n } else {\r\n applyTheme(selectedTheme, isDarkMode)\r\n }\r\n applyRadius(selectedRadius)\r\n }, []) // eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n if (!open && !inline) return null\r\n\r\n const content = (\r\n <div\r\n className={\r\n inline\r\n ? 'flex flex-col h-full'\r\n : 'fixed inset-y-0 right-0 z-50 w-96 bg-card text-card-foreground border-l border-border shadow-lg flex flex-col'\r\n }\r\n >\r\n {/* Header (hidden when hideHeader or when host provides its own) */}\r\n {!hideHeader && (\r\n <div className=\"p-4 border-b border-border\">\r\n <div className=\"flex items-center gap-2\">\r\n <div className=\"p-2 bg-primary/10 rounded-lg\">\r\n <Settings className=\"w-4 h-4 text-primary\" />\r\n </div>\r\n <h2 className=\"text-lg font-semibold\">Customizer</h2>\r\n <div className=\"ml-auto flex items-center gap-2\">\r\n <Button variant=\"ghost\" size=\"sm\" onClick={handleReset}>\r\n Reset\r\n </Button>\r\n {!inline && (\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n onClick={() => onOpenChange(false)}\r\n className=\"p-1.5\"\r\n aria-label=\"Close\"\r\n tooltip=\"Close\"\r\n >\r\n <X className=\"w-4 h-4\" />\r\n </Button>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Content — no Theme/Layout tabs; section comes from parent (Colors, Typography, Others) */}\r\n <div className=\"flex-1 overflow-y-auto min-h-0\">\r\n {sectionProp === 'colors' && (\r\n <ThemeTab\r\n selectedTheme={selectedTheme}\r\n setSelectedTheme={setSelectedTheme}\r\n selectedRadius={selectedRadius}\r\n setSelectedRadius={setSelectedRadius}\r\n setImportedTheme={setImportedTheme}\r\n onImportClick={() => setImportModalOpen(true)}\r\n variant=\"colors-only\"\r\n hidePreset={presetInHeader}\r\n />\r\n )}\r\n {sectionProp === 'others' && (\r\n <div className=\"px-3 pt-2 pb-4\">\r\n <OtherPanel\r\n selectedRadius={selectedRadius}\r\n setSelectedRadius={setSelectedRadius}\r\n onImportClick={hideImportInOthers ? undefined : () => setImportModalOpen(true)}\r\n hideLayoutSection={hideLayoutSection}\r\n sidebarConfig={sidebarConfig}\r\n onSidebarConfigChange={onSidebarConfigChange}\r\n />\r\n </div>\r\n )}\r\n {!sectionProp && (\r\n <>\r\n <ThemeTab\r\n selectedTheme={selectedTheme}\r\n setSelectedTheme={setSelectedTheme}\r\n selectedRadius={selectedRadius}\r\n setSelectedRadius={setSelectedRadius}\r\n setImportedTheme={setImportedTheme}\r\n onImportClick={() => setImportModalOpen(true)}\r\n variant=\"full\"\r\n />\r\n <div className=\"border-t border-border\" />\r\n <LayoutTab\r\n sidebarConfig={sidebarConfig}\r\n onSidebarConfigChange={onSidebarConfigChange}\r\n />\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n )\r\n\r\n return (\r\n <>\r\n {content}\r\n {!inline && (\r\n <div\r\n className=\"fixed inset-0 bg-foreground/20 z-40\"\r\n onClick={() => onOpenChange(false)}\r\n />\r\n )}\r\n {!hideImportInOthers && (\r\n <ImportModal\r\n open={importModalOpen}\r\n onOpenChange={setImportModalOpen}\r\n onImport={handleImport}\r\n />\r\n )}\r\n </>\r\n )\r\n}\r\n","/**\r\n * Button: Displays a button or a component that looks like a button.\r\n *\r\n * Design-system contract\r\n * - Scope: UI-only primitive (2-app rule). No domain terms, no API calls.\r\n * - Tokens-only: no Tailwind palette colors; use semantic token classes only.\r\n * - One source of truth: variants/sizes via `createVariants(...)`.\r\n * - A11y: icon-only requires `aria-label`; `isLoading` => `aria-busy` + disabled.\r\n * - Disabled: native `disabled` for `<button>`; emulate for `render` targets (`aria-disabled`, `tabIndex=-1`, prevent click).\r\n * - API: `size` supports text (`default|xs|sm|md|lg|xl`) + icon (`icon|icon-...`) sizes; `render` enables Link-as-button.\r\n * - Motion: spinner respects `prefers-reduced-motion`.\r\n *\r\n * @author: @mindtris-team\r\n * @version: 1.0.0\r\n * @since: 2026-01-31\r\n *\r\n * @example\r\n * <Button variant=\"primary\" size=\"md\" isLoading={true} fullWidth={true} leadingIcon={<Icon name=\"plus\" />} trailingIcon={<Icon name=\"minus\" />} iconOnly={true} tooltip=\"Add item\" render={<Link href=\"/items\">Items</Link>} />\r\n */\r\n\r\n\r\n\"use client\"\r\n\r\nimport React from 'react'\r\nimport { ChevronRight, Loader2 } from 'lucide-react'\r\nimport { cn } from '../../lib/utils'\r\nimport { createVariants } from '../../lib/variant-utils'\r\nimport { usePrefersReducedMotion } from '../../hooks/use-prefers-reduced-motion'\r\nimport { Tooltip, TooltipContent, TooltipTrigger } from './tooltip'\r\n\r\nexport type ButtonVariant =\r\n | 'primary'\r\n | 'secondary'\r\n | 'tertiary'\r\n | 'outline'\r\n | 'outline-strong'\r\n | 'ghost'\r\n | 'link'\r\n | 'menu'\r\n | 'icon'\r\n | 'icon-ghost'\r\n | 'danger'\r\n | 'danger-outline'\r\n | 'destructive'\r\n | 'destructive-outline'\r\n\r\nexport type ButtonTextSize = 'default' | 'xs' | 'sm' | 'md' | 'lg' | 'xl'\r\nexport type ButtonIconSize = 'icon' | 'icon-xs' | 'icon-sm' | 'icon-md' | 'icon-lg' | 'icon-xl'\r\nexport type ButtonSize = ButtonTextSize | ButtonIconSize\r\nexport type ButtonWeight = 'default' | 'strong'\r\nexport type ButtonAlign = 'left' | 'center' | 'right' | 'between'\r\nexport type ButtonMotion = 'none' | 'lift'\r\nexport type ButtonShape = 'rounded' | 'pill'\r\n\r\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\r\n variant?: ButtonVariant\r\n size?: ButtonSize\r\n weight?: ButtonWeight\r\n /** Controls horizontal alignment of button content (best paired with `fullWidth`). */\r\n align?: ButtonAlign\r\n /** Controls the button corner shape. */\r\n shape?: ButtonShape\r\n /** Subtle interaction motion (respects prefers-reduced-motion). */\r\n motion?: ButtonMotion\r\n isLoading?: boolean\r\n fullWidth?: boolean\r\n /** Adds a chevron and animates it on hover (like “Learn more →”). */\r\n arrowIcon?: boolean\r\n leadingIcon?: React.ReactNode\r\n trailingIcon?: React.ReactNode\r\n /** Forces icon-only layout (square button). Also implied by `variant=\"icon\"`. */\r\n iconOnly?: boolean\r\n tooltip?: string\r\n /**\r\n * Render as another element (e.g. `next/link`), while preserving button styles.\r\n *\r\n * Similar intent to coss's `render` prop.\r\n */\r\n render?: React.ReactElement<any>\r\n}\r\n\r\n/**\r\n * Button\r\n * Uses semantic CSS variables (design tokens) for theme-aware styling.\r\n * Colors automatically adapt when themes change.\r\n */\r\nconst baseClasses =\r\n 'text-sm inline-flex items-center border border-transparent leading-5 shadow-sm transition-colors duration-[var(--duration-base)] ease-[var(--ease-out)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring cursor-pointer data-[disabled=true]:cursor-not-allowed data-[loading=true]:cursor-not-allowed'\r\n\r\nconst buttonVariants = createVariants({\r\n base: [\r\n baseClasses,\r\n // Only apply \"disabled\" visuals when explicitly disabled (not when loading).\r\n 'data-[disabled=true]:border-border data-[disabled=true]:bg-card data-[disabled=true]:text-muted-foreground data-[disabled=true]:shadow-none',\r\n // Loading should keep variant colors, but look inert.\r\n 'data-[loading=true]:shadow-none data-[loading=true]:opacity-90',\r\n ],\r\n variants: {\r\n variant: {\r\n primary: 'bg-primary text-primary-foreground hover:bg-primary/90',\r\n secondary: 'bg-secondary text-secondary-foreground border-border hover:bg-secondary/90',\r\n tertiary: 'bg-card border-border hover:bg-card/95 text-primary',\r\n outline: 'bg-card border border-border text-foreground shadow-none hover:bg-muted',\r\n 'outline-strong': 'bg-card border border-primary text-foreground hover:bg-muted',\r\n ghost: 'bg-transparent border-0 shadow-none text-foreground hover:bg-muted',\r\n link: 'bg-transparent border-0 shadow-none text-primary underline-offset-4 hover:underline',\r\n // Header/menu link style: shows a rounded \"box\" on hover.\r\n menu: 'bg-transparent border-0 shadow-none rounded-md text-muted-foreground hover:text-foreground hover:bg-muted',\r\n icon: 'bg-transparent border-0 shadow-none text-muted-foreground hover:text-foreground hover:bg-muted',\r\n // Icon-only, minimal: no background and no border (even on hover).\r\n 'icon-ghost': 'bg-transparent border-0 shadow-none text-muted-foreground hover:text-foreground',\r\n danger: 'bg-destructive text-destructive-foreground hover:bg-destructive/90',\r\n 'danger-outline': 'bg-card border border-border text-destructive hover:bg-muted',\r\n destructive: 'bg-destructive text-destructive-foreground hover:bg-destructive/90',\r\n 'destructive-outline': 'bg-card border border-border text-destructive hover:bg-muted',\r\n },\r\n weight: {\r\n default: 'font-medium',\r\n strong: 'font-semibold',\r\n },\r\n shape: {\r\n rounded: 'rounded-lg',\r\n pill: 'rounded-full',\r\n },\r\n align: {\r\n left: 'justify-start',\r\n center: 'justify-center',\r\n right: 'justify-end',\r\n between: 'justify-between',\r\n },\r\n size: {\r\n default: 'px-3 py-2',\r\n xs: 'px-2 py-0.5 text-xs',\r\n sm: 'px-2 py-1 text-xs',\r\n md: 'px-3 py-2',\r\n lg: 'px-4 py-3 text-base',\r\n xl: 'px-5 py-3.5 text-base',\r\n },\r\n iconSize: {\r\n xs: 'p-1.5',\r\n sm: 'p-2',\r\n md: 'p-2.5',\r\n lg: 'p-3',\r\n xl: 'p-3.5',\r\n },\r\n fullWidth: {\r\n true: 'w-full',\r\n false: '',\r\n },\r\n iconOnly: {\r\n true: 'aspect-square',\r\n false: '',\r\n },\r\n },\r\n defaultVariants: {\r\n variant: 'primary',\r\n weight: 'default',\r\n shape: 'rounded',\r\n align: 'center',\r\n size: 'default',\r\n iconSize: 'md',\r\n fullWidth: 'false',\r\n iconOnly: 'false',\r\n },\r\n})\r\n\r\nexport function Button({\r\n className,\r\n variant = 'primary',\r\n size = 'default',\r\n weight = 'default',\r\n align = 'center',\r\n shape = 'rounded',\r\n motion = 'none',\r\n isLoading = false,\r\n fullWidth = false,\r\n arrowIcon = false,\r\n leadingIcon,\r\n trailingIcon,\r\n iconOnly = false,\r\n disabled,\r\n tooltip,\r\n render,\r\n children,\r\n title: titleProp,\r\n ...props\r\n}: ButtonProps) {\r\n const prefersReducedMotion = usePrefersReducedMotion()\r\n const isExplicitlyDisabled = Boolean(disabled)\r\n const isDisabled = isExplicitlyDisabled || isLoading\r\n const showLeadingIcon = Boolean(leadingIcon && !isLoading)\r\n const resolvedTrailingIcon =\r\n !isLoading && arrowIcon && !trailingIcon ? <ChevronRight className=\"h-4 w-4\" aria-hidden /> : trailingIcon\r\n const showTrailingIcon = Boolean(resolvedTrailingIcon && !isLoading)\r\n const isIconSize = size === 'icon' || size.startsWith('icon-')\r\n const isIconOnly = iconOnly || variant === 'icon' || isIconSize\r\n\r\n const ariaLabelProp = props['aria-label']\r\n if (process.env.NODE_ENV !== 'production') {\r\n // For icon buttons, require an accessible name (aria-label) unless visible text exists.\r\n // Note: if the caller passes an icon element, `children` won't be a string.\r\n if (isIconOnly && !ariaLabelProp && typeof children !== 'string') {\r\n // eslint-disable-next-line no-console\r\n console.warn(\r\n '[Button] Icon-only buttons should include an `aria-label` for accessibility.'\r\n )\r\n }\r\n }\r\n\r\n const resolveTextSize = (): ButtonTextSize => {\r\n if (isIconSize) return 'default'\r\n return size as ButtonTextSize\r\n }\r\n\r\n const resolveIconSize = (): 'xs' | 'sm' | 'md' | 'lg' | 'xl' => {\r\n switch (size) {\r\n case 'icon-xs':\r\n return 'xs'\r\n case 'icon-sm':\r\n return 'sm'\r\n case 'icon-md':\r\n case 'icon':\r\n return 'md'\r\n case 'icon-lg':\r\n return 'lg'\r\n case 'icon-xl':\r\n return 'xl'\r\n default:\r\n // Back-compat: if caller uses regular sizes with `variant=\"icon\"` / `iconOnly`\r\n if (size === 'xs' || size === 'sm' || size === 'md' || size === 'lg' || size === 'xl') {\r\n return size\r\n }\r\n return 'md'\r\n }\r\n }\r\n\r\n const computedClassName = cn(\r\n buttonVariants({\r\n variant,\r\n weight,\r\n shape,\r\n align,\r\n size: isIconOnly ? undefined : resolveTextSize(),\r\n iconSize: isIconOnly ? resolveIconSize() : undefined,\r\n iconOnly: isIconOnly ? 'true' : 'false',\r\n fullWidth: fullWidth && !isIconOnly ? 'true' : 'false',\r\n }),\r\n arrowIcon && 'group',\r\n motion === 'lift' &&\r\n !prefersReducedMotion &&\r\n 'transition-transform duration-[var(--duration-fast)] ease-[var(--ease-out)] hover:-translate-y-0.5 active:translate-y-0',\r\n className,\r\n (render?.props as any)?.className\r\n )\r\n\r\n const content = (\r\n <>\r\n {isLoading && (\r\n <Loader2\r\n className={cn('h-4 w-4 shrink-0', !prefersReducedMotion && 'animate-spin')}\r\n aria-hidden\r\n />\r\n )}\r\n {showLeadingIcon && <span className=\"shrink-0\">{leadingIcon}</span>}\r\n {children != null && !isIconOnly && (\r\n <span\r\n className={cn(\r\n (isLoading || showLeadingIcon) && 'ml-2',\r\n showTrailingIcon && 'mr-2'\r\n )}\r\n >\r\n {children}\r\n </span>\r\n )}\r\n {isIconOnly && !isLoading && !showLeadingIcon && !showTrailingIcon && children}\r\n {showTrailingIcon && (\r\n <span\r\n className={cn(\r\n 'shrink-0',\r\n arrowIcon &&\r\n !prefersReducedMotion &&\r\n 'transition-all duration-[var(--duration-fast)] ease-[var(--ease-out)] opacity-0 translate-x-[-2px] group-hover:opacity-100 group-hover:translate-x-0.5 group-focus-visible:opacity-100 group-focus-visible:translate-x-0.5'\r\n )}\r\n >\r\n {resolvedTrailingIcon}\r\n </span>\r\n )}\r\n </>\r\n )\r\n\r\n // Render-as-another-element path (e.g. Link)\r\n if (render) {\r\n const renderProps: Record<string, any> = {\r\n ...(render.props as any),\r\n ...(props as any),\r\n className: computedClassName,\r\n // Avoid native tooltips when `tooltip` is provided.\r\n title: tooltip ? undefined : titleProp ?? (render.props as any)?.title,\r\n 'aria-busy': isLoading || undefined,\r\n 'data-loading': isLoading ? 'true' : 'false',\r\n 'data-disabled': isExplicitlyDisabled ? 'true' : 'false',\r\n children: content,\r\n }\r\n\r\n // Disabled handling for non-<button> render targets\r\n if (isDisabled) {\r\n renderProps['aria-disabled'] = true\r\n renderProps['data-disabled'] = true\r\n renderProps['tabIndex'] = -1\r\n\r\n renderProps['onClick'] = (event: any) => {\r\n event?.preventDefault?.()\r\n event?.stopPropagation?.()\r\n return\r\n }\r\n } else {\r\n // Merge onClick handlers if both exist.\r\n const existingOnClick = (render.props as any)?.onClick\r\n const userOnClick = (props as any)?.onClick\r\n if (existingOnClick || userOnClick) {\r\n renderProps['onClick'] = (event: any) => {\r\n existingOnClick?.(event)\r\n userOnClick?.(event)\r\n }\r\n }\r\n }\r\n\r\n // aria-label handling\r\n if (!ariaLabelProp && isIconOnly && typeof children === 'string') {\r\n renderProps['aria-label'] = children\r\n }\r\n\r\n const element = React.cloneElement(render, renderProps)\r\n\r\n if (tooltip && !isDisabled) {\r\n return (\r\n <Tooltip>\r\n <TooltipTrigger asChild>{element}</TooltipTrigger>\r\n <TooltipContent sideOffset={6}>{tooltip}</TooltipContent>\r\n </Tooltip>\r\n )\r\n }\r\n\r\n return element\r\n }\r\n\r\n const buttonElement = (\r\n <button\r\n type={props.type ?? 'button'}\r\n className={computedClassName}\r\n disabled={isDisabled}\r\n aria-busy={isLoading || undefined}\r\n data-loading={isLoading ? 'true' : 'false'}\r\n data-disabled={isExplicitlyDisabled ? 'true' : 'false'}\r\n aria-label={isIconOnly && typeof children === 'string' ? children : undefined}\r\n title={tooltip ? undefined : titleProp}\r\n {...props}\r\n >\r\n {content}\r\n </button>\r\n )\r\n\r\n if (tooltip && !isDisabled) {\r\n return (\r\n <Tooltip>\r\n <TooltipTrigger asChild>{buttonElement}</TooltipTrigger>\r\n <TooltipContent sideOffset={6}>{tooltip}</TooltipContent>\r\n </Tooltip>\r\n )\r\n }\r\n\r\n return buttonElement\r\n}\r\n","\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\"\r\n\r\nimport { cn } from \"../../lib/utils\"\r\n\r\nexport type TooltipProviderProps = React.ComponentProps<typeof TooltipPrimitive.Provider>\r\nexport type TooltipProps = React.ComponentProps<typeof TooltipPrimitive.Root>\r\nexport type TooltipTriggerProps = React.ComponentProps<typeof TooltipPrimitive.Trigger>\r\nexport type TooltipVariant = \"default\" | \"primary\" | \"secondary\" | \"tertiary\"\r\nexport type TooltipContentProps = React.ComponentProps<typeof TooltipPrimitive.Content> & {\r\n /**\r\n * Visual variant for token-driven tooltip colors.\r\n * Use `className` for fine-grained tweaks (e.g. max-width, whitespace).\r\n */\r\n variant?: TooltipVariant\r\n}\r\n\r\nfunction TooltipProvider({\r\n delayDuration = 0,\r\n ...props\r\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\r\n return (\r\n <TooltipPrimitive.Provider\r\n data-slot=\"tooltip-provider\"\r\n delayDuration={delayDuration}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nfunction Tooltip({\r\n ...props\r\n}: React.ComponentProps<typeof TooltipPrimitive.Root>) {\r\n return (\r\n <TooltipProvider>\r\n <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\r\n </TooltipProvider>\r\n )\r\n}\r\n\r\nfunction TooltipTrigger({\r\n ...props\r\n}: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\r\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />\r\n}\r\n\r\nfunction TooltipContent({\r\n className,\r\n sideOffset = 0,\r\n variant = \"default\",\r\n children,\r\n ...props\r\n}: TooltipContentProps) {\r\n const variantClasses: Record<TooltipVariant, string> = {\r\n default: \"bg-foreground text-background\",\r\n primary: \"bg-primary text-primary-foreground\",\r\n secondary: \"bg-secondary text-secondary-foreground\",\r\n // For tertiary, add a border so it reads on light themes.\r\n tertiary: \"bg-card text-foreground border border-border\",\r\n }\r\n\r\n const arrowVariantClasses: Record<TooltipVariant, string> = {\r\n default: \"bg-foreground fill-foreground\",\r\n primary: \"bg-primary fill-primary\",\r\n secondary: \"bg-secondary fill-secondary\",\r\n tertiary: \"bg-card fill-card\",\r\n }\r\n\r\n return (\r\n <TooltipPrimitive.Portal>\r\n <TooltipPrimitive.Content\r\n data-slot=\"tooltip-content\"\r\n sideOffset={sideOffset}\r\n className={cn(\r\n \"shadow-lg animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-[9999] w-fit origin-[--radix-tooltip-content-transform-origin] rounded-lg px-3 py-2 text-xs leading-5 whitespace-nowrap\",\r\n variantClasses[variant],\r\n className\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n {/* Shadcn-style rotated-square arrow (no seam). */}\r\n <TooltipPrimitive.Arrow\r\n className={cn(\r\n \"z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]\",\r\n arrowVariantClasses[variant]\r\n )}\r\n />\r\n </TooltipPrimitive.Content>\r\n </TooltipPrimitive.Portal>\r\n )\r\n}\r\n\r\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\r\n\r\n","/**\r\n * ButtonGroup: Visually groups buttons into a segmented control.\r\n *\r\n * Design-system contract\r\n * - Scope: UI-only primitive (2-app rule). No domain terms, no API calls.\r\n * - Tokens-only: no Tailwind palette colors; use semantic token classes only.\r\n * - Composition: uses a Group + Item pattern (like shadcn ToggleGroup) to keep Button API intact.\r\n * - A11y: relies on underlying Button semantics. Use `aria-label` for icon-only items.\r\n *\r\n * Reference: shadcn dashboard template `toggle-group.tsx` pattern (context + first/last rounding).\r\n *\r\n * @author: @mindtris-team\r\n * @version: 0.1.0\r\n * @since: 2026-02-01\r\n */\r\n\r\n\"use client\"\r\n\r\nimport * as React from 'react'\r\nimport { cn } from '../../lib/utils'\r\nimport type { ButtonProps, ButtonSize, ButtonVariant } from './button'\r\nimport { Button } from './button'\r\n\r\nexport type ButtonGroupOrientation = 'horizontal' | 'vertical'\r\n\r\ntype ButtonGroupContextValue = {\r\n variant?: ButtonVariant\r\n size?: ButtonSize\r\n orientation: ButtonGroupOrientation\r\n withSeparator: boolean\r\n}\r\n\r\nconst ButtonGroupContext = React.createContext<ButtonGroupContextValue>({\r\n orientation: 'horizontal',\r\n withSeparator: true,\r\n})\r\n\r\nexport interface ButtonGroupProps extends React.HTMLAttributes<HTMLDivElement> {\r\n /** Default variant applied to `ButtonGroupItem` children. */\r\n variant?: ButtonVariant\r\n /** Default size applied to `ButtonGroupItem` children. */\r\n size?: ButtonSize\r\n orientation?: ButtonGroupOrientation\r\n /** Adds separators between items (uses `divide-*`). */\r\n withSeparator?: boolean\r\n}\r\n\r\nexport function ButtonGroup({\r\n variant,\r\n size,\r\n orientation = 'horizontal',\r\n withSeparator = true,\r\n className,\r\n children,\r\n ...props\r\n}: ButtonGroupProps) {\r\n return (\r\n <div\r\n data-slot=\"button-group\"\r\n data-orientation={orientation}\r\n className={cn(\r\n 'inline-flex w-fit overflow-hidden rounded-lg border border-border bg-card',\r\n orientation === 'vertical' ? 'flex-col' : 'flex-row',\r\n withSeparator && (orientation === 'vertical' ? 'divide-y divide-border' : 'divide-x divide-border'),\r\n className\r\n )}\r\n {...props}\r\n >\r\n <ButtonGroupContext.Provider value={{ variant, size, orientation, withSeparator }}>\r\n {children}\r\n </ButtonGroupContext.Provider>\r\n </div>\r\n )\r\n}\r\n\r\nexport interface ButtonGroupItemProps extends Omit<ButtonProps, 'shape'> {\r\n variant?: ButtonVariant\r\n size?: ButtonSize\r\n}\r\n\r\nexport function ButtonGroupItem({ className, variant, size, ...props }: ButtonGroupItemProps) {\r\n const ctx = React.useContext(ButtonGroupContext)\r\n const resolvedVariant = ctx.variant ?? variant ?? 'secondary'\r\n const resolvedSize = ctx.size ?? size\r\n\r\n const rounding =\r\n ctx.orientation === 'vertical'\r\n ? 'rounded-none first:rounded-t-lg last:rounded-b-lg'\r\n : 'rounded-none first:rounded-l-lg last:rounded-r-lg'\r\n\r\n // We remove inner borders/shadows so the group shell + separators control the visuals.\r\n // Consumers can still use outline variants; it will just appear as a grouped outline.\r\n const groupItemClasses = cn(\r\n 'border-0 shadow-none',\r\n 'focus-visible:z-10',\r\n rounding,\r\n className\r\n )\r\n\r\n return (\r\n <Button\r\n variant={resolvedVariant}\r\n size={resolvedSize}\r\n shape=\"rounded\"\r\n className={groupItemClasses}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport interface ButtonGroupSeparatorProps extends React.HTMLAttributes<HTMLDivElement> {\r\n orientation?: ButtonGroupOrientation\r\n}\r\n\r\n/**\r\n * ButtonGroupSeparator\r\n * Use when you want explicit separators (e.g. split button).\r\n * If `ButtonGroup` uses `withSeparator`, you usually don't need this.\r\n */\r\nexport function ButtonGroupSeparator({ orientation, className, ...props }: ButtonGroupSeparatorProps) {\r\n const ctx = React.useContext(ButtonGroupContext)\r\n const dir = orientation ?? ctx.orientation\r\n return (\r\n <div\r\n aria-hidden=\"true\"\r\n className={cn(\r\n 'bg-border shrink-0',\r\n dir === 'vertical' ? 'h-px w-full' : 'w-px h-full',\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\n","/**\r\n * ToggleGroup: Group of toggleable buttons (single or multiple selection).\r\n *\r\n * Design-system contract\r\n * - Scope: UI-only primitive (2-app rule). No domain terms, no API calls.\r\n * - Tokens-only: no Tailwind palette colors; use semantic token classes only.\r\n * - Controlled + uncontrolled: supports `value`/`onValueChange` or `defaultValue`.\r\n * - A11y:\r\n * - `type=\"single\"` uses `role=\"radiogroup\"` + items `role=\"radio\"` / `aria-checked`\r\n * - `type=\"multiple\"` uses `role=\"group\"` + items `aria-pressed`\r\n *\r\n * Reference: shadcn `toggle-group.tsx` pattern (context + first/last rounding).\r\n *\r\n * @author: @mindtris-team\r\n * @version: 0.1.0\r\n * @since: 2026-02-01\r\n */\r\n\r\n\"use client\"\r\n\r\nimport * as React from 'react'\r\nimport { cn } from '../../lib/utils'\r\nimport type { ButtonSize, ButtonVariant } from './button'\r\nimport { Button } from './button'\r\n\r\nexport type ToggleGroupType = 'single' | 'multiple'\r\nexport type ToggleGroupOrientation = 'horizontal' | 'vertical'\r\n\r\ntype ToggleValue = string | null\r\ntype ToggleValues = readonly string[]\r\n\r\ntype ToggleGroupBaseProps = Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> & {\r\n type?: ToggleGroupType\r\n orientation?: ToggleGroupOrientation\r\n /** Visual variant used for non-selected items. */\r\n variant?: ButtonVariant\r\n /** Visual variant used for selected items. */\r\n activeVariant?: ButtonVariant\r\n /** Size applied to items. */\r\n size?: ButtonSize\r\n /** Adds separators between items (uses `divide-*`). */\r\n withSeparator?: boolean\r\n /** Allow deselecting the active item in single mode. */\r\n allowDeselect?: boolean\r\n}\r\n\r\nexport type ToggleGroupSingleProps = ToggleGroupBaseProps & {\r\n type?: 'single'\r\n value?: string | null\r\n defaultValue?: string | null\r\n onValueChange?: (value: string | null) => void\r\n}\r\n\r\nexport type ToggleGroupMultipleProps = ToggleGroupBaseProps & {\r\n type: 'multiple'\r\n value?: readonly string[]\r\n defaultValue?: readonly string[]\r\n onValueChange?: (value: readonly string[]) => void\r\n}\r\n\r\nexport type ToggleGroupProps = ToggleGroupSingleProps | ToggleGroupMultipleProps\r\n\r\ntype ToggleGroupContextValue = {\r\n type: ToggleGroupType\r\n orientation: ToggleGroupOrientation\r\n variant: ButtonVariant\r\n activeVariant: ButtonVariant\r\n size?: ButtonSize\r\n withSeparator: boolean\r\n allowDeselect: boolean\r\n isPressed: (v: string) => boolean\r\n toggle: (v: string) => void\r\n}\r\n\r\nconst ToggleGroupContext = React.createContext<ToggleGroupContextValue | null>(null)\r\n\r\nfunction normalizeType(type?: ToggleGroupType): ToggleGroupType {\r\n return type ?? 'single'\r\n}\r\n\r\nexport function ToggleGroup(props: ToggleGroupProps) {\r\n const {\r\n type: rawType,\r\n orientation = 'horizontal',\r\n variant = 'secondary',\r\n activeVariant = 'primary',\r\n size,\r\n withSeparator = true,\r\n allowDeselect = true,\r\n className,\r\n children,\r\n // Prevent leaking non-DOM props onto the root element.\r\n onValueChange: _onValueChange,\r\n value: _value,\r\n defaultValue: _defaultValue,\r\n ...rest\r\n } = props\r\n\r\n const type = normalizeType(rawType)\r\n\r\n const isControlledSingle = type === 'single' && 'value' in props && props.value !== undefined\r\n const isControlledMultiple = type === 'multiple' && 'value' in props && props.value !== undefined\r\n\r\n const [uncontrolledSingle, setUncontrolledSingle] = React.useState<ToggleValue>(\r\n type === 'single' ? (('defaultValue' in props ? (props.defaultValue ?? null) : null) as ToggleValue) : null\r\n )\r\n const [uncontrolledMultiple, setUncontrolledMultiple] = React.useState<readonly string[]>(\r\n type === 'multiple' ? (('defaultValue' in props ? (props.defaultValue ?? []) : []) as readonly string[]) : []\r\n )\r\n\r\n const singleValue: ToggleValue =\r\n type === 'single'\r\n ? (isControlledSingle ? ((props as ToggleGroupSingleProps).value ?? null) : uncontrolledSingle)\r\n : null\r\n\r\n const multipleValue: readonly string[] =\r\n type === 'multiple'\r\n ? (isControlledMultiple ? ((props as ToggleGroupMultipleProps).value ?? []) : uncontrolledMultiple)\r\n : []\r\n\r\n const onSingleChange = (next: ToggleValue) => {\r\n ;(props as ToggleGroupSingleProps).onValueChange?.(next)\r\n if (!isControlledSingle) setUncontrolledSingle(next)\r\n }\r\n const onMultipleChange = (next: readonly string[]) => {\r\n ;(props as ToggleGroupMultipleProps).onValueChange?.(next)\r\n if (!isControlledMultiple) setUncontrolledMultiple(next)\r\n }\r\n\r\n const isPressed = React.useCallback(\r\n (v: string) => {\r\n return type === 'single' ? singleValue === v : multipleValue.includes(v)\r\n },\r\n [multipleValue, singleValue, type]\r\n )\r\n\r\n const toggle = React.useCallback(\r\n (v: string) => {\r\n if (type === 'single') {\r\n if (singleValue === v) {\r\n if (!allowDeselect) return\r\n onSingleChange(null)\r\n return\r\n }\r\n onSingleChange(v)\r\n return\r\n }\r\n\r\n // multiple\r\n if (multipleValue.includes(v)) {\r\n onMultipleChange(multipleValue.filter((x) => x !== v))\r\n } else {\r\n onMultipleChange([...multipleValue, v])\r\n }\r\n },\r\n [allowDeselect, multipleValue, singleValue, type]\r\n )\r\n\r\n const ctx: ToggleGroupContextValue = {\r\n type,\r\n orientation,\r\n variant,\r\n activeVariant,\r\n size,\r\n withSeparator,\r\n allowDeselect,\r\n isPressed,\r\n toggle,\r\n }\r\n\r\n const role = type === 'single' ? 'radiogroup' : 'group'\r\n\r\n return (\r\n <div\r\n data-slot=\"toggle-group\"\r\n data-orientation={orientation}\r\n role={role}\r\n className={cn(\r\n 'inline-flex w-fit overflow-hidden rounded-lg border border-border bg-card',\r\n orientation === 'vertical' ? 'flex-col' : 'flex-row',\r\n withSeparator && (orientation === 'vertical' ? 'divide-y divide-border' : 'divide-x divide-border'),\r\n className\r\n )}\r\n {...rest}\r\n >\r\n <ToggleGroupContext.Provider value={ctx}>{children}</ToggleGroupContext.Provider>\r\n </div>\r\n )\r\n}\r\n\r\nexport interface ToggleGroupItemProps extends Omit<React.ComponentProps<typeof Button>, 'variant' | 'size' | 'onClick'> {\r\n value: string\r\n variant?: ButtonVariant\r\n activeVariant?: ButtonVariant\r\n size?: ButtonSize\r\n disabled?: boolean\r\n}\r\n\r\nexport function ToggleGroupItem({\r\n value,\r\n className,\r\n variant,\r\n activeVariant,\r\n size,\r\n disabled,\r\n ...props\r\n}: ToggleGroupItemProps) {\r\n const ctx = React.useContext(ToggleGroupContext)\r\n if (!ctx) {\r\n throw new Error('ToggleGroupItem must be used within ToggleGroup')\r\n }\r\n\r\n const pressed = ctx.isPressed(value)\r\n const resolvedVariant = pressed ? (ctx.activeVariant ?? activeVariant ?? 'primary') : (ctx.variant ?? variant ?? 'secondary')\r\n const resolvedSize = ctx.size ?? size\r\n\r\n const rounding =\r\n ctx.orientation === 'vertical'\r\n ? 'rounded-none first:rounded-t-lg last:rounded-b-lg'\r\n : 'rounded-none first:rounded-l-lg last:rounded-r-lg'\r\n\r\n const a11yProps =\r\n ctx.type === 'single'\r\n ? { role: 'radio', 'aria-checked': pressed }\r\n : { 'aria-pressed': pressed }\r\n\r\n return (\r\n <Button\r\n {...a11yProps}\r\n variant={resolvedVariant}\r\n size={resolvedSize}\r\n shape=\"rounded\"\r\n disabled={disabled}\r\n className={cn('border-0 shadow-none focus-visible:z-10', rounding, className)}\r\n onClick={() => ctx.toggle(value)}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\n","/**\r\n * Accordion: Shows/hides content under a trigger.\r\n *\r\n * Design-system contract\r\n * - Scope: UI-only primitive (2-app rule). No domain terms, no API calls.\r\n * - Tokens-only: no Tailwind palette colors; use semantic token classes only.\r\n * - A11y: uses a real `<button>` trigger with `aria-expanded`, `aria-controls`, and a region panel.\r\n * - Controlled + uncontrolled: supports `open` + `onOpenChange` or `defaultOpen`.\r\n * - Motion: uses token durations/easings; content is visually collapsed via CSS grid.\r\n *\r\n * @author: @mindtris-team\r\n * @version: 1.0.0\r\n * @since: 2026-01-31\r\n *\r\n * @example\r\n * <Accordion title=\"Details\" defaultOpen={true}>\r\n * Content goes here.\r\n * </Accordion>\r\n */\r\n\r\n\"use client\"\r\n\r\nimport * as React from 'react'\r\nimport { ChevronDown } from 'lucide-react'\r\nimport { cn } from '../../lib/utils'\r\n\r\nexport interface AccordionProps {\r\n title: React.ReactNode\r\n children: React.ReactNode\r\n defaultOpen?: boolean\r\n open?: boolean\r\n onOpenChange?: (open: boolean) => void\r\n disabled?: boolean\r\n className?: string\r\n triggerClassName?: string\r\n contentClassName?: string\r\n}\r\nexport function Accordion({\r\n title,\r\n children,\r\n defaultOpen = false,\r\n open,\r\n onOpenChange,\r\n disabled = false,\r\n className,\r\n triggerClassName,\r\n contentClassName,\r\n}: AccordionProps) {\r\n const triggerId = React.useId()\r\n const panelId = React.useId()\r\n\r\n const [internalOpen, setInternalOpen] = React.useState(defaultOpen)\r\n const isControlled = open != null\r\n const isOpen = isControlled ? Boolean(open) : internalOpen\r\n\r\n const setOpen = React.useCallback(\r\n (next: boolean) => {\r\n if (!isControlled) setInternalOpen(next)\r\n onOpenChange?.(next)\r\n },\r\n [isControlled, onOpenChange]\r\n )\r\n\r\n return (\r\n <div className={cn('rounded-lg border border-border bg-card px-5 py-4', className)}>\r\n <button\r\n type=\"button\"\r\n className={cn(\r\n 'w-full flex items-center justify-between gap-3 text-left rounded-md',\r\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\r\n disabled ? 'cursor-not-allowed opacity-60' : 'cursor-pointer',\r\n triggerClassName\r\n )}\r\n aria-expanded={isOpen}\r\n aria-controls={panelId}\r\n id={triggerId}\r\n disabled={disabled}\r\n onClick={() => setOpen(!isOpen)}\r\n >\r\n <div className=\"text-sm font-medium text-foreground\">{title}</div>\r\n <ChevronDown\r\n className={cn(\r\n 'h-5 w-5 shrink-0 text-muted-foreground transition-transform duration-[var(--duration-fast)] ease-[var(--ease-out)]',\r\n isOpen && 'rotate-180'\r\n )}\r\n aria-hidden\r\n />\r\n </button>\r\n\r\n <div\r\n id={panelId}\r\n role=\"region\"\r\n aria-labelledby={triggerId}\r\n className={cn(\r\n 'grid transition-[grid-template-rows] duration-[var(--duration-normal)] ease-[var(--ease-out)]',\r\n isOpen ? 'grid-rows-[1fr]' : 'grid-rows-[0fr]'\r\n )}\r\n >\r\n <div className={cn('overflow-hidden', contentClassName)}>\r\n <div className={cn('pt-2 text-sm text-muted-foreground')}>{children}</div>\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\n","/**\r\n * AccordionGroup: Renders a stacked set of accordion items (single or multiple open).\r\n *\r\n * Design-system contract\r\n * - Scope: UI-only primitive (2-app rule). No domain terms, no API calls.\r\n * - Tokens-only: no Tailwind palette colors; use semantic token classes only.\r\n * - A11y: each item uses a real `<button>` trigger with `aria-expanded`, `aria-controls`, and a region panel.\r\n * - Controlled + uncontrolled:\r\n * - `type=\"single\"`: `value?: string|null` / `defaultValue?: string|null`\r\n * - `type=\"multiple\"`: `value?: string[]` / `defaultValue?: string[]`\r\n *\r\n * Reference (Mindtris UI) variants we mirror in Mindtris docs:\r\n * - Basic (single item)\r\n * - Table row accordion\r\n * - Rich table row accordion\r\n *\r\n * Planned Mindtris variants (placeholders; refine later per `button.tsx` + `simplifi-frontend/CONTRIBUTING.md`):\r\n * - Group: `type=\"single\"` (only one open)\r\n * - Group: `type=\"multiple\"` (multiple open)\r\n * - Group: `collapsible={false}` (single mode cannot close last open)\r\n * - Group: `disabled` at group/item level\r\n *\r\n * @author: @mindtris-team\r\n * @version: 0.1.0\r\n * @since: 2026-02-01\r\n *\r\n * @example\r\n * <AccordionGroup\r\n * type=\"single\"\r\n * defaultValue=\"first\"\r\n * items={[\r\n * { id: 'first', title: 'First item', content: 'Content for the first item' },\r\n * { id: 'second', title: 'Second item', content: 'Content for the second item' },\r\n * ]}\r\n * />\r\n */\r\n\r\n\"use client\"\r\n\r\nimport * as React from 'react'\r\nimport { ChevronDown } from 'lucide-react'\r\nimport { cn } from '../../lib/utils'\r\n\r\nexport interface AccordionGroupItem {\r\n id: string\r\n title: React.ReactNode\r\n content: React.ReactNode\r\n disabled?: boolean\r\n}\r\n\r\ntype SharedAccordionGroupProps = {\r\n items: AccordionGroupItem[]\r\n disabled?: boolean\r\n className?: string\r\n itemClassName?: string\r\n triggerClassName?: string\r\n contentClassName?: string\r\n}\r\n\r\nexport type AccordionGroupSingleProps = SharedAccordionGroupProps & {\r\n type?: 'single'\r\n /** When false, the currently-open item cannot be collapsed by clicking it again. */\r\n collapsible?: boolean\r\n value?: string | null\r\n defaultValue?: string | null\r\n onValueChange?: (value: string | null) => void\r\n}\r\n\r\nexport type AccordionGroupMultipleProps = SharedAccordionGroupProps & {\r\n type: 'multiple'\r\n value?: string[]\r\n defaultValue?: string[]\r\n onValueChange?: (value: string[]) => void\r\n}\r\n\r\nexport type AccordionGroupProps = AccordionGroupSingleProps | AccordionGroupMultipleProps\r\n\r\nfunction normalizeDomId(value: string) {\r\n // Keep it deterministic and safe for DOM ids.\r\n return value.trim().replace(/[^a-zA-Z0-9\\-_:.]/g, '-')\r\n}\r\n\r\nexport function AccordionGroup(props: AccordionGroupProps) {\r\n const baseId = React.useId()\r\n\r\n const {\r\n items,\r\n disabled = false,\r\n className,\r\n itemClassName,\r\n triggerClassName,\r\n contentClassName,\r\n } = props\r\n\r\n const mode: 'single' | 'multiple' = props.type === 'multiple' ? 'multiple' : 'single'\r\n const isSingle = mode === 'single'\r\n\r\n const singleProps = props as AccordionGroupSingleProps\r\n const multipleProps = props as AccordionGroupMultipleProps\r\n\r\n const [internalSingle, setInternalSingle] = React.useState<string | null>(() => {\r\n if (mode === 'multiple') return null\r\n return singleProps.defaultValue ?? null\r\n })\r\n const [internalMultiple, setInternalMultiple] = React.useState<string[]>(() => {\r\n if (mode === 'single') return []\r\n return multipleProps.defaultValue ?? []\r\n })\r\n\r\n const isControlled = isSingle ? singleProps.value !== undefined : multipleProps.value !== undefined\r\n const value = isSingle ? (singleProps.value ?? internalSingle) : (multipleProps.value ?? internalMultiple)\r\n\r\n const setValue = React.useCallback(\r\n (next: string | null | string[]) => {\r\n if (isSingle) {\r\n const v = (next as string | null) ?? null\r\n if (!isControlled) setInternalSingle(v)\r\n singleProps.onValueChange?.(v)\r\n } else {\r\n const v = Array.isArray(next) ? next : []\r\n if (!isControlled) setInternalMultiple(v)\r\n multipleProps.onValueChange?.(v)\r\n }\r\n },\r\n [isControlled, isSingle, multipleProps, singleProps]\r\n )\r\n\r\n const isItemOpen = React.useCallback(\r\n (id: string) => {\r\n if (isSingle) return value === id\r\n return Array.isArray(value) ? value.includes(id) : false\r\n },\r\n [isSingle, value]\r\n )\r\n\r\n const toggleItem = React.useCallback(\r\n (id: string) => {\r\n if (disabled) return\r\n\r\n if (isSingle) {\r\n const collapsible = (props as AccordionGroupSingleProps).collapsible ?? true\r\n const currentlyOpen = value === id\r\n if (currentlyOpen) {\r\n if (collapsible) setValue(null)\r\n return\r\n }\r\n setValue(id)\r\n return\r\n }\r\n\r\n const current = Array.isArray(value) ? value : []\r\n if (current.includes(id)) {\r\n setValue(current.filter((x) => x !== id))\r\n } else {\r\n setValue([...current, id])\r\n }\r\n },\r\n [disabled, isSingle, props, setValue, value]\r\n )\r\n\r\n return (\r\n <div className={cn('rounded-lg border border-border bg-card overflow-hidden', className)}>\r\n <div className=\"divide-y divide-border\">\r\n {items.map((item, idx) => {\r\n const open = isItemOpen(item.id)\r\n const itemDisabled = disabled || Boolean(item.disabled)\r\n const safeId = normalizeDomId(item.id || String(idx))\r\n const triggerId = `${baseId}-trigger-${safeId}`\r\n const panelId = `${baseId}-panel-${safeId}`\r\n\r\n return (\r\n <div key={item.id} className={cn('px-5 py-4', itemClassName)}>\r\n <button\r\n type=\"button\"\r\n className={cn(\r\n 'w-full flex items-center justify-between gap-3 text-left rounded-md',\r\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\r\n itemDisabled ? 'cursor-not-allowed opacity-60' : 'cursor-pointer',\r\n triggerClassName\r\n )}\r\n aria-expanded={open}\r\n aria-controls={panelId}\r\n id={triggerId}\r\n disabled={itemDisabled}\r\n onClick={() => toggleItem(item.id)}\r\n >\r\n <div className=\"text-base font-semibold text-foreground\">{item.title}</div>\r\n <ChevronDown\r\n className={cn(\r\n 'h-5 w-5 shrink-0 text-muted-foreground transition-transform duration-[var(--duration-fast)] ease-[var(--ease-out)]',\r\n open && 'rotate-180'\r\n )}\r\n aria-hidden\r\n />\r\n </button>\r\n\r\n <div\r\n id={panelId}\r\n role=\"region\"\r\n aria-labelledby={triggerId}\r\n className={cn(\r\n 'grid transition-[grid-template-rows] duration-[var(--duration-normal)] ease-[var(--ease-out)]',\r\n open ? 'grid-rows-[1fr]' : 'grid-rows-[0fr]'\r\n )}\r\n >\r\n <div className={cn('overflow-hidden', contentClassName)}>\r\n <div className=\"pt-3 text-sm text-muted-foreground\">{item.content}</div>\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n })}\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\n","/**\r\n * Avatar: Composable image/fallback avatar (Radix-based).\r\n *\r\n * Design-system contract\r\n * - Scope: UI-only primitive (2-app rule). No domain terms, no API calls.\r\n * - Tokens-only: semantic token classes only; no hardcoded colors.\r\n * Any component accepts className to apply any semantic token (e.g. bg-primary, bg-secondary, bg-chart-1).\r\n * - Composition: Avatar (root) + AvatarImage + AvatarFallback; optional AvatarBadge.\r\n * AvatarGroup and AvatarGroupCount for stacked avatars and +N count.\r\n * - Minimal state: Radix handles image load/error; fallback shows when image fails or is absent.\r\n *\r\n * @see https://ui.shadcn.com/docs/components/radix/avatar\r\n *\r\n * @author: @mindtris-team\r\n * @version: 0.2.0\r\n * @since: 2026-02-01\r\n *\r\n * @example\r\n * <Avatar size=\"md\">\r\n * <AvatarImage src=\"/photo.jpg\" alt=\"Profile\" />\r\n * <AvatarFallback>AB</AvatarFallback>\r\n * </Avatar>\r\n *\r\n * @example\r\n * <Avatar size=\"md\">\r\n * <AvatarImage src=\"/photo.jpg\" alt=\"Profile\" />\r\n * <AvatarFallback>AB</AvatarFallback>\r\n * <AvatarBadge variant=\"primary\" />\r\n * </Avatar>\r\n */\r\n\r\n\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport * as AvatarPrimitive from \"@radix-ui/react-avatar\"\r\nimport { cn } from \"../../lib/utils\"\r\n\r\nexport type AvatarSize = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\"\r\n\r\nconst AvatarSizeContext = React.createContext<AvatarSize>(\"md\")\r\n\r\nconst avatarSizeClasses: Record<AvatarSize, string> = {\r\n xs: \"h-6 w-6\",\r\n sm: \"h-7 w-7\",\r\n md: \"h-8 w-8\",\r\n lg: \"h-10 w-10\",\r\n xl: \"h-16 w-16\",\r\n}\r\n\r\nconst fallbackTextClasses: Record<AvatarSize, string> = {\r\n xs: \"text-[10px]\",\r\n sm: \"text-[10px]\",\r\n md: \"text-xs\",\r\n lg: \"text-sm\",\r\n xl: \"text-lg\",\r\n}\r\n\r\nexport interface AvatarProps\r\n extends React.ComponentProps<typeof AvatarPrimitive.Root> {\r\n size?: AvatarSize\r\n}\r\n\r\nconst Avatar = React.forwardRef<\r\n React.ElementRef<typeof AvatarPrimitive.Root>,\r\n AvatarProps\r\n>(({ size = \"md\", className, ...props }, ref) => (\r\n <AvatarSizeContext.Provider value={size}>\r\n <AvatarPrimitive.Root\r\n ref={ref}\r\n className={cn(\r\n \"relative inline-flex shrink-0 rounded-full select-none align-middle bg-muted\",\r\n avatarSizeClasses[size],\r\n className\r\n )}\r\n {...props}\r\n />\r\n </AvatarSizeContext.Provider>\r\n))\r\nAvatar.displayName = \"Avatar\"\r\n\r\nexport interface AvatarImageProps\r\n extends React.ComponentProps<typeof AvatarPrimitive.Image> {}\r\n\r\nconst AvatarImage = React.forwardRef<\r\n React.ElementRef<typeof AvatarPrimitive.Image>,\r\n AvatarImageProps\r\n>(({ className, ...props }, ref) => (\r\n <AvatarPrimitive.Image\r\n ref={ref}\r\n className={cn(\"aspect-square h-full w-full overflow-hidden rounded-full object-cover\", className)}\r\n draggable={false}\r\n {...props}\r\n />\r\n))\r\nAvatarImage.displayName = \"AvatarImage\"\r\n\r\nexport type AvatarFallbackVariant =\r\n | \"default\"\r\n | \"primary\"\r\n | \"secondary\"\r\n | \"tertiary\"\r\n | \"chart-1\"\r\n | \"chart-2\"\r\n | \"chart-3\"\r\n | \"chart-4\"\r\n | \"chart-5\"\r\n\r\nconst fallbackVariantClasses: Record<AvatarFallbackVariant, string> = {\r\n default: \"bg-transparent text-muted-foreground\",\r\n primary: \"bg-primary text-primary-foreground\",\r\n secondary: \"bg-secondary text-secondary-foreground\",\r\n tertiary: \"bg-muted text-foreground\",\r\n \"chart-1\": \"bg-[var(--chart-1)] text-primary-foreground\",\r\n \"chart-2\": \"bg-[var(--chart-2)] text-primary-foreground\",\r\n \"chart-3\": \"bg-[var(--chart-3)] text-primary-foreground\",\r\n \"chart-4\": \"bg-[var(--chart-4)] text-primary-foreground\",\r\n \"chart-5\": \"bg-[var(--chart-5)] text-primary-foreground\",\r\n}\r\n\r\nexport interface AvatarFallbackProps\r\n extends React.ComponentProps<typeof AvatarPrimitive.Fallback> {\r\n size?: AvatarSize\r\n variant?: AvatarFallbackVariant\r\n}\r\n\r\nconst AvatarFallback = React.forwardRef<\r\n React.ElementRef<typeof AvatarPrimitive.Fallback>,\r\n AvatarFallbackProps\r\n>(({ size: sizeProp, variant = \"default\", className, ...props }, ref) => {\r\n const sizeFromContext = React.useContext(AvatarSizeContext)\r\n const size = sizeProp ?? sizeFromContext\r\n return (\r\n <AvatarPrimitive.Fallback\r\n ref={ref}\r\n className={cn(\r\n \"flex h-full w-full overflow-hidden rounded-full items-center justify-center font-semibold uppercase\",\r\n fallbackTextClasses[size],\r\n fallbackVariantClasses[variant],\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n})\r\nAvatarFallback.displayName = \"AvatarFallback\"\r\n\r\nexport type AvatarBadgeVariant = \"primary\" | \"secondary\" | \"destructive\" | \"muted\" | \"accent\"\r\n\r\nconst badgeVariantClasses: Record<AvatarBadgeVariant, string> = {\r\n primary: \"bg-primary\",\r\n secondary: \"bg-secondary\",\r\n destructive: \"bg-destructive\",\r\n muted: \"bg-muted\",\r\n accent: \"bg-accent\",\r\n}\r\n\r\nconst badgeSizeClasses: Record<AvatarSize, string> = {\r\n xs: \"h-1.5 w-1.5\",\r\n sm: \"h-2 w-2\",\r\n md: \"h-2.5 w-2.5\",\r\n lg: \"h-3 w-3\",\r\n xl: \"h-3.5 w-3.5\",\r\n}\r\n\r\nexport interface AvatarBadgeProps extends React.HTMLAttributes<HTMLSpanElement> {\r\n variant?: AvatarBadgeVariant\r\n size?: AvatarSize\r\n}\r\n\r\nconst AvatarBadge = React.forwardRef<HTMLSpanElement, AvatarBadgeProps>(\r\n ({ variant = \"primary\", size: sizeProp, className, ...props }, ref) => {\r\n const sizeFromContext = React.useContext(AvatarSizeContext)\r\n const size = sizeProp ?? sizeFromContext\r\n return (\r\n <span\r\n ref={ref}\r\n role=\"presentation\"\r\n aria-hidden\r\n className={cn(\r\n \"absolute right-0 bottom-0 z-10 shrink-0 rounded-full aspect-square inline-flex items-center justify-center ring-2 ring-background\",\r\n badgeSizeClasses[size],\r\n badgeVariantClasses[variant],\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n }\r\n)\r\nAvatarBadge.displayName = \"AvatarBadge\"\r\n\r\nexport type AvatarGroupOverlap = \"2xs\" | \"xs\" | \"sm\" | \"md\" | \"lg\"\r\n\r\nconst overlapClasses: Record<AvatarGroupOverlap, string> = {\r\n \"2xs\": \"-space-x-[2px]\",\r\n xs: \"-space-x-2\",\r\n sm: \"-space-x-3\",\r\n md: \"-space-x-4\",\r\n lg: \"-space-x-7\",\r\n}\r\n\r\nexport interface AvatarGroupProps extends React.HTMLAttributes<HTMLDivElement> {\r\n overlap?: AvatarGroupOverlap\r\n withRing?: boolean\r\n itemClassName?: string\r\n}\r\n\r\nfunction AvatarGroup({\r\n overlap = \"md\",\r\n withRing = false,\r\n className,\r\n itemClassName,\r\n children,\r\n ...props\r\n}: AvatarGroupProps) {\r\n const items = React.Children.toArray(children)\r\n return (\r\n <div\r\n className={cn(\"flex items-center\", overlapClasses[overlap], className)}\r\n {...props}\r\n >\r\n {items.map((child, idx) => (\r\n <span\r\n key={idx}\r\n className={cn(\r\n \"relative inline-flex shrink-0 rounded-full\",\r\n withRing && \"ring-2 ring-background\",\r\n itemClassName\r\n )}\r\n style={{ zIndex: idx + 1 }}\r\n >\r\n {child}\r\n </span>\r\n ))}\r\n </div>\r\n )\r\n}\r\n\r\nconst groupCountSizeClasses: Record<AvatarSize, string> = {\r\n xs: \"h-6 w-6 text-[10px]\",\r\n sm: \"h-7 w-7 text-[10px]\",\r\n md: \"h-8 w-8 text-xs\",\r\n lg: \"h-10 w-10 text-sm\",\r\n xl: \"h-16 w-16 text-base\",\r\n}\r\n\r\nexport interface AvatarGroupCountProps\r\n extends React.HTMLAttributes<HTMLSpanElement> {\r\n size?: AvatarSize\r\n}\r\n\r\nfunction AvatarGroupCount({\r\n size = \"md\",\r\n className,\r\n children,\r\n ...props\r\n}: AvatarGroupCountProps) {\r\n return (\r\n <span\r\n className={cn(\r\n \"inline-flex shrink-0 items-center justify-center rounded-full aspect-square font-medium bg-muted text-muted-foreground select-none\",\r\n groupCountSizeClasses[size],\r\n className\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n </span>\r\n )\r\n}\r\n\r\nexport {\r\n Avatar,\r\n AvatarImage,\r\n AvatarFallback,\r\n AvatarBadge,\r\n AvatarGroup,\r\n AvatarGroupCount,\r\n}\r\n","/**\r\n * Alert: Inline message block for status and feedback.\r\n *\r\n * Design-system contract\r\n * - Scope: UI-only primitive. No domain copy, no API calls.\r\n * - Tokens-only: semantic token classes only.\r\n * - Composition: title/description slots, optional icon.\r\n *\r\n * Mindtris UI reference variants we mirror:\r\n * - Banner-like inline alerts (apps can compose dismiss + actions)\r\n *\r\n * @author: @mindtris-team\r\n * @version: 0.1.0\r\n * @since: 2026-02-01\r\n */\r\n\r\n\"use client\"\r\n\r\nimport * as React from 'react'\r\nimport { cn } from '../../lib/utils'\r\nimport { createVariants } from '../../lib/variant-utils'\r\n\r\nexport type AlertVariant = 'default' | 'accent' | 'destructive'\r\n\r\nconst alertVariants = createVariants({\r\n base: 'rounded-xl border p-4',\r\n variants: {\r\n variant: {\r\n default: 'bg-card border-border text-foreground',\r\n accent: 'bg-accent/40 border-border text-foreground',\r\n destructive: 'bg-destructive/10 border-destructive/25 text-foreground',\r\n },\r\n },\r\n defaultVariants: { variant: 'default' },\r\n})\r\n\r\nexport interface AlertProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\r\n variant?: AlertVariant\r\n icon?: React.ReactNode\r\n title?: React.ReactNode\r\n description?: React.ReactNode\r\n /** Optional action slot (e.g. button). */\r\n action?: React.ReactNode\r\n}\r\n\r\nexport function Alert({\r\n variant = 'default',\r\n icon,\r\n title,\r\n description,\r\n action,\r\n className,\r\n ...props\r\n}: AlertProps) {\r\n return (\r\n <div className={cn(alertVariants({ variant }), className)} role=\"status\" {...props}>\r\n <div className=\"flex items-start gap-3\">\r\n {icon ? <div className=\"mt-0.5 text-muted-foreground\">{icon}</div> : null}\r\n <div className=\"min-w-0 flex-1\">\r\n {title ? <div className=\"text-sm font-semibold text-foreground\">{title}</div> : null}\r\n {description ? <div className=\"mt-1 text-sm text-muted-foreground\">{description}</div> : null}\r\n </div>\r\n {action ? <div className=\"shrink-0\">{action}</div> : null}\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\n","/**\r\n * Aspect Ratio: Wrapper for fixed aspect ratios.\r\n *\r\n * Design-system contract:\r\n * - Scope: UI-only primitive. No domain copy.\r\n * - Tokens-only: semantic token classes only.\r\n * - Composition: single wrapper; children fill the area.\r\n *\r\n * @author: @mindtris-team\r\n * @version: 0.1.0\r\n * @since: 2026-02-05\r\n */\r\n\r\n\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport { cn } from \"../../lib/utils\"\r\n\r\nexport type AspectRatioPreset = \"square\" | \"video\" | \"video-wide\" | \"portrait\" | \"auto\"\r\n\r\nconst ratioMap: Record<Exclude<AspectRatioPreset, \"auto\">, string> = {\r\n square: \"1 / 1\",\r\n video: \"16 / 9\",\r\n \"video-wide\": \"21 / 9\",\r\n portrait: \"3 / 4\",\r\n}\r\n\r\nexport interface AspectRatioProps extends React.HTMLAttributes<HTMLDivElement> {\r\n /** Preset ratio or custom value (e.g. \"16/9\", \"4/3\"). */\r\n ratio?: AspectRatioPreset | string\r\n}\r\n\r\nexport function AspectRatio({\r\n ratio = \"video\",\r\n className,\r\n children,\r\n style,\r\n ...props\r\n}: AspectRatioProps) {\r\n const aspectValue =\r\n ratio === \"auto\"\r\n ? undefined\r\n : (ratioMap[ratio as Exclude<AspectRatioPreset, \"auto\">] as string | undefined) ??\r\n (typeof ratio === \"string\" ? ratio.replace(/\\s/g, \" / \") : undefined)\r\n\r\n return (\r\n <div\r\n data-slot=\"aspect-ratio\"\r\n data-ratio={ratio}\r\n className={cn(\"relative w-full overflow-hidden\", className)}\r\n style={{\r\n ...style,\r\n aspectRatio: aspectValue,\r\n }}\r\n {...props}\r\n >\r\n {children}\r\n </div>\r\n )\r\n}\r\n","/**\n * Badge: Small status/label pill.\n *\n * Design-system contract\n * - Scope: UI-only primitive (2-app rule). No domain terms, no API calls.\n * - Tokens-only: no Tailwind palette colors; use semantic token classes only.\n * - Composition: optional `leadingIcon` slot; content via children.\n *\n * mindtris-ui reference variants we mirror:\n * - Small + large pills\n * - Pills with an icon\n * - Compact “chart delta” pills\n *\n * @author: @mindtris-team\n * @version: 0.1.0\n * @since: 2026-02-01\n *\n * @example\n * <Badge variant=\"accent\">Working on</Badge>\n *\n * @example\n * <Badge size=\"sm\" variant=\"inverse\" leadingIcon={<Icon name=\"bolt\" />}>Special Offer</Badge>\n */\n\n\"use client\"\n\nimport * as React from 'react'\nimport { cn } from '../../lib/utils'\nimport { createVariants } from '../../lib/variant-utils'\n\nexport type BadgeVariant =\n | 'primary'\n | 'secondary'\n | 'tertiary'\n | 'accent'\n | 'muted'\n | 'outline'\n | 'ghost'\n | 'destructive'\n | 'inverse'\nexport type BadgeSize = 'xs' | 'sm' | 'md'\n\nconst badgeVariants = createVariants({\n base: 'inline-flex items-center font-medium whitespace-nowrap select-none rounded-full',\n variants: {\n variant: {\n primary: 'bg-primary text-primary-foreground',\n secondary: 'bg-secondary text-secondary-foreground border border-border',\n tertiary: 'bg-card border border-border text-primary',\n accent: 'bg-accent text-accent-foreground',\n muted: 'bg-muted text-muted-foreground',\n outline: 'bg-transparent text-foreground border border-border',\n ghost: 'bg-transparent text-muted-foreground',\n destructive: 'bg-destructive/15 text-destructive border border-destructive/30',\n inverse: 'bg-foreground text-background',\n },\n size: {\n xs: 'text-xs px-2.5 py-0.5',\n sm: 'text-xs px-2.5 py-1',\n md: 'text-sm px-3 py-1',\n },\n },\n defaultVariants: { variant: 'muted', size: 'sm' },\n})\n\nexport interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {\n variant?: BadgeVariant\n size?: BadgeSize\n leadingIcon?: React.ReactNode\n trailingIcon?: React.ReactNode\n}\n\nexport function Badge({ variant = 'muted', size = 'sm', leadingIcon, trailingIcon, className, children, ...props }: BadgeProps) {\n return (\n <span className={cn(badgeVariants({ variant, size }), className)} {...props}>\n {leadingIcon ? <span className=\"mr-1 shrink-0 [&_svg]:size-3.5\" aria-hidden=\"true\">{leadingIcon}</span> : null}\n <span>{children}</span>\n {trailingIcon ? <span className=\"ml-1 shrink-0 [&_svg]:size-3.5\" aria-hidden=\"true\">{trailingIcon}</span> : null}\n </span>\n )\n}\n\n","/**\r\n * Breadcrumb: Hierarchical navigation trail.\r\n *\r\n * Design-system contract\r\n * - Scope: UI-only primitive (2-app rule). No domain terms, no API calls.\r\n * - Tokens-only: no Tailwind palette colors; use semantic token classes only.\r\n * - A11y: renders `<nav aria-label=\"Breadcrumb\">`.\r\n *\r\n * Mindtris UI reference variants we mirror:\r\n * - Separators: slash, dot, chevron\r\n *\r\n * @author: @mindtris-team\r\n * @version: 0.1.0\r\n * @since: 2026-02-01\r\n */\r\n\r\n\"use client\"\r\n\r\nimport * as React from 'react'\r\nimport { ChevronRight } from 'lucide-react'\r\nimport { cn } from '../../lib/utils'\r\n\r\nexport type BreadcrumbSeparator = 'slash' | 'dot' | 'chevron' | React.ReactNode\r\n\r\nexport interface BreadcrumbItem {\r\n label: React.ReactNode\r\n href?: string\r\n onClick?: (e: React.MouseEvent<HTMLAnchorElement>) => void\r\n current?: boolean\r\n}\r\n\r\nexport interface BreadcrumbProps extends React.HTMLAttributes<HTMLElement> {\r\n items: BreadcrumbItem[]\r\n separator?: BreadcrumbSeparator\r\n}\r\n\r\nfunction Separator({ separator }: { separator: BreadcrumbSeparator }) {\r\n if (separator === 'slash') return <span className=\"px-2 text-muted-foreground/70\">/</span>\r\n if (separator === 'dot') return <span className=\"px-2 text-muted-foreground/70\">·</span>\r\n if (separator === 'chevron') return <ChevronRight className=\"mx-2 h-4 w-4 text-muted-foreground/70\" aria-hidden />\r\n return <span className=\"px-2 text-muted-foreground/70\">{separator}</span>\r\n}\r\n\r\nexport function Breadcrumb({ items, separator = 'slash', className, ...props }: BreadcrumbProps) {\r\n return (\r\n <nav aria-label=\"Breadcrumb\" className={cn(className)} {...props}>\r\n <ol className=\"inline-flex flex-wrap items-center text-sm font-medium\">\r\n {items.map((item, idx) => {\r\n const isLast = idx === items.length - 1\r\n const isCurrent = Boolean(item.current) || isLast\r\n const linkClass = cn(\r\n 'transition-colors',\r\n isCurrent ? 'text-foreground' : 'text-muted-foreground hover:text-foreground'\r\n )\r\n\r\n return (\r\n <li key={idx} className=\"inline-flex items-center\">\r\n {item.href ? (\r\n <a href={item.href} onClick={item.onClick} aria-current={isCurrent ? 'page' : undefined} className={linkClass}>\r\n {item.label}\r\n </a>\r\n ) : (\r\n <span aria-current={isCurrent ? 'page' : undefined} className={linkClass}>\r\n {item.label}\r\n </span>\r\n )}\r\n\r\n {!isLast ? <Separator separator={separator} /> : null}\r\n </li>\r\n )\r\n })}\r\n </ol>\r\n </nav>\r\n )\r\n}\r\n\r\n","/**\r\n * Pagination: Page navigation controls.\r\n *\r\n * Design-system contract\r\n * - Scope: UI-only primitive. No routing, no API calls, no domain logic.\r\n * - Tokens-only: semantic token classes only.\r\n * - A11y: uses nav/aria-label and current page semantics.\r\n *\r\n * Mindtris UI reference variants we mirror:\r\n * - Numeric pager with ellipsis\r\n * - Classic prev/next with a results summary (apps can render the summary)\r\n *\r\n * @author: @mindtris-team\r\n * @version: 0.1.0\r\n * @since: 2026-02-01\r\n */\r\n\r\n\"use client\"\r\n\r\nimport * as React from 'react'\r\nimport { ChevronLeft, ChevronRight } from 'lucide-react'\r\nimport { cn } from '../../lib/utils'\r\nimport { Button } from './button'\r\n\r\nexport type PaginationVariant = 'numeric' | 'classic'\r\n\r\nexport interface PaginationProps extends React.HTMLAttributes<HTMLElement> {\r\n page: number\r\n totalPages: number\r\n onPageChange: (page: number) => void\r\n variant?: PaginationVariant\r\n /** Max numeric buttons (including first/last). Default 7. */\r\n maxButtons?: number\r\n /** Optional results summary slot (for classic layout). */\r\n summary?: React.ReactNode\r\n}\r\n\r\ntype PageToken = number | 'ellipsis'\r\n\r\nfunction clamp(n: number, min: number, max: number) {\r\n return Math.max(min, Math.min(max, n))\r\n}\r\n\r\nfunction buildPageTokens(page: number, total: number, maxButtons: number): PageToken[] {\r\n const safeMax = Math.max(5, maxButtons)\r\n if (total <= safeMax) return Array.from({ length: total }, (_, i) => i + 1)\r\n\r\n const first = 1\r\n const last = total\r\n const windowSize = safeMax - 2 // reserve for first + last\r\n const half = Math.floor(windowSize / 2)\r\n\r\n let start = page - half\r\n let end = page + half\r\n\r\n if (start < 2) {\r\n start = 2\r\n end = start + windowSize - 1\r\n }\r\n if (end > last - 1) {\r\n end = last - 1\r\n start = end - windowSize + 1\r\n }\r\n\r\n const tokens: PageToken[] = [first]\r\n if (start > 2) tokens.push('ellipsis')\r\n for (let i = start; i <= end; i++) tokens.push(i)\r\n if (end < last - 1) tokens.push('ellipsis')\r\n tokens.push(last)\r\n return tokens\r\n}\r\n\r\nexport function Pagination({\r\n page,\r\n totalPages,\r\n onPageChange,\r\n variant = 'numeric',\r\n maxButtons = 7,\r\n summary,\r\n className,\r\n ...props\r\n}: PaginationProps) {\r\n const current = clamp(page, 1, Math.max(1, totalPages))\r\n const canPrev = current > 1\r\n const canNext = current < totalPages\r\n\r\n if (variant === 'classic') {\r\n return (\r\n <nav className={cn('flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3', className)} aria-label=\"Pagination\" {...props}>\r\n <div className=\"order-2 sm:order-1\">\r\n <div className=\"flex justify-center sm:justify-start gap-2\">\r\n <Button variant=\"secondary\" size=\"sm\" disabled={!canPrev} onClick={() => onPageChange(current - 1)}>\r\n &larr; Previous\r\n </Button>\r\n <Button variant=\"secondary\" size=\"sm\" disabled={!canNext} onClick={() => onPageChange(current + 1)}>\r\n Next &rarr;\r\n </Button>\r\n </div>\r\n </div>\r\n {summary ? <div className=\"order-1 sm:order-2 text-sm text-muted-foreground text-center sm:text-left\">{summary}</div> : null}\r\n </nav>\r\n )\r\n }\r\n\r\n const tokens = buildPageTokens(current, totalPages, maxButtons)\r\n\r\n return (\r\n <nav className={cn('flex justify-center', className)} aria-label=\"Pagination\" {...props}>\r\n <div className=\"flex items-center\">\r\n <Button\r\n variant=\"secondary\"\r\n size=\"icon-sm\"\r\n aria-label=\"Previous page\"\r\n disabled={!canPrev}\r\n onClick={() => onPageChange(current - 1)}\r\n >\r\n <ChevronLeft className=\"h-4 w-4\" aria-hidden />\r\n </Button>\r\n\r\n <div className=\"mx-2 inline-flex rounded-lg border border-border overflow-hidden\">\r\n {tokens.map((t, idx) => {\r\n if (t === 'ellipsis') {\r\n return (\r\n <span key={`e-${idx}`} className=\"inline-flex items-center justify-center px-3 py-2 text-sm text-muted-foreground bg-card\">\r\n …\r\n </span>\r\n )\r\n }\r\n const isActive = t === current\r\n return (\r\n <button\r\n key={t}\r\n type=\"button\"\r\n onClick={() => onPageChange(t)}\r\n aria-current={isActive ? 'page' : undefined}\r\n className={cn(\r\n 'inline-flex items-center justify-center px-3.5 py-2 text-sm font-medium transition-colors',\r\n 'bg-card hover:bg-muted border-r border-border last:border-r-0',\r\n isActive ? 'text-primary' : 'text-muted-foreground hover:text-foreground'\r\n )}\r\n >\r\n {t}\r\n </button>\r\n )\r\n })}\r\n </div>\r\n\r\n <Button\r\n variant=\"secondary\"\r\n size=\"icon-sm\"\r\n aria-label=\"Next page\"\r\n disabled={!canNext}\r\n onClick={() => onPageChange(current + 1)}\r\n >\r\n <ChevronRight className=\"h-4 w-4\" aria-hidden />\r\n </Button>\r\n </div>\r\n </nav>\r\n )\r\n}\r\n\r\n","'use client'\r\n\r\nimport * as React from 'react'\r\nimport { cn } from '../../lib/utils'\r\n\r\nconst CardSizeContext = React.createContext<'default' | 'sm'>('default')\r\n\r\nexport interface CardProps {\r\n children: React.ReactNode\r\n className?: string\r\n /** Size variant: default or compact spacing. */\r\n size?: 'default' | 'sm'\r\n /** Shadow: app opts in. Use \"none\" for flat, or token-driven shadow. */\r\n shadow?: 'none' | 'sm' | 'md' | 'lg'\r\n border?: boolean\r\n rounded?: 'none' | 'sm' | 'md' | 'lg' | 'xl'\r\n background?: 'white' | 'gray' | 'transparent'\r\n hover?: boolean\r\n}\r\n\r\nexport default function Card({\r\n children,\r\n className = '',\r\n size = 'default',\r\n shadow = 'none',\r\n border = true,\r\n rounded = 'lg',\r\n background = 'white',\r\n hover = false\r\n}: CardProps) {\r\n const shadowClasses = {\r\n none: '',\r\n sm: 'shadow-[var(--shadow-sm)]',\r\n md: 'shadow-[var(--shadow-md)]',\r\n lg: 'shadow-[var(--shadow-lg)]'\r\n }\r\n\r\n const roundedClasses = {\r\n none: '',\r\n sm: 'rounded-sm',\r\n md: 'rounded-md',\r\n lg: 'rounded-lg',\r\n xl: 'rounded-xl'\r\n }\r\n\r\n const backgroundClasses = {\r\n white: 'bg-card',\r\n gray: 'bg-muted',\r\n transparent: 'bg-transparent'\r\n }\r\n\r\n return (\r\n <CardSizeContext.Provider value={size}>\r\n <div\r\n data-slot=\"card\"\r\n data-size={size}\r\n className={cn(\r\n 'relative overflow-hidden flex flex-col',\r\n shadowClasses[shadow],\r\n border && 'border border-border',\r\n roundedClasses[rounded],\r\n backgroundClasses[background],\r\n hover && 'transition-all duration-200 hover:shadow-[var(--shadow-lg)] hover:-translate-y-0.5',\r\n className\r\n )}\r\n >\r\n {children}\r\n </div>\r\n </CardSizeContext.Provider>\r\n )\r\n}\r\n\r\nexport function DashboardCard({ children, className, ...props }: Omit<CardProps, 'shadow' | 'border' | 'rounded'>) {\r\n return (\r\n <Card size=\"default\" shadow=\"md\" border rounded=\"lg\" background=\"white\" className={className} {...props}>\r\n {children}\r\n </Card>\r\n )\r\n}\r\n\r\nexport function StatCard({ children, className, ...props }: Omit<CardProps, 'shadow' | 'border' | 'rounded'>) {\r\n return (\r\n <Card size=\"default\" shadow=\"sm\" border rounded=\"md\" background=\"white\" className={className} {...props}>\r\n {children}\r\n </Card>\r\n )\r\n}\r\n\r\nexport function SimpleCard({ children, className, ...props }: Omit<CardProps, 'shadow' | 'border' | 'rounded'>) {\r\n return (\r\n <Card size=\"default\" shadow=\"none\" border={false} rounded=\"none\" background=\"transparent\" className={className} {...props}>\r\n {children}\r\n </Card>\r\n )\r\n}\r\n\r\nfunction useCardSize() {\r\n return React.useContext(CardSizeContext)\r\n}\r\n\r\nexport interface CardHeaderProps {\r\n children: React.ReactNode\r\n className?: string\r\n}\r\n\r\n/** Header with optional CardTitle, CardDescription, CardAction. CardAction appears top-right. */\r\nexport function CardHeader({ children, className = '' }: CardHeaderProps) {\r\n const size = useCardSize()\r\n const padding = size === 'sm' ? 'p-4' : 'p-6'\r\n return (\r\n <div data-slot=\"card-header\" className={cn('grid grid-cols-[1fr_auto] gap-x-4 gap-y-1.5', padding, className)}>\r\n {children}\r\n </div>\r\n )\r\n}\r\n\r\nexport function CardTitle({ children, className = '' }: { children: React.ReactNode; className?: string }) {\r\n return <h3 data-slot=\"card-title\" className={cn('text-lg font-semibold text-foreground', className)}>{children}</h3>\r\n}\r\n\r\nexport function CardDescription({ children, className = '' }: { children: React.ReactNode; className?: string }) {\r\n return <p data-slot=\"card-description\" className={cn('text-sm text-muted-foreground mt-1', className)}>{children}</p>\r\n}\r\n\r\n/** Places content in the top-right of the header (e.g. button, badge). */\r\nexport function CardAction({ children, className = '' }: { children: React.ReactNode; className?: string }) {\r\n return (\r\n <div data-slot=\"card-action\" className={cn('col-start-2 row-span-2 row-start-1 self-start', className)}>\r\n {children}\r\n </div>\r\n )\r\n}\r\n\r\n/** Image or media before the header. Full-width, rounded top. Place as first child of Card. */\r\nexport function CardImage({ children, className = '' }: { children: React.ReactNode; className?: string }) {\r\n return (\r\n <div data-slot=\"card-image\" className={cn('overflow-hidden rounded-t-lg w-full bg-muted', className)}>\r\n {children}\r\n </div>\r\n )\r\n}\r\n\r\nexport function CardContent({ children, className = '' }: { children: React.ReactNode; className?: string }) {\r\n const size = useCardSize()\r\n const padding = size === 'sm' ? 'px-4 pb-4' : 'px-6 pb-6'\r\n return <div data-slot=\"card-content\" className={cn(padding, className)}>{children}</div>\r\n}\r\n\r\nexport function CardFooter({ children, className = '' }: { children: React.ReactNode; className?: string }) {\r\n const size = useCardSize()\r\n const padding = size === 'sm' ? 'p-4 pt-0' : 'p-6 pt-0'\r\n return <div data-slot=\"card-footer\" className={cn('border-t border-border', padding, className)}>{children}</div>\r\n}\r\n","\"use client\"\r\n\r\nimport React from 'react'\r\nimport { cn } from '../../lib/utils'\r\n\r\nexport type InputSize = 'sm' | 'md' | 'lg'\r\n\r\nexport interface InputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> {\r\n size?: InputSize\r\n}\r\n\r\nconst sizeClasses: Record<InputSize, string> = {\r\n sm: 'h-8 text-xs px-2.5 rounded-md',\r\n md: 'h-10 text-sm px-3 rounded-lg',\r\n lg: 'h-12 text-base px-4 rounded-lg',\r\n}\r\n\r\nexport const Input = React.forwardRef<HTMLInputElement, InputProps>(\r\n ({ className, type, size = 'md', ...props }, ref) => {\r\n return (\r\n <input\r\n type={type}\r\n data-slot=\"input\"\r\n className={cn(\r\n 'w-full rounded-lg border border-input bg-field text-sm text-foreground leading-5 shadow-none',\r\n // Native file inputs vary by browser; for consistent UI, prefer `FileInput`.\r\n // We only style the selector button here (token-driven).\r\n type === 'file' &&\r\n 'cursor-pointer file:mr-3 file:px-3 file:py-1.5 file:rounded-md file:border-0 file:bg-background file:text-muted-foreground file:text-xs file:font-medium',\r\n 'placeholder:text-muted-foreground',\r\n 'hover:border-border/80 focus-visible:outline-none focus-visible:ring-0 focus-visible:border-foreground/40',\r\n 'disabled:bg-muted disabled:text-muted-foreground disabled:cursor-not-allowed',\r\n sizeClasses[size],\r\n className\r\n )}\r\n ref={ref}\r\n {...props}\r\n />\r\n )\r\n }\r\n)\r\nInput.displayName = 'Input'\r\n\r\n/**\r\n * Radio\r\n * Token-driven radio button component\r\n */\r\nexport interface RadioProps extends React.InputHTMLAttributes<HTMLInputElement> {}\r\n\r\nexport const Radio = React.forwardRef<HTMLInputElement, RadioProps>(\r\n ({ className, ...props }, ref) => {\r\n return (\r\n <input\r\n type=\"radio\"\r\n className={cn(\r\n 'h-4 w-4 rounded-full border-input bg-field text-primary',\r\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\r\n 'disabled:opacity-50 disabled:cursor-not-allowed',\r\n className\r\n )}\r\n ref={ref}\r\n {...props}\r\n />\r\n )\r\n }\r\n)\r\nRadio.displayName = 'Radio'\r\n","\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport { OTPInput, type SlotProps } from \"input-otp\"\r\n\r\nimport { cn } from \"../../lib/utils\"\r\n\r\ntype InputOTPRenderState = {\r\n slots: SlotProps[]\r\n} & Record<string, unknown>\r\n\r\n/** \"connected\" = slots share borders (strip). \"boxed\" = 6 square boxes with gap. */\r\nexport type InputOTPSlotVariant = \"connected\" | \"boxed\"\r\n\r\nconst InputOTPContext = React.createContext<InputOTPRenderState | null>(null)\r\nconst InputOTPVariantContext = React.createContext<InputOTPSlotVariant>(\"connected\")\r\n\r\nfunction useInputOTPContext() {\r\n const ctx = React.useContext(InputOTPContext)\r\n if (!ctx) {\r\n throw new Error(\"InputOTPSlot must be used within InputOTP.\")\r\n }\r\n return ctx\r\n}\r\n\r\nfunction useInputOTPVariant() {\r\n return React.useContext(InputOTPVariantContext)\r\n}\r\n\r\nexport type InputOTPProps = Omit<React.ComponentProps<typeof OTPInput>, \"render\" | \"containerClassName\"> & {\r\n /** The visual container classes (token-driven). */\r\n containerClassName?: string\r\n /** Slot layout: connected (strip) or boxed (6 square boxes with gap). Default connected. */\r\n slotVariant?: InputOTPSlotVariant\r\n /** Rendered slot structure (use `InputOTPGroup` + `InputOTPSlot`). */\r\n children: React.ReactNode\r\n}\r\n\r\n/**\r\n * InputOTP\r\n * Compound OTP input primitive built on top of `input-otp`.\r\n *\r\n * Design-system rules:\r\n * - Token-driven styling only\r\n * - Minimal state (delegates behavior to `input-otp`)\r\n * - No hidden side effects\r\n */\r\nexport function InputOTP({\r\n className,\r\n containerClassName,\r\n children,\r\n disabled,\r\n slotVariant = \"connected\",\r\n ...props\r\n}: InputOTPProps) {\r\n return (\r\n <OTPInput\r\n data-slot=\"input-otp\"\r\n data-slot-variant={slotVariant}\r\n data-disabled={disabled ? \"true\" : undefined}\r\n disabled={disabled}\r\n className={className}\r\n containerClassName={cn(\r\n \"group flex items-center\",\r\n slotVariant === \"connected\" && \"gap-2\",\r\n slotVariant === \"boxed\" && \"gap-3\",\r\n disabled ? \"cursor-not-allowed opacity-50\" : undefined,\r\n containerClassName\r\n )}\r\n render={(renderProps: any) => (\r\n <InputOTPVariantContext.Provider value={slotVariant}>\r\n <InputOTPContext.Provider value={renderProps as InputOTPRenderState}>{children}</InputOTPContext.Provider>\r\n </InputOTPVariantContext.Provider>\r\n )}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport type InputOTPGroupProps = React.HTMLAttributes<HTMLDivElement>\r\n\r\n/** Groups multiple `InputOTPSlot`s into a single segmented control. */\r\nexport function InputOTPGroup({ className, ...props }: InputOTPGroupProps) {\r\n const variant = useInputOTPVariant()\r\n return (\r\n <div\r\n data-slot=\"input-otp-group\"\r\n data-variant={variant}\r\n className={cn(\r\n \"flex items-center\",\r\n variant === \"boxed\" && \"gap-3\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport type InputOTPSeparatorOrientation = \"vertical\" | \"horizontal\"\r\n\r\nexport type InputOTPSeparatorProps = React.HTMLAttributes<HTMLDivElement> & {\r\n /** Vertical = thin line between groups (default). Horizontal = dash between groups. */\r\n orientation?: InputOTPSeparatorOrientation\r\n}\r\n\r\n/** Visual separator between OTP groups. */\r\nexport function InputOTPSeparator({ orientation = \"vertical\", className, ...props }: InputOTPSeparatorProps) {\r\n return (\r\n <div\r\n data-slot=\"input-otp-separator\"\r\n data-orientation={orientation}\r\n role=\"separator\"\r\n aria-orientation={orientation}\r\n className={cn(\r\n \"shrink-0 self-center bg-border\",\r\n orientation === \"vertical\" && \"mx-2 h-4 w-px\",\r\n orientation === \"horizontal\" && \"my-0 mx-1.5 h-px w-4\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport type InputOTPSize = \"sm\" | \"md\" | \"lg\"\r\n\r\nconst slotSizeClasses: Record<InputOTPSize, string> = {\r\n sm: \"h-8 w-8 text-xs\",\r\n md: \"h-10 w-10 text-sm\",\r\n lg: \"h-12 w-12 text-base\",\r\n}\r\n\r\nexport type InputOTPSlotProps = React.HTMLAttributes<HTMLDivElement> & {\r\n index: number\r\n /** Slot size; defaults to md to match Input. */\r\n size?: InputOTPSize\r\n}\r\n\r\nexport function InputOTPSlot({ index, size = \"md\", className, ...props }: InputOTPSlotProps) {\r\n const { slots } = useInputOTPContext()\r\n const variant = useInputOTPVariant()\r\n const slot = slots[index]\r\n\r\n if (!slot) {\r\n return null\r\n }\r\n\r\n const isBoxed = variant === \"boxed\"\r\n\r\n return (\r\n <div\r\n data-slot=\"input-otp-slot\"\r\n data-active={slot.isActive ? \"true\" : \"false\"}\r\n data-variant={variant}\r\n className={cn(\r\n \"relative flex items-center justify-center\",\r\n \"transition-[border-color,background-color] duration-150 ease-out\",\r\n \"hover:border-border/80\",\r\n \"data-[active=true]:border-foreground/40 data-[active=true]:outline-none data-[active=true]:ring-0\",\r\n \"aria-invalid:border-destructive\",\r\n \"group-data-[disabled=true]:cursor-not-allowed group-data-[disabled=true]:opacity-50\",\r\n isBoxed\r\n ? \"border border-input rounded-lg bg-field text-foreground\"\r\n : \"border-y border-r border-input bg-field text-foreground first:rounded-l-lg first:border-l last:rounded-r-lg\",\r\n slotSizeClasses[size],\r\n className\r\n )}\r\n {...props}\r\n >\r\n <span\r\n data-slot=\"input-otp-slot-char\"\r\n className={cn(slot.char ? \"text-foreground\" : \"text-muted-foreground\")}\r\n >\r\n {slot.char ?? slot.placeholderChar}\r\n </span>\r\n\r\n {slot.hasFakeCaret ? (\r\n <span\r\n data-slot=\"input-otp-slot-caret\"\r\n aria-hidden=\"true\"\r\n className=\"pointer-events-none absolute inset-0 flex items-center justify-center\"\r\n >\r\n <span className=\"h-4 w-px bg-foreground animate-pulse\" />\r\n </span>\r\n ) : null}\r\n </div>\r\n )\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Single-box OTP (one input field, same tokens as Input – e.g. multi-factor verify)\r\n// ---------------------------------------------------------------------------\r\n\r\nconst singleSizeClasses: Record<InputOTPSize, string> = {\r\n sm: \"h-8 text-xs px-2.5 rounded-md\",\r\n md: \"h-10 text-sm px-3 rounded-lg\",\r\n lg: \"h-12 text-base px-4 rounded-lg\",\r\n}\r\n\r\nexport type InputOTPSingleProps = Omit<React.InputHTMLAttributes<HTMLInputElement>, \"type\" | \"size\"> & {\r\n /** Max length (e.g. 4 or 6). */\r\n maxLength?: number\r\n /** Restrict to digits only; otherwise alphanumeric. */\r\n digitsOnly?: boolean\r\n /** Size; defaults to md. */\r\n size?: InputOTPSize\r\n}\r\n\r\n/**\r\n * InputOTPSingle\r\n * Single input box for OTP/code entry (e.g. multi-factor verification).\r\n * Styled like Input; supports digits-only or alphanumeric, sizes, and controlled value.\r\n */\r\nexport const InputOTPSingle = React.forwardRef<HTMLInputElement, InputOTPSingleProps>(\r\n ({ className, maxLength = 6, digitsOnly = true, size = \"md\", value, onChange, ...props }, ref) => {\r\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n let next = e.target.value\r\n if (digitsOnly) next = next.replace(/\\D/g, \"\")\r\n if (maxLength != null) next = next.slice(0, maxLength)\r\n e.target.value = next\r\n onChange?.(e)\r\n }\r\n\r\n return (\r\n <input\r\n ref={ref}\r\n type=\"text\"\r\n inputMode={digitsOnly ? \"numeric\" : \"text\"}\r\n autoComplete=\"one-time-code\"\r\n data-slot=\"input-otp-single\"\r\n maxLength={maxLength}\r\n value={value}\r\n onChange={handleChange}\r\n className={cn(\r\n \"w-full rounded-lg border border-input bg-field text-foreground leading-5 shadow-none\",\r\n \"placeholder:text-muted-foreground\",\r\n \"transition-[border-color] duration-150 ease-out\",\r\n \"hover:border-border/80 focus:outline-none focus:ring-0 focus:border-foreground/40\",\r\n \"disabled:bg-muted disabled:text-muted-foreground disabled:cursor-not-allowed\",\r\n \"aria-invalid:border-destructive\",\r\n singleSizeClasses[size],\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n }\r\n)\r\nInputOTPSingle.displayName = \"InputOTPSingle\"\r\n\r\n","\"use client\"\r\n\r\nimport * as React from 'react'\r\nimport { cn } from '../../lib/utils'\r\n\r\nexport interface FileInputProps\r\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type' | 'value' | 'defaultValue' | 'size'> {\r\n /** Text shown when no file is selected. */\r\n emptyLabel?: string\r\n /** Button label (left side). */\r\n buttonLabel?: string\r\n}\r\n\r\n/**\r\n * FileInput\r\n * Custom, token-driven file picker that renders consistently across browsers.\r\n *\r\n * - Uses a hidden native `<input type=\"file\" />` for actual file selection.\r\n * - Renders a visible \"Choose File\" button + filename label inside an Input-like container.\r\n * - Tokens-only styling (no hex/palette). Button uses `bg-background` (Simplifi: #f7f5f2).\r\n */\r\nexport function FileInput({\r\n id,\r\n name,\r\n accept,\r\n multiple,\r\n disabled,\r\n required,\r\n onChange,\r\n className,\r\n emptyLabel = 'No file chosen',\r\n buttonLabel = 'Choose file',\r\n ...props\r\n}: FileInputProps) {\r\n const inputRef = React.useRef<HTMLInputElement | null>(null)\r\n const [label, setLabel] = React.useState<string>(emptyLabel)\r\n\r\n const openPicker = React.useCallback(() => {\r\n if (disabled) return\r\n inputRef.current?.click()\r\n }, [disabled])\r\n\r\n const handleChange = React.useCallback(\r\n (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const files = e.currentTarget.files\r\n if (!files || files.length === 0) {\r\n setLabel(emptyLabel)\r\n } else if (files.length === 1) {\r\n setLabel(files[0]?.name ?? emptyLabel)\r\n } else {\r\n setLabel(`${files.length} files`)\r\n }\r\n onChange?.(e)\r\n },\r\n [emptyLabel, onChange]\r\n )\r\n\r\n return (\r\n <div\r\n data-slot=\"file-input\"\r\n className={cn(\r\n // Slightly tighter left padding so the button sits a bit more left.\r\n 'w-full h-10 rounded-lg border border-input bg-field pl-2.5 pr-3',\r\n 'flex items-center gap-3',\r\n 'hover:border-border/80 focus-within:border-foreground/40',\r\n disabled && 'opacity-50 cursor-not-allowed',\r\n className\r\n )}\r\n onClick={openPicker}\r\n >\r\n <input\r\n ref={inputRef}\r\n id={id}\r\n name={name}\r\n type=\"file\"\r\n accept={accept}\r\n multiple={multiple}\r\n disabled={disabled}\r\n required={required}\r\n onChange={handleChange}\r\n className=\"sr-only\"\r\n {...props}\r\n />\r\n\r\n <button\r\n type=\"button\"\r\n onClick={(e) => {\r\n e.preventDefault()\r\n e.stopPropagation()\r\n openPicker()\r\n }}\r\n disabled={disabled}\r\n className={cn(\r\n 'shrink-0',\r\n 'inline-flex items-center justify-center',\r\n 'rounded-md border border-transparent',\r\n 'bg-primary text-primary-foreground',\r\n 'px-3 py-1.5 text-xs font-medium',\r\n 'focus-visible:outline-none focus-visible:ring-0'\r\n )}\r\n >\r\n {buttonLabel}\r\n </button>\r\n\r\n <span className={cn('min-w-0 truncate text-sm', label === emptyLabel ? 'text-muted-foreground' : 'text-foreground')}>\r\n {label}\r\n </span>\r\n </div>\r\n )\r\n}\r\n\r\n","\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport { cn } from \"../../lib/utils\"\r\nimport { Input } from \"./input\"\r\nimport { Textarea } from \"./textarea\"\r\n\r\nexport type InputGroupProps = React.HTMLAttributes<HTMLDivElement>\r\n\r\nexport type InputGroupAddonAlign =\r\n | \"inline-start\"\r\n | \"inline-end\"\r\n | \"block-start\"\r\n | \"block-end\"\r\n\r\nexport type InputGroupAddonProps = React.HTMLAttributes<HTMLDivElement> & {\r\n align?: InputGroupAddonAlign\r\n}\r\n\r\nexport type InputGroupInputProps = React.ComponentProps<typeof Input> & {\r\n /** Set data-slot for focus state handling when used inside InputGroup. */\r\n \"data-slot\"?: string\r\n}\r\n\r\nexport type InputGroupTextareaProps = React.ComponentProps<typeof Textarea> & {\r\n /** Set data-slot for focus state handling when used inside InputGroup. */\r\n \"data-slot\"?: string\r\n}\r\n\r\ntype InputGroupLayout = \"inline\" | \"block\"\r\nconst InputGroupLayoutContext = React.createContext<InputGroupLayout>(\"inline\")\r\n\r\n/**\r\n * InputGroup. Wraps an input and addons in a single bordered box.\r\n *\r\n * Design intent:\r\n * - Should feel like a regular `Input` by default (same inset/padding).\r\n * - Addons live *inside* the control with predictable left/right spacing.\r\n * - Avoid absolute-positioning surprises across browsers/layouts.\r\n *\r\n * Focus order: Place InputGroupAddon *after* InputGroupInput/InputGroupTextarea in the DOM\r\n * so the focusable control receives focus before addon buttons when tabbing. Use the\r\n * `align` prop to position the addon visually (inline-start, inline-end, block-start, block-end).\r\n */\r\nconst InputGroup = React.forwardRef<HTMLDivElement, InputGroupProps>(\r\n ({ className, children, ...props }, ref) => {\r\n const childArray = React.Children.toArray(children)\r\n const hasBlockAddon = childArray.some(\r\n (c) =>\r\n React.isValidElement<InputGroupAddonProps>(c) &&\r\n (c.props?.align === \"block-start\" || c.props?.align === \"block-end\")\r\n )\r\n const layout: InputGroupLayout = hasBlockAddon ? \"block\" : \"inline\"\r\n\r\n return (\r\n <InputGroupLayoutContext.Provider value={layout}>\r\n <div\r\n ref={ref}\r\n data-slot=\"input-group\"\r\n data-layout={layout}\r\n className={cn(\r\n \"w-full rounded-lg border border-input bg-field\",\r\n \"hover:border-border/80 focus-within:border-foreground/40 focus-within:outline-none focus-within:ring-0\",\r\n layout === \"inline\" && \"flex min-h-10 items-center px-3 gap-0\",\r\n // Block layout: header/footer bars + control area inside a single shell.\r\n layout === \"block\" && \"flex flex-col overflow-visible\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n </div>\r\n </InputGroupLayoutContext.Provider>\r\n )\r\n }\r\n)\r\nInputGroup.displayName = \"InputGroup\"\r\n\r\n/**\r\n * InputGroupAddon. Renders icons, text, or buttons beside the input. Align: inline-start | inline-end | block-start | block-end.\r\n */\r\nconst InputGroupAddon = React.forwardRef<HTMLDivElement, InputGroupAddonProps>(\r\n ({ className, align = \"inline-start\", ...props }, ref) => {\r\n const alignClasses = {\r\n \"inline-start\": \"order-first shrink-0 mr-2\",\r\n \"inline-end\": \"order-last shrink-0 ml-2\",\r\n \"block-start\":\r\n \"order-first w-full min-w-0 bg-transparent px-3 py-1.5 text-left justify-start\",\r\n \"block-end\":\r\n \"order-last w-full min-w-0 bg-transparent px-3 pt-1.5 pb-1.5 text-left justify-start\",\r\n }\r\n return (\r\n <div\r\n ref={ref}\r\n data-slot=\"input-group-addon\"\r\n data-align={align}\r\n className={cn(\r\n \"flex items-center text-muted-foreground [&_svg]:shrink-0\",\r\n (align === \"inline-start\" || align === \"inline-end\") && \"justify-center\",\r\n alignClasses[align],\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n }\r\n)\r\nInputGroupAddon.displayName = \"InputGroupAddon\"\r\n\r\n/**\r\n * InputGroupInput. Input styled for use inside InputGroup. Pass through to Input with data-slot for focus handling.\r\n */\r\nconst InputGroupInput = React.forwardRef<HTMLInputElement, InputGroupInputProps>(\r\n ({ className, \"data-slot\": dataSlot, ...props }, ref) => (\r\n <InputGroupLayoutContext.Consumer>\r\n {(layout) => (\r\n <Input\r\n ref={ref}\r\n data-slot={dataSlot ?? \"input-group-control\"}\r\n // Force padding to come from the group shell (like a regular Input).\r\n // This avoids \"stretched\" placeholder text and keeps right icons padded.\r\n className={cn(\r\n \"w-full min-w-0\",\r\n \"text-left\",\r\n layout === \"inline\" &&\r\n \"flex-1 border-0 bg-transparent shadow-none hover:border-0 focus-visible:border-0 rounded-none px-0\",\r\n // Block layout: control area gets standard input padding.\r\n layout === \"block\" &&\r\n \"border-0 bg-transparent shadow-none hover:border-0 focus-visible:border-0 rounded-none px-3 py-2\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )}\r\n </InputGroupLayoutContext.Consumer>\r\n )\r\n)\r\nInputGroupInput.displayName = \"InputGroupInput\"\r\n\r\nconst InputGroupTextarea = React.forwardRef<HTMLTextAreaElement, InputGroupTextareaProps>(\r\n ({ className, \"data-slot\": dataSlot, ...props }, ref) => (\r\n <InputGroupLayoutContext.Consumer>\r\n {(layout) => (\r\n <Textarea\r\n ref={ref}\r\n data-slot={dataSlot ?? \"input-group-control\"}\r\n className={cn(\r\n \"w-full min-w-0\",\r\n \"text-left\",\r\n layout === \"inline\" &&\r\n \"border-0 bg-transparent shadow-none hover:border-0 focus-visible:border-0 rounded-none px-0\",\r\n layout === \"block\" &&\r\n \"border-0 bg-transparent shadow-none hover:border-0 focus-visible:border-0 rounded-none px-3 py-2 resize-y\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )}\r\n </InputGroupLayoutContext.Consumer>\r\n )\r\n)\r\nInputGroupTextarea.displayName = \"InputGroupTextarea\"\r\n\r\nexport { InputGroup, InputGroupAddon, InputGroupInput, InputGroupTextarea }\r\n","\"use client\"\r\n\r\nimport React from 'react'\r\nimport { cn } from '../../lib/utils'\r\n\r\nexport type TextareaSize = 'sm' | 'md' | 'lg'\r\n\r\nexport interface TextareaProps extends Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, 'size'> {\r\n /**\r\n * Visual padding size. Use `className` to override if needed.\r\n * Defaults to `md` to match `Input`.\r\n */\r\n size?: TextareaSize\r\n}\r\n\r\nconst sizeClasses: Record<TextareaSize, string> = {\r\n sm: 'px-2 py-1',\r\n md: 'px-3 py-2',\r\n lg: 'px-4 py-3',\r\n}\r\n\r\n/**\r\n * Textarea\r\n * Token-driven textarea aligned to `Input` styling.\r\n *\r\n * - Reusable component first (no business logic)\r\n * - Tokens-only styling\r\n * - Minimal state (uncontrolled by default)\r\n * - No hidden side effects\r\n */\r\nexport const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\r\n ({ className, size = 'md', ...props }, ref) => {\r\n return (\r\n <textarea\r\n ref={ref}\r\n className={cn(\r\n 'block w-full min-h-[6rem] resize-y rounded-lg border border-input bg-field text-sm text-foreground leading-5 shadow-none cursor-text m-0',\r\n 'placeholder:text-muted-foreground',\r\n 'hover:border-border/80 focus-visible:outline-none focus-visible:ring-0 focus-visible:border-foreground/40',\r\n // Use a slightly translucent muted surface so borders remain visible (esp. in themes where\r\n // `muted` and `input` are the same color, which can make stacked disabled fields look “merged”).\r\n 'disabled:bg-muted/60 disabled:text-muted-foreground disabled:cursor-not-allowed',\r\n sizeClasses[size],\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n }\r\n)\r\nTextarea.displayName = 'Textarea'\r\n\r\n// ---------------------------------------------------------------------------\r\n// RichTextEditor (Tiptap) – all text-area types in single file per CONTRIBUTING\r\n// Production-ready: emoji picker, file attach (with image insert), link, code.\r\n// ---------------------------------------------------------------------------\r\n\r\nimport { Tiptap, useEditor, useTiptap } from '@tiptap/react'\r\nimport StarterKit from '@tiptap/starter-kit'\r\nimport Placeholder from '@tiptap/extension-placeholder'\r\nimport Link from '@tiptap/extension-link'\r\nimport Image from '@tiptap/extension-image'\r\nimport { Bold, Italic, Strikethrough, List, ListOrdered, Paperclip, Smile, Code, Link as LinkIcon } from 'lucide-react'\r\nimport { Popover, PopoverTrigger, PopoverContent } from './popover'\r\n\r\nexport type RichTextEditorSize = 'sm' | 'md' | 'lg'\r\n\r\nconst richTextSizeClasses: Record<RichTextEditorSize, string> = {\r\n sm: 'px-2 py-1 min-h-[5rem]',\r\n md: 'px-3 py-2 min-h-[6rem]',\r\n lg: 'px-4 py-3 min-h-[7rem]',\r\n}\r\n\r\n/** Common emojis for default picker (no external dependency). */\r\nconst COMMON_EMOJIS = [\r\n '\\u{1F600}', '\\u{1F603}', '\\u{1F604}', '\\u{1F601}', '\\u{1F606}', '\\u{1F605}',\r\n '\\u{1F923}', '\\u{1F602}', '\\u{1F642}', '\\u{1F643}', '\\u{1F609}', '\\u{1F60A}',\r\n '\\u{1F607}', '\\u{1F970}', '\\u{1F60D}', '\\u{1F929}', '\\u{1F618}', '\\u{1F617}',\r\n '\\u{2764}', '\\u{1F49C}', '\\u{1F44D}', '\\u{1F44E}', '\\u{2705}', '\\u{274C}',\r\n '\\u{1F4DA}', '\\u{1F4E2}', '\\u{1F4E1}', '\\u{1F514}', '\\u{1F4A1}', '\\u{2728}',\r\n]\r\n\r\nexport interface RichTextEditorProps {\r\n placeholder?: string\r\n defaultValue?: string\r\n value?: string\r\n onChange?: (html: string) => void\r\n disabled?: boolean\r\n size?: RichTextEditorSize\r\n showAttach?: boolean\r\n showEmoji?: boolean\r\n /** Called when attach button is clicked. If not provided, default file input is used. */\r\n onAttachClick?: () => void\r\n /** Called when emoji button is clicked. If not provided, default emoji popover is shown. */\r\n onEmojiClick?: () => void\r\n /** Called when files are selected (default flow). If not provided, first image is inserted as data URL. */\r\n onAttachFiles?: (files: File[]) => void\r\n className?: string\r\n editorClassName?: string\r\n}\r\n\r\nfunction EmojiPopoverContent({ onClose }: { onClose: () => void }) {\r\n const { editor } = useTiptap()\r\n if (!editor) return null\r\n return (\r\n <div className=\"grid grid-cols-6 gap-1 p-1 max-h-[12rem] overflow-auto\">\r\n {COMMON_EMOJIS.map((emoji, i) => (\r\n <button\r\n key={i}\r\n type=\"button\"\r\n className=\"h-8 w-8 rounded text-lg hover:bg-muted focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\r\n onClick={() => {\r\n editor.chain().focus().insertContent(emoji).run()\r\n onClose()\r\n }}\r\n aria-label={`Insert ${emoji}`}\r\n >\r\n {emoji}\r\n </button>\r\n ))}\r\n </div>\r\n )\r\n}\r\n\r\nfunction RichTextToolbar({\r\n showAttach,\r\n showEmoji,\r\n onAttachClick,\r\n onEmojiClick,\r\n emojiPopoverOpen,\r\n onEmojiPopoverOpenChange,\r\n}: {\r\n showAttach?: boolean\r\n showEmoji?: boolean\r\n onAttachClick?: () => void\r\n onEmojiClick?: () => void\r\n emojiPopoverOpen?: boolean\r\n onEmojiPopoverOpenChange?: (open: boolean) => void\r\n}) {\r\n const { editor } = useTiptap()\r\n if (!editor) return null\r\n\r\n const btn =\r\n (name: 'bold' | 'italic' | 'strike' | 'code', label: string) =>\r\n (onClick: () => void) =>\r\n (\r\n <button\r\n type=\"button\"\r\n onClick={onClick}\r\n className={cn(\r\n 'inline-flex items-center justify-center h-6 w-6 rounded text-muted-foreground hover:text-foreground',\r\n 'focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring',\r\n editor.isActive(name) && 'text-foreground'\r\n )}\r\n aria-pressed={editor.isActive(name)}\r\n aria-label={label}\r\n >\r\n {name === 'bold' && <Bold className=\"size-3\" />}\r\n {name === 'italic' && <Italic className=\"size-3\" />}\r\n {name === 'strike' && <Strikethrough className=\"size-3\" />}\r\n {name === 'code' && <Code className=\"size-3\" />}\r\n </button>\r\n )\r\n\r\n const setLink = () => {\r\n if (editor.isActive('link')) {\r\n editor.chain().focus().unsetLink().run()\r\n return\r\n }\r\n const url = window.prompt('URL:', 'https://')\r\n if (url) editor.chain().focus().setLink({ href: url }).run()\r\n }\r\n\r\n return (\r\n <div className=\"flex items-center gap-0 flex-wrap\">\r\n {btn('bold', 'Bold')(() => editor.chain().focus().toggleBold().run())}\r\n {btn('italic', 'Italic')(() => editor.chain().focus().toggleItalic().run())}\r\n {btn('strike', 'Strikethrough')(() => editor.chain().focus().toggleStrike().run())}\r\n {btn('code', 'Code')(() => editor.chain().focus().toggleCode().run())}\r\n <span className=\"w-px h-3.5 bg-border mx-0.5\" aria-hidden />\r\n <button\r\n type=\"button\"\r\n onClick={setLink}\r\n className={cn(\r\n 'inline-flex items-center justify-center h-6 w-6 rounded text-muted-foreground hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring',\r\n editor.isActive('link') && 'text-foreground'\r\n )}\r\n aria-pressed={editor.isActive('link')}\r\n aria-label=\"Link\"\r\n >\r\n <LinkIcon className=\"size-3\" />\r\n </button>\r\n <span className=\"w-px h-3.5 bg-border mx-0.5\" aria-hidden />\r\n <button\r\n type=\"button\"\r\n onClick={() => editor.chain().focus().toggleBulletList().run()}\r\n className={cn(\r\n 'inline-flex items-center justify-center h-6 w-6 rounded text-muted-foreground hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring',\r\n editor.isActive('bulletList') && 'text-foreground'\r\n )}\r\n aria-pressed={editor.isActive('bulletList')}\r\n aria-label=\"Bullet list\"\r\n >\r\n <List className=\"size-3\" />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => editor.chain().focus().toggleOrderedList().run()}\r\n className={cn(\r\n 'inline-flex items-center justify-center h-6 w-6 rounded text-muted-foreground hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring',\r\n editor.isActive('orderedList') && 'text-foreground'\r\n )}\r\n aria-pressed={editor.isActive('orderedList')}\r\n aria-label=\"Numbered list\"\r\n >\r\n <ListOrdered className=\"size-3\" />\r\n </button>\r\n {showEmoji && (\r\n <>\r\n <span className=\"w-px h-3.5 bg-border mx-0.5\" aria-hidden />\r\n {onEmojiClick ? (\r\n <button\r\n type=\"button\"\r\n onClick={onEmojiClick}\r\n className=\"inline-flex items-center justify-center h-6 w-6 rounded text-muted-foreground hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\r\n aria-label=\"Insert emoji\"\r\n >\r\n <Smile className=\"size-3\" />\r\n </button>\r\n ) : onEmojiPopoverOpenChange != null ? (\r\n <Popover open={emojiPopoverOpen} onOpenChange={onEmojiPopoverOpenChange}>\r\n <PopoverTrigger asChild>\r\n <button\r\n type=\"button\"\r\n className=\"inline-flex items-center justify-center h-6 w-6 rounded text-muted-foreground hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\r\n aria-label=\"Insert emoji\"\r\n >\r\n <Smile className=\"size-3\" />\r\n </button>\r\n </PopoverTrigger>\r\n <PopoverContent side=\"top\" className=\"w-auto p-0\">\r\n <EmojiPopoverContent onClose={() => onEmojiPopoverOpenChange(false)} />\r\n </PopoverContent>\r\n </Popover>\r\n ) : (\r\n <button\r\n type=\"button\"\r\n className=\"inline-flex items-center justify-center h-6 w-6 rounded text-muted-foreground hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\r\n aria-label=\"Insert emoji\"\r\n >\r\n <Smile className=\"size-3\" />\r\n </button>\r\n )}\r\n </>\r\n )}\r\n {showAttach && (\r\n <button\r\n type=\"button\"\r\n onClick={onAttachClick}\r\n className=\"inline-flex items-center justify-center h-6 w-6 rounded text-muted-foreground hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\r\n aria-label=\"Attach file\"\r\n >\r\n <Paperclip className=\"size-3\" />\r\n </button>\r\n )}\r\n </div>\r\n )\r\n}\r\n\r\nfunction readFileAsDataUrl(file: File): Promise<string> {\r\n return new Promise((resolve, reject) => {\r\n const reader = new FileReader()\r\n reader.onload = () => resolve(reader.result as string)\r\n reader.onerror = reject\r\n reader.readAsDataURL(file)\r\n })\r\n}\r\n\r\n/**\r\n * RichTextEditor\r\n * Production-ready Tiptap editor: bold, italic, strike, code, link, lists, emoji (default picker),\r\n * attach (default file input; inserts image or calls onAttachFiles). All options work out of the box.\r\n */\r\nexport function RichTextEditor({\r\n placeholder = 'Type your message here…',\r\n defaultValue,\r\n value,\r\n onChange,\r\n disabled = false,\r\n size = 'md',\r\n showAttach = true,\r\n showEmoji = true,\r\n onAttachClick: onAttachClickProp,\r\n onEmojiClick: onEmojiClickProp,\r\n onAttachFiles,\r\n className,\r\n editorClassName,\r\n}: RichTextEditorProps) {\r\n const [emojiPopoverOpen, setEmojiPopoverOpen] = React.useState(false)\r\n const fileInputRef = React.useRef<HTMLInputElement>(null)\r\n\r\n const editor = useEditor({\r\n extensions: [\r\n StarterKit,\r\n Placeholder.configure({ placeholder }),\r\n Link.configure({ openOnClick: false }),\r\n Image.configure({ allowBase64: true }),\r\n ],\r\n content: value ?? defaultValue ?? '',\r\n editable: !disabled,\r\n immediatelyRender: false,\r\n onUpdate: ({ editor: e }) => {\r\n onChange?.(e.getHTML())\r\n },\r\n editorProps: {\r\n attributes: {\r\n class: cn(\r\n 'prose prose-sm max-w-none w-full text-sm text-foreground leading-5 focus:outline-none',\r\n 'px-3 pt-2 pb-1',\r\n richTextSizeClasses[size],\r\n editorClassName\r\n ),\r\n },\r\n },\r\n })\r\n\r\n const handleAttachClick = React.useCallback(() => {\r\n if (onAttachClickProp) {\r\n onAttachClickProp()\r\n return\r\n }\r\n fileInputRef.current?.click()\r\n }, [onAttachClickProp])\r\n\r\n const handleFileChange = React.useCallback(\r\n (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const files = e.target.files\r\n if (!files?.length) return\r\n const fileList = Array.from(files)\r\n if (onAttachFiles) {\r\n onAttachFiles(fileList)\r\n } else if (editor) {\r\n const file = fileList[0]\r\n if (file.type.startsWith('image/')) {\r\n readFileAsDataUrl(file).then((src) => {\r\n editor.chain().focus().setImage({ src }).run()\r\n })\r\n }\r\n }\r\n e.target.value = ''\r\n },\r\n [editor, onAttachFiles]\r\n )\r\n\r\n const handleEmojiClick = React.useCallback(() => {\r\n if (onEmojiClickProp) {\r\n onEmojiClickProp()\r\n return\r\n }\r\n setEmojiPopoverOpen(true)\r\n }, [onEmojiClickProp])\r\n\r\n const showDefaultEmojiPopover = !onEmojiClickProp\r\n\r\n if (!editor) return null\r\n\r\n const wrapperClass = cn(\r\n 'mindtris-rich-text-editor rounded-lg border border-input bg-field shadow-none',\r\n 'hover:border-border/80 focus-within:outline-none focus-within:ring-0 focus-within:border-foreground/40',\r\n disabled && 'bg-muted opacity-70 pointer-events-none',\r\n className\r\n )\r\n\r\n return (\r\n <>\r\n <style>{`\r\n .mindtris-rich-text-editor .ProseMirror { outline: none; cursor: text; }\r\n .mindtris-rich-text-editor .ProseMirror p.is-editor-empty:first-child::before {\r\n color: var(--muted-foreground);\r\n content: attr(data-placeholder);\r\n float: left;\r\n height: 0;\r\n pointer-events: none;\r\n }\r\n .mindtris-rich-text-editor .ProseMirror ul,\r\n .mindtris-rich-text-editor .ProseMirror ol { padding-left: 1.5rem; }\r\n .mindtris-rich-text-editor .ProseMirror img { max-width: 100%; height: auto; }\r\n `}</style>\r\n <input\r\n ref={fileInputRef}\r\n type=\"file\"\r\n accept=\"image/*\"\r\n multiple\r\n className=\"hidden\"\r\n aria-hidden\r\n onChange={handleFileChange}\r\n />\r\n <div className={wrapperClass}>\r\n <Tiptap instance={editor}>\r\n <div className=\"min-h-[6rem] flex flex-col\">\r\n <div className=\"flex-1 min-h-0\">\r\n <Tiptap.Content />\r\n </div>\r\n <div className=\"px-2 py-1.5 flex items-center\">\r\n <RichTextToolbar\r\n showAttach={showAttach}\r\n showEmoji={showEmoji}\r\n onAttachClick={handleAttachClick}\r\n onEmojiClick={showDefaultEmojiPopover ? undefined : handleEmojiClick}\r\n emojiPopoverOpen={showDefaultEmojiPopover ? emojiPopoverOpen : undefined}\r\n onEmojiPopoverOpenChange={showDefaultEmojiPopover ? setEmojiPopoverOpen : undefined}\r\n />\r\n </div>\r\n </div>\r\n </Tiptap>\r\n </div>\r\n </>\r\n )\r\n}","'use client'\r\n\r\nimport * as React from 'react'\r\nimport * as PopoverPrimitive from '@radix-ui/react-popover'\r\n\r\nimport { cn } from '../../lib/utils'\r\n\r\nexport type PopoverProps = React.ComponentProps<typeof PopoverPrimitive.Root>\r\nexport type PopoverTriggerProps = React.ComponentProps<typeof PopoverPrimitive.Trigger>\r\nexport type PopoverAnchorProps = React.ComponentProps<typeof PopoverPrimitive.Anchor>\r\nexport type PopoverContentProps = React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>\r\n\r\nconst Popover = PopoverPrimitive.Root\r\n\r\nconst PopoverTrigger = PopoverPrimitive.Trigger\r\nconst PopoverAnchor = PopoverPrimitive.Anchor\r\n\r\nconst PopoverContent = React.forwardRef<\r\n React.ElementRef<typeof PopoverPrimitive.Content>,\r\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>\r\n>(({ className, align = 'center', sideOffset = 4, ...props }, ref) => (\r\n <PopoverPrimitive.Portal>\r\n <PopoverPrimitive.Content\r\n data-slot=\"popover-content\"\r\n ref={ref}\r\n align={align}\r\n sideOffset={sideOffset}\r\n className={cn(\r\n 'z-[9999] w-72 rounded-lg border border-border bg-popover text-popover-foreground p-4 shadow-lg outline-hidden',\r\n 'origin-[--radix-popover-content-transform-origin]',\r\n 'data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95',\r\n 'data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\r\n className\r\n )}\r\n {...props}\r\n />\r\n </PopoverPrimitive.Portal>\r\n))\r\nPopoverContent.displayName = PopoverPrimitive.Content.displayName\r\n\r\nexport { Popover, PopoverTrigger, PopoverAnchor, PopoverContent }\r\n","\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport * as SwitchPrimitive from \"@radix-ui/react-switch\"\r\n\r\nimport { cn } from \"../../lib/utils\"\r\nimport { createVariants } from \"../../lib/variant-utils\"\r\n\r\nexport type SwitchSize = \"sm\" | \"md\" | \"lg\"\r\n\r\nexport type SwitchProps = Omit<\r\n React.ComponentPropsWithoutRef<typeof SwitchPrimitive.Root>,\r\n \"size\"\r\n> & {\r\n size?: SwitchSize\r\n}\r\n\r\nconst switchRootVariants = createVariants({\r\n base: [\r\n \"group relative inline-flex shrink-0 items-center rounded-full overflow-hidden outline-none transition-colors\",\r\n \"border border-transparent\",\r\n \"bg-muted data-[state=checked]:bg-primary\",\r\n \"hover:data-[state=unchecked]:bg-border\",\r\n \"focus-visible:ring-0 focus-visible:border-foreground/40\",\r\n \"data-[state=checked]:border-transparent\",\r\n \"disabled:pointer-events-none disabled:opacity-70 disabled:border-transparent disabled:data-[state=unchecked]:bg-muted\",\r\n \"aria-invalid:data-[state=unchecked]:bg-destructive/10\",\r\n ].join(\" \"),\r\n variants: {\r\n size: {\r\n sm: \"h-4 w-7\",\r\n md: \"h-5 w-9\",\r\n lg: \"h-6 w-12\",\r\n },\r\n },\r\n defaultVariants: {\r\n size: \"md\",\r\n },\r\n})\r\n\r\nconst thumbSizeMap: Record<SwitchSize, string> = {\r\n sm: \"size-3 data-[state=unchecked]:translate-x-0.5 data-[state=checked]:translate-x-[14px]\",\r\n md: \"size-4 data-[state=unchecked]:translate-x-0.5 data-[state=checked]:translate-x-[18px]\",\r\n lg: \"size-5 data-[state=unchecked]:translate-x-1 data-[state=checked]:translate-x-[26px]\",\r\n}\r\n\r\n/**\r\n * Switch. Token-driven. Toggle between checked and unchecked.\r\n * Use with Label for accessibility; supports size (sm, md, lg), disabled, aria-invalid.\r\n */\r\nexport const Switch = React.forwardRef<\r\n React.ElementRef<typeof SwitchPrimitive.Root>,\r\n SwitchProps\r\n>(({ className, size = \"md\", ...props }, ref) => (\r\n <SwitchPrimitive.Root\r\n ref={ref}\r\n data-slot=\"switch\"\r\n data-size={size}\r\n className={cn(switchRootVariants({ size }), className)}\r\n {...props}\r\n >\r\n <SwitchPrimitive.Thumb\r\n data-slot=\"switch-thumb\"\r\n className={cn(\r\n \"pointer-events-none block rounded-full bg-background shadow-sm ring-0 transition-transform group-data-[state=unchecked]:ring-1 group-data-[state=unchecked]:ring-border/80 group-data-[state=unchecked]:ring-inset\",\r\n thumbSizeMap[size]\r\n )}\r\n />\r\n </SwitchPrimitive.Root>\r\n))\r\nSwitch.displayName = \"Switch\"\r\n","\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport * as CheckboxPrimitive from \"@radix-ui/react-checkbox\"\r\nimport { Check, Minus } from \"lucide-react\"\r\n\r\nimport { cn } from \"../../lib/utils\"\r\n\r\nexport type CheckboxProps = React.ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root>\r\n\r\n/**\r\n * Checkbox. Token-driven. Check when checked; minus when indeterminate.\r\n */\r\nexport const Checkbox = React.forwardRef<\r\n React.ElementRef<typeof CheckboxPrimitive.Root>,\r\n CheckboxProps\r\n>(({ className, ...props }, ref) => (\r\n <CheckboxPrimitive.Root\r\n ref={ref}\r\n data-slot=\"checkbox\"\r\n className={cn(\r\n \"group peer h-4 w-4 shrink-0 rounded border border-input bg-field outline-none\",\r\n \"hover:border-border/80\",\r\n \"focus-visible:ring-0 focus-visible:border-foreground/40\",\r\n \"data-[state=checked]:border-primary data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground\",\r\n \"data-[state=indeterminate]:border-primary data-[state=indeterminate]:bg-primary data-[state=indeterminate]:text-primary-foreground\",\r\n \"disabled:pointer-events-none disabled:opacity-50\",\r\n \"transition-colors\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n <CheckboxPrimitive.Indicator\r\n data-slot=\"checkbox-indicator\"\r\n className=\"flex items-center justify-center text-current\"\r\n >\r\n <Check className=\"h-3 w-3 group-data-[state=indeterminate]:hidden\" strokeWidth={2.5} />\r\n <Minus className=\"h-3 w-3 group-data-[state=checked]:hidden\" strokeWidth={2.5} />\r\n </CheckboxPrimitive.Indicator>\r\n </CheckboxPrimitive.Root>\r\n))\r\nCheckbox.displayName = \"Checkbox\"\r\n","\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport * as RadioGroupPrimitive from \"@radix-ui/react-radio-group\"\r\nimport { Circle } from \"lucide-react\"\r\n\r\nimport { cn } from \"../../lib/utils\"\r\nimport { createVariants } from \"../../lib/variant-utils\"\r\n\r\nexport type RadioGroupProps = React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Root>\r\n\r\nexport type RadioGroupSize = \"sm\" | \"md\" | \"lg\"\r\n\r\nexport type RadioGroupItemProps = Omit<\r\n React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Item>,\r\n \"size\"\r\n> & {\r\n size?: RadioGroupSize\r\n}\r\n\r\nconst radioGroupItemVariants = createVariants({\r\n base: [\r\n \"relative aspect-square shrink-0 rounded-full border-2 border-input bg-field outline-none\",\r\n \"hover:border-border/80\",\r\n \"focus-visible:ring-0 focus-visible:border-foreground/40\",\r\n \"disabled:pointer-events-none disabled:opacity-50\",\r\n \"data-[state=checked]:border-primary data-[state=checked]:text-primary\",\r\n \"aria-invalid:border-destructive\",\r\n \"data-[state=checked]:aria-invalid:border-destructive data-[state=checked]:aria-invalid:text-destructive\",\r\n \"transition-colors\",\r\n ].join(\" \"),\r\n variants: {\r\n size: {\r\n sm: \"size-3\",\r\n md: \"size-4\",\r\n lg: \"size-5\",\r\n },\r\n },\r\n defaultVariants: {\r\n size: \"md\",\r\n },\r\n})\r\n\r\nconst dotSizeMap: Record<RadioGroupSize, string> = {\r\n sm: \"h-2 w-2\",\r\n md: \"h-2.5 w-2.5\",\r\n lg: \"h-3 w-3\",\r\n}\r\n\r\n/**\r\n * RadioGroup. Token-driven. Single choice from a set of options.\r\n */\r\nexport const RadioGroup = React.forwardRef<\r\n React.ElementRef<typeof RadioGroupPrimitive.Root>,\r\n RadioGroupProps\r\n>(({ className, ...props }, ref) => (\r\n <RadioGroupPrimitive.Root\r\n ref={ref}\r\n data-slot=\"radio-group\"\r\n className={cn(\"grid gap-3\", className)}\r\n {...props}\r\n />\r\n))\r\nRadioGroup.displayName = \"RadioGroup\"\r\n\r\n/**\r\n * RadioGroupItem. Token-driven. Border and focus match Input/Checkbox.\r\n * Supports size: sm (12px), md (16px), lg (20px).\r\n */\r\nexport const RadioGroupItem = React.forwardRef<\r\n React.ElementRef<typeof RadioGroupPrimitive.Item>,\r\n RadioGroupItemProps\r\n>(({ className, size = \"md\", ...props }, ref) => (\r\n <RadioGroupPrimitive.Item\r\n ref={ref}\r\n data-slot=\"radio-group-item\"\r\n data-size={size}\r\n className={cn(radioGroupItemVariants({ size }), className)}\r\n {...props}\r\n >\r\n <RadioGroupPrimitive.Indicator\r\n data-slot=\"radio-group-indicator\"\r\n className=\"absolute inset-0 flex items-center justify-center\"\r\n >\r\n <Circle\r\n className={cn(\"fill-current\", dotSizeMap[size])}\r\n strokeWidth={0}\r\n />\r\n </RadioGroupPrimitive.Indicator>\r\n </RadioGroupPrimitive.Item>\r\n))\r\nRadioGroupItem.displayName = \"RadioGroupItem\"\r\n","/**\r\n * Chip: Compact pill used for selection, filtering, and tags.\r\n *\r\n * Design-system contract\r\n * - Scope: UI-only primitive (2-app rule). No domain terms, no API calls.\r\n * - Tokens-only: no Tailwind palette colors; use semantic token classes only.\r\n * - A11y: toggle chips use `aria-pressed`; disabled uses native `disabled`.\r\n * - Controlled + uncontrolled: supports `selected` + `onSelectedChange` or `defaultSelected`.\r\n *\r\n * Reference (Once UI / modern apps):\r\n * - selectable chips\r\n * - optional leading icon\r\n * - optional remove action\r\n *\r\n * @author: @mindtris-team\r\n * @version: 0.1.0\r\n * @since: 2026-02-01\r\n */\r\n\r\n\"use client\"\r\n\r\nimport * as React from 'react'\r\nimport { X } from 'lucide-react'\r\nimport { cn } from '../../lib/utils'\r\nimport { createVariants } from '../../lib/variant-utils'\r\n\r\nexport type ChipSize = 'sm' | 'md'\r\nexport type ChipVariant =\r\n | 'primary'\r\n | 'secondary'\r\n | 'tertiary'\r\n | 'accent'\r\n | 'muted'\r\n | 'outline'\r\n | 'ghost'\r\n | 'destructive'\r\n | 'inverse'\r\n /** @deprecated Use \"primary\" instead. */\r\n | 'default'\r\n\r\nexport interface ChipProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'onChange'> {\r\n size?: ChipSize\r\n variant?: ChipVariant\r\n leadingIcon?: React.ReactNode\r\n /** Shows a trailing remove button (X). */\r\n onRemove?: () => void\r\n\r\n /** Uncontrolled initial selected state. */\r\n defaultSelected?: boolean\r\n /** Controlled selected state. */\r\n selected?: boolean\r\n /** Fired when selection changes (toggle). */\r\n onSelectedChange?: (selected: boolean) => void\r\n}\r\n\r\n// Selected = same as Button variant (filled). Matches button-group pressed state.\r\nconst chipSelectedVariants = createVariants({\r\n base: 'border transition-colors',\r\n variants: {\r\n variant: {\r\n primary: 'bg-primary text-primary-foreground border-transparent',\r\n secondary: 'bg-secondary text-secondary-foreground border-border',\r\n tertiary: 'bg-card border border-border text-primary',\r\n accent: 'bg-accent text-accent-foreground border-transparent',\r\n muted: 'bg-muted text-muted-foreground border-border',\r\n outline: 'bg-transparent border border-border text-foreground',\r\n ghost: 'bg-muted text-foreground border-transparent',\r\n destructive: 'bg-destructive text-destructive-foreground border-transparent',\r\n inverse: 'bg-foreground text-background border-transparent',\r\n },\r\n },\r\n defaultVariants: { variant: 'primary' },\r\n})\r\n\r\n// Unselected = outline only (no fill), matching Button outline / button-group unpressed. Same for all variants.\r\nconst chipUnselectedClass =\r\n 'bg-transparent border border-border text-muted-foreground hover:bg-muted hover:text-foreground transition-colors'\r\n\r\nexport function Chip({\r\n size = 'md',\r\n variant = 'primary',\r\n leadingIcon,\r\n onRemove,\r\n defaultSelected = false,\r\n selected,\r\n onSelectedChange,\r\n className,\r\n disabled,\r\n children,\r\n onClick,\r\n ...props\r\n}: ChipProps) {\r\n const isControlled = typeof selected === 'boolean'\r\n const [uncontrolledSelected, setUncontrolledSelected] = React.useState(defaultSelected)\r\n const isSelected = isControlled ? (selected as boolean) : uncontrolledSelected\r\n\r\n const toggle = React.useCallback(() => {\r\n const next = !isSelected\r\n if (!isControlled) setUncontrolledSelected(next)\r\n onSelectedChange?.(next)\r\n }, [isControlled, isSelected, onSelectedChange])\r\n\r\n const sizeClass = size === 'sm' ? 'h-7 px-2.5 text-xs' : 'h-8 px-3 text-sm'\r\n const base =\r\n 'inline-flex items-center gap-1.5 rounded-full font-medium ' +\r\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:opacity-50 disabled:cursor-not-allowed'\r\n\r\n const effectiveVariant = variant === 'default' ? 'primary' : variant\r\n const variantClass = isSelected ? chipSelectedVariants({ variant: effectiveVariant }) : chipUnselectedClass\r\n\r\n return (\r\n <button\r\n type=\"button\"\r\n aria-pressed={isSelected}\r\n disabled={disabled}\r\n className={cn(base, sizeClass, variantClass, className)}\r\n onClick={(e) => {\r\n toggle()\r\n onClick?.(e)\r\n }}\r\n {...props}\r\n >\r\n {leadingIcon ? <span className=\"shrink-0\">{leadingIcon}</span> : null}\r\n <span className=\"truncate\">{children}</span>\r\n\r\n {onRemove ? (\r\n <span className=\"ml-1 inline-flex\">\r\n <span\r\n role=\"button\"\r\n tabIndex={disabled ? -1 : 0}\r\n aria-label=\"Remove\"\r\n className={cn(\r\n 'inline-flex items-center justify-center rounded-full border border-transparent',\r\n 'text-current/80 hover:text-current',\r\n size === 'sm' ? 'h-5 w-5' : 'h-5 w-5'\r\n )}\r\n onClick={(e) => {\r\n e.stopPropagation()\r\n if (disabled) return\r\n onRemove()\r\n }}\r\n onKeyDown={(e) => {\r\n if (disabled) return\r\n if (e.key === 'Enter' || e.key === ' ') {\r\n e.preventDefault()\r\n e.stopPropagation()\r\n onRemove()\r\n }\r\n }}\r\n >\r\n <X className=\"h-3.5 w-3.5\" aria-hidden />\r\n </span>\r\n </span>\r\n ) : null}\r\n </button>\r\n )\r\n}\r\n\r\n","\"use client\"\r\n\r\nimport React from 'react'\r\nimport { cn } from '../../lib/utils'\r\n\r\nexport interface SelectProps extends React.SelectHTMLAttributes<HTMLSelectElement> {}\r\n\r\n/**\r\n * Select styled to match Input — single design system control for dropdowns.\r\n * Use across theme customizer (preset, fonts, etc.) for consistency.\r\n */\r\nexport const Select = React.forwardRef<HTMLSelectElement, SelectProps>(\r\n ({ className, children, ...props }, ref) => {\r\n return (\r\n <select\r\n ref={ref}\r\n className={cn(\r\n 'flex h-10 w-full rounded-lg border border-input bg-field px-3 py-2 text-sm shadow-none transition-colors',\r\n 'hover:border-border/80 focus-visible:outline-none focus-visible:ring-0 focus-visible:border-foreground/40',\r\n 'disabled:cursor-not-allowed disabled:opacity-50',\r\n className\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n </select>\r\n )\r\n }\r\n)\r\nSelect.displayName = 'Select'\r\n","/**\r\n * Native Select: Styled native <select> when Radix Select is not needed.\r\n *\r\n * Design-system contract:\r\n * - Scope: UI-only primitive. No domain copy.\r\n * - Tokens-only: semantic token classes only.\r\n * - Simple, accessible, token-driven. Use for basic selects without custom dropdown.\r\n *\r\n * @author: @mindtris-team\r\n * @version: 0.1.0\r\n * @since: 2026-02-01\r\n */\r\n\r\n\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport { ChevronDown } from \"lucide-react\"\r\n\r\nimport { cn } from \"../../lib/utils\"\r\n\r\nexport type NativeSelectSize = \"sm\" | \"default\" | \"lg\"\r\n\r\nconst sizeClasses: Record<NativeSelectSize, string> = {\r\n sm: \"h-8 text-xs px-2.5\",\r\n default: \"h-10 text-sm px-3\",\r\n lg: \"h-12 text-base px-4\",\r\n}\r\n\r\nexport interface NativeSelectProps extends Omit<React.SelectHTMLAttributes<HTMLSelectElement>, 'size'> {\r\n /** Size variant. */\r\n size?: NativeSelectSize\r\n /** Whether the field has an error. */\r\n invalid?: boolean\r\n /** Full width. */\r\n fullWidth?: boolean\r\n}\r\n\r\nexport const NativeSelect = React.forwardRef<HTMLSelectElement, NativeSelectProps>(\r\n (\r\n {\r\n className,\r\n size = \"default\",\r\n invalid = false,\r\n fullWidth = true,\r\n children,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n return (\r\n <div className={cn(\"relative inline-flex\", fullWidth && \"w-full\")}>\r\n <select\r\n ref={ref}\r\n data-slot=\"native-select\"\r\n data-invalid={invalid ? \"true\" : undefined}\r\n data-size={size}\r\n className={cn(\r\n \"flex w-full appearance-none rounded-lg border bg-field pr-9 shadow-none transition-colors\",\r\n sizeClasses[size],\r\n \"border-input text-foreground\",\r\n \"hover:border-border/80\",\r\n \"focus:outline-none focus:ring-0 focus:border-foreground/40\",\r\n \"disabled:cursor-not-allowed disabled:opacity-50\",\r\n \"invalid:border-destructive invalid:focus:border-destructive\",\r\n invalid && \"border-destructive focus:border-destructive\",\r\n className\r\n )}\r\n aria-invalid={invalid}\r\n {...props}\r\n >\r\n {children}\r\n </select>\r\n <ChevronDown\r\n className=\"pointer-events-none absolute right-2.5 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\"\r\n aria-hidden\r\n />\r\n </div>\r\n )\r\n }\r\n)\r\nNativeSelect.displayName = \"NativeSelect\"\r\n","/**\r\n * Field: Standard form layout (label, control slot, description, error).\r\n *\r\n * Design-system contract:\r\n * - Scope: UI-only primitive. No react-hook-form coupling.\r\n * - Tokens-only: semantic token classes only.\r\n * - Composition: label, children (control), description, error slots.\r\n *\r\n * @author: @mindtris-team\r\n * @version: 0.1.0\r\n * @since: 2026-02-01\r\n */\r\n\r\n\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport { cn } from \"../../lib/utils\"\r\nimport { Label } from \"./label\"\r\n\r\nexport interface FieldProps extends React.HTMLAttributes<HTMLDivElement> {\r\n /** Label text (rendered above the control). */\r\n label?: React.ReactNode\r\n /** Optional htmlFor for the label (links to control id). */\r\n htmlFor?: string\r\n /** Whether the field is required (adds required indicator). */\r\n required?: boolean\r\n /** Description text below the control. */\r\n description?: React.ReactNode\r\n /** Error message (renders in destructive color). */\r\n error?: React.ReactNode\r\n /** Whether the field has an error state (for styling the control). */\r\n invalid?: boolean\r\n /** Optional hint text (renders below description). */\r\n hint?: React.ReactNode\r\n}\r\n\r\nexport function Field({\r\n label,\r\n htmlFor,\r\n required,\r\n description,\r\n error,\r\n invalid,\r\n hint,\r\n children,\r\n className,\r\n id: idProp,\r\n ...props\r\n}: FieldProps) {\r\n const generatedId = React.useId()\r\n const fieldId = idProp ?? generatedId\r\n\r\n return (\r\n <div\r\n data-slot=\"field\"\r\n data-invalid={invalid || !!error ? \"true\" : undefined}\r\n className={cn(\"grid gap-2\", className)}\r\n {...props}\r\n >\r\n {label ? (\r\n <Label htmlFor={htmlFor ?? fieldId} className=\"text-sm font-medium text-foreground\">\r\n {label}\r\n {required ? (\r\n <span className=\"ml-0.5 text-destructive\" aria-hidden>\r\n *\r\n </span>\r\n ) : null}\r\n </Label>\r\n ) : null}\r\n {children ? (\r\n <div data-slot=\"field-control\" className=\"min-w-0\">\r\n {React.isValidElement(children)\r\n ? React.cloneElement(children as React.ReactElement<{ id?: string; \"aria-invalid\"?: boolean; \"aria-describedby\"?: string }>, {\r\n id: (children.props as { id?: string }).id ?? fieldId,\r\n ...((invalid || error) && { \"aria-invalid\": true }),\r\n ...((error || description) && {\r\n \"aria-describedby\": error ? `${fieldId}-error` : `${fieldId}-description`,\r\n }),\r\n })\r\n : children}\r\n </div>\r\n ) : null}\r\n {description && !error ? (\r\n <p\r\n data-slot=\"field-description\"\r\n id={`${fieldId}-description`}\r\n className=\"text-sm text-muted-foreground\"\r\n >\r\n {description}\r\n </p>\r\n ) : null}\r\n {error ? (\r\n <p\r\n data-slot=\"field-error\"\r\n id={`${fieldId}-error`}\r\n className=\"text-sm text-destructive\"\r\n role=\"alert\"\r\n >\r\n {error}\r\n </p>\r\n ) : null}\r\n {hint && !error ? (\r\n <p data-slot=\"field-hint\" className=\"text-xs text-muted-foreground\">\r\n {hint}\r\n </p>\r\n ) : null}\r\n </div>\r\n )\r\n}\r\n\r\nexport type FieldDescriptionProps = React.ComponentProps<\"p\">\r\nexport type FieldErrorProps = React.ComponentProps<\"p\">\r\n","'use client'\r\n\r\nimport * as React from 'react'\r\n\r\nimport { cn } from '../../lib/utils'\r\n\r\nexport type LabelProps = React.LabelHTMLAttributes<HTMLLabelElement>\r\n\r\n/**\r\n * Label\r\n * Accessible label for form controls. Use with htmlFor + id on the control.\r\n * Token-driven; supports peer-disabled and group disabled state.\r\n * Composable: no business logic, no domain terminology.\r\n */\r\nexport const Label = React.forwardRef<HTMLLabelElement, LabelProps>(\r\n ({ className, ...props }, ref) => {\r\n return (\r\n <label\r\n ref={ref}\r\n data-slot=\"label\"\r\n className={cn(\r\n 'flex items-center gap-2 text-sm font-medium leading-none text-foreground select-none',\r\n 'peer-disabled:cursor-not-allowed peer-disabled:opacity-70',\r\n 'group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50',\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n }\r\n)\r\nLabel.displayName = 'Label'\r\n","/**\r\n * Empty: Empty state primitive (icon, title, description, action).\r\n *\r\n * Design-system contract:\r\n * - Scope: UI-only primitive. No domain copy.\r\n * - Tokens-only: semantic token classes only.\r\n * - Composition: icon slot, title, description, action slot.\r\n *\r\n * @author: @mindtris-team\r\n * @version: 0.1.0\r\n * @since: 2026-02-01\r\n */\r\n\r\n\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport { cn } from \"../../lib/utils\"\r\n\r\nexport interface EmptyProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\r\n /** Optional icon or illustration above the title. */\r\n icon?: React.ReactNode\r\n /** Main heading for the empty state. */\r\n title?: React.ReactNode\r\n /** Supporting description text. */\r\n description?: React.ReactNode\r\n /** Optional action (e.g. button) below the description. */\r\n action?: React.ReactNode\r\n /** Size variant. */\r\n size?: \"sm\" | \"default\" | \"lg\"\r\n}\r\n\r\nconst sizeClasses = {\r\n sm: \"py-8 gap-3\",\r\n default: \"py-12 gap-4\",\r\n lg: \"py-16 gap-5\",\r\n}\r\n\r\nexport function Empty({\r\n icon,\r\n title,\r\n description,\r\n action,\r\n size = \"default\",\r\n className,\r\n children,\r\n ...props\r\n}: EmptyProps) {\r\n return (\r\n <div\r\n data-slot=\"empty\"\r\n role=\"status\"\r\n aria-label={typeof title === \"string\" ? title : undefined}\r\n className={cn(\r\n \"flex flex-col items-center justify-center text-center\",\r\n sizeClasses[size],\r\n className\r\n )}\r\n {...props}\r\n >\r\n {icon ? (\r\n <div\r\n data-slot=\"empty-icon\"\r\n className=\"flex items-center justify-center text-muted-foreground [&>svg]:size-10 sm:[&>svg]:size-12\"\r\n >\r\n {icon}\r\n </div>\r\n ) : null}\r\n {title ? (\r\n <h3 data-slot=\"empty-title\" className=\"text-base font-semibold text-foreground sm:text-lg\">\r\n {title}\r\n </h3>\r\n ) : null}\r\n {description ? (\r\n <p data-slot=\"empty-description\" className=\"max-w-sm text-sm text-muted-foreground\">\r\n {description}\r\n </p>\r\n ) : null}\r\n {action ? <div data-slot=\"empty-action\">{action}</div> : null}\r\n {children}\r\n </div>\r\n )\r\n}\r\n","/**\r\n * Carousel: Image/content slides using Embla Carousel.\r\n *\r\n * Design-system contract:\r\n * - Scope: UI-only primitive. No domain copy.\r\n * - Tokens-only: semantic token classes only.\r\n * - Composition: Carousel, CarouselContent, CarouselItem, CarouselPrevious, CarouselNext.\r\n *\r\n * @author: @mindtris-team\r\n * @version: 0.1.0\r\n * @since: 2026-02-01\r\n */\r\n\r\n\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport useEmblaCarousel, {\r\n type UseEmblaCarouselType,\r\n} from \"embla-carousel-react\"\r\nimport { ChevronLeft, ChevronRight } from \"lucide-react\"\r\n\r\nimport { cn } from \"../../lib/utils\"\r\nimport { Button } from \"./button\"\r\n\r\nexport type CarouselApi = UseEmblaCarouselType[1]\r\nexport type UseCarouselParameters = Parameters<typeof useEmblaCarousel>\r\nexport type CarouselOptions = UseCarouselParameters[0]\r\nexport type CarouselPlugin = UseCarouselParameters[1]\r\n\r\ntype CarouselContextProps = {\r\n carouselRef: ReturnType<typeof useEmblaCarousel>[0]\r\n api: ReturnType<typeof useEmblaCarousel>[1]\r\n scrollPrev: () => void\r\n scrollNext: () => void\r\n canScrollPrev: boolean\r\n canScrollNext: boolean\r\n orientation: \"horizontal\" | \"vertical\"\r\n}\r\n\r\nconst CarouselContext = React.createContext<CarouselContextProps | null>(null)\r\n\r\nfunction useCarousel() {\r\n const context = React.useContext(CarouselContext)\r\n if (!context) {\r\n throw new Error(\"useCarousel must be used within a <Carousel />\")\r\n }\r\n return context\r\n}\r\n\r\nexport type CarouselProps = {\r\n opts?: CarouselOptions\r\n plugins?: CarouselPlugin\r\n orientation?: \"horizontal\" | \"vertical\"\r\n setApi?: (api: CarouselApi) => void\r\n} & React.HTMLAttributes<HTMLDivElement>\r\n\r\nconst Carousel = React.forwardRef<HTMLDivElement, CarouselProps>(\r\n (\r\n {\r\n orientation = \"horizontal\",\r\n opts,\r\n setApi,\r\n plugins,\r\n className,\r\n children,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const [carouselRef, api] = useEmblaCarousel(\r\n {\r\n ...opts,\r\n axis: orientation === \"horizontal\" ? \"x\" : \"y\",\r\n },\r\n plugins\r\n )\r\n const [canScrollPrev, setCanScrollPrev] = React.useState(false)\r\n const [canScrollNext, setCanScrollNext] = React.useState(false)\r\n\r\n const scrollPrev = React.useCallback(() => {\r\n api?.scrollPrev()\r\n }, [api])\r\n\r\n const scrollNext = React.useCallback(() => {\r\n api?.scrollNext()\r\n }, [api])\r\n\r\n const onSelect = React.useCallback((api: NonNullable<CarouselApi>) => {\r\n setCanScrollPrev(api.canScrollPrev())\r\n setCanScrollNext(api.canScrollNext())\r\n }, [])\r\n\r\n React.useEffect(() => {\r\n if (!api) return\r\n setApi?.(api)\r\n onSelect(api)\r\n api.on(\"reInit\", onSelect).on(\"select\", onSelect)\r\n }, [api, onSelect, setApi])\r\n\r\n return (\r\n <CarouselContext.Provider\r\n value={{\r\n carouselRef,\r\n api: api ?? (null as unknown as CarouselApi),\r\n scrollPrev,\r\n scrollNext,\r\n canScrollPrev,\r\n canScrollNext,\r\n orientation,\r\n }}\r\n >\r\n <div\r\n ref={ref}\r\n data-slot=\"carousel\"\r\n className={cn(\"relative\", className)}\r\n data-orientation={orientation}\r\n {...props}\r\n >\r\n {children}\r\n </div>\r\n </CarouselContext.Provider>\r\n )\r\n }\r\n)\r\nCarousel.displayName = \"Carousel\"\r\n\r\nexport type CarouselContentProps = React.HTMLAttributes<HTMLDivElement>\r\n\r\nconst CarouselContent = React.forwardRef<HTMLDivElement, CarouselContentProps>(\r\n ({ className, ...props }, ref) => {\r\n const { carouselRef, orientation } = useCarousel()\r\n\r\n return (\r\n <div ref={carouselRef} className=\"overflow-hidden\">\r\n <div\r\n ref={ref}\r\n data-slot=\"carousel-content\"\r\n className={cn(\r\n \"flex\",\r\n orientation === \"horizontal\" ? \"-ml-4\" : \"-mt-4 flex-col\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n </div>\r\n )\r\n }\r\n)\r\nCarouselContent.displayName = \"CarouselContent\"\r\n\r\nexport type CarouselItemProps = React.HTMLAttributes<HTMLDivElement>\r\n\r\nconst CarouselItem = React.forwardRef<HTMLDivElement, CarouselItemProps>(\r\n ({ className, ...props }, ref) => {\r\n const { orientation } = useCarousel()\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n data-slot=\"carousel-item\"\r\n role=\"group\"\r\n aria-roledescription=\"slide\"\r\n className={cn(\r\n \"min-w-0 shrink-0 grow-0 basis-full\",\r\n orientation === \"horizontal\" ? \"pl-4\" : \"pt-4\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n }\r\n)\r\nCarouselItem.displayName = \"CarouselItem\"\r\n\r\nexport type CarouselPreviousProps = React.ComponentProps<typeof Button>\r\n\r\nfunction CarouselPrevious({\r\n className,\r\n variant = \"outline\",\r\n size = \"icon\",\r\n ...props\r\n}: CarouselPreviousProps) {\r\n const { orientation, scrollPrev, canScrollPrev } = useCarousel()\r\n return (\r\n <Button\r\n variant={variant}\r\n size={size}\r\n className={cn(\r\n \"absolute h-8 w-8 rounded-full\",\r\n orientation === \"horizontal\"\r\n ? \"-left-12 top-1/2 -translate-y-1/2\"\r\n : \"-top-12 left-1/2 -translate-x-1/2 rotate-90\",\r\n className\r\n )}\r\n disabled={!canScrollPrev}\r\n onClick={scrollPrev}\r\n aria-label=\"Previous slide\"\r\n {...props}\r\n >\r\n <ChevronLeft className=\"h-4 w-4\" />\r\n </Button>\r\n )\r\n}\r\nCarouselPrevious.displayName = \"CarouselPrevious\"\r\n\r\nexport type CarouselNextProps = React.ComponentProps<typeof Button>\r\n\r\nfunction CarouselNext({\r\n className,\r\n variant = \"outline\",\r\n size = \"icon\",\r\n ...props\r\n}: CarouselNextProps) {\r\n const { orientation, scrollNext, canScrollNext } = useCarousel()\r\n return (\r\n <Button\r\n variant={variant}\r\n size={size}\r\n className={cn(\r\n \"absolute h-8 w-8 rounded-full\",\r\n orientation === \"horizontal\"\r\n ? \"-right-12 top-1/2 -translate-y-1/2\"\r\n : \"-bottom-12 left-1/2 -translate-x-1/2 rotate-90\",\r\n className\r\n )}\r\n disabled={!canScrollNext}\r\n onClick={scrollNext}\r\n aria-label=\"Next slide\"\r\n {...props}\r\n >\r\n <ChevronRight className=\"h-4 w-4\" />\r\n </Button>\r\n )\r\n}\r\nCarouselNext.displayName = \"CarouselNext\"\r\n\r\nexport {\r\n Carousel,\r\n CarouselContent,\r\n CarouselItem,\r\n CarouselPrevious,\r\n CarouselNext,\r\n useCarousel,\r\n}\r\n","/**\r\n * Combobox: Searchable select (Popover + Command pattern).\r\n *\r\n * Design-system contract:\r\n * - Scope: UI-only primitive. No domain copy.\r\n * - Tokens-only: semantic token classes only.\r\n * - Composition: Popover + Command for searchable dropdown.\r\n *\r\n * @author: @mindtris-team\r\n * @version: 0.1.0\r\n * @since: 2026-02-01\r\n */\r\n\r\n\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport { Check, ChevronsUpDown } from \"lucide-react\"\r\n\r\nimport { cn } from \"../../lib/utils\"\r\nimport { Button } from \"./button\"\r\nimport {\r\n Command,\r\n CommandEmpty,\r\n CommandGroup,\r\n CommandInput,\r\n CommandItem,\r\n CommandList,\r\n} from \"./command\"\r\nimport { Popover, PopoverContent, PopoverTrigger } from \"./popover\"\r\n\r\nexport interface ComboboxOption<T extends string = string> {\r\n value: T\r\n label: string\r\n disabled?: boolean\r\n}\r\n\r\nexport interface ComboboxProps<T extends string = string> {\r\n /** Controlled value. */\r\n value?: T\r\n /** Callback when selection changes. */\r\n onChange?: (value: T) => void\r\n /** Options to display. */\r\n options: readonly ComboboxOption<T>[]\r\n /** Placeholder when nothing selected. */\r\n placeholder?: string\r\n /** Search input placeholder. */\r\n searchPlaceholder?: string\r\n /** Empty state message when no results. */\r\n emptyMessage?: string\r\n /** Whether the combobox is disabled. */\r\n disabled?: boolean\r\n /** Whether to allow clearing (empty value). When true, adds an explicit \"Clear\" option. */\r\n clearable?: boolean\r\n /** Label for the clear option when clearable. Default: \"Clear\" */\r\n clearLabel?: string\r\n /** Optional class for the trigger button. */\r\n triggerClassName?: string\r\n /** Optional class for the popover content. */\r\n contentClassName?: string\r\n /** Full width trigger. */\r\n fullWidth?: boolean\r\n}\r\n\r\nexport function Combobox<T extends string = string>({\r\n value,\r\n onChange,\r\n options,\r\n placeholder = \"Select option...\",\r\n searchPlaceholder = \"Search...\",\r\n emptyMessage = \"No option found.\",\r\n disabled = false,\r\n clearable = false,\r\n clearLabel = \"Clear\",\r\n triggerClassName,\r\n contentClassName,\r\n fullWidth = false,\r\n}: ComboboxProps<T>) {\r\n const [open, setOpen] = React.useState(false)\r\n const selected = options.find((o) => o.value === value)\r\n\r\n const handleSelect = React.useCallback(\r\n (currentValue: string) => {\r\n const isClear = clearable && (currentValue === \"__clear__\" || currentValue === clearLabel)\r\n const next = isClear ? undefined : (currentValue as T)\r\n onChange?.(next as T)\r\n setOpen(false)\r\n },\r\n [clearable, clearLabel, onChange]\r\n )\r\n\r\n return (\r\n <Popover open={open} onOpenChange={setOpen}>\r\n <PopoverTrigger asChild>\r\n <Button\r\n variant=\"outline\"\r\n role=\"combobox\"\r\n aria-expanded={open}\r\n aria-label={selected?.label ?? placeholder}\r\n disabled={disabled}\r\n className={cn(\r\n \"justify-between font-normal\",\r\n fullWidth && \"w-full\",\r\n !value && \"text-muted-foreground\",\r\n value && \"border-foreground\",\r\n triggerClassName\r\n )}\r\n >\r\n <span className=\"truncate\">{selected?.label ?? placeholder}</span>\r\n <ChevronsUpDown className=\"ml-2 h-4 w-4 shrink-0 opacity-50\" />\r\n </Button>\r\n </PopoverTrigger>\r\n <PopoverContent\r\n className={cn(\"w-[--radix-popover-trigger-width] p-0\", contentClassName)}\r\n align=\"start\"\r\n >\r\n <Command>\r\n <CommandInput placeholder={searchPlaceholder} />\r\n <CommandList>\r\n <CommandEmpty>{emptyMessage}</CommandEmpty>\r\n <CommandGroup>\r\n {clearable && value ? (\r\n <CommandItem value=\"__clear__\" onSelect={() => handleSelect(\"__clear__\")}>\r\n <span className=\"mr-2 h-4 w-4 shrink-0\" aria-hidden />\r\n {clearLabel}\r\n </CommandItem>\r\n ) : null}\r\n {options.map((opt) => (\r\n <CommandItem\r\n key={opt.value}\r\n value={opt.label}\r\n disabled={opt.disabled}\r\n onSelect={() => handleSelect(opt.value)}\r\n >\r\n <Check\r\n className={cn(\r\n \"mr-2 h-4 w-4\",\r\n value === opt.value ? \"opacity-100\" : \"opacity-0\"\r\n )}\r\n />\r\n {opt.label}\r\n </CommandItem>\r\n ))}\r\n </CommandGroup>\r\n </CommandList>\r\n </Command>\r\n </PopoverContent>\r\n </Popover>\r\n )\r\n}\r\n","\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport { Command as CommandPrimitive } from \"cmdk\"\r\nimport { Search } from \"lucide-react\"\r\n\r\nimport { cn } from \"../../lib/utils\"\r\nimport {\r\n Dialog,\r\n DialogContent,\r\n DialogDescription,\r\n DialogHeader,\r\n DialogProps,\r\n DialogTitle,\r\n} from \"./dialog\"\r\n\r\nexport type CommandProps = React.ComponentPropsWithoutRef<typeof CommandPrimitive>\r\nexport type CommandDialogProps = DialogProps & {\r\n title?: string\r\n description?: string\r\n /** Props applied to the inner command root. */\r\n commandProps?: CommandProps\r\n /** Extra classes applied to the dialog content. */\r\n className?: string\r\n /** Whether to render the top-right close button. */\r\n showCloseButton?: boolean\r\n}\r\n\r\nexport const Command = React.forwardRef<\r\n React.ElementRef<typeof CommandPrimitive>,\r\n CommandProps\r\n>(({ className, ...props }, ref) => (\r\n <CommandPrimitive\r\n ref={ref}\r\n data-slot=\"command\"\r\n className={cn(\r\n \"flex h-full w-full flex-col overflow-hidden rounded-lg bg-popover text-popover-foreground\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nCommand.displayName = \"Command\"\r\n\r\nexport function CommandDialog({\r\n title = \"Command Palette\",\r\n description = \"Search for a command to run...\",\r\n children,\r\n commandProps,\r\n className,\r\n showCloseButton = true,\r\n ...props\r\n}: CommandDialogProps) {\r\n return (\r\n <Dialog {...props}>\r\n <DialogHeader className=\"sr-only\">\r\n <DialogTitle>{title}</DialogTitle>\r\n <DialogDescription>{description}</DialogDescription>\r\n </DialogHeader>\r\n <DialogContent className={cn(\"overflow-hidden p-0\", className)} showCloseButton={showCloseButton}>\r\n <Command\r\n {...commandProps}\r\n className={cn(\r\n // Match shadcn-like internal spacing when rendered in a dialog\r\n \"[&_[data-slot=command-input-wrapper]]:h-12 [&_[data-slot=command-input]]:h-12\",\r\n \"[&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground\",\r\n \"[&_[cmdk-group]]:px-2\",\r\n \"[&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3\",\r\n commandProps?.className\r\n )}\r\n >\r\n {children}\r\n </Command>\r\n </DialogContent>\r\n </Dialog>\r\n )\r\n}\r\n\r\nexport const CommandInput = React.forwardRef<\r\n React.ElementRef<typeof CommandPrimitive.Input>,\r\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Input>\r\n>(({ className, ...props }, ref) => (\r\n <div\r\n data-slot=\"command-input-wrapper\"\r\n className=\"flex h-9 items-center gap-2 border-b border-border bg-muted/30 px-3 rounded-t-lg\"\r\n >\r\n <Search className=\"h-4 w-4 text-muted-foreground\" aria-hidden />\r\n <CommandPrimitive.Input\r\n ref={ref}\r\n data-slot=\"command-input\"\r\n className={cn(\r\n \"flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-none\",\r\n \"placeholder:text-muted-foreground\",\r\n \"disabled:cursor-not-allowed disabled:opacity-50\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n </div>\r\n))\r\nCommandInput.displayName = \"CommandInput\"\r\n\r\nexport const CommandList = React.forwardRef<\r\n React.ElementRef<typeof CommandPrimitive.List>,\r\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.List>\r\n>(({ className, ...props }, ref) => (\r\n <CommandPrimitive.List\r\n ref={ref}\r\n data-slot=\"command-list\"\r\n className={cn(\"max-h-[300px] scroll-py-1 overflow-x-hidden overflow-y-auto\", className)}\r\n {...props}\r\n />\r\n))\r\nCommandList.displayName = \"CommandList\"\r\n\r\nexport const CommandEmpty = React.forwardRef<\r\n React.ElementRef<typeof CommandPrimitive.Empty>,\r\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Empty>\r\n>(({ className, ...props }, ref) => (\r\n <CommandPrimitive.Empty\r\n ref={ref}\r\n data-slot=\"command-empty\"\r\n className={cn(\"py-6 text-center text-sm text-muted-foreground\", className)}\r\n {...props}\r\n />\r\n))\r\nCommandEmpty.displayName = \"CommandEmpty\"\r\n\r\nexport const CommandGroup = React.forwardRef<\r\n React.ElementRef<typeof CommandPrimitive.Group>,\r\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Group>\r\n>(({ className, ...props }, ref) => (\r\n <CommandPrimitive.Group\r\n ref={ref}\r\n data-slot=\"command-group\"\r\n className={cn(\r\n \"overflow-hidden p-1 text-foreground\",\r\n // heading\r\n \"[&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nCommandGroup.displayName = \"CommandGroup\"\r\n\r\nexport const CommandSeparator = React.forwardRef<\r\n React.ElementRef<typeof CommandPrimitive.Separator>,\r\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Separator>\r\n>(({ className, ...props }, ref) => (\r\n <CommandPrimitive.Separator\r\n ref={ref}\r\n data-slot=\"command-separator\"\r\n className={cn(\"-mx-1 h-px min-h-0 max-h-px shrink-0 bg-border/90\", className)}\r\n {...props}\r\n />\r\n))\r\nCommandSeparator.displayName = \"CommandSeparator\"\r\n\r\nexport const CommandItem = React.forwardRef<\r\n React.ElementRef<typeof CommandPrimitive.Item>,\r\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Item>\r\n>(({ className, ...props }, ref) => (\r\n <CommandPrimitive.Item\r\n ref={ref}\r\n data-slot=\"command-item\"\r\n className={cn(\r\n \"relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none\",\r\n \"data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground aria-selected:bg-accent aria-selected:text-accent-foreground\",\r\n \"data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50\",\r\n \"[&_svg:not([class*='text-'])]:text-muted-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:h-4 [&_svg:not([class*='size-'])]:w-4\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nCommandItem.displayName = \"CommandItem\"\r\n\r\nexport function CommandShortcut({ className, ...props }: React.HTMLAttributes<HTMLSpanElement>) {\r\n return (\r\n <span\r\n data-slot=\"command-shortcut\"\r\n className={cn(\"ml-auto text-xs tracking-widest text-muted-foreground\", className)}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\n","\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\"\r\nimport { X } from \"lucide-react\"\r\n\r\nimport { cn } from \"../../lib/utils\"\r\nimport { useMediaQuery } from \"../../hooks/use-media-query\"\r\nimport { Button } from \"./button\"\r\nimport { Separator } from \"./separator\"\r\nimport {\r\n Drawer,\r\n DrawerClose,\r\n DrawerContent,\r\n DrawerDescription,\r\n DrawerFooter,\r\n DrawerHeader,\r\n DrawerTitle,\r\n} from \"./drawer\"\r\n\r\nexport type DialogProps = React.ComponentProps<typeof DialogPrimitive.Root>\r\nexport type DialogTriggerProps = React.ComponentProps<typeof DialogPrimitive.Trigger>\r\nexport type DialogPortalProps = React.ComponentProps<typeof DialogPrimitive.Portal>\r\nexport type DialogCloseProps = React.ComponentProps<typeof DialogPrimitive.Close>\r\nexport type DialogOverlayProps = React.ComponentProps<typeof DialogPrimitive.Overlay>\r\nexport type DialogContentProps = React.ComponentProps<typeof DialogPrimitive.Content> & {\r\n /** Whether to render the top-right close button. */\r\n showCloseButton?: boolean\r\n}\r\nexport type DialogHeaderProps = React.ComponentProps<\"div\">\r\nexport type DialogFooterProps = React.ComponentProps<\"div\">\r\nexport type DialogTitleProps = React.ComponentProps<typeof DialogPrimitive.Title>\r\nexport type DialogDescriptionProps = React.ComponentProps<typeof DialogPrimitive.Description>\r\n\r\nexport function Dialog({ ...props }: DialogProps) {\r\n return <DialogPrimitive.Root data-slot=\"dialog\" {...props} />\r\n}\r\n\r\nexport function DialogTrigger({ ...props }: DialogTriggerProps) {\r\n return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />\r\n}\r\n\r\nexport function DialogPortal({ ...props }: DialogPortalProps) {\r\n return <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />\r\n}\r\n\r\nexport function DialogClose({ ...props }: DialogCloseProps) {\r\n return <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />\r\n}\r\n\r\nexport function DialogOverlay({ className, ...props }: DialogOverlayProps) {\r\n return (\r\n <DialogPrimitive.Overlay\r\n data-slot=\"dialog-overlay\"\r\n className={cn(\r\n \"fixed inset-0 z-[80]\",\r\n \"bg-foreground/20\",\r\n \"data-[state=open]:animate-in data-[state=closed]:animate-out\",\r\n \"data-[state=open]:fade-in-0 data-[state=closed]:fade-out-0\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport function DialogContent({\r\n className,\r\n children,\r\n showCloseButton = true,\r\n ...props\r\n}: DialogContentProps) {\r\n return (\r\n <DialogPortal>\r\n <DialogOverlay />\r\n <DialogPrimitive.Content\r\n data-slot=\"dialog-content\"\r\n className={cn(\r\n \"fixed left-1/2 top-1/2 z-[81] grid w-full max-w-[calc(100%-2rem)] -translate-x-1/2 -translate-y-1/2 gap-4\",\r\n \"rounded-xl border border-border bg-card text-card-foreground shadow-xl\",\r\n \"p-6 sm:max-w-lg\",\r\n \"data-[state=open]:animate-in data-[state=closed]:animate-out\",\r\n \"data-[state=open]:fade-in-0 data-[state=closed]:fade-out-0\",\r\n \"data-[state=open]:zoom-in-95 data-[state=closed]:zoom-out-95\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n {showCloseButton ? (\r\n <DialogPrimitive.Close\r\n data-slot=\"dialog-close\"\r\n className={cn(\r\n \"absolute right-4 top-4 inline-flex cursor-pointer items-center justify-center rounded-md\",\r\n \"h-8 w-8 text-muted-foreground hover:text-foreground hover:bg-muted\",\r\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\r\n \"disabled:pointer-events-none [&_svg]:pointer-events-none\"\r\n )}\r\n >\r\n <X className=\"h-4 w-4\" aria-hidden />\r\n <span className=\"sr-only\">Close</span>\r\n </DialogPrimitive.Close>\r\n ) : null}\r\n </DialogPrimitive.Content>\r\n </DialogPortal>\r\n )\r\n}\r\n\r\nexport function DialogHeader({ className, ...props }: DialogHeaderProps) {\r\n return (\r\n <div\r\n data-slot=\"dialog-header\"\r\n className={cn(\"flex flex-col gap-1.5 text-center sm:text-left\", className)}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport function DialogFooter({ className, ...props }: DialogFooterProps) {\r\n return (\r\n <div\r\n data-slot=\"dialog-footer\"\r\n className={cn(\"flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\", className)}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport function DialogTitle({ className, ...props }: DialogTitleProps) {\r\n return (\r\n <DialogPrimitive.Title\r\n data-slot=\"dialog-title\"\r\n className={cn(\"text-lg font-semibold leading-none\", className)}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport function DialogDescription({ className, ...props }: DialogDescriptionProps) {\r\n return (\r\n <DialogPrimitive.Description\r\n data-slot=\"dialog-description\"\r\n className={cn(\"text-sm text-muted-foreground\", className)}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport type ResponsiveDialogMode = \"dialog\" | \"drawer\"\r\nexport type ResponsiveDrawerDirection = \"top\" | \"right\" | \"bottom\" | \"left\"\r\n\r\nexport interface ResponsiveDialogProps {\r\n open: boolean\r\n onOpenChange: (open: boolean) => void\r\n title?: React.ReactNode\r\n description?: React.ReactNode\r\n children: React.ReactNode\r\n footer?: React.ReactNode\r\n desktopQuery?: string\r\n drawerDirection?: ResponsiveDrawerDirection\r\n mode?: ResponsiveDialogMode\r\n contentClassName?: string\r\n bodyClassName?: string\r\n headerClassName?: string\r\n footerClassName?: string\r\n hideClose?: boolean\r\n}\r\n\r\n/**\r\n * ResponsiveDialog\r\n * Renders Dialog on desktop and Drawer on mobile (md+ breakpoint). Extends Dialog; apps use this when a modal should adapt by breakpoint.\r\n */\r\nexport function ResponsiveDialog({\r\n open,\r\n onOpenChange,\r\n title,\r\n description,\r\n children,\r\n footer,\r\n desktopQuery = \"(min-width: 768px)\",\r\n drawerDirection = \"bottom\",\r\n mode,\r\n contentClassName,\r\n bodyClassName,\r\n headerClassName,\r\n footerClassName,\r\n hideClose = false,\r\n}: ResponsiveDialogProps) {\r\n const isDesktop = useMediaQuery(desktopQuery)\r\n const resolvedMode: ResponsiveDialogMode = mode ?? (isDesktop ? \"dialog\" : \"drawer\")\r\n\r\n if (resolvedMode === \"dialog\") {\r\n return (\r\n <Dialog open={open} onOpenChange={onOpenChange}>\r\n <DialogContent className={cn(\"p-0 overflow-hidden\", contentClassName)} showCloseButton={!hideClose}>\r\n {(title || description) ? (\r\n <DialogHeader className={cn(\"px-6 pt-6 pb-4\", headerClassName)}>\r\n {title ? <DialogTitle className=\"text-base\">{title}</DialogTitle> : null}\r\n {description ? <DialogDescription>{description}</DialogDescription> : null}\r\n </DialogHeader>\r\n ) : null}\r\n {(title || description) ? <Separator /> : null}\r\n <div className={cn(\"px-6 py-4\", bodyClassName)}>{children}</div>\r\n {footer ? <Separator /> : null}\r\n {footer ? (\r\n <DialogFooter className={cn(\"px-6 pt-4 pb-6\", footerClassName)}>{footer}</DialogFooter>\r\n ) : null}\r\n </DialogContent>\r\n </Dialog>\r\n )\r\n }\r\n\r\n return (\r\n <Drawer open={open} onOpenChange={onOpenChange} direction={drawerDirection}>\r\n <DrawerContent className={cn(\"p-0\", contentClassName)}>\r\n {!hideClose ? (\r\n <div className=\"absolute right-4 top-4 z-10\">\r\n <DrawerClose asChild>\r\n <Button variant=\"icon-ghost\" size=\"icon-sm\" aria-label=\"Close\">\r\n <X className=\"h-4 w-4\" aria-hidden />\r\n </Button>\r\n </DrawerClose>\r\n </div>\r\n ) : null}\r\n {(title || description) ? (\r\n <DrawerHeader className={cn(\"px-6 pt-6 pb-4\", headerClassName)}>\r\n {title ? <DrawerTitle className=\"text-base\">{title}</DrawerTitle> : null}\r\n {description ? <DrawerDescription>{description}</DrawerDescription> : null}\r\n </DrawerHeader>\r\n ) : null}\r\n {(title || description) ? <Separator /> : null}\r\n <div className={cn(\"px-6 py-4\", bodyClassName)}>{children}</div>\r\n {footer ? <Separator /> : null}\r\n {footer ? (\r\n <DrawerFooter className={cn(\"px-6 pt-4 pb-6\", footerClassName)}>{footer}</DrawerFooter>\r\n ) : null}\r\n </DrawerContent>\r\n </Drawer>\r\n )\r\n}\r\n\r\n","/**\r\n * Separator: Visual divider (horizontal or vertical).\r\n *\r\n * Design-system contract\r\n * - Scope: UI-only primitive.\r\n * - Tokens-only: semantic token classes only.\r\n * - A11y: decorative by default.\r\n *\r\n * Usage\r\n * - Horizontal divider between sections:\r\n * `<Separator className=\"my-4\" />`\r\n * - Vertical divider between inline items:\r\n * `<Separator orientation=\"vertical\" className=\"mx-3 h-5\" />`\r\n *\r\n * Accessibility\r\n * - `decorative` defaults to `true` (presentation). This is the correct default for purely visual dividers.\r\n * - If the separator conveys structure/meaning, set `decorative={false}`.\r\n *\r\n * Implementation notes\r\n * - We set explicit sizing from the `orientation` prop (instead of relying on data-attribute variants)\r\n * to avoid accidental “thick” dividers when attributes/styles differ across environments.\r\n *\r\n * Reference: shadcn `separator.tsx` (Radix Separator).\r\n */\r\n\r\n\"use client\"\r\n\r\nimport * as React from 'react'\r\nimport * as SeparatorPrimitive from '@radix-ui/react-separator'\r\nimport { cn } from '../../lib/utils'\r\n\r\nexport type SeparatorProps = React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>\r\n\r\nexport const Separator = React.forwardRef<\r\n React.ElementRef<typeof SeparatorPrimitive.Root>,\r\n SeparatorProps\r\n>(({ className, orientation = 'horizontal', decorative = true, ...props }, ref) => {\r\n // Use 1px bg line for a thin, consistent divider in dialogs and lists.\r\n const orientationClasses =\r\n orientation === 'vertical'\r\n ? 'h-full w-px min-w-px bg-border'\r\n : 'h-px min-h-px w-full bg-border'\r\n\r\n return (\r\n <SeparatorPrimitive.Root\r\n ref={ref}\r\n data-slot=\"separator\"\r\n decorative={decorative}\r\n orientation={orientation}\r\n className={cn(\r\n 'shrink-0',\r\n orientationClasses,\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n})\r\nSeparator.displayName = 'Separator'\r\n\r\n","\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport { X } from \"lucide-react\"\r\nimport { Drawer as DrawerPrimitive } from \"vaul\"\r\n\r\nimport { cn } from \"../../lib/utils\"\r\n\r\nexport type DrawerProps = React.ComponentProps<typeof DrawerPrimitive.Root>\r\nexport type DrawerTriggerProps = React.ComponentProps<typeof DrawerPrimitive.Trigger>\r\nexport type DrawerPortalProps = React.ComponentProps<typeof DrawerPrimitive.Portal>\r\nexport type DrawerCloseProps = React.ComponentProps<typeof DrawerPrimitive.Close>\r\nexport type DrawerOverlayProps = React.ComponentProps<typeof DrawerPrimitive.Overlay>\r\nexport type DrawerContentProps = React.ComponentProps<typeof DrawerPrimitive.Content> & {\r\n /** Whether to show the top-right close button (matches Sheet). */\r\n showCloseButton?: boolean\r\n}\r\nexport type DrawerHeaderProps = React.ComponentProps<\"div\">\r\nexport type DrawerFooterProps = React.ComponentProps<\"div\">\r\nexport type DrawerTitleProps = React.ComponentProps<typeof DrawerPrimitive.Title>\r\nexport type DrawerDescriptionProps = React.ComponentProps<typeof DrawerPrimitive.Description>\r\n\r\nexport function Drawer({ ...props }: DrawerProps) {\r\n return <DrawerPrimitive.Root data-slot=\"drawer\" {...props} />\r\n}\r\n\r\nexport function DrawerTrigger({ ...props }: DrawerTriggerProps) {\r\n return <DrawerPrimitive.Trigger data-slot=\"drawer-trigger\" {...props} />\r\n}\r\n\r\nexport function DrawerPortal({ ...props }: DrawerPortalProps) {\r\n return <DrawerPrimitive.Portal data-slot=\"drawer-portal\" {...props} />\r\n}\r\n\r\nexport function DrawerClose({ ...props }: DrawerCloseProps) {\r\n return <DrawerPrimitive.Close data-slot=\"drawer-close\" {...props} />\r\n}\r\n\r\nexport function DrawerOverlay({ className, ...props }: DrawerOverlayProps) {\r\n return (\r\n <DrawerPrimitive.Overlay\r\n data-slot=\"drawer-overlay\"\r\n className={cn(\r\n \"fixed inset-0 z-[80]\",\r\n \"bg-foreground/20\",\r\n \"data-[state=open]:animate-in data-[state=closed]:animate-out\",\r\n \"data-[state=open]:fade-in-0 data-[state=closed]:fade-out-0\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport function DrawerContent({\r\n className,\r\n children,\r\n showCloseButton = true,\r\n ...props\r\n}: DrawerContentProps) {\r\n return (\r\n <DrawerPortal>\r\n <DrawerOverlay />\r\n <DrawerPrimitive.Content\r\n data-slot=\"drawer-content\"\r\n className={cn(\r\n \"group/drawer-content fixed z-[81] flex h-auto flex-col overflow-hidden\",\r\n \"border border-border bg-card text-card-foreground shadow-xl\",\r\n // direction variants: inset like Sheet (no edge-to-edge)\r\n \"data-[vaul-drawer-direction=top]:top-2 data-[vaul-drawer-direction=top]:left-2 data-[vaul-drawer-direction=top]:right-2 data-[vaul-drawer-direction=top]:max-h-[calc(100vh-1rem)] data-[vaul-drawer-direction=top]:rounded-xl\",\r\n \"data-[vaul-drawer-direction=bottom]:bottom-2 data-[vaul-drawer-direction=bottom]:left-2 data-[vaul-drawer-direction=bottom]:right-2 data-[vaul-drawer-direction=bottom]:max-h-[calc(100vh-1rem)] data-[vaul-drawer-direction=bottom]:min-h-[min(70vh,34rem)] data-[vaul-drawer-direction=bottom]:rounded-xl\",\r\n \"data-[vaul-drawer-direction=right]:top-2 data-[vaul-drawer-direction=right]:bottom-2 data-[vaul-drawer-direction=right]:right-2 data-[vaul-drawer-direction=right]:w-[min(94vw,32rem)] data-[vaul-drawer-direction=right]:max-h-[calc(100vh-1rem)] data-[vaul-drawer-direction=right]:rounded-xl\",\r\n \"data-[vaul-drawer-direction=left]:top-2 data-[vaul-drawer-direction=left]:bottom-2 data-[vaul-drawer-direction=left]:left-2 data-[vaul-drawer-direction=left]:w-[min(94vw,32rem)] data-[vaul-drawer-direction=left]:max-h-[calc(100vh-1rem)] data-[vaul-drawer-direction=left]:rounded-xl\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n {/* Grab handle for bottom drawers */}\r\n <div className=\"mx-auto mt-4 hidden h-2 w-[100px] shrink-0 rounded-full bg-muted group-data-[vaul-drawer-direction=bottom]/drawer-content:block\" />\r\n {children}\r\n {showCloseButton ? (\r\n <DrawerPrimitive.Close\r\n data-slot=\"drawer-close\"\r\n className={cn(\r\n \"absolute right-4 top-4 inline-flex items-center justify-center\",\r\n \"h-8 w-8 rounded-md\",\r\n \"cursor-pointer\",\r\n \"text-muted-foreground hover:text-foreground hover:bg-muted\",\r\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\r\n \"disabled:pointer-events-none disabled:cursor-not-allowed\"\r\n )}\r\n >\r\n <X className=\"h-4 w-4\" aria-hidden />\r\n <span className=\"sr-only\">Close</span>\r\n </DrawerPrimitive.Close>\r\n ) : null}\r\n </DrawerPrimitive.Content>\r\n </DrawerPortal>\r\n )\r\n}\r\n\r\nexport function DrawerHeader({ className, ...props }: DrawerHeaderProps) {\r\n return (\r\n <div\r\n data-slot=\"drawer-header\"\r\n className={cn(\r\n \"flex flex-col gap-1.5 p-6 pb-4\",\r\n \"group-data-[vaul-drawer-direction=bottom]/drawer-content:text-center group-data-[vaul-drawer-direction=top]/drawer-content:text-center\",\r\n \"md:text-left\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport function DrawerFooter({ className, ...props }: DrawerFooterProps) {\r\n return (\r\n <div\r\n data-slot=\"drawer-footer\"\r\n className={cn(\r\n \"mt-auto flex flex-col-reverse gap-2 p-6 pt-4 sm:flex-row sm:justify-end\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport function DrawerTitle({ className, ...props }: DrawerTitleProps) {\r\n return (\r\n <DrawerPrimitive.Title\r\n data-slot=\"drawer-title\"\r\n className={cn(\"text-lg font-semibold leading-none\", className)}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport function DrawerDescription({ className, ...props }: DrawerDescriptionProps) {\r\n return (\r\n <DrawerPrimitive.Description\r\n data-slot=\"drawer-description\"\r\n className={cn(\"text-sm text-muted-foreground\", className)}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\n","/**\r\n * Menubar: Desktop-style horizontal menu (File | Edit | View).\r\n *\r\n * Design-system contract:\r\n * - Scope: UI-only primitive. No domain copy.\r\n * - Tokens-only: semantic token classes only.\r\n * - Composition: Menubar, MenubarMenu, MenubarTrigger, MenubarContent, MenubarItem, etc.\r\n *\r\n * @author: @mindtris-team\r\n * @version: 0.1.0\r\n * @since: 2026-02-05\r\n */\r\n\r\n\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport * as MenubarPrimitive from \"@radix-ui/react-menubar\"\r\n\r\nimport { cn } from \"../../lib/utils\"\r\nimport { Check, ChevronRight } from \"lucide-react\"\r\n\r\nexport type MenubarProps = React.ComponentProps<typeof MenubarPrimitive.Root>\r\nexport type MenubarMenuProps = React.ComponentProps<typeof MenubarPrimitive.Menu>\r\nexport type MenubarTriggerProps = React.ComponentProps<typeof MenubarPrimitive.Trigger>\r\nexport type MenubarContentProps = React.ComponentProps<typeof MenubarPrimitive.Content>\r\nexport type MenubarItemProps = React.ComponentProps<typeof MenubarPrimitive.Item> & {\r\n inset?: boolean\r\n variant?: \"default\" | \"destructive\"\r\n}\r\nexport type MenubarCheckboxItemProps = React.ComponentProps<\r\n typeof MenubarPrimitive.CheckboxItem\r\n>\r\nexport type MenubarRadioGroupProps = React.ComponentProps<\r\n typeof MenubarPrimitive.RadioGroup\r\n>\r\nexport type MenubarRadioItemProps = React.ComponentProps<\r\n typeof MenubarPrimitive.RadioItem\r\n>\r\nexport type MenubarLabelProps = React.ComponentProps<typeof MenubarPrimitive.Label> & {\r\n inset?: boolean\r\n}\r\nexport type MenubarSeparatorProps = React.ComponentProps<\r\n typeof MenubarPrimitive.Separator\r\n>\r\nexport type MenubarShortcutProps = React.HTMLAttributes<HTMLSpanElement>\r\nexport type MenubarGroupProps = React.ComponentProps<typeof MenubarPrimitive.Group>\r\nexport type MenubarPortalProps = React.ComponentProps<typeof MenubarPrimitive.Portal>\r\nexport type MenubarSubProps = React.ComponentProps<typeof MenubarPrimitive.Sub>\r\nexport type MenubarSubTriggerProps = React.ComponentProps<\r\n typeof MenubarPrimitive.SubTrigger\r\n> & { inset?: boolean }\r\nexport type MenubarSubContentProps = React.ComponentProps<\r\n typeof MenubarPrimitive.SubContent\r\n>\r\n\r\nconst Menubar = MenubarPrimitive.Root\r\nconst MenubarMenu: React.ComponentType<MenubarMenuProps> = MenubarPrimitive.Menu\r\nconst MenubarTrigger: React.ComponentType<MenubarTriggerProps> = MenubarPrimitive.Trigger\r\nconst MenubarGroup: React.ComponentType<MenubarGroupProps> = MenubarPrimitive.Group\r\nconst MenubarPortal: React.ComponentType<MenubarPortalProps> = MenubarPrimitive.Portal\r\nconst MenubarRadioGroup: React.ComponentType<MenubarRadioGroupProps> = MenubarPrimitive.RadioGroup\r\n\r\nfunction MenubarContent({\r\n className,\r\n align = \"start\",\r\n alignOffset = -4,\r\n sideOffset = 8,\r\n ...props\r\n}: MenubarContentProps) {\r\n return (\r\n <MenubarPrimitive.Portal>\r\n <MenubarPrimitive.Content\r\n data-slot=\"menubar-content\"\r\n align={align}\r\n alignOffset={alignOffset}\r\n sideOffset={sideOffset}\r\n className={cn(\r\n \"z-[9999] min-w-[12rem] overflow-hidden rounded-lg border border-input bg-card p-1 text-foreground shadow-lg\",\r\n \"data-[state=open]:animate-in data-[state=closed]:animate-out\",\r\n \"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\r\n \"data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95\",\r\n \"data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2\",\r\n \"data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n </MenubarPrimitive.Portal>\r\n )\r\n}\r\n\r\nfunction MenubarItem({\r\n className,\r\n inset,\r\n variant = \"default\",\r\n ...props\r\n}: MenubarItemProps) {\r\n return (\r\n <MenubarPrimitive.Item\r\n data-slot=\"menubar-item\"\r\n data-inset={inset}\r\n data-variant={variant}\r\n className={cn(\r\n \"relative flex cursor-default select-none items-center gap-2 rounded-md px-2 py-1.5 text-sm outline-none\",\r\n \"data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\r\n \"data-[inset]:pl-8\",\r\n \"data-[variant=default]:focus:bg-accent data-[variant=default]:focus:text-accent-foreground\",\r\n \"data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10\",\r\n \"data-[variant=destructive]:focus:text-destructive\",\r\n \"[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg]:text-muted-foreground\",\r\n \"data-[variant=destructive]:[&_svg]:text-destructive\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nfunction MenubarCheckboxItem({\r\n className,\r\n children,\r\n checked,\r\n ...props\r\n}: MenubarCheckboxItemProps) {\r\n return (\r\n <MenubarPrimitive.CheckboxItem\r\n data-slot=\"menubar-checkbox-item\"\r\n className={cn(\r\n \"relative flex cursor-default select-none items-center gap-2 rounded-md py-1.5 pl-8 pr-2 text-sm outline-none\",\r\n \"focus:bg-accent focus:text-accent-foreground\",\r\n \"data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\r\n className\r\n )}\r\n checked={checked}\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 <MenubarPrimitive.ItemIndicator>\r\n <Check className=\"h-4 w-4\" />\r\n </MenubarPrimitive.ItemIndicator>\r\n </span>\r\n {children}\r\n </MenubarPrimitive.CheckboxItem>\r\n )\r\n}\r\n\r\nfunction MenubarRadioItem({\r\n className,\r\n children,\r\n ...props\r\n}: MenubarRadioItemProps) {\r\n return (\r\n <MenubarPrimitive.RadioItem\r\n data-slot=\"menubar-radio-item\"\r\n className={cn(\r\n \"relative flex cursor-default select-none items-center gap-2 rounded-md py-1.5 pl-8 pr-2 text-sm outline-none\",\r\n \"focus:bg-accent focus:text-accent-foreground\",\r\n \"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 <MenubarPrimitive.ItemIndicator>\r\n <span className=\"h-2 w-2 rounded-full bg-current\" />\r\n </MenubarPrimitive.ItemIndicator>\r\n </span>\r\n {children}\r\n </MenubarPrimitive.RadioItem>\r\n )\r\n}\r\n\r\nfunction MenubarLabel({\r\n className,\r\n inset,\r\n ...props\r\n}: MenubarLabelProps) {\r\n return (\r\n <MenubarPrimitive.Label\r\n data-slot=\"menubar-label\"\r\n data-inset={inset}\r\n className={cn(\r\n \"px-2 py-1.5 text-xs font-semibold text-muted-foreground\",\r\n \"data-[inset]:pl-8\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nfunction MenubarSeparator({\r\n className,\r\n ...props\r\n}: MenubarSeparatorProps) {\r\n return (\r\n <MenubarPrimitive.Separator\r\n data-slot=\"menubar-separator\"\r\n className={cn(\"-mx-1 my-1 h-px bg-border\", className)}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nfunction MenubarShortcut({\r\n className,\r\n ...props\r\n}: MenubarShortcutProps) {\r\n return (\r\n <span\r\n data-slot=\"menubar-shortcut\"\r\n className={cn(\"ml-auto text-xs tracking-widest text-muted-foreground\", className)}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nfunction MenubarSub({\r\n ...props\r\n}: MenubarSubProps) {\r\n return <MenubarPrimitive.Sub data-slot=\"menubar-sub\" {...props} />\r\n}\r\n\r\nfunction MenubarSubTrigger({\r\n className,\r\n inset,\r\n children,\r\n ...props\r\n}: MenubarSubTriggerProps) {\r\n return (\r\n <MenubarPrimitive.SubTrigger\r\n data-slot=\"menubar-sub-trigger\"\r\n data-inset={inset}\r\n className={cn(\r\n \"flex cursor-default select-none items-center rounded-md px-2 py-1.5 text-sm outline-none\",\r\n \"focus:bg-accent focus:text-accent-foreground\",\r\n \"data-[state=open]:bg-accent data-[state=open]:text-accent-foreground\",\r\n \"data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\r\n \"data-[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 </MenubarPrimitive.SubTrigger>\r\n )\r\n}\r\n\r\nfunction MenubarSubContent({\r\n className,\r\n ...props\r\n}: MenubarSubContentProps) {\r\n return (\r\n <MenubarPrimitive.SubContent\r\n data-slot=\"menubar-sub-content\"\r\n className={cn(\r\n \"z-[9999] min-w-[8rem] overflow-hidden rounded-lg border border-input bg-card p-1 text-foreground shadow-lg\",\r\n \"data-[state=open]:animate-in data-[state=closed]:animate-out\",\r\n \"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\r\n \"data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95\",\r\n \"data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2\",\r\n \"data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport {\r\n Menubar,\r\n MenubarMenu,\r\n MenubarTrigger,\r\n MenubarContent,\r\n MenubarItem,\r\n MenubarCheckboxItem,\r\n MenubarRadioGroup,\r\n MenubarRadioItem,\r\n MenubarLabel,\r\n MenubarSeparator,\r\n MenubarShortcut,\r\n MenubarGroup,\r\n MenubarPortal,\r\n MenubarSub,\r\n MenubarSubTrigger,\r\n MenubarSubContent,\r\n}\r\n","/**\r\n * Context Menu: Right-click menu.\r\n *\r\n * Design-system contract:\r\n * - Scope: UI-only primitive. No domain copy.\r\n * - Tokens-only: semantic token classes only.\r\n * - Composition: ContextMenu, ContextMenuTrigger, ContextMenuContent, ContextMenuItem, etc.\r\n *\r\n * @author: @mindtris-team\r\n * @version: 0.1.0\r\n * @since: 2026-02-01\r\n */\r\n\r\n\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport * as ContextMenuPrimitive from \"@radix-ui/react-context-menu\"\r\n\r\nimport { cn } from \"../../lib/utils\"\r\nimport { Check, ChevronRight } from \"lucide-react\"\r\n\r\nexport type ContextMenuProps = React.ComponentProps<typeof ContextMenuPrimitive.Root>\r\nexport type ContextMenuTriggerProps = React.ComponentProps<typeof ContextMenuPrimitive.Trigger>\r\nexport type ContextMenuContentProps = React.ComponentProps<typeof ContextMenuPrimitive.Content>\r\nexport type ContextMenuItemProps = React.ComponentProps<typeof ContextMenuPrimitive.Item> & {\r\n inset?: boolean\r\n variant?: \"default\" | \"destructive\"\r\n}\r\nexport type ContextMenuCheckboxItemProps = React.ComponentProps<\r\n typeof ContextMenuPrimitive.CheckboxItem\r\n>\r\nexport type ContextMenuRadioGroupProps = React.ComponentProps<\r\n typeof ContextMenuPrimitive.RadioGroup\r\n>\r\nexport type ContextMenuRadioItemProps = React.ComponentProps<\r\n typeof ContextMenuPrimitive.RadioItem\r\n>\r\nexport type ContextMenuLabelProps = React.ComponentProps<typeof ContextMenuPrimitive.Label> & {\r\n inset?: boolean\r\n}\r\nexport type ContextMenuSeparatorProps = React.ComponentProps<\r\n typeof ContextMenuPrimitive.Separator\r\n>\r\nexport type ContextMenuShortcutProps = React.HTMLAttributes<HTMLSpanElement>\r\nexport type ContextMenuGroupProps = React.ComponentProps<typeof ContextMenuPrimitive.Group>\r\nexport type ContextMenuPortalProps = React.ComponentProps<typeof ContextMenuPrimitive.Portal>\r\nexport type ContextMenuSubProps = React.ComponentProps<typeof ContextMenuPrimitive.Sub>\r\nexport type ContextMenuSubTriggerProps = React.ComponentProps<\r\n typeof ContextMenuPrimitive.SubTrigger\r\n> & { inset?: boolean }\r\nexport type ContextMenuSubContentProps = React.ComponentProps<\r\n typeof ContextMenuPrimitive.SubContent\r\n>\r\n\r\nconst ContextMenu = ContextMenuPrimitive.Root\r\nconst ContextMenuTrigger = ContextMenuPrimitive.Trigger\r\nconst ContextMenuGroup = ContextMenuPrimitive.Group\r\nconst ContextMenuRadioGroup = ContextMenuPrimitive.RadioGroup\r\nconst ContextMenuPortal = ContextMenuPrimitive.Portal\r\n\r\nfunction ContextMenuContent({\r\n className,\r\n ...props\r\n}: ContextMenuContentProps) {\r\n return (\r\n <ContextMenuPrimitive.Portal>\r\n <ContextMenuPrimitive.Content\r\n data-slot=\"context-menu-content\"\r\n className={cn(\r\n \"z-[9999] min-w-[8rem] overflow-hidden rounded-lg border border-input bg-card p-1 text-foreground shadow-lg\",\r\n \"data-[state=open]:animate-in data-[state=closed]:animate-out\",\r\n \"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\r\n \"data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95\",\r\n \"data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2\",\r\n \"data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n </ContextMenuPrimitive.Portal>\r\n )\r\n}\r\n\r\nfunction ContextMenuItem({\r\n className,\r\n inset,\r\n variant = \"default\",\r\n ...props\r\n}: ContextMenuItemProps) {\r\n return (\r\n <ContextMenuPrimitive.Item\r\n data-slot=\"context-menu-item\"\r\n data-inset={inset}\r\n data-variant={variant}\r\n className={cn(\r\n \"relative flex cursor-default select-none items-center gap-2 rounded-md px-2 py-1.5 text-sm outline-none\",\r\n \"data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\r\n \"data-[inset]:pl-8\",\r\n \"data-[variant=default]:focus:bg-accent data-[variant=default]:focus:text-accent-foreground\",\r\n \"data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10\",\r\n \"data-[variant=destructive]:focus:text-destructive\",\r\n \"[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg]:text-muted-foreground\",\r\n \"data-[variant=destructive]:[&_svg]:text-destructive\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nfunction ContextMenuCheckboxItem({\r\n className,\r\n children,\r\n checked,\r\n ...props\r\n}: ContextMenuCheckboxItemProps) {\r\n return (\r\n <ContextMenuPrimitive.CheckboxItem\r\n data-slot=\"context-menu-checkbox-item\"\r\n className={cn(\r\n \"relative flex cursor-default select-none items-center gap-2 rounded-md py-1.5 pl-8 pr-2 text-sm outline-none\",\r\n \"focus:bg-accent focus:text-accent-foreground\",\r\n \"data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\r\n className\r\n )}\r\n checked={checked}\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 <ContextMenuPrimitive.ItemIndicator>\r\n <Check className=\"h-4 w-4\" />\r\n </ContextMenuPrimitive.ItemIndicator>\r\n </span>\r\n {children}\r\n </ContextMenuPrimitive.CheckboxItem>\r\n )\r\n}\r\n\r\nfunction ContextMenuRadioItem({\r\n className,\r\n children,\r\n ...props\r\n}: ContextMenuRadioItemProps) {\r\n return (\r\n <ContextMenuPrimitive.RadioItem\r\n data-slot=\"context-menu-radio-item\"\r\n className={cn(\r\n \"relative flex cursor-default select-none items-center gap-2 rounded-md py-1.5 pl-8 pr-2 text-sm outline-none\",\r\n \"focus:bg-accent focus:text-accent-foreground\",\r\n \"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 <ContextMenuPrimitive.ItemIndicator>\r\n <span className=\"h-2 w-2 rounded-full bg-current\" />\r\n </ContextMenuPrimitive.ItemIndicator>\r\n </span>\r\n {children}\r\n </ContextMenuPrimitive.RadioItem>\r\n )\r\n}\r\n\r\nfunction ContextMenuLabel({\r\n className,\r\n inset,\r\n ...props\r\n}: ContextMenuLabelProps) {\r\n return (\r\n <ContextMenuPrimitive.Label\r\n data-slot=\"context-menu-label\"\r\n data-inset={inset}\r\n className={cn(\r\n \"px-2 py-1.5 text-xs font-semibold text-muted-foreground\",\r\n \"data-[inset]:pl-8\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nfunction ContextMenuSeparator({\r\n className,\r\n ...props\r\n}: ContextMenuSeparatorProps) {\r\n return (\r\n <ContextMenuPrimitive.Separator\r\n data-slot=\"context-menu-separator\"\r\n className={cn(\"-mx-1 my-1 h-px bg-border\", className)}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nfunction ContextMenuShortcut({\r\n className,\r\n ...props\r\n}: ContextMenuShortcutProps) {\r\n return (\r\n <span\r\n data-slot=\"context-menu-shortcut\"\r\n className={cn(\"ml-auto text-xs tracking-widest text-muted-foreground\", className)}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nfunction ContextMenuSub({\r\n ...props\r\n}: ContextMenuSubProps) {\r\n return (\r\n <ContextMenuPrimitive.Sub data-slot=\"context-menu-sub\" {...props} />\r\n )\r\n}\r\n\r\nfunction ContextMenuSubTrigger({\r\n className,\r\n inset,\r\n children,\r\n ...props\r\n}: ContextMenuSubTriggerProps) {\r\n return (\r\n <ContextMenuPrimitive.SubTrigger\r\n data-slot=\"context-menu-sub-trigger\"\r\n data-inset={inset}\r\n className={cn(\r\n \"flex cursor-default select-none items-center rounded-md px-2 py-1.5 text-sm outline-none\",\r\n \"focus:bg-accent focus:text-accent-foreground\",\r\n \"data-[state=open]:bg-accent data-[state=open]:text-accent-foreground\",\r\n \"data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\r\n \"data-[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 </ContextMenuPrimitive.SubTrigger>\r\n )\r\n}\r\n\r\nfunction ContextMenuSubContent({\r\n className,\r\n ...props\r\n}: ContextMenuSubContentProps) {\r\n return (\r\n <ContextMenuPrimitive.SubContent\r\n data-slot=\"context-menu-sub-content\"\r\n className={cn(\r\n \"z-[9999] min-w-[8rem] overflow-hidden rounded-lg border border-input bg-card p-1 text-foreground shadow-lg\",\r\n \"data-[state=open]:animate-in data-[state=closed]:animate-out\",\r\n \"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\r\n \"data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95\",\r\n \"data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2\",\r\n \"data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport {\r\n ContextMenu,\r\n ContextMenuTrigger,\r\n ContextMenuContent,\r\n ContextMenuItem,\r\n ContextMenuCheckboxItem,\r\n ContextMenuRadioGroup,\r\n ContextMenuRadioItem,\r\n ContextMenuLabel,\r\n ContextMenuSeparator,\r\n ContextMenuShortcut,\r\n ContextMenuGroup,\r\n ContextMenuPortal,\r\n ContextMenuSub,\r\n ContextMenuSubTrigger,\r\n ContextMenuSubContent,\r\n}\r\n","/**\n * Dropdowns (single file, multi-variants)\n *\n * Goal: keep one implementation surface for all dropdown styles defined no conditional chaos, business logic;\n * (classic select, full-width select, menu, filter, etc.) while reusing the same\n * primitive positioning/portal logic.\n */\n\n\"use client\"\n\nimport * as React from 'react'\nimport Image from 'next/image'\nimport { Check, CircleCheck, ChevronDown, X } from 'lucide-react'\nimport { cn } from '../../lib/utils'\nimport { Menu, MenuButton, MenuItem, MenuItems, Transition } from '@headlessui/react'\nimport * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu'\nimport { Popover, PopoverContent, PopoverTrigger } from './popover'\nimport { Checkbox } from './checkbox'\n\nexport type DropdownAlign = 'start' | 'center' | 'end'\n\nexport type DropdownOption<T extends string = string> = {\n value: T\n label: string\n leadingIcon?: React.ReactNode\n}\n\nexport type DropdownSelectOptionVariant = 'checkmark' | 'checkbox'\n\n/**\n * Variant: \"classic\" (select-like)\n * Used for: navbar preset selector, full-width selects, filter pills, etc.\n */\nexport interface DropdownSelectProps<T extends string = string> {\n value: T\n options: readonly DropdownOption<T>[]\n onChange: (value: T) => void\n /** Button label for screen readers */\n ariaLabel?: string\n /** Optional left icon inside the button */\n buttonLeadingIcon?: React.ReactNode\n /** Align dropdown panel relative to trigger */\n align?: DropdownAlign\n /** Match \"full width\" dropdown behavior */\n fullWidth?: boolean\n /** Option list variant: checkmark icon or checkbox */\n optionVariant?: DropdownSelectOptionVariant\n /** When > 0, shows active border and count badge */\n selectedCount?: number\n /** Filter mode: trigger always shows this label instead of selected option (for filters) */\n filterLabel?: string\n /** When optionVariant is checkbox, option with this value is rendered without checkbox (label/header row) */\n labelOptionValue?: T\n /** Show search input under label to filter options (when labelOptionValue is used) */\n searchable?: boolean\n /** Placeholder for search input when searchable */\n searchPlaceholder?: string\n className?: string\n}\n\nexport function DropdownSelect<T extends string = string>({\n value,\n options,\n onChange,\n ariaLabel = 'Select option',\n buttonLeadingIcon,\n align = 'start',\n fullWidth = false,\n optionVariant = 'checkmark',\n selectedCount = 0,\n filterLabel,\n labelOptionValue,\n searchable = false,\n searchPlaceholder = 'Filter...',\n className,\n}: DropdownSelectProps<T>) {\n const selected = options.find((o) => o.value === value) ?? options[0]\n const isActive = selectedCount > 0\n const triggerLabel = filterLabel ?? selected?.label\n const [searchQuery, setSearchQuery] = React.useState('')\n const labelOpt = labelOptionValue != null ? options.find((o) => o.value === labelOptionValue) : null\n const valOpts = labelOptionValue != null ? options.filter((o) => o.value !== labelOptionValue) : options\n const q = searchQuery.trim().toLowerCase()\n const filtered = searchable && q ? valOpts.filter((o) => o.label.toLowerCase().includes(q)) : valOpts\n\n const content = (\n <div className=\"font-medium text-sm text-muted-foreground\">\n {optionVariant === 'checkbox' && labelOpt ? (\n <>\n <div\n role=\"option\"\n aria-selected={value === labelOpt.value}\n tabIndex={0}\n onClick={() => onChange(labelOpt.value)}\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); onChange(labelOpt.value) } }}\n className=\"flex w-full items-center justify-between gap-2 rounded-md px-2.5 py-2 text-left transition-colors cursor-pointer min-h-[2.25rem]\"\n >\n <span className=\"truncate font-medium text-foreground\">{labelOpt.label}</span>\n <button type=\"button\" aria-label=\"Clear filter\" onClick={(e) => { e.stopPropagation(); onChange(labelOpt.value) }} className=\"shrink-0 rounded p-0.5 text-muted-foreground hover:text-foreground hover:bg-muted cursor-pointer\">\n <X className=\"h-4 w-4\" aria-hidden />\n </button>\n </div>\n {searchable ? (\n <div className=\"mb-1 px-1\">\n <input type=\"text\" value={searchQuery} onChange={(e) => setSearchQuery(e.target.value)} placeholder={searchPlaceholder} className=\"h-8 w-full rounded-md border border-input bg-field px-2.5 text-sm text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:border-foreground/40\" onKeyDown={(e) => e.stopPropagation()} />\n </div>\n ) : null}\n {filtered.map((opt) => (\n <div key={opt.value} role=\"option\" aria-selected={opt.value === value} tabIndex={0} onClick={() => onChange(opt.value)} onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); onChange(opt.value) } }} className={cn('flex w-full items-center gap-2 rounded-md px-2.5 py-2 text-left transition-colors cursor-pointer hover:bg-background hover:text-foreground', opt.value === value && 'text-primary')}>\n <Checkbox checked={opt.value === value} className=\"pointer-events-none shrink-0\" aria-hidden />\n <span className=\"truncate\">{opt.label}</span>\n </div>\n ))}\n </>\n ) : (\n options.map((opt) => (\n <button key={opt.value} type=\"button\" onClick={() => onChange(opt.value)} className={cn('flex w-full items-center gap-2 rounded-md px-2.5 py-2 text-left transition-colors hover:bg-background hover:text-foreground', opt.value === value && 'text-primary')}>\n <CircleCheck className={cn('h-4 w-4 shrink-0', opt.value === value ? 'text-foreground' : 'invisible')} aria-hidden />\n <span className=\"truncate\">{opt.label}</span>\n </button>\n ))\n )}\n </div>\n )\n\n return (\n <Popover>\n <PopoverTrigger asChild>\n <button type=\"button\" aria-label={ariaLabel} className={cn('inline-flex h-9 items-center gap-1.5 rounded-md border bg-transparent px-3 py-1 text-sm transition-colors text-left', isActive ? 'border-foreground' : 'border-input text-muted-foreground hover:text-foreground hover:bg-background', 'focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring', 'data-[state=open]:ring-0 data-[state=open]:ring-offset-0', fullWidth ? 'w-full min-w-0' : 'min-w-0', className)}>\n <span className=\"flex min-w-0 shrink items-center gap-1.5 truncate\">\n {buttonLeadingIcon ? <span className=\"shrink-0 text-muted-foreground\">{buttonLeadingIcon}</span> : null}\n {!filterLabel && selected?.leadingIcon ? <span className=\"shrink-0\">{selected.leadingIcon}</span> : null}\n <span className={cn('truncate', isActive && 'text-foreground')}>{triggerLabel}</span>\n {isActive ? <span className=\"flex h-5 min-w-5 shrink-0 items-center justify-center rounded-full bg-foreground text-xs font-medium text-background\" aria-hidden>{selectedCount}</span> : null}\n </span>\n <ChevronDown className=\"h-4 w-4 shrink-0 text-muted-foreground\" aria-hidden />\n </button>\n </PopoverTrigger>\n <PopoverContent align={align} sideOffset={6} className={cn('w-[min(18rem,calc(100vw-2rem))] p-1.5', fullWidth && 'w-[min(24rem,calc(100vw-2rem))]')}>\n {content}\n </PopoverContent>\n </Popover>\n )\n}\n\n/**\n * ClassicDropdown\n * Matches `app/(alternative)/components-library/dropdown` classic style (date-select.tsx).\n * Uses @headlessui/react Menu (not Popover) for exact mindtris-ui behavior.\n * Token-driven (no hardcoded grays).\n */\nexport interface ClassicDropdownProps<T extends string = string> {\n value: T\n options: readonly DropdownOption<T>[]\n onChange: (value: T) => void\n ariaLabel?: string\n buttonLeadingIcon?: React.ReactNode\n align?: DropdownAlign\n fullWidth?: boolean\n className?: string\n}\n\nexport function ClassicDropdown<T extends string = string>({\n value,\n options,\n onChange,\n ariaLabel = 'Select option',\n buttonLeadingIcon,\n align = 'end',\n fullWidth = false,\n className,\n}: ClassicDropdownProps<T>) {\n const selected = options.find((o) => o.value === value) ?? options[0]\n const triggerRef = React.useRef<HTMLButtonElement>(null)\n const [triggerWidth, setTriggerWidth] = React.useState<number | undefined>(undefined)\n\n React.useEffect(() => {\n if (triggerRef.current) {\n setTriggerWidth(triggerRef.current.offsetWidth)\n }\n }, [selected, options])\n\n return (\n <Popover>\n <PopoverTrigger asChild>\n <button\n ref={triggerRef}\n type=\"button\"\n aria-label={ariaLabel}\n className={cn(\n // Matches .btn from utility-patterns.css + mindtris-ui date-select.tsx\n 'font-medium text-sm inline-flex items-center justify-between border rounded-lg leading-5 transition-colors',\n 'px-3.5 py-2.5',\n fullWidth ? 'w-full' : 'w-auto min-w-[8rem]',\n 'bg-card border-border hover:border-border/80',\n 'text-muted-foreground hover:text-foreground',\n className\n )}\n >\n <span className=\"flex items-center gap-2\">\n {buttonLeadingIcon ? (\n <span className=\"shrink-0 text-muted-foreground\">{buttonLeadingIcon}</span>\n ) : null}\n {selected?.leadingIcon ? <span className=\"shrink-0\">{selected.leadingIcon}</span> : null}\n <span>{selected?.label}</span>\n </span>\n <ChevronDown className=\"h-4 w-4 shrink-0 ml-2 text-muted-foreground\" aria-hidden />\n </button>\n </PopoverTrigger>\n\n <PopoverContent\n align={align}\n side=\"bottom\"\n sideOffset={6}\n style={triggerWidth ? { width: `${triggerWidth}px`, maxWidth: 'calc(100vw - 2rem)' } : undefined}\n className={cn(\n 'p-2',\n fullWidth \n ? 'w-full min-w-0' \n : triggerWidth \n ? 'min-w-fit' \n : 'min-w-fit max-w-[calc(100vw-2rem)]'\n )}\n >\n <div className=\"font-medium text-sm text-muted-foreground\">\n {options.map((opt) => {\n const isSelected = opt.value === value\n return (\n <button\n key={opt.value}\n type=\"button\"\n onClick={() => onChange(opt.value)}\n className={cn(\n 'flex w-full items-center rounded-md px-2.5 py-2 text-left transition-colors',\n 'hover:bg-muted hover:text-foreground',\n isSelected && 'text-primary'\n )}\n >\n <span className=\"truncate\">{opt.label}</span>\n </button>\n )\n })}\n </div>\n </PopoverContent>\n </Popover>\n )\n}\n\nexport type DropdownMenuAlign = 'left' | 'right'\n\nexport interface DropdownIconMenuProps {\n ariaLabel: string\n icon: React.ReactNode\n align?: DropdownMenuAlign\n children: React.ReactNode\n className?: string\n}\n\n/**\n * DropdownIconMenu\n * Matches components-library \"icon button opens menu\" pattern (notifications/help).\n * Token driven (no hardcoded gray palette).\n */\nexport function DropdownIconMenu({\n ariaLabel,\n icon,\n align = 'right',\n children,\n className,\n}: DropdownIconMenuProps) {\n return (\n <Menu as=\"div\" className={cn('relative inline-flex', className)}>\n {({ open }) => (\n <>\n <MenuButton\n aria-label={ariaLabel}\n className={cn(\n 'w-8 h-8 flex items-center justify-center rounded-full transition-colors',\n 'hover:bg-muted',\n open && 'bg-muted'\n )}\n >\n {icon}\n </MenuButton>\n <Transition\n as=\"div\"\n className={cn(\n 'origin-top-right z-10 absolute top-full min-w-[11rem] bg-card border border-border py-1.5 rounded-lg shadow-lg overflow-hidden mt-1',\n align === 'right' ? 'right-0' : 'left-0'\n )}\n enter=\"transition ease-out duration-200 transform\"\n enterFrom=\"opacity-0 -translate-y-2\"\n enterTo=\"opacity-100 translate-y-0\"\n leave=\"transition ease-out duration-200\"\n leaveFrom=\"opacity-100\"\n leaveTo=\"opacity-0\"\n >\n <MenuItems as=\"div\" className=\"focus:outline-none\">\n {children}\n </MenuItems>\n </Transition>\n </>\n )}\n </Menu>\n )\n}\n\nexport function DropdownMenuSectionLabel({ children }: { children: React.ReactNode }) {\n return (\n <div className=\"text-xs font-semibold text-muted-foreground uppercase pt-1.5 pb-2 px-3\">\n {children}\n </div>\n )\n}\n\nexport interface DropdownMenuActionProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n activeClassName?: string\n}\n\nexport function DropdownMenuAction({\n className,\n activeClassName,\n children,\n ...props\n}: DropdownMenuActionProps) {\n return (\n <MenuItem>\n {({ active }) => (\n <button\n type=\"button\"\n className={cn(\n 'font-medium text-sm flex items-center w-full py-2 px-3 text-left transition-colors',\n active ? activeClassName ?? 'bg-muted' : null,\n className\n )}\n {...props}\n >\n {children}\n </button>\n )}\n </MenuItem>\n )\n}\n\n/**\n * DropdownMenu primitives (Radix)\n * Baseline interaction/ARIA provided by Radix; styling aligns with our select/dropdown surfaces.\n */\nexport type DropdownMenuProps = React.ComponentProps<typeof DropdownMenuPrimitive.Root>\nexport type DropdownMenuTriggerProps = React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>\nexport type DropdownMenuPortalProps = React.ComponentProps<typeof DropdownMenuPrimitive.Portal>\nexport type DropdownMenuContentProps = React.ComponentProps<typeof DropdownMenuPrimitive.Content>\nexport type DropdownMenuGroupProps = React.ComponentProps<typeof DropdownMenuPrimitive.Group>\nexport type DropdownMenuLabelProps = React.ComponentProps<typeof DropdownMenuPrimitive.Label> & { inset?: boolean }\nexport type DropdownMenuItemProps = React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean\n variant?: 'default' | 'destructive'\n}\nexport type DropdownMenuCheckboxItemProps = React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem>\nexport type DropdownMenuRadioGroupProps = React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>\nexport type DropdownMenuRadioItemProps = React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem>\nexport type DropdownMenuSeparatorProps = React.ComponentProps<typeof DropdownMenuPrimitive.Separator>\nexport type DropdownMenuSubProps = React.ComponentProps<typeof DropdownMenuPrimitive.Sub>\nexport type DropdownMenuSubTriggerProps = React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & { inset?: boolean }\nexport type DropdownMenuSubContentProps = React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>\n\nexport function DropdownMenu({ ...props }: DropdownMenuProps) {\n return <DropdownMenuPrimitive.Root data-slot=\"dropdown-menu\" {...props} />\n}\n\nexport function DropdownMenuPortal({ ...props }: DropdownMenuPortalProps) {\n return <DropdownMenuPrimitive.Portal data-slot=\"dropdown-menu-portal\" {...props} />\n}\n\nexport function DropdownMenuTrigger({ ...props }: DropdownMenuTriggerProps) {\n return <DropdownMenuPrimitive.Trigger data-slot=\"dropdown-menu-trigger\" {...props} />\n}\n\nexport function DropdownMenuContent({ className, sideOffset = 6, ...props }: DropdownMenuContentProps) {\n return (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n data-slot=\"dropdown-menu-content\"\n sideOffset={sideOffset}\n className={cn(\n // Match PopoverContent + DropdownSelect surface\n 'z-[9999] min-w-[11rem] max-w-[min(28rem,calc(100vw-2rem))] overflow-x-hidden overflow-y-auto',\n 'rounded-lg border border-border bg-card p-1.5 text-foreground shadow-lg outline-hidden',\n 'data-[state=open]:animate-in data-[state=closed]:animate-out',\n 'data-[state=open]:fade-in-0 data-[state=closed]:fade-out-0',\n 'data-[state=open]:zoom-in-95 data-[state=closed]:zoom-out-95',\n 'data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n className\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n )\n}\n\nexport function DropdownMenuGroup({ ...props }: DropdownMenuGroupProps) {\n return <DropdownMenuPrimitive.Group data-slot=\"dropdown-menu-group\" {...props} />\n}\n\nexport function DropdownMenuLabel({ className, inset, ...props }: DropdownMenuLabelProps) {\n return (\n <DropdownMenuPrimitive.Label\n data-slot=\"dropdown-menu-label\"\n data-inset={inset}\n className={cn('px-2.5 py-2 text-xs font-semibold text-muted-foreground uppercase data-[inset]:pl-8', className)}\n {...props}\n />\n )\n}\n\nexport function DropdownMenuItem({ className, inset, variant = 'default', ...props }: DropdownMenuItemProps) {\n return (\n <DropdownMenuPrimitive.Item\n data-slot=\"dropdown-menu-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n // Match DropdownSelect option rows\n 'flex w-full cursor-default select-none items-center gap-2 rounded-md px-2.5 py-2 text-left text-sm font-medium outline-hidden transition-colors',\n 'text-muted-foreground hover:bg-muted hover:text-foreground focus:bg-muted focus:text-foreground',\n 'data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n 'data-[inset]:pl-8',\n 'data-[variant=destructive]:text-destructive data-[variant=destructive]:hover:bg-destructive/10 data-[variant=destructive]:focus:bg-destructive/10',\n '[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg]:text-muted-foreground',\n 'data-[variant=destructive]:[&_svg]:text-destructive',\n className\n )}\n {...props}\n />\n )\n}\n\nexport function DropdownMenuCheckboxItem({ className, children, checked, ...props }: DropdownMenuCheckboxItemProps) {\n return (\n <DropdownMenuPrimitive.CheckboxItem\n data-slot=\"dropdown-menu-checkbox-item\"\n className={cn(\n 'relative flex w-full cursor-default select-none items-center gap-2 rounded-md px-2.5 py-2 pl-8 text-left text-sm font-medium outline-hidden transition-colors',\n 'text-muted-foreground hover:bg-muted hover:text-foreground focus:bg-muted focus:text-foreground',\n 'data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2.5 flex h-4 w-4 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Check className=\"text-primary\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n )\n}\n\nexport function DropdownMenuRadioGroup({ ...props }: DropdownMenuRadioGroupProps) {\n return <DropdownMenuPrimitive.RadioGroup data-slot=\"dropdown-menu-radio-group\" {...props} />\n}\n\nexport function DropdownMenuRadioItem({ className, children, ...props }: DropdownMenuRadioItemProps) {\n return (\n <DropdownMenuPrimitive.RadioItem\n data-slot=\"dropdown-menu-radio-item\"\n className={cn(\n 'relative flex w-full cursor-default select-none items-center gap-2 rounded-md px-2.5 py-2 pl-8 text-left text-sm font-medium outline-hidden transition-colors',\n 'text-muted-foreground hover:bg-muted hover:text-foreground focus:bg-muted focus:text-foreground',\n 'data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n className\n )}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2.5 flex h-4 w-4 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <span className=\"h-2 w-2 rounded-full bg-primary\" aria-hidden />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n )\n}\n\nexport function DropdownMenuSeparator({ className, ...props }: DropdownMenuSeparatorProps) {\n return (\n <DropdownMenuPrimitive.Separator\n data-slot=\"dropdown-menu-separator\"\n className={cn('bg-border -mx-1.5 my-1 h-px', className)}\n {...props}\n />\n )\n}\n\nexport function DropdownMenuShortcut({ className, ...props }: React.ComponentProps<'span'>) {\n return <span className={cn('ml-auto text-xs tracking-widest text-muted-foreground', className)} {...props} />\n}\n\nexport function DropdownMenuSub({ ...props }: DropdownMenuSubProps) {\n return <DropdownMenuPrimitive.Sub data-slot=\"dropdown-menu-sub\" {...props} />\n}\n\nexport function DropdownMenuSubTrigger({ className, inset, children, ...props }: DropdownMenuSubTriggerProps) {\n return (\n <DropdownMenuPrimitive.SubTrigger\n data-slot=\"dropdown-menu-sub-trigger\"\n data-inset={inset}\n className={cn(\n 'flex cursor-default select-none items-center rounded-md px-2.5 py-2 text-sm font-medium outline-hidden transition-colors',\n 'text-muted-foreground hover:bg-muted hover:text-foreground focus:bg-muted focus:text-foreground data-[state=open]:bg-muted data-[state=open]:text-foreground',\n 'data-[inset]:pl-8',\n className\n )}\n {...props}\n >\n {children}\n <span className=\"ml-auto text-muted-foreground\" aria-hidden>\n <ChevronDown className=\"h-4 w-4 -rotate-90\" aria-hidden />\n </span>\n </DropdownMenuPrimitive.SubTrigger>\n )\n}\n\nexport function DropdownMenuSubContent({ className, sideOffset = 6, ...props }: DropdownMenuSubContentProps & { sideOffset?: number }) {\n return (\n <DropdownMenuPrimitive.SubContent\n data-slot=\"dropdown-menu-sub-content\"\n sideOffset={sideOffset}\n className={cn(\n 'z-[9999] min-w-[11rem] overflow-hidden rounded-lg border border-border bg-card p-1.5 text-foreground shadow-lg outline-hidden',\n 'data-[state=open]:animate-in data-[state=closed]:animate-out',\n 'data-[state=open]:fade-in-0 data-[state=closed]:fade-out-0',\n 'data-[state=open]:zoom-in-95 data-[state=closed]:zoom-out-95',\n 'data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n className\n )}\n {...props}\n />\n )\n}\n\n/**\n * DropdownProfile\n * Profile dropdown with avatar, name, role, and menu items.\n * Token-driven (no hardcoded grays).\n */\nexport interface DropdownProfileProps {\n /** User avatar image source */\n avatarSrc?: string\n /** User name */\n name?: string\n /** User role/title */\n role?: string\n /** Menu items */\n items?: Array<{\n label: string\n href: string\n onClick?: () => void\n }>\n /** Align dropdown panel */\n align?: 'left' | 'right'\n className?: string\n}\n\nconst defaultProfileItems = [\n { label: 'Settings', href: '/settings/account' },\n { label: 'Sign Out', href: '#0' },\n]\n\nfunction getInitials(name: string): string {\n const parts = name.trim().split(/\\s+/)\n if (parts.length >= 2) {\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase()\n }\n return name.substring(0, 2).toUpperCase()\n}\n\nexport function DropdownProfile({\n avatarSrc,\n name = 'Mindtris Inc.',\n role = 'Administrator',\n items = defaultProfileItems,\n align = 'right',\n className,\n}: DropdownProfileProps) {\n const initials = getInitials(name)\n\n return (\n <Menu as=\"div\" className={cn('relative inline-flex', className)}>\n {({ open }) => (\n <>\n <MenuButton className=\"inline-flex justify-center items-center group cursor-pointer\">\n <div className=\"w-8 h-8 rounded-full bg-primary flex items-center justify-center\">\n <span className=\"text-xs font-medium text-primary-foreground\">\n {initials}\n </span>\n </div>\n </MenuButton>\n <Transition\n as=\"div\"\n className={cn(\n 'origin-top-right z-10 absolute top-full min-w-[11rem] bg-card border border-border py-1.5 rounded-lg shadow-lg overflow-hidden mt-1',\n align === 'right' ? 'right-0' : 'left-0'\n )}\n enter=\"transition ease-out duration-200 transform\"\n enterFrom=\"opacity-0 -translate-y-2\"\n enterTo=\"opacity-100 translate-y-0\"\n leave=\"transition ease-out duration-200\"\n leaveFrom=\"opacity-100\"\n leaveTo=\"opacity-0\"\n >\n <div className=\"pt-0.5 pb-2 px-3 mb-1 border-b border-border\">\n <div className=\"font-medium text-foreground\">{name}</div>\n <div className=\"text-xs text-muted-foreground italic\">{role}</div>\n </div>\n <MenuItems as=\"ul\" className=\"focus:outline-none\">\n {items.map((item) => (\n <MenuItem key={item.href} as=\"li\">\n {({ active }) => (\n <a\n className={cn(\n 'font-medium text-sm flex items-center py-1 px-3 rounded-md text-primary hover:bg-muted transition-colors',\n active && 'bg-muted'\n )}\n href={item.href}\n onClick={item.onClick}\n >\n {item.label}\n </a>\n )}\n </MenuItem>\n ))}\n </MenuItems>\n </Transition>\n </>\n )}\n </Menu>\n )\n}\n\n/**\n * DropdownSwitch\n * Switch Account / Switch Theme dropdown pattern.\n * Shows avatar/image/initials with label and checkmark for selected item.\n * Matches components-library dropdown-switch.tsx pattern.\n * Token-driven (no hardcoded grays).\n */\nexport interface SwitchOption {\n id: string | number\n label: string\n image?: string | any // Next.js Image src type\n avatar?: string\n}\n\nexport interface DropdownSwitchProps {\n options: SwitchOption[]\n selectedId?: string | number\n onSelect?: (id: string | number) => void\n align?: 'left' | 'right'\n className?: string\n onMenuStateChange?: (open: boolean) => void\n}\n\nexport function DropdownSwitch({\n options,\n selectedId,\n onSelect,\n align = 'left',\n className,\n onMenuStateChange,\n}: DropdownSwitchProps) {\n const [selected, setSelected] = React.useState<string | number>(\n selectedId ?? options[0]?.id ?? 0\n )\n\n React.useEffect(() => {\n if (selectedId !== undefined) {\n setSelected(selectedId)\n }\n }, [selectedId])\n\n const selectedOption = options.find((opt) => opt.id === selected) ?? options[0]\n\n const handleSelect = (id: string | number) => {\n setSelected(id)\n onSelect?.(id)\n }\n\n if (!selectedOption || options.length === 0) return null\n\n const menuOpenRef = React.useRef<boolean>(false)\n const callbackRef = React.useRef(onMenuStateChange)\n \n // Keep callback ref up to date\n React.useEffect(() => {\n callbackRef.current = onMenuStateChange\n }, [onMenuStateChange])\n\n return (\n <Menu as=\"div\" className={cn('relative', className)}>\n {({ open }) => {\n // Update ref synchronously (safe, doesn't trigger re-render)\n const prevOpen = menuOpenRef.current\n menuOpenRef.current = open\n \n // Schedule callback for after render using queueMicrotask\n if (prevOpen !== open) {\n queueMicrotask(() => {\n callbackRef.current?.(open)\n })\n }\n \n return (\n <>\n <MenuButton className=\"grow flex items-center truncate cursor-pointer\">\n {selectedOption.image ? (\n <Image\n className=\"w-8 h-8 rounded-full mr-2 shrink-0\"\n src={selectedOption.image}\n width={32}\n height={32}\n alt={selectedOption.label}\n />\n ) : selectedOption.avatar ? (\n <div className=\"w-8 h-8 rounded-full mr-2 shrink-0 bg-muted flex items-center justify-center text-sm font-medium text-muted-foreground\">\n {selectedOption.avatar}\n </div>\n ) : (\n <div className=\"w-8 h-8 rounded-full mr-2 shrink-0 bg-muted flex items-center justify-center text-sm font-medium text-muted-foreground\">\n {selectedOption.label.charAt(0).toUpperCase()}\n </div>\n )}\n <div className=\"truncate min-w-0\">\n <span className=\"text-sm font-medium text-foreground group-hover:text-foreground\">\n {selectedOption.label}\n </span>\n </div>\n <svg\n className=\"w-3 h-3 shrink-0 ml-1 fill-current text-muted-foreground\"\n viewBox=\"0 0 12 12\"\n >\n <path d=\"M5.9 11.4L.5 6l1.4-1.4 4 4 4-4L11.3 6z\" />\n </svg>\n </MenuButton>\n <Transition\n as=\"div\"\n className={cn(\n 'origin-top-right z-10 absolute top-full min-w-[12rem] bg-card border border-border rounded-lg shadow-lg overflow-hidden mt-1',\n align === 'right' ? 'right-0' : 'left-0'\n )}\n enter=\"transition ease-out duration-200 transform\"\n enterFrom=\"opacity-0 -translate-y-2\"\n enterTo=\"opacity-100 translate-y-0\"\n leave=\"transition ease-in duration-200\"\n leaveFrom=\"opacity-100\"\n leaveTo=\"opacity-0\"\n >\n <MenuItems as=\"ul\" className=\"focus:outline-none p-2\">\n {options.map((option) => (\n <MenuItem key={option.id} as=\"li\">\n {({ active }) => (\n <button\n className={cn(\n 'w-full font-medium text-sm flex items-center rounded-md px-2.5 py-2 text-left transition-colors',\n active ? 'text-foreground bg-muted' : 'text-muted-foreground'\n )}\n onClick={() => handleSelect(option.id)}\n >\n {option.image ? (\n <Image\n className=\"w-7 h-7 rounded-full mr-2 shrink-0\"\n src={option.image}\n width={28}\n height={28}\n alt={option.label}\n />\n ) : option.avatar ? (\n <div className=\"w-7 h-7 rounded-full mr-2 shrink-0 bg-muted flex items-center justify-center text-xs font-medium text-muted-foreground\">\n {option.avatar}\n </div>\n ) : (\n <div className=\"w-7 h-7 rounded-full mr-2 shrink-0 bg-muted flex items-center justify-center text-xs font-medium text-muted-foreground\">\n {option.label.charAt(0).toUpperCase()}\n </div>\n )}\n <span className=\"truncate\">{option.label}</span>\n </button>\n )}\n </MenuItem>\n ))}\n </MenuItems>\n </Transition>\n </>\n )\n }}\n </Menu>\n )\n}\n\n","'use client'\r\n\r\nimport { cn } from '../../lib/utils'\r\n\r\nexport interface LogoProps {\r\n className?: string\r\n ariaLabel?: string\r\n}\r\n\r\nexport default function Logo({ className, ariaLabel = 'Logo' }: LogoProps = {}) {\r\n // Logo uses semantic tokens via Tailwind color classes.\r\n return (\r\n <span className={cn('inline-flex', className)}>\r\n <svg\r\n width=\"60\"\r\n height=\"32\"\r\n viewBox=\"0 0 60 32\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n className={cn('h-6 w-auto text-primary transition-colors duration-200')}\r\n aria-label={ariaLabel}\r\n role=\"img\"\r\n >\r\n <g clipPath=\"url(#clip0_4002_249)\">\r\n <path\r\n fillRule=\"evenodd\"\r\n clipRule=\"evenodd\"\r\n d=\"M48.3457 0.350734C50.9943 1.38463 52.3187 4.4078 51.2907 7.07171L42.9082 28.6863C41.8802 31.3504 38.8743 32.6836 36.2454 31.6496C33.5956 30.6145 32.2712 27.5925 33.2992 24.9274L41.6618 3.29407C42.6912 0.648793 45.6957 -0.683161 48.3457 0.350734Z\"\r\n fill=\"url(#paint0_linear_logo)\"\r\n />\r\n <path\r\n fillRule=\"evenodd\"\r\n clipRule=\"evenodd\"\r\n d=\"M15.2661 0.350734C17.8941 1.38463 19.2074 4.4078 18.1682 7.07171L9.875 28.6863C8.85556 31.3504 5.87467 32.6836 3.24802 31.6496C0.639721 30.6145 -0.673608 27.5925 0.345829 24.9274L8.64039 3.29407C9.65984 0.648793 12.6394 -0.683161 15.2661 0.350734Z\"\r\n fill=\"currentColor\"\r\n />\r\n <path\r\n fillRule=\"evenodd\"\r\n clipRule=\"evenodd\"\r\n d=\"M31.8237 0.350734C34.4517 1.38463 35.765 4.4078 34.7258 7.07171L26.4327 28.6863C25.4132 31.3504 22.4322 32.6836 19.8056 31.6496C17.1973 30.6145 15.884 27.5925 16.9035 24.9274L25.1979 3.29407C26.2174 0.648793 29.1969 -0.683161 31.8237 0.350734Z\"\r\n fill=\"currentColor\"\r\n />\r\n <path\r\n fillRule=\"evenodd\"\r\n clipRule=\"evenodd\"\r\n d=\"M15.2957 0.350734C12.664 -0.683162 9.67861 0.648794 8.65718 3.29407L0.346501 24.9274C-0.674917 27.5925 0.640963 30.6145 3.25433 31.6496C5.88608 32.6836 8.87277 31.3504 9.8942 28.6863L18.2036 7.07171C19.2448 4.4078 17.9289 1.38463 15.2957 0.350734ZM44.7039 0.350734C42.0721 1.38463 40.7562 4.4078 41.7777 7.07171L50.087 28.6863C51.1282 31.3504 54.1136 32.6836 56.7269 31.6496C59.3587 30.6145 60.6746 27.5925 59.6544 24.9274L51.3241 3.29407C50.3026 0.648794 47.3172 -0.683162 44.7039 0.350734ZM31.8961 0.350734C34.5082 1.38463 35.8239 4.4078 34.8039 7.07171L26.4933 28.6863C25.4718 31.3504 22.4864 32.6836 19.8533 31.6496C17.2216 30.6145 15.9057 27.5925 16.927 24.9274L25.2562 3.29407C26.2775 0.648794 29.2629 -0.683162 31.8961 0.350734Z\"\r\n fill=\"currentColor\"\r\n />\r\n </g>\r\n <defs>\r\n <linearGradient id=\"paint0_linear_logo\" x1=\"42.2949\" y1=\"0\" x2=\"42.2949\" y2=\"32\" gradientUnits=\"userSpaceOnUse\">\r\n <stop stopColor=\"currentColor\" />\r\n <stop offset=\"1\" stopColor=\"currentColor\" stopOpacity=\"0.32\" />\r\n </linearGradient>\r\n <clipPath id=\"clip0_4002_249\">\r\n <rect width=\"60\" height=\"32\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </span>\r\n )\r\n}\r\n","'use client'\r\n\r\nimport * as React from 'react'\r\nimport { cn } from '../../lib/utils'\r\nimport { Input } from './input'\r\nimport { Separator } from './separator'\r\n\r\nexport type SidebarVariant = 'sidebar' | 'floating' | 'inset'\r\nexport type SidebarCollapsible = 'offcanvas' | 'icon' | 'none'\r\nexport type SidebarSide = 'left' | 'right'\r\n\r\nexport interface SidebarLinkProps {\r\n children: React.ReactNode\r\n href: string\r\n /** Controlled active state (app determines current route). */\r\n active?: boolean\r\n /** Optional leading icon. */\r\n leadingIcon?: React.ReactNode\r\n onClick?: React.MouseEventHandler<HTMLAnchorElement>\r\n className?: string\r\n}\r\n\r\n/**\r\n * SidebarLink: route-agnostic link styling with optional leading icon.\r\n */\r\nexport function SidebarLink({\r\n children,\r\n href,\r\n active = false,\r\n leadingIcon,\r\n onClick,\r\n className,\r\n}: SidebarLinkProps) {\r\n return (\r\n <a\r\n href={href}\r\n onClick={onClick}\r\n className={cn(\r\n 'flex items-center gap-2 truncate rounded-md px-2.5 py-2 text-sm font-medium transition-colors cursor-pointer',\r\n active\r\n ? 'bg-muted text-foreground'\r\n : 'text-muted-foreground hover:bg-muted hover:text-foreground',\r\n '[&>svg]:size-4 [&>svg]:shrink-0',\r\n className\r\n )}\r\n >\r\n {leadingIcon}\r\n <span className=\"truncate\">{children}</span>\r\n </a>\r\n )\r\n}\r\n\r\nexport interface SidebarLinkGroupProps {\r\n children: (handleClick: () => void, openGroup: boolean) => React.ReactNode\r\n open?: boolean\r\n className?: string\r\n}\r\n\r\n/**\r\n * SidebarLinkGroup: UI-only disclosure wrapper for grouped nav.\r\n */\r\nexport function SidebarLinkGroup({ children, open = false, className }: SidebarLinkGroupProps) {\r\n const [openGroup, setOpenGroup] = React.useState<boolean>(open)\r\n const handleClick = () => setOpenGroup((v) => !v)\r\n\r\n return (\r\n <li className={cn('pl-4 pr-3 py-2 rounded-lg mb-0.5 last:mb-0 group', className)}>\r\n {children(handleClick, openGroup)}\r\n </li>\r\n )\r\n}\r\n\r\nexport interface SidebarMenuButtonProps extends React.ComponentProps<'button'> {\r\n /** Controlled active state. */\r\n isActive?: boolean\r\n /** Optional leading icon. */\r\n leadingIcon?: React.ReactNode\r\n}\r\n\r\n/**\r\n * SidebarMenuButton: nav item with optional icon and label.\r\n */\r\nexport function SidebarMenuButton({\r\n children,\r\n isActive = false,\r\n leadingIcon,\r\n className,\r\n ...props\r\n}: SidebarMenuButtonProps) {\r\n return (\r\n <button\r\n type=\"button\"\r\n className={cn(\r\n 'flex w-full items-center gap-2 overflow-hidden rounded-md px-2.5 py-2 text-left text-sm outline-none transition-colors cursor-pointer',\r\n 'text-muted-foreground hover:bg-muted hover:text-foreground',\r\n 'focus-visible:ring-2 focus-visible:ring-ring',\r\n isActive && 'bg-muted text-foreground font-medium',\r\n '[&>svg]:size-4 [&>svg]:shrink-0 [&>span:last-child]:truncate',\r\n className\r\n )}\r\n data-active={isActive}\r\n {...props}\r\n >\r\n {leadingIcon}\r\n {children != null && children !== '' ? <span className=\"truncate\">{children}</span> : null}\r\n </button>\r\n )\r\n}\r\n\r\nexport interface SidebarProps {\r\n open: boolean\r\n onOpenChange: (open: boolean) => void\r\n showBackdrop?: boolean\r\n variant?: SidebarVariant\r\n collapsible?: SidebarCollapsible\r\n side?: SidebarSide\r\n className?: string\r\n headerSlot?: React.ReactNode\r\n footerSlot?: React.ReactNode\r\n children?: React.ReactNode\r\n}\r\n\r\n/**\r\n * Sidebar: layout chrome with variants (sidebar, floating, inset). Controlled state.\r\n */\r\nexport default function Sidebar({\r\n open,\r\n onOpenChange,\r\n showBackdrop = true,\r\n variant = 'sidebar',\r\n collapsible = 'none',\r\n side = 'left',\r\n className,\r\n headerSlot,\r\n footerSlot,\r\n children,\r\n}: SidebarProps) {\r\n const sidebarRef = React.useRef<HTMLDivElement>(null)\r\n\r\n React.useEffect(() => {\r\n if (!open) return\r\n const handler = (e: MouseEvent) => {\r\n if (!sidebarRef.current?.contains(e.target as Node)) onOpenChange(false)\r\n }\r\n document.addEventListener('mousedown', handler)\r\n return () => document.removeEventListener('mousedown', handler)\r\n }, [open, onOpenChange])\r\n\r\n React.useEffect(() => {\r\n if (!open) return\r\n const handler = (e: KeyboardEvent) => {\r\n if (e.key === 'Escape') onOpenChange(false)\r\n }\r\n document.addEventListener('keydown', handler)\r\n return () => document.removeEventListener('keydown', handler)\r\n }, [open, onOpenChange])\r\n\r\n const containerChrome =\r\n variant === 'sidebar'\r\n ? side === 'left'\r\n ? 'border-r border-sidebar-border bg-sidebar text-sidebar-foreground'\r\n : 'border-l border-sidebar-border bg-sidebar text-sidebar-foreground'\r\n : cn(\r\n 'rounded-xl border border-sidebar-border bg-sidebar text-sidebar-foreground',\r\n 'shadow-[var(--shadow-sm)]',\r\n variant === 'floating' && 'm-2',\r\n variant === 'inset' && 'm-2'\r\n )\r\n\r\n const widthClasses = collapsible === 'icon' ? 'w-64 lg:w-14 lg:hover:w-64' : 'w-64'\r\n const mobilePosition = side === 'left' ? 'left-0' : 'right-0'\r\n const mobileClosedTranslate = side === 'left' ? '-translate-x-full' : 'translate-x-full'\r\n\r\n return (\r\n <div className={cn('min-w-fit', className)} data-variant={variant} data-collapsible={collapsible} data-side={side}>\r\n {showBackdrop ? (\r\n <div\r\n className={cn(\r\n 'fixed inset-0 z-40 lg:hidden transition-opacity duration-200',\r\n open ? 'opacity-100 bg-foreground/20' : 'opacity-0 pointer-events-none'\r\n )}\r\n aria-hidden\r\n onClick={() => onOpenChange(false)}\r\n />\r\n ) : null}\r\n\r\n <div\r\n ref={sidebarRef}\r\n className={cn(\r\n 'flex flex-col absolute z-50 lg:static top-0 lg:translate-x-0 min-h-[280px] lg:min-h-[100dvh] overflow-y-auto transition-all duration-200 ease-out',\r\n mobilePosition,\r\n widthClasses,\r\n containerChrome,\r\n open ? 'translate-x-0' : mobileClosedTranslate\r\n )}\r\n aria-hidden={!open && collapsible === 'offcanvas'}\r\n >\r\n {headerSlot != null ? <div className=\"shrink-0\">{headerSlot}</div> : null}\r\n <div className=\"flex-1 min-h-0 overflow-auto\">{children}</div>\r\n {footerSlot != null ? <div className=\"shrink-0 border-t border-sidebar-border\">{footerSlot}</div> : null}\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\nexport function SidebarHeader({ className, ...props }: React.ComponentProps<'div'>) {\r\n return (\r\n <div\r\n data-slot=\"sidebar-header\"\r\n className={cn('flex flex-col gap-2 p-3', className)}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport function SidebarFooter({ className, ...props }: React.ComponentProps<'div'>) {\r\n return (\r\n <div\r\n data-slot=\"sidebar-footer\"\r\n className={cn('flex flex-col gap-2 p-3', className)}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport function SidebarContent({ className, ...props }: React.ComponentProps<'div'>) {\r\n return (\r\n <div\r\n data-slot=\"sidebar-content\"\r\n className={cn('flex min-h-0 flex-1 flex-col gap-2 overflow-auto', className)}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport function SidebarGroup({ className, ...props }: React.ComponentProps<'div'>) {\r\n return (\r\n <div\r\n data-slot=\"sidebar-group\"\r\n className={cn('relative flex w-full min-w-0 flex-col p-2', className)}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport function SidebarGroupLabel({ className, ...props }: React.ComponentProps<'div'>) {\r\n return (\r\n <div\r\n data-slot=\"sidebar-group-label\"\r\n className={cn(\r\n 'flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-semibold uppercase tracking-wide text-muted-foreground',\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport function SidebarGroupContent({ className, ...props }: React.ComponentProps<'div'>) {\r\n return <div data-slot=\"sidebar-group-content\" className={cn('w-full text-sm', className)} {...props} />\r\n}\r\n\r\nexport function SidebarMenu({ className, ...props }: React.ComponentProps<'ul'>) {\r\n return (\r\n <ul\r\n data-slot=\"sidebar-menu\"\r\n className={cn('flex w-full min-w-0 flex-col gap-0.5 list-none p-0 m-0', className)}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport function SidebarMenuItem({ className, ...props }: React.ComponentProps<'li'>) {\r\n return (\r\n <li data-slot=\"sidebar-menu-item\" className={cn('group/menu-item relative', className)} {...props} />\r\n )\r\n}\r\n\r\nexport function SidebarInput(props: React.ComponentProps<typeof Input>) {\r\n return (\r\n <Input\r\n data-slot=\"sidebar-input\"\r\n className=\"shadow-none\"\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport function SidebarSeparator({ className, ...props }: React.ComponentProps<typeof Separator>) {\r\n return (\r\n <Separator\r\n data-slot=\"sidebar-separator\"\r\n className={cn('bg-sidebar-border mx-2 w-auto', className)}\r\n {...props}\r\n />\r\n )\r\n}\r\n","/**\r\n * Alert Dialog: Modal confirmation dialogs.\r\n *\r\n * Design-system contract:\r\n * - Scope: UI-only primitive. No domain copy, no API calls.\r\n * - Tokens-only: semantic token classes only.\r\n * - Composition: title/description slots, Action/Cancel buttons.\r\n *\r\n * @author: @mindtris-team\r\n * @version: 0.1.0\r\n * @since: 2026-02-01\r\n */\r\n\r\n\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport * as AlertDialogPrimitive from \"@radix-ui/react-alert-dialog\"\r\n\r\nimport { cn } from \"../../lib/utils\"\r\n\r\nexport type AlertDialogProps = React.ComponentProps<typeof AlertDialogPrimitive.Root>\r\nexport type AlertDialogTriggerProps = React.ComponentProps<typeof AlertDialogPrimitive.Trigger>\r\nexport type AlertDialogPortalProps = React.ComponentProps<typeof AlertDialogPrimitive.Portal>\r\nexport type AlertDialogOverlayProps = React.ComponentProps<typeof AlertDialogPrimitive.Overlay>\r\nexport type AlertDialogContentProps = React.ComponentProps<typeof AlertDialogPrimitive.Content>\r\nexport type AlertDialogHeaderProps = React.ComponentProps<\"div\">\r\nexport type AlertDialogFooterProps = React.ComponentProps<\"div\">\r\nexport type AlertDialogTitleProps = React.ComponentProps<typeof AlertDialogPrimitive.Title>\r\nexport type AlertDialogDescriptionProps = React.ComponentProps<typeof AlertDialogPrimitive.Description>\r\nexport type AlertDialogActionProps = React.ComponentProps<typeof AlertDialogPrimitive.Action> & {\r\n variant?: \"default\" | \"destructive\"\r\n} & {\r\n variant?: \"default\" | \"destructive\"\r\n}\r\nexport type AlertDialogCancelProps = React.ComponentProps<typeof AlertDialogPrimitive.Cancel>\r\n\r\nexport function AlertDialog({ ...props }: AlertDialogProps) {\r\n return <AlertDialogPrimitive.Root data-slot=\"alert-dialog\" {...props} />\r\n}\r\n\r\nexport function AlertDialogTrigger({ ...props }: AlertDialogTriggerProps) {\r\n return <AlertDialogPrimitive.Trigger data-slot=\"alert-dialog-trigger\" {...props} />\r\n}\r\n\r\nexport function AlertDialogPortal({ ...props }: AlertDialogPortalProps) {\r\n return <AlertDialogPrimitive.Portal data-slot=\"alert-dialog-portal\" {...props} />\r\n}\r\n\r\nexport function AlertDialogOverlay({ className, ...props }: AlertDialogOverlayProps) {\r\n return (\r\n <AlertDialogPrimitive.Overlay\r\n data-slot=\"alert-dialog-overlay\"\r\n className={cn(\r\n \"fixed inset-0 z-[80]\",\r\n \"bg-foreground/20\",\r\n \"data-[state=open]:animate-in data-[state=closed]:animate-out\",\r\n \"data-[state=open]:fade-in-0 data-[state=closed]:fade-out-0\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport function AlertDialogContent({ className, children, ...props }: AlertDialogContentProps) {\r\n return (\r\n <AlertDialogPortal>\r\n <AlertDialogOverlay />\r\n <AlertDialogPrimitive.Content\r\n data-slot=\"alert-dialog-content\"\r\n className={cn(\r\n \"fixed left-1/2 top-1/2 z-[81] grid w-full max-w-[calc(100%-2rem)] -translate-x-1/2 -translate-y-1/2 gap-4\",\r\n \"rounded-xl border border-border bg-card text-card-foreground shadow-xl\",\r\n \"p-6 sm:max-w-lg\",\r\n \"data-[state=open]:animate-in data-[state=closed]:animate-out\",\r\n \"data-[state=open]:fade-in-0 data-[state=closed]:fade-out-0\",\r\n \"data-[state=open]:zoom-in-95 data-[state=closed]:zoom-out-95\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n </AlertDialogPrimitive.Content>\r\n </AlertDialogPortal>\r\n )\r\n}\r\n\r\nexport function AlertDialogHeader({ className, ...props }: AlertDialogHeaderProps) {\r\n return (\r\n <div\r\n data-slot=\"alert-dialog-header\"\r\n className={cn(\"flex flex-col gap-1.5 text-center sm:text-left\", className)}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport function AlertDialogFooter({ className, ...props }: AlertDialogFooterProps) {\r\n return (\r\n <div\r\n data-slot=\"alert-dialog-footer\"\r\n className={cn(\"flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\", className)}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport function AlertDialogTitle({ className, ...props }: AlertDialogTitleProps) {\r\n return (\r\n <AlertDialogPrimitive.Title\r\n data-slot=\"alert-dialog-title\"\r\n className={cn(\"text-lg font-semibold leading-none\", className)}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport function AlertDialogDescription({ className, ...props }: AlertDialogDescriptionProps) {\r\n return (\r\n <AlertDialogPrimitive.Description\r\n data-slot=\"alert-dialog-description\"\r\n className={cn(\"text-sm text-muted-foreground\", className)}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport function AlertDialogAction({\r\n className,\r\n variant = \"default\",\r\n ...props\r\n}: AlertDialogActionProps) {\r\n return (\r\n <AlertDialogPrimitive.Action\r\n data-slot=\"alert-dialog-action\"\r\n data-variant={variant}\r\n className={cn(\r\n \"inline-flex items-center justify-center rounded-lg border px-3 py-2 text-sm font-medium shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50\",\r\n variant === \"default\"\r\n ? \"border-transparent bg-primary text-primary-foreground hover:bg-primary/90\"\r\n : \"border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/90\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport function AlertDialogCancel({ className, ...props }: AlertDialogCancelProps) {\r\n return (\r\n <AlertDialogPrimitive.Cancel\r\n data-slot=\"alert-dialog-cancel\"\r\n className={cn(\r\n \"inline-flex items-center justify-center rounded-lg border border-border bg-card px-3 py-2 text-sm font-medium text-foreground shadow-none transition-colors hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 sm:mt-0\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n}\r\n","/**\n * Modal: Dialog overlay for focused tasks.\n *\n * Design-system contract\n * - Scope: UI-only primitive. No routing, no API calls, no domain copy.\n * - Tokens-only: semantic token classes only.\n * - A11y: built on Radix Dialog primitives.\n *\n * mindtris-ui reference variants we mirror:\n * - Basic modal shell (title/body/footer)\n * - Scrollable body with sticky-ish footer (handled via className hooks)\n *\n * @author: @mindtris-team\n * @version: 0.2.0\n * @since: 2026-02-01\n */\n\n\"use client\"\n\nimport * as React from 'react'\nimport { X } from 'lucide-react'\nimport { cn } from '../../lib/utils'\nimport { Button } from './button'\nimport { Dialog, DialogClose, DialogContent, DialogDescription, DialogHeader, DialogTitle } from './dialog'\nimport { Separator } from './separator'\n\nexport type ModalSize = 'sm' | 'md' | 'lg' | 'xl'\n\nexport interface ModalProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n title?: React.ReactNode\n description?: React.ReactNode\n children: React.ReactNode\n footer?: React.ReactNode\n size?: ModalSize\n /** Hide the top-right close button. */\n hideClose?: boolean\n className?: string\n panelClassName?: string\n /** Optional className for the body wrapper. */\n bodyClassName?: string\n /** Optional className for the footer wrapper. */\n footerClassName?: string\n /** Optional className for the header wrapper. */\n headerClassName?: string\n}\n\nexport function Modal({\n open,\n onOpenChange,\n title,\n description,\n children,\n footer,\n size = 'md',\n hideClose = false,\n className,\n panelClassName,\n bodyClassName,\n footerClassName,\n headerClassName,\n}: ModalProps) {\n const maxW =\n size === 'sm' ? 'max-w-sm' :\n size === 'lg' ? 'max-w-2xl' :\n size === 'xl' ? 'max-w-4xl' :\n 'max-w-lg'\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent\n className={cn(\"p-0 overflow-hidden\", maxW, className, panelClassName)}\n showCloseButton={false}\n >\n {(title || description || !hideClose) ? (\n <DialogHeader className={cn(\"px-5 py-4\", headerClassName)}>\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"min-w-0\">\n {title ? (\n <DialogTitle className=\"text-base font-semibold text-foreground\">{title}</DialogTitle>\n ) : null}\n {description ? (\n <DialogDescription className=\"mt-1\">{description}</DialogDescription>\n ) : null}\n </div>\n {!hideClose ? (\n <DialogClose asChild>\n <Button variant=\"icon-ghost\" size=\"icon-sm\" aria-label=\"Close modal\">\n <X className=\"h-4 w-4\" aria-hidden />\n </Button>\n </DialogClose>\n ) : null}\n </div>\n </DialogHeader>\n ) : null}\n\n {(title || description || !hideClose) ? <Separator /> : null}\n\n <div className={cn(\"px-5 py-4\", bodyClassName)}>{children}</div>\n\n {footer ? <Separator /> : null}\n {footer ? (\n <div className={cn(\"px-5 py-4\", footerClassName)}>{footer}</div>\n ) : null}\n </DialogContent>\n </Dialog>\n )\n}\n\n","\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\"\r\nimport { X } from \"lucide-react\"\r\n\r\nimport { cn } from \"../../lib/utils\"\r\n\r\nexport type SheetProps = React.ComponentProps<typeof DialogPrimitive.Root>\r\nexport type SheetTriggerProps = React.ComponentProps<typeof DialogPrimitive.Trigger>\r\nexport type SheetPortalProps = React.ComponentProps<typeof DialogPrimitive.Portal>\r\nexport type SheetCloseProps = React.ComponentProps<typeof DialogPrimitive.Close>\r\nexport type SheetOverlayProps = React.ComponentProps<typeof DialogPrimitive.Overlay>\r\nexport type SheetContentSide = \"top\" | \"right\" | \"bottom\" | \"left\"\r\nexport type SheetContentProps = React.ComponentProps<typeof DialogPrimitive.Content> & {\r\n side?: SheetContentSide\r\n /** Whether to render the top-right close button. */\r\n showCloseButton?: boolean\r\n}\r\nexport type SheetHeaderProps = React.ComponentProps<\"div\">\r\nexport type SheetFooterProps = React.ComponentProps<\"div\">\r\nexport type SheetTitleProps = React.ComponentProps<typeof DialogPrimitive.Title>\r\nexport type SheetDescriptionProps = React.ComponentProps<typeof DialogPrimitive.Description>\r\n\r\nexport function Sheet({ ...props }: SheetProps) {\r\n return <DialogPrimitive.Root data-slot=\"sheet\" {...props} />\r\n}\r\n\r\nexport function SheetTrigger({ ...props }: SheetTriggerProps) {\r\n return <DialogPrimitive.Trigger data-slot=\"sheet-trigger\" {...props} />\r\n}\r\n\r\nexport function SheetPortal({ ...props }: SheetPortalProps) {\r\n return <DialogPrimitive.Portal data-slot=\"sheet-portal\" {...props} />\r\n}\r\n\r\nexport function SheetClose({ ...props }: SheetCloseProps) {\r\n return <DialogPrimitive.Close data-slot=\"sheet-close\" {...props} />\r\n}\r\n\r\nexport function SheetOverlay({ className, ...props }: SheetOverlayProps) {\r\n return (\r\n <DialogPrimitive.Overlay\r\n data-slot=\"sheet-overlay\"\r\n className={cn(\r\n // Overlay should dim the whole page, including the sticky header (header uses z-50).\r\n \"fixed inset-0 z-[80]\",\r\n \"bg-foreground/20\",\r\n \"data-[state=open]:animate-in data-[state=closed]:animate-out\",\r\n \"data-[state=open]:fade-in-0 data-[state=closed]:fade-out-0\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport function SheetContent({\r\n className,\r\n children,\r\n side = \"right\",\r\n showCloseButton = true,\r\n ...props\r\n}: SheetContentProps) {\r\n const sideClasses: Record<SheetContentSide, string> = {\r\n // Inset sheets (do not touch window edges).\r\n right: \"top-2 bottom-2 right-2 w-[min(94vw,32rem)] max-h-[calc(100vh-1rem)] rounded-xl\",\r\n left: \"top-2 bottom-2 left-2 w-[min(94vw,32rem)] max-h-[calc(100vh-1rem)] rounded-xl\",\r\n // Full-width (but inset) sheets for top/bottom.\r\n top: \"top-2 left-2 right-2 w-auto max-h-[calc(100vh-1rem)] rounded-xl\",\r\n bottom: \"bottom-2 left-2 right-2 w-auto max-h-[calc(100vh-1rem)] rounded-xl min-h-[min(70vh,34rem)]\",\r\n }\r\n\r\n const motionClasses: Record<SheetContentSide, string> = {\r\n right: \"data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right\",\r\n left: \"data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left\",\r\n top: \"data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top\",\r\n bottom: \"data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom\",\r\n }\r\n\r\n return (\r\n <SheetPortal>\r\n <SheetOverlay />\r\n <DialogPrimitive.Content\r\n data-slot=\"sheet-content\"\r\n className={cn(\r\n \"fixed z-[81] flex flex-col gap-4\",\r\n \"overflow-hidden\",\r\n \"border border-border bg-card text-card-foreground shadow-xl\",\r\n \"data-[state=open]:animate-in data-[state=closed]:animate-out\",\r\n \"data-[state=closed]:duration-300 data-[state=open]:duration-500\",\r\n motionClasses[side],\r\n sideClasses[side],\r\n className\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n {showCloseButton ? (\r\n <DialogPrimitive.Close\r\n data-slot=\"sheet-close\"\r\n className={cn(\r\n \"absolute right-4 top-4 inline-flex items-center justify-center\",\r\n \"h-8 w-8 rounded-md\",\r\n \"cursor-pointer\",\r\n \"text-muted-foreground hover:text-foreground hover:bg-muted\",\r\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\r\n \"disabled:pointer-events-none disabled:cursor-not-allowed\"\r\n )}\r\n >\r\n <X className=\"h-4 w-4\" aria-hidden />\r\n <span className=\"sr-only\">Close</span>\r\n </DialogPrimitive.Close>\r\n ) : null}\r\n </DialogPrimitive.Content>\r\n </SheetPortal>\r\n )\r\n}\r\n\r\nexport function SheetHeader({ className, ...props }: SheetHeaderProps) {\r\n return <div data-slot=\"sheet-header\" className={cn(\"flex flex-col gap-1.5 p-6 pb-0\", className)} {...props} />\r\n}\r\n\r\nexport function SheetFooter({ className, ...props }: SheetFooterProps) {\r\n return (\r\n <div\r\n data-slot=\"sheet-footer\"\r\n className={cn(\"mt-auto flex flex-col-reverse gap-2 p-6 pt-0 sm:flex-row sm:justify-end\", className)}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport function SheetTitle({ className, ...props }: SheetTitleProps) {\r\n return (\r\n <DialogPrimitive.Title\r\n data-slot=\"sheet-title\"\r\n className={cn(\"text-lg font-semibold leading-none\", className)}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport function SheetDescription({ className, ...props }: SheetDescriptionProps) {\r\n return (\r\n <DialogPrimitive.Description\r\n data-slot=\"sheet-description\"\r\n className={cn(\"text-sm text-muted-foreground\", className)}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\n","\"use client\"\r\n\r\nimport * as React from \"react\"\r\n\r\nimport { cn } from \"../../lib/utils\"\r\n\r\nexport type TableProps = React.ComponentProps<\"table\">\r\nexport type TableHeaderProps = React.ComponentProps<\"thead\">\r\nexport type TableBodyProps = React.ComponentProps<\"tbody\">\r\nexport type TableFooterProps = React.ComponentProps<\"tfoot\">\r\nexport type TableRowProps = React.ComponentProps<\"tr\">\r\nexport type TableHeadProps = React.ComponentProps<\"th\">\r\nexport type TableCellProps = React.ComponentProps<\"td\">\r\nexport type TableCaptionProps = React.ComponentProps<\"caption\">\r\n\r\nexport function Table({ className, ...props }: TableProps) {\r\n return (\r\n <div data-slot=\"table-container\" className=\"relative w-full overflow-x-auto\">\r\n <table data-slot=\"table\" className={cn(\"w-full caption-bottom text-sm\", className)} {...props} />\r\n </div>\r\n )\r\n}\r\n\r\nexport function TableHeader({ className, ...props }: TableHeaderProps) {\r\n return (\r\n <thead\r\n data-slot=\"table-header\"\r\n className={cn(\"[&_tr]:border-b [&_tr]:border-border\", className)}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport function TableBody({ className, ...props }: TableBodyProps) {\r\n return (\r\n <tbody\r\n data-slot=\"table-body\"\r\n className={cn(\"[&_tr:last-child]:border-0\", className)}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport function TableFooter({ className, ...props }: TableFooterProps) {\r\n return (\r\n <tfoot\r\n data-slot=\"table-footer\"\r\n className={cn(\"border-t border-border bg-muted/30 font-medium [&>tr]:last:border-b-0\", className)}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport function TableRow({ className, ...props }: TableRowProps) {\r\n return (\r\n <tr\r\n data-slot=\"table-row\"\r\n className={cn(\r\n \"border-b border-border transition-colors\",\r\n \"hover:bg-muted/40 data-[state=selected]:bg-muted\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport function TableHead({ className, ...props }: TableHeadProps) {\r\n return (\r\n <th\r\n data-slot=\"table-head\"\r\n className={cn(\r\n \"h-10 px-3 text-left align-middle text-sm font-medium text-muted-foreground whitespace-nowrap\",\r\n \"[&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport function TableCell({ className, ...props }: TableCellProps) {\r\n return (\r\n <td\r\n data-slot=\"table-cell\"\r\n className={cn(\r\n \"px-3 py-3 align-middle text-sm text-foreground whitespace-nowrap\",\r\n \"[&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport function TableCaption({ className, ...props }: TableCaptionProps) {\r\n return (\r\n <caption\r\n data-slot=\"table-caption\"\r\n className={cn(\"mt-4 text-sm text-muted-foreground\", className)}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\n","\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport * as HoverCardPrimitive from \"@radix-ui/react-hover-card\"\r\n\r\nimport { cn } from \"../../lib/utils\"\r\n\r\nexport type HoverCardProps = React.ComponentProps<typeof HoverCardPrimitive.Root>\r\nexport type HoverCardTriggerProps = React.ComponentProps<typeof HoverCardPrimitive.Trigger>\r\nexport type HoverCardContentProps = React.ComponentProps<typeof HoverCardPrimitive.Content>\r\n\r\nexport function HoverCard({ ...props }: HoverCardProps) {\r\n return <HoverCardPrimitive.Root data-slot=\"hover-card\" {...props} />\r\n}\r\n\r\nexport function HoverCardTrigger({ ...props }: HoverCardTriggerProps) {\r\n return <HoverCardPrimitive.Trigger data-slot=\"hover-card-trigger\" {...props} />\r\n}\r\n\r\nexport function HoverCardContent({ className, align = \"center\", sideOffset = 8, ...props }: HoverCardContentProps) {\r\n return (\r\n <HoverCardPrimitive.Portal data-slot=\"hover-card-portal\">\r\n <HoverCardPrimitive.Content\r\n data-slot=\"hover-card-content\"\r\n align={align}\r\n sideOffset={sideOffset}\r\n className={cn(\r\n \"z-[9999] w-72 rounded-lg border border-border bg-popover text-popover-foreground p-4 shadow-lg outline-hidden\",\r\n \"origin-[--radix-hover-card-content-transform-origin]\",\r\n \"data-[state=open]:animate-in data-[state=closed]:animate-out\",\r\n \"data-[state=open]:fade-in-0 data-[state=closed]:fade-out-0\",\r\n \"data-[state=open]:zoom-in-95 data-[state=closed]:zoom-out-95\",\r\n \"data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n </HoverCardPrimitive.Portal>\r\n )\r\n}\r\n\r\n","\"use client\"\r\n\r\nimport * as React from \"react\"\r\n\r\nimport { cn } from \"../../lib/utils\"\r\n\r\nexport type CardDecoratorProps = React.ComponentProps<\"div\"> & {\r\n /** The decorative center content (usually an icon). */\r\n children: React.ReactNode\r\n}\r\n\r\n/**\r\n * CardDecorator\r\n * Small decorative wrapper for empty states / feature callouts.\r\n * Token-driven, no inline styles.\r\n */\r\nexport function CardDecorator({ className, children, ...props }: CardDecoratorProps) {\r\n return (\r\n <div\r\n data-slot=\"card-decorator\"\r\n className={cn(\r\n \"relative grid h-36 w-36 place-items-center\",\r\n \"rounded-2xl border border-border bg-muted/30\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n <div\r\n aria-hidden\r\n className=\"absolute inset-0 rounded-2xl bg-gradient-to-b from-transparent via-transparent to-card\"\r\n />\r\n <div\r\n data-slot=\"card-decorator-center\"\r\n className={cn(\r\n \"relative z-10 grid h-12 w-12 place-items-center\",\r\n \"rounded-lg border border-border bg-card shadow-sm\"\r\n )}\r\n >\r\n {children}\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\n","\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport * as ProgressPrimitive from \"@radix-ui/react-progress\"\r\n\r\nimport { cn } from \"../../lib/utils\"\r\n\r\nexport type ProgressVariant =\r\n | \"primary\"\r\n | \"secondary\"\r\n | \"tertiary\"\r\n | \"accent\"\r\n | \"destructive\"\r\n | \"muted\"\r\n | \"foreground\"\r\n\r\nexport type ProgressSize = \"sm\" | \"md\" | \"lg\"\r\n\r\nexport type ProgressProps = React.ComponentProps<typeof ProgressPrimitive.Root> & {\r\n /** 0-100 */\r\n value?: number | null\r\n variant?: ProgressVariant\r\n size?: ProgressSize\r\n}\r\n\r\nconst sizeClasses: Record<ProgressSize, string> = {\r\n // Make the visual differences obvious in docs.\r\n sm: \"h-1\",\r\n md: \"h-2\",\r\n lg: \"h-3\",\r\n}\r\n\r\nconst indicatorClasses: Record<ProgressVariant, string> = {\r\n primary: \"bg-primary\",\r\n secondary: \"bg-secondary\",\r\n // \"Tertiary\" in this system is a subtle surface + primary accent.\r\n // For progress, we interpret that as a subtle primary fill.\r\n tertiary: \"bg-primary/40\",\r\n accent: \"bg-accent\",\r\n destructive: \"bg-destructive\",\r\n muted: \"bg-muted-foreground\",\r\n foreground: \"bg-foreground\",\r\n}\r\n\r\nexport const Progress = React.forwardRef<\r\n React.ElementRef<typeof ProgressPrimitive.Root>,\r\n ProgressProps\r\n>(({ className, value, variant = \"primary\", size = \"md\", ...props }, ref) => {\r\n const isIndeterminate = value === null\r\n const clamped = Math.max(0, Math.min(100, Number(value ?? 0)))\r\n\r\n return (\r\n <ProgressPrimitive.Root\r\n ref={ref}\r\n data-slot=\"progress\"\r\n value={isIndeterminate ? null : clamped}\r\n aria-valuemin={0}\r\n aria-valuemax={100}\r\n aria-valuenow={isIndeterminate ? undefined : clamped}\r\n aria-valuetext={isIndeterminate ? \"Loading\" : undefined}\r\n className={cn(\r\n \"relative w-full overflow-hidden rounded-full bg-muted\",\r\n sizeClasses[size],\r\n className\r\n )}\r\n {...props}\r\n >\r\n <ProgressPrimitive.Indicator\r\n data-slot=\"progress-indicator\"\r\n className={cn(\r\n \"h-full transition-[width] duration-200 ease-out rounded-full\",\r\n indicatorClasses[variant],\r\n isIndeterminate ? \"animate-pulse\" : undefined\r\n )}\r\n style={{ width: `${isIndeterminate ? 40 : clamped}%` }}\r\n />\r\n </ProgressPrimitive.Root>\r\n )\r\n})\r\nProgress.displayName = \"Progress\"\r\n\r\n","\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport * as SliderPrimitive from \"@radix-ui/react-slider\"\r\n\r\nimport { cn } from \"../../lib/utils\"\r\n\r\nexport type SliderSize = \"sm\" | \"md\" | \"lg\"\r\nexport type SliderOrientation = \"horizontal\" | \"vertical\"\r\nexport type SliderVariant =\r\n | \"tertiary\"\r\n | \"foreground\"\r\n | \"primary\"\r\n | \"secondary\"\r\n | \"accent\"\r\n | \"destructive\"\r\n | \"muted\"\r\n\r\nexport type SliderThumbStyle = \"outline\" | \"solid\"\r\n\r\nexport type SliderMark = {\r\n value: number\r\n label?: React.ReactNode\r\n}\r\n\r\nexport type SliderProps = React.ComponentPropsWithoutRef<typeof SliderPrimitive.Root> & {\r\n size?: SliderSize\r\n variant?: SliderVariant\r\n /**\r\n * Thumb visual style.\r\n * - outline: background uses `bg-background` with a token border.\r\n * - solid: background uses the token variant color.\r\n */\r\n thumbStyle?: SliderThumbStyle\r\n /**\r\n * Optional marks/ticks along the track.\r\n * Provide `label` to render step labels.\r\n */\r\n marks?: SliderMark[]\r\n /** Render labels for marks that include `label`. */\r\n showMarkLabels?: boolean\r\n}\r\n\r\nconst trackSizeClasses: Record<SliderOrientation, Record<SliderSize, string>> = {\r\n horizontal: { sm: \"h-2\", md: \"h-2.5\", lg: \"h-3\" },\r\n vertical: { sm: \"w-2\", md: \"w-2.5\", lg: \"w-3\" },\r\n}\r\n\r\nconst thumbSizeClasses: Record<SliderSize, string> = {\r\n sm: \"h-3.5 w-3.5\",\r\n md: \"h-4 w-4\",\r\n lg: \"h-5 w-5\",\r\n}\r\n\r\nconst rangeClasses: Record<SliderVariant, string> = {\r\n // \"Tertiary\" in this system is a subtle surface + primary accent.\r\n // For slider, we interpret that as a subtle primary fill.\r\n tertiary: \"bg-primary/40\",\r\n foreground: \"bg-foreground\",\r\n primary: \"bg-primary\",\r\n secondary: \"bg-secondary\",\r\n accent: \"bg-accent\",\r\n destructive: \"bg-destructive\",\r\n muted: \"bg-muted-foreground\",\r\n}\r\n\r\nconst thumbBorderClasses: Record<SliderVariant, string> = {\r\n tertiary: \"border-border\",\r\n foreground: \"border-foreground\",\r\n primary: \"border-primary\",\r\n secondary: \"border-secondary\",\r\n accent: \"border-accent\",\r\n destructive: \"border-destructive\",\r\n muted: \"border-muted-foreground\",\r\n}\r\n\r\nconst thumbFillClasses: Record<SliderVariant, string> = {\r\n tertiary: \"bg-primary/40\",\r\n foreground: \"bg-foreground\",\r\n primary: \"bg-primary\",\r\n secondary: \"bg-secondary\",\r\n accent: \"bg-accent\",\r\n destructive: \"bg-destructive\",\r\n muted: \"bg-muted-foreground\",\r\n}\r\n\r\nexport const Slider = React.forwardRef<\r\n React.ElementRef<typeof SliderPrimitive.Root>,\r\n SliderProps\r\n>(\r\n (\r\n {\r\n className,\r\n size = \"md\",\r\n variant = \"foreground\",\r\n thumbStyle = \"outline\",\r\n marks,\r\n showMarkLabels = false,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const orientation = (props.orientation ?? \"horizontal\") as SliderOrientation\r\n const min = typeof props.min === \"number\" ? props.min : 0\r\n const max = typeof props.max === \"number\" ? props.max : 100\r\n\r\n const rawThumbValues = (props.value ?? props.defaultValue ?? [min]) as number[]\r\n const thumbCount = Math.max(1, Array.isArray(rawThumbValues) ? rawThumbValues.length : 1)\r\n\r\n const safeMarks =\r\n marks?.map((m) => ({\r\n value: Math.max(min, Math.min(max, m.value)),\r\n label: m.label,\r\n })) ?? []\r\n\r\n const showLabels = showMarkLabels && safeMarks.some((m) => m.label != null)\r\n\r\n const trackBase =\r\n orientation === \"vertical\"\r\n ? \"relative h-full grow overflow-hidden rounded-full bg-muted\"\r\n : \"relative w-full grow overflow-hidden rounded-full bg-muted\"\r\n\r\n const rangeBase =\r\n orientation === \"vertical\" ? \"absolute w-full rounded-full\" : \"absolute h-full rounded-full\"\r\n\r\n const marksLabelContainer =\r\n orientation === \"vertical\"\r\n ? \"relative h-full ml-3\"\r\n : \"relative w-full mt-2\"\r\n\r\n const marksLabelText =\r\n orientation === \"vertical\"\r\n ? \"absolute -translate-y-1/2 text-xs text-muted-foreground\"\r\n : \"absolute -translate-x-1/2 text-xs text-muted-foreground\"\r\n\r\n return (\r\n <div\r\n data-slot=\"slider-wrapper\"\r\n className={cn(orientation === \"vertical\" ? \"flex h-full items-start gap-3\" : \"w-full\")}\r\n >\r\n <SliderPrimitive.Root\r\n ref={ref}\r\n data-slot=\"slider\"\r\n className={cn(\r\n \"relative flex touch-none select-none\",\r\n orientation === \"vertical\" ? \"h-full flex-col items-center\" : \"w-full items-center\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n <SliderPrimitive.Track\r\n data-slot=\"slider-track\"\r\n className={cn(trackBase, trackSizeClasses[orientation][size])}\r\n >\r\n <SliderPrimitive.Range\r\n data-slot=\"slider-range\"\r\n className={cn(rangeBase, rangeClasses[variant])}\r\n />\r\n </SliderPrimitive.Track>\r\n\r\n {Array.from({ length: thumbCount }).map((_, idx) => (\r\n <SliderPrimitive.Thumb\r\n key={`thumb-${idx}`}\r\n data-slot=\"slider-thumb\"\r\n className={cn(\r\n \"block rounded-full\",\r\n thumbSizeClasses[size],\r\n thumbStyle === \"solid\"\r\n ? cn(thumbFillClasses[variant])\r\n : cn(\"border bg-background\", thumbBorderClasses[variant]),\r\n \"ring-offset-background transition-colors\",\r\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\r\n \"disabled:pointer-events-none disabled:opacity-50\"\r\n )}\r\n />\r\n ))}\r\n </SliderPrimitive.Root>\r\n\r\n {showLabels ? (\r\n <div data-slot=\"slider-mark-labels\" className={marksLabelContainer} aria-hidden=\"true\">\r\n {safeMarks\r\n .filter((m) => m.label != null)\r\n .map((m) => {\r\n const pct = ((m.value - min) / (max - min || 1)) * 100\r\n const style =\r\n orientation === \"vertical\"\r\n ? ({ bottom: `${pct}%` } as React.CSSProperties)\r\n : ({ left: `${pct}%` } as React.CSSProperties)\r\n return (\r\n <span\r\n key={`mark-label-${m.value}`}\r\n className={marksLabelText}\r\n style={style}\r\n >\r\n {m.label}\r\n </span>\r\n )\r\n })}\r\n </div>\r\n ) : null}\r\n </div>\r\n )\r\n }\r\n)\r\nSlider.displayName = \"Slider\"\r\n\r\n","/**\r\n * Skeleton: Loading placeholder (composable building block).\r\n *\r\n * Design-system contract\r\n * - Scope: UI-only primitive (2-app rule). No domain terms, no API calls.\r\n * - Tokens-only: no Tailwind palette colors; use semantic token classes only.\r\n * - Compositional: prefer composition (Avatar/Text/Card/Form/Table patterns) over config-heavy APIs.\r\n * - Motion: respects `prefers-reduced-motion` via Tailwind `motion-*` utilities.\r\n * - A11y: skeletons are typically decorative; set `aria-busy` on the parent region while loading.\r\n *\r\n * @author: @mindtris-team\r\n * @version: 0.3.0\r\n * @since: 2026-02-01\r\n *\r\n * @example\r\n * <div aria-busy=\"true\" aria-live=\"polite\">\r\n * <Skeleton className=\"h-10 w-10 rounded-full\" />\r\n * <Skeleton lines={2} className=\"mt-3\" />\r\n * </div>\r\n *\r\n * Reference: shadcn + Mindtris UI (composition patterns).\r\n */\r\n\r\n\"use client\"\r\n\r\nimport * as React from 'react'\r\nimport { cn } from '../../lib/utils'\r\n\r\nexport type SkeletonTone = 'muted' | 'accent'\r\nexport type SkeletonRadius = 'sm' | 'md' | 'lg' | 'full'\r\nexport type SkeletonLineSize = 'sm' | 'md' | 'lg'\r\n\r\nexport interface SkeletonProps extends React.ComponentPropsWithoutRef<'div'> {\r\n /**\r\n * Optional multi-line skeleton helper (kept for back-compat).\r\n * When set to > 1, the component renders a stack of line placeholders.\r\n */\r\n lines?: number\r\n /** Visual tone (semantic token background). */\r\n tone?: SkeletonTone\r\n /** Corner radius for the single-block skeleton. */\r\n radius?: SkeletonRadius\r\n /** Line height when `lines` is used. */\r\n lineSize?: SkeletonLineSize\r\n}\r\n\r\nconst toneClasses: Record<SkeletonTone, string> = {\r\n muted: 'bg-muted',\r\n // Keep skeletons neutral by default (avoid theme accent hues unless explicitly needed).\r\n // Still token-driven: uses the `--muted` token with opacity.\r\n accent: 'bg-muted/60',\r\n}\r\n\r\nconst radiusClasses: Record<SkeletonRadius, string> = {\r\n sm: 'rounded-sm',\r\n md: 'rounded-md',\r\n lg: 'rounded-lg',\r\n full: 'rounded-full',\r\n}\r\n\r\nconst lineHeightClasses: Record<SkeletonLineSize, string> = {\r\n sm: 'h-3',\r\n md: 'h-4',\r\n lg: 'h-5',\r\n}\r\n\r\nexport const Skeleton = React.forwardRef<HTMLDivElement, SkeletonProps>(\r\n (\r\n {\r\n className,\r\n lines,\r\n tone = 'muted',\r\n radius = 'md',\r\n lineSize = 'md',\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const base = cn(\r\n // Motion-safe pulse; never animate for users who prefer reduced motion.\r\n 'motion-safe:animate-pulse motion-reduce:animate-none',\r\n toneClasses[tone]\r\n )\r\n\r\n if (typeof lines === 'number' && lines > 1) {\r\n // Deterministic widths (helps avoid layout jump while still feeling realistic).\r\n const widths = ['w-full', 'w-11/12', 'w-5/6', 'w-4/5']\r\n return (\r\n <div ref={ref} className={cn('space-y-2', className)} {...props}>\r\n {Array.from({ length: lines }).map((_, i) => (\r\n <div\r\n key={i}\r\n data-slot=\"skeleton-line\"\r\n className={cn(\r\n base,\r\n radiusClasses.md,\r\n lineHeightClasses[lineSize],\r\n widths[Math.min(i, widths.length - 1)]\r\n )}\r\n />\r\n ))}\r\n </div>\r\n )\r\n }\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n data-slot=\"skeleton\"\r\n className={cn(base, radiusClasses[radius], className)}\r\n {...props}\r\n />\r\n )\r\n }\r\n)\r\nSkeleton.displayName = 'Skeleton'\r\n\r\n","'use client'\r\n\r\nimport { cn } from '../../lib/utils'\r\nimport { Skeleton as DSSkeleton } from './skeleton'\r\n\r\ninterface LoadingSpinnerProps {\r\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\r\n variant?: 'default' | 'primary' | 'white' | 'gray'\r\n className?: string\r\n text?: string\r\n}\r\n\r\nconst sizeClasses = {\r\n xs: 'h-3 w-3',\r\n sm: 'h-4 w-4',\r\n md: 'h-6 w-6',\r\n lg: 'h-8 w-8',\r\n xl: 'h-12 w-12'\r\n}\r\n\r\nconst variantClasses = {\r\n default: 'text-muted-foreground',\r\n primary: 'text-primary',\r\n white: 'text-white',\r\n gray: 'text-muted-foreground'\r\n}\r\n\r\nexport default function LoadingSpinner({\r\n size = 'md',\r\n variant = 'default',\r\n className,\r\n text\r\n}: LoadingSpinnerProps) {\r\n return (\r\n <div className={cn('flex items-center justify-center', className)}>\r\n <div className=\"flex items-center space-x-2\">\r\n <svg\r\n className={cn('animate-spin', sizeClasses[size], variantClasses[variant])}\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\" />\r\n <path className=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\" />\r\n </svg>\r\n {text && <span className={cn('text-sm', variantClasses[variant])}>{text}</span>}\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\nexport function CardSkeleton({ className }: { className?: string }) {\r\n return (\r\n <div\r\n data-slot=\"card-skeleton\"\r\n className={cn('rounded-xl border border-border bg-card p-4', className)}\r\n aria-busy=\"true\"\r\n >\r\n <DSSkeleton className=\"h-4 w-3/4\" />\r\n <DSSkeleton className=\"h-4 w-1/2 mt-2\" tone=\"accent\" />\r\n <DSSkeleton className=\"mt-4 h-40 w-full\" radius=\"lg\" />\r\n <div className=\"mt-4 flex items-center gap-2\">\r\n <DSSkeleton className=\"h-9 w-24\" radius=\"md\" />\r\n <DSSkeleton className=\"h-9 w-20\" radius=\"md\" tone=\"accent\" />\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\nexport function TableSkeleton({ rows = 5, columns = 4 }: { rows?: number; columns?: number }) {\r\n return (\r\n <div className=\"rounded-xl border border-border bg-card overflow-hidden\" aria-busy=\"true\">\r\n <div className=\"px-6 py-3 border-b border-border\">\r\n <div className=\"flex gap-4\">\r\n {Array.from({ length: columns }).map((_, i) => (\r\n <DSSkeleton key={i} className=\"h-4 flex-1\" />\r\n ))}\r\n </div>\r\n </div>\r\n {Array.from({ length: rows }).map((_, rowIndex) => (\r\n <div key={rowIndex} className=\"px-6 py-4 border-b border-border last:border-b-0\">\r\n <div className=\"flex gap-4\">\r\n {Array.from({ length: columns }).map((_, colIndex) => (\r\n <DSSkeleton key={colIndex} className=\"h-4 flex-1\" />\r\n ))}\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n )\r\n}\r\n","'use client'\r\n\r\nimport React from 'react'\r\nimport { Button } from './button'\r\n\r\ninterface ErrorBoundaryState {\r\n hasError: boolean\r\n error: Error | null\r\n}\r\n\r\ninterface ErrorBoundaryProps {\r\n children: React.ReactNode\r\n fallback?: React.ComponentType<{ error: Error | null; resetError: () => void }>\r\n}\r\n\r\n/**\r\n * Error Boundary component for theme system\r\n * Follows CONTRIBUTING.md: error handling, error boundaries\r\n */\r\nexport class ErrorBoundary extends React.Component<ErrorBoundaryProps, ErrorBoundaryState> {\r\n constructor(props: ErrorBoundaryProps) {\r\n super(props)\r\n this.state = {\r\n hasError: false,\r\n error: null\r\n }\r\n }\r\n\r\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\r\n return {\r\n hasError: true,\r\n error\r\n }\r\n }\r\n\r\n componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {\r\n console.error('Theme system error:', error, errorInfo)\r\n }\r\n\r\n resetError = () => {\r\n this.setState({\r\n hasError: false,\r\n error: null\r\n })\r\n }\r\n\r\n render() {\r\n if (this.state.hasError) {\r\n if (this.props.fallback) {\r\n const Fallback = this.props.fallback\r\n return <Fallback error={this.state.error} resetError={this.resetError} />\r\n }\r\n\r\n return (\r\n <div className=\"rounded-lg border border-destructive bg-destructive/10 p-4\">\r\n <h3 className=\"text-sm font-semibold text-destructive mb-2\">Theme Error</h3>\r\n <p className=\"text-sm text-muted-foreground mb-4\">\r\n {this.state.error?.message || 'An error occurred while applying the theme'}\r\n </p>\r\n <Button onClick={this.resetError} size=\"sm\" variant=\"outline\">\r\n Try Again\r\n </Button>\r\n </div>\r\n )\r\n }\r\n\r\n return this.props.children\r\n }\r\n}\r\n\r\nexport function ErrorFallback({\r\n error,\r\n resetError,\r\n}: {\r\n error: Error | null\r\n resetError: () => void\r\n}) {\r\n return (\r\n <div className=\"rounded-lg border border-destructive bg-destructive/10 p-4\">\r\n <h3 className=\"text-sm font-semibold text-destructive mb-2\">Something went wrong</h3>\r\n <p className=\"text-sm text-muted-foreground mb-4\">\r\n {error?.message || 'An unexpected error occurred'}\r\n </p>\r\n <Button onClick={resetError} size=\"sm\" variant=\"outline\">\r\n Try Again\r\n </Button>\r\n </div>\r\n )\r\n}\r\n\r\nexport function useErrorHandler() {\r\n const [error, setError] = React.useState<Error | null>(null)\r\n\r\n const resetError = React.useCallback(() => {\r\n setError(null)\r\n }, [])\r\n\r\n const handleError = React.useCallback((err: unknown) => {\r\n setError(err instanceof Error ? err : new Error(String(err)))\r\n }, [])\r\n\r\n return {\r\n error,\r\n setError,\r\n resetError,\r\n handleError,\r\n }\r\n}\r\n","'use client'\r\n\r\nimport * as React from 'react'\r\nimport { ChevronDown } from 'lucide-react'\r\nimport { DayPicker, UI } from 'react-day-picker'\r\n\r\nimport { cn } from '../../lib/utils'\r\n\r\nexport type CalendarProps = React.ComponentProps<typeof DayPicker>\r\n\r\n/** Custom dropdown so we always render ChevronDown (lucide) and control layout. */\r\nfunction CalendarDropdown(props: {\r\n options?: Array<{ value: number; label: string; disabled?: boolean }>\r\n className?: string\r\n components: Record<string, React.ComponentType<unknown>>\r\n classNames: Record<string, string>\r\n [key: string]: unknown\r\n}) {\r\n const { options, className, components, classNames, ...selectProps } = props\r\n const selectedOption = options?.find(({ value }) => value === selectProps.value)\r\n const cssClassSelect = [classNames[UI.Dropdown], className].filter(Boolean).join(' ')\r\n // `react-day-picker` passes component overrides as unknown; cast to allow standard props.\r\n const Select = components.Select as React.ComponentType<any>\r\n const Option = components.Option as React.ComponentType<any>\r\n return (\r\n <span data-disabled={selectProps.disabled} className={classNames[UI.DropdownRoot]}>\r\n {React.createElement(Select, { className: cssClassSelect, ...selectProps }, options?.map(({ value, label, disabled }) => React.createElement(Option, { key: value, value, disabled }, label)))}\r\n <span className={classNames[UI.CaptionLabel]} aria-hidden=\"true\">\r\n {selectedOption?.label}\r\n <ChevronDown className=\"size-3 shrink-0 opacity-40 text-muted-foreground\" />\r\n </span>\r\n </span>\r\n )\r\n}\r\n\r\nfunction Calendar({ className, classNames, showOutsideDays = true, ...props }: CalendarProps) {\r\n return (\r\n <DayPicker\r\n showOutsideDays={showOutsideDays}\r\n className={cn('p-3 text-foreground', className)}\r\n classNames={{\r\n months: 'relative flex flex-col sm:flex-row space-y-4 sm:space-y-0',\r\n month_caption: 'flex justify-center items-center h-10 min-h-[2.5rem] shrink-0 relative leading-none',\r\n caption_label: 'text-xs font-medium inline-flex items-center gap-2 pointer-events-none',\r\n dropdowns: 'flex items-center justify-center gap-2 w-full',\r\n dropdown_root:\r\n 'relative flex items-center justify-center gap-2 rounded-md border border-border bg-field h-7 min-h-7 pl-2.5 pr-2 py-1 text-xs text-foreground',\r\n dropdown:\r\n 'absolute inset-0 w-full h-full cursor-pointer opacity-0 appearance-none bg-transparent',\r\n months_dropdown: 'min-w-[5.5rem]',\r\n years_dropdown: 'min-w-[4.5rem]',\r\n nav: 'absolute left-3 right-3 top-0 flex items-center justify-between h-10 min-h-[2.5rem] pointer-events-none [&_button]:pointer-events-auto',\r\n button_previous:\r\n 'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:opacity-100 [&_svg]:size-[7px_11px] size-7 min-h-7 bg-transparent p-0 opacity-50 hover:opacity-100 z-50',\r\n button_next:\r\n 'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:opacity-100 [&_svg]:size-[7px_11px] size-7 min-h-7 bg-transparent p-0 opacity-50 hover:opacity-100 z-50',\r\n chevron: 'fill-current shrink-0 w-3 h-3 opacity-50 text-muted-foreground',\r\n month_grid: 'w-full border-collapse space-y-1',\r\n weekdays: 'flex',\r\n weekday: 'text-muted-foreground font-medium rounded-md w-9 text-xs',\r\n week: 'flex w-full mt-2',\r\n day: 'h-9 w-9 text-center text-sm p-0 relative [&:has([aria-selected].day-range-end)]:rounded-r-md [&:has([aria-selected].day-outside)]:bg-muted [&:has([aria-selected])]:bg-primary first:[&:has([aria-selected])]:rounded-l-md last:[&:has([aria-selected])]:rounded-r-md focus-within:relative focus-within:z-20',\r\n day_button:\r\n 'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 hover:bg-primary hover:text-primary-foreground h-9 w-9 p-0 aria-selected:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background',\r\n range_start: 'rounded-l-lg',\r\n range_end: 'day-range-end rounded-r-lg',\r\n selected: 'bg-primary text-primary-foreground hover:bg-primary hover:text-primary-foreground focus:bg-primary focus:text-primary-foreground',\r\n today: 'bg-primary text-primary-foreground',\r\n outside: 'day-outside text-muted-foreground aria-selected:bg-primary/50 aria-selected:text-muted-foreground',\r\n disabled: 'text-muted-foreground opacity-50',\r\n range_middle: 'aria-selected:bg-primary/70 aria-selected:text-primary-foreground',\r\n hidden: 'invisible',\r\n ...classNames\r\n }}\r\n components={{\r\n Dropdown: CalendarDropdown,\r\n Chevron: (props) => {\r\n const svgClass = cn('fill-current shrink-0', props.className)\r\n if (props.orientation === 'left') {\r\n return <svg className={svgClass} width=\"7\" height=\"11\" viewBox=\"0 0 7 11\"><path d=\"M5.4 10.8l1.4-1.4-4-4 4-4L5.4 0 0 5.4z\" /></svg>\r\n }\r\n if (props.orientation === 'right') {\r\n return <svg className={svgClass} width=\"7\" height=\"11\" viewBox=\"0 0 7 11\"><path d=\"M1.4 10.8L0 9.4l4-4-4-4L1.4 0l5.4 5.4z\" /></svg>\r\n }\r\n return null\r\n }\r\n }}\r\n {...props}\r\n />\r\n )\r\n}\r\nCalendar.displayName = 'Calendar'\r\n\r\nexport { Calendar }\r\n","\"use client\"\r\n\r\nimport * as React from 'react'\r\nimport { format } from 'date-fns'\r\nimport type { DateRange } from 'react-day-picker'\r\nimport { Calendar as CalendarIcon } from 'lucide-react'\r\n\r\nimport { cn } from '../../lib/utils'\r\nimport { Button } from './button'\r\nimport { Calendar } from './calendar'\r\nimport { Popover, PopoverContent, PopoverTrigger } from './popover'\r\n\r\n/** Token-driven trigger style: matches Input (flat, no raised shadow) for consistency with time/other inputs. */\r\nconst triggerButtonClass =\r\n 'inline-flex items-center gap-2 rounded-lg border border-input bg-field px-3 py-2 text-left text-sm font-normal text-foreground shadow-none transition-colors hover:border-border/80 focus-visible:outline-none focus-visible:ring-0 focus-visible:border-foreground/40 disabled:pointer-events-none disabled:opacity-50 disabled:bg-muted disabled:text-muted-foreground [&_svg]:size-4 [&_svg]:shrink-0'\r\n\r\nexport interface DatePickerProps {\r\n /** Selected date (controlled). */\r\n value?: Date\r\n /** Called when date is selected. */\r\n onSelect?: (date: Date | undefined) => void\r\n /** Placeholder when no date selected. */\r\n placeholder?: string\r\n /** Disabled state. */\r\n disabled?: boolean\r\n /** Trigger button class. */\r\n className?: string\r\n /** Calendar props (e.g. disabled dates). mode/selected/onSelect/required are controlled by this component. */\r\n calendarProps?: Omit<React.ComponentProps<typeof Calendar>, 'mode' | 'selected' | 'onSelect' | 'required'>\r\n}\r\n\r\n/**\r\n * DatePicker\r\n * Single-date picker: Popover + Calendar. Token-driven, minimal state.\r\n * Reusable component; no business logic. Composition: PopoverTrigger + Calendar.\r\n */\r\nexport function DatePicker({\r\n value,\r\n onSelect,\r\n placeholder = 'Pick a date',\r\n disabled = false,\r\n className,\r\n calendarProps,\r\n}: DatePickerProps) {\r\n return (\r\n <Popover>\r\n <PopoverTrigger asChild>\r\n <button\r\n type=\"button\"\r\n disabled={disabled}\r\n className={cn(triggerButtonClass, !value && 'text-muted-foreground', className)}\r\n >\r\n <CalendarIcon />\r\n {value ? format(value, 'PPP') : placeholder}\r\n </button>\r\n </PopoverTrigger>\r\n <PopoverContent className=\"w-auto p-0\" align=\"start\" collisionPadding={16} avoidCollisions>\r\n <Calendar\r\n mode=\"single\"\r\n selected={value}\r\n onSelect={onSelect}\r\n initialFocus\r\n {...calendarProps}\r\n required={false}\r\n />\r\n </PopoverContent>\r\n </Popover>\r\n )\r\n}\r\n\r\nexport interface DatePickerRangeProps {\r\n /** Selected range (controlled). */\r\n value?: DateRange\r\n /** Called when range is selected. */\r\n onSelect?: (range: DateRange | undefined) => void\r\n /** Placeholder when no range selected. */\r\n placeholder?: string\r\n /** Disabled state. */\r\n disabled?: boolean\r\n /** Trigger button class. */\r\n className?: string\r\n /** Calendar props. mode/selected/onSelect/required are controlled by this component. */\r\n calendarProps?: Omit<React.ComponentProps<typeof Calendar>, 'mode' | 'selected' | 'onSelect' | 'required'>\r\n}\r\n\r\n/**\r\n * DatePickerRange\r\n * Range date picker: Popover + Calendar in range mode. Token-driven, minimal state.\r\n */\r\nexport function DatePickerRange({\r\n value,\r\n onSelect,\r\n placeholder = 'Pick a date range',\r\n disabled = false,\r\n className,\r\n calendarProps,\r\n}: DatePickerRangeProps) {\r\n return (\r\n <Popover>\r\n <PopoverTrigger asChild>\r\n <Button\r\n variant=\"outline\"\r\n shape=\"rounded\"\r\n disabled={disabled}\r\n className={cn(\r\n 'w-full min-w-[15rem] justify-start text-left font-normal rounded-lg shadow-none border-input bg-field hover:border-border/80 focus-visible:ring-0 focus-visible:border-foreground/40',\r\n !value?.from && 'text-muted-foreground',\r\n className\r\n )}\r\n leadingIcon={<CalendarIcon className=\"size-4\" />}\r\n >\r\n {value?.from ? (\r\n value.to ? (\r\n <>\r\n {format(value.from, 'LLL dd, y')} – {format(value.to, 'LLL dd, y')}\r\n </>\r\n ) : (\r\n format(value.from, 'LLL dd, y')\r\n )\r\n ) : (\r\n placeholder\r\n )}\r\n </Button>\r\n </PopoverTrigger>\r\n <PopoverContent className=\"w-auto p-0\" align=\"start\" collisionPadding={16} avoidCollisions>\r\n <Calendar\r\n mode=\"range\"\r\n defaultMonth={value?.from}\r\n selected={value}\r\n onSelect={onSelect}\r\n initialFocus\r\n {...calendarProps}\r\n required={false}\r\n />\r\n </PopoverContent>\r\n </Popover>\r\n )\r\n}\r\n","/**\n * @module constants\n * @summary Useful constants\n * @description\n * Collection of useful date constants.\n *\n * The constants could be imported from `date-fns/constants`:\n *\n * ```ts\n * import { maxTime, minTime } from \"./constants/date-fns/constants\";\n *\n * function isAllowedTime(time) {\n * return time <= maxTime && time >= minTime;\n * }\n * ```\n */\n\n/**\n * @constant\n * @name daysInWeek\n * @summary Days in 1 week.\n */\nexport const daysInWeek = 7;\n\n/**\n * @constant\n * @name daysInYear\n * @summary Days in 1 year.\n *\n * @description\n * How many days in a year.\n *\n * One years equals 365.2425 days according to the formula:\n *\n * > Leap year occurs every 4 years, except for years that are divisible by 100 and not divisible by 400.\n * > 1 mean year = (365+1/4-1/100+1/400) days = 365.2425 days\n */\nexport const daysInYear = 365.2425;\n\n/**\n * @constant\n * @name maxTime\n * @summary Maximum allowed time.\n *\n * @example\n * import { maxTime } from \"./constants/date-fns/constants\";\n *\n * const isValid = 8640000000000001 <= maxTime;\n * //=> false\n *\n * new Date(8640000000000001);\n * //=> Invalid Date\n */\nexport const maxTime = Math.pow(10, 8) * 24 * 60 * 60 * 1000;\n\n/**\n * @constant\n * @name minTime\n * @summary Minimum allowed time.\n *\n * @example\n * import { minTime } from \"./constants/date-fns/constants\";\n *\n * const isValid = -8640000000000001 >= minTime;\n * //=> false\n *\n * new Date(-8640000000000001)\n * //=> Invalid Date\n */\nexport const minTime = -maxTime;\n\n/**\n * @constant\n * @name millisecondsInWeek\n * @summary Milliseconds in 1 week.\n */\nexport const millisecondsInWeek = 604800000;\n\n/**\n * @constant\n * @name millisecondsInDay\n * @summary Milliseconds in 1 day.\n */\nexport const millisecondsInDay = 86400000;\n\n/**\n * @constant\n * @name millisecondsInMinute\n * @summary Milliseconds in 1 minute\n */\nexport const millisecondsInMinute = 60000;\n\n/**\n * @constant\n * @name millisecondsInHour\n * @summary Milliseconds in 1 hour\n */\nexport const millisecondsInHour = 3600000;\n\n/**\n * @constant\n * @name millisecondsInSecond\n * @summary Milliseconds in 1 second\n */\nexport const millisecondsInSecond = 1000;\n\n/**\n * @constant\n * @name minutesInYear\n * @summary Minutes in 1 year.\n */\nexport const minutesInYear = 525600;\n\n/**\n * @constant\n * @name minutesInMonth\n * @summary Minutes in 1 month.\n */\nexport const minutesInMonth = 43200;\n\n/**\n * @constant\n * @name minutesInDay\n * @summary Minutes in 1 day.\n */\nexport const minutesInDay = 1440;\n\n/**\n * @constant\n * @name minutesInHour\n * @summary Minutes in 1 hour.\n */\nexport const minutesInHour = 60;\n\n/**\n * @constant\n * @name monthsInQuarter\n * @summary Months in 1 quarter.\n */\nexport const monthsInQuarter = 3;\n\n/**\n * @constant\n * @name monthsInYear\n * @summary Months in 1 year.\n */\nexport const monthsInYear = 12;\n\n/**\n * @constant\n * @name quartersInYear\n * @summary Quarters in 1 year\n */\nexport const quartersInYear = 4;\n\n/**\n * @constant\n * @name secondsInHour\n * @summary Seconds in 1 hour.\n */\nexport const secondsInHour = 3600;\n\n/**\n * @constant\n * @name secondsInMinute\n * @summary Seconds in 1 minute.\n */\nexport const secondsInMinute = 60;\n\n/**\n * @constant\n * @name secondsInDay\n * @summary Seconds in 1 day.\n */\nexport const secondsInDay = secondsInHour * 24;\n\n/**\n * @constant\n * @name secondsInWeek\n * @summary Seconds in 1 week.\n */\nexport const secondsInWeek = secondsInDay * 7;\n\n/**\n * @constant\n * @name secondsInYear\n * @summary Seconds in 1 year.\n */\nexport const secondsInYear = secondsInDay * daysInYear;\n\n/**\n * @constant\n * @name secondsInMonth\n * @summary Seconds in 1 month\n */\nexport const secondsInMonth = secondsInYear / 12;\n\n/**\n * @constant\n * @name secondsInQuarter\n * @summary Seconds in 1 quarter.\n */\nexport const secondsInQuarter = secondsInMonth * 3;\n\n/**\n * @constant\n * @name constructFromSymbol\n * @summary Symbol enabling Date extensions to inherit properties from the reference date.\n *\n * The symbol is used to enable the `constructFrom` function to construct a date\n * using a reference date and a value. It allows to transfer extra properties\n * from the reference date to the new date. It's useful for extensions like\n * [`TZDate`](https://github.com/date-fns/tz) that accept a time zone as\n * a constructor argument.\n */\nexport const constructFromSymbol = Symbol.for(\"constructDateFrom\");\n","import { constructFromSymbol } from \"./constants.js\";\n\n/**\n * @name constructFrom\n * @category Generic Helpers\n * @summary Constructs a date using the reference date and the value\n *\n * @description\n * The function constructs a new date using the constructor from the reference\n * date and the given value. It helps to build generic functions that accept\n * date extensions.\n *\n * It defaults to `Date` if the passed reference date is a number or a string.\n *\n * Starting from v3.7.0, it allows to construct a date using `[Symbol.for(\"constructDateFrom\")]`\n * enabling to transfer extra properties from the reference date to the new date.\n * It's useful for extensions like [`TZDate`](https://github.com/date-fns/tz)\n * that accept a time zone as a constructor argument.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The reference date to take constructor from\n * @param value - The value to create the date\n *\n * @returns Date initialized using the given date and value\n *\n * @example\n * import { constructFrom } from \"./constructFrom/date-fns\";\n *\n * // A function that clones a date preserving the original type\n * function cloneDate<DateType extends Date>(date: DateType): DateType {\n * return constructFrom(\n * date, // Use constructor from the given date\n * date.getTime() // Use the date value to create a new date\n * );\n * }\n */\nexport function constructFrom(date, value) {\n if (typeof date === \"function\") return date(value);\n\n if (date && typeof date === \"object\" && constructFromSymbol in date)\n return date[constructFromSymbol](value);\n\n if (date instanceof Date) return new date.constructor(value);\n\n return new Date(value);\n}\n\n// Fallback for modularized imports:\nexport default constructFrom;\n","import { constructFrom } from \"./constructFrom.js\";\n\n/**\n * @name toDate\n * @category Common Helpers\n * @summary Convert the given argument to an instance of Date.\n *\n * @description\n * Convert the given argument to an instance of Date.\n *\n * If the argument is an instance of Date, the function returns its clone.\n *\n * If the argument is a number, it is treated as a timestamp.\n *\n * If the argument is none of the above, the function returns Invalid Date.\n *\n * Starting from v3.7.0, it clones a date using `[Symbol.for(\"constructDateFrom\")]`\n * enabling to transfer extra properties from the reference date to the new date.\n * It's useful for extensions like [`TZDate`](https://github.com/date-fns/tz)\n * that accept a time zone as a constructor argument.\n *\n * **Note**: *all* Date arguments passed to any *date-fns* function is processed by `toDate`.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param argument - The value to convert\n *\n * @returns The parsed date in the local time zone\n *\n * @example\n * // Clone the date:\n * const result = toDate(new Date(2014, 1, 11, 11, 30, 30))\n * //=> Tue Feb 11 2014 11:30:30\n *\n * @example\n * // Convert the timestamp to date:\n * const result = toDate(1392098430000)\n * //=> Tue Feb 11 2014 11:30:30\n */\nexport function toDate(argument, context) {\n // [TODO] Get rid of `toDate` or `constructFrom`?\n return constructFrom(context || argument, argument);\n}\n\n// Fallback for modularized imports:\nexport default toDate;\n","let defaultOptions = {};\n\nexport function getDefaultOptions() {\n return defaultOptions;\n}\n\nexport function setDefaultOptions(newOptions) {\n defaultOptions = newOptions;\n}\n","import { getDefaultOptions } from \"./_lib/defaultOptions.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link startOfWeek} function options.\n */\n\n/**\n * @name startOfWeek\n * @category Week Helpers\n * @summary Return the start of a week for the given date.\n *\n * @description\n * Return the start of a week for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The start of a week\n *\n * @example\n * // The start of a week for 2 September 2014 11:55:00:\n * const result = startOfWeek(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Sun Aug 31 2014 00:00:00\n *\n * @example\n * // If the week starts on Monday, the start of the week for 2 September 2014 11:55:00:\n * const result = startOfWeek(new Date(2014, 8, 2, 11, 55, 0), { weekStartsOn: 1 })\n * //=> Mon Sep 01 2014 00:00:00\n */\nexport function startOfWeek(date, options) {\n const defaultOptions = getDefaultOptions();\n const weekStartsOn =\n options?.weekStartsOn ??\n options?.locale?.options?.weekStartsOn ??\n defaultOptions.weekStartsOn ??\n defaultOptions.locale?.options?.weekStartsOn ??\n 0;\n\n const _date = toDate(date, options?.in);\n const day = _date.getDay();\n const diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn;\n\n _date.setDate(_date.getDate() - diff);\n _date.setHours(0, 0, 0, 0);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfWeek;\n","import { startOfWeek } from \"./startOfWeek.js\";\n\n/**\n * The {@link startOfISOWeek} function options.\n */\n\n/**\n * @name startOfISOWeek\n * @category ISO Week Helpers\n * @summary Return the start of an ISO week for the given date.\n *\n * @description\n * Return the start of an ISO week for the given date.\n * The result will be in the local timezone.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The start of an ISO week\n *\n * @example\n * // The start of an ISO week for 2 September 2014 11:55:00:\n * const result = startOfISOWeek(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Mon Sep 01 2014 00:00:00\n */\nexport function startOfISOWeek(date, options) {\n return startOfWeek(date, { ...options, weekStartsOn: 1 });\n}\n\n// Fallback for modularized imports:\nexport default startOfISOWeek;\n","import { constructFrom } from \"./constructFrom.js\";\nimport { startOfISOWeek } from \"./startOfISOWeek.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getISOWeekYear} function options.\n */\n\n/**\n * @name getISOWeekYear\n * @category ISO Week-Numbering Year Helpers\n * @summary Get the ISO week-numbering year of the given date.\n *\n * @description\n * Get the ISO week-numbering year of the given date,\n * which always starts 3 days before the year's first Thursday.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @param date - The given date\n *\n * @returns The ISO week-numbering year\n *\n * @example\n * // Which ISO-week numbering year is 2 January 2005?\n * const result = getISOWeekYear(new Date(2005, 0, 2))\n * //=> 2004\n */\nexport function getISOWeekYear(date, options) {\n const _date = toDate(date, options?.in);\n const year = _date.getFullYear();\n\n const fourthOfJanuaryOfNextYear = constructFrom(_date, 0);\n fourthOfJanuaryOfNextYear.setFullYear(year + 1, 0, 4);\n fourthOfJanuaryOfNextYear.setHours(0, 0, 0, 0);\n const startOfNextYear = startOfISOWeek(fourthOfJanuaryOfNextYear);\n\n const fourthOfJanuaryOfThisYear = constructFrom(_date, 0);\n fourthOfJanuaryOfThisYear.setFullYear(year, 0, 4);\n fourthOfJanuaryOfThisYear.setHours(0, 0, 0, 0);\n const startOfThisYear = startOfISOWeek(fourthOfJanuaryOfThisYear);\n\n if (_date.getTime() >= startOfNextYear.getTime()) {\n return year + 1;\n } else if (_date.getTime() >= startOfThisYear.getTime()) {\n return year;\n } else {\n return year - 1;\n }\n}\n\n// Fallback for modularized imports:\nexport default getISOWeekYear;\n","import { toDate } from \"../toDate.js\";\n\n/**\n * Google Chrome as of 67.0.3396.87 introduced timezones with offset that includes seconds.\n * They usually appear for dates that denote time before the timezones were introduced\n * (e.g. for 'Europe/Prague' timezone the offset is GMT+00:57:44 before 1 October 1891\n * and GMT+01:00:00 after that date)\n *\n * Date#getTimezoneOffset returns the offset in minutes and would return 57 for the example above,\n * which would lead to incorrect calculations.\n *\n * This function returns the timezone offset in milliseconds that takes seconds in account.\n */\nexport function getTimezoneOffsetInMilliseconds(date) {\n const _date = toDate(date);\n const utcDate = new Date(\n Date.UTC(\n _date.getFullYear(),\n _date.getMonth(),\n _date.getDate(),\n _date.getHours(),\n _date.getMinutes(),\n _date.getSeconds(),\n _date.getMilliseconds(),\n ),\n );\n utcDate.setUTCFullYear(_date.getFullYear());\n return +date - +utcDate;\n}\n","import { constructFrom } from \"../constructFrom.js\";\n\nexport function normalizeDates(context, ...dates) {\n const normalize = constructFrom.bind(\n null,\n context || dates.find((date) => typeof date === \"object\"),\n );\n return dates.map(normalize);\n}\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link startOfDay} function options.\n */\n\n/**\n * @name startOfDay\n * @category Day Helpers\n * @summary Return the start of a day for the given date.\n *\n * @description\n * Return the start of a day for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - The options\n *\n * @returns The start of a day\n *\n * @example\n * // The start of a day for 2 September 2014 11:55:00:\n * const result = startOfDay(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Tue Sep 02 2014 00:00:00\n */\nexport function startOfDay(date, options) {\n const _date = toDate(date, options?.in);\n _date.setHours(0, 0, 0, 0);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfDay;\n","import { getTimezoneOffsetInMilliseconds } from \"./_lib/getTimezoneOffsetInMilliseconds.js\";\nimport { normalizeDates } from \"./_lib/normalizeDates.js\";\nimport { millisecondsInDay } from \"./constants.js\";\nimport { startOfDay } from \"./startOfDay.js\";\n\n/**\n * The {@link differenceInCalendarDays} function options.\n */\n\n/**\n * @name differenceInCalendarDays\n * @category Day Helpers\n * @summary Get the number of calendar days between the given dates.\n *\n * @description\n * Get the number of calendar days between the given dates. This means that the times are removed\n * from the dates and then the difference in days is calculated.\n *\n * @param laterDate - The later date\n * @param earlierDate - The earlier date\n * @param options - The options object\n *\n * @returns The number of calendar days\n *\n * @example\n * // How many calendar days are between\n * // 2 July 2011 23:00:00 and 2 July 2012 00:00:00?\n * const result = differenceInCalendarDays(\n * new Date(2012, 6, 2, 0, 0),\n * new Date(2011, 6, 2, 23, 0)\n * )\n * //=> 366\n * // How many calendar days are between\n * // 2 July 2011 23:59:00 and 3 July 2011 00:01:00?\n * const result = differenceInCalendarDays(\n * new Date(2011, 6, 3, 0, 1),\n * new Date(2011, 6, 2, 23, 59)\n * )\n * //=> 1\n */\nexport function differenceInCalendarDays(laterDate, earlierDate, options) {\n const [laterDate_, earlierDate_] = normalizeDates(\n options?.in,\n laterDate,\n earlierDate,\n );\n\n const laterStartOfDay = startOfDay(laterDate_);\n const earlierStartOfDay = startOfDay(earlierDate_);\n\n const laterTimestamp =\n +laterStartOfDay - getTimezoneOffsetInMilliseconds(laterStartOfDay);\n const earlierTimestamp =\n +earlierStartOfDay - getTimezoneOffsetInMilliseconds(earlierStartOfDay);\n\n // Round the number of days to the nearest integer because the number of\n // milliseconds in a day is not constant (e.g. it's different in the week of\n // the daylight saving time clock shift).\n return Math.round((laterTimestamp - earlierTimestamp) / millisecondsInDay);\n}\n\n// Fallback for modularized imports:\nexport default differenceInCalendarDays;\n","import { constructFrom } from \"./constructFrom.js\";\nimport { getISOWeekYear } from \"./getISOWeekYear.js\";\nimport { startOfISOWeek } from \"./startOfISOWeek.js\";\n\n/**\n * The {@link startOfISOWeekYear} function options.\n */\n\n/**\n * @name startOfISOWeekYear\n * @category ISO Week-Numbering Year Helpers\n * @summary Return the start of an ISO week-numbering year for the given date.\n *\n * @description\n * Return the start of an ISO week-numbering year,\n * which always starts 3 days before the year's first Thursday.\n * The result will be in the local timezone.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The start of an ISO week-numbering year\n *\n * @example\n * // The start of an ISO week-numbering year for 2 July 2005:\n * const result = startOfISOWeekYear(new Date(2005, 6, 2))\n * //=> Mon Jan 03 2005 00:00:00\n */\nexport function startOfISOWeekYear(date, options) {\n const year = getISOWeekYear(date, options);\n const fourthOfJanuary = constructFrom(options?.in || date, 0);\n fourthOfJanuary.setFullYear(year, 0, 4);\n fourthOfJanuary.setHours(0, 0, 0, 0);\n return startOfISOWeek(fourthOfJanuary);\n}\n\n// Fallback for modularized imports:\nexport default startOfISOWeekYear;\n","/**\n * @name isDate\n * @category Common Helpers\n * @summary Is the given value a date?\n *\n * @description\n * Returns true if the given value is an instance of Date. The function works for dates transferred across iframes.\n *\n * @param value - The value to check\n *\n * @returns True if the given value is a date\n *\n * @example\n * // For a valid date:\n * const result = isDate(new Date())\n * //=> true\n *\n * @example\n * // For an invalid date:\n * const result = isDate(new Date(NaN))\n * //=> true\n *\n * @example\n * // For some value:\n * const result = isDate('2014-02-31')\n * //=> false\n *\n * @example\n * // For an object:\n * const result = isDate({})\n * //=> false\n */\nexport function isDate(value) {\n return (\n value instanceof Date ||\n (typeof value === \"object\" &&\n Object.prototype.toString.call(value) === \"[object Date]\")\n );\n}\n\n// Fallback for modularized imports:\nexport default isDate;\n","import { isDate } from \"./isDate.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * @name isValid\n * @category Common Helpers\n * @summary Is the given date valid?\n *\n * @description\n * Returns false if argument is Invalid Date and true otherwise.\n * Argument is converted to Date using `toDate`. See [toDate](https://date-fns.org/docs/toDate)\n * Invalid Date is a Date, whose time value is NaN.\n *\n * Time value of Date: http://es5.github.io/#x15.9.1.1\n *\n * @param date - The date to check\n *\n * @returns The date is valid\n *\n * @example\n * // For the valid date:\n * const result = isValid(new Date(2014, 1, 31))\n * //=> true\n *\n * @example\n * // For the value, convertible into a date:\n * const result = isValid(1393804800000)\n * //=> true\n *\n * @example\n * // For the invalid date:\n * const result = isValid(new Date(''))\n * //=> false\n */\nexport function isValid(date) {\n return !((!isDate(date) && typeof date !== \"number\") || isNaN(+toDate(date)));\n}\n\n// Fallback for modularized imports:\nexport default isValid;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link startOfYear} function options.\n */\n\n/**\n * @name startOfYear\n * @category Year Helpers\n * @summary Return the start of a year for the given date.\n *\n * @description\n * Return the start of a year for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - The options\n *\n * @returns The start of a year\n *\n * @example\n * // The start of a year for 2 September 2014 11:55:00:\n * const result = startOfYear(new Date(2014, 8, 2, 11, 55, 00))\n * //=> Wed Jan 01 2014 00:00:00\n */\nexport function startOfYear(date, options) {\n const date_ = toDate(date, options?.in);\n date_.setFullYear(date_.getFullYear(), 0, 1);\n date_.setHours(0, 0, 0, 0);\n return date_;\n}\n\n// Fallback for modularized imports:\nexport default startOfYear;\n","const formatDistanceLocale = {\n lessThanXSeconds: {\n one: \"less than a second\",\n other: \"less than {{count}} seconds\",\n },\n\n xSeconds: {\n one: \"1 second\",\n other: \"{{count}} seconds\",\n },\n\n halfAMinute: \"half a minute\",\n\n lessThanXMinutes: {\n one: \"less than a minute\",\n other: \"less than {{count}} minutes\",\n },\n\n xMinutes: {\n one: \"1 minute\",\n other: \"{{count}} minutes\",\n },\n\n aboutXHours: {\n one: \"about 1 hour\",\n other: \"about {{count}} hours\",\n },\n\n xHours: {\n one: \"1 hour\",\n other: \"{{count}} hours\",\n },\n\n xDays: {\n one: \"1 day\",\n other: \"{{count}} days\",\n },\n\n aboutXWeeks: {\n one: \"about 1 week\",\n other: \"about {{count}} weeks\",\n },\n\n xWeeks: {\n one: \"1 week\",\n other: \"{{count}} weeks\",\n },\n\n aboutXMonths: {\n one: \"about 1 month\",\n other: \"about {{count}} months\",\n },\n\n xMonths: {\n one: \"1 month\",\n other: \"{{count}} months\",\n },\n\n aboutXYears: {\n one: \"about 1 year\",\n other: \"about {{count}} years\",\n },\n\n xYears: {\n one: \"1 year\",\n other: \"{{count}} years\",\n },\n\n overXYears: {\n one: \"over 1 year\",\n other: \"over {{count}} years\",\n },\n\n almostXYears: {\n one: \"almost 1 year\",\n other: \"almost {{count}} years\",\n },\n};\n\nexport const formatDistance = (token, count, options) => {\n let result;\n\n const tokenValue = formatDistanceLocale[token];\n if (typeof tokenValue === \"string\") {\n result = tokenValue;\n } else if (count === 1) {\n result = tokenValue.one;\n } else {\n result = tokenValue.other.replace(\"{{count}}\", count.toString());\n }\n\n if (options?.addSuffix) {\n if (options.comparison && options.comparison > 0) {\n return \"in \" + result;\n } else {\n return result + \" ago\";\n }\n }\n\n return result;\n};\n","export function buildFormatLongFn(args) {\n return (options = {}) => {\n // TODO: Remove String()\n const width = options.width ? String(options.width) : args.defaultWidth;\n const format = args.formats[width] || args.formats[args.defaultWidth];\n return format;\n };\n}\n","import { buildFormatLongFn } from \"../../_lib/buildFormatLongFn.js\";\n\nconst dateFormats = {\n full: \"EEEE, MMMM do, y\",\n long: \"MMMM do, y\",\n medium: \"MMM d, y\",\n short: \"MM/dd/yyyy\",\n};\n\nconst timeFormats = {\n full: \"h:mm:ss a zzzz\",\n long: \"h:mm:ss a z\",\n medium: \"h:mm:ss a\",\n short: \"h:mm a\",\n};\n\nconst dateTimeFormats = {\n full: \"{{date}} 'at' {{time}}\",\n long: \"{{date}} 'at' {{time}}\",\n medium: \"{{date}}, {{time}}\",\n short: \"{{date}}, {{time}}\",\n};\n\nexport const formatLong = {\n date: buildFormatLongFn({\n formats: dateFormats,\n defaultWidth: \"full\",\n }),\n\n time: buildFormatLongFn({\n formats: timeFormats,\n defaultWidth: \"full\",\n }),\n\n dateTime: buildFormatLongFn({\n formats: dateTimeFormats,\n defaultWidth: \"full\",\n }),\n};\n","const formatRelativeLocale = {\n lastWeek: \"'last' eeee 'at' p\",\n yesterday: \"'yesterday at' p\",\n today: \"'today at' p\",\n tomorrow: \"'tomorrow at' p\",\n nextWeek: \"eeee 'at' p\",\n other: \"P\",\n};\n\nexport const formatRelative = (token, _date, _baseDate, _options) =>\n formatRelativeLocale[token];\n","/**\n * The localize function argument callback which allows to convert raw value to\n * the actual type.\n *\n * @param value - The value to convert\n *\n * @returns The converted value\n */\n\n/**\n * The map of localized values for each width.\n */\n\n/**\n * The index type of the locale unit value. It types conversion of units of\n * values that don't start at 0 (i.e. quarters).\n */\n\n/**\n * Converts the unit value to the tuple of values.\n */\n\n/**\n * The tuple of localized era values. The first element represents BC,\n * the second element represents AD.\n */\n\n/**\n * The tuple of localized quarter values. The first element represents Q1.\n */\n\n/**\n * The tuple of localized day values. The first element represents Sunday.\n */\n\n/**\n * The tuple of localized month values. The first element represents January.\n */\n\nexport function buildLocalizeFn(args) {\n return (value, options) => {\n const context = options?.context ? String(options.context) : \"standalone\";\n\n let valuesArray;\n if (context === \"formatting\" && args.formattingValues) {\n const defaultWidth = args.defaultFormattingWidth || args.defaultWidth;\n const width = options?.width ? String(options.width) : defaultWidth;\n\n valuesArray =\n args.formattingValues[width] || args.formattingValues[defaultWidth];\n } else {\n const defaultWidth = args.defaultWidth;\n const width = options?.width ? String(options.width) : args.defaultWidth;\n\n valuesArray = args.values[width] || args.values[defaultWidth];\n }\n const index = args.argumentCallback ? args.argumentCallback(value) : value;\n\n // @ts-expect-error - For some reason TypeScript just don't want to match it, no matter how hard we try. I challenge you to try to remove it!\n return valuesArray[index];\n };\n}\n","import { buildLocalizeFn } from \"../../_lib/buildLocalizeFn.js\";\n\nconst eraValues = {\n narrow: [\"B\", \"A\"],\n abbreviated: [\"BC\", \"AD\"],\n wide: [\"Before Christ\", \"Anno Domini\"],\n};\n\nconst quarterValues = {\n narrow: [\"1\", \"2\", \"3\", \"4\"],\n abbreviated: [\"Q1\", \"Q2\", \"Q3\", \"Q4\"],\n wide: [\"1st quarter\", \"2nd quarter\", \"3rd quarter\", \"4th quarter\"],\n};\n\n// Note: in English, the names of days of the week and months are capitalized.\n// If you are making a new locale based on this one, check if the same is true for the language you're working on.\n// Generally, formatted dates should look like they are in the middle of a sentence,\n// e.g. in Spanish language the weekdays and months should be in the lowercase.\nconst monthValues = {\n narrow: [\"J\", \"F\", \"M\", \"A\", \"M\", \"J\", \"J\", \"A\", \"S\", \"O\", \"N\", \"D\"],\n abbreviated: [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\",\n ],\n\n wide: [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n ],\n};\n\nconst dayValues = {\n narrow: [\"S\", \"M\", \"T\", \"W\", \"T\", \"F\", \"S\"],\n short: [\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"],\n abbreviated: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n wide: [\n \"Sunday\",\n \"Monday\",\n \"Tuesday\",\n \"Wednesday\",\n \"Thursday\",\n \"Friday\",\n \"Saturday\",\n ],\n};\n\nconst dayPeriodValues = {\n narrow: {\n am: \"a\",\n pm: \"p\",\n midnight: \"mi\",\n noon: \"n\",\n morning: \"morning\",\n afternoon: \"afternoon\",\n evening: \"evening\",\n night: \"night\",\n },\n abbreviated: {\n am: \"AM\",\n pm: \"PM\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"morning\",\n afternoon: \"afternoon\",\n evening: \"evening\",\n night: \"night\",\n },\n wide: {\n am: \"a.m.\",\n pm: \"p.m.\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"morning\",\n afternoon: \"afternoon\",\n evening: \"evening\",\n night: \"night\",\n },\n};\n\nconst formattingDayPeriodValues = {\n narrow: {\n am: \"a\",\n pm: \"p\",\n midnight: \"mi\",\n noon: \"n\",\n morning: \"in the morning\",\n afternoon: \"in the afternoon\",\n evening: \"in the evening\",\n night: \"at night\",\n },\n abbreviated: {\n am: \"AM\",\n pm: \"PM\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"in the morning\",\n afternoon: \"in the afternoon\",\n evening: \"in the evening\",\n night: \"at night\",\n },\n wide: {\n am: \"a.m.\",\n pm: \"p.m.\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"in the morning\",\n afternoon: \"in the afternoon\",\n evening: \"in the evening\",\n night: \"at night\",\n },\n};\n\nconst ordinalNumber = (dirtyNumber, _options) => {\n const number = Number(dirtyNumber);\n\n // If ordinal numbers depend on context, for example,\n // if they are different for different grammatical genders,\n // use `options.unit`.\n //\n // `unit` can be 'year', 'quarter', 'month', 'week', 'date', 'dayOfYear',\n // 'day', 'hour', 'minute', 'second'.\n\n const rem100 = number % 100;\n if (rem100 > 20 || rem100 < 10) {\n switch (rem100 % 10) {\n case 1:\n return number + \"st\";\n case 2:\n return number + \"nd\";\n case 3:\n return number + \"rd\";\n }\n }\n return number + \"th\";\n};\n\nexport const localize = {\n ordinalNumber,\n\n era: buildLocalizeFn({\n values: eraValues,\n defaultWidth: \"wide\",\n }),\n\n quarter: buildLocalizeFn({\n values: quarterValues,\n defaultWidth: \"wide\",\n argumentCallback: (quarter) => quarter - 1,\n }),\n\n month: buildLocalizeFn({\n values: monthValues,\n defaultWidth: \"wide\",\n }),\n\n day: buildLocalizeFn({\n values: dayValues,\n defaultWidth: \"wide\",\n }),\n\n dayPeriod: buildLocalizeFn({\n values: dayPeriodValues,\n defaultWidth: \"wide\",\n formattingValues: formattingDayPeriodValues,\n defaultFormattingWidth: \"wide\",\n }),\n};\n","export function buildMatchFn(args) {\n return (string, options = {}) => {\n const width = options.width;\n\n const matchPattern =\n (width && args.matchPatterns[width]) ||\n args.matchPatterns[args.defaultMatchWidth];\n const matchResult = string.match(matchPattern);\n\n if (!matchResult) {\n return null;\n }\n const matchedString = matchResult[0];\n\n const parsePatterns =\n (width && args.parsePatterns[width]) ||\n args.parsePatterns[args.defaultParseWidth];\n\n const key = Array.isArray(parsePatterns)\n ? findIndex(parsePatterns, (pattern) => pattern.test(matchedString))\n : // [TODO] -- I challenge you to fix the type\n findKey(parsePatterns, (pattern) => pattern.test(matchedString));\n\n let value;\n\n value = args.valueCallback ? args.valueCallback(key) : key;\n value = options.valueCallback\n ? // [TODO] -- I challenge you to fix the type\n options.valueCallback(value)\n : value;\n\n const rest = string.slice(matchedString.length);\n\n return { value, rest };\n };\n}\n\nfunction findKey(object, predicate) {\n for (const key in object) {\n if (\n Object.prototype.hasOwnProperty.call(object, key) &&\n predicate(object[key])\n ) {\n return key;\n }\n }\n return undefined;\n}\n\nfunction findIndex(array, predicate) {\n for (let key = 0; key < array.length; key++) {\n if (predicate(array[key])) {\n return key;\n }\n }\n return undefined;\n}\n","export function buildMatchPatternFn(args) {\n return (string, options = {}) => {\n const matchResult = string.match(args.matchPattern);\n if (!matchResult) return null;\n const matchedString = matchResult[0];\n\n const parseResult = string.match(args.parsePattern);\n if (!parseResult) return null;\n let value = args.valueCallback\n ? args.valueCallback(parseResult[0])\n : parseResult[0];\n\n // [TODO] I challenge you to fix the type\n value = options.valueCallback ? options.valueCallback(value) : value;\n\n const rest = string.slice(matchedString.length);\n\n return { value, rest };\n };\n}\n","import { buildMatchFn } from \"../../_lib/buildMatchFn.js\";\nimport { buildMatchPatternFn } from \"../../_lib/buildMatchPatternFn.js\";\n\nconst matchOrdinalNumberPattern = /^(\\d+)(th|st|nd|rd)?/i;\nconst parseOrdinalNumberPattern = /\\d+/i;\n\nconst matchEraPatterns = {\n narrow: /^(b|a)/i,\n abbreviated: /^(b\\.?\\s?c\\.?|b\\.?\\s?c\\.?\\s?e\\.?|a\\.?\\s?d\\.?|c\\.?\\s?e\\.?)/i,\n wide: /^(before christ|before common era|anno domini|common era)/i,\n};\nconst parseEraPatterns = {\n any: [/^b/i, /^(a|c)/i],\n};\n\nconst matchQuarterPatterns = {\n narrow: /^[1234]/i,\n abbreviated: /^q[1234]/i,\n wide: /^[1234](th|st|nd|rd)? quarter/i,\n};\nconst parseQuarterPatterns = {\n any: [/1/i, /2/i, /3/i, /4/i],\n};\n\nconst matchMonthPatterns = {\n narrow: /^[jfmasond]/i,\n abbreviated: /^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,\n wide: /^(january|february|march|april|may|june|july|august|september|october|november|december)/i,\n};\nconst parseMonthPatterns = {\n narrow: [\n /^j/i,\n /^f/i,\n /^m/i,\n /^a/i,\n /^m/i,\n /^j/i,\n /^j/i,\n /^a/i,\n /^s/i,\n /^o/i,\n /^n/i,\n /^d/i,\n ],\n\n any: [\n /^ja/i,\n /^f/i,\n /^mar/i,\n /^ap/i,\n /^may/i,\n /^jun/i,\n /^jul/i,\n /^au/i,\n /^s/i,\n /^o/i,\n /^n/i,\n /^d/i,\n ],\n};\n\nconst matchDayPatterns = {\n narrow: /^[smtwf]/i,\n short: /^(su|mo|tu|we|th|fr|sa)/i,\n abbreviated: /^(sun|mon|tue|wed|thu|fri|sat)/i,\n wide: /^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i,\n};\nconst parseDayPatterns = {\n narrow: [/^s/i, /^m/i, /^t/i, /^w/i, /^t/i, /^f/i, /^s/i],\n any: [/^su/i, /^m/i, /^tu/i, /^w/i, /^th/i, /^f/i, /^sa/i],\n};\n\nconst matchDayPeriodPatterns = {\n narrow: /^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,\n any: /^([ap]\\.?\\s?m\\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i,\n};\nconst parseDayPeriodPatterns = {\n any: {\n am: /^a/i,\n pm: /^p/i,\n midnight: /^mi/i,\n noon: /^no/i,\n morning: /morning/i,\n afternoon: /afternoon/i,\n evening: /evening/i,\n night: /night/i,\n },\n};\n\nexport const match = {\n ordinalNumber: buildMatchPatternFn({\n matchPattern: matchOrdinalNumberPattern,\n parsePattern: parseOrdinalNumberPattern,\n valueCallback: (value) => parseInt(value, 10),\n }),\n\n era: buildMatchFn({\n matchPatterns: matchEraPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseEraPatterns,\n defaultParseWidth: \"any\",\n }),\n\n quarter: buildMatchFn({\n matchPatterns: matchQuarterPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseQuarterPatterns,\n defaultParseWidth: \"any\",\n valueCallback: (index) => index + 1,\n }),\n\n month: buildMatchFn({\n matchPatterns: matchMonthPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseMonthPatterns,\n defaultParseWidth: \"any\",\n }),\n\n day: buildMatchFn({\n matchPatterns: matchDayPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseDayPatterns,\n defaultParseWidth: \"any\",\n }),\n\n dayPeriod: buildMatchFn({\n matchPatterns: matchDayPeriodPatterns,\n defaultMatchWidth: \"any\",\n parsePatterns: parseDayPeriodPatterns,\n defaultParseWidth: \"any\",\n }),\n};\n","import { formatDistance } from \"./en-US/_lib/formatDistance.js\";\nimport { formatLong } from \"./en-US/_lib/formatLong.js\";\nimport { formatRelative } from \"./en-US/_lib/formatRelative.js\";\nimport { localize } from \"./en-US/_lib/localize.js\";\nimport { match } from \"./en-US/_lib/match.js\";\n\n/**\n * @category Locales\n * @summary English locale (United States).\n * @language English\n * @iso-639-2 eng\n * @author Sasha Koss [@kossnocorp](https://github.com/kossnocorp)\n * @author Lesha Koss [@leshakoss](https://github.com/leshakoss)\n */\nexport const enUS = {\n code: \"en-US\",\n formatDistance: formatDistance,\n formatLong: formatLong,\n formatRelative: formatRelative,\n localize: localize,\n match: match,\n options: {\n weekStartsOn: 0 /* Sunday */,\n firstWeekContainsDate: 1,\n },\n};\n\n// Fallback for modularized imports:\nexport default enUS;\n","import { differenceInCalendarDays } from \"./differenceInCalendarDays.js\";\nimport { startOfYear } from \"./startOfYear.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getDayOfYear} function options.\n */\n\n/**\n * @name getDayOfYear\n * @category Day Helpers\n * @summary Get the day of the year of the given date.\n *\n * @description\n * Get the day of the year of the given date.\n *\n * @param date - The given date\n * @param options - The options\n *\n * @returns The day of year\n *\n * @example\n * // Which day of the year is 2 July 2014?\n * const result = getDayOfYear(new Date(2014, 6, 2))\n * //=> 183\n */\nexport function getDayOfYear(date, options) {\n const _date = toDate(date, options?.in);\n const diff = differenceInCalendarDays(_date, startOfYear(_date));\n const dayOfYear = diff + 1;\n return dayOfYear;\n}\n\n// Fallback for modularized imports:\nexport default getDayOfYear;\n","import { millisecondsInWeek } from \"./constants.js\";\nimport { startOfISOWeek } from \"./startOfISOWeek.js\";\nimport { startOfISOWeekYear } from \"./startOfISOWeekYear.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getISOWeek} function options.\n */\n\n/**\n * @name getISOWeek\n * @category ISO Week Helpers\n * @summary Get the ISO week of the given date.\n *\n * @description\n * Get the ISO week of the given date.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @param date - The given date\n * @param options - The options\n *\n * @returns The ISO week\n *\n * @example\n * // Which week of the ISO-week numbering year is 2 January 2005?\n * const result = getISOWeek(new Date(2005, 0, 2))\n * //=> 53\n */\nexport function getISOWeek(date, options) {\n const _date = toDate(date, options?.in);\n const diff = +startOfISOWeek(_date) - +startOfISOWeekYear(_date);\n\n // Round the number of weeks to the nearest integer because the number of\n // milliseconds in a week is not constant (e.g. it's different in the week of\n // the daylight saving time clock shift).\n return Math.round(diff / millisecondsInWeek) + 1;\n}\n\n// Fallback for modularized imports:\nexport default getISOWeek;\n","import { getDefaultOptions } from \"./_lib/defaultOptions.js\";\nimport { constructFrom } from \"./constructFrom.js\";\nimport { startOfWeek } from \"./startOfWeek.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getWeekYear} function options.\n */\n\n/**\n * @name getWeekYear\n * @category Week-Numbering Year Helpers\n * @summary Get the local week-numbering year of the given date.\n *\n * @description\n * Get the local week-numbering year of the given date.\n * The exact calculation depends on the values of\n * `options.weekStartsOn` (which is the index of the first day of the week)\n * and `options.firstWeekContainsDate` (which is the day of January, which is always in\n * the first week of the week-numbering year)\n *\n * Week numbering: https://en.wikipedia.org/wiki/Week#The_ISO_week_date_system\n *\n * @param date - The given date\n * @param options - An object with options.\n *\n * @returns The local week-numbering year\n *\n * @example\n * // Which week numbering year is 26 December 2004 with the default settings?\n * const result = getWeekYear(new Date(2004, 11, 26))\n * //=> 2005\n *\n * @example\n * // Which week numbering year is 26 December 2004 if week starts on Saturday?\n * const result = getWeekYear(new Date(2004, 11, 26), { weekStartsOn: 6 })\n * //=> 2004\n *\n * @example\n * // Which week numbering year is 26 December 2004 if the first week contains 4 January?\n * const result = getWeekYear(new Date(2004, 11, 26), { firstWeekContainsDate: 4 })\n * //=> 2004\n */\nexport function getWeekYear(date, options) {\n const _date = toDate(date, options?.in);\n const year = _date.getFullYear();\n\n const defaultOptions = getDefaultOptions();\n const firstWeekContainsDate =\n options?.firstWeekContainsDate ??\n options?.locale?.options?.firstWeekContainsDate ??\n defaultOptions.firstWeekContainsDate ??\n defaultOptions.locale?.options?.firstWeekContainsDate ??\n 1;\n\n const firstWeekOfNextYear = constructFrom(options?.in || date, 0);\n firstWeekOfNextYear.setFullYear(year + 1, 0, firstWeekContainsDate);\n firstWeekOfNextYear.setHours(0, 0, 0, 0);\n const startOfNextYear = startOfWeek(firstWeekOfNextYear, options);\n\n const firstWeekOfThisYear = constructFrom(options?.in || date, 0);\n firstWeekOfThisYear.setFullYear(year, 0, firstWeekContainsDate);\n firstWeekOfThisYear.setHours(0, 0, 0, 0);\n const startOfThisYear = startOfWeek(firstWeekOfThisYear, options);\n\n if (+_date >= +startOfNextYear) {\n return year + 1;\n } else if (+_date >= +startOfThisYear) {\n return year;\n } else {\n return year - 1;\n }\n}\n\n// Fallback for modularized imports:\nexport default getWeekYear;\n","import { getDefaultOptions } from \"./_lib/defaultOptions.js\";\nimport { constructFrom } from \"./constructFrom.js\";\nimport { getWeekYear } from \"./getWeekYear.js\";\nimport { startOfWeek } from \"./startOfWeek.js\";\n\n/**\n * The {@link startOfWeekYear} function options.\n */\n\n/**\n * @name startOfWeekYear\n * @category Week-Numbering Year Helpers\n * @summary Return the start of a local week-numbering year for the given date.\n *\n * @description\n * Return the start of a local week-numbering year.\n * The exact calculation depends on the values of\n * `options.weekStartsOn` (which is the index of the first day of the week)\n * and `options.firstWeekContainsDate` (which is the day of January, which is always in\n * the first week of the week-numbering year)\n *\n * Week numbering: https://en.wikipedia.org/wiki/Week#The_ISO_week_date_system\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The start of a week-numbering year\n *\n * @example\n * // The start of an a week-numbering year for 2 July 2005 with default settings:\n * const result = startOfWeekYear(new Date(2005, 6, 2))\n * //=> Sun Dec 26 2004 00:00:00\n *\n * @example\n * // The start of a week-numbering year for 2 July 2005\n * // if Monday is the first day of week\n * // and 4 January is always in the first week of the year:\n * const result = startOfWeekYear(new Date(2005, 6, 2), {\n * weekStartsOn: 1,\n * firstWeekContainsDate: 4\n * })\n * //=> Mon Jan 03 2005 00:00:00\n */\nexport function startOfWeekYear(date, options) {\n const defaultOptions = getDefaultOptions();\n const firstWeekContainsDate =\n options?.firstWeekContainsDate ??\n options?.locale?.options?.firstWeekContainsDate ??\n defaultOptions.firstWeekContainsDate ??\n defaultOptions.locale?.options?.firstWeekContainsDate ??\n 1;\n\n const year = getWeekYear(date, options);\n const firstWeek = constructFrom(options?.in || date, 0);\n firstWeek.setFullYear(year, 0, firstWeekContainsDate);\n firstWeek.setHours(0, 0, 0, 0);\n const _date = startOfWeek(firstWeek, options);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfWeekYear;\n","import { millisecondsInWeek } from \"./constants.js\";\nimport { startOfWeek } from \"./startOfWeek.js\";\nimport { startOfWeekYear } from \"./startOfWeekYear.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getWeek} function options.\n */\n\n/**\n * @name getWeek\n * @category Week Helpers\n * @summary Get the local week index of the given date.\n *\n * @description\n * Get the local week index of the given date.\n * The exact calculation depends on the values of\n * `options.weekStartsOn` (which is the index of the first day of the week)\n * and `options.firstWeekContainsDate` (which is the day of January, which is always in\n * the first week of the week-numbering year)\n *\n * Week numbering: https://en.wikipedia.org/wiki/Week#The_ISO_week_date_system\n *\n * @param date - The given date\n * @param options - An object with options\n *\n * @returns The week\n *\n * @example\n * // Which week of the local week numbering year is 2 January 2005 with default options?\n * const result = getWeek(new Date(2005, 0, 2))\n * //=> 2\n *\n * @example\n * // Which week of the local week numbering year is 2 January 2005,\n * // if Monday is the first day of the week,\n * // and the first week of the year always contains 4 January?\n * const result = getWeek(new Date(2005, 0, 2), {\n * weekStartsOn: 1,\n * firstWeekContainsDate: 4\n * })\n * //=> 53\n */\nexport function getWeek(date, options) {\n const _date = toDate(date, options?.in);\n const diff = +startOfWeek(_date, options) - +startOfWeekYear(_date, options);\n\n // Round the number of weeks to the nearest integer because the number of\n // milliseconds in a week is not constant (e.g. it's different in the week of\n // the daylight saving time clock shift).\n return Math.round(diff / millisecondsInWeek) + 1;\n}\n\n// Fallback for modularized imports:\nexport default getWeek;\n","export function addLeadingZeros(number, targetLength) {\n const sign = number < 0 ? \"-\" : \"\";\n const output = Math.abs(number).toString().padStart(targetLength, \"0\");\n return sign + output;\n}\n","import { addLeadingZeros } from \"../addLeadingZeros.js\";\n\n/*\n * | | Unit | | Unit |\n * |-----|--------------------------------|-----|--------------------------------|\n * | a | AM, PM | A* | |\n * | d | Day of month | D | |\n * | h | Hour [1-12] | H | Hour [0-23] |\n * | m | Minute | M | Month |\n * | s | Second | S | Fraction of second |\n * | y | Year (abs) | Y | |\n *\n * Letters marked by * are not implemented but reserved by Unicode standard.\n */\n\nexport const lightFormatters = {\n // Year\n y(date, token) {\n // From http://www.unicode.org/reports/tr35/tr35-31/tr35-dates.html#Date_Format_tokens\n // | Year | y | yy | yyy | yyyy | yyyyy |\n // |----------|-------|----|-------|-------|-------|\n // | AD 1 | 1 | 01 | 001 | 0001 | 00001 |\n // | AD 12 | 12 | 12 | 012 | 0012 | 00012 |\n // | AD 123 | 123 | 23 | 123 | 0123 | 00123 |\n // | AD 1234 | 1234 | 34 | 1234 | 1234 | 01234 |\n // | AD 12345 | 12345 | 45 | 12345 | 12345 | 12345 |\n\n const signedYear = date.getFullYear();\n // Returns 1 for 1 BC (which is year 0 in JavaScript)\n const year = signedYear > 0 ? signedYear : 1 - signedYear;\n return addLeadingZeros(token === \"yy\" ? year % 100 : year, token.length);\n },\n\n // Month\n M(date, token) {\n const month = date.getMonth();\n return token === \"M\" ? String(month + 1) : addLeadingZeros(month + 1, 2);\n },\n\n // Day of the month\n d(date, token) {\n return addLeadingZeros(date.getDate(), token.length);\n },\n\n // AM or PM\n a(date, token) {\n const dayPeriodEnumValue = date.getHours() / 12 >= 1 ? \"pm\" : \"am\";\n\n switch (token) {\n case \"a\":\n case \"aa\":\n return dayPeriodEnumValue.toUpperCase();\n case \"aaa\":\n return dayPeriodEnumValue;\n case \"aaaaa\":\n return dayPeriodEnumValue[0];\n case \"aaaa\":\n default:\n return dayPeriodEnumValue === \"am\" ? \"a.m.\" : \"p.m.\";\n }\n },\n\n // Hour [1-12]\n h(date, token) {\n return addLeadingZeros(date.getHours() % 12 || 12, token.length);\n },\n\n // Hour [0-23]\n H(date, token) {\n return addLeadingZeros(date.getHours(), token.length);\n },\n\n // Minute\n m(date, token) {\n return addLeadingZeros(date.getMinutes(), token.length);\n },\n\n // Second\n s(date, token) {\n return addLeadingZeros(date.getSeconds(), token.length);\n },\n\n // Fraction of second\n S(date, token) {\n const numberOfDigits = token.length;\n const milliseconds = date.getMilliseconds();\n const fractionalSeconds = Math.trunc(\n milliseconds * Math.pow(10, numberOfDigits - 3),\n );\n return addLeadingZeros(fractionalSeconds, token.length);\n },\n};\n","import { getDayOfYear } from \"../../getDayOfYear.js\";\nimport { getISOWeek } from \"../../getISOWeek.js\";\nimport { getISOWeekYear } from \"../../getISOWeekYear.js\";\nimport { getWeek } from \"../../getWeek.js\";\nimport { getWeekYear } from \"../../getWeekYear.js\";\n\nimport { addLeadingZeros } from \"../addLeadingZeros.js\";\nimport { lightFormatters } from \"./lightFormatters.js\";\n\nconst dayPeriodEnum = {\n am: \"am\",\n pm: \"pm\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"morning\",\n afternoon: \"afternoon\",\n evening: \"evening\",\n night: \"night\",\n};\n\n/*\n * | | Unit | | Unit |\n * |-----|--------------------------------|-----|--------------------------------|\n * | a | AM, PM | A* | Milliseconds in day |\n * | b | AM, PM, noon, midnight | B | Flexible day period |\n * | c | Stand-alone local day of week | C* | Localized hour w/ day period |\n * | d | Day of month | D | Day of year |\n * | e | Local day of week | E | Day of week |\n * | f | | F* | Day of week in month |\n * | g* | Modified Julian day | G | Era |\n * | h | Hour [1-12] | H | Hour [0-23] |\n * | i! | ISO day of week | I! | ISO week of year |\n * | j* | Localized hour w/ day period | J* | Localized hour w/o day period |\n * | k | Hour [1-24] | K | Hour [0-11] |\n * | l* | (deprecated) | L | Stand-alone month |\n * | m | Minute | M | Month |\n * | n | | N | |\n * | o! | Ordinal number modifier | O | Timezone (GMT) |\n * | p! | Long localized time | P! | Long localized date |\n * | q | Stand-alone quarter | Q | Quarter |\n * | r* | Related Gregorian year | R! | ISO week-numbering year |\n * | s | Second | S | Fraction of second |\n * | t! | Seconds timestamp | T! | Milliseconds timestamp |\n * | u | Extended year | U* | Cyclic year |\n * | v* | Timezone (generic non-locat.) | V* | Timezone (location) |\n * | w | Local week of year | W* | Week of month |\n * | x | Timezone (ISO-8601 w/o Z) | X | Timezone (ISO-8601) |\n * | y | Year (abs) | Y | Local week-numbering year |\n * | z | Timezone (specific non-locat.) | Z* | Timezone (aliases) |\n *\n * Letters marked by * are not implemented but reserved by Unicode standard.\n *\n * Letters marked by ! are non-standard, but implemented by date-fns:\n * - `o` modifies the previous token to turn it into an ordinal (see `format` docs)\n * - `i` is ISO day of week. For `i` and `ii` is returns numeric ISO week days,\n * i.e. 7 for Sunday, 1 for Monday, etc.\n * - `I` is ISO week of year, as opposed to `w` which is local week of year.\n * - `R` is ISO week-numbering year, as opposed to `Y` which is local week-numbering year.\n * `R` is supposed to be used in conjunction with `I` and `i`\n * for universal ISO week-numbering date, whereas\n * `Y` is supposed to be used in conjunction with `w` and `e`\n * for week-numbering date specific to the locale.\n * - `P` is long localized date format\n * - `p` is long localized time format\n */\n\nexport const formatters = {\n // Era\n G: function (date, token, localize) {\n const era = date.getFullYear() > 0 ? 1 : 0;\n switch (token) {\n // AD, BC\n case \"G\":\n case \"GG\":\n case \"GGG\":\n return localize.era(era, { width: \"abbreviated\" });\n // A, B\n case \"GGGGG\":\n return localize.era(era, { width: \"narrow\" });\n // Anno Domini, Before Christ\n case \"GGGG\":\n default:\n return localize.era(era, { width: \"wide\" });\n }\n },\n\n // Year\n y: function (date, token, localize) {\n // Ordinal number\n if (token === \"yo\") {\n const signedYear = date.getFullYear();\n // Returns 1 for 1 BC (which is year 0 in JavaScript)\n const year = signedYear > 0 ? signedYear : 1 - signedYear;\n return localize.ordinalNumber(year, { unit: \"year\" });\n }\n\n return lightFormatters.y(date, token);\n },\n\n // Local week-numbering year\n Y: function (date, token, localize, options) {\n const signedWeekYear = getWeekYear(date, options);\n // Returns 1 for 1 BC (which is year 0 in JavaScript)\n const weekYear = signedWeekYear > 0 ? signedWeekYear : 1 - signedWeekYear;\n\n // Two digit year\n if (token === \"YY\") {\n const twoDigitYear = weekYear % 100;\n return addLeadingZeros(twoDigitYear, 2);\n }\n\n // Ordinal number\n if (token === \"Yo\") {\n return localize.ordinalNumber(weekYear, { unit: \"year\" });\n }\n\n // Padding\n return addLeadingZeros(weekYear, token.length);\n },\n\n // ISO week-numbering year\n R: function (date, token) {\n const isoWeekYear = getISOWeekYear(date);\n\n // Padding\n return addLeadingZeros(isoWeekYear, token.length);\n },\n\n // Extended year. This is a single number designating the year of this calendar system.\n // The main difference between `y` and `u` localizers are B.C. years:\n // | Year | `y` | `u` |\n // |------|-----|-----|\n // | AC 1 | 1 | 1 |\n // | BC 1 | 1 | 0 |\n // | BC 2 | 2 | -1 |\n // Also `yy` always returns the last two digits of a year,\n // while `uu` pads single digit years to 2 characters and returns other years unchanged.\n u: function (date, token) {\n const year = date.getFullYear();\n return addLeadingZeros(year, token.length);\n },\n\n // Quarter\n Q: function (date, token, localize) {\n const quarter = Math.ceil((date.getMonth() + 1) / 3);\n switch (token) {\n // 1, 2, 3, 4\n case \"Q\":\n return String(quarter);\n // 01, 02, 03, 04\n case \"QQ\":\n return addLeadingZeros(quarter, 2);\n // 1st, 2nd, 3rd, 4th\n case \"Qo\":\n return localize.ordinalNumber(quarter, { unit: \"quarter\" });\n // Q1, Q2, Q3, Q4\n case \"QQQ\":\n return localize.quarter(quarter, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // 1, 2, 3, 4 (narrow quarter; could be not numerical)\n case \"QQQQQ\":\n return localize.quarter(quarter, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // 1st quarter, 2nd quarter, ...\n case \"QQQQ\":\n default:\n return localize.quarter(quarter, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // Stand-alone quarter\n q: function (date, token, localize) {\n const quarter = Math.ceil((date.getMonth() + 1) / 3);\n switch (token) {\n // 1, 2, 3, 4\n case \"q\":\n return String(quarter);\n // 01, 02, 03, 04\n case \"qq\":\n return addLeadingZeros(quarter, 2);\n // 1st, 2nd, 3rd, 4th\n case \"qo\":\n return localize.ordinalNumber(quarter, { unit: \"quarter\" });\n // Q1, Q2, Q3, Q4\n case \"qqq\":\n return localize.quarter(quarter, {\n width: \"abbreviated\",\n context: \"standalone\",\n });\n // 1, 2, 3, 4 (narrow quarter; could be not numerical)\n case \"qqqqq\":\n return localize.quarter(quarter, {\n width: \"narrow\",\n context: \"standalone\",\n });\n // 1st quarter, 2nd quarter, ...\n case \"qqqq\":\n default:\n return localize.quarter(quarter, {\n width: \"wide\",\n context: \"standalone\",\n });\n }\n },\n\n // Month\n M: function (date, token, localize) {\n const month = date.getMonth();\n switch (token) {\n case \"M\":\n case \"MM\":\n return lightFormatters.M(date, token);\n // 1st, 2nd, ..., 12th\n case \"Mo\":\n return localize.ordinalNumber(month + 1, { unit: \"month\" });\n // Jan, Feb, ..., Dec\n case \"MMM\":\n return localize.month(month, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // J, F, ..., D\n case \"MMMMM\":\n return localize.month(month, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // January, February, ..., December\n case \"MMMM\":\n default:\n return localize.month(month, { width: \"wide\", context: \"formatting\" });\n }\n },\n\n // Stand-alone month\n L: function (date, token, localize) {\n const month = date.getMonth();\n switch (token) {\n // 1, 2, ..., 12\n case \"L\":\n return String(month + 1);\n // 01, 02, ..., 12\n case \"LL\":\n return addLeadingZeros(month + 1, 2);\n // 1st, 2nd, ..., 12th\n case \"Lo\":\n return localize.ordinalNumber(month + 1, { unit: \"month\" });\n // Jan, Feb, ..., Dec\n case \"LLL\":\n return localize.month(month, {\n width: \"abbreviated\",\n context: \"standalone\",\n });\n // J, F, ..., D\n case \"LLLLL\":\n return localize.month(month, {\n width: \"narrow\",\n context: \"standalone\",\n });\n // January, February, ..., December\n case \"LLLL\":\n default:\n return localize.month(month, { width: \"wide\", context: \"standalone\" });\n }\n },\n\n // Local week of year\n w: function (date, token, localize, options) {\n const week = getWeek(date, options);\n\n if (token === \"wo\") {\n return localize.ordinalNumber(week, { unit: \"week\" });\n }\n\n return addLeadingZeros(week, token.length);\n },\n\n // ISO week of year\n I: function (date, token, localize) {\n const isoWeek = getISOWeek(date);\n\n if (token === \"Io\") {\n return localize.ordinalNumber(isoWeek, { unit: \"week\" });\n }\n\n return addLeadingZeros(isoWeek, token.length);\n },\n\n // Day of the month\n d: function (date, token, localize) {\n if (token === \"do\") {\n return localize.ordinalNumber(date.getDate(), { unit: \"date\" });\n }\n\n return lightFormatters.d(date, token);\n },\n\n // Day of year\n D: function (date, token, localize) {\n const dayOfYear = getDayOfYear(date);\n\n if (token === \"Do\") {\n return localize.ordinalNumber(dayOfYear, { unit: \"dayOfYear\" });\n }\n\n return addLeadingZeros(dayOfYear, token.length);\n },\n\n // Day of week\n E: function (date, token, localize) {\n const dayOfWeek = date.getDay();\n switch (token) {\n // Tue\n case \"E\":\n case \"EE\":\n case \"EEE\":\n return localize.day(dayOfWeek, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // T\n case \"EEEEE\":\n return localize.day(dayOfWeek, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // Tu\n case \"EEEEEE\":\n return localize.day(dayOfWeek, {\n width: \"short\",\n context: \"formatting\",\n });\n // Tuesday\n case \"EEEE\":\n default:\n return localize.day(dayOfWeek, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // Local day of week\n e: function (date, token, localize, options) {\n const dayOfWeek = date.getDay();\n const localDayOfWeek = (dayOfWeek - options.weekStartsOn + 8) % 7 || 7;\n switch (token) {\n // Numerical value (Nth day of week with current locale or weekStartsOn)\n case \"e\":\n return String(localDayOfWeek);\n // Padded numerical value\n case \"ee\":\n return addLeadingZeros(localDayOfWeek, 2);\n // 1st, 2nd, ..., 7th\n case \"eo\":\n return localize.ordinalNumber(localDayOfWeek, { unit: \"day\" });\n case \"eee\":\n return localize.day(dayOfWeek, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // T\n case \"eeeee\":\n return localize.day(dayOfWeek, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // Tu\n case \"eeeeee\":\n return localize.day(dayOfWeek, {\n width: \"short\",\n context: \"formatting\",\n });\n // Tuesday\n case \"eeee\":\n default:\n return localize.day(dayOfWeek, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // Stand-alone local day of week\n c: function (date, token, localize, options) {\n const dayOfWeek = date.getDay();\n const localDayOfWeek = (dayOfWeek - options.weekStartsOn + 8) % 7 || 7;\n switch (token) {\n // Numerical value (same as in `e`)\n case \"c\":\n return String(localDayOfWeek);\n // Padded numerical value\n case \"cc\":\n return addLeadingZeros(localDayOfWeek, token.length);\n // 1st, 2nd, ..., 7th\n case \"co\":\n return localize.ordinalNumber(localDayOfWeek, { unit: \"day\" });\n case \"ccc\":\n return localize.day(dayOfWeek, {\n width: \"abbreviated\",\n context: \"standalone\",\n });\n // T\n case \"ccccc\":\n return localize.day(dayOfWeek, {\n width: \"narrow\",\n context: \"standalone\",\n });\n // Tu\n case \"cccccc\":\n return localize.day(dayOfWeek, {\n width: \"short\",\n context: \"standalone\",\n });\n // Tuesday\n case \"cccc\":\n default:\n return localize.day(dayOfWeek, {\n width: \"wide\",\n context: \"standalone\",\n });\n }\n },\n\n // ISO day of week\n i: function (date, token, localize) {\n const dayOfWeek = date.getDay();\n const isoDayOfWeek = dayOfWeek === 0 ? 7 : dayOfWeek;\n switch (token) {\n // 2\n case \"i\":\n return String(isoDayOfWeek);\n // 02\n case \"ii\":\n return addLeadingZeros(isoDayOfWeek, token.length);\n // 2nd\n case \"io\":\n return localize.ordinalNumber(isoDayOfWeek, { unit: \"day\" });\n // Tue\n case \"iii\":\n return localize.day(dayOfWeek, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // T\n case \"iiiii\":\n return localize.day(dayOfWeek, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // Tu\n case \"iiiiii\":\n return localize.day(dayOfWeek, {\n width: \"short\",\n context: \"formatting\",\n });\n // Tuesday\n case \"iiii\":\n default:\n return localize.day(dayOfWeek, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // AM or PM\n a: function (date, token, localize) {\n const hours = date.getHours();\n const dayPeriodEnumValue = hours / 12 >= 1 ? \"pm\" : \"am\";\n\n switch (token) {\n case \"a\":\n case \"aa\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n case \"aaa\":\n return localize\n .dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n })\n .toLowerCase();\n case \"aaaaa\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"narrow\",\n context: \"formatting\",\n });\n case \"aaaa\":\n default:\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // AM, PM, midnight, noon\n b: function (date, token, localize) {\n const hours = date.getHours();\n let dayPeriodEnumValue;\n if (hours === 12) {\n dayPeriodEnumValue = dayPeriodEnum.noon;\n } else if (hours === 0) {\n dayPeriodEnumValue = dayPeriodEnum.midnight;\n } else {\n dayPeriodEnumValue = hours / 12 >= 1 ? \"pm\" : \"am\";\n }\n\n switch (token) {\n case \"b\":\n case \"bb\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n case \"bbb\":\n return localize\n .dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n })\n .toLowerCase();\n case \"bbbbb\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"narrow\",\n context: \"formatting\",\n });\n case \"bbbb\":\n default:\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // in the morning, in the afternoon, in the evening, at night\n B: function (date, token, localize) {\n const hours = date.getHours();\n let dayPeriodEnumValue;\n if (hours >= 17) {\n dayPeriodEnumValue = dayPeriodEnum.evening;\n } else if (hours >= 12) {\n dayPeriodEnumValue = dayPeriodEnum.afternoon;\n } else if (hours >= 4) {\n dayPeriodEnumValue = dayPeriodEnum.morning;\n } else {\n dayPeriodEnumValue = dayPeriodEnum.night;\n }\n\n switch (token) {\n case \"B\":\n case \"BB\":\n case \"BBB\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n case \"BBBBB\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"narrow\",\n context: \"formatting\",\n });\n case \"BBBB\":\n default:\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // Hour [1-12]\n h: function (date, token, localize) {\n if (token === \"ho\") {\n let hours = date.getHours() % 12;\n if (hours === 0) hours = 12;\n return localize.ordinalNumber(hours, { unit: \"hour\" });\n }\n\n return lightFormatters.h(date, token);\n },\n\n // Hour [0-23]\n H: function (date, token, localize) {\n if (token === \"Ho\") {\n return localize.ordinalNumber(date.getHours(), { unit: \"hour\" });\n }\n\n return lightFormatters.H(date, token);\n },\n\n // Hour [0-11]\n K: function (date, token, localize) {\n const hours = date.getHours() % 12;\n\n if (token === \"Ko\") {\n return localize.ordinalNumber(hours, { unit: \"hour\" });\n }\n\n return addLeadingZeros(hours, token.length);\n },\n\n // Hour [1-24]\n k: function (date, token, localize) {\n let hours = date.getHours();\n if (hours === 0) hours = 24;\n\n if (token === \"ko\") {\n return localize.ordinalNumber(hours, { unit: \"hour\" });\n }\n\n return addLeadingZeros(hours, token.length);\n },\n\n // Minute\n m: function (date, token, localize) {\n if (token === \"mo\") {\n return localize.ordinalNumber(date.getMinutes(), { unit: \"minute\" });\n }\n\n return lightFormatters.m(date, token);\n },\n\n // Second\n s: function (date, token, localize) {\n if (token === \"so\") {\n return localize.ordinalNumber(date.getSeconds(), { unit: \"second\" });\n }\n\n return lightFormatters.s(date, token);\n },\n\n // Fraction of second\n S: function (date, token) {\n return lightFormatters.S(date, token);\n },\n\n // Timezone (ISO-8601. If offset is 0, output is always `'Z'`)\n X: function (date, token, _localize) {\n const timezoneOffset = date.getTimezoneOffset();\n\n if (timezoneOffset === 0) {\n return \"Z\";\n }\n\n switch (token) {\n // Hours and optional minutes\n case \"X\":\n return formatTimezoneWithOptionalMinutes(timezoneOffset);\n\n // Hours, minutes and optional seconds without `:` delimiter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `XX`\n case \"XXXX\":\n case \"XX\": // Hours and minutes without `:` delimiter\n return formatTimezone(timezoneOffset);\n\n // Hours, minutes and optional seconds with `:` delimiter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `XXX`\n case \"XXXXX\":\n case \"XXX\": // Hours and minutes with `:` delimiter\n default:\n return formatTimezone(timezoneOffset, \":\");\n }\n },\n\n // Timezone (ISO-8601. If offset is 0, output is `'+00:00'` or equivalent)\n x: function (date, token, _localize) {\n const timezoneOffset = date.getTimezoneOffset();\n\n switch (token) {\n // Hours and optional minutes\n case \"x\":\n return formatTimezoneWithOptionalMinutes(timezoneOffset);\n\n // Hours, minutes and optional seconds without `:` delimiter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `xx`\n case \"xxxx\":\n case \"xx\": // Hours and minutes without `:` delimiter\n return formatTimezone(timezoneOffset);\n\n // Hours, minutes and optional seconds with `:` delimiter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `xxx`\n case \"xxxxx\":\n case \"xxx\": // Hours and minutes with `:` delimiter\n default:\n return formatTimezone(timezoneOffset, \":\");\n }\n },\n\n // Timezone (GMT)\n O: function (date, token, _localize) {\n const timezoneOffset = date.getTimezoneOffset();\n\n switch (token) {\n // Short\n case \"O\":\n case \"OO\":\n case \"OOO\":\n return \"GMT\" + formatTimezoneShort(timezoneOffset, \":\");\n // Long\n case \"OOOO\":\n default:\n return \"GMT\" + formatTimezone(timezoneOffset, \":\");\n }\n },\n\n // Timezone (specific non-location)\n z: function (date, token, _localize) {\n const timezoneOffset = date.getTimezoneOffset();\n\n switch (token) {\n // Short\n case \"z\":\n case \"zz\":\n case \"zzz\":\n return \"GMT\" + formatTimezoneShort(timezoneOffset, \":\");\n // Long\n case \"zzzz\":\n default:\n return \"GMT\" + formatTimezone(timezoneOffset, \":\");\n }\n },\n\n // Seconds timestamp\n t: function (date, token, _localize) {\n const timestamp = Math.trunc(+date / 1000);\n return addLeadingZeros(timestamp, token.length);\n },\n\n // Milliseconds timestamp\n T: function (date, token, _localize) {\n return addLeadingZeros(+date, token.length);\n },\n};\n\nfunction formatTimezoneShort(offset, delimiter = \"\") {\n const sign = offset > 0 ? \"-\" : \"+\";\n const absOffset = Math.abs(offset);\n const hours = Math.trunc(absOffset / 60);\n const minutes = absOffset % 60;\n if (minutes === 0) {\n return sign + String(hours);\n }\n return sign + String(hours) + delimiter + addLeadingZeros(minutes, 2);\n}\n\nfunction formatTimezoneWithOptionalMinutes(offset, delimiter) {\n if (offset % 60 === 0) {\n const sign = offset > 0 ? \"-\" : \"+\";\n return sign + addLeadingZeros(Math.abs(offset) / 60, 2);\n }\n return formatTimezone(offset, delimiter);\n}\n\nfunction formatTimezone(offset, delimiter = \"\") {\n const sign = offset > 0 ? \"-\" : \"+\";\n const absOffset = Math.abs(offset);\n const hours = addLeadingZeros(Math.trunc(absOffset / 60), 2);\n const minutes = addLeadingZeros(absOffset % 60, 2);\n return sign + hours + delimiter + minutes;\n}\n","const dateLongFormatter = (pattern, formatLong) => {\n switch (pattern) {\n case \"P\":\n return formatLong.date({ width: \"short\" });\n case \"PP\":\n return formatLong.date({ width: \"medium\" });\n case \"PPP\":\n return formatLong.date({ width: \"long\" });\n case \"PPPP\":\n default:\n return formatLong.date({ width: \"full\" });\n }\n};\n\nconst timeLongFormatter = (pattern, formatLong) => {\n switch (pattern) {\n case \"p\":\n return formatLong.time({ width: \"short\" });\n case \"pp\":\n return formatLong.time({ width: \"medium\" });\n case \"ppp\":\n return formatLong.time({ width: \"long\" });\n case \"pppp\":\n default:\n return formatLong.time({ width: \"full\" });\n }\n};\n\nconst dateTimeLongFormatter = (pattern, formatLong) => {\n const matchResult = pattern.match(/(P+)(p+)?/) || [];\n const datePattern = matchResult[1];\n const timePattern = matchResult[2];\n\n if (!timePattern) {\n return dateLongFormatter(pattern, formatLong);\n }\n\n let dateTimeFormat;\n\n switch (datePattern) {\n case \"P\":\n dateTimeFormat = formatLong.dateTime({ width: \"short\" });\n break;\n case \"PP\":\n dateTimeFormat = formatLong.dateTime({ width: \"medium\" });\n break;\n case \"PPP\":\n dateTimeFormat = formatLong.dateTime({ width: \"long\" });\n break;\n case \"PPPP\":\n default:\n dateTimeFormat = formatLong.dateTime({ width: \"full\" });\n break;\n }\n\n return dateTimeFormat\n .replace(\"{{date}}\", dateLongFormatter(datePattern, formatLong))\n .replace(\"{{time}}\", timeLongFormatter(timePattern, formatLong));\n};\n\nexport const longFormatters = {\n p: timeLongFormatter,\n P: dateTimeLongFormatter,\n};\n","const dayOfYearTokenRE = /^D+$/;\nconst weekYearTokenRE = /^Y+$/;\n\nconst throwTokens = [\"D\", \"DD\", \"YY\", \"YYYY\"];\n\nexport function isProtectedDayOfYearToken(token) {\n return dayOfYearTokenRE.test(token);\n}\n\nexport function isProtectedWeekYearToken(token) {\n return weekYearTokenRE.test(token);\n}\n\nexport function warnOrThrowProtectedError(token, format, input) {\n const _message = message(token, format, input);\n console.warn(_message);\n if (throwTokens.includes(token)) throw new RangeError(_message);\n}\n\nfunction message(token, format, input) {\n const subject = token[0] === \"Y\" ? \"years\" : \"days of the month\";\n return `Use \\`${token.toLowerCase()}\\` instead of \\`${token}\\` (in \\`${format}\\`) for formatting ${subject} to the input \\`${input}\\`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md`;\n}\n","import { defaultLocale } from \"./_lib/defaultLocale.js\";\nimport { getDefaultOptions } from \"./_lib/defaultOptions.js\";\nimport { formatters } from \"./_lib/format/formatters.js\";\nimport { longFormatters } from \"./_lib/format/longFormatters.js\";\nimport {\n isProtectedDayOfYearToken,\n isProtectedWeekYearToken,\n warnOrThrowProtectedError,\n} from \"./_lib/protectedTokens.js\";\nimport { isValid } from \"./isValid.js\";\nimport { toDate } from \"./toDate.js\";\n\n// Rexports of internal for libraries to use.\n// See: https://github.com/date-fns/date-fns/issues/3638#issuecomment-1877082874\nexport { formatters, longFormatters };\n\n// This RegExp consists of three parts separated by `|`:\n// - [yYQqMLwIdDecihHKkms]o matches any available ordinal number token\n// (one of the certain letters followed by `o`)\n// - (\\w)\\1* matches any sequences of the same letter\n// - '' matches two quote characters in a row\n// - '(''|[^'])+('|$) matches anything surrounded by two quote characters ('),\n// except a single quote symbol, which ends the sequence.\n// Two quote characters do not end the sequence.\n// If there is no matching single quote\n// then the sequence will continue until the end of the string.\n// - . matches any single character unmatched by previous parts of the RegExps\nconst formattingTokensRegExp =\n /[yYQqMLwIdDecihHKkms]o|(\\w)\\1*|''|'(''|[^'])+('|$)|./g;\n\n// This RegExp catches symbols escaped by quotes, and also\n// sequences of symbols P, p, and the combinations like `PPPPPPPppppp`\nconst longFormattingTokensRegExp = /P+p+|P+|p+|''|'(''|[^'])+('|$)|./g;\n\nconst escapedStringRegExp = /^'([^]*?)'?$/;\nconst doubleQuoteRegExp = /''/g;\nconst unescapedLatinCharacterRegExp = /[a-zA-Z]/;\n\nexport { format as formatDate };\n\n/**\n * The {@link format} function options.\n */\n\n/**\n * @name format\n * @alias formatDate\n * @category Common Helpers\n * @summary Format the date.\n *\n * @description\n * Return the formatted date string in the given format. The result may vary by locale.\n *\n * > ⚠️ Please note that the `format` tokens differ from Moment.js and other libraries.\n * > See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * The characters wrapped between two single quotes characters (') are escaped.\n * Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.\n * (see the last example)\n *\n * Format of the string is based on Unicode Technical Standard #35:\n * https://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table\n * with a few additions (see note 7 below the table).\n *\n * Accepted patterns:\n * | Unit | Pattern | Result examples | Notes |\n * |---------------------------------|---------|-----------------------------------|-------|\n * | Era | G..GGG | AD, BC | |\n * | | GGGG | Anno Domini, Before Christ | 2 |\n * | | GGGGG | A, B | |\n * | Calendar year | y | 44, 1, 1900, 2017 | 5 |\n * | | yo | 44th, 1st, 0th, 17th | 5,7 |\n * | | yy | 44, 01, 00, 17 | 5 |\n * | | yyy | 044, 001, 1900, 2017 | 5 |\n * | | yyyy | 0044, 0001, 1900, 2017 | 5 |\n * | | yyyyy | ... | 3,5 |\n * | Local week-numbering year | Y | 44, 1, 1900, 2017 | 5 |\n * | | Yo | 44th, 1st, 1900th, 2017th | 5,7 |\n * | | YY | 44, 01, 00, 17 | 5,8 |\n * | | YYY | 044, 001, 1900, 2017 | 5 |\n * | | YYYY | 0044, 0001, 1900, 2017 | 5,8 |\n * | | YYYYY | ... | 3,5 |\n * | ISO week-numbering year | R | -43, 0, 1, 1900, 2017 | 5,7 |\n * | | RR | -43, 00, 01, 1900, 2017 | 5,7 |\n * | | RRR | -043, 000, 001, 1900, 2017 | 5,7 |\n * | | RRRR | -0043, 0000, 0001, 1900, 2017 | 5,7 |\n * | | RRRRR | ... | 3,5,7 |\n * | Extended year | u | -43, 0, 1, 1900, 2017 | 5 |\n * | | uu | -43, 01, 1900, 2017 | 5 |\n * | | uuu | -043, 001, 1900, 2017 | 5 |\n * | | uuuu | -0043, 0001, 1900, 2017 | 5 |\n * | | uuuuu | ... | 3,5 |\n * | Quarter (formatting) | Q | 1, 2, 3, 4 | |\n * | | Qo | 1st, 2nd, 3rd, 4th | 7 |\n * | | QQ | 01, 02, 03, 04 | |\n * | | QQQ | Q1, Q2, Q3, Q4 | |\n * | | QQQQ | 1st quarter, 2nd quarter, ... | 2 |\n * | | QQQQQ | 1, 2, 3, 4 | 4 |\n * | Quarter (stand-alone) | q | 1, 2, 3, 4 | |\n * | | qo | 1st, 2nd, 3rd, 4th | 7 |\n * | | qq | 01, 02, 03, 04 | |\n * | | qqq | Q1, Q2, Q3, Q4 | |\n * | | qqqq | 1st quarter, 2nd quarter, ... | 2 |\n * | | qqqqq | 1, 2, 3, 4 | 4 |\n * | Month (formatting) | M | 1, 2, ..., 12 | |\n * | | Mo | 1st, 2nd, ..., 12th | 7 |\n * | | MM | 01, 02, ..., 12 | |\n * | | MMM | Jan, Feb, ..., Dec | |\n * | | MMMM | January, February, ..., December | 2 |\n * | | MMMMM | J, F, ..., D | |\n * | Month (stand-alone) | L | 1, 2, ..., 12 | |\n * | | Lo | 1st, 2nd, ..., 12th | 7 |\n * | | LL | 01, 02, ..., 12 | |\n * | | LLL | Jan, Feb, ..., Dec | |\n * | | LLLL | January, February, ..., December | 2 |\n * | | LLLLL | J, F, ..., D | |\n * | Local week of year | w | 1, 2, ..., 53 | |\n * | | wo | 1st, 2nd, ..., 53th | 7 |\n * | | ww | 01, 02, ..., 53 | |\n * | ISO week of year | I | 1, 2, ..., 53 | 7 |\n * | | Io | 1st, 2nd, ..., 53th | 7 |\n * | | II | 01, 02, ..., 53 | 7 |\n * | Day of month | d | 1, 2, ..., 31 | |\n * | | do | 1st, 2nd, ..., 31st | 7 |\n * | | dd | 01, 02, ..., 31 | |\n * | Day of year | D | 1, 2, ..., 365, 366 | 9 |\n * | | Do | 1st, 2nd, ..., 365th, 366th | 7 |\n * | | DD | 01, 02, ..., 365, 366 | 9 |\n * | | DDD | 001, 002, ..., 365, 366 | |\n * | | DDDD | ... | 3 |\n * | Day of week (formatting) | E..EEE | Mon, Tue, Wed, ..., Sun | |\n * | | EEEE | Monday, Tuesday, ..., Sunday | 2 |\n * | | EEEEE | M, T, W, T, F, S, S | |\n * | | EEEEEE | Mo, Tu, We, Th, Fr, Sa, Su | |\n * | ISO day of week (formatting) | i | 1, 2, 3, ..., 7 | 7 |\n * | | io | 1st, 2nd, ..., 7th | 7 |\n * | | ii | 01, 02, ..., 07 | 7 |\n * | | iii | Mon, Tue, Wed, ..., Sun | 7 |\n * | | iiii | Monday, Tuesday, ..., Sunday | 2,7 |\n * | | iiiii | M, T, W, T, F, S, S | 7 |\n * | | iiiiii | Mo, Tu, We, Th, Fr, Sa, Su | 7 |\n * | Local day of week (formatting) | e | 2, 3, 4, ..., 1 | |\n * | | eo | 2nd, 3rd, ..., 1st | 7 |\n * | | ee | 02, 03, ..., 01 | |\n * | | eee | Mon, Tue, Wed, ..., Sun | |\n * | | eeee | Monday, Tuesday, ..., Sunday | 2 |\n * | | eeeee | M, T, W, T, F, S, S | |\n * | | eeeeee | Mo, Tu, We, Th, Fr, Sa, Su | |\n * | Local day of week (stand-alone) | c | 2, 3, 4, ..., 1 | |\n * | | co | 2nd, 3rd, ..., 1st | 7 |\n * | | cc | 02, 03, ..., 01 | |\n * | | ccc | Mon, Tue, Wed, ..., Sun | |\n * | | cccc | Monday, Tuesday, ..., Sunday | 2 |\n * | | ccccc | M, T, W, T, F, S, S | |\n * | | cccccc | Mo, Tu, We, Th, Fr, Sa, Su | |\n * | AM, PM | a..aa | AM, PM | |\n * | | aaa | am, pm | |\n * | | aaaa | a.m., p.m. | 2 |\n * | | aaaaa | a, p | |\n * | AM, PM, noon, midnight | b..bb | AM, PM, noon, midnight | |\n * | | bbb | am, pm, noon, midnight | |\n * | | bbbb | a.m., p.m., noon, midnight | 2 |\n * | | bbbbb | a, p, n, mi | |\n * | Flexible day period | B..BBB | at night, in the morning, ... | |\n * | | BBBB | at night, in the morning, ... | 2 |\n * | | BBBBB | at night, in the morning, ... | |\n * | Hour [1-12] | h | 1, 2, ..., 11, 12 | |\n * | | ho | 1st, 2nd, ..., 11th, 12th | 7 |\n * | | hh | 01, 02, ..., 11, 12 | |\n * | Hour [0-23] | H | 0, 1, 2, ..., 23 | |\n * | | Ho | 0th, 1st, 2nd, ..., 23rd | 7 |\n * | | HH | 00, 01, 02, ..., 23 | |\n * | Hour [0-11] | K | 1, 2, ..., 11, 0 | |\n * | | Ko | 1st, 2nd, ..., 11th, 0th | 7 |\n * | | KK | 01, 02, ..., 11, 00 | |\n * | Hour [1-24] | k | 24, 1, 2, ..., 23 | |\n * | | ko | 24th, 1st, 2nd, ..., 23rd | 7 |\n * | | kk | 24, 01, 02, ..., 23 | |\n * | Minute | m | 0, 1, ..., 59 | |\n * | | mo | 0th, 1st, ..., 59th | 7 |\n * | | mm | 00, 01, ..., 59 | |\n * | Second | s | 0, 1, ..., 59 | |\n * | | so | 0th, 1st, ..., 59th | 7 |\n * | | ss | 00, 01, ..., 59 | |\n * | Fraction of second | S | 0, 1, ..., 9 | |\n * | | SS | 00, 01, ..., 99 | |\n * | | SSS | 000, 001, ..., 999 | |\n * | | SSSS | ... | 3 |\n * | Timezone (ISO-8601 w/ Z) | X | -08, +0530, Z | |\n * | | XX | -0800, +0530, Z | |\n * | | XXX | -08:00, +05:30, Z | |\n * | | XXXX | -0800, +0530, Z, +123456 | 2 |\n * | | XXXXX | -08:00, +05:30, Z, +12:34:56 | |\n * | Timezone (ISO-8601 w/o Z) | x | -08, +0530, +00 | |\n * | | xx | -0800, +0530, +0000 | |\n * | | xxx | -08:00, +05:30, +00:00 | 2 |\n * | | xxxx | -0800, +0530, +0000, +123456 | |\n * | | xxxxx | -08:00, +05:30, +00:00, +12:34:56 | |\n * | Timezone (GMT) | O...OOO | GMT-8, GMT+5:30, GMT+0 | |\n * | | OOOO | GMT-08:00, GMT+05:30, GMT+00:00 | 2 |\n * | Timezone (specific non-locat.) | z...zzz | GMT-8, GMT+5:30, GMT+0 | 6 |\n * | | zzzz | GMT-08:00, GMT+05:30, GMT+00:00 | 2,6 |\n * | Seconds timestamp | t | 512969520 | 7 |\n * | | tt | ... | 3,7 |\n * | Milliseconds timestamp | T | 512969520900 | 7 |\n * | | TT | ... | 3,7 |\n * | Long localized date | P | 04/29/1453 | 7 |\n * | | PP | Apr 29, 1453 | 7 |\n * | | PPP | April 29th, 1453 | 7 |\n * | | PPPP | Friday, April 29th, 1453 | 2,7 |\n * | Long localized time | p | 12:00 AM | 7 |\n * | | pp | 12:00:00 AM | 7 |\n * | | ppp | 12:00:00 AM GMT+2 | 7 |\n * | | pppp | 12:00:00 AM GMT+02:00 | 2,7 |\n * | Combination of date and time | Pp | 04/29/1453, 12:00 AM | 7 |\n * | | PPpp | Apr 29, 1453, 12:00:00 AM | 7 |\n * | | PPPppp | April 29th, 1453 at ... | 7 |\n * | | PPPPpppp| Friday, April 29th, 1453 at ... | 2,7 |\n * Notes:\n * 1. \"Formatting\" units (e.g. formatting quarter) in the default en-US locale\n * are the same as \"stand-alone\" units, but are different in some languages.\n * \"Formatting\" units are declined according to the rules of the language\n * in the context of a date. \"Stand-alone\" units are always nominative singular:\n *\n * `format(new Date(2017, 10, 6), 'do LLLL', {locale: cs}) //=> '6. listopad'`\n *\n * `format(new Date(2017, 10, 6), 'do MMMM', {locale: cs}) //=> '6. listopadu'`\n *\n * 2. Any sequence of the identical letters is a pattern, unless it is escaped by\n * the single quote characters (see below).\n * If the sequence is longer than listed in table (e.g. `EEEEEEEEEEE`)\n * the output will be the same as default pattern for this unit, usually\n * the longest one (in case of ISO weekdays, `EEEE`). Default patterns for units\n * are marked with \"2\" in the last column of the table.\n *\n * `format(new Date(2017, 10, 6), 'MMM') //=> 'Nov'`\n *\n * `format(new Date(2017, 10, 6), 'MMMM') //=> 'November'`\n *\n * `format(new Date(2017, 10, 6), 'MMMMM') //=> 'N'`\n *\n * `format(new Date(2017, 10, 6), 'MMMMMM') //=> 'November'`\n *\n * `format(new Date(2017, 10, 6), 'MMMMMMM') //=> 'November'`\n *\n * 3. Some patterns could be unlimited length (such as `yyyyyyyy`).\n * The output will be padded with zeros to match the length of the pattern.\n *\n * `format(new Date(2017, 10, 6), 'yyyyyyyy') //=> '00002017'`\n *\n * 4. `QQQQQ` and `qqqqq` could be not strictly numerical in some locales.\n * These tokens represent the shortest form of the quarter.\n *\n * 5. The main difference between `y` and `u` patterns are B.C. years:\n *\n * | Year | `y` | `u` |\n * |------|-----|-----|\n * | AC 1 | 1 | 1 |\n * | BC 1 | 1 | 0 |\n * | BC 2 | 2 | -1 |\n *\n * Also `yy` always returns the last two digits of a year,\n * while `uu` pads single digit years to 2 characters and returns other years unchanged:\n *\n * | Year | `yy` | `uu` |\n * |------|------|------|\n * | 1 | 01 | 01 |\n * | 14 | 14 | 14 |\n * | 376 | 76 | 376 |\n * | 1453 | 53 | 1453 |\n *\n * The same difference is true for local and ISO week-numbering years (`Y` and `R`),\n * except local week-numbering years are dependent on `options.weekStartsOn`\n * and `options.firstWeekContainsDate` (compare [getISOWeekYear](https://date-fns.org/docs/getISOWeekYear)\n * and [getWeekYear](https://date-fns.org/docs/getWeekYear)).\n *\n * 6. Specific non-location timezones are currently unavailable in `date-fns`,\n * so right now these tokens fall back to GMT timezones.\n *\n * 7. These patterns are not in the Unicode Technical Standard #35:\n * - `i`: ISO day of week\n * - `I`: ISO week of year\n * - `R`: ISO week-numbering year\n * - `t`: seconds timestamp\n * - `T`: milliseconds timestamp\n * - `o`: ordinal number modifier\n * - `P`: long localized date\n * - `p`: long localized time\n *\n * 8. `YY` and `YYYY` tokens represent week-numbering years but they are often confused with years.\n * You should enable `options.useAdditionalWeekYearTokens` to use them. See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * 9. `D` and `DD` tokens represent days of the year but they are often confused with days of the month.\n * You should enable `options.useAdditionalDayOfYearTokens` to use them. See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * @param date - The original date\n * @param format - The string of tokens\n * @param options - An object with options\n *\n * @returns The formatted date string\n *\n * @throws `date` must not be Invalid Date\n * @throws `options.locale` must contain `localize` property\n * @throws `options.locale` must contain `formatLong` property\n * @throws use `yyyy` instead of `YYYY` for formatting years using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws use `yy` instead of `YY` for formatting years using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws use `d` instead of `D` for formatting days of the month using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws use `dd` instead of `DD` for formatting days of the month using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws format string contains an unescaped latin alphabet character\n *\n * @example\n * // Represent 11 February 2014 in middle-endian format:\n * const result = format(new Date(2014, 1, 11), 'MM/dd/yyyy')\n * //=> '02/11/2014'\n *\n * @example\n * // Represent 2 July 2014 in Esperanto:\n * import { eoLocale } from 'date-fns/locale/eo'\n * const result = format(new Date(2014, 6, 2), \"do 'de' MMMM yyyy\", {\n * locale: eoLocale\n * })\n * //=> '2-a de julio 2014'\n *\n * @example\n * // Escape string by single quote characters:\n * const result = format(new Date(2014, 6, 2, 15), \"h 'o''clock'\")\n * //=> \"3 o'clock\"\n */\nexport function format(date, formatStr, options) {\n const defaultOptions = getDefaultOptions();\n const locale = options?.locale ?? defaultOptions.locale ?? defaultLocale;\n\n const firstWeekContainsDate =\n options?.firstWeekContainsDate ??\n options?.locale?.options?.firstWeekContainsDate ??\n defaultOptions.firstWeekContainsDate ??\n defaultOptions.locale?.options?.firstWeekContainsDate ??\n 1;\n\n const weekStartsOn =\n options?.weekStartsOn ??\n options?.locale?.options?.weekStartsOn ??\n defaultOptions.weekStartsOn ??\n defaultOptions.locale?.options?.weekStartsOn ??\n 0;\n\n const originalDate = toDate(date, options?.in);\n\n if (!isValid(originalDate)) {\n throw new RangeError(\"Invalid time value\");\n }\n\n let parts = formatStr\n .match(longFormattingTokensRegExp)\n .map((substring) => {\n const firstCharacter = substring[0];\n if (firstCharacter === \"p\" || firstCharacter === \"P\") {\n const longFormatter = longFormatters[firstCharacter];\n return longFormatter(substring, locale.formatLong);\n }\n return substring;\n })\n .join(\"\")\n .match(formattingTokensRegExp)\n .map((substring) => {\n // Replace two single quote characters with one single quote character\n if (substring === \"''\") {\n return { isToken: false, value: \"'\" };\n }\n\n const firstCharacter = substring[0];\n if (firstCharacter === \"'\") {\n return { isToken: false, value: cleanEscapedString(substring) };\n }\n\n if (formatters[firstCharacter]) {\n return { isToken: true, value: substring };\n }\n\n if (firstCharacter.match(unescapedLatinCharacterRegExp)) {\n throw new RangeError(\n \"Format string contains an unescaped latin alphabet character `\" +\n firstCharacter +\n \"`\",\n );\n }\n\n return { isToken: false, value: substring };\n });\n\n // invoke localize preprocessor (only for french locales at the moment)\n if (locale.localize.preprocessor) {\n parts = locale.localize.preprocessor(originalDate, parts);\n }\n\n const formatterOptions = {\n firstWeekContainsDate,\n weekStartsOn,\n locale,\n };\n\n return parts\n .map((part) => {\n if (!part.isToken) return part.value;\n\n const token = part.value;\n\n if (\n (!options?.useAdditionalWeekYearTokens &&\n isProtectedWeekYearToken(token)) ||\n (!options?.useAdditionalDayOfYearTokens &&\n isProtectedDayOfYearToken(token))\n ) {\n warnOrThrowProtectedError(token, formatStr, String(date));\n }\n\n const formatter = formatters[token[0]];\n return formatter(originalDate, token, locale.localize, formatterOptions);\n })\n .join(\"\");\n}\n\nfunction cleanEscapedString(input) {\n const matched = input.match(escapedStringRegExp);\n\n if (!matched) {\n return input;\n }\n\n return matched[1].replace(doubleQuoteRegExp, \"'\");\n}\n\n// Fallback for modularized imports:\nexport default format;\n","'use client'\r\n\r\nimport { useState, type ReactNode } from 'react'\r\nimport { useAppProvider } from '../../contexts/app-provider'\r\n\r\nexport default function Header({\r\n variant = 'default',\r\n rightSlot,\r\n}: {\r\n variant?: 'default' | 'v2' | 'v3'\r\n /** App-specific header actions (search, notifications, theme toggle, profile). Pass from app. */\r\n rightSlot?: ReactNode\r\n}) {\r\n const { sidebarOpen, setSidebarOpen } = useAppProvider()\r\n\r\n return (\r\n <header className={`sticky top-0 before:absolute before:inset-0 before:backdrop-blur-md max-lg:before:bg-background/90 before:-z-10 z-30 ${variant === 'v2' || variant === 'v3' ? 'before:bg-background after:absolute after:h-px after:inset-x-0 after:top-full after:bg-border after:-z-10' : 'max-lg:shadow-sm lg:before:bg-muted/90'} ${variant === 'v2' ? '' : ''} ${variant === 'v3' ? '' : ''}`}>\r\n <div className=\"px-4 sm:px-6 lg:px-8\">\r\n <div className={`flex items-center justify-between h-16 ${variant === 'v2' || variant === 'v3' ? '' : 'lg:border-b border-border'}`}>\r\n\r\n {/* Header: Left side */}\r\n <div className=\"flex\">\r\n <button\r\n className=\"text-muted-foreground hover:text-foreground lg:hidden\"\r\n aria-controls=\"sidebar\"\r\n aria-expanded={sidebarOpen}\r\n onClick={() => setSidebarOpen(!sidebarOpen)}\r\n >\r\n <span className=\"sr-only\">Open sidebar</span>\r\n <svg className=\"w-6 h-6 fill-current\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"4\" y=\"5\" width=\"16\" height=\"2\" />\r\n <rect x=\"4\" y=\"11\" width=\"16\" height=\"2\" />\r\n <rect x=\"4\" y=\"17\" width=\"16\" height=\"2\" />\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n {/* Header: Right side — app passes rightSlot (search, notifications, profile, etc.) */}\r\n {rightSlot != null && (\r\n <div className=\"flex items-center space-x-3\">\r\n {rightSlot}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </header>\r\n )\r\n}\r\n","'use client'\r\n\r\nimport React from 'react'\r\nimport Link from 'next/link'\r\nimport { cn } from '../../lib/utils'\r\nimport Logo from './logo'\r\n\r\nexport interface NavbarLink {\r\n href: string\r\n label: string\r\n}\r\n\r\nexport interface NavbarProps {\r\n /** Left side brand. Defaults to Mindtris logo + \"Design System\". */\r\n brand?: React.ReactNode\r\n links?: readonly NavbarLink[]\r\n rightSlot?: React.ReactNode\r\n className?: string\r\n}\r\n\r\nexport function Navbar({ brand, links = [], rightSlot, className }: NavbarProps) {\r\n return (\r\n <div className={cn('sticky top-0 z-50 border-b border-border bg-background', className)}>\r\n <div className=\"mx-auto max-w-[1400px] px-4 sm:px-6\">\r\n <div className=\"h-14 flex items-center gap-4\">\r\n {brand ?? (\r\n <div className=\"flex items-center gap-2 font-semibold text-foreground shrink-0\">\r\n <Logo />\r\n <span className=\"hidden sm:block\">Design System</span>\r\n </div>\r\n )}\r\n\r\n {links.length > 0 ? (\r\n <nav className=\"hidden md:flex items-center gap-1.5 min-w-0\">\r\n {links.map((link) => (\r\n <Link\r\n key={link.href}\r\n href={link.href}\r\n className=\"px-3 py-2 rounded-md text-sm font-medium text-muted-foreground hover:text-foreground hover:bg-muted transition-colors\"\r\n >\r\n {link.label}\r\n </Link>\r\n ))}\r\n </nav>\r\n ) : null}\r\n\r\n {rightSlot != null ? <div className=\"ml-auto flex items-center gap-2 min-w-0\">{rightSlot}</div> : null}\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\n","'use client'\r\n\r\nimport React from 'react'\r\nimport { cn } from '../../lib/utils'\r\n\r\nexport type TabsVariant = 'simple' | 'underline' | 'container'\r\n\r\nexport interface TabsItem {\r\n id: string\r\n label: string\r\n icon?: React.ReactNode\r\n}\r\n\r\nexport interface TabsProps {\r\n items: readonly TabsItem[]\r\n value: string\r\n onValueChange: (id: string) => void\r\n variant?: TabsVariant\r\n className?: string\r\n}\r\n\r\n/**\r\n * Tabs\r\n * Based on `app/(alternative)/components-library/tabs`.\r\n * - simple: bottom border container\r\n * - underline: active underline\r\n * - container: pill buttons (existing)\r\n */\r\nexport function Tabs({\r\n items,\r\n value,\r\n onValueChange,\r\n variant = 'container',\r\n className,\r\n}: TabsProps) {\r\n if (variant === 'container') {\r\n return (\r\n <ul className={cn('inline-flex w-fit flex-wrap items-center gap-2', className)}>\r\n {items.map((item) => (\r\n <li key={item.id}>\r\n <button\r\n type=\"button\"\r\n onClick={() => onValueChange(item.id)}\r\n className={cn(\r\n // Pill tabs (Mindtris tokens)\r\n 'inline-flex items-center justify-center gap-2 text-sm font-medium leading-5 rounded-full px-4 py-2 border transition-colors',\r\n // Icon normalization (shadcn-style)\r\n \"[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\r\n value === item.id\r\n ? 'bg-primary text-primary-foreground border-transparent'\r\n : 'bg-card text-muted-foreground border-border hover:text-foreground hover:border-border/80'\r\n )}\r\n >\r\n {item.icon}\r\n <span>{item.label}</span>\r\n </button>\r\n </li>\r\n ))}\r\n </ul>\r\n )\r\n }\r\n\r\n if (variant === 'underline') {\r\n return (\r\n <div className={cn('relative', className)}>\r\n <div className=\"absolute bottom-0 w-full h-px bg-border\" aria-hidden=\"true\" />\r\n <ul className=\"relative text-sm font-medium flex flex-nowrap overflow-x-auto no-scrollbar\">\r\n {items.map((item) => {\r\n const active = item.id === value\r\n return (\r\n <li key={item.id} className=\"mr-6 last:mr-0\">\r\n <button\r\n type=\"button\"\r\n onClick={() => onValueChange(item.id)}\r\n className={cn(\r\n 'block pb-3 whitespace-nowrap transition-colors',\r\n active\r\n ? 'text-primary border-b-2 border-primary'\r\n : 'text-muted-foreground hover:text-foreground'\r\n )}\r\n >\r\n <span className=\"inline-flex items-center\">\r\n {item.icon ? <span className=\"mr-2 text-muted-foreground\">{item.icon}</span> : null}\r\n {item.label}\r\n </span>\r\n </button>\r\n </li>\r\n )\r\n })}\r\n </ul>\r\n </div>\r\n )\r\n }\r\n\r\n // simple\r\n return (\r\n <div className={cn('border-b border-border', className)}>\r\n <ul className=\"text-sm font-medium flex flex-nowrap overflow-x-auto no-scrollbar\">\r\n {items.map((item) => {\r\n const active = item.id === value\r\n return (\r\n <li key={item.id} className=\"pb-3 mr-6 last:mr-0\">\r\n <button\r\n type=\"button\"\r\n onClick={() => onValueChange(item.id)}\r\n className={cn(\r\n 'whitespace-nowrap transition-colors',\r\n active ? 'text-primary' : 'text-muted-foreground hover:text-foreground'\r\n )}\r\n >\r\n <span className=\"inline-flex items-center\">\r\n {item.icon ? <span className=\"mr-2 text-muted-foreground\">{item.icon}</span> : null}\r\n {item.label}\r\n </span>\r\n </button>\r\n </li>\r\n )\r\n })}\r\n </ul>\r\n </div>\r\n )\r\n}\r\n\r\n// Back-compat export used elsewhere in the codebase\r\nexport type TabsWithContainerItem = TabsItem\r\nexport function TabsWithContainer(props: Omit<TabsProps, 'variant'>) {\r\n return <Tabs {...props} variant=\"container\" />\r\n}\r\n","/**\r\n * Tabs (Radix): shadcn-style tab primitives.\r\n *\r\n * Design-system contract\r\n * - Scope: UI-only primitive.\r\n * - Tokens-only: semantic token classes only.\r\n * - A11y: Radix handles keyboard + aria.\r\n *\r\n * Reference: shadcn `tabs.tsx`.\r\n */\r\n\r\n\"use client\"\r\n\r\nimport * as React from 'react'\r\nimport * as TabsPrimitive from '@radix-ui/react-tabs'\r\nimport { cn } from '../../lib/utils'\r\n\r\nexport type TabsRootProps = React.ComponentProps<typeof TabsPrimitive.Root>\r\nexport type TabsListProps = React.ComponentProps<typeof TabsPrimitive.List> & {\r\n /** Visual style of the tab list. */\r\n variant?: 'segmented' | 'line' | 'line-separator'\r\n}\r\nexport type TabsTriggerProps = React.ComponentProps<typeof TabsPrimitive.Trigger>\r\nexport type TabsContentProps = React.ComponentProps<typeof TabsPrimitive.Content>\r\n\r\nexport function TabsRoot({ className, ...props }: TabsRootProps) {\r\n return <TabsPrimitive.Root data-slot=\"tabs\" className={cn('flex flex-col gap-2', className)} {...props} />\r\n}\r\n\r\nexport function TabsList({ className, variant = 'segmented', ...props }: TabsListProps) {\r\n return (\r\n <TabsPrimitive.List\r\n data-slot=\"tabs-list\"\r\n data-variant={variant}\r\n className={cn(\r\n 'group inline-flex w-fit items-center justify-center',\r\n variant === 'segmented'\r\n ? // Segmented-control container (Mindtris tokens)\r\n 'bg-muted text-muted-foreground h-9 rounded-lg p-[3px]'\r\n : variant === 'line'\r\n ? // Line: no separator line behind tabs\r\n 'bg-transparent text-muted-foreground h-auto rounded-none p-0 gap-6'\r\n : // Line + separator: full-width baseline separator behind active underline\r\n 'bg-transparent text-muted-foreground h-auto rounded-none p-0 gap-6 border-b border-border w-full',\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport function TabsTrigger({ className, ...props }: TabsTriggerProps) {\r\n return (\r\n <TabsPrimitive.Trigger\r\n data-slot=\"tabs-trigger\"\r\n className={cn(\r\n 'inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-2 py-1 text-sm font-medium whitespace-nowrap',\r\n // Icon normalization (shadcn-style)\r\n \"[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\r\n 'text-muted-foreground hover:text-foreground',\r\n 'transition-colors',\r\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\r\n 'disabled:pointer-events-none disabled:opacity-50',\r\n // Active: visually merges with list; no shadow\r\n 'data-[state=active]:bg-card data-[state=active]:text-foreground data-[state=active]:border-border data-[state=active]:shadow-none',\r\n // Line variant overrides (driven by TabsList data-variant)\r\n 'group-data-[variant=line]:h-auto group-data-[variant=line]:rounded-none group-data-[variant=line]:border-0 group-data-[variant=line]:px-0 group-data-[variant=line]:py-2',\r\n 'group-data-[variant=line]:data-[state=active]:bg-transparent group-data-[variant=line]:data-[state=active]:border-b-2 group-data-[variant=line]:data-[state=active]:border-foreground',\r\n // Line + separator overrides\r\n 'group-data-[variant=line-separator]:h-auto group-data-[variant=line-separator]:rounded-none group-data-[variant=line-separator]:border-0 group-data-[variant=line-separator]:px-0 group-data-[variant=line-separator]:py-2',\r\n // Pull active underline onto baseline separator\r\n 'group-data-[variant=line-separator]:data-[state=active]:bg-transparent group-data-[variant=line-separator]:data-[state=active]:border-b-[3px] group-data-[variant=line-separator]:data-[state=active]:border-foreground group-data-[variant=line-separator]:-mb-[2px]',\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport function TabsContent({ className, ...props }: TabsContentProps) {\r\n return <TabsPrimitive.Content data-slot=\"tabs-content\" className={cn('flex-1 outline-none', className)} {...props} />\r\n}\r\n\r\n","'use client'\r\n\r\nimport React from 'react'\r\nimport { ChevronDown, ChevronUp } from 'lucide-react'\r\nimport { cn } from '../../lib/utils'\r\n\r\n/** Shared collapsible section used across Colors, Typography, Other tabs (design-system consistency) */\r\ninterface CollapsibleSectionProps {\r\n title: string\r\n open: boolean\r\n onToggle: () => void\r\n children: React.ReactNode\r\n className?: string\r\n}\r\n\r\nexport function CollapsibleSection({ title, open, onToggle, children, className }: CollapsibleSectionProps) {\r\n return (\r\n <div\r\n className={cn(\r\n 'rounded-lg border border-border bg-card overflow-hidden shadow-none',\r\n className\r\n )}\r\n >\r\n <button\r\n type=\"button\"\r\n onClick={onToggle}\r\n className=\"w-full flex items-center justify-between gap-2 px-3 py-2.5 text-left text-sm font-medium text-foreground hover:bg-muted/30 transition-colors\"\r\n >\r\n <span>{title}</span>\r\n {open ? (\r\n <ChevronUp className=\"w-4 h-4 shrink-0 text-muted-foreground\" />\r\n ) : (\r\n <ChevronDown className=\"w-4 h-4 shrink-0 text-muted-foreground\" />\r\n )}\r\n </button>\r\n {open && (\r\n <div className=\"px-3 pb-3 pt-0 space-y-3 border-t border-border/50\">\r\n {children}\r\n </div>\r\n )}\r\n </div>\r\n )\r\n}\r\n","'use client'\r\n\r\nimport * as React from 'react'\r\nimport * as CollapsiblePrimitive from '@radix-ui/react-collapsible'\r\n\r\nimport { cn } from '../../lib/utils'\r\n\r\nconst Collapsible = React.forwardRef<\r\n React.ElementRef<typeof CollapsiblePrimitive.Root>,\r\n React.ComponentProps<typeof CollapsiblePrimitive.Root>\r\n>(({ className, ...props }, ref) => (\r\n <CollapsiblePrimitive.Root\r\n ref={ref}\r\n data-slot=\"collapsible\"\r\n className={cn(className)}\r\n {...props}\r\n />\r\n))\r\nCollapsible.displayName = 'Collapsible'\r\n\r\nconst CollapsibleTrigger = React.forwardRef<\r\n React.ElementRef<typeof CollapsiblePrimitive.Trigger>,\r\n React.ComponentProps<typeof CollapsiblePrimitive.Trigger>\r\n>(({ className, ...props }, ref) => (\r\n <CollapsiblePrimitive.Trigger\r\n ref={ref}\r\n data-slot=\"collapsible-trigger\"\r\n className={cn(\r\n 'flex items-center gap-2 rounded-md text-sm font-medium text-foreground outline-none transition-colors',\r\n 'hover:bg-muted/50 hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background',\r\n 'disabled:pointer-events-none disabled:opacity-50',\r\n 'data-[state=open]:bg-muted/50',\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nCollapsibleTrigger.displayName = 'CollapsibleTrigger'\r\n\r\nconst CollapsibleContent = React.forwardRef<\r\n React.ElementRef<typeof CollapsiblePrimitive.Content>,\r\n React.ComponentProps<typeof CollapsiblePrimitive.Content>\r\n>(({ className, ...props }, ref) => (\r\n <CollapsiblePrimitive.Content\r\n ref={ref}\r\n data-slot=\"collapsible-content\"\r\n className={cn('overflow-hidden text-sm text-muted-foreground', className)}\r\n {...props}\r\n />\r\n))\r\nCollapsibleContent.displayName = 'CollapsibleContent'\r\n\r\nexport { Collapsible, CollapsibleTrigger, CollapsibleContent }\r\n","'use client'\r\n\r\nimport * as React from 'react'\r\nimport * as RechartsPrimitive from 'recharts'\r\n\r\nimport { cn } from '../../lib/utils'\r\n\r\nconst THEMES = { light: '', dark: '.dark' } as const\r\n\r\nexport type ChartConfig = {\r\n [k in string]: {\r\n label?: React.ReactNode\r\n icon?: React.ComponentType<{ className?: string }>\r\n } & (\r\n | { color?: string; theme?: never }\r\n | { color?: never; theme: Record<keyof typeof THEMES, string> }\r\n )\r\n}\r\n\r\ntype ChartContextProps = {\r\n config: ChartConfig\r\n}\r\n\r\nconst ChartContext = React.createContext<ChartContextProps | null>(null)\r\n\r\nfunction useChart() {\r\n const context = React.useContext(ChartContext)\r\n if (!context) {\r\n throw new Error('useChart must be used within a <ChartContainer />')\r\n }\r\n return context\r\n}\r\n\r\ntype ChartContainerProps = React.ComponentProps<'div'> & {\r\n config: ChartConfig\r\n children: React.ComponentProps<\r\n typeof RechartsPrimitive.ResponsiveContainer\r\n >['children']\r\n}\r\n\r\nfunction ChartContainer({\r\n id,\r\n className,\r\n children,\r\n config,\r\n ...props\r\n}: ChartContainerProps) {\r\n const uniqueId = React.useId()\r\n const chartId = `chart-${id ?? uniqueId.replace(/:/g, '')}`\r\n\r\n return (\r\n <ChartContext.Provider value={{ config }}>\r\n <div\r\n data-slot=\"chart\"\r\n data-chart={chartId}\r\n className={cn(\r\n 'flex aspect-video justify-center text-xs',\r\n '[&_.recharts-cartesian-axis-tick_text]:fill-muted-foreground',\r\n \"[&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-border/50\",\r\n '[&_.recharts-curve.recharts-tooltip-cursor]:stroke-border',\r\n \"[&_.recharts-polar-grid_[stroke='#ccc']]:stroke-border\",\r\n '[&_.recharts-radial-bar-background-sector]:fill-muted',\r\n '[&_.recharts-rectangle.recharts-tooltip-cursor]:fill-muted',\r\n \"[&_.recharts-reference-line_[stroke='#ccc']]:stroke-border\",\r\n \"[&_.recharts-dot[stroke='#fff']]:stroke-transparent\",\r\n '[&_.recharts-layer]:outline-none [&_.recharts-sector]:outline-none',\r\n \"[&_.recharts-sector[stroke='#fff']]:stroke-transparent [&_.recharts-surface]:outline-none\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n <ChartStyle id={chartId} config={config} />\r\n <RechartsPrimitive.ResponsiveContainer>\r\n {children}\r\n </RechartsPrimitive.ResponsiveContainer>\r\n </div>\r\n </ChartContext.Provider>\r\n )\r\n}\r\n\r\nfunction ChartStyle({\r\n id,\r\n config,\r\n}: {\r\n id: string\r\n config: ChartConfig\r\n}) {\r\n const colorConfig = Object.entries(config).filter(\r\n ([, item]) => item.theme || item.color\r\n )\r\n\r\n if (!colorConfig.length) {\r\n return null\r\n }\r\n\r\n return (\r\n <style\r\n dangerouslySetInnerHTML={{\r\n __html: Object.entries(THEMES)\r\n .map(\r\n ([theme, prefix]) => `\r\n${prefix} [data-chart=${id}] {\r\n${colorConfig\r\n .map(([key, itemConfig]) => {\r\n const color =\r\n itemConfig.theme?.[theme as keyof typeof itemConfig.theme] ??\r\n itemConfig.color\r\n return color ? ` --color-${key}: ${color};` : null\r\n })\r\n .filter(Boolean)\r\n .join('\\n')}\r\n}\r\n`\r\n )\r\n .join('\\n'),\r\n }}\r\n />\r\n )\r\n}\r\n\r\nconst ChartTooltip = RechartsPrimitive.Tooltip\r\n\r\ntype ChartTooltipContentProps = React.ComponentProps<\r\n typeof RechartsPrimitive.Tooltip\r\n> &\r\n React.ComponentProps<'div'> & {\r\n hideLabel?: boolean\r\n hideIndicator?: boolean\r\n indicator?: 'line' | 'dot' | 'dashed'\r\n nameKey?: string\r\n labelKey?: string\r\n }\r\n\r\nfunction getPayloadConfigFromPayload(\r\n config: ChartConfig,\r\n payload: unknown,\r\n key: string\r\n) {\r\n if (typeof payload !== 'object' || payload === null) return undefined\r\n const payloadPayload =\r\n 'payload' in payload &&\r\n typeof payload.payload === 'object' &&\r\n payload.payload !== null\r\n ? payload.payload\r\n : undefined\r\n\r\n let configLabelKey: string = key\r\n if (\r\n key in payload &&\r\n typeof (payload as Record<string, unknown>)[key] === 'string'\r\n ) {\r\n configLabelKey = (payload as Record<string, string>)[key]\r\n } else if (\r\n payloadPayload &&\r\n key in payloadPayload &&\r\n typeof (payloadPayload as Record<string, unknown>)[key] === 'string'\r\n ) {\r\n configLabelKey = (payloadPayload as Record<string, string>)[key]\r\n }\r\n\r\n return configLabelKey in config\r\n ? config[configLabelKey]\r\n : config[key as keyof typeof config]\r\n}\r\n\r\nfunction ChartTooltipContent({\r\n active,\r\n payload,\r\n className,\r\n indicator = 'dot',\r\n hideLabel = false,\r\n hideIndicator = false,\r\n label,\r\n labelFormatter,\r\n labelClassName,\r\n formatter,\r\n color,\r\n nameKey,\r\n labelKey,\r\n}: ChartTooltipContentProps) {\r\n const { config } = useChart()\r\n\r\n const tooltipLabel = React.useMemo(() => {\r\n if (hideLabel || !payload?.length) return null\r\n const [item] = payload\r\n const key = `${labelKey ?? item?.dataKey ?? item?.name ?? 'value'}`\r\n const itemConfig = getPayloadConfigFromPayload(config, item, key)\r\n const value =\r\n !labelKey && typeof label === 'string'\r\n ? config[label]?.label ?? label\r\n : itemConfig?.label\r\n\r\n if (labelFormatter) {\r\n return (\r\n <div className={cn('font-medium', labelClassName)}>\r\n {labelFormatter(value, payload)}\r\n </div>\r\n )\r\n }\r\n if (!value) return null\r\n return <div className={cn('font-medium', labelClassName)}>{value}</div>\r\n }, [label, labelFormatter, payload, hideLabel, labelClassName, config, labelKey])\r\n\r\n if (!active || !payload?.length) return null\r\n\r\n const nestLabel = payload.length === 1 && indicator !== 'dot'\r\n\r\n return (\r\n <div\r\n className={cn(\r\n 'grid min-w-[8rem] items-start gap-1.5 rounded-lg border border-border/50 bg-background px-2.5 py-1.5 text-xs shadow-xl',\r\n className\r\n )}\r\n >\r\n {!nestLabel ? tooltipLabel : null}\r\n <div className=\"grid gap-1.5\">\r\n {payload.map((item, index) => {\r\n const key = `${nameKey ?? item.name ?? item.dataKey ?? 'value'}`\r\n const itemConfig = getPayloadConfigFromPayload(config, item, key)\r\n const indicatorColor =\r\n color ?? (item.payload?.fill as string) ?? item.color\r\n\r\n return (\r\n <div\r\n key={String(item.dataKey)}\r\n className={cn(\r\n 'flex w-full flex-wrap items-stretch gap-2 [&>svg]:size-2.5 [&>svg]:text-muted-foreground',\r\n indicator === 'dot' && 'items-center'\r\n )}\r\n >\r\n {formatter &&\r\n item?.value !== undefined &&\r\n item.name !== undefined ? (\r\n formatter(item.value, item.name, item, index, item.payload)\r\n ) : (\r\n <>\r\n {itemConfig?.icon ? (\r\n <itemConfig.icon />\r\n ) : (\r\n !hideIndicator && (\r\n <div\r\n className={cn(\r\n 'shrink-0 rounded-[2px] border border-[var(--color-border)] bg-[var(--color-bg)]',\r\n indicator === 'dot' && 'size-2.5',\r\n indicator === 'line' && 'w-1',\r\n indicator === 'dashed' &&\r\n 'w-0 border-[1.5px] border-dashed bg-transparent',\r\n nestLabel && indicator === 'dashed' && 'my-0.5'\r\n )}\r\n style={\r\n {\r\n '--color-bg': indicatorColor,\r\n '--color-border': indicatorColor,\r\n } as React.CSSProperties\r\n }\r\n />\r\n )\r\n )}\r\n <div\r\n className={cn(\r\n 'flex flex-1 justify-between leading-none',\r\n nestLabel ? 'items-end' : 'items-center'\r\n )}\r\n >\r\n <div className=\"grid gap-1.5\">\r\n {nestLabel ? tooltipLabel : null}\r\n <span className=\"text-muted-foreground\">\r\n {itemConfig?.label ?? item.name}\r\n </span>\r\n </div>\r\n {item.value != null && (\r\n <span className=\"font-mono font-medium tabular-nums text-foreground\">\r\n {Number(item.value).toLocaleString()}\r\n </span>\r\n )}\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n )\r\n })}\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\nconst ChartLegend = RechartsPrimitive.Legend\r\n\r\ntype ChartLegendContentProps = React.ComponentProps<'div'> &\r\n Pick<RechartsPrimitive.LegendProps, 'payload' | 'verticalAlign'> & {\r\n hideIcon?: boolean\r\n nameKey?: string\r\n }\r\n\r\nfunction ChartLegendContent({\r\n className,\r\n hideIcon = false,\r\n payload,\r\n verticalAlign = 'bottom',\r\n nameKey,\r\n}: ChartLegendContentProps) {\r\n const { config } = useChart()\r\n\r\n if (!payload?.length) return null\r\n\r\n return (\r\n <div\r\n className={cn(\r\n 'flex items-center justify-center gap-4',\r\n verticalAlign === 'top' ? 'pb-3' : 'pt-3',\r\n className\r\n )}\r\n >\r\n {payload.map((item) => {\r\n const key = `${nameKey ?? item.dataKey ?? 'value'}`\r\n const itemConfig = getPayloadConfigFromPayload(config, item, key)\r\n\r\n return (\r\n <div\r\n key={String(item.value)}\r\n className=\"flex items-center gap-1.5 [&>svg]:size-3 [&>svg]:text-muted-foreground\"\r\n >\r\n {itemConfig?.icon && !hideIcon ? (\r\n <itemConfig.icon />\r\n ) : (\r\n <div\r\n className=\"size-2 shrink-0 rounded-[2px]\"\r\n style={{ backgroundColor: item.color }}\r\n />\r\n )}\r\n {itemConfig?.label}\r\n </div>\r\n )\r\n })}\r\n </div>\r\n )\r\n}\r\n\r\nexport {\r\n ChartContainer,\r\n ChartTooltip,\r\n ChartTooltipContent,\r\n ChartLegend,\r\n ChartLegendContent,\r\n ChartStyle,\r\n}\r\n","'use client'\r\n\r\nimport * as React from 'react'\r\nimport { Slot } from '@radix-ui/react-slot'\r\nimport {\r\n Controller,\r\n FormProvider,\r\n useFormContext,\r\n useFormState,\r\n type ControllerProps,\r\n type FieldPath,\r\n type FieldValues,\r\n} from 'react-hook-form'\r\n\r\nimport { cn } from '../../lib/utils'\r\nimport { Label } from './label'\r\n\r\nconst Form = FormProvider\r\n\r\ntype FormFieldContextValue<\r\n TFieldValues extends FieldValues = FieldValues,\r\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\r\n> = {\r\n name: TName\r\n}\r\n\r\nconst FormFieldContext = React.createContext<FormFieldContextValue | null>(null)\r\n\r\nfunction FormField<\r\n TFieldValues extends FieldValues = FieldValues,\r\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\r\n>(props: ControllerProps<TFieldValues, TName>) {\r\n return (\r\n <FormFieldContext.Provider value={{ name: props.name }}>\r\n <Controller {...props} />\r\n </FormFieldContext.Provider>\r\n )\r\n}\r\n\r\ntype FormItemContextValue = {\r\n id: string\r\n}\r\n\r\nconst FormItemContext = React.createContext<FormItemContextValue | null>(null)\r\n\r\nfunction useFormField() {\r\n const fieldContext = React.useContext(FormFieldContext)\r\n const itemContext = React.useContext(FormItemContext)\r\n const { getFieldState } = useFormContext()\r\n const formState = useFormState({ name: fieldContext?.name })\r\n const fieldState = getFieldState(fieldContext?.name ?? ('' as FieldPath<FieldValues>), formState)\r\n\r\n if (!fieldContext) {\r\n throw new Error('useFormField must be used within <FormField>')\r\n }\r\n\r\n const id = itemContext?.id ?? ''\r\n\r\n return {\r\n id,\r\n name: fieldContext.name,\r\n formItemId: `${id}-form-item`,\r\n formDescriptionId: `${id}-form-item-description`,\r\n formMessageId: `${id}-form-item-message`,\r\n ...fieldState,\r\n }\r\n}\r\n\r\nfunction FormItem({ className, ...props }: React.ComponentProps<'div'>) {\r\n const id = React.useId()\r\n\r\n return (\r\n <FormItemContext.Provider value={{ id }}>\r\n <div\r\n data-slot=\"form-item\"\r\n className={cn('grid gap-2', className)}\r\n {...props}\r\n />\r\n </FormItemContext.Provider>\r\n )\r\n}\r\n\r\nfunction FormLabel({\r\n className,\r\n ...props\r\n}: React.ComponentProps<typeof Label>) {\r\n const { error, formItemId } = useFormField()\r\n\r\n return (\r\n <Label\r\n data-slot=\"form-label\"\r\n data-error={!!error}\r\n className={cn('data-[error=true]:text-destructive', className)}\r\n htmlFor={formItemId}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nfunction FormControl(props: React.ComponentProps<typeof Slot>) {\r\n const { error, formItemId, formDescriptionId, formMessageId } = useFormField()\r\n\r\n return (\r\n <Slot\r\n data-slot=\"form-control\"\r\n id={formItemId}\r\n aria-describedby={\r\n !error ? formDescriptionId : `${formDescriptionId} ${formMessageId}`\r\n }\r\n aria-invalid={!!error}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nfunction FormDescription({\r\n className,\r\n ...props\r\n}: React.ComponentProps<'p'>) {\r\n const { formDescriptionId } = useFormField()\r\n\r\n return (\r\n <p\r\n data-slot=\"form-description\"\r\n id={formDescriptionId}\r\n className={cn('text-sm text-muted-foreground', className)}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nfunction FormMessage({ className, ...props }: React.ComponentProps<'p'>) {\r\n const { error, formMessageId } = useFormField()\r\n const body = error ? String(error?.message ?? '') : props.children\r\n\r\n if (!body) {\r\n return null\r\n }\r\n\r\n return (\r\n <p\r\n data-slot=\"form-message\"\r\n id={formMessageId}\r\n className={cn('text-sm text-destructive', className)}\r\n {...props}\r\n >\r\n {body}\r\n </p>\r\n )\r\n}\r\n\r\nexport {\r\n useFormField,\r\n Form,\r\n FormItem,\r\n FormLabel,\r\n FormControl,\r\n FormDescription,\r\n FormMessage,\r\n FormField,\r\n}\r\n","'use client'\r\n\r\nimport * as React from 'react'\r\nimport * as NavigationMenuPrimitive from '@radix-ui/react-navigation-menu'\r\n\r\nimport { cn } from '../../lib/utils'\r\n\r\nfunction NavigationMenuRoot({\r\n className,\r\n children,\r\n viewport = true,\r\n ...props\r\n}: React.ComponentProps<typeof NavigationMenuPrimitive.Root> & {\r\n viewport?: boolean\r\n}) {\r\n return (\r\n <NavigationMenuPrimitive.Root\r\n data-slot=\"navigation-menu\"\r\n data-viewport={viewport}\r\n className={cn(\r\n 'relative flex max-w-max flex-1 items-center justify-center',\r\n className\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n {viewport ? <NavigationMenuViewport /> : null}\r\n </NavigationMenuPrimitive.Root>\r\n )\r\n}\r\n\r\nfunction NavigationMenuList({\r\n className,\r\n ...props\r\n}: React.ComponentProps<typeof NavigationMenuPrimitive.List>) {\r\n return (\r\n <NavigationMenuPrimitive.List\r\n data-slot=\"navigation-menu-list\"\r\n className={cn(\r\n 'group flex flex-1 list-none items-center justify-center gap-1',\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nfunction NavigationMenuItem({\r\n className,\r\n ...props\r\n}: React.ComponentProps<typeof NavigationMenuPrimitive.Item>) {\r\n return (\r\n <NavigationMenuPrimitive.Item\r\n data-slot=\"navigation-menu-item\"\r\n className={cn('relative', className)}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nconst navigationMenuTriggerClass =\r\n 'inline-flex h-9 w-max items-center justify-center rounded-md bg-background px-4 py-2 text-sm font-medium transition-colors outline-none hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-50 data-[state=open]:bg-accent/50 data-[state=open]:text-accent-foreground'\r\n\r\nfunction NavigationMenuTrigger({\r\n className,\r\n children,\r\n ...props\r\n}: React.ComponentProps<typeof NavigationMenuPrimitive.Trigger>) {\r\n return (\r\n <NavigationMenuPrimitive.Trigger\r\n data-slot=\"navigation-menu-trigger\"\r\n className={cn(navigationMenuTriggerClass, 'group gap-1', className)}\r\n {...props}\r\n >\r\n {children}\r\n <ChevronIcon\r\n className=\"relative size-3 transition-transform duration-200 group-data-[state=open]:rotate-180\"\r\n aria-hidden\r\n />\r\n </NavigationMenuPrimitive.Trigger>\r\n )\r\n}\r\n\r\nfunction ChevronIcon({\r\n className,\r\n ...props\r\n}: React.SVGAttributes<SVGSVGElement>) {\r\n return (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className={cn('shrink-0', className)}\r\n {...props}\r\n >\r\n <path d=\"m6 9 6 6 6-6\" />\r\n </svg>\r\n )\r\n}\r\n\r\nfunction NavigationMenuContent({\r\n className,\r\n ...props\r\n}: React.ComponentProps<typeof NavigationMenuPrimitive.Content>) {\r\n return (\r\n <NavigationMenuPrimitive.Content\r\n data-slot=\"navigation-menu-content\"\r\n className={cn(\r\n 'left-0 top-0 w-full p-2 md:absolute md:w-auto',\r\n 'data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95',\r\n 'data-[motion^=from-]:animate-in data-[motion^=to-]:animate-out data-[motion^=from-]:fade-in data-[motion^=to-]:fade-out data-[motion=from-end]:slide-in-from-right-52 data-[motion=from-start]:slide-in-from-left-52 data-[motion=to-end]:slide-out-to-right-52 data-[motion=to-start]:slide-out-to-left-52',\r\n 'group-data-[viewport=false]/navigation-menu:mt-1.5 group-data-[viewport=false]/navigation-menu:overflow-hidden group-data-[viewport=false]/navigation-menu:rounded-md group-data-[viewport=false]/navigation-menu:border group-data-[viewport=false]/navigation-menu:border-border group-data-[viewport=false]/navigation-menu:bg-popover group-data-[viewport=false]/navigation-menu:text-popover-foreground group-data-[viewport=false]/navigation-menu:shadow-md',\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nfunction NavigationMenuViewport({\r\n className,\r\n ...props\r\n}: React.ComponentProps<typeof NavigationMenuPrimitive.Viewport>) {\r\n return (\r\n <div className=\"absolute left-0 top-full z-50 flex justify-center\">\r\n <NavigationMenuPrimitive.Viewport\r\n data-slot=\"navigation-menu-viewport\"\r\n className={cn(\r\n 'relative mt-1.5 h-[var(--radix-navigation-menu-viewport-height)] w-full overflow-hidden rounded-md border border-border bg-popover text-popover-foreground shadow-md',\r\n 'data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-90',\r\n 'md:w-[var(--radix-navigation-menu-viewport-width)]',\r\n className\r\n )}\r\n {...props}\r\n />\r\n </div>\r\n )\r\n}\r\n\r\nfunction NavigationMenuLink({\r\n className,\r\n ...props\r\n}: React.ComponentProps<typeof NavigationMenuPrimitive.Link>) {\r\n return (\r\n <NavigationMenuPrimitive.Link\r\n data-slot=\"navigation-menu-link\"\r\n className={cn(\r\n 'flex flex-col gap-1 rounded-sm p-2 text-sm outline-none transition-colors',\r\n 'hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background',\r\n 'data-[active=true]:bg-accent/50 data-[active=true]:text-accent-foreground',\r\n '[&_svg]:size-4 [&_svg]:shrink-0 [&_svg]:text-muted-foreground',\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nfunction NavigationMenuIndicator({\r\n className,\r\n ...props\r\n}: React.ComponentProps<typeof NavigationMenuPrimitive.Indicator>) {\r\n return (\r\n <NavigationMenuPrimitive.Indicator\r\n data-slot=\"navigation-menu-indicator\"\r\n className={cn(\r\n 'top-full z-[1] flex h-1.5 items-end justify-center overflow-hidden',\r\n 'data-[state=visible]:animate-in data-[state=hidden]:animate-out data-[state=hidden]:fade-out data-[state=visible]:fade-in',\r\n className\r\n )}\r\n {...props}\r\n >\r\n <div className=\"relative top-[60%] size-2 rotate-45 rounded-tl-sm border-border bg-border shadow-md\" />\r\n </NavigationMenuPrimitive.Indicator>\r\n )\r\n}\r\n\r\nexport {\r\n NavigationMenuRoot as NavigationMenu,\r\n NavigationMenuList,\r\n NavigationMenuItem,\r\n NavigationMenuContent,\r\n NavigationMenuTrigger,\r\n NavigationMenuLink,\r\n NavigationMenuIndicator,\r\n NavigationMenuViewport,\r\n navigationMenuTriggerClass,\r\n}\r\n","\"use client\"\r\n\r\nimport { useTheme } from 'next-themes'\r\nimport { Moon } from 'lucide-react'\r\nimport { cn } from '../../lib/utils'\r\nimport { createIcon } from './icon'\r\n\r\nexport function ThemeToggleIcon() {\r\n const { theme, setTheme } = useTheme()\r\n\r\n return (\r\n <div>\r\n <input\r\n type=\"checkbox\"\r\n name=\"light-switch\"\r\n id=\"light-switch\"\r\n className=\"light-switch sr-only\"\r\n checked={theme === 'light'}\r\n onChange={() => {\r\n if (theme === 'dark') {\r\n return setTheme('light')\r\n }\r\n return setTheme('dark')\r\n }}\r\n />\r\n <label\r\n className={cn(\r\n 'flex items-center justify-center cursor-pointer w-8 h-8 rounded-full transition-colors',\r\n 'hover:bg-muted'\r\n )}\r\n htmlFor=\"light-switch\"\r\n >\r\n {createIcon(Moon, { size: 16, strokeWidth: 2.25, className: 'text-muted-foreground' })}\r\n <span className=\"sr-only\">Switch to light / dark version</span>\r\n </label>\r\n </div>\r\n )\r\n}\r\n","\"use client\"\r\n\r\nimport * as React from 'react'\r\nimport { LucideIcon } from 'lucide-react'\r\nimport { cn } from '../../lib/utils'\r\nimport { ICON_DEFAULT_SIZE, ICON_DEFAULT_STROKE_WIDTH, ICON_SIZES, type IconSize } from '../../lib/icon-constants'\r\n\r\nexport interface IconProps extends React.SVGProps<SVGSVGElement> {\r\n /** Lucide icon component */\r\n icon: LucideIcon\r\n /** Icon size - defaults to 'md' (16px) */\r\n size?: IconSize | number\r\n /** Stroke width - defaults to 1.5 */\r\n strokeWidth?: number\r\n /** Additional className */\r\n className?: string\r\n}\r\n\r\n/**\r\n * Centralized Icon component for consistent styling across the design system\r\n * \r\n * Ensures all icons have consistent stroke width and sizing.\r\n * \r\n * @example\r\n * ```tsx\r\n * import { Icon } from '@mindtris/design-system'\r\n * import { GitCompareArrows } from 'lucide-react'\r\n * \r\n * <Icon icon={GitCompareArrows} size=\"md\" />\r\n * ```\r\n */\r\nexport function Icon({\r\n icon: IconComponent,\r\n size = 'md',\r\n strokeWidth = ICON_DEFAULT_STROKE_WIDTH,\r\n className,\r\n ...props\r\n}: IconProps) {\r\n const sizeValue = typeof size === 'number' ? size : ICON_SIZES[size]\r\n \r\n return (\r\n <IconComponent\r\n className={cn('shrink-0', className)}\r\n size={sizeValue}\r\n strokeWidth={strokeWidth}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\n/**\r\n * Helper function to create an icon element with consistent styling\r\n * Useful for inline usage where you want to pass the icon directly\r\n * \r\n * @example\r\n * ```tsx\r\n * import { createIcon } from '@mindtris/design-system'\r\n * import { GitCompareArrows } from 'lucide-react'\r\n * \r\n * const icon = createIcon(GitCompareArrows, { size: 'md' })\r\n * ```\r\n */\r\nexport function createIcon(\r\n IconComponent: LucideIcon,\r\n options: {\r\n size?: IconSize | number\r\n strokeWidth?: number\r\n className?: string\r\n } = {}\r\n): React.ReactElement {\r\n const {\r\n size = 'md',\r\n strokeWidth = ICON_DEFAULT_STROKE_WIDTH,\r\n className,\r\n } = options\r\n\r\n const sizeValue = typeof size === 'number' ? size : ICON_SIZES[size]\r\n\r\n return (\r\n <IconComponent\r\n className={cn('shrink-0', className)}\r\n size={sizeValue}\r\n strokeWidth={strokeWidth}\r\n />\r\n )\r\n}\r\n","/**\r\n * Icon constants for consistent styling across the design system\r\n */\r\n\r\nexport const ICON_DEFAULT_SIZE = 16 // 16px = h-4 w-4\r\nexport const ICON_DEFAULT_STROKE_WIDTH = 2.25 // Icon stroke width\r\n\r\nexport const ICON_SIZES = {\r\n xs: 12, // h-3 w-3\r\n sm: 14, // h-3.5 w-3.5\r\n md: 16, // h-4 w-4 (default)\r\n lg: 20, // h-5 w-5\r\n xl: 24, // h-6 w-6\r\n} as const\r\n\r\nexport type IconSize = keyof typeof ICON_SIZES\r\n","/**\r\n * Kbd: Keyboard shortcut display.\r\n *\r\n * Design-system contract:\r\n * - Scope: UI-only primitive. No domain copy.\r\n * - Tokens-only: semantic token classes only.\r\n * - Composition: renders <kbd> with token styling.\r\n *\r\n * @author: @mindtris-team\r\n * @version: 0.1.0\r\n * @since: 2026-02-05\r\n */\r\n\r\n\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport { cn } from \"../../lib/utils\"\r\n\r\nexport interface KbdProps extends React.HTMLAttributes<HTMLElement> {\r\n /** Size variant. */\r\n size?: \"sm\" | \"default\" | \"lg\"\r\n}\r\n\r\nconst sizeClasses = {\r\n sm: \"px-1.5 py-0.5 text-[10px]\",\r\n default: \"px-2 py-1 text-xs\",\r\n lg: \"px-2.5 py-1.5 text-sm\",\r\n}\r\n\r\nexport const Kbd = React.forwardRef<HTMLElement, KbdProps>(\r\n ({ className, size = \"default\", children, ...props }, ref) => {\r\n return (\r\n <kbd\r\n ref={ref as React.Ref<HTMLSpanElement>}\r\n data-slot=\"kbd\"\r\n data-size={size}\r\n className={cn(\r\n \"inline-flex items-center justify-center rounded border font-mono font-medium\",\r\n \"border-border bg-muted text-muted-foreground\",\r\n \"shadow-[0_1px_0_0_var(--border)]\",\r\n sizeClasses[size],\r\n className\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n </kbd>\r\n )\r\n }\r\n)\r\nKbd.displayName = \"Kbd\"\r\n","\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport * as ScrollAreaPrimitive from \"@radix-ui/react-scroll-area\"\r\n\r\nimport { cn } from \"../../lib/utils\"\r\n\r\nexport type ScrollAreaProps = React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Root>\r\nexport type ScrollAreaViewportProps = React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Viewport>\r\nexport type ScrollBarProps = React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Scrollbar>\r\n\r\nfunction isHorizontalScrollBar(child: React.ReactNode): boolean {\r\n return (\r\n React.isValidElement(child) &&\r\n child.type === ScrollBar &&\r\n (child.props as { orientation?: string }).orientation === \"horizontal\"\r\n )\r\n}\r\n\r\n/**\r\n * ScrollArea\r\n * Token-styled scroll container with Radix primitives. Vertical scroll by default.\r\n * Add <ScrollBar orientation=\"horizontal\" /> as a child for horizontal scroll (shadcn-style composition).\r\n */\r\nexport const ScrollArea = React.forwardRef<\r\n React.ElementRef<typeof ScrollAreaPrimitive.Root>,\r\n ScrollAreaProps\r\n>(({ className, children, ...props }, ref) => {\r\n const childList = React.Children.toArray(children)\r\n const viewportChildren = childList.filter((c) => !isHorizontalScrollBar(c))\r\n const horizontalBars = childList.filter((c) => isHorizontalScrollBar(c))\r\n return (\r\n <ScrollAreaPrimitive.Root\r\n ref={ref}\r\n data-slot=\"scroll-area\"\r\n className={cn(\"relative overflow-hidden\", className)}\r\n {...props}\r\n >\r\n <ScrollAreaPrimitive.Viewport\r\n data-slot=\"scroll-area-viewport\"\r\n className=\"h-full w-full rounded-[inherit]\"\r\n >\r\n {viewportChildren}\r\n </ScrollAreaPrimitive.Viewport>\r\n <ScrollBar />\r\n {horizontalBars}\r\n <ScrollAreaPrimitive.Corner data-slot=\"scroll-area-corner\" />\r\n </ScrollAreaPrimitive.Root>\r\n )\r\n})\r\nScrollArea.displayName = \"ScrollArea\"\r\n\r\nexport const ScrollBar = React.forwardRef<\r\n React.ElementRef<typeof ScrollAreaPrimitive.Scrollbar>,\r\n ScrollBarProps\r\n>(({ className, orientation = \"vertical\", ...props }, ref) => (\r\n <ScrollAreaPrimitive.Scrollbar\r\n ref={ref}\r\n data-slot=\"scroll-area-scrollbar\"\r\n orientation={orientation}\r\n className={cn(\r\n \"flex touch-none select-none p-0.5 transition-colors\",\r\n orientation === \"vertical\"\r\n ? \"h-full w-2 border-l border-l-transparent\"\r\n : \"h-2 flex-col border-t border-t-transparent\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n <ScrollAreaPrimitive.Thumb\r\n data-slot=\"scroll-area-thumb\"\r\n className={cn(\r\n \"relative flex-1 rounded-full bg-border hover:bg-muted-foreground/50\"\r\n )}\r\n />\r\n </ScrollAreaPrimitive.Scrollbar>\r\n))\r\nScrollBar.displayName = \"ScrollBar\"\r\n\r\n","\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport { Group, Panel, Separator } from \"react-resizable-panels\"\r\nimport { GripVertical } from \"lucide-react\"\r\n\r\nimport { cn } from \"../../lib/utils\"\r\n\r\nexport type ResizablePanelGroupProps = React.ComponentPropsWithoutRef<\r\n typeof Group\r\n> & {\r\n /**\r\n * Alias for `orientation`.\r\n * Kept for familiarity with other design systems.\r\n */\r\n direction?: \"horizontal\" | \"vertical\"\r\n}\r\n\r\nexport type ResizablePanelProps = React.ComponentPropsWithoutRef<typeof Panel>\r\n\r\nexport type ResizableHandleProps = React.ComponentPropsWithoutRef<typeof Separator> & {\r\n /** Renders a visible grab handle affordance. */\r\n withHandle?: boolean\r\n}\r\n\r\nexport function ResizablePanelGroup({\r\n className,\r\n direction = \"horizontal\",\r\n orientation: orientationProp,\r\n ...props\r\n}: ResizablePanelGroupProps) {\r\n const orientation = orientationProp ?? direction\r\n\r\n return (\r\n <Group\r\n data-slot=\"resizable-panel-group\"\r\n className={cn(\r\n \"flex h-full w-full\",\r\n orientation === \"vertical\" ? \"flex-col\" : \"flex-row\",\r\n className\r\n )}\r\n orientation={orientation}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport function ResizablePanel({ className, ...props }: ResizablePanelProps) {\r\n return <Panel data-slot=\"resizable-panel\" className={cn(className)} {...props} />\r\n}\r\n\r\nexport const ResizableHandle = React.forwardRef<\r\n React.ElementRef<typeof Separator>,\r\n ResizableHandleProps\r\n>(({ className, withHandle = false, ...props }, ref) => {\r\n return (\r\n <Separator\r\n elementRef={ref}\r\n data-slot=\"resizable-handle\"\r\n className={cn(\r\n \"relative flex items-center justify-center bg-border\",\r\n // react-resizable-panels sets `data-orientation` on Separator\r\n \"data-[orientation=vertical]:w-px data-[orientation=vertical]:h-full\",\r\n \"data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full\",\r\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n {withHandle ? (\r\n <div\r\n data-slot=\"resizable-handle-grip\"\r\n className={cn(\r\n \"z-10 flex h-4 w-3 items-center justify-center rounded-sm border border-border bg-card\",\r\n \"data-[orientation=horizontal]:h-3 data-[orientation=horizontal]:w-4\"\r\n )}\r\n >\r\n <GripVertical\r\n className={cn(\r\n \"h-3 w-3 text-muted-foreground\",\r\n \"data-[orientation=horizontal]:rotate-90\"\r\n )}\r\n aria-hidden\r\n />\r\n </div>\r\n ) : null}\r\n </Separator>\r\n )\r\n})\r\nResizableHandle.displayName = \"ResizableHandle\"\r\n\r\n","/**\r\n * Typography: Text and heading primitives with semantic levels.\r\n *\r\n * Design-system contract:\r\n * - Scope: UI-only primitive. No domain copy.\r\n * - Tokens-only: semantic token classes only.\r\n * - Composition: Text, H1-H6, Lead, Small, Muted.\r\n *\r\n * @author: @mindtris-team\r\n * @version: 0.1.0\r\n * @since: 2026-02-05\r\n */\r\n\r\n\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport { cn } from \"../../lib/utils\"\r\n\r\nexport interface TextProps extends React.HTMLAttributes<HTMLParagraphElement> {\r\n /** Semantic variant. */\r\n variant?: \"default\" | \"lead\" | \"small\" | \"muted\"\r\n}\r\n\r\nexport function Text({\r\n variant = \"default\",\r\n className,\r\n as: Component = \"p\",\r\n ...props\r\n}: TextProps & { as?: React.ElementType }) {\r\n return (\r\n <Component\r\n data-slot=\"text\"\r\n data-variant={variant}\r\n className={cn(\r\n \"text-sm text-foreground\",\r\n variant === \"lead\" && \"text-base text-muted-foreground\",\r\n variant === \"small\" && \"text-xs text-foreground\",\r\n variant === \"muted\" && \"text-sm text-muted-foreground\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport type HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6\r\n\r\nexport interface HeadingProps extends React.HTMLAttributes<HTMLHeadingElement> {\r\n /** Semantic level (maps to h1–h6). */\r\n level?: HeadingLevel\r\n}\r\n\r\nconst headingClasses: Record<HeadingLevel, string> = {\r\n 1: \"text-3xl font-bold tracking-tight sm:text-4xl\",\r\n 2: \"text-2xl font-semibold tracking-tight sm:text-3xl\",\r\n 3: \"text-xl font-semibold tracking-tight sm:text-2xl\",\r\n 4: \"text-lg font-semibold\",\r\n 5: \"text-base font-semibold\",\r\n 6: \"text-sm font-semibold\",\r\n}\r\n\r\nexport function Heading({\r\n level = 1,\r\n className,\r\n as,\r\n ...props\r\n}: HeadingProps & { as?: React.ElementType }) {\r\n const Tag = as ?? (`h${level}` as keyof React.JSX.IntrinsicElements)\r\n return (\r\n <Tag\r\n data-slot=\"heading\"\r\n data-level={level}\r\n className={cn(\"text-foreground\", headingClasses[level], className)}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\n/** Lead paragraph: larger, muted. */\r\nexport function Lead({ className, ...props }: React.HTMLAttributes<HTMLParagraphElement>) {\r\n return (\r\n <p\r\n data-slot=\"lead\"\r\n className={cn(\"text-base text-muted-foreground\", className)}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\n/** Small text. */\r\nexport function Small({ className, ...props }: React.HTMLAttributes<HTMLSpanElement>) {\r\n return (\r\n <span\r\n data-slot=\"small\"\r\n className={cn(\"text-xs text-foreground\", className)}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\n/** Muted text. */\r\nexport function Muted({ className, ...props }: React.HTMLAttributes<HTMLSpanElement>) {\r\n return (\r\n <span\r\n data-slot=\"muted\"\r\n className={cn(\"text-sm text-muted-foreground\", className)}\r\n {...props}\r\n />\r\n )\r\n}\r\n","/**\r\n * Toggle: Single toggleable control.\r\n *\r\n * Design-system contract\r\n * - Scope: UI-only primitive.\r\n * - Tokens-only: semantic token classes only.\r\n * - A11y: uses `aria-pressed`.\r\n *\r\n * Reference: shadcn `toggle.tsx` (Radix Toggle + variants).\r\n */\r\n\r\n\"use client\"\r\n\r\nimport * as React from 'react'\r\nimport * as TogglePrimitive from '@radix-ui/react-toggle'\r\nimport { cn } from '../../lib/utils'\r\nimport { createVariants } from '../../lib/variant-utils'\r\n\r\nexport type ToggleVariant = 'default' | 'outline'\r\nexport type ToggleSize = 'default' | 'sm' | 'lg'\r\nexport type ToggleActiveVariant = 'primary' | 'secondary' | 'tertiary'\r\n\r\nconst toggleVariants = createVariants({\r\n base:\r\n 'inline-flex items-center justify-center gap-2 rounded-md text-sm font-medium whitespace-nowrap ' +\r\n // Icon normalization (shadcn-style)\r\n '[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*=\"size-\"])]:size-4 ' +\r\n 'transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring ' +\r\n 'disabled:pointer-events-none disabled:opacity-50 ' +\r\n 'hover:bg-muted hover:text-foreground',\r\n variants: {\r\n variant: {\r\n default: 'bg-transparent border border-transparent',\r\n outline: 'border border-input bg-transparent',\r\n },\r\n size: {\r\n default: 'h-9 px-2 min-w-9',\r\n sm: 'h-8 px-1.5 min-w-8',\r\n lg: 'h-10 px-2.5 min-w-10',\r\n },\r\n activeVariant: {\r\n primary: 'data-[state=on]:bg-primary data-[state=on]:text-primary-foreground',\r\n secondary: 'data-[state=on]:bg-secondary data-[state=on]:text-secondary-foreground',\r\n tertiary: 'data-[state=on]:bg-tertiary data-[state=on]:text-tertiary-foreground',\r\n },\r\n },\r\n defaultVariants: {\r\n variant: 'default',\r\n size: 'default',\r\n activeVariant: 'primary',\r\n },\r\n})\r\n\r\nexport interface ToggleProps\r\n extends React.ComponentPropsWithoutRef<typeof TogglePrimitive.Root> {\r\n variant?: ToggleVariant\r\n size?: ToggleSize\r\n /** Which semantic color to use when pressed. */\r\n activeVariant?: ToggleActiveVariant\r\n}\r\n\r\nexport const Toggle = React.forwardRef<\r\n React.ElementRef<typeof TogglePrimitive.Root>,\r\n ToggleProps\r\n>(({ className, variant = 'default', size = 'default', activeVariant = 'primary', ...props }, ref) => {\r\n return (\r\n <TogglePrimitive.Root\r\n ref={ref}\r\n data-slot=\"toggle\"\r\n className={cn(toggleVariants({ variant, size, activeVariant }), className)}\r\n {...props}\r\n />\r\n )\r\n})\r\nToggle.displayName = 'Toggle'\r\n\r\nexport { toggleVariants }\r\n\r\n","/**\r\n * Sonner Toaster (shadcn-style).\r\n *\r\n * Design-system contract\r\n * - Scope: UI-only primitive.\r\n * - Tokens-only: ties toast colors to CSS variables.\r\n *\r\n * Reference: shadcn `sonner.tsx`.\r\n */\r\n\r\n\"use client\"\r\n\r\nimport * as React from 'react'\r\nimport { useTheme } from 'next-themes'\r\nimport { Toaster as SonnerToaster, toast as sonnerToast, type ToasterProps as SonnerToasterProps } from 'sonner'\r\nimport { AlertTriangle, CheckCircle2, Info, Loader2, ServerCrash, X } from 'lucide-react'\r\n\r\nimport { cn } from '../../lib/utils'\r\n\r\nexport type ToasterVariant = 'default' | 'soft' | 'solid'\r\nexport type ToasterProps = SonnerToasterProps & {\r\n /**\r\n * Visual style for semantic \"type\" toasts (success/info/warning/error).\r\n * - default: neutral surface, regular text\r\n * - soft: light token color background, dark token text\r\n * - solid: strong token color background, white token text\r\n */\r\n variant?: ToasterVariant\r\n}\r\n\r\nexport function Toaster(props: ToasterProps) {\r\n const { theme = 'system' } = useTheme()\r\n const {\r\n className,\r\n toastOptions,\r\n offset,\r\n mobileOffset,\r\n gap,\r\n visibleToasts,\r\n richColors,\r\n closeButton,\r\n icons,\r\n variant = 'default',\r\n ...rest\r\n } = props\r\n\r\n const resolvedRichColors =\r\n richColors ?? (variant === 'default' ? false : true)\r\n\r\n // Base semantic colors (token-driven).\r\n // Themes can optionally provide --success/--warning for explicit tones.\r\n const colorVars =\r\n variant === 'solid'\r\n ? [\r\n // Solid (filled)\r\n // Sonner defines its own defaults for these vars with fairly high specificity.\r\n // Use `!` so token values always win.\r\n // In solid style, border should be visually minimal (match Mindtris UI solid toasts).\r\n \"![--success-bg:var(--success,var(--chart-2,var(--accent)))] ![--success-text:var(--primary-foreground)] ![--success-border:transparent]\",\r\n \"![--info-bg:var(--primary)] ![--info-text:var(--primary-foreground)] ![--info-border:transparent]\",\r\n \"![--warning-bg:var(--warning,var(--chart-3,var(--secondary)))] ![--warning-text:var(--primary-foreground)] ![--warning-border:transparent]\",\r\n \"![--error-bg:var(--destructive)] ![--error-text:var(--destructive-foreground)] ![--error-border:transparent]\",\r\n ]\r\n : variant === 'soft'\r\n ? [\r\n // Soft (tinted). Uses popover as the base surface.\r\n \"![--success-bg:color-mix(in srgb, var(--success,var(--chart-2,var(--accent))) 18%, var(--popover))] ![--success-text:var(--foreground)] ![--success-border:var(--border)]\",\r\n \"![--info-bg:color-mix(in srgb, var(--primary) 18%, var(--popover))] ![--info-text:var(--foreground)] ![--info-border:var(--border)]\",\r\n \"![--warning-bg:color-mix(in srgb, var(--warning,var(--chart-3,var(--secondary))) 18%, var(--popover))] ![--warning-text:var(--foreground)] ![--warning-border:var(--border)]\",\r\n \"![--error-bg:color-mix(in srgb, var(--destructive) 12%, var(--popover))] ![--error-text:var(--foreground)] ![--error-border:var(--border)]\",\r\n ]\r\n : []\r\n\r\n return (\r\n <SonnerToaster\r\n theme={theme as SonnerToasterProps['theme']}\r\n // In a design system, \"success/info/warning/error\" should follow theme tokens.\r\n // Sonner applies type colors only when richColors is enabled.\r\n richColors={resolvedRichColors}\r\n // Use CSS variables (no inline styles) for Sonner's internal theming.\r\n className={cn(\r\n \"toaster group\",\r\n // Trim placement from window (similar to Sheet inset).\r\n // Also set a sensible default width and max width for mobile.\r\n \"[--width:min(24rem,calc(100vw-1rem))]\",\r\n // Token-driven colors for Sonner's internal type backgrounds.\r\n \"[--normal-bg:var(--popover)] [--normal-text:var(--popover-foreground)] [--normal-border:var(--border)]\",\r\n colorVars,\r\n className\r\n )}\r\n // Trim offset and spacing unless explicitly overridden.\r\n offset={offset ?? 8}\r\n mobileOffset={mobileOffset ?? 8}\r\n // Mindtris UI guideline: ~0.75rem between toasts.\r\n gap={gap ?? 12}\r\n // Mindtris UI guideline: max 3 visible toasts.\r\n visibleToasts={visibleToasts ?? 3}\r\n closeButton={closeButton}\r\n icons={{\r\n success: <CheckCircle2 className=\"h-4 w-4\" aria-hidden />,\r\n info: <Info className=\"h-4 w-4\" aria-hidden />,\r\n warning: <AlertTriangle className=\"h-4 w-4\" aria-hidden />,\r\n error: <ServerCrash className=\"h-4 w-4\" aria-hidden />,\r\n loading: <Loader2 className=\"h-4 w-4 animate-spin\" aria-hidden />,\r\n close: <X className=\"h-4 w-4\" aria-hidden />,\r\n ...icons,\r\n }}\r\n toastOptions={{\r\n ...toastOptions,\r\n // Sonner has a fairly opinionated default layout (e.g. 16px padding).\r\n // If callers want unstyled, they can explicitly set it.\r\n // Default stays styled so Sonner layout/stacking behaves as expected.\r\n unstyled: toastOptions?.unstyled,\r\n classNames: {\r\n ...(toastOptions?.classNames ?? {}),\r\n toast: cn(\r\n // Base shell (token driven)\r\n 'bg-popover text-popover-foreground border-border',\r\n 'border shadow-lg rounded-xl',\r\n // Typography (use app font; readable sizing)\r\n 'font-inherit',\r\n // Mindtris UI density (comfortable, not oversized).\r\n 'text-sm font-normal leading-5',\r\n // Sonner renders title/description with data-attrs in the DOM.\r\n // Title should read as a label; description stays normal.\r\n '[&_[data-title]]:font-medium [&_[data-description]]:font-normal',\r\n // Spacing\r\n // Trim top/bottom padding (match Mindtris UI toast density).\r\n '!px-3 !py-2',\r\n // Layout\r\n 'items-start gap-3',\r\n // Close button is inline (in-flow), no extra padding needed.\r\n ),\r\n // Keep toast text lightweight (avoid “thick” feel).\r\n // Match Mindtris UI notifications: title reads as a label with a small bottom gap.\r\n title: 'font-inherit text-sm font-medium leading-5 text-foreground mb-1',\r\n // Match Mindtris UI notifications: body copy uses regular sizing and muted tone.\r\n description: 'font-inherit text-sm font-normal leading-5 text-muted-foreground',\r\n // Let title's `mb-1` control spacing (no extra gap).\r\n content: 'gap-0',\r\n // Match Mindtris UI guidance: icons can be hidden on mobile when needed.\r\n icon: 'hidden sm:inline-flex',\r\n // Close button: inline on the right (not floating).\r\n closeButton: cn(\r\n // Override Sonner default absolute positioning (top corner).\r\n \"!static !transform-none !translate-x-0 !translate-y-0 !left-auto !right-auto !top-auto\",\r\n // Push to the right edge of the toast row.\r\n \"ml-auto shrink-0\",\r\n // Mindtris button-like styling.\r\n \"text-muted-foreground hover:text-foreground hover:bg-muted\",\r\n \"border border-border bg-card\",\r\n \"rounded-md\",\r\n \"h-7 w-7\",\r\n \"inline-flex items-center justify-center\",\r\n \"cursor-pointer\",\r\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\r\n ),\r\n actionButton: cn(\r\n 'bg-primary text-primary-foreground',\r\n 'hover:bg-primary/90',\r\n 'text-sm font-medium',\r\n 'h-8 px-3 rounded-md'\r\n ),\r\n cancelButton: cn(\r\n 'bg-secondary text-secondary-foreground border border-border',\r\n 'hover:bg-secondary/90',\r\n 'text-sm font-medium',\r\n 'h-8 px-3 rounded-md'\r\n ),\r\n },\r\n }}\r\n {...rest}\r\n />\r\n )\r\n}\r\n\r\nexport type ToastSemanticVariant =\r\n | 'neutral'\r\n | 'primary'\r\n | 'secondary'\r\n | 'tertiary'\r\n | 'accent'\r\n | 'muted'\r\n | 'foreground'\r\n | 'destructive'\r\n // Convenience aliases that map to Sonner types:\r\n | 'success'\r\n | 'info'\r\n | 'warning'\r\n | 'error'\r\n\r\ntype ToastMessage = Parameters<typeof sonnerToast>[0]\r\ntype ToastOptions = Parameters<typeof sonnerToast>[1]\r\n\r\nconst semanticToastClassNames: Record<\r\n Exclude<ToastSemanticVariant, 'success' | 'info' | 'warning' | 'error'>,\r\n string\r\n> = {\r\n neutral: 'bg-popover text-popover-foreground border-border',\r\n primary: 'bg-primary text-primary-foreground border-border',\r\n secondary: 'bg-secondary text-secondary-foreground border-border',\r\n tertiary: 'bg-card text-foreground border-border',\r\n accent: 'bg-accent text-accent-foreground border-border',\r\n muted: 'bg-muted text-foreground border-border',\r\n foreground: 'bg-foreground text-background border-foreground/40',\r\n destructive: 'bg-destructive text-destructive-foreground border-destructive/40',\r\n}\r\n\r\n/**\r\n * `toastSemantic`: fire toasts using design-system semantic variants.\r\n *\r\n * - `success/info/warning/error` call Sonner’s typed helpers (keeps icons/behavior).\r\n * - Other variants use `toast(..., { className })` to apply token-driven colors.\r\n */\r\nexport function toastSemantic(\r\n variant: ToastSemanticVariant,\r\n message: ToastMessage,\r\n options?: ToastOptions\r\n) {\r\n const merged = options\r\n ? ({ ...options, className: cn(options.className) } as ToastOptions)\r\n : undefined\r\n\r\n switch (variant) {\r\n case 'success':\r\n return sonnerToast.success(message as any, merged as any)\r\n case 'info':\r\n return sonnerToast.info(message as any, merged as any)\r\n case 'warning':\r\n return sonnerToast.warning(message as any, merged as any)\r\n case 'error':\r\n return sonnerToast.error(message as any, merged as any)\r\n default:\r\n return sonnerToast(message, {\r\n ...options,\r\n className: cn(semanticToastClassNames[variant], options?.className),\r\n })\r\n }\r\n}\r\n\r\nexport { sonnerToast as toast }\r\nexport type { SonnerToasterProps }\r\n\r\n","'use client';\nfunction __insertCSS(code) {\n if (!code || typeof document == 'undefined') return\n let head = document.head || document.getElementsByTagName('head')[0]\n let style = document.createElement('style')\n style.type = 'text/css'\n head.appendChild(style)\n ;style.styleSheet ? (style.styleSheet.cssText = code) : style.appendChild(document.createTextNode(code))\n}\n\nimport React from 'react';\nimport ReactDOM from 'react-dom';\n\nconst getAsset = (type)=>{\n switch(type){\n case 'success':\n return SuccessIcon;\n case 'info':\n return InfoIcon;\n case 'warning':\n return WarningIcon;\n case 'error':\n return ErrorIcon;\n default:\n return null;\n }\n};\nconst bars = Array(12).fill(0);\nconst Loader = ({ visible, className })=>{\n return /*#__PURE__*/ React.createElement(\"div\", {\n className: [\n 'sonner-loading-wrapper',\n className\n ].filter(Boolean).join(' '),\n \"data-visible\": visible\n }, /*#__PURE__*/ React.createElement(\"div\", {\n className: \"sonner-spinner\"\n }, bars.map((_, i)=>/*#__PURE__*/ React.createElement(\"div\", {\n className: \"sonner-loading-bar\",\n key: `spinner-bar-${i}`\n }))));\n};\nconst SuccessIcon = /*#__PURE__*/ React.createElement(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n fill: \"currentColor\",\n height: \"20\",\n width: \"20\"\n}, /*#__PURE__*/ React.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z\",\n clipRule: \"evenodd\"\n}));\nconst WarningIcon = /*#__PURE__*/ React.createElement(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n height: \"20\",\n width: \"20\"\n}, /*#__PURE__*/ React.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003zM12 8.25a.75.75 0 01.75.75v3.75a.75.75 0 01-1.5 0V9a.75.75 0 01.75-.75zm0 8.25a.75.75 0 100-1.5.75.75 0 000 1.5z\",\n clipRule: \"evenodd\"\n}));\nconst InfoIcon = /*#__PURE__*/ React.createElement(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n fill: \"currentColor\",\n height: \"20\",\n width: \"20\"\n}, /*#__PURE__*/ React.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a.75.75 0 000 1.5h.253a.25.25 0 01.244.304l-.459 2.066A1.75 1.75 0 0010.747 15H11a.75.75 0 000-1.5h-.253a.25.25 0 01-.244-.304l.459-2.066A1.75 1.75 0 009.253 9H9z\",\n clipRule: \"evenodd\"\n}));\nconst ErrorIcon = /*#__PURE__*/ React.createElement(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n fill: \"currentColor\",\n height: \"20\",\n width: \"20\"\n}, /*#__PURE__*/ React.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-8-5a.75.75 0 01.75.75v4.5a.75.75 0 01-1.5 0v-4.5A.75.75 0 0110 5zm0 10a1 1 0 100-2 1 1 0 000 2z\",\n clipRule: \"evenodd\"\n}));\nconst CloseIcon = /*#__PURE__*/ React.createElement(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: \"12\",\n height: \"12\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: \"1.5\",\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n}, /*#__PURE__*/ React.createElement(\"line\", {\n x1: \"18\",\n y1: \"6\",\n x2: \"6\",\n y2: \"18\"\n}), /*#__PURE__*/ React.createElement(\"line\", {\n x1: \"6\",\n y1: \"6\",\n x2: \"18\",\n y2: \"18\"\n}));\n\nconst useIsDocumentHidden = ()=>{\n const [isDocumentHidden, setIsDocumentHidden] = React.useState(document.hidden);\n React.useEffect(()=>{\n const callback = ()=>{\n setIsDocumentHidden(document.hidden);\n };\n document.addEventListener('visibilitychange', callback);\n return ()=>window.removeEventListener('visibilitychange', callback);\n }, []);\n return isDocumentHidden;\n};\n\nlet toastsCounter = 1;\nclass Observer {\n constructor(){\n // We use arrow functions to maintain the correct `this` reference\n this.subscribe = (subscriber)=>{\n this.subscribers.push(subscriber);\n return ()=>{\n const index = this.subscribers.indexOf(subscriber);\n this.subscribers.splice(index, 1);\n };\n };\n this.publish = (data)=>{\n this.subscribers.forEach((subscriber)=>subscriber(data));\n };\n this.addToast = (data)=>{\n this.publish(data);\n this.toasts = [\n ...this.toasts,\n data\n ];\n };\n this.create = (data)=>{\n var _data_id;\n const { message, ...rest } = data;\n const id = typeof (data == null ? void 0 : data.id) === 'number' || ((_data_id = data.id) == null ? void 0 : _data_id.length) > 0 ? data.id : toastsCounter++;\n const alreadyExists = this.toasts.find((toast)=>{\n return toast.id === id;\n });\n const dismissible = data.dismissible === undefined ? true : data.dismissible;\n if (this.dismissedToasts.has(id)) {\n this.dismissedToasts.delete(id);\n }\n if (alreadyExists) {\n this.toasts = this.toasts.map((toast)=>{\n if (toast.id === id) {\n this.publish({\n ...toast,\n ...data,\n id,\n title: message\n });\n return {\n ...toast,\n ...data,\n id,\n dismissible,\n title: message\n };\n }\n return toast;\n });\n } else {\n this.addToast({\n title: message,\n ...rest,\n dismissible,\n id\n });\n }\n return id;\n };\n this.dismiss = (id)=>{\n if (id) {\n this.dismissedToasts.add(id);\n requestAnimationFrame(()=>this.subscribers.forEach((subscriber)=>subscriber({\n id,\n dismiss: true\n })));\n } else {\n this.toasts.forEach((toast)=>{\n this.subscribers.forEach((subscriber)=>subscriber({\n id: toast.id,\n dismiss: true\n }));\n });\n }\n return id;\n };\n this.message = (message, data)=>{\n return this.create({\n ...data,\n message\n });\n };\n this.error = (message, data)=>{\n return this.create({\n ...data,\n message,\n type: 'error'\n });\n };\n this.success = (message, data)=>{\n return this.create({\n ...data,\n type: 'success',\n message\n });\n };\n this.info = (message, data)=>{\n return this.create({\n ...data,\n type: 'info',\n message\n });\n };\n this.warning = (message, data)=>{\n return this.create({\n ...data,\n type: 'warning',\n message\n });\n };\n this.loading = (message, data)=>{\n return this.create({\n ...data,\n type: 'loading',\n message\n });\n };\n this.promise = (promise, data)=>{\n if (!data) {\n // Nothing to show\n return;\n }\n let id = undefined;\n if (data.loading !== undefined) {\n id = this.create({\n ...data,\n promise,\n type: 'loading',\n message: data.loading,\n description: typeof data.description !== 'function' ? data.description : undefined\n });\n }\n const p = Promise.resolve(promise instanceof Function ? promise() : promise);\n let shouldDismiss = id !== undefined;\n let result;\n const originalPromise = p.then(async (response)=>{\n result = [\n 'resolve',\n response\n ];\n const isReactElementResponse = React.isValidElement(response);\n if (isReactElementResponse) {\n shouldDismiss = false;\n this.create({\n id,\n type: 'default',\n message: response\n });\n } else if (isHttpResponse(response) && !response.ok) {\n shouldDismiss = false;\n const promiseData = typeof data.error === 'function' ? await data.error(`HTTP error! status: ${response.status}`) : data.error;\n const description = typeof data.description === 'function' ? await data.description(`HTTP error! status: ${response.status}`) : data.description;\n const isExtendedResult = typeof promiseData === 'object' && !React.isValidElement(promiseData);\n const toastSettings = isExtendedResult ? promiseData : {\n message: promiseData\n };\n this.create({\n id,\n type: 'error',\n description,\n ...toastSettings\n });\n } else if (response instanceof Error) {\n shouldDismiss = false;\n const promiseData = typeof data.error === 'function' ? await data.error(response) : data.error;\n const description = typeof data.description === 'function' ? await data.description(response) : data.description;\n const isExtendedResult = typeof promiseData === 'object' && !React.isValidElement(promiseData);\n const toastSettings = isExtendedResult ? promiseData : {\n message: promiseData\n };\n this.create({\n id,\n type: 'error',\n description,\n ...toastSettings\n });\n } else if (data.success !== undefined) {\n shouldDismiss = false;\n const promiseData = typeof data.success === 'function' ? await data.success(response) : data.success;\n const description = typeof data.description === 'function' ? await data.description(response) : data.description;\n const isExtendedResult = typeof promiseData === 'object' && !React.isValidElement(promiseData);\n const toastSettings = isExtendedResult ? promiseData : {\n message: promiseData\n };\n this.create({\n id,\n type: 'success',\n description,\n ...toastSettings\n });\n }\n }).catch(async (error)=>{\n result = [\n 'reject',\n error\n ];\n if (data.error !== undefined) {\n shouldDismiss = false;\n const promiseData = typeof data.error === 'function' ? await data.error(error) : data.error;\n const description = typeof data.description === 'function' ? await data.description(error) : data.description;\n const isExtendedResult = typeof promiseData === 'object' && !React.isValidElement(promiseData);\n const toastSettings = isExtendedResult ? promiseData : {\n message: promiseData\n };\n this.create({\n id,\n type: 'error',\n description,\n ...toastSettings\n });\n }\n }).finally(()=>{\n if (shouldDismiss) {\n // Toast is still in load state (and will be indefinitely — dismiss it)\n this.dismiss(id);\n id = undefined;\n }\n data.finally == null ? void 0 : data.finally.call(data);\n });\n const unwrap = ()=>new Promise((resolve, reject)=>originalPromise.then(()=>result[0] === 'reject' ? reject(result[1]) : resolve(result[1])).catch(reject));\n if (typeof id !== 'string' && typeof id !== 'number') {\n // cannot Object.assign on undefined\n return {\n unwrap\n };\n } else {\n return Object.assign(id, {\n unwrap\n });\n }\n };\n this.custom = (jsx, data)=>{\n const id = (data == null ? void 0 : data.id) || toastsCounter++;\n this.create({\n jsx: jsx(id),\n id,\n ...data\n });\n return id;\n };\n this.getActiveToasts = ()=>{\n return this.toasts.filter((toast)=>!this.dismissedToasts.has(toast.id));\n };\n this.subscribers = [];\n this.toasts = [];\n this.dismissedToasts = new Set();\n }\n}\nconst ToastState = new Observer();\n// bind this to the toast function\nconst toastFunction = (message, data)=>{\n const id = (data == null ? void 0 : data.id) || toastsCounter++;\n ToastState.addToast({\n title: message,\n ...data,\n id\n });\n return id;\n};\nconst isHttpResponse = (data)=>{\n return data && typeof data === 'object' && 'ok' in data && typeof data.ok === 'boolean' && 'status' in data && typeof data.status === 'number';\n};\nconst basicToast = toastFunction;\nconst getHistory = ()=>ToastState.toasts;\nconst getToasts = ()=>ToastState.getActiveToasts();\n// We use `Object.assign` to maintain the correct types as we would lose them otherwise\nconst toast = Object.assign(basicToast, {\n success: ToastState.success,\n info: ToastState.info,\n warning: ToastState.warning,\n error: ToastState.error,\n custom: ToastState.custom,\n message: ToastState.message,\n promise: ToastState.promise,\n dismiss: ToastState.dismiss,\n loading: ToastState.loading\n}, {\n getHistory,\n getToasts\n});\n\n__insertCSS(\"[data-sonner-toaster][dir=ltr],html[dir=ltr]{--toast-icon-margin-start:-3px;--toast-icon-margin-end:4px;--toast-svg-margin-start:-1px;--toast-svg-margin-end:0px;--toast-button-margin-start:auto;--toast-button-margin-end:0;--toast-close-button-start:0;--toast-close-button-end:unset;--toast-close-button-transform:translate(-35%, -35%)}[data-sonner-toaster][dir=rtl],html[dir=rtl]{--toast-icon-margin-start:4px;--toast-icon-margin-end:-3px;--toast-svg-margin-start:0px;--toast-svg-margin-end:-1px;--toast-button-margin-start:0;--toast-button-margin-end:auto;--toast-close-button-start:unset;--toast-close-button-end:0;--toast-close-button-transform:translate(35%, -35%)}[data-sonner-toaster]{position:fixed;width:var(--width);font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;--gray1:hsl(0, 0%, 99%);--gray2:hsl(0, 0%, 97.3%);--gray3:hsl(0, 0%, 95.1%);--gray4:hsl(0, 0%, 93%);--gray5:hsl(0, 0%, 90.9%);--gray6:hsl(0, 0%, 88.7%);--gray7:hsl(0, 0%, 85.8%);--gray8:hsl(0, 0%, 78%);--gray9:hsl(0, 0%, 56.1%);--gray10:hsl(0, 0%, 52.3%);--gray11:hsl(0, 0%, 43.5%);--gray12:hsl(0, 0%, 9%);--border-radius:8px;box-sizing:border-box;padding:0;margin:0;list-style:none;outline:0;z-index:999999999;transition:transform .4s ease}@media (hover:none) and (pointer:coarse){[data-sonner-toaster][data-lifted=true]{transform:none}}[data-sonner-toaster][data-x-position=right]{right:var(--offset-right)}[data-sonner-toaster][data-x-position=left]{left:var(--offset-left)}[data-sonner-toaster][data-x-position=center]{left:50%;transform:translateX(-50%)}[data-sonner-toaster][data-y-position=top]{top:var(--offset-top)}[data-sonner-toaster][data-y-position=bottom]{bottom:var(--offset-bottom)}[data-sonner-toast]{--y:translateY(100%);--lift-amount:calc(var(--lift) * var(--gap));z-index:var(--z-index);position:absolute;opacity:0;transform:var(--y);touch-action:none;transition:transform .4s,opacity .4s,height .4s,box-shadow .2s;box-sizing:border-box;outline:0;overflow-wrap:anywhere}[data-sonner-toast][data-styled=true]{padding:16px;background:var(--normal-bg);border:1px solid var(--normal-border);color:var(--normal-text);border-radius:var(--border-radius);box-shadow:0 4px 12px rgba(0,0,0,.1);width:var(--width);font-size:13px;display:flex;align-items:center;gap:6px}[data-sonner-toast]:focus-visible{box-shadow:0 4px 12px rgba(0,0,0,.1),0 0 0 2px rgba(0,0,0,.2)}[data-sonner-toast][data-y-position=top]{top:0;--y:translateY(-100%);--lift:1;--lift-amount:calc(1 * var(--gap))}[data-sonner-toast][data-y-position=bottom]{bottom:0;--y:translateY(100%);--lift:-1;--lift-amount:calc(var(--lift) * var(--gap))}[data-sonner-toast][data-styled=true] [data-description]{font-weight:400;line-height:1.4;color:#3f3f3f}[data-rich-colors=true][data-sonner-toast][data-styled=true] [data-description]{color:inherit}[data-sonner-toaster][data-sonner-theme=dark] [data-description]{color:#e8e8e8}[data-sonner-toast][data-styled=true] [data-title]{font-weight:500;line-height:1.5;color:inherit}[data-sonner-toast][data-styled=true] [data-icon]{display:flex;height:16px;width:16px;position:relative;justify-content:flex-start;align-items:center;flex-shrink:0;margin-left:var(--toast-icon-margin-start);margin-right:var(--toast-icon-margin-end)}[data-sonner-toast][data-promise=true] [data-icon]>svg{opacity:0;transform:scale(.8);transform-origin:center;animation:sonner-fade-in .3s ease forwards}[data-sonner-toast][data-styled=true] [data-icon]>*{flex-shrink:0}[data-sonner-toast][data-styled=true] [data-icon] svg{margin-left:var(--toast-svg-margin-start);margin-right:var(--toast-svg-margin-end)}[data-sonner-toast][data-styled=true] [data-content]{display:flex;flex-direction:column;gap:2px}[data-sonner-toast][data-styled=true] [data-button]{border-radius:4px;padding-left:8px;padding-right:8px;height:24px;font-size:12px;color:var(--normal-bg);background:var(--normal-text);margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end);border:none;font-weight:500;cursor:pointer;outline:0;display:flex;align-items:center;flex-shrink:0;transition:opacity .4s,box-shadow .2s}[data-sonner-toast][data-styled=true] [data-button]:focus-visible{box-shadow:0 0 0 2px rgba(0,0,0,.4)}[data-sonner-toast][data-styled=true] [data-button]:first-of-type{margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end)}[data-sonner-toast][data-styled=true] [data-cancel]{color:var(--normal-text);background:rgba(0,0,0,.08)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast][data-styled=true] [data-cancel]{background:rgba(255,255,255,.3)}[data-sonner-toast][data-styled=true] [data-close-button]{position:absolute;left:var(--toast-close-button-start);right:var(--toast-close-button-end);top:0;height:20px;width:20px;display:flex;justify-content:center;align-items:center;padding:0;color:var(--gray12);background:var(--normal-bg);border:1px solid var(--gray4);transform:var(--toast-close-button-transform);border-radius:50%;cursor:pointer;z-index:1;transition:opacity .1s,background .2s,border-color .2s}[data-sonner-toast][data-styled=true] [data-close-button]:focus-visible{box-shadow:0 4px 12px rgba(0,0,0,.1),0 0 0 2px rgba(0,0,0,.2)}[data-sonner-toast][data-styled=true] [data-disabled=true]{cursor:not-allowed}[data-sonner-toast][data-styled=true]:hover [data-close-button]:hover{background:var(--gray2);border-color:var(--gray5)}[data-sonner-toast][data-swiping=true]::before{content:'';position:absolute;left:-100%;right:-100%;height:100%;z-index:-1}[data-sonner-toast][data-y-position=top][data-swiping=true]::before{bottom:50%;transform:scaleY(3) translateY(50%)}[data-sonner-toast][data-y-position=bottom][data-swiping=true]::before{top:50%;transform:scaleY(3) translateY(-50%)}[data-sonner-toast][data-swiping=false][data-removed=true]::before{content:'';position:absolute;inset:0;transform:scaleY(2)}[data-sonner-toast][data-expanded=true]::after{content:'';position:absolute;left:0;height:calc(var(--gap) + 1px);bottom:100%;width:100%}[data-sonner-toast][data-mounted=true]{--y:translateY(0);opacity:1}[data-sonner-toast][data-expanded=false][data-front=false]{--scale:var(--toasts-before) * 0.05 + 1;--y:translateY(calc(var(--lift-amount) * var(--toasts-before))) scale(calc(-1 * var(--scale)));height:var(--front-toast-height)}[data-sonner-toast]>*{transition:opacity .4s}[data-sonner-toast][data-x-position=right]{right:0}[data-sonner-toast][data-x-position=left]{left:0}[data-sonner-toast][data-expanded=false][data-front=false][data-styled=true]>*{opacity:0}[data-sonner-toast][data-visible=false]{opacity:0;pointer-events:none}[data-sonner-toast][data-mounted=true][data-expanded=true]{--y:translateY(calc(var(--lift) * var(--offset)));height:var(--initial-height)}[data-sonner-toast][data-removed=true][data-front=true][data-swipe-out=false]{--y:translateY(calc(var(--lift) * -100%));opacity:0}[data-sonner-toast][data-removed=true][data-front=false][data-swipe-out=false][data-expanded=true]{--y:translateY(calc(var(--lift) * var(--offset) + var(--lift) * -100%));opacity:0}[data-sonner-toast][data-removed=true][data-front=false][data-swipe-out=false][data-expanded=false]{--y:translateY(40%);opacity:0;transition:transform .5s,opacity .2s}[data-sonner-toast][data-removed=true][data-front=false]::before{height:calc(var(--initial-height) + 20%)}[data-sonner-toast][data-swiping=true]{transform:var(--y) translateY(var(--swipe-amount-y,0)) translateX(var(--swipe-amount-x,0));transition:none}[data-sonner-toast][data-swiped=true]{user-select:none}[data-sonner-toast][data-swipe-out=true][data-y-position=bottom],[data-sonner-toast][data-swipe-out=true][data-y-position=top]{animation-duration:.2s;animation-timing-function:ease-out;animation-fill-mode:forwards}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=left]{animation-name:swipe-out-left}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=right]{animation-name:swipe-out-right}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=up]{animation-name:swipe-out-up}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=down]{animation-name:swipe-out-down}@keyframes swipe-out-left{from{transform:var(--y) translateX(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translateX(calc(var(--swipe-amount-x) - 100%));opacity:0}}@keyframes swipe-out-right{from{transform:var(--y) translateX(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translateX(calc(var(--swipe-amount-x) + 100%));opacity:0}}@keyframes swipe-out-up{from{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) - 100%));opacity:0}}@keyframes swipe-out-down{from{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) + 100%));opacity:0}}@media (max-width:600px){[data-sonner-toaster]{position:fixed;right:var(--mobile-offset-right);left:var(--mobile-offset-left);width:100%}[data-sonner-toaster][dir=rtl]{left:calc(var(--mobile-offset-left) * -1)}[data-sonner-toaster] [data-sonner-toast]{left:0;right:0;width:calc(100% - var(--mobile-offset-left) * 2)}[data-sonner-toaster][data-x-position=left]{left:var(--mobile-offset-left)}[data-sonner-toaster][data-y-position=bottom]{bottom:var(--mobile-offset-bottom)}[data-sonner-toaster][data-y-position=top]{top:var(--mobile-offset-top)}[data-sonner-toaster][data-x-position=center]{left:var(--mobile-offset-left);right:var(--mobile-offset-right);transform:none}}[data-sonner-toaster][data-sonner-theme=light]{--normal-bg:#fff;--normal-border:var(--gray4);--normal-text:var(--gray12);--success-bg:hsl(143, 85%, 96%);--success-border:hsl(145, 92%, 87%);--success-text:hsl(140, 100%, 27%);--info-bg:hsl(208, 100%, 97%);--info-border:hsl(221, 91%, 93%);--info-text:hsl(210, 92%, 45%);--warning-bg:hsl(49, 100%, 97%);--warning-border:hsl(49, 91%, 84%);--warning-text:hsl(31, 92%, 45%);--error-bg:hsl(359, 100%, 97%);--error-border:hsl(359, 100%, 94%);--error-text:hsl(360, 100%, 45%)}[data-sonner-toaster][data-sonner-theme=light] [data-sonner-toast][data-invert=true]{--normal-bg:#000;--normal-border:hsl(0, 0%, 20%);--normal-text:var(--gray1)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast][data-invert=true]{--normal-bg:#fff;--normal-border:var(--gray3);--normal-text:var(--gray12)}[data-sonner-toaster][data-sonner-theme=dark]{--normal-bg:#000;--normal-bg-hover:hsl(0, 0%, 12%);--normal-border:hsl(0, 0%, 20%);--normal-border-hover:hsl(0, 0%, 25%);--normal-text:var(--gray1);--success-bg:hsl(150, 100%, 6%);--success-border:hsl(147, 100%, 12%);--success-text:hsl(150, 86%, 65%);--info-bg:hsl(215, 100%, 6%);--info-border:hsl(223, 43%, 17%);--info-text:hsl(216, 87%, 65%);--warning-bg:hsl(64, 100%, 6%);--warning-border:hsl(60, 100%, 9%);--warning-text:hsl(46, 87%, 65%);--error-bg:hsl(358, 76%, 10%);--error-border:hsl(357, 89%, 16%);--error-text:hsl(358, 100%, 81%)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast] [data-close-button]{background:var(--normal-bg);border-color:var(--normal-border);color:var(--normal-text)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast] [data-close-button]:hover{background:var(--normal-bg-hover);border-color:var(--normal-border-hover)}[data-rich-colors=true][data-sonner-toast][data-type=success]{background:var(--success-bg);border-color:var(--success-border);color:var(--success-text)}[data-rich-colors=true][data-sonner-toast][data-type=success] [data-close-button]{background:var(--success-bg);border-color:var(--success-border);color:var(--success-text)}[data-rich-colors=true][data-sonner-toast][data-type=info]{background:var(--info-bg);border-color:var(--info-border);color:var(--info-text)}[data-rich-colors=true][data-sonner-toast][data-type=info] [data-close-button]{background:var(--info-bg);border-color:var(--info-border);color:var(--info-text)}[data-rich-colors=true][data-sonner-toast][data-type=warning]{background:var(--warning-bg);border-color:var(--warning-border);color:var(--warning-text)}[data-rich-colors=true][data-sonner-toast][data-type=warning] [data-close-button]{background:var(--warning-bg);border-color:var(--warning-border);color:var(--warning-text)}[data-rich-colors=true][data-sonner-toast][data-type=error]{background:var(--error-bg);border-color:var(--error-border);color:var(--error-text)}[data-rich-colors=true][data-sonner-toast][data-type=error] [data-close-button]{background:var(--error-bg);border-color:var(--error-border);color:var(--error-text)}.sonner-loading-wrapper{--size:16px;height:var(--size);width:var(--size);position:absolute;inset:0;z-index:10}.sonner-loading-wrapper[data-visible=false]{transform-origin:center;animation:sonner-fade-out .2s ease forwards}.sonner-spinner{position:relative;top:50%;left:50%;height:var(--size);width:var(--size)}.sonner-loading-bar{animation:sonner-spin 1.2s linear infinite;background:var(--gray11);border-radius:6px;height:8%;left:-10%;position:absolute;top:-3.9%;width:24%}.sonner-loading-bar:first-child{animation-delay:-1.2s;transform:rotate(.0001deg) translate(146%)}.sonner-loading-bar:nth-child(2){animation-delay:-1.1s;transform:rotate(30deg) translate(146%)}.sonner-loading-bar:nth-child(3){animation-delay:-1s;transform:rotate(60deg) translate(146%)}.sonner-loading-bar:nth-child(4){animation-delay:-.9s;transform:rotate(90deg) translate(146%)}.sonner-loading-bar:nth-child(5){animation-delay:-.8s;transform:rotate(120deg) translate(146%)}.sonner-loading-bar:nth-child(6){animation-delay:-.7s;transform:rotate(150deg) translate(146%)}.sonner-loading-bar:nth-child(7){animation-delay:-.6s;transform:rotate(180deg) translate(146%)}.sonner-loading-bar:nth-child(8){animation-delay:-.5s;transform:rotate(210deg) translate(146%)}.sonner-loading-bar:nth-child(9){animation-delay:-.4s;transform:rotate(240deg) translate(146%)}.sonner-loading-bar:nth-child(10){animation-delay:-.3s;transform:rotate(270deg) translate(146%)}.sonner-loading-bar:nth-child(11){animation-delay:-.2s;transform:rotate(300deg) translate(146%)}.sonner-loading-bar:nth-child(12){animation-delay:-.1s;transform:rotate(330deg) translate(146%)}@keyframes sonner-fade-in{0%{opacity:0;transform:scale(.8)}100%{opacity:1;transform:scale(1)}}@keyframes sonner-fade-out{0%{opacity:1;transform:scale(1)}100%{opacity:0;transform:scale(.8)}}@keyframes sonner-spin{0%{opacity:1}100%{opacity:.15}}@media (prefers-reduced-motion){.sonner-loading-bar,[data-sonner-toast],[data-sonner-toast]>*{transition:none!important;animation:none!important}}.sonner-loader{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);transform-origin:center;transition:opacity .2s,transform .2s}.sonner-loader[data-visible=false]{opacity:0;transform:scale(.8) translate(-50%,-50%)}\");\n\nfunction isAction(action) {\n return action.label !== undefined;\n}\n\n// Visible toasts amount\nconst VISIBLE_TOASTS_AMOUNT = 3;\n// Viewport padding\nconst VIEWPORT_OFFSET = '24px';\n// Mobile viewport padding\nconst MOBILE_VIEWPORT_OFFSET = '16px';\n// Default lifetime of a toasts (in ms)\nconst TOAST_LIFETIME = 4000;\n// Default toast width\nconst TOAST_WIDTH = 356;\n// Default gap between toasts\nconst GAP = 14;\n// Threshold to dismiss a toast\nconst SWIPE_THRESHOLD = 45;\n// Equal to exit animation duration\nconst TIME_BEFORE_UNMOUNT = 200;\nfunction cn(...classes) {\n return classes.filter(Boolean).join(' ');\n}\nfunction getDefaultSwipeDirections(position) {\n const [y, x] = position.split('-');\n const directions = [];\n if (y) {\n directions.push(y);\n }\n if (x) {\n directions.push(x);\n }\n return directions;\n}\nconst Toast = (props)=>{\n var _toast_classNames, _toast_classNames1, _toast_classNames2, _toast_classNames3, _toast_classNames4, _toast_classNames5, _toast_classNames6, _toast_classNames7, _toast_classNames8;\n const { invert: ToasterInvert, toast, unstyled, interacting, setHeights, visibleToasts, heights, index, toasts, expanded, removeToast, defaultRichColors, closeButton: closeButtonFromToaster, style, cancelButtonStyle, actionButtonStyle, className = '', descriptionClassName = '', duration: durationFromToaster, position, gap, expandByDefault, classNames, icons, closeButtonAriaLabel = 'Close toast' } = props;\n const [swipeDirection, setSwipeDirection] = React.useState(null);\n const [swipeOutDirection, setSwipeOutDirection] = React.useState(null);\n const [mounted, setMounted] = React.useState(false);\n const [removed, setRemoved] = React.useState(false);\n const [swiping, setSwiping] = React.useState(false);\n const [swipeOut, setSwipeOut] = React.useState(false);\n const [isSwiped, setIsSwiped] = React.useState(false);\n const [offsetBeforeRemove, setOffsetBeforeRemove] = React.useState(0);\n const [initialHeight, setInitialHeight] = React.useState(0);\n const remainingTime = React.useRef(toast.duration || durationFromToaster || TOAST_LIFETIME);\n const dragStartTime = React.useRef(null);\n const toastRef = React.useRef(null);\n const isFront = index === 0;\n const isVisible = index + 1 <= visibleToasts;\n const toastType = toast.type;\n const dismissible = toast.dismissible !== false;\n const toastClassname = toast.className || '';\n const toastDescriptionClassname = toast.descriptionClassName || '';\n // Height index is used to calculate the offset as it gets updated before the toast array, which means we can calculate the new layout faster.\n const heightIndex = React.useMemo(()=>heights.findIndex((height)=>height.toastId === toast.id) || 0, [\n heights,\n toast.id\n ]);\n const closeButton = React.useMemo(()=>{\n var _toast_closeButton;\n return (_toast_closeButton = toast.closeButton) != null ? _toast_closeButton : closeButtonFromToaster;\n }, [\n toast.closeButton,\n closeButtonFromToaster\n ]);\n const duration = React.useMemo(()=>toast.duration || durationFromToaster || TOAST_LIFETIME, [\n toast.duration,\n durationFromToaster\n ]);\n const closeTimerStartTimeRef = React.useRef(0);\n const offset = React.useRef(0);\n const lastCloseTimerStartTimeRef = React.useRef(0);\n const pointerStartRef = React.useRef(null);\n const [y, x] = position.split('-');\n const toastsHeightBefore = React.useMemo(()=>{\n return heights.reduce((prev, curr, reducerIndex)=>{\n // Calculate offset up until current toast\n if (reducerIndex >= heightIndex) {\n return prev;\n }\n return prev + curr.height;\n }, 0);\n }, [\n heights,\n heightIndex\n ]);\n const isDocumentHidden = useIsDocumentHidden();\n const invert = toast.invert || ToasterInvert;\n const disabled = toastType === 'loading';\n offset.current = React.useMemo(()=>heightIndex * gap + toastsHeightBefore, [\n heightIndex,\n toastsHeightBefore\n ]);\n React.useEffect(()=>{\n remainingTime.current = duration;\n }, [\n duration\n ]);\n React.useEffect(()=>{\n // Trigger enter animation without using CSS animation\n setMounted(true);\n }, []);\n React.useEffect(()=>{\n const toastNode = toastRef.current;\n if (toastNode) {\n const height = toastNode.getBoundingClientRect().height;\n // Add toast height to heights array after the toast is mounted\n setInitialHeight(height);\n setHeights((h)=>[\n {\n toastId: toast.id,\n height,\n position: toast.position\n },\n ...h\n ]);\n return ()=>setHeights((h)=>h.filter((height)=>height.toastId !== toast.id));\n }\n }, [\n setHeights,\n toast.id\n ]);\n React.useLayoutEffect(()=>{\n // Keep height up to date with the content in case it updates\n if (!mounted) return;\n const toastNode = toastRef.current;\n const originalHeight = toastNode.style.height;\n toastNode.style.height = 'auto';\n const newHeight = toastNode.getBoundingClientRect().height;\n toastNode.style.height = originalHeight;\n setInitialHeight(newHeight);\n setHeights((heights)=>{\n const alreadyExists = heights.find((height)=>height.toastId === toast.id);\n if (!alreadyExists) {\n return [\n {\n toastId: toast.id,\n height: newHeight,\n position: toast.position\n },\n ...heights\n ];\n } else {\n return heights.map((height)=>height.toastId === toast.id ? {\n ...height,\n height: newHeight\n } : height);\n }\n });\n }, [\n mounted,\n toast.title,\n toast.description,\n setHeights,\n toast.id,\n toast.jsx,\n toast.action,\n toast.cancel\n ]);\n const deleteToast = React.useCallback(()=>{\n // Save the offset for the exit swipe animation\n setRemoved(true);\n setOffsetBeforeRemove(offset.current);\n setHeights((h)=>h.filter((height)=>height.toastId !== toast.id));\n setTimeout(()=>{\n removeToast(toast);\n }, TIME_BEFORE_UNMOUNT);\n }, [\n toast,\n removeToast,\n setHeights,\n offset\n ]);\n React.useEffect(()=>{\n if (toast.promise && toastType === 'loading' || toast.duration === Infinity || toast.type === 'loading') return;\n let timeoutId;\n // Pause the timer on each hover\n const pauseTimer = ()=>{\n if (lastCloseTimerStartTimeRef.current < closeTimerStartTimeRef.current) {\n // Get the elapsed time since the timer started\n const elapsedTime = new Date().getTime() - closeTimerStartTimeRef.current;\n remainingTime.current = remainingTime.current - elapsedTime;\n }\n lastCloseTimerStartTimeRef.current = new Date().getTime();\n };\n const startTimer = ()=>{\n // setTimeout(, Infinity) behaves as if the delay is 0.\n // As a result, the toast would be closed immediately, giving the appearance that it was never rendered.\n // See: https://github.com/denysdovhan/wtfjs?tab=readme-ov-file#an-infinite-timeout\n if (remainingTime.current === Infinity) return;\n closeTimerStartTimeRef.current = new Date().getTime();\n // Let the toast know it has started\n timeoutId = setTimeout(()=>{\n toast.onAutoClose == null ? void 0 : toast.onAutoClose.call(toast, toast);\n deleteToast();\n }, remainingTime.current);\n };\n if (expanded || interacting || isDocumentHidden) {\n pauseTimer();\n } else {\n startTimer();\n }\n return ()=>clearTimeout(timeoutId);\n }, [\n expanded,\n interacting,\n toast,\n toastType,\n isDocumentHidden,\n deleteToast\n ]);\n React.useEffect(()=>{\n if (toast.delete) {\n deleteToast();\n toast.onDismiss == null ? void 0 : toast.onDismiss.call(toast, toast);\n }\n }, [\n deleteToast,\n toast.delete\n ]);\n function getLoadingIcon() {\n var _toast_classNames;\n if (icons == null ? void 0 : icons.loading) {\n var _toast_classNames1;\n return /*#__PURE__*/ React.createElement(\"div\", {\n className: cn(classNames == null ? void 0 : classNames.loader, toast == null ? void 0 : (_toast_classNames1 = toast.classNames) == null ? void 0 : _toast_classNames1.loader, 'sonner-loader'),\n \"data-visible\": toastType === 'loading'\n }, icons.loading);\n }\n return /*#__PURE__*/ React.createElement(Loader, {\n className: cn(classNames == null ? void 0 : classNames.loader, toast == null ? void 0 : (_toast_classNames = toast.classNames) == null ? void 0 : _toast_classNames.loader),\n visible: toastType === 'loading'\n });\n }\n const icon = toast.icon || (icons == null ? void 0 : icons[toastType]) || getAsset(toastType);\n var _toast_richColors, _icons_close;\n return /*#__PURE__*/ React.createElement(\"li\", {\n tabIndex: 0,\n ref: toastRef,\n className: cn(className, toastClassname, classNames == null ? void 0 : classNames.toast, toast == null ? void 0 : (_toast_classNames = toast.classNames) == null ? void 0 : _toast_classNames.toast, classNames == null ? void 0 : classNames.default, classNames == null ? void 0 : classNames[toastType], toast == null ? void 0 : (_toast_classNames1 = toast.classNames) == null ? void 0 : _toast_classNames1[toastType]),\n \"data-sonner-toast\": \"\",\n \"data-rich-colors\": (_toast_richColors = toast.richColors) != null ? _toast_richColors : defaultRichColors,\n \"data-styled\": !Boolean(toast.jsx || toast.unstyled || unstyled),\n \"data-mounted\": mounted,\n \"data-promise\": Boolean(toast.promise),\n \"data-swiped\": isSwiped,\n \"data-removed\": removed,\n \"data-visible\": isVisible,\n \"data-y-position\": y,\n \"data-x-position\": x,\n \"data-index\": index,\n \"data-front\": isFront,\n \"data-swiping\": swiping,\n \"data-dismissible\": dismissible,\n \"data-type\": toastType,\n \"data-invert\": invert,\n \"data-swipe-out\": swipeOut,\n \"data-swipe-direction\": swipeOutDirection,\n \"data-expanded\": Boolean(expanded || expandByDefault && mounted),\n \"data-testid\": toast.testId,\n style: {\n '--index': index,\n '--toasts-before': index,\n '--z-index': toasts.length - index,\n '--offset': `${removed ? offsetBeforeRemove : offset.current}px`,\n '--initial-height': expandByDefault ? 'auto' : `${initialHeight}px`,\n ...style,\n ...toast.style\n },\n onDragEnd: ()=>{\n setSwiping(false);\n setSwipeDirection(null);\n pointerStartRef.current = null;\n },\n onPointerDown: (event)=>{\n if (event.button === 2) return; // Return early on right click\n if (disabled || !dismissible) return;\n dragStartTime.current = new Date();\n setOffsetBeforeRemove(offset.current);\n // Ensure we maintain correct pointer capture even when going outside of the toast (e.g. when swiping)\n event.target.setPointerCapture(event.pointerId);\n if (event.target.tagName === 'BUTTON') return;\n setSwiping(true);\n pointerStartRef.current = {\n x: event.clientX,\n y: event.clientY\n };\n },\n onPointerUp: ()=>{\n var _toastRef_current, _toastRef_current1, _dragStartTime_current;\n if (swipeOut || !dismissible) return;\n pointerStartRef.current = null;\n const swipeAmountX = Number(((_toastRef_current = toastRef.current) == null ? void 0 : _toastRef_current.style.getPropertyValue('--swipe-amount-x').replace('px', '')) || 0);\n const swipeAmountY = Number(((_toastRef_current1 = toastRef.current) == null ? void 0 : _toastRef_current1.style.getPropertyValue('--swipe-amount-y').replace('px', '')) || 0);\n const timeTaken = new Date().getTime() - ((_dragStartTime_current = dragStartTime.current) == null ? void 0 : _dragStartTime_current.getTime());\n const swipeAmount = swipeDirection === 'x' ? swipeAmountX : swipeAmountY;\n const velocity = Math.abs(swipeAmount) / timeTaken;\n if (Math.abs(swipeAmount) >= SWIPE_THRESHOLD || velocity > 0.11) {\n setOffsetBeforeRemove(offset.current);\n toast.onDismiss == null ? void 0 : toast.onDismiss.call(toast, toast);\n if (swipeDirection === 'x') {\n setSwipeOutDirection(swipeAmountX > 0 ? 'right' : 'left');\n } else {\n setSwipeOutDirection(swipeAmountY > 0 ? 'down' : 'up');\n }\n deleteToast();\n setSwipeOut(true);\n return;\n } else {\n var _toastRef_current2, _toastRef_current3;\n (_toastRef_current2 = toastRef.current) == null ? void 0 : _toastRef_current2.style.setProperty('--swipe-amount-x', `0px`);\n (_toastRef_current3 = toastRef.current) == null ? void 0 : _toastRef_current3.style.setProperty('--swipe-amount-y', `0px`);\n }\n setIsSwiped(false);\n setSwiping(false);\n setSwipeDirection(null);\n },\n onPointerMove: (event)=>{\n var _window_getSelection, // Apply transform using both x and y values\n _toastRef_current, _toastRef_current1;\n if (!pointerStartRef.current || !dismissible) return;\n const isHighlighted = ((_window_getSelection = window.getSelection()) == null ? void 0 : _window_getSelection.toString().length) > 0;\n if (isHighlighted) return;\n const yDelta = event.clientY - pointerStartRef.current.y;\n const xDelta = event.clientX - pointerStartRef.current.x;\n var _props_swipeDirections;\n const swipeDirections = (_props_swipeDirections = props.swipeDirections) != null ? _props_swipeDirections : getDefaultSwipeDirections(position);\n // Determine swipe direction if not already locked\n if (!swipeDirection && (Math.abs(xDelta) > 1 || Math.abs(yDelta) > 1)) {\n setSwipeDirection(Math.abs(xDelta) > Math.abs(yDelta) ? 'x' : 'y');\n }\n let swipeAmount = {\n x: 0,\n y: 0\n };\n const getDampening = (delta)=>{\n const factor = Math.abs(delta) / 20;\n return 1 / (1.5 + factor);\n };\n // Only apply swipe in the locked direction\n if (swipeDirection === 'y') {\n // Handle vertical swipes\n if (swipeDirections.includes('top') || swipeDirections.includes('bottom')) {\n if (swipeDirections.includes('top') && yDelta < 0 || swipeDirections.includes('bottom') && yDelta > 0) {\n swipeAmount.y = yDelta;\n } else {\n // Smoothly transition to dampened movement\n const dampenedDelta = yDelta * getDampening(yDelta);\n // Ensure we don't jump when transitioning to dampened movement\n swipeAmount.y = Math.abs(dampenedDelta) < Math.abs(yDelta) ? dampenedDelta : yDelta;\n }\n }\n } else if (swipeDirection === 'x') {\n // Handle horizontal swipes\n if (swipeDirections.includes('left') || swipeDirections.includes('right')) {\n if (swipeDirections.includes('left') && xDelta < 0 || swipeDirections.includes('right') && xDelta > 0) {\n swipeAmount.x = xDelta;\n } else {\n // Smoothly transition to dampened movement\n const dampenedDelta = xDelta * getDampening(xDelta);\n // Ensure we don't jump when transitioning to dampened movement\n swipeAmount.x = Math.abs(dampenedDelta) < Math.abs(xDelta) ? dampenedDelta : xDelta;\n }\n }\n }\n if (Math.abs(swipeAmount.x) > 0 || Math.abs(swipeAmount.y) > 0) {\n setIsSwiped(true);\n }\n (_toastRef_current = toastRef.current) == null ? void 0 : _toastRef_current.style.setProperty('--swipe-amount-x', `${swipeAmount.x}px`);\n (_toastRef_current1 = toastRef.current) == null ? void 0 : _toastRef_current1.style.setProperty('--swipe-amount-y', `${swipeAmount.y}px`);\n }\n }, closeButton && !toast.jsx && toastType !== 'loading' ? /*#__PURE__*/ React.createElement(\"button\", {\n \"aria-label\": closeButtonAriaLabel,\n \"data-disabled\": disabled,\n \"data-close-button\": true,\n onClick: disabled || !dismissible ? ()=>{} : ()=>{\n deleteToast();\n toast.onDismiss == null ? void 0 : toast.onDismiss.call(toast, toast);\n },\n className: cn(classNames == null ? void 0 : classNames.closeButton, toast == null ? void 0 : (_toast_classNames2 = toast.classNames) == null ? void 0 : _toast_classNames2.closeButton)\n }, (_icons_close = icons == null ? void 0 : icons.close) != null ? _icons_close : CloseIcon) : null, (toastType || toast.icon || toast.promise) && toast.icon !== null && ((icons == null ? void 0 : icons[toastType]) !== null || toast.icon) ? /*#__PURE__*/ React.createElement(\"div\", {\n \"data-icon\": \"\",\n className: cn(classNames == null ? void 0 : classNames.icon, toast == null ? void 0 : (_toast_classNames3 = toast.classNames) == null ? void 0 : _toast_classNames3.icon)\n }, toast.promise || toast.type === 'loading' && !toast.icon ? toast.icon || getLoadingIcon() : null, toast.type !== 'loading' ? icon : null) : null, /*#__PURE__*/ React.createElement(\"div\", {\n \"data-content\": \"\",\n className: cn(classNames == null ? void 0 : classNames.content, toast == null ? void 0 : (_toast_classNames4 = toast.classNames) == null ? void 0 : _toast_classNames4.content)\n }, /*#__PURE__*/ React.createElement(\"div\", {\n \"data-title\": \"\",\n className: cn(classNames == null ? void 0 : classNames.title, toast == null ? void 0 : (_toast_classNames5 = toast.classNames) == null ? void 0 : _toast_classNames5.title)\n }, toast.jsx ? toast.jsx : typeof toast.title === 'function' ? toast.title() : toast.title), toast.description ? /*#__PURE__*/ React.createElement(\"div\", {\n \"data-description\": \"\",\n className: cn(descriptionClassName, toastDescriptionClassname, classNames == null ? void 0 : classNames.description, toast == null ? void 0 : (_toast_classNames6 = toast.classNames) == null ? void 0 : _toast_classNames6.description)\n }, typeof toast.description === 'function' ? toast.description() : toast.description) : null), /*#__PURE__*/ React.isValidElement(toast.cancel) ? toast.cancel : toast.cancel && isAction(toast.cancel) ? /*#__PURE__*/ React.createElement(\"button\", {\n \"data-button\": true,\n \"data-cancel\": true,\n style: toast.cancelButtonStyle || cancelButtonStyle,\n onClick: (event)=>{\n // We need to check twice because typescript\n if (!isAction(toast.cancel)) return;\n if (!dismissible) return;\n toast.cancel.onClick == null ? void 0 : toast.cancel.onClick.call(toast.cancel, event);\n deleteToast();\n },\n className: cn(classNames == null ? void 0 : classNames.cancelButton, toast == null ? void 0 : (_toast_classNames7 = toast.classNames) == null ? void 0 : _toast_classNames7.cancelButton)\n }, toast.cancel.label) : null, /*#__PURE__*/ React.isValidElement(toast.action) ? toast.action : toast.action && isAction(toast.action) ? /*#__PURE__*/ React.createElement(\"button\", {\n \"data-button\": true,\n \"data-action\": true,\n style: toast.actionButtonStyle || actionButtonStyle,\n onClick: (event)=>{\n // We need to check twice because typescript\n if (!isAction(toast.action)) return;\n toast.action.onClick == null ? void 0 : toast.action.onClick.call(toast.action, event);\n if (event.defaultPrevented) return;\n deleteToast();\n },\n className: cn(classNames == null ? void 0 : classNames.actionButton, toast == null ? void 0 : (_toast_classNames8 = toast.classNames) == null ? void 0 : _toast_classNames8.actionButton)\n }, toast.action.label) : null);\n};\nfunction getDocumentDirection() {\n if (typeof window === 'undefined') return 'ltr';\n if (typeof document === 'undefined') return 'ltr'; // For Fresh purpose\n const dirAttribute = document.documentElement.getAttribute('dir');\n if (dirAttribute === 'auto' || !dirAttribute) {\n return window.getComputedStyle(document.documentElement).direction;\n }\n return dirAttribute;\n}\nfunction assignOffset(defaultOffset, mobileOffset) {\n const styles = {};\n [\n defaultOffset,\n mobileOffset\n ].forEach((offset, index)=>{\n const isMobile = index === 1;\n const prefix = isMobile ? '--mobile-offset' : '--offset';\n const defaultValue = isMobile ? MOBILE_VIEWPORT_OFFSET : VIEWPORT_OFFSET;\n function assignAll(offset) {\n [\n 'top',\n 'right',\n 'bottom',\n 'left'\n ].forEach((key)=>{\n styles[`${prefix}-${key}`] = typeof offset === 'number' ? `${offset}px` : offset;\n });\n }\n if (typeof offset === 'number' || typeof offset === 'string') {\n assignAll(offset);\n } else if (typeof offset === 'object') {\n [\n 'top',\n 'right',\n 'bottom',\n 'left'\n ].forEach((key)=>{\n if (offset[key] === undefined) {\n styles[`${prefix}-${key}`] = defaultValue;\n } else {\n styles[`${prefix}-${key}`] = typeof offset[key] === 'number' ? `${offset[key]}px` : offset[key];\n }\n });\n } else {\n assignAll(defaultValue);\n }\n });\n return styles;\n}\nfunction useSonner() {\n const [activeToasts, setActiveToasts] = React.useState([]);\n React.useEffect(()=>{\n return ToastState.subscribe((toast)=>{\n if (toast.dismiss) {\n setTimeout(()=>{\n ReactDOM.flushSync(()=>{\n setActiveToasts((toasts)=>toasts.filter((t)=>t.id !== toast.id));\n });\n });\n return;\n }\n // Prevent batching, temp solution.\n setTimeout(()=>{\n ReactDOM.flushSync(()=>{\n setActiveToasts((toasts)=>{\n const indexOfExistingToast = toasts.findIndex((t)=>t.id === toast.id);\n // Update the toast if it already exists\n if (indexOfExistingToast !== -1) {\n return [\n ...toasts.slice(0, indexOfExistingToast),\n {\n ...toasts[indexOfExistingToast],\n ...toast\n },\n ...toasts.slice(indexOfExistingToast + 1)\n ];\n }\n return [\n toast,\n ...toasts\n ];\n });\n });\n });\n });\n }, []);\n return {\n toasts: activeToasts\n };\n}\nconst Toaster = /*#__PURE__*/ React.forwardRef(function Toaster(props, ref) {\n const { id, invert, position = 'bottom-right', hotkey = [\n 'altKey',\n 'KeyT'\n ], expand, closeButton, className, offset, mobileOffset, theme = 'light', richColors, duration, style, visibleToasts = VISIBLE_TOASTS_AMOUNT, toastOptions, dir = getDocumentDirection(), gap = GAP, icons, containerAriaLabel = 'Notifications' } = props;\n const [toasts, setToasts] = React.useState([]);\n const filteredToasts = React.useMemo(()=>{\n if (id) {\n return toasts.filter((toast)=>toast.toasterId === id);\n }\n return toasts.filter((toast)=>!toast.toasterId);\n }, [\n toasts,\n id\n ]);\n const possiblePositions = React.useMemo(()=>{\n return Array.from(new Set([\n position\n ].concat(filteredToasts.filter((toast)=>toast.position).map((toast)=>toast.position))));\n }, [\n filteredToasts,\n position\n ]);\n const [heights, setHeights] = React.useState([]);\n const [expanded, setExpanded] = React.useState(false);\n const [interacting, setInteracting] = React.useState(false);\n const [actualTheme, setActualTheme] = React.useState(theme !== 'system' ? theme : typeof window !== 'undefined' ? window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light' : 'light');\n const listRef = React.useRef(null);\n const hotkeyLabel = hotkey.join('+').replace(/Key/g, '').replace(/Digit/g, '');\n const lastFocusedElementRef = React.useRef(null);\n const isFocusWithinRef = React.useRef(false);\n const removeToast = React.useCallback((toastToRemove)=>{\n setToasts((toasts)=>{\n var _toasts_find;\n if (!((_toasts_find = toasts.find((toast)=>toast.id === toastToRemove.id)) == null ? void 0 : _toasts_find.delete)) {\n ToastState.dismiss(toastToRemove.id);\n }\n return toasts.filter(({ id })=>id !== toastToRemove.id);\n });\n }, []);\n React.useEffect(()=>{\n return ToastState.subscribe((toast)=>{\n if (toast.dismiss) {\n // Prevent batching of other state updates\n requestAnimationFrame(()=>{\n setToasts((toasts)=>toasts.map((t)=>t.id === toast.id ? {\n ...t,\n delete: true\n } : t));\n });\n return;\n }\n // Prevent batching, temp solution.\n setTimeout(()=>{\n ReactDOM.flushSync(()=>{\n setToasts((toasts)=>{\n const indexOfExistingToast = toasts.findIndex((t)=>t.id === toast.id);\n // Update the toast if it already exists\n if (indexOfExistingToast !== -1) {\n return [\n ...toasts.slice(0, indexOfExistingToast),\n {\n ...toasts[indexOfExistingToast],\n ...toast\n },\n ...toasts.slice(indexOfExistingToast + 1)\n ];\n }\n return [\n toast,\n ...toasts\n ];\n });\n });\n });\n });\n }, [\n toasts\n ]);\n React.useEffect(()=>{\n if (theme !== 'system') {\n setActualTheme(theme);\n return;\n }\n if (theme === 'system') {\n // check if current preference is dark\n if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {\n // it's currently dark\n setActualTheme('dark');\n } else {\n // it's not dark\n setActualTheme('light');\n }\n }\n if (typeof window === 'undefined') return;\n const darkMediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n try {\n // Chrome & Firefox\n darkMediaQuery.addEventListener('change', ({ matches })=>{\n if (matches) {\n setActualTheme('dark');\n } else {\n setActualTheme('light');\n }\n });\n } catch (error) {\n // Safari < 14\n darkMediaQuery.addListener(({ matches })=>{\n try {\n if (matches) {\n setActualTheme('dark');\n } else {\n setActualTheme('light');\n }\n } catch (e) {\n console.error(e);\n }\n });\n }\n }, [\n theme\n ]);\n React.useEffect(()=>{\n // Ensure expanded is always false when no toasts are present / only one left\n if (toasts.length <= 1) {\n setExpanded(false);\n }\n }, [\n toasts\n ]);\n React.useEffect(()=>{\n const handleKeyDown = (event)=>{\n var _listRef_current;\n const isHotkeyPressed = hotkey.every((key)=>event[key] || event.code === key);\n if (isHotkeyPressed) {\n var _listRef_current1;\n setExpanded(true);\n (_listRef_current1 = listRef.current) == null ? void 0 : _listRef_current1.focus();\n }\n if (event.code === 'Escape' && (document.activeElement === listRef.current || ((_listRef_current = listRef.current) == null ? void 0 : _listRef_current.contains(document.activeElement)))) {\n setExpanded(false);\n }\n };\n document.addEventListener('keydown', handleKeyDown);\n return ()=>document.removeEventListener('keydown', handleKeyDown);\n }, [\n hotkey\n ]);\n React.useEffect(()=>{\n if (listRef.current) {\n return ()=>{\n if (lastFocusedElementRef.current) {\n lastFocusedElementRef.current.focus({\n preventScroll: true\n });\n lastFocusedElementRef.current = null;\n isFocusWithinRef.current = false;\n }\n };\n }\n }, [\n listRef.current\n ]);\n return(// Remove item from normal navigation flow, only available via hotkey\n /*#__PURE__*/ React.createElement(\"section\", {\n ref: ref,\n \"aria-label\": `${containerAriaLabel} ${hotkeyLabel}`,\n tabIndex: -1,\n \"aria-live\": \"polite\",\n \"aria-relevant\": \"additions text\",\n \"aria-atomic\": \"false\",\n suppressHydrationWarning: true\n }, possiblePositions.map((position, index)=>{\n var _heights_;\n const [y, x] = position.split('-');\n if (!filteredToasts.length) return null;\n return /*#__PURE__*/ React.createElement(\"ol\", {\n key: position,\n dir: dir === 'auto' ? getDocumentDirection() : dir,\n tabIndex: -1,\n ref: listRef,\n className: className,\n \"data-sonner-toaster\": true,\n \"data-sonner-theme\": actualTheme,\n \"data-y-position\": y,\n \"data-x-position\": x,\n style: {\n '--front-toast-height': `${((_heights_ = heights[0]) == null ? void 0 : _heights_.height) || 0}px`,\n '--width': `${TOAST_WIDTH}px`,\n '--gap': `${gap}px`,\n ...style,\n ...assignOffset(offset, mobileOffset)\n },\n onBlur: (event)=>{\n if (isFocusWithinRef.current && !event.currentTarget.contains(event.relatedTarget)) {\n isFocusWithinRef.current = false;\n if (lastFocusedElementRef.current) {\n lastFocusedElementRef.current.focus({\n preventScroll: true\n });\n lastFocusedElementRef.current = null;\n }\n }\n },\n onFocus: (event)=>{\n const isNotDismissible = event.target instanceof HTMLElement && event.target.dataset.dismissible === 'false';\n if (isNotDismissible) return;\n if (!isFocusWithinRef.current) {\n isFocusWithinRef.current = true;\n lastFocusedElementRef.current = event.relatedTarget;\n }\n },\n onMouseEnter: ()=>setExpanded(true),\n onMouseMove: ()=>setExpanded(true),\n onMouseLeave: ()=>{\n // Avoid setting expanded to false when interacting with a toast, e.g. swiping\n if (!interacting) {\n setExpanded(false);\n }\n },\n onDragEnd: ()=>setExpanded(false),\n onPointerDown: (event)=>{\n const isNotDismissible = event.target instanceof HTMLElement && event.target.dataset.dismissible === 'false';\n if (isNotDismissible) return;\n setInteracting(true);\n },\n onPointerUp: ()=>setInteracting(false)\n }, filteredToasts.filter((toast)=>!toast.position && index === 0 || toast.position === position).map((toast, index)=>{\n var _toastOptions_duration, _toastOptions_closeButton;\n return /*#__PURE__*/ React.createElement(Toast, {\n key: toast.id,\n icons: icons,\n index: index,\n toast: toast,\n defaultRichColors: richColors,\n duration: (_toastOptions_duration = toastOptions == null ? void 0 : toastOptions.duration) != null ? _toastOptions_duration : duration,\n className: toastOptions == null ? void 0 : toastOptions.className,\n descriptionClassName: toastOptions == null ? void 0 : toastOptions.descriptionClassName,\n invert: invert,\n visibleToasts: visibleToasts,\n closeButton: (_toastOptions_closeButton = toastOptions == null ? void 0 : toastOptions.closeButton) != null ? _toastOptions_closeButton : closeButton,\n interacting: interacting,\n position: position,\n style: toastOptions == null ? void 0 : toastOptions.style,\n unstyled: toastOptions == null ? void 0 : toastOptions.unstyled,\n classNames: toastOptions == null ? void 0 : toastOptions.classNames,\n cancelButtonStyle: toastOptions == null ? void 0 : toastOptions.cancelButtonStyle,\n actionButtonStyle: toastOptions == null ? void 0 : toastOptions.actionButtonStyle,\n closeButtonAriaLabel: toastOptions == null ? void 0 : toastOptions.closeButtonAriaLabel,\n removeToast: removeToast,\n toasts: filteredToasts.filter((t)=>t.position == toast.position),\n heights: heights.filter((h)=>h.position == toast.position),\n setHeights: setHeights,\n expandByDefault: expand,\n gap: gap,\n expanded: expanded,\n swipeDirections: props.swipeDirections\n });\n }));\n })));\n});\n\nexport { Toaster, toast, useSonner };\n","/**\r\n * Select (Radix): Composable select primitives.\r\n *\r\n * Design-system contract (CONTRIBUTING.md):\r\n * - Scope: UI-only primitive; no domain logic.\r\n * - Tokens-only: semantic token classes only; no hardcoded colors.\r\n * - Minimal state: Radix handles value, open state, a11y.\r\n * - Composition: SelectRoot, SelectTrigger, SelectValue, SelectContent,\r\n * SelectItem, SelectGroup, SelectLabel, SelectSeparator.\r\n *\r\n * @see https://ui.shadcn.com/docs/components/radix/select\r\n */\r\n\r\n\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport * as SelectPrimitive from \"@radix-ui/react-select\"\r\nimport { CircleCheck, ChevronDown, ChevronUp } from \"lucide-react\"\r\nimport { cn } from \"../../lib/utils\"\r\n\r\nexport const SelectRoot = SelectPrimitive.Root\r\nexport const SelectGroup = SelectPrimitive.Group\r\nexport const SelectValue = SelectPrimitive.Value\r\n\r\nexport type SelectRootProps = React.ComponentProps<typeof SelectPrimitive.Root>\r\nexport type SelectTriggerProps = React.ComponentProps<typeof SelectPrimitive.Trigger> & {\r\n size?: \"sm\" | \"default\"\r\n}\r\nexport type SelectContentProps = React.ComponentProps<typeof SelectPrimitive.Content>\r\nexport type SelectItemProps = React.ComponentProps<typeof SelectPrimitive.Item>\r\nexport type SelectLabelProps = React.ComponentProps<typeof SelectPrimitive.Label>\r\nexport type SelectSeparatorProps = React.ComponentProps<typeof SelectPrimitive.Separator>\r\n\r\nexport function SelectTrigger({\r\n className,\r\n size = \"default\",\r\n children,\r\n ...props\r\n}: SelectTriggerProps) {\r\n return (\r\n <SelectPrimitive.Trigger\r\n data-slot=\"select-trigger\"\r\n data-size={size}\r\n className={cn(\r\n \"flex w-fit items-center justify-between gap-2 rounded-md border bg-transparent px-3 py-2 text-sm transition-colors\",\r\n \"border-foreground data-[placeholder]:border-input data-[placeholder]:text-muted-foreground\",\r\n \"text-foreground\",\r\n \"focus-visible:outline-none focus-visible:ring-0\",\r\n \"disabled:cursor-not-allowed disabled:opacity-50\",\r\n \"data-[size=default]:h-9 data-[size=sm]:h-8\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n <SelectPrimitive.Icon asChild>\r\n <ChevronDown className=\"h-4 w-4 text-muted-foreground\" aria-hidden />\r\n </SelectPrimitive.Icon>\r\n </SelectPrimitive.Trigger>\r\n )\r\n}\r\n\r\nexport function SelectContent({\r\n className,\r\n children,\r\n position = \"popper\",\r\n ...props\r\n}: SelectContentProps) {\r\n return (\r\n <SelectPrimitive.Portal>\r\n <SelectPrimitive.Content\r\n data-slot=\"select-content\"\r\n position={position}\r\n className={cn(\r\n \"bg-popover text-popover-foreground border border-input\",\r\n \"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\r\n \"data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95\",\r\n \"relative z-50 max-h-[var(--radix-select-content-available-height)] min-w-[8rem] overflow-x-hidden overflow-y-auto rounded-md p-1\",\r\n position === \"popper\" &&\r\n \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n <SelectScrollUpButton />\r\n <SelectPrimitive.Viewport\r\n className={cn(\r\n \"p-1\",\r\n position === \"popper\" &&\r\n \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1\"\r\n )}\r\n >\r\n {children}\r\n </SelectPrimitive.Viewport>\r\n <SelectScrollDownButton />\r\n </SelectPrimitive.Content>\r\n </SelectPrimitive.Portal>\r\n )\r\n}\r\n\r\nexport function SelectLabel({ className, ...props }: SelectLabelProps) {\r\n return (\r\n <SelectPrimitive.Label\r\n data-slot=\"select-label\"\r\n className={cn(\"px-2 py-1.5 text-xs font-medium text-muted-foreground\", className)}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport function SelectItem({ className, children, ...props }: SelectItemProps) {\r\n return (\r\n <SelectPrimitive.Item\r\n data-slot=\"select-item\"\r\n className={cn(\r\n \"relative flex w-full cursor-default select-none items-center gap-2 rounded-sm py-1.5 pl-2 pr-8 text-sm outline-none\",\r\n \"focus:bg-background focus:text-foreground\",\r\n \"data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n <span className=\"absolute right-2 flex h-3.5 w-3.5 shrink-0 items-center justify-center\">\r\n <SelectPrimitive.ItemIndicator className=\"inline-flex\">\r\n <CircleCheck className=\"h-4 w-4 text-foreground\" aria-hidden />\r\n </SelectPrimitive.ItemIndicator>\r\n </span>\r\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\r\n </SelectPrimitive.Item>\r\n )\r\n}\r\n\r\nexport function SelectSeparator({ className, ...props }: SelectSeparatorProps) {\r\n return (\r\n <SelectPrimitive.Separator\r\n data-slot=\"select-separator\"\r\n className={cn(\"pointer-events-none -mx-1 my-1 h-px min-h-0 max-h-px shrink-0 bg-border/90\", className)}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nfunction SelectScrollUpButton({\r\n className,\r\n ...props\r\n}: React.ComponentProps<typeof SelectPrimitive.ScrollUpButton>) {\r\n return (\r\n <SelectPrimitive.ScrollUpButton\r\n data-slot=\"select-scroll-up-button\"\r\n className={cn(\"flex cursor-default items-center justify-center py-1 text-muted-foreground\", className)}\r\n {...props}\r\n >\r\n <ChevronUp className=\"h-4 w-4\" aria-hidden />\r\n </SelectPrimitive.ScrollUpButton>\r\n )\r\n}\r\n\r\nfunction SelectScrollDownButton({\r\n className,\r\n ...props\r\n}: React.ComponentProps<typeof SelectPrimitive.ScrollDownButton>) {\r\n return (\r\n <SelectPrimitive.ScrollDownButton\r\n data-slot=\"select-scroll-down-button\"\r\n className={cn(\"flex cursor-default items-center justify-center py-1 text-muted-foreground\", className)}\r\n {...props}\r\n >\r\n <ChevronDown className=\"h-4 w-4\" aria-hidden />\r\n </SelectPrimitive.ScrollDownButton>\r\n )\r\n}\r\n","/**\r\n * ButtonTooltip / Tooltip: Lightweight tooltip wrapper.\r\n *\r\n * Design-system contract\r\n * - Scope: UI-only primitive (2-app rule). No domain terms, no API calls.\r\n * - Tokens-only: uses semantic token classes only.\r\n * - A11y: trigger remains provided by consumer; tooltip shows on hover/focus.\r\n *\r\n * Note: This is the \"simple\" tooltip API used across the playground.\r\n * For Radix tooltip primitives (Trigger/Content/Provider), see `ui/tooltip.tsx`.\r\n *\r\n * @author: @mindtris-team\r\n * @version: 0.2.0\r\n * @since: 2026-02-01\r\n */\r\n\r\n\"use client\"\r\n\r\nimport * as React from 'react'\r\nimport { Transition } from '@headlessui/react'\r\nimport { cn } from '../../lib/utils'\r\n\r\nexport interface ButtonTooltipProps {\r\n children: React.ReactNode\r\n /** Tooltip content */\r\n content: React.ReactNode\r\n position?: 'top' | 'bottom' | 'left' | 'right'\r\n bg?: 'dark' | 'light'\r\n size?: 'sm' | 'md' | 'lg' | 'none'\r\n className?: string\r\n disabled?: boolean\r\n}\r\n\r\nexport function ButtonTooltip({\r\n children,\r\n content,\r\n position = 'bottom',\r\n bg = 'dark',\r\n size = 'none',\r\n className,\r\n disabled = false,\r\n}: ButtonTooltipProps) {\r\n const [tooltipOpen, setTooltipOpen] = React.useState(false)\r\n\r\n const positionOuterClasses = (pos: ButtonTooltipProps['position']) => {\r\n switch (pos) {\r\n case 'right':\r\n return 'left-full top-1/2 -translate-y-1/2'\r\n case 'left':\r\n return 'right-full top-1/2 -translate-y-1/2'\r\n case 'bottom':\r\n return 'top-full left-1/2 -translate-x-1/2'\r\n default:\r\n return 'bottom-full left-1/2 -translate-x-1/2'\r\n }\r\n }\r\n\r\n const positionInnerClasses = (pos: ButtonTooltipProps['position']) => {\r\n switch (pos) {\r\n case 'right':\r\n return 'ml-2'\r\n case 'left':\r\n return 'mr-2'\r\n case 'bottom':\r\n return 'mt-2'\r\n default:\r\n return 'mb-2'\r\n }\r\n }\r\n\r\n const sizeClasses = (s: ButtonTooltipProps['size']) => {\r\n switch (s) {\r\n case 'lg':\r\n return 'min-w-[18rem] px-3 py-2'\r\n case 'md':\r\n return 'min-w-[14rem] px-3 py-2'\r\n case 'sm':\r\n return 'min-w-[11rem] px-3 py-2'\r\n default:\r\n return 'px-3 py-2'\r\n }\r\n }\r\n\r\n const colorClasses = (b: ButtonTooltipProps['bg']) => {\r\n switch (b) {\r\n case 'light':\r\n return 'bg-popover text-popover-foreground border-border'\r\n case 'dark':\r\n return 'bg-foreground text-background border-border/60'\r\n default:\r\n return 'bg-popover text-popover-foreground border-border'\r\n }\r\n }\r\n\r\n const getArrowElement = () => {\r\n if (position !== 'bottom') return null\r\n return (\r\n <div\r\n className={cn(\r\n 'absolute bottom-full left-1/2 -translate-x-1/2 translate-y-1 w-2.5 h-2.5 rotate-45 border border-border',\r\n bg === 'dark' ? 'bg-foreground' : 'bg-popover'\r\n )}\r\n />\r\n )\r\n }\r\n\r\n return (\r\n <div\r\n className={cn('relative inline-flex', className)}\r\n onMouseEnter={() => !disabled && setTooltipOpen(true)}\r\n onMouseLeave={() => setTooltipOpen(false)}\r\n onFocus={() => !disabled && setTooltipOpen(true)}\r\n onBlur={() => setTooltipOpen(false)}\r\n >\r\n {children}\r\n <div className={cn('z-50 absolute pointer-events-none', positionOuterClasses(position))}>\r\n <Transition\r\n show={tooltipOpen && !disabled}\r\n as=\"div\"\r\n className={cn(\r\n 'rounded-lg border overflow-visible shadow-lg whitespace-nowrap relative',\r\n sizeClasses(size),\r\n colorClasses(bg),\r\n positionInnerClasses(position)\r\n )}\r\n enter=\"transition ease-out duration-200 transform\"\r\n enterFrom=\"opacity-0 -translate-y-2\"\r\n enterTo=\"opacity-100 translate-y-0\"\r\n leave=\"transition ease-out duration-200\"\r\n leaveFrom=\"opacity-100\"\r\n leaveTo=\"opacity-0\"\r\n unmount={false}\r\n >\r\n {getArrowElement()}\r\n {content}\r\n </Transition>\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\n/**\r\n * Tooltip\r\n * Alias for ButtonTooltip (generic name for consumers).\r\n */\r\nexport const Tooltip = ButtonTooltip\r\nexport type TooltipProps = ButtonTooltipProps\r\n\r\n","\"use client\"\r\n\r\nimport React from 'react'\r\nimport { Sun, Moon, Upload, ExternalLink } from 'lucide-react'\r\nimport { useThemeManager } from '../../theme/use-theme-manager'\r\nimport { colorThemes } from '../../theme/theme-data'\r\nimport { radiusOptions } from '../../theme/constants'\r\nimport type { ImportedTheme } from '../../theme/types'\r\nimport { ColorsPanel } from './colors-panel'\r\nimport { Select } from '../ui/select'\r\n\r\nexport type ThemeTabVariant = 'full' | 'colors-only' | 'others-only'\r\n\r\ninterface ThemeTabProps {\r\n selectedTheme: string\r\n setSelectedTheme: (theme: string) => void\r\n selectedRadius: string\r\n setSelectedRadius: (radius: string) => void\r\n setImportedTheme: (theme: ImportedTheme | null) => void\r\n onImportClick: () => void\r\n /** When set, render only colors section (Mindtris UI) or only others (Radius, Mode, Import). */\r\n variant?: ThemeTabVariant\r\n /** When true (e.g. preset in sidebar header), don't render preset selector. */\r\n hidePreset?: boolean\r\n}\r\n\r\nexport function ThemeTab({\r\n selectedTheme,\r\n setSelectedTheme,\r\n selectedRadius,\r\n setSelectedRadius,\r\n setImportedTheme,\r\n onImportClick,\r\n variant = 'full',\r\n hidePreset = false,\r\n}: ThemeTabProps) {\r\n const {\r\n isDarkMode,\r\n setTheme,\r\n applyTheme,\r\n applyRadius,\r\n } = useThemeManager()\r\n\r\n const handleThemeSelect = (themeValue: string) => {\r\n setSelectedTheme(themeValue)\r\n setImportedTheme(null)\r\n applyTheme(themeValue, isDarkMode)\r\n }\r\n\r\n const handleRadiusSelect = (radius: string) => {\r\n setSelectedRadius(radius)\r\n applyRadius(radius)\r\n }\r\n\r\n const handleLightMode = () => {\r\n if (isDarkMode === false) return\r\n setTheme(\"light\")\r\n }\r\n\r\n const handleDarkMode = () => {\r\n if (isDarkMode === true) return\r\n setTheme(\"dark\")\r\n }\r\n\r\n const showColors = variant === 'full' || variant === 'colors-only'\r\n const showOthers = variant === 'full' || variant === 'others-only'\r\n const showPreset = showColors && !hidePreset\r\n const colorsOnlyInSidebar = showColors && hidePreset && !showPreset && !showOthers\r\n\r\n return (\r\n <div\r\n className={\r\n colorsOnlyInSidebar\r\n ? 'px-3 pt-2 pb-4'\r\n : 'p-4 space-y-6'\r\n }\r\n >\r\n {showPreset && (\r\n <>\r\n {/* Mindtris UI — preset selector (no \"Mindtris Theme Presets\" label) */}\r\n <div className=\"space-y-3\">\r\n <label className=\"text-sm font-medium\">Mindtris UI</label>\r\n <Select\r\n value={selectedTheme}\r\n onChange={(e) => handleThemeSelect(e.target.value)}\r\n >\r\n {colorThemes.map((theme) => (\r\n <option key={theme.value} value={theme.value}>\r\n {theme.name}\r\n </option>\r\n ))}\r\n </Select>\r\n </div>\r\n {variant === 'full' && <div className=\"border-t border-border\" />}\r\n </>\r\n )}\r\n\r\n {showColors && hidePreset && (\r\n <ColorsPanel selectedTheme={selectedTheme} isDarkMode={isDarkMode} />\r\n )}\r\n\r\n {showOthers && (\r\n <>\r\n {variant === 'full' && <div className=\"border-t border-border\" />}\r\n {/* Radius Selection */}\r\n <div className=\"space-y-3\">\r\n <label className=\"text-sm font-medium\">Radius</label>\r\n <div className=\"grid grid-cols-5 gap-2\">\r\n {radiusOptions.map((option) => (\r\n <button\r\n key={option.value}\r\n onClick={() => handleRadiusSelect(option.value)}\r\n className={`\r\n relative rounded-md p-3 border transition-colors text-xs font-medium\r\n ${selectedRadius === option.value\r\n ? \"border-primary bg-primary/10\"\r\n : \"border-border hover:border-border/80\"\r\n }\r\n `}\r\n >\r\n {option.name}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n <div className=\"border-t border-border\" />\r\n\r\n {/* Mode Section */}\r\n <div className=\"space-y-3\">\r\n <label className=\"text-sm font-medium\">Mode</label>\r\n <div className=\"grid grid-cols-2 gap-2\">\r\n <button\r\n onClick={handleLightMode}\r\n className={`\r\n flex items-center justify-center gap-2 px-4 py-2 rounded-md text-sm font-medium transition-colors\r\n ${!isDarkMode\r\n ? \"bg-muted text-foreground\"\r\n : \"bg-card border border-border hover:bg-muted text-foreground\"\r\n }\r\n `}\r\n >\r\n <Sun className=\"w-4 h-4\" />\r\n Light\r\n </button>\r\n <button\r\n onClick={handleDarkMode}\r\n className={`\r\n flex items-center justify-center gap-2 px-4 py-2 rounded-md text-sm font-medium transition-colors\r\n ${isDarkMode\r\n ? \"bg-muted text-foreground\"\r\n : \"bg-card border border-border hover:bg-muted text-foreground\"\r\n }\r\n `}\r\n >\r\n <Moon className=\"w-4 h-4\" />\r\n Dark\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div className=\"border-t border-border\" />\r\n\r\n {/* Import Theme Button */}\r\n <div className=\"space-y-3\">\r\n <button\r\n onClick={onImportClick}\r\n className=\"w-full flex items-center justify-center gap-2 px-4 py-2 border border-border rounded-md hover:bg-muted transition-colors\"\r\n >\r\n <Upload className=\"w-4 h-4\" />\r\n Import Theme\r\n </button>\r\n </div>\r\n </>\r\n )}\r\n\r\n {variant === 'full' && (\r\n <>\r\n <div className=\"border-t border-border\" />\r\n {/* Tweakcn Info */}\r\n <div className=\"p-4 bg-muted rounded-lg space-y-3\">\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"text-sm font-medium\">Advanced Customization</span>\r\n </div>\r\n <p className=\"text-xs text-muted-foreground\">\r\n For advanced theme customization with real-time preview, visit{\" \"}\r\n <a\r\n href=\"https://tweakcn.com/editor/theme\"\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n className=\"text-primary hover:underline font-medium\"\r\n >\r\n tweakcn.com\r\n </a>\r\n </p>\r\n <button\r\n className=\"w-full flex items-center justify-center gap-2 px-4 py-2 border border-border rounded-md hover:bg-muted/70 transition-colors text-sm\"\r\n onClick={() => typeof window !== \"undefined\" && window.open('https://tweakcn.com/editor/theme', '_blank')}\r\n >\r\n <ExternalLink className=\"w-4 h-4\" />\r\n Open Tweakcn\r\n </button>\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n )\r\n}\r\n","'use client'\r\n\r\nimport React from 'react'\r\nimport { colorGroups } from '../../theme/constants'\r\nimport { useThemeManager } from '../../theme/use-theme-manager'\r\nimport { CollapsibleSection } from '../ui/collapsible-section'\r\nimport { ColorInput } from './color-input'\r\nimport { validateColorValue } from '../../theme/utils/validation'\r\n\r\n/** Read current CSS variable values from document (like tweakcn) */\r\nfunction getComputedColorValues(): Record<string, string> {\r\n if (typeof document === 'undefined') return {}\r\n const root = document.documentElement\r\n const styles = getComputedStyle(root)\r\n const out: Record<string, string> = {}\r\n colorGroups.forEach((group) => {\r\n group.colors.forEach((c) => {\r\n const varName = c.cssVar.startsWith('--') ? c.cssVar : `--${c.cssVar}`\r\n const value = styles.getPropertyValue(varName).trim()\r\n if (value) out[c.cssVar] = value\r\n })\r\n })\r\n return out\r\n}\r\n\r\ninterface ColorsPanelProps {\r\n /** When these change (e.g. preset or mode), re-read values from document */\r\n selectedTheme?: string\r\n isDarkMode?: boolean\r\n}\r\n\r\nexport function ColorsPanel({ selectedTheme, isDarkMode }: ColorsPanelProps = {}) {\r\n const { handleColorChange } = useThemeManager()\r\n const [colorValues, setColorValues] = React.useState<Record<string, string>>({})\r\n const [validationErrors, setValidationErrors] = React.useState<Record<string, string>>({})\r\n const [openGroups, setOpenGroups] = React.useState<Record<string, boolean>>(() => {\r\n const o: Record<string, boolean> = {}\r\n colorGroups.forEach((g) => { o[g.title] = true })\r\n return o\r\n })\r\n\r\n const refreshValues = React.useCallback(() => {\r\n setColorValues(getComputedColorValues())\r\n }, [])\r\n\r\n React.useEffect(() => {\r\n refreshValues()\r\n }, [refreshValues, selectedTheme, isDarkMode])\r\n\r\n const handleChange = React.useCallback(\r\n (cssVar: string, value: string) => {\r\n const validation = validateColorValue(value)\r\n if (validation.isValid) {\r\n handleColorChange(cssVar, value)\r\n setColorValues((prev) => ({ ...prev, [cssVar]: value }))\r\n setValidationErrors((prev) => {\r\n const next = { ...prev }\r\n delete next[cssVar]\r\n return next\r\n })\r\n } else {\r\n setValidationErrors((prev) => ({\r\n ...prev,\r\n [cssVar]: validation.error || 'Invalid color value'\r\n }))\r\n }\r\n },\r\n [handleColorChange]\r\n )\r\n\r\n const toggleGroup = (title: string) => {\r\n setOpenGroups((prev) => ({ ...prev, [title]: !prev[title] }))\r\n }\r\n\r\n return (\r\n <div className=\"space-y-3 pt-5 pb-2\">\r\n {colorGroups.map((group) => (\r\n <CollapsibleSection\r\n key={group.title}\r\n title={group.title}\r\n open={openGroups[group.title] !== false}\r\n onToggle={() => toggleGroup(group.title)}\r\n >\r\n {group.colors.map((color) => (\r\n <div key={color.cssVar} className=\"space-y-1\">\r\n <ColorInput\r\n label={color.name}\r\n cssVar={color.cssVar}\r\n value={colorValues[color.cssVar] ?? ''}\r\n onChange={handleChange}\r\n className={validationErrors[color.cssVar] ? 'border-destructive' : ''}\r\n />\r\n {validationErrors[color.cssVar] && (\r\n <p className=\"text-xs text-destructive px-1\">{validationErrors[color.cssVar]}</p>\r\n )}\r\n </div>\r\n ))}\r\n </CollapsibleSection>\r\n ))}\r\n </div>\r\n )\r\n}\r\n","'use client'\r\n\r\nimport React from 'react'\r\nimport { cn } from '../../lib/utils'\r\nimport { Input } from '../ui/input'\r\n\r\n/** Single color row: swatch + label + input (like tweakcn / form input with prefix) */\r\ninterface ColorInputProps {\r\n label: string\r\n cssVar: string\r\n value: string\r\n onChange: (cssVar: string, value: string) => void\r\n className?: string\r\n}\r\n\r\nexport function ColorInput({ label, cssVar, value, onChange, className }: ColorInputProps) {\r\n const swatchColor = value && value.trim() !== '' ? value : 'transparent'\r\n const showBorder = !swatchColor || swatchColor === 'transparent'\r\n\r\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n onChange(cssVar, e.target.value)\r\n }\r\n\r\n return (\r\n <div className={cn('space-y-1.5', className)}>\r\n <label className=\"text-xs font-medium text-muted-foreground\">{label}</label>\r\n <div className=\"flex items-center gap-2\">\r\n <div\r\n className=\"h-8 w-8 shrink-0 rounded-md border border-border bg-background overflow-hidden\"\r\n title={value}\r\n >\r\n <div\r\n className=\"h-full w-full rounded-[calc(var(--radius)-1px)] border border-border\"\r\n style={{\r\n background: swatchColor,\r\n borderColor: showBorder ? 'var(--border)' : 'transparent',\r\n }}\r\n />\r\n </div>\r\n <Input\r\n type=\"text\"\r\n value={value}\r\n onChange={handleChange}\r\n className=\"flex-1 min-w-0 text-xs font-mono\"\r\n placeholder=\"e.g. #755ff8\"\r\n spellCheck={false}\r\n />\r\n </div>\r\n </div>\r\n )\r\n}\r\n","\"use client\"\r\n\r\nimport React from 'react'\r\nimport { sidebarVariants, sidebarCollapsibleOptions, sidebarSideOptions } from '../../theme/constants'\r\n\r\n// Sidebar Variant, Collapsible Mode, and Position only take effect when the app\r\n// passes sidebarConfig + onSidebarConfigChange and uses that state in the layout.\r\n// Otherwise this is UI-only; connect to your sidebar context/state to enable.\r\n\r\ninterface LayoutTabProps {\r\n // Optional: If you have sidebar state management, pass it here\r\n sidebarConfig?: {\r\n variant?: \"sidebar\" | \"floating\" | \"inset\";\r\n collapsible?: \"offcanvas\" | \"icon\" | \"none\";\r\n side?: \"left\" | \"right\";\r\n };\r\n onSidebarConfigChange?: (config: {\r\n variant?: \"sidebar\" | \"floating\" | \"inset\";\r\n collapsible?: \"offcanvas\" | \"icon\" | \"none\";\r\n side?: \"left\" | \"right\";\r\n }) => void;\r\n}\r\n\r\nexport function LayoutTab({ sidebarConfig, onSidebarConfigChange }: LayoutTabProps) {\r\n // Default config if not provided\r\n const config = sidebarConfig || {\r\n variant: \"inset\" as const,\r\n collapsible: \"offcanvas\" as const,\r\n side: \"left\" as const,\r\n }\r\n\r\n const handleSidebarVariantSelect = (variant: \"sidebar\" | \"floating\" | \"inset\") => {\r\n onSidebarConfigChange?.({ ...config, variant })\r\n }\r\n\r\n const handleSidebarCollapsibleSelect = (collapsible: \"offcanvas\" | \"icon\" | \"none\") => {\r\n onSidebarConfigChange?.({ ...config, collapsible })\r\n }\r\n\r\n const handleSidebarSideSelect = (side: \"left\" | \"right\") => {\r\n onSidebarConfigChange?.({ ...config, side })\r\n }\r\n\r\n return (\r\n <div className=\"space-y-4\">\r\n <p className=\"text-xs text-muted-foreground\">\r\n These options apply only when your app wires <code className=\"text-[10px]\">sidebarConfig</code> and <code className=\"text-[10px]\">onSidebarConfigChange</code> to the layout.\r\n </p>\r\n {/* Sidebar Configuration */}\r\n <div className=\"space-y-3\">\r\n <div>\r\n <label className=\"text-sm font-medium\">Sidebar Variant</label>\r\n {config.variant && (\r\n <p className=\"text-xs text-muted-foreground mt-1\">\r\n {config.variant === \"sidebar\" && \"Default: Standard sidebar layout\"}\r\n {config.variant === \"floating\" && \"Floating: Floating sidebar with border\"}\r\n {config.variant === \"inset\" && \"Inset: Inset sidebar with rounded corners\"}\r\n </p>\r\n )}\r\n </div>\r\n <div className=\"grid grid-cols-3 gap-3\">\r\n {sidebarVariants.map((variant) => (\r\n <div\r\n key={variant.value}\r\n onClick={() => handleSidebarVariantSelect(variant.value)}\r\n className={`\r\n relative p-4 border rounded-md cursor-pointer transition-colors\r\n ${config.variant === variant.value\r\n ? \"border-primary bg-primary/10\"\r\n : \"border-border hover:border-border/80\"\r\n }\r\n `}\r\n >\r\n <div className=\"space-y-2\">\r\n <div className=\"text-xs font-semibold text-center\">{variant.name}</div>\r\n <div className={`flex h-12 rounded border border-border ${variant.value === \"inset\" ? \"bg-muted\" : \"bg-card\"}`}>\r\n <div \r\n className={`w-3 flex-shrink-0 bg-muted/70 flex flex-col gap-0.5 p-1 ${\r\n variant.value === \"floating\" ? \"border-r m-1 rounded\" :\r\n variant.value === \"inset\" ? \"m-1 ms-0 rounded bg-muted/70\" :\r\n \"border-r\"\r\n }`}\r\n >\r\n <div className=\"h-0.5 w-full bg-muted-foreground/70 rounded\"></div>\r\n <div className=\"h-0.5 w-3/4 bg-muted-foreground/60 rounded\"></div>\r\n <div className=\"h-0.5 w-2/3 bg-muted-foreground/50 rounded\"></div>\r\n <div className=\"h-0.5 w-3/4 bg-muted-foreground/40 rounded\"></div>\r\n </div>\r\n <div className={`flex-1 ${variant.value === \"inset\" ? \"bg-card ms-0\" : \"bg-muted\"} m-1 rounded-sm border-dashed border border-border`}>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n \r\n {/* Sidebar Collapsible Mode */}\r\n <div className=\"space-y-3\">\r\n <div>\r\n <label className=\"text-sm font-medium\">Sidebar Collapsible Mode</label>\r\n {config.collapsible && (\r\n <p className=\"text-xs text-muted-foreground mt-1\">\r\n {config.collapsible === \"offcanvas\" && \"Off Canvas: Slides out of view\"}\r\n {config.collapsible === \"icon\" && \"Icon: Collapses to icon only\"}\r\n {config.collapsible === \"none\" && \"None: Always visible\"}\r\n </p>\r\n )}\r\n </div>\r\n <div className=\"grid grid-cols-3 gap-3\">\r\n {sidebarCollapsibleOptions.map((option) => (\r\n <div\r\n key={option.value}\r\n onClick={() => handleSidebarCollapsibleSelect(option.value)}\r\n className={`\r\n relative p-4 border rounded-md cursor-pointer transition-colors\r\n ${config.collapsible === option.value\r\n ? \"border-primary bg-primary/10\"\r\n : \"border-border hover:border-border/80\"\r\n }\r\n `}\r\n >\r\n <div className=\"space-y-2\">\r\n <div className=\"text-xs font-semibold text-center\">{option.name}</div>\r\n <div className=\"flex h-12 rounded border border-border bg-card\">\r\n {option.value === \"offcanvas\" ? (\r\n <div className=\"flex-1 bg-muted m-1 rounded-sm border-dashed border border-border flex items-center justify-start pl-2\">\r\n <div className=\"flex flex-col gap-0.5\">\r\n <div className=\"w-3 h-0.5 bg-muted-foreground/70 rounded\"></div>\r\n <div className=\"w-3 h-0.5 bg-muted-foreground/70 rounded\"></div>\r\n <div className=\"w-3 h-0.5 bg-muted-foreground/70 rounded\"></div>\r\n </div>\r\n </div>\r\n ) : option.value === \"icon\" ? (\r\n <>\r\n <div className=\"w-4 flex-shrink-0 bg-muted/70 flex flex-col gap-1 p-1 border-r border-border items-center\">\r\n <div className=\"w-2 h-2 bg-muted-foreground/70 rounded-sm\"></div>\r\n <div className=\"w-2 h-2 bg-muted-foreground/60 rounded-sm\"></div>\r\n <div className=\"w-2 h-2 bg-muted-foreground/50 rounded-sm\"></div>\r\n </div>\r\n <div className=\"flex-1 bg-muted m-1 rounded-sm border-dashed border border-border\"></div>\r\n </>\r\n ) : (\r\n <>\r\n <div className=\"w-6 flex-shrink-0 bg-muted/70 flex flex-col gap-0.5 p-1 border-r border-border\">\r\n <div className=\"h-0.5 w-full bg-muted-foreground/70 rounded\"></div>\r\n <div className=\"h-0.5 w-3/4 bg-muted-foreground/60 rounded\"></div>\r\n <div className=\"h-0.5 w-2/3 bg-muted-foreground/50 rounded\"></div>\r\n <div className=\"h-0.5 w-3/4 bg-muted-foreground/40 rounded\"></div>\r\n </div>\r\n <div className=\"flex-1 bg-muted m-1 rounded-sm border-dashed border border-border\"></div>\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {/* Sidebar Side */}\r\n <div className=\"space-y-3\">\r\n <div>\r\n <label className=\"text-sm font-medium\">Sidebar Position</label>\r\n {config.side && (\r\n <p className=\"text-xs text-muted-foreground mt-1\">\r\n {config.side === \"left\" && \"Left: Sidebar positioned on the left side\"}\r\n {config.side === \"right\" && \"Right: Sidebar positioned on the right side\"}\r\n </p>\r\n )}\r\n </div>\r\n <div className=\"grid grid-cols-2 gap-3\">\r\n {sidebarSideOptions.map((side) => (\r\n <div\r\n key={side.value}\r\n onClick={() => handleSidebarSideSelect(side.value)}\r\n className={`\r\n relative p-4 border rounded-md cursor-pointer transition-colors\r\n ${config.side === side.value\r\n ? \"border-primary bg-primary/10\"\r\n : \"border-border hover:border-border/80\"\r\n }\r\n `}\r\n >\r\n <div className=\"space-y-2\">\r\n <div className=\"text-xs font-semibold text-center\">{side.name}</div>\r\n <div className=\"flex h-12 rounded border border-border bg-card\">\r\n {side.value === \"left\" ? (\r\n <>\r\n <div className=\"w-6 flex-shrink-0 bg-muted/70 flex flex-col gap-0.5 p-1 border-r border-border\">\r\n <div className=\"h-0.5 w-full bg-muted-foreground/70 rounded\"></div>\r\n <div className=\"h-0.5 w-3/4 bg-muted-foreground/60 rounded\"></div>\r\n <div className=\"h-0.5 w-2/3 bg-muted-foreground/50 rounded\"></div>\r\n <div className=\"h-0.5 w-3/4 bg-muted-foreground/40 rounded\"></div>\r\n </div>\r\n <div className=\"flex-1 bg-muted m-1 rounded-sm border-dashed border border-border\"></div>\r\n </>\r\n ) : (\r\n <>\r\n <div className=\"flex-1 bg-muted m-1 rounded-sm border-dashed border border-border\"></div>\r\n <div className=\"w-6 flex-shrink-0 bg-muted/70 flex flex-col gap-0.5 p-1 border-l border-border\">\r\n <div className=\"h-0.5 w-full bg-muted-foreground/70 rounded\"></div>\r\n <div className=\"h-0.5 w-3/4 bg-muted-foreground/60 rounded\"></div>\r\n <div className=\"h-0.5 w-2/3 bg-muted-foreground/50 rounded\"></div>\r\n <div className=\"h-0.5 w-3/4 bg-muted-foreground/40 rounded\"></div>\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n </div>\r\n )\r\n}\r\n","'use client'\r\n\r\nimport React from 'react'\r\nimport { radiusOptions } from '../../theme/constants'\r\nimport { useThemeManager } from '../../theme/use-theme-manager'\r\nimport { CollapsibleSection } from '../ui/collapsible-section'\r\nimport { Input } from '../ui/input'\r\nimport { Button } from '../ui/button'\r\nimport { LayoutTab } from './layout-tab'\r\nimport { cn } from '../../lib/utils'\r\nimport {\r\n validateHSLValue,\r\n validateSpacingValue,\r\n validateShadowValue,\r\n validateRadiusValue\r\n} from '../../theme/utils/validation'\r\n\r\n/** Read current CSS var values from document (same single source as Colors/Typography). */\r\nfunction getComputedOtherValues(): Record<string, string> {\r\n if (typeof document === 'undefined') return {}\r\n const root = document.documentElement\r\n const styles = getComputedStyle(root)\r\n const get = (name: string) => styles.getPropertyValue(`--${name}`).trim()\r\n return {\r\n '--hue-shift': get('hue-shift') || '0',\r\n '--saturation-mult': get('saturation-mult') || '1',\r\n '--lightness-mult': get('lightness-mult') || '1',\r\n '--spacing': get('spacing') || '',\r\n '--shadow-color': get('shadow-color') || '',\r\n '--shadow-opacity': get('shadow-opacity') || '',\r\n '--shadow-blur': get('shadow-blur') || '',\r\n '--shadow-spread': get('shadow-spread') || '',\r\n '--shadow-x': get('shadow-x') || '',\r\n '--shadow-y': get('shadow-y') || '',\r\n }\r\n}\r\n\r\nfunction getComputedRadius(): string {\r\n if (typeof document === 'undefined') return ''\r\n const styles = getComputedStyle(document.documentElement)\r\n return styles.getPropertyValue('--radius').trim()\r\n}\r\n\r\n/** Other tab: matches tweakcn order — Mode, HSL, Radius, Spacing, Shadow (no separators). Optional Layout section (wire sidebarConfig + onSidebarConfigChange to apply; hide with hideLayoutSection). */\r\ninterface OtherPanelProps {\r\n /** Controlled radius value (optional). If omitted, panel reads `--radius` from the active theme. */\r\n selectedRadius?: string\r\n /** Controlled radius setter (optional). */\r\n setSelectedRadius?: (value: string) => void\r\n onImportClick?: () => void\r\n /** When true, hide Mode (Light/Dark) controls. Useful when host app owns mode toggle. */\r\n hideModeSection?: boolean\r\n /** When true, Layout (Sidebar Variant / Collapsible / Position) is not shown. */\r\n hideLayoutSection?: boolean\r\n sidebarConfig?: {\r\n variant?: 'sidebar' | 'floating' | 'inset'\r\n collapsible?: 'offcanvas' | 'icon' | 'none'\r\n side?: 'left' | 'right'\r\n }\r\n onSidebarConfigChange?: (config: { variant?: 'sidebar' | 'floating' | 'inset'; collapsible?: 'offcanvas' | 'icon' | 'none'; side?: 'left' | 'right' }) => void\r\n}\r\n\r\nexport function OtherPanel({\r\n selectedRadius,\r\n setSelectedRadius,\r\n onImportClick,\r\n hideModeSection = false,\r\n hideLayoutSection = false,\r\n sidebarConfig,\r\n onSidebarConfigChange,\r\n}: OtherPanelProps) {\r\n const { applyRadius, setTheme, isDarkMode, handleColorChange } = useThemeManager()\r\n const [hslOpen, setHslOpen] = React.useState(true)\r\n const [hslPresetsOpen, setHslPresetsOpen] = React.useState(true)\r\n const [radiusOpen, setRadiusOpen] = React.useState(true)\r\n const [spacingOpen, setSpacingOpen] = React.useState(true)\r\n const [shadowOpen, setShadowOpen] = React.useState(true)\r\n const [values, setValues] = React.useState<Record<string, string>>({})\r\n const [uncontrolledRadius, setUncontrolledRadius] = React.useState<string>('')\r\n const effectiveRadius = selectedRadius ?? uncontrolledRadius\r\n\r\n React.useEffect(() => {\r\n setValues(getComputedOtherValues())\r\n if (selectedRadius == null) {\r\n setUncontrolledRadius(getComputedRadius())\r\n }\r\n }, [isDarkMode, selectedRadius])\r\n\r\n // Watch theme updates (inline style/class changes) and keep UI in sync.\r\n React.useEffect(() => {\r\n if (typeof document === 'undefined') return\r\n const root = document.documentElement\r\n\r\n const refresh = () => {\r\n setValues(getComputedOtherValues())\r\n if (selectedRadius == null) {\r\n setUncontrolledRadius(getComputedRadius())\r\n }\r\n }\r\n\r\n refresh()\r\n\r\n const obs = new MutationObserver(() => refresh())\r\n obs.observe(root, { attributes: true, attributeFilter: ['style', 'class'] })\r\n return () => obs.disconnect()\r\n }, [selectedRadius])\r\n\r\n const [validationErrors, setValidationErrors] = React.useState<Record<string, string>>({})\r\n\r\n const handleChange = (cssVar: string, value: string) => {\r\n // Validate based on variable type\r\n let validation: { isValid: boolean; error?: string } = { isValid: true }\r\n \r\n if (cssVar === '--hue-shift') {\r\n validation = validateHSLValue(value, 'hue')\r\n } else if (cssVar === '--saturation-mult') {\r\n validation = validateHSLValue(value, 'saturation')\r\n } else if (cssVar === '--lightness-mult') {\r\n validation = validateHSLValue(value, 'lightness')\r\n } else if (cssVar === '--spacing') {\r\n validation = validateSpacingValue(value)\r\n } else if (cssVar === '--shadow-opacity') {\r\n validation = validateShadowValue(value, 'opacity')\r\n } else if (cssVar === '--shadow-blur') {\r\n validation = validateShadowValue(value, 'blur')\r\n } else if (cssVar === '--shadow-spread') {\r\n validation = validateShadowValue(value, 'spread')\r\n } else if (cssVar === '--shadow-x' || cssVar === '--shadow-y') {\r\n validation = validateShadowValue(value, 'offset')\r\n }\r\n\r\n if (validation.isValid) {\r\n handleColorChange(cssVar, value)\r\n setValues((prev) => ({ ...prev, [cssVar]: value }))\r\n setValidationErrors((prev) => {\r\n const next = { ...prev }\r\n delete next[cssVar]\r\n return next\r\n })\r\n } else {\r\n setValidationErrors((prev) => ({\r\n ...prev,\r\n [cssVar]: validation.error || 'Invalid value'\r\n }))\r\n }\r\n }\r\n\r\n const handleRadiusSelect = (value: string) => {\r\n const validation = validateRadiusValue(value)\r\n if (validation.isValid) {\r\n if (setSelectedRadius) setSelectedRadius(value)\r\n else setUncontrolledRadius(value)\r\n applyRadius(value)\r\n setValidationErrors((prev) => {\r\n const next = { ...prev }\r\n delete next['--radius']\r\n return next\r\n })\r\n } else {\r\n setValidationErrors((prev) => ({\r\n ...prev,\r\n '--radius': validation.error || 'Invalid radius value'\r\n }))\r\n }\r\n }\r\n\r\n const hslPresets = React.useMemo(\r\n () =>\r\n [\r\n { name: 'Default', hue: 0, sat: 1, light: 1 },\r\n { name: 'Warm', hue: 30, sat: 1.2, light: 1.05 },\r\n { name: 'Sunset', hue: 60, sat: 1.5, light: 1.1 },\r\n { name: 'Cool', hue: 220, sat: 1.15, light: 1.05 },\r\n { name: 'Neon', hue: 120, sat: 1.8, light: 1.05 },\r\n { name: 'Muted', hue: 0, sat: 0.8, light: 1 },\r\n { name: 'Contrast+', hue: 0, sat: 1, light: 1.15 },\r\n { name: 'Contrast-', hue: 0, sat: 1, light: 0.9 },\r\n { name: 'Mono+', hue: 0, sat: 0.6, light: 1.05 },\r\n { name: 'Mono-', hue: 0, sat: 0.6, light: 0.95 },\r\n ] as const,\r\n [],\r\n )\r\n\r\n const setHsl = React.useCallback(\r\n (next: { hue?: number; sat?: number; light?: number }) => {\r\n const hue = next.hue ?? (parseFloat(values['--hue-shift'] ?? '0') || 0)\r\n const sat = next.sat ?? (parseFloat(values['--saturation-mult'] ?? '1') || 1)\r\n const light = next.light ?? (parseFloat(values['--lightness-mult'] ?? '1') || 1)\r\n\r\n handleChange('--hue-shift', String(hue))\r\n handleChange('--saturation-mult', String(sat))\r\n handleChange('--lightness-mult', String(light))\r\n },\r\n [handleChange, values],\r\n )\r\n\r\n return (\r\n <div className=\"space-y-4 pt-5 pb-2\">\r\n {/* Mode first (like tweakcn top-level controls) — no separator */}\r\n {!hideModeSection && (\r\n <div className=\"space-y-2\">\r\n <label className=\"block text-sm font-medium\">Mode</label>\r\n <div className=\"grid grid-cols-2 gap-2\">\r\n <Button\r\n type=\"button\"\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={() => setTheme('light')}\r\n className={cn(!isDarkMode && 'border-primary bg-primary/10 text-primary')}\r\n >\r\n Light\r\n </Button>\r\n <Button\r\n type=\"button\"\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={() => setTheme('dark')}\r\n className={cn(isDarkMode && 'border-primary bg-primary/10 text-primary')}\r\n >\r\n Dark\r\n </Button>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* HSL like tweakcn: label + input + unit suffix (deg, x, x) */}\r\n <CollapsibleSection title=\"HSL Adjustments\" open={hslOpen} onToggle={() => setHslOpen(!hslOpen)}>\r\n <div className=\"pt-2 space-y-4\">\r\n {/* Presets */}\r\n <div className=\"flex items-center justify-center\">\r\n <button\r\n type=\"button\"\r\n onClick={() => setHslPresetsOpen((v) => !v)}\r\n className=\"text-sm font-medium text-muted-foreground hover:text-foreground transition-colors inline-flex items-center gap-2\"\r\n >\r\n {hslPresetsOpen ? 'Hide presets' : 'Show presets'}\r\n <span className={cn('transition-transform', hslPresetsOpen ? 'rotate-180' : '')}>^</span>\r\n </button>\r\n </div>\r\n\r\n {hslPresetsOpen && (\r\n <div className=\"flex flex-wrap items-center justify-center gap-2\">\r\n {hslPresets.map((p) => (\r\n <button\r\n key={p.name}\r\n type=\"button\"\r\n onClick={() => setHsl({ hue: p.hue, sat: p.sat, light: p.light })}\r\n className=\"h-10 w-10 rounded-lg border border-border bg-card shadow-none overflow-hidden\"\r\n aria-label={`HSL preset: ${p.name}`}\r\n title={p.name}\r\n >\r\n <div\r\n className=\"h-full w-full\"\r\n style={{\r\n background:\r\n `linear-gradient(90deg, hsl(${p.hue} 80% 45%) 0 50%, hsl(${(p.hue + 220) % 360} 80% 55%) 50% 100%)`,\r\n }}\r\n />\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n\r\n {/* Sliders */}\r\n <div className=\"space-y-5\">\r\n {/* Hue */}\r\n <div className=\"space-y-2\">\r\n <div className=\"flex items-center justify-between gap-3\">\r\n <label className=\"text-sm font-medium\">Hue Shift</label>\r\n <div className=\"flex items-center gap-2\">\r\n <Input\r\n type=\"text\"\r\n value={values['--hue-shift'] ?? '0'}\r\n onChange={(e) => handleChange('--hue-shift', e.target.value)}\r\n className={cn(\r\n 'w-20 font-mono text-xs shadow-none',\r\n validationErrors['--hue-shift'] && 'border-destructive',\r\n )}\r\n />\r\n <span className=\"text-xs text-muted-foreground\">deg</span>\r\n </div>\r\n </div>\r\n <input\r\n type=\"range\"\r\n min={0}\r\n max={360}\r\n step={1}\r\n value={parseFloat(values['--hue-shift'] ?? '0') || 0}\r\n onChange={(e) => handleChange('--hue-shift', e.target.value)}\r\n className=\"w-full h-2 rounded-full bg-muted accent-foreground\"\r\n />\r\n {validationErrors['--hue-shift'] && <p className=\"text-xs text-destructive\">{validationErrors['--hue-shift']}</p>}\r\n </div>\r\n\r\n {/* Saturation */}\r\n <div className=\"space-y-2\">\r\n <div className=\"flex items-center justify-between gap-3\">\r\n <label className=\"text-sm font-medium\">Saturation Multiplier</label>\r\n <div className=\"flex items-center gap-2\">\r\n <Input\r\n type=\"text\"\r\n value={values['--saturation-mult'] ?? '1'}\r\n onChange={(e) => handleChange('--saturation-mult', e.target.value)}\r\n className={cn(\r\n 'w-20 font-mono text-xs shadow-none',\r\n validationErrors['--saturation-mult'] && 'border-destructive',\r\n )}\r\n />\r\n <span className=\"text-xs text-muted-foreground\">x</span>\r\n </div>\r\n </div>\r\n <input\r\n type=\"range\"\r\n min={0}\r\n max={3}\r\n step={0.05}\r\n value={parseFloat(values['--saturation-mult'] ?? '1') || 1}\r\n onChange={(e) => handleChange('--saturation-mult', e.target.value)}\r\n className=\"w-full h-2 rounded-full bg-muted accent-foreground\"\r\n />\r\n {validationErrors['--saturation-mult'] && (\r\n <p className=\"text-xs text-destructive\">{validationErrors['--saturation-mult']}</p>\r\n )}\r\n </div>\r\n\r\n {/* Lightness */}\r\n <div className=\"space-y-2\">\r\n <div className=\"flex items-center justify-between gap-3\">\r\n <label className=\"text-sm font-medium\">Lightness Multiplier</label>\r\n <div className=\"flex items-center gap-2\">\r\n <Input\r\n type=\"text\"\r\n value={values['--lightness-mult'] ?? '1'}\r\n onChange={(e) => handleChange('--lightness-mult', e.target.value)}\r\n className={cn(\r\n 'w-20 font-mono text-xs shadow-none',\r\n validationErrors['--lightness-mult'] && 'border-destructive',\r\n )}\r\n />\r\n <span className=\"text-xs text-muted-foreground\">x</span>\r\n </div>\r\n </div>\r\n <input\r\n type=\"range\"\r\n min={0}\r\n max={3}\r\n step={0.05}\r\n value={parseFloat(values['--lightness-mult'] ?? '1') || 1}\r\n onChange={(e) => handleChange('--lightness-mult', e.target.value)}\r\n className=\"w-full h-2 rounded-full bg-muted accent-foreground\"\r\n />\r\n {validationErrors['--lightness-mult'] && (\r\n <p className=\"text-xs text-destructive\">{validationErrors['--lightness-mult']}</p>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n </CollapsibleSection>\r\n\r\n {/* Radius */}\r\n <CollapsibleSection title=\"Radius\" open={radiusOpen} onToggle={() => setRadiusOpen(!radiusOpen)}>\r\n <div className=\"pt-2 space-y-2\">\r\n <label className=\"text-sm font-medium\">Corner radius</label>\r\n <div className=\"flex flex-wrap gap-2\">\r\n {radiusOptions.map((opt) => (\r\n <Button\r\n key={opt.value}\r\n type=\"button\"\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={() => handleRadiusSelect(opt.value)}\r\n className={cn(effectiveRadius === opt.value && 'border-primary bg-primary/10 text-primary')}\r\n >\r\n {opt.name}\r\n </Button>\r\n ))}\r\n </div>\r\n {validationErrors['--radius'] && <p className=\"text-xs text-destructive\">{validationErrors['--radius']}</p>}\r\n </div>\r\n </CollapsibleSection>\r\n\r\n <CollapsibleSection title=\"Spacing\" open={spacingOpen} onToggle={() => setSpacingOpen(!spacingOpen)}>\r\n <div className=\"pt-2 space-y-1\">\r\n <label className=\"block text-xs font-medium text-muted-foreground mb-1.5\">Spacing (base scale for layout, rem)</label>\r\n <Input\r\n type=\"text\"\r\n value={values['--spacing'] ?? ''}\r\n onChange={(e) => handleChange('--spacing', e.target.value)}\r\n placeholder=\"rem\"\r\n className={cn(\r\n \"font-mono text-xs\",\r\n validationErrors['--spacing'] && \"border-destructive\"\r\n )}\r\n />\r\n {validationErrors['--spacing'] && (\r\n <p className=\"text-xs text-destructive\">{validationErrors['--spacing']}</p>\r\n )}\r\n </div>\r\n </CollapsibleSection>\r\n\r\n <CollapsibleSection title=\"Shadow\" open={shadowOpen} onToggle={() => setShadowOpen(!shadowOpen)}>\r\n <div className=\"space-y-3 pt-2\">\r\n <div>\r\n <label className=\"block text-xs font-medium text-muted-foreground mb-1.5\">Shadow color</label>\r\n <Input\r\n type=\"text\"\r\n value={values['--shadow-color'] ?? ''}\r\n onChange={(e) => handleChange('--shadow-color', e.target.value)}\r\n placeholder=\"—\"\r\n className=\"font-mono text-xs\"\r\n />\r\n </div>\r\n <div>\r\n <label className=\"block text-xs font-medium text-muted-foreground mb-1.5\">Shadow Opacity</label>\r\n <Input\r\n type=\"text\"\r\n value={values['--shadow-opacity'] ?? ''}\r\n onChange={(e) => handleChange('--shadow-opacity', e.target.value)}\r\n placeholder=\"—\"\r\n className=\"font-mono text-xs\"\r\n />\r\n </div>\r\n <div className=\"grid grid-cols-2 gap-2\">\r\n <div>\r\n <label className=\"block text-xs font-medium text-muted-foreground mb-1.5\">Blur radius</label>\r\n <Input\r\n type=\"text\"\r\n value={values['--shadow-blur'] ?? ''}\r\n onChange={(e) => handleChange('--shadow-blur', e.target.value)}\r\n placeholder=\"px\"\r\n className=\"font-mono text-xs\"\r\n />\r\n </div>\r\n <div>\r\n <label className=\"block text-xs font-medium text-muted-foreground mb-1.5\">Spread</label>\r\n <Input\r\n type=\"text\"\r\n value={values['--shadow-spread'] ?? ''}\r\n onChange={(e) => handleChange('--shadow-spread', e.target.value)}\r\n placeholder=\"px\"\r\n className=\"font-mono text-xs\"\r\n />\r\n </div>\r\n </div>\r\n <div className=\"grid grid-cols-2 gap-2\">\r\n <div>\r\n <label className=\"block text-xs font-medium text-muted-foreground mb-1.5\">Offset X</label>\r\n <Input\r\n type=\"text\"\r\n value={values['--shadow-x'] ?? ''}\r\n onChange={(e) => handleChange('--shadow-x', e.target.value)}\r\n placeholder=\"px\"\r\n className=\"font-mono text-xs\"\r\n />\r\n </div>\r\n <div>\r\n <label className=\"block text-xs font-medium text-muted-foreground mb-1.5\">Offset Y</label>\r\n <Input\r\n type=\"text\"\r\n value={values['--shadow-y'] ?? ''}\r\n onChange={(e) => handleChange('--shadow-y', e.target.value)}\r\n placeholder=\"px\"\r\n className=\"font-mono text-xs\"\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n </CollapsibleSection>\r\n\r\n {/* Layout: wire sidebarConfig + onSidebarConfigChange to apply; can hide with hideLayoutSection */}\r\n {!hideLayoutSection && (\r\n <LayoutTab sidebarConfig={sidebarConfig} onSidebarConfigChange={onSidebarConfigChange} />\r\n )}\r\n </div>\r\n )\r\n}\r\n","\"use client\"\r\n\r\nimport React from 'react'\r\nimport { X, Check } from 'lucide-react'\r\nimport type { ImportedTheme, CustomThemeArtifactV1 } from '../../theme/types'\r\nimport { Input } from '../ui/input'\r\nimport { Button } from '../ui/button'\r\nimport { validateImportedTheme, validateCustomThemeArtifact } from '../../theme/utils/validation'\r\n\r\nfunction normalizeImportedThemeVars(vars: Record<string, string>): Record<string, string> {\r\n const out: Record<string, string> = {}\r\n Object.entries(vars).forEach(([key, value]) => {\r\n const k = key.trim().replace(/^--/, '')\r\n out[k] = value.trim()\r\n })\r\n return out\r\n}\r\n\r\ninterface ImportModalProps {\r\n open: boolean\r\n onOpenChange: (open: boolean) => void\r\n /** Import CSS theme (:root + .dark). */\r\n onImport?: (theme: ImportedTheme, name: string) => void\r\n /** Import standardized Custom Theme artifact JSON (theme.json). */\r\n onImportArtifact?: (theme: CustomThemeArtifactV1) => void\r\n}\r\n\r\nexport function ImportModal({ open, onOpenChange, onImport, onImportArtifact }: ImportModalProps) {\r\n const [importText, setImportText] = React.useState(\"\")\r\n const [themeName, setThemeName] = React.useState(\"\")\r\n const [error, setError] = React.useState<string | null>(null)\r\n\r\n const raw = importText.trim()\r\n const isJsonArtifact = raw.startsWith('{')\r\n const canImport = Boolean(raw) && (isJsonArtifact || Boolean(themeName.trim()))\r\n\r\n const processImport = () => {\r\n try {\r\n if (!importText.trim()) {\r\n setError(\"Please paste CSS or theme.json content\")\r\n return\r\n }\r\n\r\n const raw = importText.trim()\r\n\r\n // 1) JSON artifact import (preferred)\r\n if (raw.startsWith('{')) {\r\n const parsed = JSON.parse(raw) as unknown\r\n const validation = validateCustomThemeArtifact(parsed)\r\n if (!validation.isValid) {\r\n setError(validation.error || 'Invalid theme.json format')\r\n return\r\n }\r\n\r\n if (!onImportArtifact) {\r\n setError('Theme.json import is not supported in this app')\r\n return\r\n }\r\n\r\n const artifact = parsed as CustomThemeArtifactV1\r\n const nextArtifact: CustomThemeArtifactV1 =\r\n themeName.trim()\r\n ? { ...artifact, name: themeName.trim() }\r\n : artifact\r\n\r\n setError(null)\r\n onImportArtifact(nextArtifact)\r\n onOpenChange(false)\r\n setImportText(\"\")\r\n setThemeName(\"\")\r\n return\r\n }\r\n\r\n // Parse CSS content into light and dark theme variables\r\n const lightTheme: Record<string, string> = {}\r\n const darkTheme: Record<string, string> = {}\r\n \r\n // Split CSS into sections\r\n const cssText = importText.replace(/\\/\\*[\\s\\S]*?\\*\\//g, '') // Remove comments\r\n \r\n // Extract :root section (light theme)\r\n const rootMatch = cssText.match(/:root\\s*\\{([^}]+)\\}/)\r\n if (rootMatch) {\r\n const rootContent = rootMatch[1]\r\n const variableMatches = rootContent.matchAll(/--([^:]+):\\s*([^;]+);/g)\r\n Array.from(variableMatches).forEach((match) => {\r\n const [, variable, value] = match\r\n lightTheme[String(variable).trim()] = String(value).trim()\r\n })\r\n }\r\n \r\n // Extract .dark section (dark theme)\r\n const darkMatch = cssText.match(/\\.dark\\s*\\{([^}]+)\\}/)\r\n if (darkMatch) {\r\n const darkContent = darkMatch[1]\r\n const variableMatches = darkContent.matchAll(/--([^:]+):\\s*([^;]+);/g)\r\n Array.from(variableMatches).forEach((match) => {\r\n const [, variable, value] = match\r\n darkTheme[String(variable).trim()] = String(value).trim()\r\n })\r\n }\r\n \r\n // Validate theme name\r\n if (!themeName.trim()) {\r\n setError('Please enter a theme name')\r\n return\r\n }\r\n\r\n if (!onImport) {\r\n setError('CSS theme import is not supported in this app')\r\n return\r\n }\r\n\r\n // Store the imported theme\r\n const importedThemeData = {\r\n light: normalizeImportedThemeVars(lightTheme),\r\n dark: normalizeImportedThemeVars(darkTheme),\r\n }\r\n\r\n // Validate imported theme structure\r\n const validation = validateImportedTheme(importedThemeData)\r\n if (!validation.isValid) {\r\n setError(validation.error || 'Invalid theme format')\r\n return\r\n }\r\n\r\n setError(null)\r\n onImport(importedThemeData, themeName.trim())\r\n \r\n onOpenChange(false)\r\n setImportText(\"\")\r\n setThemeName(\"\")\r\n } catch (error) {\r\n setError(error instanceof Error ? error.message : 'Failed to import theme')\r\n console.error(\"Error importing theme:\", error)\r\n }\r\n }\r\n\r\n if (!open) return null\r\n\r\n return (\r\n <>\r\n {/* Backdrop */}\r\n <div\r\n className=\"fixed inset-0 bg-foreground/20 z-[60]\"\r\n onClick={() => onOpenChange(false)}\r\n />\r\n\r\n {/* Modal */}\r\n <div className=\"fixed inset-0 z-[60] flex items-center justify-center p-4\">\r\n <div className=\"bg-card text-card-foreground rounded-lg shadow-lg max-w-4xl w-full max-h-[90vh] flex flex-col border border-border\">\r\n {/* Header */}\r\n <div className=\"p-6 border-b border-border\">\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <h3 className=\"text-lg font-semibold\">Import Theme</h3>\r\n <p className=\"text-sm text-muted-foreground mt-1\">\r\n Paste either a standardized <code className=\"px-1 py-0.5 bg-muted rounded\">theme.json</code> artifact (recommended) or a CSS theme with <code className=\"px-1 py-0.5 bg-muted rounded\">:root</code> and <code className=\"px-1 py-0.5 bg-muted rounded\">.dark</code>.\r\n </p>\r\n </div>\r\n <button\r\n onClick={() => onOpenChange(false)}\r\n className=\"p-2 rounded-md hover:bg-muted transition-colors text-lg\"\r\n >\r\n ✕\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* Content */}\r\n <div className=\"p-6 flex-1 overflow-y-auto space-y-4\">\r\n {error && (\r\n <div className=\"rounded-lg border border-destructive bg-destructive/10 p-3\">\r\n <p className=\"text-sm text-destructive\">{error}</p>\r\n </div>\r\n )}\r\n <div>\r\n <label className=\"block text-sm font-medium mb-2\">Theme name</label>\r\n <Input\r\n type=\"text\"\r\n placeholder=\"Optional for theme.json, required for CSS\"\r\n value={themeName}\r\n onChange={(e) => {\r\n setThemeName(e.target.value)\r\n setError(null)\r\n }}\r\n />\r\n </div>\r\n <div>\r\n <label className=\"block text-sm font-medium mb-2\">Theme content</label>\r\n <textarea\r\n className=\"w-full rounded-lg border border-input bg-background px-3 py-2 text-sm font-mono text-foreground placeholder:text-muted-foreground min-h-[300px] max-h-[400px] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:border-border/80\"\r\n placeholder={`// theme.json (recommended)\r\n{\r\n \"version\": 1,\r\n \"name\": \"Custom\",\r\n \"base\": { \"type\": \"preset\", \"value\": \"default\" },\r\n \"overrides\": { \"other\": { \"hue-shift\": \"60\" } }\r\n}\r\n\r\n// OR CSS\r\n:root {\r\n --background: #ffffff;\r\n --foreground: #0a0a0a;\r\n --primary: #171717;\r\n /* And more */\r\n}\r\n.dark {\r\n --background: #0a0a0a;\r\n --foreground: #fafafa;\r\n --primary: #e5e5e5;\r\n /* And more */\r\n}`}\r\n value={importText}\r\n onChange={(e) => {\r\n setImportText(e.target.value)\r\n setError(null)\r\n }}\r\n />\r\n </div>\r\n </div>\r\n\r\n {/* Footer */}\r\n <div className=\"p-6 border-t border-border flex justify-end gap-2\">\r\n <Button\r\n variant=\"icon\"\r\n size=\"md\"\r\n onClick={() => onOpenChange(false)}\r\n aria-label=\"Cancel\"\r\n >\r\n <X className=\"w-5 h-5\" />\r\n </Button>\r\n <Button\r\n variant=\"icon\"\r\n size=\"md\"\r\n onClick={processImport}\r\n disabled={!canImport}\r\n aria-label=\"Import theme\"\r\n >\r\n <Check className=\"w-5 h-5\" />\r\n </Button>\r\n </div>\r\n </div>\r\n </div>\r\n </>\r\n )\r\n}\r\n","'use client'\r\n\r\nimport React from 'react'\r\nimport { useThemeManager } from '../../theme/use-theme-manager'\r\nimport { loadGoogleFontsForFontValue } from '../../theme/google-fonts'\r\nimport { fontSansOptions, fontSerifOptions, fontMonoOptions } from '../../theme/constants'\r\nimport { CollapsibleSection } from '../ui/collapsible-section'\r\nimport { Input } from '../ui/input'\r\nimport { ClassicDropdown } from '../ui/dropdown'\r\nimport type { DropdownOption } from '../ui/dropdown'\r\n\r\n/** Typography: preset sets --font-sans, --font-mono. Letter spacing (--tracking-normal) read/write from document. Google Fonts loaded via design-system when available. */\r\nfunction getComputedTypography(): Record<string, string> {\r\n if (typeof document === 'undefined') return {}\r\n const root = document.documentElement\r\n const styles = getComputedStyle(root)\r\n return {\r\n '--font-sans': styles.getPropertyValue('--font-sans').trim(),\r\n '--font-serif': styles.getPropertyValue('--font-serif').trim(),\r\n '--font-mono': styles.getPropertyValue('--font-mono').trim(),\r\n '--tracking-normal': styles.getPropertyValue('--tracking-normal').trim() || '0',\r\n }\r\n}\r\n\r\nexport function TypographyPanel() {\r\n const { handleColorChange } = useThemeManager()\r\n const [values, setValues] = React.useState<Record<string, string>>({})\r\n const [fontOpen, setFontOpen] = React.useState(true)\r\n const [letterOpen, setLetterOpen] = React.useState(true)\r\n const [loadingFonts, setLoadingFonts] = React.useState<Record<string, boolean>>({})\r\n\r\n React.useEffect(() => {\r\n setValues(getComputedTypography())\r\n }, [])\r\n\r\n const handleChange = async (cssVar: string, value: string) => {\r\n handleColorChange(cssVar, value)\r\n setValues((prev) => ({ ...prev, [cssVar]: value }))\r\n \r\n if (cssVar === '--font-sans' || cssVar === '--font-serif' || cssVar === '--font-mono') {\r\n setLoadingFonts((prev) => ({ ...prev, [cssVar]: true }))\r\n try {\r\n await loadGoogleFontsForFontValue(value)\r\n } catch (error) {\r\n console.warn('Failed to load Google Font:', error)\r\n } finally {\r\n setLoadingFonts((prev) => ({ ...prev, [cssVar]: false }))\r\n }\r\n }\r\n }\r\n\r\n return (\r\n <div className=\"space-y-4 pt-5 pb-2\">\r\n <p className=\"text-xs text-muted-foreground px-0\">\r\n Fonts use the theme preset and can load from Google Fonts when selected. Letter spacing uses <code className=\"text-xs\">--tracking-normal</code>.\r\n </p>\r\n\r\n <CollapsibleSection title=\"Font Family\" open={fontOpen} onToggle={() => setFontOpen((o) => !o)}>\r\n <div className=\"space-y-3 pt-2\">\r\n <div>\r\n <div className=\"flex items-center justify-between mb-1.5\">\r\n <label className=\"block text-xs font-medium text-muted-foreground\">Sans-serif font</label>\r\n {loadingFonts['--font-sans'] && (\r\n <span className=\"text-xs text-muted-foreground\">Loading...</span>\r\n )}\r\n </div>\r\n <ClassicDropdown\r\n ariaLabel=\"Sans-Serif Font\"\r\n value={values['--font-sans'] ?? fontSansOptions[0].value}\r\n options={fontSansOptions.map((o) => ({ value: o.value, label: o.label }))}\r\n onChange={(value) => handleChange('--font-sans', value)}\r\n fullWidth\r\n />\r\n </div>\r\n <div>\r\n <div className=\"flex items-center justify-between mb-1.5\">\r\n <label className=\"block text-xs font-medium text-muted-foreground\">Serif font</label>\r\n {loadingFonts['--font-serif'] && (\r\n <span className=\"text-xs text-muted-foreground\">Loading...</span>\r\n )}\r\n </div>\r\n <ClassicDropdown\r\n ariaLabel=\"Serif Font\"\r\n value={values['--font-serif'] ?? ''}\r\n options={[\r\n { value: '', label: '—' },\r\n ...fontSerifOptions.map((o) => ({ value: o.value, label: o.label })),\r\n ]}\r\n onChange={(value) => handleChange('--font-serif', value)}\r\n fullWidth\r\n />\r\n </div>\r\n <div>\r\n <div className=\"flex items-center justify-between mb-1.5\">\r\n <label className=\"block text-xs font-medium text-muted-foreground\">Monospace Font</label>\r\n {loadingFonts['--font-mono'] && (\r\n <span className=\"text-xs text-muted-foreground\">Loading...</span>\r\n )}\r\n </div>\r\n <ClassicDropdown\r\n ariaLabel=\"Monospace Font\"\r\n value={values['--font-mono'] ?? fontMonoOptions[0].value}\r\n options={fontMonoOptions.map((o) => ({ value: o.value, label: o.label }))}\r\n onChange={(value) => handleChange('--font-mono', value)}\r\n fullWidth\r\n />\r\n </div>\r\n </div>\r\n </CollapsibleSection>\r\n\r\n <CollapsibleSection title=\"Letter spacing\" open={letterOpen} onToggle={() => setLetterOpen((o) => !o)}>\r\n <div className=\"pt-2\">\r\n <label className=\"block text-xs font-medium text-muted-foreground mb-1.5\">Letter spacing (em) — CSS var: --tracking-normal</label>\r\n <Input\r\n type=\"text\"\r\n value={values['--tracking-normal'] ?? '0'}\r\n onChange={(e) => handleChange('--tracking-normal', e.target.value)}\r\n placeholder=\"0\"\r\n className=\"font-mono text-xs\"\r\n />\r\n </div>\r\n </CollapsibleSection>\r\n </div>\r\n )\r\n}\r\n","/**\r\n * Google Fonts integration for design-system.\r\n * Injects a Google Fonts stylesheet when a font family that exists on Google Fonts is selected.\r\n * Uses the public CSS API: https://fonts.googleapis.com/css2\r\n */\r\n\r\nconst GOOGLE_FONTS_MAP: Record<string, string> = {\r\n Inter: 'Inter:wght@400;500;600;700&display=swap',\r\n 'Fira Code': 'Fira+Code:wght@400;500;600&display=swap',\r\n 'Fira Mono': 'Fira+Mono:wght@400;500;600&display=swap',\r\n Roboto: 'Roboto:wght@400;500;700&display=swap',\r\n 'Open Sans': 'Open+Sans:wght@400;600;700&display=swap',\r\n Lato: 'Lato:wght@400;700&display=swap',\r\n Oswald: 'Oswald:wght@400;500;600&display=swap',\r\n Source: 'Source+Sans+3:wght@400;600;700&display=swap',\r\n 'Source Sans 3': 'Source+Sans+3:wght@400;600;700&display=swap',\r\n Montserrat: 'Montserrat:wght@400;500;600;700&display=swap',\r\n Poppins: 'Poppins:wght@400;500;600;700&display=swap',\r\n Nunito: 'Nunito:wght@400;600;700&display=swap',\r\n 'DM Sans': 'DM+Sans:ital,opsz,wght@0,9..40,400;0,9..40,600;0,9..40,700&display=swap',\r\n 'Libre Baskerville': 'Libre+Baskerville:ital,wght@0,400;0,700;1,400&display=swap',\r\n Merriweather: 'Merriweather:ital,wght@0,400;0,700;1,400&display=swap',\r\n 'Playfair Display': 'Playfair+Display:ital,wght@0,400;0,600;0,700&display=swap',\r\n}\r\n\r\nconst LINK_ID = 'design-google-fonts'\r\nconst LOADING_STATE_KEY = 'design-google-fonts-loading'\r\n\r\nfunction extractFirstQuotedFamily(value: string): string | null {\r\n const match = value.match(/\"([^\"]+)\"/)\r\n return match ? match[1] : null\r\n}\r\n\r\nfunction getGoogleFontsSpec(fontFamily: string): string | null {\r\n const key = Object.keys(GOOGLE_FONTS_MAP).find(\r\n (k) => k.toLowerCase() === fontFamily.toLowerCase()\r\n )\r\n return key ? GOOGLE_FONTS_MAP[key] : null\r\n}\r\n\r\n/**\r\n * Check if a font is loaded\r\n */\r\nfunction isFontLoaded(fontFamily: string): boolean {\r\n if (typeof document === 'undefined') return false\r\n try {\r\n return document.fonts.check(`16px \"${fontFamily}\"`)\r\n } catch {\r\n return false\r\n }\r\n}\r\n\r\n/**\r\n * Wait for font to load with timeout\r\n */\r\nfunction waitForFontLoad(fontFamily: string, timeout: number = 3000): Promise<boolean> {\r\n return new Promise((resolve) => {\r\n if (isFontLoaded(fontFamily)) {\r\n resolve(true)\r\n return\r\n }\r\n\r\n const startTime = Date.now()\r\n const checkInterval = setInterval(() => {\r\n if (isFontLoaded(fontFamily)) {\r\n clearInterval(checkInterval)\r\n resolve(true)\r\n } else if (Date.now() - startTime > timeout) {\r\n clearInterval(checkInterval)\r\n resolve(false)\r\n }\r\n }, 100)\r\n })\r\n}\r\n\r\n/**\r\n * Ensure a Google Fonts stylesheet is loaded for the given font-family value (e.g. from --font-sans).\r\n * If the value contains a quoted family name that we support, injects or updates the link.\r\n * Safe to call on every font change; only one link is kept and updated.\r\n * Returns a promise that resolves when the font is loaded (or times out).\r\n */\r\nexport function loadGoogleFontsForFontValue(value: string): Promise<boolean> {\r\n return new Promise((resolve) => {\r\n if (typeof document === 'undefined') {\r\n resolve(false)\r\n return\r\n }\r\n\r\n const family = extractFirstQuotedFamily(value)\r\n if (!family) {\r\n resolve(false)\r\n return\r\n }\r\n\r\n const spec = getGoogleFontsSpec(family)\r\n if (!spec) {\r\n resolve(false)\r\n return\r\n }\r\n\r\n const href = `https://fonts.googleapis.com/css2?family=${spec}`\r\n let link = document.getElementById(LINK_ID) as HTMLLinkElement | null\r\n \r\n if (!link) {\r\n link = document.createElement('link')\r\n link.id = LINK_ID\r\n link.rel = 'stylesheet'\r\n link.setAttribute('data-design', 'google-fonts')\r\n document.head.appendChild(link)\r\n }\r\n\r\n // If already loading the same font, wait for it\r\n const loadingState = sessionStorage.getItem(LOADING_STATE_KEY)\r\n if (loadingState === href && link.href === href) {\r\n waitForFontLoad(family).then(resolve)\r\n return\r\n }\r\n\r\n // Set loading state\r\n sessionStorage.setItem(LOADING_STATE_KEY, href)\r\n\r\n // Handle load/error\r\n const handleLoad = () => {\r\n sessionStorage.removeItem(LOADING_STATE_KEY)\r\n waitForFontLoad(family).then(resolve)\r\n }\r\n\r\n const handleError = () => {\r\n sessionStorage.removeItem(LOADING_STATE_KEY)\r\n console.warn(`Failed to load Google Font: ${family}`)\r\n resolve(false)\r\n }\r\n\r\n link.onload = handleLoad\r\n link.onerror = handleError\r\n\r\n if (link.href !== href) {\r\n link.href = href\r\n } else {\r\n // Already loaded, just check if font is available\r\n waitForFontLoad(family).then(resolve)\r\n }\r\n })\r\n}\r\n","\"use client\"\r\n\r\nimport * as React from 'react'\r\nimport { cn } from './lib/utils'\r\n\r\n/**\r\n * Layout primitives (root-level so consuming bundlers can resolve without ./components/ paths).\r\n * Canonical source for Container, Page, Section, Grid, Stack.\r\n */\r\n\r\nexport interface ContainerProps extends React.HTMLAttributes<HTMLDivElement> {\r\n maxWidth?: 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 'full' | 'none'\r\n padding?: 'none' | 'sm' | 'md' | 'lg'\r\n center?: boolean\r\n}\r\n\r\nconst maxWidthClasses = {\r\n sm: 'max-w-screen-sm',\r\n md: 'max-w-screen-md',\r\n lg: 'max-w-screen-lg',\r\n xl: 'max-w-screen-xl',\r\n '2xl': 'max-w-screen-2xl',\r\n full: 'max-w-full',\r\n none: '',\r\n}\r\n\r\nconst paddingClasses = {\r\n none: '',\r\n sm: 'px-4',\r\n md: 'px-4 sm:px-6 lg:px-8',\r\n lg: 'px-4 sm:px-6 lg:px-8 xl:px-12',\r\n}\r\n\r\nexport function Container({\r\n children,\r\n maxWidth = '2xl',\r\n padding = 'md',\r\n center = true,\r\n className,\r\n ...props\r\n}: ContainerProps) {\r\n return (\r\n <div\r\n className={cn(\r\n 'w-full',\r\n maxWidth !== 'none' && maxWidthClasses[maxWidth],\r\n padding !== 'none' && paddingClasses[padding],\r\n center && 'mx-auto',\r\n className\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n </div>\r\n )\r\n}\r\n\r\nexport interface PageProps extends React.HTMLAttributes<HTMLDivElement> {\r\n title?: string\r\n description?: string\r\n maxWidth?: ContainerProps['maxWidth']\r\n padding?: ContainerProps['padding']\r\n}\r\n\r\nexport function Page({\r\n children,\r\n title,\r\n description,\r\n maxWidth = '2xl',\r\n padding = 'md',\r\n className,\r\n ...props\r\n}: PageProps) {\r\n return (\r\n <div className={cn('min-h-screen', className)} {...props}>\r\n <Container maxWidth={maxWidth} padding={padding}>\r\n {(title || description) && (\r\n <div className=\"mb-8\">\r\n {title && <h1 className=\"text-2xl md:text-3xl font-bold text-foreground mb-2\">{title}</h1>}\r\n {description && <p className=\"text-muted-foreground\">{description}</p>}\r\n </div>\r\n )}\r\n {children}\r\n </Container>\r\n </div>\r\n )\r\n}\r\n\r\nexport interface SectionProps extends React.HTMLAttributes<HTMLElement> {\r\n title?: string\r\n description?: string\r\n maxWidth?: ContainerProps['maxWidth']\r\n padding?: ContainerProps['padding']\r\n}\r\n\r\nexport function Section({\r\n children,\r\n title,\r\n description,\r\n maxWidth = '2xl',\r\n padding = 'md',\r\n className,\r\n ...props\r\n}: SectionProps) {\r\n return (\r\n <section className={cn('py-8 md:py-12', className)} {...props}>\r\n <Container maxWidth={maxWidth} padding={padding}>\r\n {(title || description) && (\r\n <div className=\"mb-6\">\r\n {title && <h2 className=\"text-xl md:text-2xl font-bold text-foreground mb-2\">{title}</h2>}\r\n {description && <p className=\"text-muted-foreground\">{description}</p>}\r\n </div>\r\n )}\r\n {children}\r\n </Container>\r\n </section>\r\n )\r\n}\r\n\r\nexport interface GridProps extends React.HTMLAttributes<HTMLDivElement> {\r\n cols?: 1 | 2 | 3 | 4\r\n colsSm?: 1 | 2 | 3 | 4 | 5 | 6\r\n colsMd?: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12\r\n gap?: 'none' | 'sm' | 'md' | 'lg' | 'xl'\r\n}\r\n\r\nconst gapClasses = {\r\n none: 'gap-0',\r\n sm: 'gap-2',\r\n md: 'gap-4',\r\n lg: 'gap-6',\r\n xl: 'gap-8',\r\n}\r\n\r\nexport function Grid({\r\n children,\r\n cols = 1,\r\n colsSm,\r\n colsMd,\r\n gap = 'md',\r\n className,\r\n ...props\r\n}: GridProps) {\r\n const colsClass = `grid-cols-${cols}`\r\n const colsSmClass = colsSm ? `sm:grid-cols-${colsSm}` : ''\r\n const colsMdClass = colsMd ? `md:grid-cols-${colsMd}` : ''\r\n\r\n return (\r\n <div\r\n className={cn(\r\n 'grid',\r\n colsClass,\r\n colsSmClass,\r\n colsMdClass,\r\n gapClasses[gap],\r\n className\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n </div>\r\n )\r\n}\r\n\r\nexport interface StackProps extends React.HTMLAttributes<HTMLDivElement> {\r\n direction?: 'row' | 'col'\r\n align?: 'start' | 'center' | 'end' | 'stretch'\r\n justify?: 'start' | 'center' | 'end' | 'between' | 'around' | 'evenly'\r\n gap?: 'none' | 'sm' | 'md' | 'lg' | 'xl'\r\n wrap?: boolean\r\n}\r\n\r\nexport function Stack({\r\n children,\r\n direction = 'col',\r\n align,\r\n justify,\r\n gap = 'md',\r\n wrap = false,\r\n className,\r\n ...props\r\n}: StackProps) {\r\n const alignClasses = {\r\n start: 'items-start',\r\n center: 'items-center',\r\n end: 'items-end',\r\n stretch: 'items-stretch',\r\n }\r\n\r\n const justifyClasses = {\r\n start: 'justify-start',\r\n center: 'justify-center',\r\n end: 'justify-end',\r\n between: 'justify-between',\r\n around: 'justify-around',\r\n evenly: 'justify-evenly',\r\n }\r\n\r\n return (\r\n <div\r\n className={cn(\r\n 'flex',\r\n direction === 'row' ? 'flex-row' : 'flex-col',\r\n align && alignClasses[align],\r\n justify && justifyClasses[justify],\r\n gapClasses[gap],\r\n wrap && 'flex-wrap',\r\n className\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n </div>\r\n )\r\n}\r\n","'use client'\r\n\r\nimport React, { useState, useEffect } from 'react'\r\nimport { Menu, X, ChevronDown } from 'lucide-react'\r\nimport { cn } from '../../lib/utils'\r\nimport { Button } from '../../components/ui/button'\r\nimport Logo from '../../components/ui/logo'\r\nimport { Container } from '../../components/layouts'\r\nimport {\r\n DropdownMenu,\r\n DropdownMenuTrigger,\r\n DropdownMenuContent,\r\n DropdownMenuItem,\r\n DropdownMenuSub,\r\n DropdownMenuSubTrigger,\r\n DropdownMenuSubContent\r\n} from '../../components/ui/dropdown'\r\nimport {\r\n Sheet,\r\n SheetContent,\r\n SheetTrigger,\r\n SheetClose,\r\n SheetHeader,\r\n SheetTitle\r\n} from '../../components/ui/sheet'\r\nimport type { HeaderBlockProps } from './types'\r\n\r\n// Default Link Component (fallback to simple a tag if slot not provided)\r\nconst DefaultLink = ({ href, className, children, onClick }: any) => (\r\n <a href={href} className={className} onClick={onClick}>\r\n {children}\r\n </a>\r\n)\r\n\r\nexport function HeaderBlock({\r\n data,\r\n slots = {},\r\n className,\r\n sticky = true\r\n}: HeaderBlockProps) {\r\n const [isScrolled, setIsScrolled] = useState(false)\r\n\r\n // Slots resolution\r\n const LinkComponent = slots.linkComponent || DefaultLink\r\n const LogoComponent = slots.logo || <Logo />\r\n\r\n useEffect(() => {\r\n const handleScroll = () => {\r\n setIsScrolled(window.scrollY > 0)\r\n }\r\n window.addEventListener('scroll', handleScroll, { passive: true })\r\n return () => window.removeEventListener('scroll', handleScroll)\r\n }, [])\r\n\r\n // Recursive renderer for desktop dropdowns\r\n const renderDesktopMenuItem = (item: any) => {\r\n if (item.type === 'dropdown' && item.children) {\r\n return (\r\n <DropdownMenu key={item.id}>\r\n <DropdownMenuTrigger className=\"flex items-center gap-1 px-3 py-2 text-sm font-medium text-muted-foreground hover:text-foreground transition-colors outline-none focus-visible:ring-2 focus-visible:ring-ring rounded-md\">\r\n {item.title}\r\n <ChevronDown className=\"w-4 h-4\" />\r\n </DropdownMenuTrigger>\r\n\r\n <DropdownMenuContent align=\"start\" className=\"w-56\">\r\n {item.children.map((child: any) => {\r\n if (child.type === 'dropdown') {\r\n // Sub-menu level 1\r\n return (\r\n <DropdownMenuSub key={child.id}>\r\n <DropdownMenuSubTrigger>{child.title}</DropdownMenuSubTrigger>\r\n <DropdownMenuSubContent>\r\n {child.children?.map((sub: any) => (\r\n <DropdownMenuItem key={sub.id} asChild>\r\n <LinkComponent href={sub.href || '#'} className=\"cursor-pointer w-full\">\r\n {sub.title}\r\n </LinkComponent>\r\n </DropdownMenuItem>\r\n ))}\r\n </DropdownMenuSubContent>\r\n </DropdownMenuSub>\r\n )\r\n }\r\n\r\n // Link item\r\n return (\r\n <DropdownMenuItem key={child.id} asChild>\r\n <LinkComponent href={child.href || '#'} className=\"cursor-pointer w-full\">\r\n {child.title}\r\n </LinkComponent>\r\n </DropdownMenuItem>\r\n )\r\n })}\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n )\r\n }\r\n\r\n // Standard Link\r\n return (\r\n <LinkComponent\r\n key={item.id}\r\n href={item.href || '#'}\r\n className=\"px-3 py-2 text-sm font-medium text-muted-foreground hover:text-foreground transition-colors rounded-md focus-visible:ring-2 focus-visible:ring-ring outline-none\"\r\n >\r\n {item.title}\r\n </LinkComponent>\r\n )\r\n }\r\n\r\n return (\r\n <header\r\n className={cn(\r\n 'w-full z-50 transition-all duration-300',\r\n sticky ? 'fixed top-0 md:top-6' : 'relative',\r\n className\r\n )}\r\n >\r\n <Container>\r\n <div\r\n className={cn(\r\n \"relative flex h-16 items-center justify-between gap-3 px-4 transition-all\",\r\n // Mimicking the Simplifi glass card style\r\n \"bg-background/80 backdrop-blur-md rounded-2xl border border-border/50 shadow-sm\"\r\n )}\r\n >\r\n {/* Logo Area */}\r\n <div className=\"flex items-center shrink-0\">\r\n {LogoComponent}\r\n </div>\r\n\r\n {/* Desktop Navigation */}\r\n <nav className=\"hidden md:flex md:gap-1 lg:gap-2\">\r\n {data.items.map(renderDesktopMenuItem)}\r\n </nav>\r\n\r\n {/* Right Actions */}\r\n <div className=\"flex items-center gap-3\">\r\n {slots.rightActionSlot}\r\n\r\n <div className=\"hidden md:flex gap-3\">\r\n {data.ctaItems?.map((cta, idx) => (\r\n <Button\r\n key={idx}\r\n variant={cta.variant || (cta.type === 'primary' ? 'primary' : 'ghost')}\r\n size=\"sm\"\r\n fullWidth={false}\r\n render={\r\n <LinkComponent href={cta.href}>\r\n {cta.title}\r\n </LinkComponent>\r\n }\r\n >\r\n {cta.title}\r\n </Button>\r\n ))}\r\n </div>\r\n\r\n {/* Mobile Menu via Sheet */}\r\n <div className=\"md:hidden\">\r\n <Sheet>\r\n <SheetTrigger asChild>\r\n <button className=\"p-2 text-muted-foreground hover:text-foreground\">\r\n {slots.menuIcon || <Menu className=\"w-5 h-5\" />}\r\n </button>\r\n </SheetTrigger>\r\n <SheetContent side=\"right\" className=\"w-[300px] sm:w-[400px]\">\r\n <SheetHeader className=\"px-1 text-left\">\r\n <SheetTitle className=\"text-lg font-bold\">Menu</SheetTitle>\r\n </SheetHeader>\r\n <div className=\"flex flex-col gap-6 mt-6 overflow-y-auto\">\r\n <nav className=\"flex flex-col space-y-4\">\r\n {data.items.map((item) => (\r\n <div key={item.id} className=\"flex flex-col gap-2\">\r\n {item.type === 'link' ? (\r\n <SheetClose asChild>\r\n <LinkComponent\r\n href={item.href || '#'}\r\n className=\"text-lg font-medium text-foreground py-1\"\r\n >\r\n {item.title}\r\n </LinkComponent>\r\n </SheetClose>\r\n ) : (\r\n <div className=\"flex flex-col gap-2\">\r\n <span className=\"text-sm font-semibold text-muted-foreground uppercase tracking-wide\">\r\n {item.title}\r\n </span>\r\n <div className=\"pl-4 flex flex-col gap-2 border-l border-border ml-1\">\r\n {item.children?.map((child) => (\r\n <SheetClose asChild key={child.id}>\r\n <LinkComponent\r\n href={child.href || '#'}\r\n className=\"text-base text-foreground/80 hover:text-foreground py-1\"\r\n >\r\n {child.title}\r\n </LinkComponent>\r\n </SheetClose>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n ))}\r\n </nav>\r\n\r\n <div className=\"flex flex-col gap-3 pt-4 border-t border-border\">\r\n {data.ctaItems?.map((cta, idx) => (\r\n <SheetClose asChild key={idx}>\r\n <Button\r\n variant={cta.variant || 'primary'}\r\n fullWidth\r\n render={\r\n <LinkComponent href={cta.href}>\r\n {cta.title}\r\n </LinkComponent>\r\n }\r\n >\r\n {cta.title}\r\n </Button>\r\n </SheetClose>\r\n ))}\r\n </div>\r\n </div>\r\n </SheetContent>\r\n </Sheet>\r\n </div>\r\n </div>\r\n </div>\r\n </Container>\r\n </header>\r\n )\r\n}\r\n","'use client'\r\n\r\nimport React from 'react'\r\nimport { Twitter, Instagram, Facebook, Youtube, Linkedin, Hash, Github } from 'lucide-react'\r\nimport { cn } from '../../lib/utils'\r\nimport Logo from '../../components/ui/logo'\r\nimport { Container } from '../../components/layouts'\r\nimport type { FooterBlockProps, FooterSocialLink } from './types'\r\n\r\n// Default Link Component\r\nconst DefaultLink = ({ href, className, children, target, rel }: any) => (\r\n <a href={href} className={className} target={target} rel={rel}>\r\n {children}\r\n </a>\r\n)\r\n\r\n// Helper for standard social icons\r\nfunction SocialIconRenderer({ icon }: { icon: string | React.ReactNode }) {\r\n if (React.isValidElement(icon)) return icon as React.ReactElement\r\n\r\n const props = { size: 24, className: \"w-5 h-5\" }\r\n switch (icon) {\r\n case 'twitter': return <Twitter {...props} />\r\n case 'instagram': return <Instagram {...props} />\r\n case 'facebook': return <Facebook {...props} />\r\n case 'youtube': return <Youtube {...props} />\r\n case 'linkedin': return <Linkedin {...props} />\r\n case 'github': return <Github {...props} /> // Added github\r\n case 'threads': return <Hash {...props} />\r\n default: return null\r\n }\r\n}\r\n\r\nexport function FooterBlock({\r\n data,\r\n slots = {},\r\n className,\r\n border = false\r\n}: FooterBlockProps) {\r\n const LinkComponent = slots.linkComponent || DefaultLink\r\n const LogoComponent = slots.logo || <Logo />\r\n\r\n const { branding, columns, social, legal } = data\r\n\r\n return (\r\n <footer className={cn(\"bg-background text-foreground\", className)}>\r\n <Container>\r\n {/* Main Grid Area */}\r\n <div\r\n className={cn(\r\n \"grid gap-10 py-8 sm:grid-cols-12 md:py-12\",\r\n border && \"border-t border-border\"\r\n )}\r\n >\r\n {/* Brand Column (Col 1) */}\r\n <div className=\"space-y-4 sm:col-span-12 lg:col-span-4\">\r\n <div className=\"-ml-3 flex items-center\">\r\n {LogoComponent}\r\n </div>\r\n\r\n <div className=\"text-sm text-muted-foreground\">\r\n &copy; {new Date().getFullYear()} {branding.brandName} by{\" \"}\r\n {branding.brandUrl ? (\r\n <LinkComponent\r\n href={branding.brandUrl}\r\n className=\"font-medium hover:text-foreground transition-colors\"\r\n target=\"_blank\"\r\n >\r\n {branding.brandName}\r\n </LinkComponent>\r\n ) : (\r\n <span className=\"font-medium\">{branding.brandName}</span>\r\n )}\r\n . {branding.copyrightText}\r\n </div>\r\n\r\n {legal && legal.length > 0 && (\r\n <div className=\"text-sm text-muted-foreground flex flex-wrap gap-2\">\r\n {legal.map((item, index) => (\r\n <span key={index} className=\"flex items-center gap-2\">\r\n <LinkComponent href={item.href} className=\"hover:text-foreground transition-colors\">\r\n {item.title}\r\n </LinkComponent>\r\n {index < legal.length - 1 && <span className=\"opacity-50\">|</span>}\r\n </span>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Links Columns */}\r\n {columns.map((col, idx) => (\r\n <div key={idx} className=\"space-y-3 sm:col-span-6 md:col-span-3 lg:col-span-2\">\r\n <h3 className=\"text-sm font-semibold tracking-wider uppercase text-foreground\">\r\n {col.title}\r\n </h3>\r\n <ul className=\"space-y-2.5 text-sm\">\r\n {col.links.map((link, lIdx) => (\r\n <li key={lIdx}>\r\n <LinkComponent\r\n href={link.href}\r\n className=\"text-muted-foreground transition hover:text-foreground hover:underline\"\r\n >\r\n {link.title}\r\n </LinkComponent>\r\n </li>\r\n ))}\r\n </ul>\r\n </div>\r\n ))}\r\n\r\n {/* Social Column (merged into last column or separate depending on design) */}\r\n {/* For this block, let's put it as a separate block if we have space, or under the last column */}\r\n <div className=\"space-y-3 sm:col-span-6 md:col-span-3 lg:col-span-2\">\r\n <h3 className=\"text-sm font-semibold tracking-wider uppercase text-foreground\">Social</h3>\r\n {social && (\r\n <ul className=\"flex flex-wrap gap-3 items-center\">\r\n {social.map((item, idx) => (\r\n <li key={idx}>\r\n <LinkComponent\r\n href={item.href}\r\n className=\"flex items-center justify-center text-muted-foreground transition hover:text-primary\"\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n aria-label={item.name}\r\n >\r\n <SocialIconRenderer icon={item.icon} />\r\n </LinkComponent>\r\n </li>\r\n ))}\r\n </ul>\r\n )}\r\n </div>\r\n </div>\r\n </Container>\r\n\r\n {/* Bottom Illustration Slot */}\r\n {slots.bottomIllustration && (\r\n <div className=\"w-full overflow-hidden\" aria-hidden=\"true\">\r\n {slots.bottomIllustration}\r\n </div>\r\n )}\r\n </footer>\r\n )\r\n}\r\n"],"mappings":"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","names":["message","min","max","message","useState","useState","useState","useEffect","useState","useEffect","useEffect","useEffect","useState","useEffect","useState","useEffect","useState","useEffect","useState","useEffect","useState","useEffect","useState","useEffect","useEffect","useRef","useRef","useEffect","getFocusableElements","useEffect","useRef","useRef","useEffect","useState","useRef","useEffect","useState","useRef","useEffect","useState","useCallback","useState","useCallback","useState","useCallback","min","max","useState","useCallback","useEffect","useRef","useRef","useEffect","message","useRef","useCallback","useRef","useCallback","useState","useCallback","useRef","useState","useRef","useCallback","isValid","React","max","min","x","match","x","debounce","React","debounce","theme","handleColorChange","React","X","React","React","variantClasses","React","React","React","React","React","ChevronDown","ChevronDown","React","React","React","React","React","ChevronRight","ChevronRight","React","ChevronRight","min","max","ChevronRight","React","React","React","React","maxLength","React","required","React","React","Image","React","sizeClasses","React","url","Image","React","React","React","React","React","React","React","ChevronDown","sizeClasses","ChevronDown","React","React","required","React","sizeClasses","React","ChevronLeft","ChevronRight","api","ChevronLeft","ChevronRight","React","Check","React","React","X","React","Separator","React","X","X","X","Separator","Check","React","Check","ChevronRight","Check","ChevronRight","React","Check","ChevronRight","Check","ChevronRight","React","Image","Check","ChevronDown","X","Menu","X","ChevronDown","Menu","Check","React","Separator","React","React","X","X","Separator","React","DialogPrimitive","X","X","React","React","React","React","sizeClasses","React","min","max","React","sizeClasses","_","React","React","Fallback","React","ChevronDown","Select","ChevronDown","props","React","defaultOptions","format","pattern","defaultOptions","defaultOptions","localize","pattern","formatLong","format","defaultOptions","React","Link","React","Link","React","React","React","React","ChevronDown","React","ChevronDown","React","React","React","React","useTheme","React","useTheme","React","sizeClasses","React","React","Group","Separator","Group","Separator","React","React","React","useTheme","React","React","message","toast","cn","height","heights","_toast_classNames","_toast_classNames1","offset","React","Toaster","toast","toasts","id","position","index","Loader2","X","Toaster","useTheme","Loader2","X","message","React","CircleCheck","ChevronDown","ChevronUp","ChevronDown","CircleCheck","ChevronUp","React","Transition","sizeClasses","Transition","Tooltip","React","Moon","React","React","React","handleColorChange","React","applyRadius","React","Moon","React","React","React","applyRadius","handleColorChange","React","React","X","Check","React","raw","validation","match","error","X","Check","applyImportedTheme","resetTheme","applyRadius","React","X","React","match","handleColorChange","React","React","React","useState","useEffect","Menu","ChevronDown","React","useState","useEffect","ChevronDown","Menu","React","DefaultLink","React"]}