@geomak/ui 5.1.0 → 5.2.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/icons/icons.tsx","../src/components/layout/Portal.tsx","../src/components/layout/Box.tsx","../src/components/layout/Flex.tsx","../src/components/layout/Grid.tsx","../src/components/core/Avatar.tsx","../src/components/core/Typography.tsx","../src/components/core/IconButton.tsx","../src/components/inputs/Button.tsx","../src/components/core/Modal.tsx","../src/components/core/Drawer.tsx","../src/components/core/Tooltip.tsx","../src/components/core/Tabs.tsx","../src/components/core/Tree.tsx","../src/components/core/ToggleButton.tsx","../src/components/core/Notification.tsx","../src/components/core/LoadingSpinner.tsx","../src/components/core/FadingBase.tsx","../src/components/core/List.tsx","../src/components/core/ScalableContainer.tsx","../src/components/core/GridCard.tsx","../src/components/core/OpaqueGridCard.tsx","../src/components/core/CatalogGrid.tsx","../src/components/core/CatalogCarousel.tsx","../src/components/core/Catalog.tsx","../src/components/core/ContextMenu.tsx","../src/components/core/Wizard.tsx","../src/components/inputs/SearchInput.tsx","../src/components/inputs/DropdownPill.tsx","../src/components/inputs/Dropdown.tsx","../src/components/core/Table.tsx","../src/components/core/Switch.tsx","../src/components/core/TopBar.tsx","../src/components/core/Sidebar.tsx","../src/components/core/AppShell.tsx","../src/components/core/ThemeProvider.tsx","../src/components/core/Skeleton.tsx","../src/components/inputs/TextInput.tsx","../src/components/inputs/NumberInput.tsx","../src/components/inputs/Password.tsx","../src/components/inputs/Checkbox.tsx","../src/components/inputs/Switch.tsx","../src/components/inputs/AutoComplete.tsx","../src/components/inputs/TreeSelect.tsx","../src/components/inputs/FileInput.tsx","../src/components/inputs/DatePicker.tsx"],"names":["jsx","jsxs","Fragment","useState","useEffect","createPortal","px","GAP_MAP","ALIGN_CLASS","JUSTIFY_CLASS","Grid","AvatarPrimitive","useMemo","useReducedMotion","Dialog","AnimatePresence","motion","Dialog2","TooltipPrimitive","TabsPrimitive","Accordion","ToggleGroup","createContext","useRef","useCallback","useContext","List","colors_default","ContextMenuPrimitive","ChevronRight","useLayoutEffect","useId","React","SearchInput","Popover","SwitchPrimitive","vars","CheckboxPrimitive","SwitchPrimitive2","label","Popover2","isParent","Popover3","Popover4"],"mappings":"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","file":"index.cjs","sourcesContent":["import React from 'react'\n\nconst Moon = ({ color = 'gray' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill={color} viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className=\"w-8 h-8\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M21.752 15.002A9.718 9.718 0 0118 15.75c-5.385 0-9.75-4.365-9.75-9.75 0-1.33.266-2.597.748-3.752A9.753 9.753 0 003 11.25C3 16.635 7.365 21 12.75 21a9.753 9.753 0 009.002-5.998z\" />\n </svg>\n)\n\nconst Sun = ({ color = 'yellow' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill={color} viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className=\"w-8 h-8\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 3v2.25m6.364.386l-1.591 1.591M21 12h-2.25m-.386 6.364l-1.591-1.591M12 18.75V21m-4.773-4.227l-1.591 1.591M5.25 12H3m4.227-4.773L5.636 5.636M15.75 12a3.75 3.75 0 11-7.5 0 3.75 3.75 0 017.5 0z\" />\n </svg>\n)\n\nconst CheckCircle = ({ color = '#fff', size = 28 }) => (\n <svg width={size} height={size} viewBox=\"0 0 28 28\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fillRule=\"evenodd\" clipRule=\"evenodd\" d=\"M14 0.25C6.40625 0.25 0.25 6.40625 0.25 14C0.25 21.5937 6.40625 27.75 14 27.75C21.5937 27.75 27.75 21.5937 27.75 14C27.75 6.40625 21.5937 0.25 14 0.25ZM19.96 11.675C20.0697 11.5496 20.1533 11.4034 20.2057 11.2452C20.2582 11.087 20.2784 10.9199 20.2653 10.7537C20.2522 10.5876 20.206 10.4257 20.1295 10.2777C20.0529 10.1296 19.9475 9.99838 19.8194 9.89168C19.6914 9.78497 19.5433 9.70495 19.3839 9.65633C19.2244 9.6077 19.0569 9.59145 18.8911 9.60853C18.7253 9.62562 18.5646 9.67568 18.4184 9.75579C18.2723 9.8359 18.1436 9.94443 18.04 10.075L12.665 16.5237L9.88375 13.7412C9.648 13.5136 9.33224 13.3876 9.0045 13.3904C8.67675 13.3933 8.36324 13.5247 8.13148 13.7565C7.89972 13.9882 7.76825 14.3018 7.76541 14.6295C7.76256 14.9572 7.88855 15.273 8.11625 15.5087L11.8662 19.2587C11.9891 19.3815 12.1361 19.4773 12.298 19.5401C12.4599 19.6028 12.6331 19.6312 12.8066 19.6233C12.98 19.6154 13.15 19.5715 13.3055 19.4943C13.4611 19.4171 13.5988 19.3084 13.71 19.175L19.96 11.675Z\" fill={color} />\n </svg>\n)\n\nconst Login = ({ color = '#fff', size = 6 }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={`w-${size} h-${size}`}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15.75 9V5.25A2.25 2.25 0 0013.5 3h-6a2.25 2.25 0 00-2.25 2.25v13.5A2.25 2.25 0 007.5 21h6a2.25 2.25 0 002.25-2.25V15m3 0l3-3m0 0l-3-3m3 3H9\" />\n </svg>\n)\n\nconst Loading = ({ color = '#fff', size = 6 }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill={color} className={`w-${size} h-${size} animate-spin`}>\n <path fillRule=\"evenodd\" d=\"M4.755 10.059a7.5 7.5 0 0112.548-3.364l1.903 1.903h-3.183a.75.75 0 100 1.5h4.992a.75.75 0 00.75-.75V4.356a.75.75 0 00-1.5 0v3.18l-1.9-1.9A9 9 0 003.306 9.67a.75.75 0 101.45.388zm15.408 3.352a.75.75 0 00-.919.53 7.5 7.5 0 01-12.548 3.364l-1.902-1.903h3.183a.75.75 0 000-1.5H2.984a.75.75 0 00-.75.75v4.992a.75.75 0 001.5 0v-3.18l1.9 1.9a9 9 0 0015.059-4.035.75.75 0 00-.53-.918z\" clipRule=\"evenodd\" />\n </svg>\n)\n\nconst ToggleLoading = ({ color = '#fff', loading = false, size = 6 }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill={color} className={`w-${size} h-${size} ${loading && 'animate-spin'}`}>\n <path fillRule=\"evenodd\" d=\"M4.755 10.059a7.5 7.5 0 0112.548-3.364l1.903 1.903h-3.183a.75.75 0 100 1.5h4.992a.75.75 0 00.75-.75V4.356a.75.75 0 00-1.5 0v3.18l-1.9-1.9A9 9 0 003.306 9.67a.75.75 0 101.45.388zm15.408 3.352a.75.75 0 00-.919.53 7.5 7.5 0 01-12.548 3.364l-1.902-1.903h3.183a.75.75 0 000-1.5H2.984a.75.75 0 00-.75.75v4.992a.75.75 0 001.5 0v-3.18l1.9 1.9a9 9 0 0015.059-4.035.75.75 0 00-.53-.918z\" clipRule=\"evenodd\" />\n </svg>\n)\n\nconst Eye = ({ color = '#fff', size = 6 }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill={color} className={`w-${size} h-${size}`}>\n <path d=\"M12 15a3 3 0 100-6 3 3 0 000 6z\" />\n <path fillRule=\"evenodd\" d=\"M1.323 11.447C2.811 6.976 7.028 3.75 12.001 3.75c4.97 0 9.185 3.223 10.675 7.69.12.362.12.752 0 1.113-1.487 4.471-5.705 7.697-10.677 7.697-4.97 0-9.186-3.223-10.675-7.69a1.762 1.762 0 010-1.113zM17.25 12a5.25 5.25 0 11-10.5 0 5.25 5.25 0 0110.5 0z\" clipRule=\"evenodd\" />\n </svg>\n)\n\nconst EyeSlash = ({ color = '#fff', size = 6 }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill={color} className={`w-${size} h-${size}`}>\n <path d=\"M3.53 2.47a.75.75 0 00-1.06 1.06l18 18a.75.75 0 101.06-1.06l-18-18zM22.676 12.553a11.249 11.249 0 01-2.631 4.31l-3.099-3.099a5.25 5.25 0 00-6.71-6.71L7.759 4.577a11.217 11.217 0 014.242-.827c4.97 0 9.185 3.223 10.675 7.69.12.362.12.752 0 1.113z\" />\n <path d=\"M15.75 12c0 .18-.013.357-.037.53l-4.244-4.243A3.75 3.75 0 0115.75 12zM12.53 15.713l-4.243-4.244a3.75 3.75 0 004.243 4.243z\" />\n <path d=\"M6.75 12c0-.619.107-1.213.304-1.764l-3.1-3.1a11.25 11.25 0 00-2.63 4.31c-.12.362-.12.752 0 1.114 1.489 4.467 5.704 7.69 10.675 7.69 1.5 0 2.933-.294 4.242-.827l-2.477-2.477A5.25 5.25 0 016.75 12z\" />\n </svg>\n)\n\nconst ArrowRight = ({ color = '#fff', className = 'h-6 w-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill={color} className={className}>\n <path fillRule=\"evenodd\" d=\"M3.75 12a.75.75 0 01.75-.75h13.19l-5.47-5.47a.75.75 0 011.06-1.06l6.75 6.75a.75.75 0 010 1.06l-6.75 6.75a.75.75 0 11-1.06-1.06l5.47-5.47H4.5a.75.75 0 01-.75-.75z\" clipRule=\"evenodd\" />\n </svg>\n)\n\nconst Minus = ({ color = '#fff', className = 'h-6 w-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19.5 12h-15\" />\n </svg>\n)\n\nconst Dashboard = ({ color = '#fff', size = 30 }) => (\n <svg width={size} height={size} viewBox=\"0 0 28 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M14.4688 9.65625H24.7812M3.21875 14.3438H13.5312M14 3.09375V20.9062M2.28125 2.15625H25.7188V21.8438H2.28125V2.15625Z\" stroke={color} strokeWidth=\"2.8125\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n)\n\nconst FleetIcon = ({ color = '#fff', size = 30 }) => (\n <svg width={size} height={size} viewBox=\"0 0 30 30\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clipPath=\"url(#clip0_327_836)\">\n <path d=\"M26.5249 26.0324C26.7104 25.8203 26.93 25.7143 27.1839 25.7143C27.4377 25.7143 27.6573 25.8203 27.8428 26.0324L29.7173 28.1752L28.3993 29.6819L27.1839 28.2924L25.9684 29.6819C25.7927 29.894 25.573 30 25.3094 30C25.0458 30 24.8262 29.894 24.6504 29.6819L23.435 28.2924L22.2195 29.6819C22.034 29.894 21.8144 30 21.5605 30C21.3067 30 21.087 29.894 20.9016 29.6819L19.6861 28.2924L18.4706 29.6819C18.2852 29.894 18.0655 30 17.8117 30C17.5578 30 17.3382 29.894 17.1527 29.6819L15.9372 28.2924L14.7218 29.6819C14.5363 29.894 14.3166 30 14.0628 30C13.809 30 13.5893 29.894 13.4038 29.6819L12.1884 28.2924L10.9729 29.6819C10.7874 29.894 10.5677 30 10.3139 30C10.0601 30 9.84042 29.894 9.65493 29.6819L8.43948 28.2924L7.22402 29.6819C7.03853 29.894 6.81887 30 6.56504 30C6.31121 30 6.09155 29.894 5.90606 29.6819L4.6906 28.2924L3.47515 29.6819C3.28966 29.894 3.06999 30 2.81616 30C2.56233 30 2.34267 29.894 2.15718 29.6819L0.282745 27.5391L1.60071 26.0324L2.81616 27.4219L4.03162 26.0324C4.21711 25.8203 4.43677 25.7143 4.6906 25.7143C4.94443 25.7143 5.16409 25.8203 5.34958 26.0324L6.56504 27.4219L7.7805 26.0324C7.96599 25.8203 8.18565 25.7143 8.43948 25.7143C8.69331 25.7143 8.91297 25.8203 9.09846 26.0324L10.3139 27.4219L11.5294 26.0324C11.7149 25.8203 11.9345 25.7143 12.1884 25.7143C12.4422 25.7143 12.6618 25.8203 12.8473 26.0324L14.0628 27.4219L15.2782 26.0324C15.4637 25.8203 15.6834 25.7143 15.9372 25.7143C16.1911 25.7143 16.4107 25.8203 16.5962 26.0324L17.8117 27.4219L19.0271 26.0324C19.2126 25.8203 19.4323 25.7143 19.6861 25.7143C19.9399 25.7143 20.1596 25.8203 20.3451 26.0324L21.5605 27.4219L22.776 26.0324C22.9615 25.8203 23.1811 25.7143 23.435 25.7143C23.6888 25.7143 23.9085 25.8203 24.094 26.0324L25.3094 27.4219L26.5249 26.0324ZM3.47515 25.3962C3.28966 25.6083 3.06999 25.7143 2.81616 25.7143C2.56233 25.7143 2.34267 25.6083 2.15718 25.3962L0.282745 23.2533L1.60071 21.7467L2.81616 23.1194L4.03162 21.7467C4.21711 21.5346 4.43677 21.4286 4.6906 21.4286C4.94443 21.4286 5.16409 21.5346 5.34958 21.7467L6.56504 23.1194L7.50226 22.048V17.1429L4.42701 11.8862C4.26104 11.596 4.22687 11.2807 4.3245 10.9403C4.42213 10.5999 4.61738 10.3739 4.91026 10.2623L7.50226 9.29129V4.28571H9.3767V2.14286H13.1256V0H16.8744V2.14286H20.6233V4.28571H22.4978V9.29129L25.0898 10.2623C25.3826 10.3739 25.5779 10.5999 25.6755 10.9403C25.7731 11.2807 25.739 11.596 25.573 11.8862L22.4978 17.1429V22.048L22.776 21.7467C22.9615 21.5346 23.1811 21.4286 23.435 21.4286C23.6888 21.4286 23.9085 21.5346 24.094 21.7467L25.3094 23.1194L26.5249 21.7467C26.7104 21.5346 26.93 21.4286 27.1839 21.4286C27.4377 21.4286 27.6573 21.5346 27.8428 21.7467L29.7173 23.8895L28.3993 25.3962L27.1839 24.0067L25.9684 25.3962C25.7927 25.6083 25.573 25.7143 25.3094 25.7143C25.0458 25.7143 24.8262 25.6083 24.6504 25.3962L23.435 24.0067L22.2195 25.3962C22.034 25.6083 21.8144 25.7143 21.5605 25.7143C21.3067 25.7143 21.087 25.6083 20.9016 25.3962L19.6861 24.0067L18.4706 25.3962C18.2852 25.6083 18.0655 25.7143 17.8117 25.7143C17.5578 25.7143 17.3382 25.6083 17.1527 25.3962L15.9372 24.0067L14.7218 25.3962C14.5363 25.6083 14.3166 25.7143 14.0628 25.7143C13.809 25.7143 13.5893 25.6083 13.4038 25.3962L12.1884 24.0067L10.9729 25.3962C10.7874 25.6083 10.5677 25.7143 10.3139 25.7143C10.0601 25.7143 9.84042 25.6083 9.65493 25.3962L8.43948 24.0067L7.22402 25.3962C7.03853 25.6083 6.81887 25.7143 6.56504 25.7143C6.31121 25.7143 6.09155 25.6083 5.90606 25.3962L4.6906 24.0067L3.47515 25.3962ZM9.3767 6.42857V8.57143L15 6.42857L20.6233 8.57143V6.42857H18.7489V4.28571H11.2511V6.42857H9.3767Z\" fill={color} />\n </g>\n <defs>\n <clipPath id=\"clip0_327_836\"><rect width=\"30\" height=\"30\" fill={color} /></clipPath>\n </defs>\n </svg>\n)\n\nconst Performance = ({ color = '#fff', size = 30 }) => (\n <svg width={size} height={size} viewBox=\"0 0 30 30\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M5.64 25.515H24.36C26.0709 23.3842 27.0024 20.7327 27 18C27 11.385 21.63 6 15 6C8.37 6 3 11.385 3 18C3 20.85 3.99 23.445 5.64 25.515ZM13.5 9C13.5 8.175 14.175 7.5 15 7.5C15.825 7.5 16.5 8.175 16.5 9C16.5 9.84 15.825 10.5 15 10.5C14.175 10.5 13.5 9.84 13.5 9ZM6 12C6 11.175 6.675 10.5 7.5 10.5C8.325 10.5 9 11.175 9 12C9 12.84 8.325 13.5 7.5 13.5C6.675 13.5 6 12.84 6 12ZM12.78 17.1C14.04 15.855 22.545 11.85 22.545 11.85C22.545 11.85 18.555 20.37 17.31 21.615C16.05 22.875 14.04 22.875 12.78 21.615C12.1819 21.016 11.8459 20.204 11.8459 19.3575C11.8459 18.511 12.1819 17.699 12.78 17.1ZM4.5 19.5C4.5 18.675 5.175 18 6 18C6.825 18 7.5 18.675 7.5 19.5C7.5 20.34 6.825 21 6 21C5.175 21 4.5 20.34 4.5 19.5ZM13.5 19.5C13.5 18.675 14.175 18 15 18C15.825 18 16.5 18.675 16.5 19.5C16.5 20.34 15.825 21 15 21C14.175 21 13.5 20.34 13.5 19.5ZM22.5 19.5C22.5 18.675 23.175 18 24 18C24.825 18 25.5 18.675 25.5 19.5C25.5 20.34 24.825 21 24 21C23.175 21 22.5 20.34 22.5 19.5Z\" fill={color} />\n </svg>\n)\n\nconst Map = ({ color = '#fff', size = 30 }) => (\n <svg width={size} height={size} viewBox=\"0 0 34 30\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clipPath=\"url(#clip0_327_830)\">\n <path d=\"M16.875 0C12.7975 0 9.49219 3.30527 9.49219 7.38281C9.49219 10.6793 14.3174 16.6875 16.166 18.8684C16.5404 19.3102 17.2102 19.3102 17.584 18.8684C19.4326 16.6875 24.2578 10.6793 24.2578 7.38281C24.2578 3.30527 20.9525 0 16.875 0ZM16.875 9.84375C15.5156 9.84375 14.4141 8.74219 14.4141 7.38281C14.4141 6.02344 15.5156 4.92188 16.875 4.92188C18.2344 4.92188 19.3359 6.02344 19.3359 7.38281C19.3359 8.74219 18.2344 9.84375 16.875 9.84375ZM1.17891 12.6533C0.830964 12.7925 0.532694 13.0327 0.322564 13.343C0.112435 13.6533 8.33325e-05 14.0194 0 14.3941L0 29.0613C0 29.7246 0.669727 30.1781 1.28555 29.932L9.375 26.25V12.593C8.85703 11.6566 8.4334 10.7449 8.12988 9.87305L1.17891 12.6533ZM16.875 21.0744C16.0506 21.0744 15.2707 20.7123 14.7357 20.0807C13.5838 18.7213 12.3586 17.1732 11.25 15.5854V26.2494L22.5 29.9994V15.5859C21.3914 17.1732 20.1668 18.7219 19.0143 20.0812C18.4793 20.7123 17.6994 21.0744 16.875 21.0744ZM32.4645 9.44297L24.375 13.125V30L32.5711 26.7217C32.9191 26.5826 33.2174 26.3424 33.4275 26.0321C33.6377 25.7218 33.75 25.3556 33.75 24.9809V10.3137C33.75 9.65039 33.0803 9.19688 32.4645 9.44297Z\" fill={color} />\n </g>\n <defs>\n <clipPath id=\"clip0_327_830\"><rect width=\"33.75\" height=\"30\" fill={color} /></clipPath>\n </defs>\n </svg>\n)\n\nconst CharterParty = ({ color = '#fff', size = 30 }) => (\n <svg width={size} height={size} viewBox=\"0 0 30 30\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <mask id=\"mask0_327_823\" style={{ maskType: 'alpha' }} maskUnits=\"userSpaceOnUse\" x=\"3\" y=\"1\" width=\"24\" height=\"28\">\n <path d=\"M23.75 2.5H6.25C5.55964 2.5 5 3.05964 5 3.75V26.25C5 26.9404 5.55964 27.5 6.25 27.5H23.75C24.4404 27.5 25 26.9404 25 26.25V3.75C25 3.05964 24.4404 2.5 23.75 2.5Z\" stroke=\"white\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M10 2.5H15.625V12.5L12.8125 10L10 12.5V2.5Z\" fill={color} stroke={color} strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M10 17.5H16.25M10 21.25H20\" stroke={color} strokeWidth=\"2.5\" strokeLinecap=\"round\" />\n </mask>\n <g mask=\"url(#mask0_327_823)\"><path d=\"M0 0H30V30H0V0Z\" fill={color} /></g>\n </svg>\n)\n\nconst Compliance = ({ color = '#fff', size = 30 }) => (\n <svg width={size} height={size} viewBox=\"0 0 30 30\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clipPath=\"url(#clip0_327_821)\">\n <path d=\"M1.87499 14.9962C1.86582 11.6183 3.15973 8.36699 5.48738 5.91906C7.81504 3.47112 10.9971 2.01516 14.3712 1.85426C17.7453 1.69336 21.0514 2.83991 23.6015 5.05525C26.1515 7.27058 27.7489 10.384 28.0612 13.7475C27.6828 13.6443 27.3021 13.5499 26.9194 13.4644C24.8954 13.0002 22.8059 12.893 20.745 13.1475C19.9256 13.2506 19.1512 13.41 18.4219 13.6312C18.325 13.4207 18.2243 13.2119 18.12 13.005C17.9905 12.7506 17.8673 12.493 17.7506 12.2325C17.5856 11.8575 17.4056 11.37 17.4375 10.8525C17.475 10.2525 17.7787 9.76498 18.2681 9.39748C18.8625 8.95123 19.6106 7.92935 20.2556 6.89623C20.5669 6.4031 20.8312 5.93998 21.0187 5.60248L21.0619 5.52373C19.2523 4.36216 17.1465 3.74636 14.9962 3.74998H14.9062C15.0769 4.08748 15.2644 4.4906 15.4331 4.93873C15.8906 6.14998 16.3031 7.92373 15.5662 9.49123C14.8894 10.935 13.7212 11.31 12.8475 11.535L12.7219 11.5669C11.8725 11.7862 11.5219 11.8762 11.2669 12.2606C11.0306 12.6206 11.0737 13.0725 11.3419 13.9481L11.4037 14.145C11.5106 14.4862 11.6381 14.8912 11.7037 15.2737C11.7862 15.75 11.8087 16.3462 11.5087 16.9237C11.2532 17.4397 10.8463 17.8655 10.3425 18.1444C9.95176 18.3427 9.5312 18.4757 9.09749 18.5381L8.96999 18.5606C8.29874 18.6787 7.95749 18.7387 7.62936 19.0893C7.37249 19.365 7.21311 19.8431 7.12124 20.5369C7.08374 20.82 7.05936 21.1012 7.03686 21.3919L7.02374 21.5456C7.00327 21.8794 6.96005 22.2114 6.89436 22.5394L6.84749 22.7456C8.00741 23.9672 9.42664 24.9129 11.0006 25.5131C10.6481 26.0381 10.3219 26.5819 10.0181 27.1406C7.60928 26.1523 5.54882 24.4699 4.09879 22.3074C2.64875 20.1449 1.87467 17.5999 1.87499 14.9962ZM29.8594 16.3837C29.7756 16.2476 29.6584 16.1351 29.5189 16.057C29.3795 15.9789 29.2223 15.9377 29.0625 15.9375H29.0475C28.9738 15.9284 28.9006 15.9159 28.8281 15.9C28.64 15.8553 28.4531 15.8059 28.2675 15.7519L28.0894 15.7031C27.5677 15.5518 27.0419 15.4155 26.5125 15.2943C24.6983 14.8768 22.8251 14.7798 20.9775 15.0075C18.7237 15.2887 17.0006 16.0537 15.825 17.1487C14.6437 18.2531 14.0625 19.6556 14.0625 21.0862C14.0625 21.4294 14.0887 21.7556 14.1337 22.0612C16.1025 20.3437 18.5306 18.9544 21.2137 17.88C21.3281 17.8342 21.4504 17.8114 21.5736 17.8128C21.6968 17.8143 21.8185 17.84 21.9317 17.8885C22.045 17.937 22.1476 18.0073 22.2337 18.0954C22.3197 18.1836 22.3876 18.2878 22.4334 18.4022C22.4792 18.5165 22.502 18.6388 22.5006 18.762C22.4991 18.8852 22.4734 19.0069 22.4249 19.1202C22.3764 19.2334 22.3061 19.336 22.218 19.4221C22.1298 19.5082 22.0256 19.5761 21.9112 19.6219C20.4169 20.22 19.035 20.91 17.79 21.6881C14.6925 23.4956 12.7631 25.8169 11.3494 28.6444C11.2898 28.7549 11.253 28.8762 11.2412 29.0012C11.2294 29.1262 11.2428 29.2523 11.2807 29.372C11.3185 29.4917 11.38 29.6026 11.4616 29.6981C11.5431 29.7936 11.643 29.8717 11.7553 29.9279C11.8676 29.984 11.99 30.017 12.1153 30.025C12.2406 30.0329 12.3662 30.0156 12.4847 29.974C12.6032 29.9325 12.7121 29.8676 12.805 29.7831C12.898 29.6987 12.973 29.5965 13.0256 29.4825C13.7456 28.0462 14.6062 26.7544 15.7406 25.605C16.0418 26.1539 16.4089 26.6639 16.8337 27.1237C17.7037 28.0612 19.1081 29.0625 21.0937 29.0625C22.3162 29.0625 23.3325 28.7512 24.165 28.2075C24.99 27.6712 25.5862 26.9419 26.0325 26.1769C26.7225 24.9956 27.1181 23.5893 27.4106 22.5469C27.4856 22.2843 27.5512 22.0462 27.615 21.84C27.9394 20.7825 28.4137 19.8337 28.8525 19.0575C29.0737 18.6712 29.2819 18.3319 29.4619 18.0431L29.4919 17.9944C29.6374 17.7668 29.7737 17.5335 29.9006 17.295C29.9719 17.1521 30.0055 16.9935 29.9983 16.834C29.9911 16.6745 29.9433 16.5195 29.8594 16.3837Z\" fill={color} />\n </g>\n <defs>\n <clipPath id=\"clip0_327_821\"><rect width=\"30\" height=\"30\" fill={color} /></clipPath>\n </defs>\n </svg>\n)\n\nconst Applications = ({ color = '#fff', size = 30 }) => (\n <svg width={size} height={size} viewBox=\"0 0 30 30\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M3.28125 3.28125H11.7188V11.7188H3.28125V3.28125ZM3.28125 18.2812H11.7188V26.7188H3.28125V18.2812ZM18.2812 18.2812H26.7188V26.7188H18.2812V18.2812ZM18.2812 3.28125H26.7188V11.7188H18.2812V3.28125Z\" stroke={color} strokeWidth=\"2.8125\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n)\n\nconst PowerOff = ({ color = '#fff', size = 6 }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={`w-${size} h-${size}`}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5.636 5.636a9 9 0 1012.728 0M12 3v9\" />\n </svg>\n)\n\nconst ChevronDown = ({ color = '#fff', className = 'h-6 w-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19.5 8.25l-7.5 7.5-7.5-7.5\" />\n </svg>\n)\n\nconst ChevronRight = ({ color = '#fff', className = 'h-6 w-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M8.25 4.5l7.5 7.5-7.5 7.5\" />\n </svg>\n)\n\nconst Checked = ({ color = '#fff', size = 4 }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={`w-${size} h-${size}`}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\" />\n </svg>\n)\n\nconst Search = ({ color = '#fff', size = 4 }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={`w-${size} h-${size}`}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M21 21l-5.197-5.197m0 0A7.5 7.5 0 105.196 5.196a7.5 7.5 0 0010.607 10.607z\" />\n </svg>\n)\n\nconst Calendar = ({ color = '#fff', className = 'h-6 w-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6.75 3v2.25M17.25 3v2.25M3 18.75V7.5a2.25 2.25 0 012.25-2.25h13.5A2.25 2.25 0 0121 7.5v11.25m-18 0A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75m-18 0v-7.5A2.25 2.25 0 015.25 9h13.5A2.25 2.25 0 0121 11.25v7.5\" />\n </svg>\n)\n\nconst Clock = ({ color = '#fff', className = 'h-6 w-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 6v6h4.5m4.5 0a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n)\n\nconst ChartBoard = ({ color = '#fff', className = 'h-6 w-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.75 3v11.25A2.25 2.25 0 006 16.5h2.25M3.75 3h-1.5m1.5 0h16.5m0 0h1.5m-1.5 0v11.25A2.25 2.25 0 0118 16.5h-2.25m-7.5 0h7.5m-7.5 0l-1 3m8.5-3l1 3m0 0l.5 1.5m-.5-1.5h-9.5m0 0l-.5 1.5m.75-9l3-3 2.148 2.148A12.061 12.061 0 0116.5 7.605\" />\n </svg>\n)\n\nconst BarChartBoard = ({ color = '#fff', className = 'h-6 w-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.75 3v11.25A2.25 2.25 0 006 16.5h2.25M3.75 3h-1.5m1.5 0h16.5m0 0h1.5m-1.5 0v11.25A2.25 2.25 0 0118 16.5h-2.25m-7.5 0h7.5m-7.5 0l-1 3m8.5-3l1 3m0 0l.5 1.5m-.5-1.5h-9.5m0 0l-.5 1.5M9 11.25v1.5M12 9v3.75m3-6v6\" />\n </svg>\n)\n\nconst ChartBar = ({ color = '#fff', className = 'h-6 w-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3 13.125C3 12.504 3.504 12 4.125 12h2.25c.621 0 1.125.504 1.125 1.125v6.75C7.5 20.496 6.996 21 6.375 21h-2.25A1.125 1.125 0 013 19.875v-6.75zM9.75 8.625c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125v11.25c0 .621-.504 1.125-1.125 1.125h-2.25a1.125 1.125 0 01-1.125-1.125V8.625zM16.5 4.125c0-.621.504-1.125 1.125-1.125h2.25C20.496 3 21 3.504 21 4.125v15.75c0 .621-.504 1.125-1.125 1.125h-2.25a1.125 1.125 0 01-1.125-1.125V4.125z\" />\n </svg>\n)\n\nconst PieChart = ({ color = '#fff', className = 'h-6 w-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M10.5 6a7.5 7.5 0 107.5 7.5h-7.5V6z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M13.5 10.5H21A7.5 7.5 0 0013.5 3v7.5z\" />\n </svg>\n)\n\nconst BarChartSquare = ({ color = '#fff', className = 'h-6 w-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M7.5 14.25v2.25m3-4.5v4.5m3-6.75v6.75m3-9v9M6 20.25h12A2.25 2.25 0 0020.25 18V6A2.25 2.25 0 0018 3.75H6A2.25 2.25 0 003.75 6v12A2.25 2.25 0 006 20.25z\" />\n </svg>\n)\n\nconst Shield = ({ color = '#fff', className = 'h-6 w-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 9v3.75m0-10.036A11.959 11.959 0 013.598 6 11.99 11.99 0 003 9.75c0 5.592 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.31-.21-2.57-.598-3.75h-.152c-3.196 0-6.1-1.249-8.25-3.286zm0 13.036h.008v.008H12v-.008z\" />\n </svg>\n)\n\nconst Calculator = ({ color = '#fff', className = 'h-6 w-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15.75 15.75V18m-7.5-6.75h.008v.008H8.25v-.008zm0 2.25h.008v.008H8.25V13.5zm0 2.25h.008v.008H8.25v-.008zm0 2.25h.008v.008H8.25V18zm2.498-6.75h.007v.008h-.007v-.008zm0 2.25h.007v.008h-.007V13.5zm0 2.25h.007v.008h-.007v-.008zm0 2.25h.007v.008h-.007V18zm2.504-6.75h.008v.008h-.008v-.008zm0 2.25h.008v.008h-.008V13.5zm0 2.25h.008v.008h-.008v-.008zm0 2.25h.008v.008h-.008V18zm2.498-6.75h.008v.008h-.008v-.008zm0 2.25h.008v.008h-.008V13.5zM8.25 6h7.5v2.25h-7.5V6zM12 2.25c-1.892 0-3.758.11-5.593.322C5.307 2.7 4.5 3.65 4.5 4.757V19.5a2.25 2.25 0 002.25 2.25h10.5a2.25 2.25 0 002.25-2.25V4.757c0-1.108-.806-2.057-1.907-2.185A48.507 48.507 0 0012 2.25z\" />\n </svg>\n)\n\nconst Contract = ({ color = '#fff', className = 'h-6 w-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 12h3.75M9 15h3.75M9 18h3.75m3 .75H18a2.25 2.25 0 002.25-2.25V6.108c0-1.135-.845-2.098-1.976-2.192a48.424 48.424 0 00-1.123-.08m-5.801 0c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m0 0H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V9.375c0-.621-.504-1.125-1.125-1.125H8.25zM6.75 12h.008v.008H6.75V12zm0 3h.008v.008H6.75V15zm0 3h.008v.008H6.75V18z\" />\n </svg>\n)\n\nconst Buoy = ({ color = '#fff', className = 'h-6 w-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M16.712 4.33a9.027 9.027 0 011.652 1.306c.51.51.944 1.064 1.306 1.652M16.712 4.33l-3.448 4.138m3.448-4.138a9.014 9.014 0 00-9.424 0M19.67 7.288l-4.138 3.448m4.138-3.448a9.014 9.014 0 010 9.424m-4.138-5.976a3.736 3.736 0 00-.88-1.388 3.737 3.737 0 00-1.388-.88m2.268 2.268a3.765 3.765 0 010 2.528m-2.268-4.796a3.765 3.765 0 00-2.528 0m4.796 4.796c-.181.506-.475.982-.88 1.388a3.736 3.736 0 01-1.388.88m2.268-2.268l4.138 3.448m0 0a9.027 9.027 0 01-1.306 1.652c-.51.51-1.064.944-1.652 1.306m0 0l-3.448-4.138m3.448 4.138a9.014 9.014 0 01-9.424 0m5.976-4.138a3.765 3.765 0 01-2.528 0m0 0a3.736 3.736 0 01-1.388-.88 3.737 3.737 0 01-.88-1.388m2.268 2.268L7.288 19.67m0 0a9.024 9.024 0 01-1.652-1.306 9.027 9.027 0 01-1.306-1.652m0 0l4.138-3.448M4.33 16.712a9.014 9.014 0 010-9.424m4.138 5.976a3.765 3.765 0 010-2.528m0 0c.181-.506.475-.982.88-1.388a3.736 3.736 0 011.388-.88m-2.268 2.268L4.33 7.288m6.406 1.18L7.288 4.33m0 0a9.024 9.024 0 00-1.652 1.306A9.025 9.025 0 004.33 7.288\" />\n </svg>\n)\n\nconst Cog = ({ color = '#fff', className = 'h-6 w-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M10.343 3.94c.09-.542.56-.94 1.11-.94h1.093c.55 0 1.02.398 1.11.94l.149.894c.07.424.384.764.78.93.398.164.855.142 1.205-.108l.737-.527a1.125 1.125 0 011.45.12l.773.774c.39.389.44 1.002.12 1.45l-.527.737c-.25.35-.272.806-.107 1.204.165.397.505.71.93.78l.893.15c.543.09.94.56.94 1.109v1.094c0 .55-.397 1.02-.94 1.11l-.893.149c-.425.07-.765.383-.93.78-.165.398-.143.854.107 1.204l.527.738c.32.447.269 1.06-.12 1.45l-.774.773a1.125 1.125 0 01-1.449.12l-.738-.527c-.35-.25-.806-.272-1.203-.107-.397.165-.71.505-.781.929l-.149.894c-.09.542-.56.94-1.11.94h-1.094c-.55 0-1.019-.398-1.11-.94l-.148-.894c-.071-.424-.384-.764-.781-.93-.398-.164-.854-.142-1.204.108l-.738.527c-.447.32-1.06.269-1.45-.12l-.773-.774a1.125 1.125 0 01-.12-1.45l.527-.737c.25-.35.273-.806.108-1.204-.165-.397-.505-.71-.93-.78l-.894-.15c-.542-.09-.94-.56-.94-1.109v-1.094c0-.55.398-1.02.94-1.11l.894-.149c.424-.07.765-.383.93-.78.165-.398.143-.854-.107-1.204l-.527-.738a1.125 1.125 0 01.12-1.45l.773-.773a1.125 1.125 0 011.45-.12l.737.527c.35.25.807.272 1.204.107.397-.165.71-.505.78-.929l.15-.894z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n)\n\nconst TableIcon = ({ color = '#fff', className = 'h-6 w-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.375 19.5h17.25m-17.25 0a1.125 1.125 0 01-1.125-1.125M3.375 19.5h7.5c.621 0 1.125-.504 1.125-1.125m-9.75 0V5.625m0 12.75v-1.5c0-.621.504-1.125 1.125-1.125m18.375 2.625V5.625m0 12.75c0 .621-.504 1.125-1.125 1.125m1.125-1.125v-1.5c0-.621-.504-1.125-1.125-1.125m0 3.75h-7.5A1.125 1.125 0 0112 18.375m9.75-12.75c0-.621-.504-1.125-1.125-1.125H3.375c-.621 0-1.125.504-1.125 1.125m19.5 0v1.5c0 .621-.504 1.125-1.125 1.125M2.25 5.625v1.5c0 .621.504 1.125 1.125 1.125m0 0h17.25m-17.25 0h7.5c.621 0 1.125.504 1.125 1.125M3.375 8.25c-.621 0-1.125.504-1.125 1.125v1.5c0 .621.504 1.125 1.125 1.125m17.25-3.75h-7.5c-.621 0-1.125.504-1.125 1.125m8.625-1.125c.621 0 1.125.504 1.125 1.125v1.5c0 .621-.504 1.125-1.125 1.125m-17.25 0h7.5m-7.5 0c-.621 0-1.125.504-1.125 1.125v1.5c0 .621.504 1.125 1.125 1.125M12 10.875v-1.5m0 1.5c0 .621-.504 1.125-1.125 1.125M12 10.875c0 .621.504 1.125 1.125 1.125m-2.25 0c.621 0 1.125.504 1.125 1.125M13.125 12h7.5m-7.5 0c-.621 0-1.125.504-1.125 1.125M20.625 12c.621 0 1.125.504 1.125 1.125v1.5c0 .621-.504 1.125-1.125 1.125m-17.25 0h7.5M12 14.625v-1.5m0 1.5c0 .621-.504 1.125-1.125 1.125M12 14.625c0 .621.504 1.125 1.125 1.125m-2.25 0c.621 0 1.125.504 1.125 1.125m0 1.5v-1.5m0 0c0-.621.504-1.125 1.125-1.125m0 0h7.5\" />\n </svg>\n)\n\nconst Data = ({ color = '#fff', className = 'h-6 w-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M20.25 6.375c0 2.278-3.694 4.125-8.25 4.125S3.75 8.653 3.75 6.375m16.5 0c0-2.278-3.694-4.125-8.25-4.125S3.75 4.097 3.75 6.375m16.5 0v11.25c0 2.278-3.694 4.125-8.25 4.125s-8.25-1.847-8.25-4.125V6.375m16.5 0v3.75m-16.5-3.75v3.75m16.5 0v3.75C20.25 16.153 16.556 18 12 18s-8.25-1.847-8.25-4.125v-3.75m16.5 0c0 2.278-3.694 4.125-8.25 4.125s-8.25-1.847-8.25-4.125\" />\n </svg>\n)\n\nconst XClose = ({ color = '#fff', className = 'h-6 w-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n)\n\nconst Grid = ({ color = '#fff', size = 6 }) => (\n <svg width={size} height={size} viewBox=\"0 0 6 6\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clipPath=\"url(#clip0_401_39)\">\n <path d=\"M0.375 0.75C0.375 0.650544 0.414509 0.555161 0.484835 0.484835C0.555161 0.414509 0.650544 0.375 0.75 0.375H1.5C1.59946 0.375 1.69484 0.414509 1.76516 0.484835C1.83549 0.555161 1.875 0.650544 1.875 0.75V1.5C1.875 1.59946 1.83549 1.69484 1.76516 1.76516C1.69484 1.83549 1.59946 1.875 1.5 1.875H0.75C0.650544 1.875 0.555161 1.83549 0.484835 1.76516C0.414509 1.69484 0.375 1.59946 0.375 1.5V0.75ZM2.25 0.75C2.25 0.650544 2.28951 0.555161 2.35984 0.484835C2.43016 0.414509 2.52554 0.375 2.625 0.375H3.375C3.47446 0.375 3.56984 0.414509 3.64016 0.484835C3.71049 0.555161 3.75 0.650544 3.75 0.75V1.5C3.75 1.59946 3.71049 1.69484 3.64016 1.76516C3.56984 1.83549 3.47446 1.875 3.375 1.875H2.625C2.52554 1.875 2.43016 1.83549 2.35984 1.76516C2.28951 1.69484 2.25 1.59946 2.25 1.5V0.75ZM4.125 0.75C4.125 0.650544 4.16451 0.555161 4.23484 0.484835C4.30516 0.414509 4.40054 0.375 4.5 0.375H5.25C5.34946 0.375 5.44484 0.414509 5.51516 0.484835C5.58549 0.555161 5.625 0.650544 5.625 0.75V1.5C5.625 1.59946 5.58549 1.69484 5.51516 1.76516C5.44484 1.83549 5.34946 1.875 5.25 1.875H4.5C4.40054 1.875 4.30516 1.83549 4.23484 1.76516C4.16451 1.69484 4.125 1.59946 4.125 1.5V0.75ZM0.375 2.625C0.375 2.52554 0.414509 2.43016 0.484835 2.35984C0.555161 2.28951 0.650544 2.25 0.75 2.25H1.5C1.59946 2.25 1.69484 2.28951 1.76516 2.35984C1.83549 2.43016 1.875 2.52554 1.875 2.625V3.375C1.875 3.47446 1.83549 3.56984 1.76516 3.64016C1.69484 3.71049 1.59946 3.75 1.5 3.75H0.75C0.650544 3.75 0.555161 3.71049 0.484835 3.64016C0.414509 3.56984 0.375 3.47446 0.375 3.375V2.625ZM2.25 2.625C2.25 2.52554 2.28951 2.43016 2.35984 2.35984C2.43016 2.28951 2.52554 2.25 2.625 2.25H3.375C3.47446 2.25 3.56984 2.28951 3.64016 2.35984C3.71049 2.43016 3.75 2.52554 3.75 2.625V3.375C3.75 3.47446 3.71049 3.56984 3.64016 3.64016C3.56984 3.71049 3.47446 3.75 3.375 3.75H2.625C2.52554 3.75 2.43016 3.71049 2.35984 3.64016C2.28951 3.56984 2.25 3.47446 2.25 3.375V2.625ZM4.125 2.625C4.125 2.52554 4.16451 2.43016 4.23484 2.35984C4.30516 2.28951 4.40054 2.25 4.5 2.25H5.25C5.34946 2.25 5.44484 2.28951 5.51516 2.35984C5.58549 2.43016 5.625 2.52554 5.625 2.625V3.375C5.625 3.47446 5.58549 3.56984 5.51516 3.64016C5.44484 3.71049 5.34946 3.75 5.25 3.75H4.5C4.40054 3.75 4.30516 3.71049 4.23484 3.64016C4.16451 3.56984 4.125 3.47446 4.125 3.375V2.625ZM0.375 4.5C0.375 4.40054 0.414509 4.30516 0.484835 4.23484C0.555161 4.16451 0.650544 4.125 0.75 4.125H1.5C1.59946 4.125 1.69484 4.16451 1.76516 4.23484C1.83549 4.30516 1.875 4.40054 1.875 4.5V5.25C1.875 5.34946 1.83549 5.44484 1.76516 5.51516C1.69484 5.58549 1.59946 5.625 1.5 5.625H0.75C0.650544 5.625 0.555161 5.58549 0.484835 5.51516C0.414509 5.44484 0.375 5.34946 0.375 5.25V4.5ZM2.25 4.5C2.25 4.40054 2.28951 4.30516 2.35984 4.23484C2.43016 4.16451 2.52554 4.125 2.625 4.125H3.375C3.47446 4.125 3.56984 4.16451 3.64016 4.23484C3.71049 4.30516 3.75 4.40054 3.75 4.5V5.25C3.75 5.34946 3.71049 5.44484 3.64016 5.51516C3.56984 5.58549 3.47446 5.625 3.375 5.625H2.625C2.52554 5.625 2.43016 5.58549 2.35984 5.51516C2.28951 5.44484 2.25 5.34946 2.25 5.25V4.5ZM4.125 4.5C4.125 4.40054 4.16451 4.30516 4.23484 4.23484C4.30516 4.16451 4.40054 4.125 4.5 4.125H5.25C5.34946 4.125 5.44484 4.16451 5.51516 4.23484C5.58549 4.30516 5.625 4.40054 5.625 4.5V5.25C5.625 5.34946 5.58549 5.44484 5.51516 5.51516C5.44484 5.58549 5.34946 5.625 5.25 5.625H4.5C4.40054 5.625 4.30516 5.58549 4.23484 5.51516C4.16451 5.44484 4.125 5.34946 4.125 5.25V4.5Z\" fill={color} />\n </g>\n <defs><clipPath id=\"clip0_401_39\"><rect width=\"6\" height=\"6\" fill=\"white\" /></clipPath></defs>\n </svg>\n)\n\nconst Carousel = ({ color = '#fff', size = 6 }) => (\n <svg width={size} height={size} viewBox=\"0 0 6 6\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clipPath=\"url(#clip0_401_41)\">\n <path d=\"M1 4.75H1.5C1.5 5.02575 1.72425 5.25 2 5.25H4C4.27575 5.25 4.5 5.02575 4.5 4.75H5C5.27575 4.75 5.5 4.52575 5.5 4.25V1.75C5.5 1.47425 5.27575 1.25 5 1.25H4.5C4.5 0.97425 4.27575 0.75 4 0.75H2C1.72425 0.75 1.5 0.97425 1.5 1.25H1C0.72425 1.25 0.5 1.47425 0.5 1.75V4.25C0.5 4.52575 0.72425 4.75 1 4.75ZM5 1.75V4.25H4.5V1.75H5ZM2 1.25H4L4.00025 4.75H2V1.25ZM1 1.75H1.5V4.25H1V1.75Z\" fill={color} />\n </g>\n <defs><clipPath id=\"clip0_401_41\"><rect width=\"6\" height=\"6\" fill=\"white\" /></clipPath></defs>\n </svg>\n)\n\nconst DoubleChevronRight = ({ color = '#fff', className = 'w-6 h-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M11.25 4.5l7.5 7.5-7.5 7.5m-6-15l7.5 7.5-7.5 7.5\" />\n </svg>\n)\n\nconst PlusCircle = ({ color = '#fff', className = 'w-6 h-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 9v6m3-3H9m12 0a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n)\n\nconst Info = ({ color = '#fff', className = 'w-6 h-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M11.25 11.25l.041-.02a.75.75 0 011.063.852l-.708 2.836a.75.75 0 001.063.853l.041-.021M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9-3.75h.008v.008H12V8.25z\" />\n </svg>\n)\n\nconst Warning = ({ color = '#fff', className = 'w-6 h-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z\" />\n </svg>\n)\n\nconst ErrorIcon = ({ color = '#fff', className = 'w-6 h-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 9v3.75m0-10.036A11.959 11.959 0 013.598 6 11.99 11.99 0 003 9.75c0 5.592 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.31-.21-2.57-.598-3.75h-.152c-3.196 0-6.1-1.249-8.25-3.286zm0 13.036h.008v.008H12v-.008z\" />\n </svg>\n)\n\nconst ShowMore = ({ color = '#fff', className = 'w-6 h-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 6.75a.75.75 0 110-1.5.75.75 0 010 1.5zM12 12.75a.75.75 0 110-1.5.75.75 0 010 1.5zM12 18.75a.75.75 0 110-1.5.75.75 0 010 1.5z\" />\n </svg>\n)\n\nconst Tweak = ({ color = '#fff', className = 'w-6 h-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M10.5 6h9.75M10.5 6a1.5 1.5 0 11-3 0m3 0a1.5 1.5 0 10-3 0M3.75 6H7.5m3 12h9.75m-9.75 0a1.5 1.5 0 01-3 0m3 0a1.5 1.5 0 00-3 0m-3.75 0H7.5m9-6h3.75m-3.75 0a1.5 1.5 0 01-3 0m3 0a1.5 1.5 0 00-3 0m-9.75 0h9.75\" />\n </svg>\n)\n\nconst Download = ({ color = '#fff', className = 'w-6 h-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5M16.5 12L12 16.5m0 0L7.5 12m4.5 4.5V3\" />\n </svg>\n)\n\nconst Expand = ({ color = '#fff', className = 'w-6 h-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.75 3.75v4.5m0-4.5h4.5m-4.5 0L9 9M3.75 20.25v-4.5m0 4.5h4.5m-4.5 0L9 15M20.25 3.75h-4.5m4.5 0v4.5m0-4.5L15 9m5.25 11.25h-4.5m4.5 0v-4.5m0 4.5L15 15\" />\n </svg>\n)\n\nconst Collapse = ({ color = '#fff', className = 'w-6 h-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 9V4.5M9 9H4.5M9 9L3.75 3.75M9 15v4.5M9 15H4.5M9 15l-5.25 5.25M15 9h4.5M15 9V4.5M15 9l5.25-5.25M15 15h4.5M15 15v4.5m0-4.5l5.25 5.25\" />\n </svg>\n)\n\nconst ShieldCheck = ({ color = '#fff', className = 'w-6 h-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 12.75L11.25 15 15 9.75m-3-7.036A11.959 11.959 0 013.598 6 11.99 11.99 0 003 9.749c0 5.592 3.824 10.29 9 11.623 5.176-1.332 9-6.03 9-11.622 0-1.31-.21-2.571-.598-3.751h-.152c-3.196 0-6.1-1.248-8.25-3.285z\" />\n </svg>\n)\n\nconst XCircle = ({ color = '#fff', className = 'w-6 h-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9.75 9.75l4.5 4.5m0-4.5l-4.5 4.5M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n)\n\nconst Play = ({ color = '#fff', className = 'w-6 h-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5.25 5.653c0-.856.917-1.398 1.667-.986l11.54 6.348a1.125 1.125 0 010 1.971l-11.54 6.347a1.125 1.125 0 01-1.667-.985V5.653z\" />\n </svg>\n)\n\nconst Document = ({ color = '#fff', className = 'w-6 h-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m.75 12l3 3m0 0l3-3m-3 3v-6m-1.5-9H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z\" />\n </svg>\n)\n\nconst EditIcon = ({ color = '#fff', className = 'w-6 h-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M16.862 4.487l1.687-1.688a1.875 1.875 0 112.652 2.652L10.582 16.07a4.5 4.5 0 01-1.897 1.13L6 18l.8-2.685a4.5 4.5 0 011.13-1.897l8.932-8.931zm0 0L19.5 7.125M18 14v4.75A2.25 2.25 0 0115.75 21H5.25A2.25 2.25 0 013 18.75V8.25A2.25 2.25 0 015.25 6H10\" />\n </svg>\n)\n\nconst Upload = ({ color = '#fff', className = 'w-6 h-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 16.5V9.75m0 0l3 3m-3-3l-3 3M6.75 19.5a4.5 4.5 0 01-1.41-8.775 5.25 5.25 0 0110.233-2.33 3 3 0 013.758 3.848A3.752 3.752 0 0118 19.5H6.75z\" />\n </svg>\n)\n\nconst FileIcon = ({ color = '#fff', className = 'w-6 h-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M10.125 2.25h-4.5c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125v-9M10.125 2.25h.375a9 9 0 019 9v.375M10.125 2.25A3.375 3.375 0 0113.5 5.625v1.5c0 .621.504 1.125 1.125 1.125h1.5a3.375 3.375 0 013.375 3.375M9 15l2.25 2.25L15 12\" />\n </svg>\n)\n\nconst Delete = ({ color = '#fff', className = 'w-6 h-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M14.74 9l-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 01-2.244 2.077H8.084a2.25 2.25 0 01-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 00-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 013.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 00-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 00-7.5 0\" />\n </svg>\n)\n\nconst Bookmarks = ({ color = '#000', className = 'w-6 h-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M16.5 3.75V16.5L12 14.25 7.5 16.5V3.75m9 0H18A2.25 2.25 0 0120.25 6v12A2.25 2.25 0 0118 20.25H6A2.25 2.25 0 013.75 18V6A2.25 2.25 0 016 3.75h1.5m9 0h-9\" />\n </svg>\n)\n\nconst Save = ({ color = '#000', size = 16 }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fillRule=\"evenodd\" clipRule=\"evenodd\" d=\"M18.1716 1C18.702 1 19.2107 1.21071 19.5858 1.58579L22.4142 4.41421C22.7893 4.78929 23 5.29799 23 5.82843V20C23 21.6569 21.6569 23 20 23H4C2.34315 23 1 21.6569 1 20V4C1 2.34315 2.34315 1 4 1H18.1716ZM4 3C3.44772 3 3 3.44772 3 4V20C3 20.5523 3.44772 21 4 21L5 21L5 15C5 13.3431 6.34315 12 8 12L16 12C17.6569 12 19 13.3431 19 15V21H20C20.5523 21 21 20.5523 21 20V6.82843C21 6.29799 20.7893 5.78929 20.4142 5.41421L18.5858 3.58579C18.2107 3.21071 17.702 3 17.1716 3H17V5C17 6.65685 15.6569 8 14 8H10C8.34315 8 7 6.65685 7 5V3H4ZM17 21V15C17 14.4477 16.5523 14 16 14L8 14C7.44772 14 7 14.4477 7 15L7 21L17 21ZM9 3H15V5C15 5.55228 14.5523 6 14 6H10C9.44772 6 9 5.55228 9 5V3Z\" fill={color} />\n </svg>\n)\n\nconst CircleStack = ({ color = '#000', className = 'w-6 h-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M20.25 6.375c0 2.278-3.694 4.125-8.25 4.125S3.75 8.653 3.75 6.375m16.5 0c0-2.278-3.694-4.125-8.25-4.125S3.75 4.097 3.75 6.375m16.5 0v11.25c0 2.278-3.694 4.125-8.25 4.125s-8.25-1.847-8.25-4.125V6.375m16.5 0v3.75m-16.5-3.75v3.75m16.5 0v3.75C20.25 16.153 16.556 18 12 18s-8.25-1.847-8.25-4.125v-3.75m16.5 0c0 2.278-3.694 4.125-8.25 4.125s-8.25-1.847-8.25-4.125\" />\n </svg>\n)\n\nconst Copy = ({ color = '#000', className = 'w-6 h-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15.666 3.888A2.25 2.25 0 0 0 13.5 2.25h-3c-1.03 0-1.9.693-2.166 1.638m7.332 0c.055.194.084.4.084.612v0a.75.75 0 0 1-.75.75H9a.75.75 0 0 1-.75-.75v0c0-.212.03-.418.084-.612m7.332 0c.646.049 1.288.11 1.927.184 1.1.128 1.907 1.077 1.907 2.185V19.5a2.25 2.25 0 0 1-2.25 2.25H6.75A2.25 2.25 0 0 1 4.5 19.5V6.257c0-1.108.806-2.057 1.907-2.185a48.208 48.208 0 0 1 1.927-.184\" />\n </svg>\n)\n\nconst Icon = () => <></>\n\nIcon.Moon = Moon\nIcon.Sun = Sun\nIcon.CheckCircle = CheckCircle\nIcon.Login = Login\nIcon.Loading = Loading\nIcon.ToggleLoading = ToggleLoading\nIcon.Eye = Eye\nIcon.EyeSlash = EyeSlash\nIcon.ArrowRight = ArrowRight\nIcon.Minus = Minus\nIcon.Dashboard = Dashboard\nIcon.FleetIcon = FleetIcon\nIcon.Performance = Performance\nIcon.Map = Map\nIcon.CharterParty = CharterParty\nIcon.Compliance = Compliance\nIcon.Applications = Applications\nIcon.PowerOff = PowerOff\nIcon.ChevronDown = ChevronDown\nIcon.ChevronRight = ChevronRight\nIcon.DoubleChevronRight = DoubleChevronRight\nIcon.Checked = Checked\nIcon.Search = Search\nIcon.Calendar = Calendar\nIcon.Clock = Clock\nIcon.ChartBoard = ChartBoard\nIcon.BarChartBoard = BarChartBoard\nIcon.BarChartSquare = BarChartSquare\nIcon.ChartBar = ChartBar\nIcon.PieChart = PieChart\nIcon.Shield = Shield\nIcon.Calculator = Calculator\nIcon.Contract = Contract\nIcon.Buoy = Buoy\nIcon.Cog = Cog\nIcon.Table = TableIcon\nIcon.Data = Data\nIcon.XClose = XClose\nIcon.Grid = Grid\nIcon.Carousel = Carousel\nIcon.PlusCircle = PlusCircle\nIcon.Info = Info\nIcon.Warning = Warning\nIcon.Error = ErrorIcon\nIcon.ShowMore = ShowMore\nIcon.Tweak = Tweak\nIcon.Download = Download\nIcon.Expand = Expand\nIcon.Collapse = Collapse\nIcon.ShieldCheck = ShieldCheck\nIcon.XCircle = XCircle\nIcon.Play = Play\nIcon.Document = Document\nIcon.Edit = EditIcon\nIcon.Upload = Upload\nIcon.File = FileIcon\nIcon.Delete = Delete\nIcon.Bookmarks = Bookmarks\nIcon.Save = Save\nIcon.Copy = Copy\nIcon.CircleStack = CircleStack\n\nexport default Icon\n","import React, { useEffect, useState } from 'react'\nimport { createPortal } from 'react-dom'\n\nexport interface PortalProps {\n /** Content to render at the target node. */\n children: React.ReactNode\n /**\n * Where to mount the portal.\n * - omitted / `undefined` → `document.body` (the safe default for viewport-anchored UI)\n * - `HTMLElement` → that exact node\n * - `() => HTMLElement | null` → resolved at mount time (lets you query the DOM after layout)\n * - `null` → portal is disabled; nothing renders\n */\n target?: HTMLElement | (() => HTMLElement | null) | null\n}\n\n/**\n * SSR-safe DOM relocator. Renders `children` at a detached DOM node — by\n * default `document.body` — so that any `position: fixed` descendant resolves\n * against the real viewport, never against a transformed, filtered, or\n * contained ancestor.\n *\n * ## Why this exists\n *\n * Per the CSS spec, **any ancestor with `transform`, `filter`, `perspective`,\n * `will-change`, or `contain: layout|paint|strict` creates a new containing\n * block for `position: fixed` descendants**. The fixed element then resolves\n * its coordinates against that ancestor, not the viewport — silently breaking\n * full-screen overlays, toast viewports, mobile drawers, and loading screens\n * whenever a consumer wraps the component in:\n *\n * - a page-transition library (Framer Motion, view transitions)\n * - a modal or drawer (Storybook's centered-layout wrapper hits this too)\n * - a card with `contain: layout` or `will-change: transform`\n * - a CSS filter (`backdrop-blur`, `drop-shadow`)\n *\n * Portaling to `document.body` makes the element **immune** to any styling\n * its consumer applies to ancestor nodes. This is the same pattern Radix UI\n * uses internally for every overlay primitive (`Dialog.Portal`,\n * `Tooltip.Portal`, `Popover.Portal`, etc.).\n *\n * ## When to use it\n *\n * Wrap any element that uses `position: fixed` to anchor itself to the\n * viewport — full-screen overlays, toast viewports, drawers, loading screens,\n * command palettes, lightboxes.\n *\n * If you're already using a Radix primitive, prefer its built-in `*.Portal`\n * component (they're equivalent but lifecycle-aware for that primitive).\n *\n * ## When NOT to use it\n *\n * - For inline elements that already flow naturally with the document — Portal\n * is for **fixed/absolute escape**, not general layout.\n * - For SSR-critical content that must appear before hydration — Portal renders\n * `null` on the server and the first client render.\n * - For accessibility-critical content that depends on DOM proximity (form\n * labels, ARIA `aria-controls` targets) — escaping the tree can break focus\n * order and assistive-tech navigation.\n *\n * ## SSR / hydration\n *\n * `document.body` isn't available during SSR or the first client render.\n * `Portal` renders `null` until `useEffect` resolves the target post-mount,\n * then re-renders with the portal in place. Content that needs to appear\n * immediately on mount paints one frame later — acceptable for overlays\n * (the trigger interaction is what kicks them off anyway).\n *\n * @example Full-screen loading overlay\n * ```tsx\n * <Portal>\n * <div className=\"fixed inset-0 bg-black/40 z-overlay flex items-center justify-center\">\n * <Spinner />\n * </div>\n * </Portal>\n * ```\n *\n * @example Mount to a specific element\n * ```tsx\n * <Portal target={() => document.getElementById('app-root')}>\n * <Drawer />\n * </Portal>\n * ```\n *\n * @example Conditionally disable (render inline)\n * ```tsx\n * <Portal target={shouldPortal ? undefined : null}>\n * <Banner />\n * </Portal>\n * ```\n */\nexport default function Portal({ children, target }: PortalProps) {\n const [resolved, setResolved] = useState<HTMLElement | null>(null)\n\n useEffect(() => {\n if (target === null) {\n setResolved(null)\n return\n }\n const node =\n typeof target === 'function' ? target() :\n target ?? document.body\n setResolved(node ?? null)\n }, [target])\n\n return resolved ? createPortal(children, resolved) : null\n}\n","import React from 'react'\n\n// ── Token scales ───────────────────────────────────────────────────────────\n\nexport type Spacing = 'none' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'\n\nconst SPACING_MAP: Record<Spacing, string> = {\n 'none': '0',\n 'xs': '1',\n 'sm': '2',\n 'md': '4',\n 'lg': '6',\n 'xl': '8',\n '2xl': '12',\n}\n\nconst padding = (s?: Spacing, axis: 'p' | 'px' | 'py' | 'pt' | 'pr' | 'pb' | 'pl' = 'p') =>\n s == null ? '' : `${axis}-${SPACING_MAP[s]}`\nconst margin = (s?: Spacing, axis: 'm' | 'mx' | 'my' | 'mt' | 'mr' | 'mb' | 'ml' = 'm') =>\n s == null ? '' : `${axis}-${SPACING_MAP[s]}`\n\nexport type BoxBackground =\n | 'none' | 'background' | 'surface' | 'surface-raised' | 'accent'\nexport type BoxBorder = 'none' | 'border' | 'border-strong' | 'accent' | 'status-error'\nexport type BoxRadius = 'none' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 'full'\nexport type BoxShadow = 'none' | 'sm' | 'md' | 'lg' | 'xl'\n\nconst BG_MAP: Record<BoxBackground, string> = {\n 'none': '',\n 'background': 'bg-background',\n 'surface': 'bg-surface',\n 'surface-raised': 'bg-surface-raised',\n 'accent': 'bg-accent text-accent-fg',\n}\nconst BORDER_MAP: Record<BoxBorder, string> = {\n 'none': '',\n 'border': 'border border-border',\n 'border-strong': 'border border-border-strong',\n 'accent': 'border border-accent',\n 'status-error': 'border border-status-error',\n}\nconst RADIUS_MAP: Record<BoxRadius, string> = {\n 'none': 'rounded-none',\n 'sm': 'rounded-sm',\n 'md': 'rounded-md',\n 'lg': 'rounded-lg',\n 'xl': 'rounded-xl',\n '2xl': 'rounded-2xl',\n 'full': 'rounded-full',\n}\nconst SHADOW_MAP: Record<BoxShadow, string> = {\n 'none': '',\n 'sm': 'shadow-sm',\n 'md': 'shadow-md',\n 'lg': 'shadow-lg',\n 'xl': 'shadow-xl',\n}\n\n// ── Box ────────────────────────────────────────────────────────────────────\n\nexport interface BoxProps {\n as?: keyof React.JSX.IntrinsicElements\n /** Padding shorthand — applies to all sides. */\n p?: Spacing\n /** Horizontal padding (left + right). */\n px?: Spacing\n /** Vertical padding (top + bottom). */\n py?: Spacing\n pt?: Spacing\n pr?: Spacing\n pb?: Spacing\n pl?: Spacing\n /** Margin shorthand. */\n m?: Spacing\n mx?: Spacing\n my?: Spacing\n mt?: Spacing\n mr?: Spacing\n mb?: Spacing\n ml?: Spacing\n background?: BoxBackground\n border?: BoxBorder\n radius?: BoxRadius\n shadow?: BoxShadow\n /** Width via Tailwind class or CSS value. */\n width?: string | number\n /** Height via Tailwind class or CSS value. */\n height?: string | number\n /** Click handler — accepts any element-typed handler. */\n onClick?: React.MouseEventHandler<HTMLElement>\n className?: string\n style?: React.CSSProperties\n children?: React.ReactNode\n}\n\n/**\n * A polymorphic layout primitive — a `<div>` (by default) styled via prop\n * shortcuts to the design system's tokenised spacing, surface, border,\n * radius, and shadow scales. Use it when you'd otherwise reach for a\n * className-only `<div>` with `p-4 bg-surface border border-border rounded-lg`.\n *\n * The token shortcuts map straight to Tailwind classes under the hood, so\n * Tailwind's content scanner sees the classes and JIT-emits the CSS. There\n * is no runtime style cost beyond the className concatenation.\n *\n * Use `as` when the semantic element should differ (`<section>`, `<article>`).\n *\n * @example Padded card surface\n * ```tsx\n * <Box p=\"lg\" background=\"surface\" border=\"border\" radius=\"lg\" shadow=\"sm\">\n * <Typography variant=\"h3\">Card title</Typography>\n * </Box>\n * ```\n *\n * @example Semantic section\n * ```tsx\n * <Box as=\"section\" px=\"md\" py=\"lg\" background=\"background\">\n * <PageContent />\n * </Box>\n * ```\n */\nexport default function Box({\n as,\n p, px, py, pt, pr, pb, pl,\n m, mx, my, mt, mr, mb, ml,\n background = 'none',\n border = 'none',\n radius,\n shadow = 'none',\n width,\n height,\n onClick,\n className = '',\n style,\n children,\n}: BoxProps) {\n const Element = (as ?? 'div') as React.ElementType\n return (\n <Element\n onClick={onClick}\n className={[\n padding(p, 'p'), padding(px, 'px'), padding(py, 'py'),\n padding(pt, 'pt'), padding(pr, 'pr'), padding(pb, 'pb'), padding(pl, 'pl'),\n margin(m, 'm'), margin(mx, 'mx'), margin(my, 'my'),\n margin(mt, 'mt'), margin(mr, 'mr'), margin(mb, 'mb'), margin(ml, 'ml'),\n BG_MAP[background],\n BORDER_MAP[border],\n radius ? RADIUS_MAP[radius] : '',\n SHADOW_MAP[shadow],\n className,\n ].filter(Boolean).join(' ')}\n style={{\n width: typeof width === 'number' ? `${width}px` : width,\n height: typeof height === 'number' ? `${height}px` : height,\n ...style,\n }}\n >\n {children}\n </Element>\n )\n}\n","import React from 'react'\nimport Box, { type BoxProps, type Spacing } from './Box'\n\nexport type FlexDirection = 'row' | 'row-reverse' | 'col' | 'col-reverse'\nexport type FlexAlign = 'start' | 'center' | 'end' | 'stretch' | 'baseline'\nexport type FlexJustify = 'start' | 'center' | 'end' | 'between' | 'around' | 'evenly'\nexport type FlexWrap = 'nowrap' | 'wrap' | 'wrap-reverse'\n\nconst GAP_MAP: Record<Spacing, string> = {\n 'none': 'gap-0',\n 'xs': 'gap-1',\n 'sm': 'gap-2',\n 'md': 'gap-4',\n 'lg': 'gap-6',\n 'xl': 'gap-8',\n '2xl': 'gap-12',\n}\n\nconst DIRECTION_CLASS: Record<FlexDirection, string> = {\n 'row': 'flex-row',\n 'row-reverse': 'flex-row-reverse',\n 'col': 'flex-col',\n 'col-reverse': 'flex-col-reverse',\n}\nconst ALIGN_CLASS: Record<FlexAlign, string> = {\n start: 'items-start',\n center: 'items-center',\n end: 'items-end',\n stretch: 'items-stretch',\n baseline: 'items-baseline',\n}\nconst JUSTIFY_CLASS: Record<FlexJustify, string> = {\n start: 'justify-start',\n center: 'justify-center',\n end: 'justify-end',\n between: 'justify-between',\n around: 'justify-around',\n evenly: 'justify-evenly',\n}\nconst WRAP_CLASS: Record<FlexWrap, string> = {\n 'nowrap': 'flex-nowrap',\n 'wrap': 'flex-wrap',\n 'wrap-reverse': 'flex-wrap-reverse',\n}\n\nexport interface FlexProps extends BoxProps {\n direction?: FlexDirection\n align?: FlexAlign\n justify?: FlexJustify\n wrap?: FlexWrap\n /** Gap between children — uses the same spacing token scale as Box. */\n gap?: Spacing\n inline?: boolean\n}\n\n/**\n * `Box` with `display: flex` baked in. All Box props are accepted (padding,\n * margin, background, border, etc.) plus flex-specific controls.\n *\n * @example Horizontal row, centred, with gap\n * ```tsx\n * <Flex direction=\"row\" align=\"center\" gap=\"md\">\n * <Avatar src={user.photo} alt={user.name} />\n * <Typography variant=\"body\">{user.name}</Typography>\n * </Flex>\n * ```\n *\n * @example Vertical stack\n * ```tsx\n * <Flex direction=\"col\" gap=\"sm\">\n * <Typography variant=\"h3\">Title</Typography>\n * <Typography variant=\"body\">Body text</Typography>\n * </Flex>\n * ```\n */\nexport default function Flex({\n direction = 'row',\n align,\n justify,\n wrap,\n gap,\n inline,\n className = '',\n ...boxProps\n}: FlexProps) {\n return (\n <Box\n {...boxProps}\n className={[\n inline ? 'inline-flex' : 'flex',\n DIRECTION_CLASS[direction],\n align ? ALIGN_CLASS[align] : '',\n justify ? JUSTIFY_CLASS[justify] : '',\n wrap ? WRAP_CLASS[wrap] : '',\n gap ? GAP_MAP[gap] : '',\n className,\n ].filter(Boolean).join(' ')}\n />\n )\n}\n","import React from 'react'\nimport Box, { type BoxProps, type Spacing } from './Box'\n\nconst GAP_MAP: Record<Spacing, string> = {\n 'none': 'gap-0',\n 'xs': 'gap-1',\n 'sm': 'gap-2',\n 'md': 'gap-4',\n 'lg': 'gap-6',\n 'xl': 'gap-8',\n '2xl': 'gap-12',\n}\n\nconst COL_MAP: Record<number, string> = {\n 1: 'grid-cols-1', 2: 'grid-cols-2', 3: 'grid-cols-3', 4: 'grid-cols-4',\n 5: 'grid-cols-5', 6: 'grid-cols-6', 7: 'grid-cols-7', 8: 'grid-cols-8',\n 9: 'grid-cols-9', 10: 'grid-cols-10', 11: 'grid-cols-11', 12: 'grid-cols-12',\n}\n\nconst ROW_MAP: Record<number, string> = {\n 1: 'grid-rows-1', 2: 'grid-rows-2', 3: 'grid-rows-3',\n 4: 'grid-rows-4', 5: 'grid-rows-5', 6: 'grid-rows-6',\n}\n\nexport interface GridProps extends BoxProps {\n /**\n * Number of columns (1–12) for the most common case, OR an explicit\n * CSS grid-template-columns string for arbitrary layouts\n * (e.g. `\"200px 1fr\"` or `\"repeat(auto-fit, minmax(180px, 1fr))\"`).\n */\n cols?: number | string\n /** Same as `cols` but for rows. */\n rows?: number | string\n /** Uniform gap. Token scale, like Box's padding. */\n gap?: Spacing\n /** Horizontal-only gap (overrides `gap`). */\n gapX?: Spacing\n /** Vertical-only gap (overrides `gap`). */\n gapY?: Spacing\n /** Cross-axis alignment of items within their cell. */\n align?: 'start' | 'center' | 'end' | 'stretch'\n /** Main-axis alignment of items within their cell. */\n justify?: 'start' | 'center' | 'end' | 'stretch'\n}\n\nconst ALIGN_CLASS = {\n start: 'items-start', center: 'items-center', end: 'items-end', stretch: 'items-stretch',\n}\nconst JUSTIFY_CLASS = {\n start: 'justify-items-start', center: 'justify-items-center', end: 'justify-items-end', stretch: 'justify-items-stretch',\n}\n\n/**\n * `Box` with `display: grid` baked in. Use `cols` / `rows` as numbers for\n * the common \"N equal tracks\" case, or pass any CSS grid-template-* string\n * for arbitrary layouts (auto-fit grids, fixed-width sidebars, etc.).\n *\n * @example 3-column grid with medium gap\n * ```tsx\n * <Grid cols={3} gap=\"md\">\n * <Card />\n * <Card />\n * <Card />\n * </Grid>\n * ```\n *\n * @example Auto-fit responsive grid\n * ```tsx\n * <Grid cols=\"repeat(auto-fit, minmax(220px, 1fr))\" gap=\"lg\">\n * {items.map((it) => <Card key={it.id} {...it} />)}\n * </Grid>\n * ```\n */\nexport default function Grid({\n cols,\n rows,\n gap,\n gapX,\n gapY,\n align,\n justify,\n className = '',\n style,\n ...boxProps\n}: GridProps) {\n // For numeric cols/rows, prefer the static Tailwind class so JIT picks it\n // up. For arbitrary strings, fall back to inline style.\n const colClass = typeof cols === 'number' ? (COL_MAP[cols] ?? '') : ''\n const rowClass = typeof rows === 'number' ? (ROW_MAP[rows] ?? '') : ''\n const inlineCols = typeof cols === 'string' ? cols : undefined\n const inlineRows = typeof rows === 'string' ? rows : undefined\n\n return (\n <Box\n {...boxProps}\n className={[\n 'grid',\n colClass,\n rowClass,\n gap ? GAP_MAP[gap] : '',\n gapX ? GAP_MAP[gapX].replace('gap-', 'gap-x-') : '',\n gapY ? GAP_MAP[gapY].replace('gap-', 'gap-y-') : '',\n align ? ALIGN_CLASS[align] : '',\n justify ? JUSTIFY_CLASS[justify] : '',\n className,\n ].filter(Boolean).join(' ')}\n style={{\n gridTemplateColumns: inlineCols,\n gridTemplateRows: inlineRows,\n ...style,\n }}\n />\n )\n}\n","import React from 'react'\nimport * as AvatarPrimitive from '@radix-ui/react-avatar'\n\nexport type AvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl'\nexport type AvatarShape = 'circle' | 'square'\nexport type AvatarStatus = 'online' | 'offline' | 'away' | 'busy'\n\nexport interface AvatarProps {\n /** Image URL. If missing or fails to load, `fallback` renders instead. */\n src?: string\n /** Alt text — required when `src` is provided for screen readers. */\n alt?: string\n /**\n * Fallback rendered when the image is unavailable. Pass either:\n * - a string (e.g. user initials like \"JD\") — rendered with semi-bold weight\n * - any ReactNode (icon, emoji)\n * - omit entirely — a generic \"person\" silhouette is used\n */\n fallback?: React.ReactNode\n /** Size preset. Default `'md'`. */\n size?: AvatarSize\n /** Circle (default) or rounded square. */\n shape?: AvatarShape\n /**\n * Optional presence indicator dot in the bottom-right corner.\n * `'online' | 'offline' | 'away' | 'busy'`.\n */\n status?: AvatarStatus\n className?: string\n}\n\nconst SIZE_PX: Record<AvatarSize, number> = {\n xs: 20,\n sm: 28,\n md: 36,\n lg: 48,\n xl: 64,\n}\n\nconst TEXT_CLASS: Record<AvatarSize, string> = {\n xs: 'text-[10px]',\n sm: 'text-xs',\n md: 'text-sm',\n lg: 'text-base',\n xl: 'text-lg',\n}\n\nconst STATUS_CLASS: Record<AvatarStatus, string> = {\n online: 'bg-status-success',\n offline: 'bg-foreground-muted',\n away: 'bg-status-warning',\n busy: 'bg-status-error',\n}\n\n/**\n * Circular (or rounded-square) user avatar built on `@radix-ui/react-avatar`.\n * Radix handles the image-load lifecycle: it tries to load `src`, falls back\n * to the `fallback` slot after a short delay if the image is missing or fails\n * to decode, and re-attempts on `src` change.\n *\n * **Fallback strategy** (in order):\n * 1. `fallback` prop if provided (string or ReactNode)\n * 2. Two-character initials extracted from `alt` if `alt` is provided\n * 3. A generic \"person\" silhouette SVG\n *\n * **Status dot** is an optional presence indicator in the bottom-right —\n * online (green), away (amber), busy (red), offline (grey).\n *\n * @example Basic with image\n * ```tsx\n * <Avatar src=\"/users/jd.jpg\" alt=\"Jane Doe\" />\n * ```\n *\n * @example Fallback to initials\n * ```tsx\n * <Avatar alt=\"Jane Doe\" size=\"lg\" />\n * ```\n *\n * @example Online presence + square shape\n * ```tsx\n * <Avatar src={user.photo} alt={user.name} status=\"online\" shape=\"square\" />\n * ```\n */\nexport default function Avatar({\n src,\n alt,\n fallback,\n size = 'md',\n shape = 'circle',\n status,\n className = '',\n}: AvatarProps) {\n const px = SIZE_PX[size]\n\n const initialsFallback = (() => {\n if (fallback) return fallback\n if (alt) {\n const parts = alt.trim().split(/\\s+/).slice(0, 2)\n const initials = parts.map((p) => p[0]?.toUpperCase() ?? '').join('')\n if (initials) return initials\n }\n return <PersonSilhouette />\n })()\n\n return (\n <span\n className={`relative inline-block flex-shrink-0 ${className}`}\n style={{ width: px, height: px }}\n >\n <AvatarPrimitive.Root\n className={`flex w-full h-full items-center justify-center overflow-hidden bg-surface-raised text-foreground-secondary select-none ${\n shape === 'circle' ? 'rounded-full' : 'rounded-md'\n }`}\n >\n {src && (\n <AvatarPrimitive.Image\n src={src}\n alt={alt ?? ''}\n className=\"h-full w-full object-cover\"\n />\n )}\n <AvatarPrimitive.Fallback\n delayMs={src ? 300 : 0}\n className={`flex h-full w-full items-center justify-center font-semibold ${TEXT_CLASS[size]}`}\n >\n {initialsFallback}\n </AvatarPrimitive.Fallback>\n </AvatarPrimitive.Root>\n\n {status && (\n <span\n className={`absolute bottom-0 right-0 block rounded-full ring-2 ring-background ${STATUS_CLASS[status]}`}\n style={{\n width: Math.max(6, Math.round(px / 4)),\n height: Math.max(6, Math.round(px / 4)),\n }}\n aria-label={`Status: ${status}`}\n role=\"status\"\n />\n )}\n </span>\n )\n}\n\nfunction PersonSilhouette() {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"w-[60%] h-[60%]\" aria-hidden=\"true\">\n <path d=\"M12 12a4 4 0 100-8 4 4 0 000 8zM4 20a8 8 0 1116 0H4z\" />\n </svg>\n )\n}\n","import React from 'react'\n\nexport type TypographyVariant =\n | 'display'\n | 'h1' | 'h2' | 'h3' | 'h4'\n | 'subtitle'\n | 'body'\n | 'caption'\n | 'overline'\n | 'code'\n\nexport type TypographyColor =\n | 'foreground'\n | 'foreground-secondary'\n | 'foreground-muted'\n | 'accent'\n | 'status-error'\n | 'status-warning'\n | 'status-success'\n | 'status-info'\n | 'inherit'\n\nexport type TypographyWeight = 'normal' | 'medium' | 'semibold' | 'bold'\nexport type TypographyAlign = 'left' | 'center' | 'right' | 'justify'\n\nexport interface TypographyProps {\n /** Visual scale variant. */\n variant?: TypographyVariant\n /**\n * Element to render. Defaults are sensible per variant\n * (e.g. h1 → `<h1>`, body → `<p>`, code → `<code>`). Override\n * with `as` when the semantic element should differ from the visual\n * style (e.g. a styled-as-h1 product card heading rendered as `<div>`).\n */\n as?: keyof React.JSX.IntrinsicElements\n color?: TypographyColor\n weight?: TypographyWeight\n align?: TypographyAlign\n /** Truncate to one line with ellipsis. */\n truncate?: boolean\n /** Render the text with reduced opacity (useful for disabled states). */\n muted?: boolean\n className?: string\n style?: React.CSSProperties\n children?: React.ReactNode\n}\n\n// Variant → Tailwind class map. Each variant defines size, weight, line-height,\n// and tracking. The defaults are designed to read at the natural body rhythm\n// of the design system.\nconst VARIANT_CLASS: Record<TypographyVariant, string> = {\n display: 'text-3xl font-bold leading-tight tracking-tight',\n h1: 'text-2xl font-bold leading-tight tracking-tight',\n h2: 'text-xl font-semibold leading-snug tracking-tight',\n h3: 'text-lg font-semibold leading-snug',\n h4: 'text-base font-semibold leading-snug',\n subtitle: 'text-sm font-medium leading-snug',\n body: 'text-sm leading-normal',\n caption: 'text-xs leading-normal',\n overline: 'text-[10px] font-semibold leading-normal uppercase tracking-wider',\n code: 'text-xs leading-normal font-mono bg-surface-raised text-foreground rounded px-1 py-0.5',\n}\n\n// Default element per variant. Consumers can override with `as`.\nconst DEFAULT_ELEMENT: Record<TypographyVariant, keyof React.JSX.IntrinsicElements> = {\n display: 'h1',\n h1: 'h1',\n h2: 'h2',\n h3: 'h3',\n h4: 'h4',\n subtitle: 'p',\n body: 'p',\n caption: 'span',\n overline: 'span',\n code: 'code',\n}\n\nconst COLOR_CLASS: Record<TypographyColor, string> = {\n 'foreground': 'text-foreground',\n 'foreground-secondary': 'text-foreground-secondary',\n 'foreground-muted': 'text-foreground-muted',\n 'accent': 'text-accent',\n 'status-error': 'text-status-error',\n 'status-warning': 'text-status-warning',\n 'status-success': 'text-status-success',\n 'status-info': 'text-status-info',\n 'inherit': '',\n}\n\nconst WEIGHT_CLASS: Record<TypographyWeight, string> = {\n normal: 'font-normal',\n medium: 'font-medium',\n semibold: 'font-semibold',\n bold: 'font-bold',\n}\n\nconst ALIGN_CLASS: Record<TypographyAlign, string> = {\n left: 'text-left',\n center: 'text-center',\n right: 'text-right',\n justify: 'text-justify',\n}\n\n/**\n * Polymorphic typography primitive. `variant` picks a visual scale; `as`\n * controls the rendered element when it should differ from the default\n * for that variant (e.g. a styled-as-h2 card title rendered as `<div>`).\n *\n * **Variants** map to the design-system text scale:\n * - `display`: hero headlines\n * - `h1` – `h4`: section / subsection headings\n * - `subtitle`: emphasised lead text\n * - `body` (default): paragraph text\n * - `caption`: small label / hint text\n * - `overline`: uppercase eyebrow text\n * - `code`: inline code samples\n *\n * **Colour** accepts any semantic token; defaults to `inherit` so the\n * parent's text colour flows through (useful when nesting Typography\n * inside a coloured surface like an accent badge).\n *\n * @example Section heading\n * ```tsx\n * <Typography variant=\"h2\">Vessel performance</Typography>\n * ```\n *\n * @example Styled as h1 but rendered as div (for SEO-neutral cards)\n * ```tsx\n * <Typography variant=\"h1\" as=\"div\">Card title</Typography>\n * ```\n *\n * @example Error message\n * ```tsx\n * <Typography variant=\"caption\" color=\"status-error\">{errorText}</Typography>\n * ```\n */\nexport default function Typography({\n variant = 'body',\n as,\n color = 'inherit',\n weight,\n align,\n truncate,\n muted,\n className = '',\n style,\n children,\n}: TypographyProps) {\n const Element = (as ?? DEFAULT_ELEMENT[variant]) as React.ElementType\n return (\n <Element\n className={[\n VARIANT_CLASS[variant],\n COLOR_CLASS[color],\n weight ? WEIGHT_CLASS[weight] : '',\n align ? ALIGN_CLASS[align] : '',\n truncate ? 'truncate' : '',\n muted ? 'opacity-60' : '',\n className,\n ].filter(Boolean).join(' ')}\n style={style}\n >\n {children}\n </Element>\n )\n}\n","import { useMemo } from 'react'\n\nexport type IconButtonVariant = 'primary' | 'bordered'\n\nexport interface IconButtonProps {\n icon?: React.ReactNode\n onClick?: React.MouseEventHandler<HTMLButtonElement>\n /** Visual style. Defaults to `'primary'`. */\n type?: IconButtonVariant\n buttonType?: 'button' | 'submit' | 'reset'\n disabled?: boolean\n size?: 'sm' | 'lg'\n loading?: boolean\n loadingIcon?: React.ReactNode\n title?: string\n}\n\n/**\n * Square icon-only button.\n *\n * @example\n * <IconButton icon={<Icon.Search />} onClick={doSearch} />\n * <IconButton type=\"bordered\" icon={<Icon.Edit />} />\n */\nexport default function IconButton({\n icon,\n onClick,\n type = 'primary',\n buttonType = 'button',\n disabled = false,\n size = 'lg',\n loading = false,\n loadingIcon,\n}: IconButtonProps) {\n const colorScheme = useMemo(() => {\n if (type === 'primary') {\n // Single semantic palette handles both light and dark modes via\n // CSS vars on the consumer's ThemeProvider — no `dark:` variants\n // needed.\n return 'bg-accent text-accent-fg hover:bg-accent-hover'\n }\n if (type === 'bordered') {\n return 'bg-surface text-foreground hover:bg-surface-raised border border-border-strong'\n }\n return ''\n }, [type])\n\n return (\n <button\n type={buttonType}\n disabled={disabled || loading}\n onClick={onClick}\n className={`${size === 'sm' ? 'p-1' : 'p-2'} rounded-lg shadow-md transition-colors duration-150 ${colorScheme} disabled:bg-surface-raised disabled:text-foreground-muted disabled:cursor-not-allowed focus:outline-none focus-visible:ring-2 focus-visible:ring-accent`}\n >\n {loading ? loadingIcon : icon}\n </button>\n )\n}\n","import React from 'react'\n\nexport interface ButtonProps {\n content?: React.ReactNode\n /** Visual style variant */\n variant?: 'primary' | 'secondary' | 'ghost' | 'danger'\n /** Size — controls height, padding, and font size */\n size?: 'sm' | 'md' | 'lg'\n /** HTML button type */\n buttonType?: 'button' | 'submit' | 'reset'\n loading?: boolean\n disabled?: boolean\n /** Inline style overrides (width, etc.). Margins/layout belong in the parent. */\n style?: React.CSSProperties\n /** Leading icon — rendered before content */\n icon?: React.ReactNode\n onClick?: React.MouseEventHandler<HTMLButtonElement>\n /**\n * @deprecated Pass `variant` instead. Kept for API compat — currently no-op.\n * Will be removed in the next major version.\n */\n type?: string\n}\n\nconst VARIANT_CLASSES: Record<NonNullable<ButtonProps['variant']>, string> = {\n primary: [\n 'bg-accent text-accent-fg',\n 'hover:bg-accent-hover',\n 'active:bg-accent',\n 'disabled:bg-foreground-muted disabled:text-accent-fg/70 disabled:cursor-not-allowed',\n 'focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2',\n ].join(' '),\n\n secondary: [\n 'bg-transparent border border-accent text-accent',\n 'hover:bg-accent hover:text-accent-fg',\n 'active:bg-accent-hover active:text-accent-fg',\n 'disabled:border-foreground-muted disabled:text-foreground-muted disabled:cursor-not-allowed',\n 'focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2',\n ].join(' '),\n\n ghost: [\n // Semantic tokens handle both light and dark modes — no `dark:`\n // variants needed.\n 'bg-transparent text-foreground-secondary',\n 'hover:bg-surface-raised hover:text-foreground',\n 'active:bg-surface',\n 'disabled:text-foreground-muted disabled:cursor-not-allowed',\n 'focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2',\n ].join(' '),\n\n danger: [\n 'bg-status-error text-accent-fg',\n 'hover:opacity-90',\n 'active:opacity-100',\n 'disabled:opacity-50 disabled:cursor-not-allowed',\n 'focus-visible:ring-2 focus-visible:ring-status-error focus-visible:ring-offset-2',\n ].join(' '),\n}\n\nconst SIZE_CLASSES: Record<NonNullable<ButtonProps['size']>, string> = {\n sm: 'h-7 px-3 text-xs gap-1 rounded-md',\n md: 'h-9 px-4 text-sm gap-1.5 rounded-lg',\n lg: 'h-11 px-5 text-sm gap-2 rounded-xl',\n}\n\n/**\n * Primary action button with variant + size system.\n *\n * Width is never hardcoded — set `style={{ width }}` or let the parent grid/flex control it.\n *\n * @example\n * <Button content=\"Save\" onClick={handleSave} />\n * <Button content=\"Delete\" variant=\"danger\" size=\"sm\" />\n * <Button content=\"Cancel\" variant=\"secondary\" />\n * <Button content=\"Loading…\" loading buttonType=\"submit\" />\n */\nexport default function Button({\n content,\n variant = 'primary',\n size = 'md',\n buttonType = 'button',\n loading,\n disabled,\n style,\n icon,\n onClick,\n}: ButtonProps) {\n return (\n <button\n onClick={onClick}\n disabled={disabled || loading}\n type={buttonType}\n style={style}\n className={[\n // Base — layout, transitions, focus reset\n 'inline-flex items-center justify-center font-medium',\n 'outline-none transition-colors duration-150 select-none',\n 'whitespace-nowrap',\n SIZE_CLASSES[size],\n VARIANT_CLASSES[variant],\n ].join(' ')}\n >\n {loading ? (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className=\"w-4 h-4 animate-spin flex-shrink-0\"\n aria-hidden=\"true\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M4.755 10.059a7.5 7.5 0 0112.548-3.364l1.903 1.903h-3.183a.75.75 0 100 1.5h4.992a.75.75 0 00.75-.75V4.356a.75.75 0 00-1.5 0v3.18l-1.9-1.9A9 9 0 003.306 9.67a.75.75 0 101.45.388zm15.408 3.352a.75.75 0 00-.919.53 7.5 7.5 0 01-12.548 3.364l-1.902-1.903h3.183a.75.75 0 000-1.5H2.984a.75.75 0 00-.75.75v4.992a.75.75 0 001.5 0v-3.18l1.9 1.9a9 9 0 0015.059-4.035.75.75 0 00-.53-.918z\"\n />\n </svg>\n ) : icon ? (\n <span className=\"flex-shrink-0\" aria-hidden=\"true\">{icon}</span>\n ) : null}\n {content}\n </button>\n )\n}\n","import React from 'react'\nimport * as Dialog from '@radix-ui/react-dialog'\nimport { motion, AnimatePresence, useReducedMotion } from 'framer-motion'\nimport Button from '../inputs/Button'\n\nexport interface ModalProps {\n /**\n * Max width of the modal panel in pixels (default 600).\n * On narrow viewports the panel fills the screen minus 1 rem on each side.\n * Height is always content-driven (max 90 dvh).\n */\n width?: number\n /**\n * @deprecated Use `width` instead. The second tuple value (height) was\n * never honoured and is silently ignored. Kept for backwards\n * compatibility — will be removed in a future major version.\n */\n size?: [number, number] | [number]\n isOpen?: boolean\n onClose?: () => void\n onOk?: () => void\n onCancel?: () => void\n okText?: string\n cancelText?: string\n hasFooter?: boolean\n title?: React.ReactNode\n children?: React.ReactNode\n}\n\n/**\n * Centred modal dialog powered by Radix Dialog + Framer Motion.\n *\n * Radix handles focus-trap, escape-to-close, and ARIA roles.\n * Framer Motion drives the scale + fade enter/exit animation.\n * prefers-reduced-motion is respected via useReducedMotion().\n *\n * @example\n * <Modal isOpen={open} onClose={() => setOpen(false)} title=\"Confirm\" onOk={handleOk}>\n * Are you sure you want to delete this item?\n * </Modal>\n */\nexport default function Modal({\n width,\n size,\n isOpen = false,\n onClose,\n onOk,\n onCancel,\n okText = 'Ok',\n cancelText = 'Cancel',\n hasFooter = true,\n title,\n children,\n}: ModalProps) {\n const reduced = useReducedMotion()\n // Prefer the new `width` prop; fall back to the deprecated `size[0]`;\n // finally default to 600 px.\n const maxWidth = width ?? size?.[0] ?? 600\n\n return (\n <Dialog.Root open={isOpen} onOpenChange={(open) => { if (!open) onClose?.() }}>\n <Dialog.Portal forceMount>\n {/* ── Backdrop ── */}\n <AnimatePresence>\n {isOpen && (\n <Dialog.Overlay asChild>\n <motion.div\n className=\"fixed inset-0 bg-black/40 z-overlay\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: reduced ? 0 : 0.18, ease: 'easeOut' }}\n />\n </Dialog.Overlay>\n )}\n </AnimatePresence>\n\n {/* ── Panel ── */}\n <AnimatePresence>\n {isOpen && (\n <Dialog.Content asChild>\n <motion.div\n className=\"fixed left-1/2 top-1/2 z-modal flex flex-col w-[calc(100%-2rem)] max-h-[90dvh] bg-surface rounded-2xl shadow-xl overflow-hidden focus:outline-none\"\n style={{\n maxWidth,\n x: '-50%',\n y: '-50%',\n }}\n initial={{ opacity: 0, scale: reduced ? 1 : 0.96 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: reduced ? 1 : 0.96 }}\n transition={\n reduced\n ? { duration: 0 }\n : {\n type: 'spring',\n damping: 28,\n stiffness: 380,\n duration: 0.25,\n }\n }\n >\n {/* Header */}\n <div className=\"flex h-14 flex-shrink-0 items-center justify-between border-b border-border px-5\">\n <Dialog.Title className=\"text-base font-semibold text-foreground tracking-tight\">\n {title}\n </Dialog.Title>\n <Dialog.Close asChild>\n <button\n aria-label=\"Close\"\n className=\"flex h-7 w-7 items-center justify-center rounded-lg text-foreground-muted hover:bg-surface-raised hover:text-foreground transition-colors duration-150 focus:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n >\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 15 15\" fill=\"none\">\n <path d=\"M11.7816 4.03157C12.0062 3.80702 12.0062 3.44295 11.7816 3.2184C11.5571 2.99385 11.193 2.99385 10.9685 3.2184L7.50005 6.68682L4.03164 3.2184C3.80708 2.99385 3.44301 2.99385 3.21846 3.2184C2.99391 3.44295 2.99391 3.80702 3.21846 4.03157L6.68688 7.49999L3.21846 10.9684C2.99391 11.193 2.99391 11.557 3.21846 11.7816C3.44301 12.0061 3.80708 12.0061 4.03164 11.7816L7.50005 8.31316L10.9685 11.7816C11.193 12.0061 11.5571 12.0061 11.7816 11.7816C12.0062 11.557 12.0062 11.193 11.7816 10.9684L8.31322 7.49999L11.7816 4.03157Z\" fill=\"currentColor\" fillRule=\"evenodd\" clipRule=\"evenodd\" />\n </svg>\n </button>\n </Dialog.Close>\n </div>\n\n {/* Body — render children unconditionally so they\n stay mounted through Radix's exit animation.\n Previously `{isOpen && children}` unmounted\n children the moment isOpen flipped to false,\n losing form state mid-close. */}\n <div className={`flex-1 overflow-y-auto p-5 ${hasFooter ? '' : 'pb-5'}`}>\n {children}\n </div>\n\n {/* Footer */}\n {hasFooter && (\n <div className=\"flex flex-shrink-0 items-center justify-end gap-3 border-t border-border px-5 py-3\">\n <Button\n style={{ width: 90 }}\n content={cancelText}\n onClick={onCancel}\n />\n <Button\n style={{ width: 90 }}\n content={okText}\n onClick={onOk}\n />\n </div>\n )}\n </motion.div>\n </Dialog.Content>\n )}\n </AnimatePresence>\n </Dialog.Portal>\n </Dialog.Root>\n )\n}\n","import React from 'react'\nimport * as Dialog from '@radix-ui/react-dialog'\nimport { motion, AnimatePresence, useReducedMotion } from 'framer-motion'\nimport Button from '../inputs/Button'\n\nexport interface DrawerProps {\n isOpen?: boolean\n onClose?: () => void\n hasFooter?: boolean\n /** 'left' | 'right' — which edge the panel slides from */\n placement?: 'left' | 'right'\n width?: number\n okText?: string\n cancelText?: string\n onOk?: () => void\n onCancel?: () => void\n title?: React.ReactNode\n children?: React.ReactNode\n}\n\n/**\n * Side-sliding drawer panel powered by Radix Dialog + Framer Motion.\n *\n * Radix handles focus-trap, escape-to-close, and ARIA roles.\n * Framer Motion drives the slide enter/exit animation.\n * prefers-reduced-motion is respected via useReducedMotion().\n *\n * @example\n * <Drawer isOpen={open} placement=\"right\" onClose={() => setOpen(false)} title=\"Filters\">\n * <FilterForm />\n * </Drawer>\n */\nexport default function Drawer({\n isOpen = false,\n onClose,\n hasFooter = true,\n placement = 'right',\n width = 320,\n okText = 'Ok',\n cancelText = 'Cancel',\n onOk,\n onCancel,\n title,\n children,\n}: DrawerProps) {\n const reduced = useReducedMotion()\n const isRight = placement === 'right'\n const hiddenX = isRight ? '100%' : '-100%'\n\n return (\n <Dialog.Root open={isOpen} onOpenChange={(open) => { if (!open) onClose?.() }}>\n <Dialog.Portal forceMount>\n {/* ── Backdrop ── */}\n <AnimatePresence>\n {isOpen && (\n <Dialog.Overlay asChild>\n <motion.div\n className=\"fixed inset-0 bg-black/40 z-overlay\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: reduced ? 0 : 0.2, ease: 'easeOut' }}\n />\n </Dialog.Overlay>\n )}\n </AnimatePresence>\n\n {/* ── Panel ── */}\n <AnimatePresence>\n {isOpen && (\n <Dialog.Content asChild>\n <motion.div\n className={`fixed top-0 bottom-0 ${isRight ? 'right-0' : 'left-0'} z-modal flex flex-col bg-surface shadow-xl focus:outline-none`}\n style={{ width: `min(calc(100vw - 1rem), ${width}px)` }}\n initial={{ x: reduced ? 0 : hiddenX, opacity: reduced ? 0 : 1 }}\n animate={{ x: 0, opacity: 1 }}\n exit={{ x: reduced ? 0 : hiddenX, opacity: reduced ? 0 : 1 }}\n transition={\n reduced\n ? { duration: 0 }\n : {\n x: {\n type: 'tween',\n duration: 0.26,\n ease: [0.16, 1, 0.3, 1], // ease-out-expo\n },\n opacity: { duration: 0 },\n }\n }\n >\n {/* Header */}\n <div className={`flex h-14 flex-shrink-0 items-center justify-between border-b border-border px-5 ${isRight ? 'flex-row-reverse' : ''}`}>\n <Dialog.Title className=\"text-base font-semibold text-foreground tracking-tight\">\n {title}\n </Dialog.Title>\n <Dialog.Close asChild>\n <button\n aria-label=\"Close drawer\"\n className=\"flex h-7 w-7 items-center justify-center rounded-lg text-foreground-muted hover:bg-surface-raised hover:text-foreground transition-colors duration-150 focus:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n >\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 15 15\" fill=\"none\">\n <path d=\"M11.7816 4.03157C12.0062 3.80702 12.0062 3.44295 11.7816 3.2184C11.5571 2.99385 11.193 2.99385 10.9685 3.2184L7.50005 6.68682L4.03164 3.2184C3.80708 2.99385 3.44301 2.99385 3.21846 3.2184C2.99391 3.44295 2.99391 3.80702 3.21846 4.03157L6.68688 7.49999L3.21846 10.9684C2.99391 11.193 2.99391 11.557 3.21846 11.7816C3.44301 12.0061 3.80708 12.0061 4.03164 11.7816L7.50005 8.31316L10.9685 11.7816C11.193 12.0061 11.5571 12.0061 11.7816 11.7816C12.0062 11.557 12.0062 11.193 11.7816 10.9684L8.31322 7.49999L11.7816 4.03157Z\" fill=\"currentColor\" fillRule=\"evenodd\" clipRule=\"evenodd\" />\n </svg>\n </button>\n </Dialog.Close>\n </div>\n\n {/* Body — render children unconditionally so they\n stay mounted through Radix's exit animation.\n Previously `{isOpen && children}` unmounted\n children the moment isOpen flipped to false,\n losing form state mid-close. */}\n <div className=\"flex-1 overflow-y-auto p-5\">\n {children}\n </div>\n\n {/* Footer */}\n {hasFooter && (\n <div className={`flex flex-shrink-0 items-center gap-3 border-t border-border px-5 py-3 ${isRight ? 'justify-start' : 'justify-end'}`}>\n <Button style={{ width: 90 }} content={cancelText} onClick={onCancel} />\n <Button style={{ width: 90 }} content={okText} onClick={onOk} />\n </div>\n )}\n </motion.div>\n </Dialog.Content>\n )}\n </AnimatePresence>\n </Dialog.Portal>\n </Dialog.Root>\n )\n}\n","import React from 'react'\nimport * as TooltipPrimitive from '@radix-ui/react-tooltip'\n\nexport interface TooltipProps {\n children: React.ReactNode\n /** The text or node shown inside the tooltip */\n title: React.ReactNode\n /** Which side of the trigger the tooltip appears on */\n placement?: 'top' | 'right' | 'bottom' | 'left'\n /** Delay before showing, ms (default 300) */\n delayDuration?: number\n /** Offset from trigger in px (default 8) */\n sideOffset?: number\n}\n\n// Each placement animates in from the opposite edge (toward the trigger)\nconst ANIMATION: Record<NonNullable<TooltipProps['placement']>, string> = {\n top: 'data-[state=delayed-open]:animate-tooltip-in-top',\n bottom: 'data-[state=delayed-open]:animate-tooltip-in-bottom',\n left: 'data-[state=delayed-open]:animate-tooltip-in-left',\n right: 'data-[state=delayed-open]:animate-tooltip-in-right',\n}\n\n/**\n * Tooltip powered by Radix Tooltip.\n *\n * Radix handles keyboard navigation (Escape), pointer events, and ARIA.\n * Each placement animates in from the correct direction.\n * Wrap your app in `<TooltipProvider>` (re-exported below) to share a\n * single provider instead of nesting one per tooltip.\n *\n * @example\n * <TooltipProvider>\n * <Tooltip title=\"Delete record\" placement=\"top\">\n * <IconButton icon={<TrashIcon />} />\n * </Tooltip>\n * </TooltipProvider>\n */\nexport default function Tooltip({\n children,\n title,\n placement = 'top',\n delayDuration = 300,\n sideOffset = 8,\n}: TooltipProps) {\n return (\n <TooltipPrimitive.Provider delayDuration={delayDuration}>\n <TooltipPrimitive.Root>\n <TooltipPrimitive.Trigger asChild>\n <span className=\"inline-flex\">{children}</span>\n </TooltipPrimitive.Trigger>\n\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n side={placement}\n sideOffset={sideOffset}\n className={[\n // Layout + typography\n 'pointer-events-none z-[500000] max-w-[220px] px-2.5 py-1.5',\n // Inverted surface: dark on light, light on dark — both readable\n 'bg-foreground text-background',\n 'text-xs font-medium leading-snug',\n // Shape + shadow\n 'rounded-md shadow-md',\n // Out animation (always the same — just fade)\n 'data-[state=closed]:animate-tooltip-out',\n // In animation — direction-aware\n ANIMATION[placement],\n ].join(' ')}\n >\n {title}\n <TooltipPrimitive.Arrow\n width={10}\n height={5}\n className=\"fill-foreground\"\n />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n </TooltipPrimitive.Root>\n </TooltipPrimitive.Provider>\n )\n}\n\nexport { TooltipPrimitive as TooltipPrimitives }\nexport const TooltipProvider = TooltipPrimitive.Provider\n","import React, { useEffect, useState } from 'react'\nimport * as TabsPrimitive from '@radix-ui/react-tabs'\n\nexport interface TabItem {\n key: string\n title: React.ReactNode\n content: React.ReactNode\n}\n\nexport interface TabsProps {\n tabs?: TabItem[]\n onTabChange?: (prev: TabItem | undefined, next: TabItem | undefined) => void\n onTabClose?: (key: string) => void\n /** Only mount the active tab's content */\n isLazy?: boolean\n tabsClosable?: boolean\n defaultActiveTab?: string\n}\n\n/**\n * Scrollable pill-style tabs powered by Radix Tabs.\n *\n * Radix handles roving-tabindex keyboard navigation and ARIA roles.\n * Rounded pill style, fully themed via semantic design tokens.\n * Supports dynamic tab add/remove with automatic activation.\n *\n * @example\n * <Tabs\n * tabs={[\n * { key: 'v1', title: 'Vessel 1', content: <Panel1 /> },\n * { key: 'v2', title: 'Vessel 2', content: <Panel2 /> },\n * ]}\n * tabsClosable\n * onTabClose={(key) => removetab(key)}\n * />\n */\nexport default function Tabs({\n tabs = [],\n onTabChange,\n onTabClose,\n isLazy,\n tabsClosable = true,\n defaultActiveTab,\n}: TabsProps) {\n const [value, setValue] = useState<string>(() => defaultActiveTab ?? tabs[0]?.key ?? '')\n\n // Sync when external defaultActiveTab changes\n useEffect(() => {\n if (defaultActiveTab) setValue(defaultActiveTab)\n }, [defaultActiveTab])\n\n // When tabs are added / removed, keep a valid active tab\n useEffect(() => {\n if (tabs.length === 0) {\n setValue('')\n return\n }\n const exists = tabs.find((t) => t.key === value)\n if (!exists) {\n // Activate last tab (mimics original behaviour on close)\n setValue(tabs[tabs.length - 1].key)\n }\n }, [tabs, value])\n\n const handleValueChange = (newValue: string) => {\n const prev = tabs.find((t) => t.key === value)\n const next = tabs.find((t) => t.key === newValue)\n onTabChange?.(prev, next)\n setValue(newValue)\n }\n\n const toPreviousTab = () => {\n const idx = tabs.findIndex((t) => t.key === value)\n if (idx > 0) handleValueChange(tabs[idx - 1].key)\n }\n\n const toNextTab = () => {\n const idx = tabs.findIndex((t) => t.key === value)\n if (idx < tabs.length - 1) handleValueChange(tabs[idx + 1].key)\n }\n\n if (tabs.length === 0) return null\n\n return (\n <TabsPrimitive.Root\n value={value}\n onValueChange={handleValueChange}\n className=\"h-full max-w-full flex flex-col gap-2\"\n >\n {/* Tab strip */}\n <div className=\"bg-surface border border-border rounded-lg flex items-center justify-between flex-shrink-0 w-full p-1 overflow-hidden\">\n {/* Left chevron */}\n <button\n type=\"button\"\n onClick={toPreviousTab}\n aria-label=\"Previous tab\"\n className=\"cursor-pointer rounded-lg transition-colors duration-150 hover:bg-surface-raised text-foreground-secondary hover:text-foreground rotate-180 flex-shrink-0 focus:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} className=\"h-6 w-6\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 5l7 7-7 7\" />\n </svg>\n </button>\n\n {/* Pills list */}\n <TabsPrimitive.List\n aria-label=\"Tabs\"\n className=\"flex-1 flex items-center gap-1 overflow-x-auto overflow-y-hidden rounded-lg scroll-smooth snap-x snap-mandatory hidden-scrollbar\"\n >\n {tabs.map((tab) => (\n // Trigger + close button are SIBLINGS, not nested.\n // Nesting a clickable element inside <button> is invalid\n // HTML and breaks keyboard activation of the inner one.\n // The wrapper carries `group` so the close button can\n // react to the trigger's `data-state=active` for styling.\n <div\n key={tab.key}\n className=\"snap-start snap-always relative flex items-center flex-1 min-w-[120px] max-w-[220px] flex-shrink-0 group\"\n >\n <TabsPrimitive.Trigger\n value={tab.key}\n className={`w-full ${tabsClosable ? 'pr-8' : 'pr-3'} pl-3 py-2 rounded-3xl cursor-pointer transition-all duration-200 select-none h-10 text-left\n text-foreground-secondary bg-surface-raised\n hover:bg-surface hover:text-foreground\n data-[state=active]:bg-accent data-[state=active]:text-accent-foreground\n focus:outline-none focus-visible:ring-2 focus-visible:ring-accent`}\n >\n <span className=\"truncate text-sm block\">{tab.title}</span>\n </TabsPrimitive.Trigger>\n {tabsClosable && (\n <button\n type=\"button\"\n aria-label={`Close ${tab.title}`}\n onClick={(e) => {\n e.stopPropagation()\n onTabClose?.(tab.key)\n }}\n className=\"absolute right-1.5 top-1/2 -translate-y-1/2 rounded p-0.5 text-foreground-secondary group-data-[state=active]:text-accent-foreground hover:bg-black/10 transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 20 20\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M15 5L5 15M5 5l10 10\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n )}\n </div>\n ))}\n </TabsPrimitive.List>\n\n {/* Right chevron */}\n <button\n type=\"button\"\n onClick={toNextTab}\n aria-label=\"Next tab\"\n className=\"cursor-pointer rounded-lg transition-colors duration-150 hover:bg-surface-raised text-foreground-secondary hover:text-foreground flex-shrink-0 focus:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} className=\"h-6 w-6\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 5l7 7-7 7\" />\n </svg>\n </button>\n </div>\n\n {/* Content pane */}\n <div className=\"p-2 rounded-lg w-full flex-1 min-h-0 bg-surface border border-border overflow-hidden\">\n {isLazy ? (\n // Mount only the active content\n tabs\n .filter((t) => t.key === value)\n .map((t) => (\n <TabsPrimitive.Content key={t.key} value={t.key} className=\"w-full h-full focus:outline-none\">\n {t.content}\n </TabsPrimitive.Content>\n ))\n ) : (\n // Pre-mount all, hide non-active via Radix\n tabs.map((t) => (\n <TabsPrimitive.Content key={t.key} value={t.key} className=\"w-full h-full focus:outline-none\" forceMount>\n <div className={`w-full h-full ${t.key === value ? 'block' : 'hidden'}`}>\n {t.content}\n </div>\n </TabsPrimitive.Content>\n ))\n )}\n </div>\n </TabsPrimitive.Root>\n )\n}\n","import React from 'react'\nimport * as Accordion from '@radix-ui/react-accordion'\n\nexport interface TreeNode {\n key: string\n label: string\n nodeData?: any\n parentLabel?: string\n children?: TreeNode[]\n}\n\nexport interface TreeItemClickPayload {\n isParent: boolean\n key: string\n label: string\n data?: any\n parentLabel?: string\n}\n\nexport interface TreeProps {\n nodes: TreeNode[]\n onNodeClick: (payload: TreeItemClickPayload) => void\n defaultExpandAll?: boolean\n defaultExpandedKeys?: string[]\n}\n\n/** ─────────────────── helpers ─────────────────── */\nconst isParent = (item: TreeNode) =>\n Boolean(item.children && item.children.length > 0)\n\n/** ─────────────────── single node ─────────────────── */\ninterface NodeProps {\n item: TreeNode\n onNodeClick: TreeProps['onNodeClick']\n defaultExpandAll: boolean\n defaultExpandedKeys: string[]\n depth?: number\n}\n\nfunction TreeNodeItem({\n item,\n onNodeClick,\n defaultExpandAll,\n defaultExpandedKeys,\n depth = 0,\n}: NodeProps) {\n if (!isParent(item)) {\n return (\n <button\n type=\"button\"\n className=\"flex w-full items-center gap-2.5 cursor-pointer select-none group text-left rounded-md px-2 py-1.5 hover:bg-surface-raised transition-colors duration-150 focus:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n style={{ paddingLeft: depth * 12 + 8 }}\n onClick={() =>\n onNodeClick({\n isParent: false,\n key: item.key,\n label: item.label,\n data: item.nodeData,\n parentLabel: item.parentLabel,\n })\n }\n >\n {/* Leaf dot */}\n <span className=\"w-1.5 h-1.5 rounded-full flex-shrink-0 bg-foreground-muted group-hover:bg-accent transition-colors duration-150\" />\n <span className=\"text-sm text-foreground-secondary group-hover:text-foreground transition-colors duration-150\">\n {item.label}\n </span>\n </button>\n )\n }\n\n const initialOpen =\n defaultExpandAll || defaultExpandedKeys.includes(item.key)\n ? [item.key]\n : []\n\n return (\n <Accordion.Root\n type=\"multiple\"\n defaultValue={initialOpen}\n style={{ paddingLeft: depth * 12 }}\n >\n <Accordion.Item value={item.key} className=\"border-none\">\n {/* The Trigger handles BOTH expand/collapse (via Radix) and\n onNodeClick — clicking anywhere on the parent row fires\n both, consistently. Previously only the label fired\n onNodeClick while the chevron only toggled — asymmetric\n behaviour that confused consumers. */}\n <Accordion.Trigger\n onClick={() =>\n onNodeClick({\n isParent: true,\n key: item.key,\n label: item.label,\n data: item.nodeData,\n parentLabel: item.parentLabel,\n })\n }\n className=\"flex items-center gap-2 cursor-pointer py-1.5 px-2 group focus:outline-none focus-visible:ring-2 focus-visible:ring-accent w-full text-left rounded-md hover:bg-surface-raised transition-colors duration-150\"\n >\n {/* Chevron — rotates on open/close */}\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2.5}\n className=\"h-3.5 w-3.5 flex-shrink-0 text-foreground-muted transition-transform duration-200 group-data-[state=open]:rotate-0 group-data-[state=closed]:-rotate-90\"\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n <span className=\"text-sm font-semibold text-foreground select-none\">\n {item.label}\n </span>\n </Accordion.Trigger>\n\n <Accordion.Content className=\"overflow-hidden data-[state=open]:animate-accordion-down data-[state=closed]:animate-accordion-up\">\n <div className=\"ml-3.5 border-l border-border py-0.5\">\n {item.children!.map((child) => (\n <TreeNodeItem\n key={child.key}\n item={child}\n onNodeClick={onNodeClick}\n defaultExpandAll={defaultExpandAll}\n defaultExpandedKeys={defaultExpandedKeys}\n depth={depth + 1}\n />\n ))}\n </div>\n </Accordion.Content>\n </Accordion.Item>\n </Accordion.Root>\n )\n}\n\n/** ─────────────────── public component ─────────────────── */\n\n/**\n * Hierarchical tree view powered by Radix Accordion.\n *\n * Each parent node is an independent Accordion.Root with type=\"multiple\" so\n * sibling branches expand independently. Leaf nodes are plain buttons.\n * Expand/collapse is animated via CSS keyframes.\n *\n * @example\n * <Tree\n * nodes={fleetTree}\n * onNodeClick={({ key, isParent }) => selectNode(key)}\n * defaultExpandAll\n * />\n */\nexport default function Tree({\n nodes,\n onNodeClick,\n defaultExpandAll = false,\n defaultExpandedKeys = [],\n}: TreeProps) {\n return (\n <div className=\"p-1 w-full\">\n {nodes.map((item) => (\n <TreeNodeItem\n key={item.key}\n item={item}\n onNodeClick={onNodeClick}\n defaultExpandAll={defaultExpandAll}\n defaultExpandedKeys={defaultExpandedKeys}\n />\n ))}\n </div>\n )\n}\n","import React from 'react'\nimport * as ToggleGroup from '@radix-ui/react-toggle-group'\n\nexport interface ToggleItem {\n key: string\n label?: React.ReactNode\n icon?: React.ReactNode\n}\n\nexport interface ToggleButtonProps {\n items: ToggleItem[]\n onChange: (key: string) => void\n activeKey: string\n}\n\n/**\n * Segmented toggle-button group powered by Radix ToggleGroup.\n *\n * Radix handles keyboard navigation (arrow keys), focus ring, and\n * `role=\"group\"` / `aria-pressed` ARIA attributes.\n *\n * @example\n * <ToggleButton\n * items={[\n * { key: 'grid', icon: <Icon.Grid /> },\n * { key: 'list', icon: <Icon.List /> },\n * ]}\n * activeKey={view}\n * onChange={setView}\n * />\n */\nexport default function ToggleButton({ items, onChange, activeKey }: ToggleButtonProps) {\n return (\n <ToggleGroup.Root\n type=\"single\"\n value={activeKey}\n onValueChange={(val) => {\n // Radix passes '' when user clicks the already-selected item → keep current\n if (val) onChange(val)\n }}\n className=\"flex items-center\"\n >\n {items.map((item, index) => (\n <ToggleGroup.Item\n key={item.key}\n value={item.key}\n aria-label={typeof item.label === 'string' ? item.label : item.key}\n className={[\n // Semantic tokens handle both light and dark modes via\n // CSS vars — no `dark:` variants needed.\n index === 0 && 'rounded-l-lg border-r border-border',\n index === items.length - 1 && 'rounded-r-lg border-l border-border',\n 'p-2 cursor-pointer transition-colors duration-150 text-foreground-secondary',\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-accent',\n 'bg-surface hover:bg-surface-raised',\n 'data-[state=on]:bg-accent data-[state=on]:text-accent-fg',\n ]\n .filter(Boolean)\n .join(' ')}\n >\n {item.icon ?? item.label}\n </ToggleGroup.Item>\n ))}\n </ToggleGroup.Root>\n )\n}\n","import React, { createContext, useCallback, useContext, useEffect, useRef, useState } from 'react'\nimport { motion, AnimatePresence, useReducedMotion } from 'framer-motion'\nimport Portal from '../layout/Portal'\n\n/** ─────────────────── types ─────────────────── */\nexport type NotificationType = 'info' | 'success' | 'warning' | 'danger'\n\nexport type NotificationPosition =\n | 'top-right' | 'top-left' | 'top-center'\n | 'bottom-right' | 'bottom-left' | 'bottom-center'\n\nexport interface NotificationPayload {\n title: React.ReactNode\n description?: React.ReactNode\n /** Auto-dismiss duration in ms (default 4000). Pass `Infinity` to disable auto-dismiss. */\n duration?: number\n type?: NotificationType\n}\n\ninterface NotificationEntry extends NotificationPayload {\n id: number\n}\n\ninterface NotificationContextValue {\n open: (payload: NotificationPayload) => void\n close: (id: number) => void\n}\n\n/** ─────────────────── context ─────────────────── */\nconst NotificationContext = createContext<NotificationContextValue>({\n open: () => undefined,\n close: () => undefined,\n})\n\n/** ─────────────────── helpers ─────────────────── */\nconst TYPE_BG: Record<NotificationType, string> = {\n info: 'bg-status-info',\n success: 'bg-status-success',\n warning: 'bg-status-warning',\n danger: 'bg-status-error',\n}\n\n// Viewport positioning classes per position. The viewport is portaled to\n// `document.body`, so these `fixed` positions always resolve against the\n// real viewport.\nconst VIEWPORT_CLASSES: Record<NotificationPosition, string> = {\n 'top-right': 'fixed top-4 right-4 flex flex-col items-end',\n 'top-left': 'fixed top-4 left-4 flex flex-col items-start',\n 'top-center': 'fixed top-4 left-1/2 flex flex-col items-center -translate-x-1/2',\n 'bottom-right': 'fixed bottom-4 right-4 flex flex-col-reverse items-end',\n 'bottom-left': 'fixed bottom-4 left-4 flex flex-col-reverse items-start',\n 'bottom-center': 'fixed bottom-4 left-1/2 flex flex-col-reverse items-center -translate-x-1/2',\n}\n\n// Initial motion state per position: drop in from above for top-* and rise\n// from below for bottom-*. The y offset is large (±28px) so the trajectory\n// is clearly visible; opacity completes faster than the y/scale tween so\n// the card is already opaque while it still has travel left.\nfunction getInitialMotion(pos: NotificationPosition, reduced: boolean | null) {\n if (reduced) return { opacity: 0, y: 0, scale: 1 }\n const bottom = pos.startsWith('bottom')\n return { opacity: 0, y: bottom ? 28 : -28, scale: 0.92 }\n}\n\nfunction getExitMotion(pos: NotificationPosition, reduced: boolean | null) {\n if (reduced) return { opacity: 0, y: 0, scale: 1 }\n const bottom = pos.startsWith('bottom')\n return { opacity: 0, y: bottom ? 18 : -18, scale: 0.94 }\n}\n\nfunction TypeIcon({ type }: { type: NotificationType }) {\n if (type === 'success') {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n )\n }\n if (type === 'info') {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" /><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\" /><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\" />\n </svg>\n )\n }\n if (type === 'warning') {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M10.29 3.86L1.82 18a2 2 0 001.71 3h16.94a2 2 0 001.71-3L13.71 3.86a2 2 0 00-3.42 0z\" />\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\" /><line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\n </svg>\n )\n }\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" /><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\" /><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\" />\n </svg>\n )\n}\n\n/** ─────────────────── animated toast item ───────────────────\n *\n * Renders a single notification as a `motion.div` direct child of\n * `AnimatePresence` — no Radix Toast wrapping. The previous Radix-based\n * implementation entangled `Toast.Root`/`Toast.Viewport` lifecycles with\n * Framer Motion's exit detection in a way that suppressed enter/exit\n * animations in some configurations. A pure Framer + portal pattern is\n * simpler, more controllable, and visibly animates.\n *\n * Auto-dismiss uses a per-item `setTimeout` that pauses on hover/focus\n * and resumes on leave/blur. Tracks elapsed time so the remaining\n * duration is correct after a pause.\n */\nfunction NotificationItem({\n n,\n pos,\n onClose,\n reduced,\n}: {\n n: NotificationEntry\n pos: NotificationPosition\n onClose: (id: number) => void\n reduced: boolean | null\n}) {\n const [paused, setPaused] = useState(false)\n const duration = n.duration ?? 4000\n const isAutoDismissing = isFinite(duration) && duration > 0\n const showProgress = !reduced && isAutoDismissing\n\n // Timer management — careful with refs so React 18 strict-mode double\n // mount doesn't double-schedule the dismissal.\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n const startTimeRef = useRef<number>(0)\n const remainingRef = useRef<number>(duration)\n\n const clearTimer = useCallback(() => {\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current)\n timerRef.current = null\n }\n }, [])\n\n const scheduleDismiss = useCallback((ms: number) => {\n clearTimer()\n if (!isAutoDismissing) return\n startTimeRef.current = Date.now()\n timerRef.current = setTimeout(() => onClose(n.id), ms)\n }, [clearTimer, isAutoDismissing, n.id, onClose])\n\n // Start the timer on mount\n useEffect(() => {\n if (paused || !isAutoDismissing) return\n scheduleDismiss(remainingRef.current)\n return clearTimer\n }, [paused, isAutoDismissing, scheduleDismiss, clearTimer])\n\n // When the user hovers / focuses, capture how much time was left and\n // pause. On leave, resume with the remaining time.\n const onPauseStart = () => {\n if (!isAutoDismissing) return\n const elapsed = Date.now() - startTimeRef.current\n remainingRef.current = Math.max(0, remainingRef.current - elapsed)\n setPaused(true)\n }\n const onPauseEnd = () => {\n if (!isAutoDismissing) return\n setPaused(false)\n }\n\n return (\n <motion.div\n layout\n // pointer-events-auto re-enables clicks on the toast card itself;\n // the parent viewport is pointer-events-none so empty space doesn't\n // block interaction with the page underneath.\n className=\"pointer-events-auto\"\n initial={getInitialMotion(pos, reduced)}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={getExitMotion(pos, reduced)}\n transition={\n reduced\n ? { duration: 0 }\n : {\n // Opacity finishes in 0.15 s; y/scale take 0.34 s.\n // Card is opaque while still travelling — movement\n // is clearly visible to the user.\n opacity: { duration: 0.15 },\n y: { type: 'tween', duration: 0.34, ease: [0.16, 1, 0.3, 1] },\n scale: { type: 'tween', duration: 0.34, ease: [0.16, 1, 0.3, 1] },\n layout: { duration: 0.22, ease: [0.16, 1, 0.3, 1] },\n }\n }\n onMouseEnter={onPauseStart}\n onMouseLeave={onPauseEnd}\n onFocus={onPauseStart}\n onBlur={onPauseEnd}\n role={n.type === 'danger' || n.type === 'warning' ? 'alert' : 'status'}\n aria-live={n.type === 'danger' || n.type === 'warning' ? 'assertive' : 'polite'}\n >\n <div\n className={[\n 'w-[300px] rounded-md shadow-lg overflow-hidden focus:outline-none',\n TYPE_BG[n.type ?? 'info'],\n ].join(' ')}\n >\n {/* Content row */}\n <div className=\"flex items-start gap-3 p-3 pr-2.5\">\n <span className=\"mt-0.5 flex-shrink-0 text-white/90\">\n <TypeIcon type={n.type ?? 'info'} />\n </span>\n\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-sm font-semibold text-white leading-snug\">\n {n.title}\n </div>\n {n.description && (\n <div className=\"mt-0.5 text-xs text-white/75 leading-relaxed\">\n {n.description}\n </div>\n )}\n </div>\n\n <button\n type=\"button\"\n aria-label=\"Close notification\"\n onClick={() => onClose(n.id)}\n className=\"flex-shrink-0 mt-0.5 rounded p-1 text-white/60 hover:text-white hover:bg-white/15 transition-colors duration-100 focus:outline-none focus-visible:ring-1 focus-visible:ring-white/50\"\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M9 3L3 9M3 3l6 6\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n </button>\n </div>\n\n {/* Countdown progress bar — `notification-progress` keyframe\n drives a scaleX 1→0. animationPlayState pauses with our\n hover/focus state so the visual matches the actual timer. */}\n {showProgress && (\n <div className=\"relative h-[3px] bg-white/20 overflow-hidden\">\n <div\n className=\"absolute inset-0 bg-white/60 [transform-origin:left]\"\n style={{\n animation: `notification-progress ${duration}ms linear forwards`,\n animationPlayState: paused ? 'paused' : 'running',\n }}\n />\n </div>\n )}\n </div>\n </motion.div>\n )\n}\n\n/** ─────────────────── provider ─────────────────── */\n\n/**\n * Wrap your app in `NotificationProvider`, then call `useNotification()`\n * anywhere inside to show toast notifications.\n *\n * @param position One of 6 viewport positions (default `'top-right'`).\n *\n * @example\n * <NotificationProvider position=\"bottom-right\">\n * <App />\n * </NotificationProvider>\n *\n * // anywhere inside:\n * const { success, danger } = useNotification()\n * success({ title: 'Saved', description: 'Changes were stored.' })\n */\nexport function NotificationProvider({\n children,\n position = 'top-right',\n}: {\n children: React.ReactNode\n position?: NotificationPosition\n}) {\n const [notifications, setNotifications] = useState<NotificationEntry[]>([])\n const reduced = useReducedMotion()\n\n const open = useCallback((payload: NotificationPayload) => {\n setNotifications((prev) => [\n ...prev,\n { duration: 4000, ...payload, id: Date.now() + Math.random() },\n ])\n }, [])\n\n const close = useCallback((id: number) => {\n setNotifications((prev) => prev.filter((n) => n.id !== id))\n }, [])\n\n return (\n <NotificationContext.Provider value={{ open, close }}>\n {children}\n\n {/* Portaled into <body> so `position: fixed` resolves against the\n real viewport — see Portal.tsx for the why. */}\n <Portal>\n <ul\n role=\"region\"\n aria-label=\"Notifications\"\n className={[\n VIEWPORT_CLASSES[position],\n 'z-[500000] gap-2 w-[316px] outline-none pointer-events-none m-0 p-0 list-none',\n ].join(' ')}\n >\n <AnimatePresence initial={false}>\n {notifications.map((n) => (\n <NotificationItem\n key={n.id}\n n={n}\n pos={position}\n onClose={close}\n reduced={reduced}\n />\n ))}\n </AnimatePresence>\n </ul>\n </Portal>\n </NotificationContext.Provider>\n )\n}\n\n/** ─────────────────── hook ─────────────────── */\n\n/**\n * Returns four type-specific show functions.\n *\n * @example\n * const { info, success, warning, danger } = useNotification()\n * danger({ title: 'Save failed', description: 'Could not reach the server.' })\n */\nexport function useNotification() {\n const { open } = useContext(NotificationContext)\n return {\n info: (props: Omit<NotificationPayload, 'type'>) => open({ type: 'info', ...props }),\n success: (props: Omit<NotificationPayload, 'type'>) => open({ type: 'success', ...props }),\n warning: (props: Omit<NotificationPayload, 'type'>) => open({ type: 'warning', ...props }),\n danger: (props: Omit<NotificationPayload, 'type'>) => open({ type: 'danger', ...props }),\n }\n}\n","import React from 'react'\nimport { motion, useReducedMotion, type Variants } from 'framer-motion'\nimport Portal from '../layout/Portal'\n\nexport type LoadingSpinnerSize = 'xs' | 'sm' | 'md' | 'lg'\n\nexport interface LoadingSpinnerProps {\n /**\n * Text revealed letter-by-letter beneath the spinner. Optional — pass\n * `undefined` for a pure spinner with no caption (e.g. inline mode).\n */\n prompt?: string\n /** Spinner size variant. Defaults to `'md'`. */\n size?: LoadingSpinnerSize\n /**\n * When `true`, renders inline at the call site (no portal, no fullscreen\n * overlay, no backdrop). Useful inside cards, table rows, drawers, or\n * empty-state slots. Defaults to `false` (fullscreen overlay).\n */\n inline?: boolean\n /**\n * Optional override for the spinner ring colour. Accepts any CSS colour.\n * Defaults to the `--color-accent` token so it picks up theme overrides.\n */\n spinnerColor?: string\n /**\n * Optional override for the prompt text colour.\n * Defaults to the `--color-foreground` token (light/dark aware).\n */\n textColor?: string\n /**\n * Backdrop opacity (0 – 1) for the fullscreen overlay. Defaults to 0.8 —\n * close enough to opaque to block UI underneath while still hinting at the\n * previous state. Ignored when `inline` is true.\n */\n backdropOpacity?: number\n}\n\n// ── Size → dimensions table ─────────────────────────────────────────────────\n// Outer ring, inner ring, centre dot, ring stroke width, text size.\nconst SIZE_MAP = {\n // xs is sized to fit beside button text (~14px) — async AutoComplete,\n // Button loading prop, inline status badges, etc.\n xs: { outer: 'w-3.5 h-3.5', inner: 'w-1.5 h-1.5', dot: 'w-0.5 h-0.5', stroke: 'border-[1.5px]', text: 'text-[10px]' },\n sm: { outer: 'w-8 h-8', inner: 'w-4 h-4', dot: 'w-1 h-1', stroke: 'border-2', text: 'text-xs' },\n md: { outer: 'w-20 h-20', inner: 'w-12 h-12', dot: 'w-2 h-2', stroke: 'border-[3px]', text: 'text-2xl' },\n lg: { outer: 'w-32 h-32', inner: 'w-20 h-20', dot: 'w-3 h-3', stroke: 'border-4', text: 'text-4xl' },\n} as const satisfies Record<LoadingSpinnerSize, {\n outer: string; inner: string; dot: string; stroke: string; text: string\n}>\n\n// ── Letter-stagger variants ─────────────────────────────────────────────────\n// 60 ms stagger, 250 ms fade + lift per glyph. With `useReducedMotion` the\n// container falls back to instant reveal — the prompt stays visible.\nconst containerVariants: Variants = {\n hidden: {},\n visible: { transition: { staggerChildren: 0.05 } },\n}\n\nconst letterVariants: Variants = {\n hidden: { opacity: 0, y: 4 },\n visible: { opacity: 1, y: 0, transition: { duration: 0.22, ease: 'easeOut' } },\n}\n\n// ── Spinner core (rings + dot) ──────────────────────────────────────────────\n// Two concentric arcs rotating at different speeds in opposite directions,\n// with a centred breathing dot. Each ring uses two opposing border edges so\n// the rotation reads as a 180° arc traversal — sharper than a full ring.\n// All three elements rotate around the same centre via `relative + absolute`.\nfunction SpinnerCore({ size, color }: { size: LoadingSpinnerSize; color?: string }) {\n const dims = SIZE_MAP[size]\n const ringColor = color ?? 'var(--color-accent)'\n return (\n <div className=\"relative flex items-center justify-center\" style={{ color: ringColor }}>\n {/* Outer arc — slower clockwise */}\n <div\n className={`${dims.outer} ${dims.stroke} rounded-full border-transparent border-t-current border-r-current animate-spin`}\n style={{ animationDuration: '1.4s' }}\n aria-hidden=\"true\"\n />\n {/* Inner arc — faster counter-clockwise, lower opacity for layering */}\n <div\n className={`absolute ${dims.inner} ${dims.stroke} rounded-full border-transparent border-b-current border-l-current animate-spin opacity-60`}\n style={{ animationDuration: '0.9s', animationDirection: 'reverse' }}\n aria-hidden=\"true\"\n />\n {/* Centre dot — breathing pulse */}\n <div\n className={`absolute ${dims.dot} rounded-full bg-current animate-breathe`}\n aria-hidden=\"true\"\n />\n </div>\n )\n}\n\n/**\n * Enterprise-grade loading indicator.\n *\n * Two concentric arcs counter-rotating around a breathing centre dot, with\n * an optional staggered letter reveal beneath. Portaled to `document.body`\n * for the fullscreen overlay so it always covers the actual viewport\n * regardless of where it sits in the React tree.\n *\n * **Two modes:**\n * - **Fullscreen overlay** (default): semi-opaque backdrop with\n * `backdrop-blur-sm` for a modern depth effect. Use during page-level\n * loading, route transitions, or critical mutations.\n * - **Inline** (`inline`): just the spinner + optional caption rendered at\n * the call site. Use inside cards, table rows, drawers, empty states,\n * or anywhere a smaller loading affordance is appropriate.\n *\n * **Accessibility**: `role=\"status\"` + `aria-label`/`aria-live` make the\n * indicator announce-able to screen readers. `prefers-reduced-motion`\n * collapses the letter stagger to instant reveal — the spinner rings keep\n * rotating since a continuous spinner is informative, not decorative.\n *\n * @example Fullscreen overlay (page load)\n * ```tsx\n * {isLoading && <LoadingSpinner prompt=\"Loading vessels…\" />}\n * ```\n *\n * @example Inline (inside a card)\n * ```tsx\n * <Card>\n * {data ? <Chart data={data} /> : <LoadingSpinner inline size=\"sm\" />}\n * </Card>\n * ```\n *\n * @example Themed overlay\n * ```tsx\n * <LoadingSpinner\n * prompt=\"Saving\"\n * size=\"lg\"\n * spinnerColor=\"#10b981\"\n * backdropOpacity={0.7}\n * />\n * ```\n */\nexport default function LoadingSpinner({\n prompt,\n size = 'md',\n inline = false,\n spinnerColor,\n textColor,\n backdropOpacity = 0.8,\n}: LoadingSpinnerProps) {\n const reduced = useReducedMotion()\n const letters = prompt ? Array.from(prompt) : []\n const dims = SIZE_MAP[size]\n\n const content = (\n <>\n <SpinnerCore size={size} color={spinnerColor} />\n\n {letters.length > 0 && (\n <motion.div\n className={`${dims.text} font-semibold tracking-tight select-none`}\n style={{ color: textColor ?? 'var(--color-foreground)' }}\n variants={containerVariants}\n initial={reduced ? 'visible' : 'hidden'}\n animate=\"visible\"\n aria-hidden=\"true\"\n >\n {letters.map((letter, index) => (\n <motion.span\n key={index}\n className=\"inline-block whitespace-pre\"\n variants={letterVariants}\n >\n {letter}\n </motion.span>\n ))}\n </motion.div>\n )}\n </>\n )\n\n // ── Inline mode ─────────────────────────────────────────────────────────\n if (inline) {\n return (\n <div\n role=\"status\"\n aria-live=\"polite\"\n aria-label={prompt ?? 'Loading'}\n className=\"flex flex-col items-center justify-center gap-3\"\n >\n {content}\n </div>\n )\n }\n\n // ── Fullscreen overlay ──────────────────────────────────────────────────\n return (\n <Portal>\n <div\n role=\"status\"\n aria-live=\"polite\"\n aria-label={prompt ?? 'Loading'}\n className=\"fixed inset-0 z-[8000000] flex flex-col items-center justify-center gap-6 bg-background backdrop-blur-sm\"\n style={{ opacity: backdropOpacity }}\n >\n {content}\n </div>\n </Portal>\n )\n}\n","import React, { useEffect, useRef, useState } from 'react'\n\nexport interface FadingBaseProps {\n className?: string\n /** Controls mount/unmount with fade transition */\n isMounted?: boolean\n children?: React.ReactNode\n}\n\n/**\n * Fade-in / fade-out page container.\n *\n * Replaces `react-transition-group` with a pure CSS opacity transition.\n * The component mounts on `isMounted=true` and unmounts after the 300ms\n * fade-out completes on `isMounted=false`.\n *\n * Uses CSS `dark:` class for the glass effect — no ThemeContext dependency.\n *\n * @example\n * <FadingBase isMounted={isPageVisible}>\n * <PageContent />\n * </FadingBase>\n */\nexport default function FadingBase({\n className = '',\n isMounted = false,\n children,\n}: FadingBaseProps) {\n const [shouldRender, setShouldRender] = useState(isMounted)\n const [visible, setVisible] = useState(false)\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n useEffect(() => {\n if (isMounted) {\n setShouldRender(true)\n // rAF gives the DOM time to paint before triggering the transition\n const rafId = requestAnimationFrame(() => setVisible(true))\n return () => cancelAnimationFrame(rafId)\n } else {\n setVisible(false)\n timerRef.current = setTimeout(() => setShouldRender(false), 300)\n return () => {\n if (timerRef.current) clearTimeout(timerRef.current)\n }\n }\n }, [isMounted])\n\n if (!shouldRender) return null\n\n return (\n // `calculated-height` and `dark:glassmorphism` were orphaned CSS classes\n // (never defined anywhere). Replaced with semantic `min-h-full` +\n // `bg-surface` which works in both light and dark modes via the\n // ThemeProvider's CSS vars.\n <div\n className={`w-full min-h-full pl-2 pr-2 pb-2 transition-opacity duration-300 ${visible ? 'opacity-100' : 'opacity-0'}`}\n >\n <div className={`bg-surface w-full h-full rounded-lg p-2 ${className}`}>\n {children}\n </div>\n </div>\n )\n}\n","import React from 'react'\n\nexport interface ListItem {\n /** Stable key for React reconciliation + active-key matching. */\n key: string | number\n /** Main item text (title). Required. */\n label: React.ReactNode\n /** Optional description rendered below the label, in foreground-secondary. */\n description?: React.ReactNode\n /**\n * Optional leading slot, typically an Avatar. Anything React-renderable\n * is accepted (icon, image, status badge…).\n */\n avatar?: React.ReactNode\n /** Optional trailing slot, e.g. a badge, count, or action icon. */\n trailing?: React.ReactNode\n /** Disable interaction for this item only. */\n disabled?: boolean\n}\n\nexport interface ListProps {\n items: ListItem[]\n onItemClick: (item: ListItem) => void\n activeKey?: string | number\n /**\n * Visual density. `'compact'` for dense reference lists,\n * `'comfortable'` (default) for typical UI, `'spacious'` for hero rows.\n */\n density?: 'compact' | 'comfortable' | 'spacious'\n}\n\nconst DENSITY_PADDING: Record<NonNullable<ListProps['density']>, string> = {\n 'compact': 'py-1.5 px-2',\n 'comfortable': 'py-2.5 px-3',\n 'spacious': 'py-3.5 px-4',\n}\n\n/**\n * Vertical clickable list with optional avatar / description / trailing\n * slots per item. Built on `role=\"listbox\"` + `role=\"option\"` so screen\n * readers announce it as a selectable list. Keyboard activation works on\n * Enter and Space.\n *\n * **When to use this** over a Table:\n * - When the dataset is a simple sequence of records that the user\n * browses + picks one of (sidebar nav, contact list, vessel chooser).\n * - When each row's primary signal is a 1–2-line summary, not a tabular\n * breakdown.\n *\n * Use Table when comparing rows across multiple columns matters more than\n * picking one.\n *\n * @example Plain\n * ```tsx\n * <List\n * items={[{ key: 1, label: 'Aurora' }, { key: 2, label: 'Beacon' }]}\n * activeKey={2}\n * onItemClick={(it) => setSelected(it.key)}\n * />\n * ```\n *\n * @example With avatars + descriptions\n * ```tsx\n * <List\n * items={crew.map((c) => ({\n * key: c.id,\n * label: c.name,\n * description: c.rank,\n * avatar: <Avatar src={c.photo} alt={c.name} status={c.status} />,\n * trailing: <Badge count={c.unread} />,\n * }))}\n * onItemClick={(it) => navigate(`/crew/${it.key}`)}\n * />\n * ```\n */\nexport default function List({\n items,\n onItemClick,\n activeKey,\n density = 'comfortable',\n}: ListProps) {\n return (\n <div role=\"listbox\" className=\"flex flex-col\">\n {items.map((item) => {\n const isActive = activeKey === item.key\n const isDisabled = !!item.disabled\n return (\n <div\n key={item.key}\n role=\"option\"\n aria-selected={isActive}\n aria-disabled={isDisabled || undefined}\n tabIndex={isDisabled ? -1 : 0}\n onClick={() => !isDisabled && onItemClick(item)}\n onKeyDown={(e) => {\n if (isDisabled) return\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n onItemClick(item)\n }\n }}\n className={[\n 'flex items-center gap-3 cursor-pointer border-b border-border transition-colors duration-150',\n DENSITY_PADDING[density],\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-inset',\n isDisabled\n ? 'opacity-50 cursor-not-allowed'\n : isActive\n ? 'bg-surface-raised text-foreground'\n : 'text-foreground-secondary hover:bg-surface-raised hover:text-foreground',\n ].join(' ')}\n >\n {item.avatar && (\n <span className=\"flex-shrink-0\">{item.avatar}</span>\n )}\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-sm font-medium text-foreground truncate\">\n {item.label}\n </div>\n {item.description && (\n <div className=\"text-xs text-foreground-secondary mt-0.5 truncate\">\n {item.description}\n </div>\n )}\n </div>\n {item.trailing && (\n <span className=\"flex-shrink-0 text-foreground-muted\">{item.trailing}</span>\n )}\n </div>\n )\n })}\n </div>\n )\n}\n","import React, { useRef, useState } from 'react'\nimport { motion, useReducedMotion } from 'framer-motion'\nimport Tooltip from './Tooltip'\n\nexport interface ScalableContainerProps {\n /** Resting width. Any CSS length / percent. Default `'100%'`. */\n width?: React.CSSProperties['width']\n /** Resting height. Any CSS length / percent. Default `'auto'`. */\n height?: React.CSSProperties['height']\n /** Content to render inside. */\n children?: React.ReactNode\n /** CSS class appended to the expanded children wrapper. */\n assignClassOnClick?: string\n /** Override the expand-button icon. */\n expandIcon?: React.ReactNode\n /** Override the collapse-button icon. */\n collapseIcon?: React.ReactNode\n /**\n * Position of the toggle button inside the container.\n * Default `'top-right'` — matches the OS-window convention.\n */\n togglePosition?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right'\n}\n\nconst TOGGLE_POSITION_CLASS: Record<NonNullable<ScalableContainerProps['togglePosition']>, string> = {\n 'top-left': 'top-2 left-2',\n 'top-right': 'top-2 right-2',\n 'bottom-left': 'bottom-2 left-2',\n 'bottom-right': 'bottom-2 right-2',\n}\n\n/**\n * Container that smoothly expands to fill its parent on click and\n * collapses back to its resting size. Reads like a macOS / Windows\n * window resizing — subtle elevation shift, smooth scale, no flash\n * of colour or harsh background change.\n *\n * **What's different from the previous version**\n * - Animates BOTH width and height (was width-only).\n * - No baked-in background — the container is transparent by default,\n * so it overlays whatever surface the consumer puts behind it.\n * - Shadow lifts on expand (`shadow-md` → `shadow-2xl`) like a window\n * being raised. No colour change.\n * - The toggle button is a plain rounded chip with the chevron icon,\n * not the old `IconButton` with the heavy background. Floats over\n * the content via absolute positioning so it doesn't push layout.\n * - Configurable toggle position (default top-right, matching OS\n * close-button convention).\n *\n * @example\n * ```tsx\n * <ScalableContainer width={480} height={300}>\n * <Chart data={metrics} />\n * </ScalableContainer>\n * ```\n */\nexport default function ScalableContainer({\n width = '100%',\n height = 'auto',\n children,\n assignClassOnClick,\n expandIcon,\n collapseIcon,\n togglePosition = 'top-right',\n}: ScalableContainerProps) {\n const containerRef = useRef<HTMLDivElement>(null)\n const [isScaled, setScaled] = useState(false)\n const reduced = useReducedMotion()\n\n const onToggle = () => {\n const next = !isScaled\n setScaled(next)\n // Scroll the container into view after the resize starts so the\n // newly-expanded content is fully visible.\n requestAnimationFrame(() => containerRef.current?.scrollIntoView({ behavior: 'smooth', block: 'nearest' }))\n }\n\n const wrapperClass = isScaled ? assignClassOnClick : undefined\n\n return (\n <motion.div\n ref={containerRef}\n layout\n animate={{\n width: isScaled ? '100%' : width,\n height: isScaled ? '100%' : height,\n }}\n transition={\n reduced\n ? { duration: 0 }\n : {\n width: { type: 'tween', duration: 0.32, ease: [0.16, 1, 0.3, 1] },\n height: { type: 'tween', duration: 0.32, ease: [0.16, 1, 0.3, 1] },\n layout: { duration: 0.32, ease: [0.16, 1, 0.3, 1] },\n }\n }\n className={[\n 'relative rounded-lg overflow-hidden',\n // OS-window aesthetic: subtle elevation at rest, lifted shadow\n // when expanded. No background colour change.\n isScaled ? 'shadow-2xl' : 'shadow-md',\n 'transition-shadow duration-300',\n ].join(' ')}\n >\n {/* Toggle button — floats over content, no background flash. */}\n <Tooltip placement=\"bottom\" title={isScaled ? 'Collapse' : 'Expand'}>\n <button\n type=\"button\"\n onClick={onToggle}\n aria-label={isScaled ? 'Collapse container' : 'Expand container'}\n aria-expanded={isScaled}\n className={[\n 'absolute z-10',\n TOGGLE_POSITION_CLASS[togglePosition],\n 'w-7 h-7 inline-flex items-center justify-center',\n 'rounded-md bg-surface/80 backdrop-blur-sm border border-border',\n 'text-foreground-secondary hover:text-foreground hover:bg-surface',\n 'shadow-sm transition-colors duration-150',\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-accent',\n ].join(' ')}\n >\n {isScaled\n ? collapseIcon ?? <CollapseIcon />\n : expandIcon ?? <ExpandIcon />}\n </button>\n </Tooltip>\n\n <div className={wrapperClass}>{children}</div>\n </motion.div>\n )\n}\n\n/** Arrows-pointing-in (collapse). */\nfunction CollapseIcon() {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} className=\"w-4 h-4\" aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 9L4 4M9 9V4M9 9H4M15 9L20 4M15 9V4M15 9H20M9 15L4 20M9 15V20M9 15H4M15 15L20 20M15 15V20M15 15H20\" />\n </svg>\n )\n}\n\n/** Arrows-pointing-out (expand). */\nfunction ExpandIcon() {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} className=\"w-4 h-4\" aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M4 8V4h4M20 8V4h-4M4 16v4h4M20 16v4h-4\" />\n </svg>\n )\n}\n","import React from 'react'\nimport Button from '../inputs/Button'\n\nexport interface GridCardItem {\n key: string | number\n title: React.ReactNode\n description?: React.ReactNode\n /** Image URL or JSX element */\n cover?: string | React.ReactNode\n enabled?: boolean\n /** Arbitrary route or payload — passed back to onOpen */\n to?: string\n [key: string]: any\n}\n\nexport interface GridCardProps {\n item: GridCardItem\n buttonText?: string\n /** Called when the button is clicked. Receives the full item. */\n onOpen?: (item: GridCardItem) => void\n}\n\n/**\n * Application card tile (grid layout).\n *\n * Decoupled from React Router — navigation is delegated to the `onOpen` prop.\n *\n * @example\n * <GridCard\n * item={{ key: 'reports', title: 'Reports', enabled: true, to: '/reports' }}\n * onOpen={({ to }) => navigate(to!)}\n * />\n */\nexport default function GridCard({ item, buttonText = 'Open Application', onOpen }: GridCardProps) {\n return (\n <div className=\"flex flex-col w-[200px] h-[250px] rounded-lg bg-ice dark:bg-independence items-center justify-between p-2 shadow-2xl\">\n <div className=\"text-prussian-blue dark:text-white text-lg font-bold text-center h-1/4\">\n <h2>{item.title}</h2>\n </div>\n <div className=\"h-1/4 flex items-center justify-center\">\n {typeof item.cover === 'string' ? (\n <img src={item.cover} alt=\"Grid Card Cover\" />\n ) : (\n item.cover\n )}\n </div>\n <div className=\"text-prussian-blue text-sm dark:text-white text-center h-1/4\">\n <p>{item.description}</p>\n </div>\n <div>\n <Button\n disabled={!item.enabled}\n style={{ width: 'max-content', padding: '0 8px', margin: '0' }}\n content={buttonText}\n onClick={() => onOpen?.(item)}\n />\n </div>\n </div>\n )\n}\n","import React from 'react'\nimport Button from '../inputs/Button'\nimport { GridCardItem } from './GridCard'\n\nexport interface OpaqueGridCardProps {\n item: GridCardItem\n isRight?: boolean\n buttonText?: string\n onOpen?: (item: GridCardItem) => void\n}\n\n/**\n * Opaque carousel variant of GridCard (left or right edge of the carousel).\n *\n * Decoupled from React Router and ThemeContext.\n * Uses CSS `dark:` classes instead of `useTheme()`.\n *\n * @example\n * <OpaqueGridCard item={sideItem} isRight onOpen={({ to }) => navigate(to!)} />\n */\nexport default function OpaqueGridCard({\n item,\n isRight = false,\n buttonText = 'Open Application',\n onOpen,\n}: OpaqueGridCardProps) {\n return (\n <div\n className={`flex flex-col w-[200px] h-[250px] rounded-lg items-center p-2 ${\n !isRight\n ? 'opaque-carousel-card-left dark:opaque-carousel-card-dark-left'\n : 'opaque-carousel-card-right dark:opaque-carousel-card-dark-right'\n }`}\n >\n <div\n className={`${\n !isRight\n ? 'opaque-carousel-card-text-right dark:opaque-carousel-card-text-dark-right'\n : 'opaque-carousel-card-text-left dark:opaque-carousel-card-text-dark-left'\n } text-prussian-blue dark:text-white text-lg font-bold text-center h-1/4 select-none`}\n >\n <h2>{item.title}</h2>\n </div>\n <div className=\"h-1/4 flex items-center justify-center\">\n {typeof item.cover === 'string' ? (\n <img src={item.cover} alt=\"Grid Card Cover\" />\n ) : (\n item.cover\n )}\n </div>\n <div\n className={`${\n !isRight\n ? 'opaque-carousel-card-text-right dark:opaque-carousel-card-text-dark-right'\n : 'opaque-carousel-card-text-left dark:opaque-carousel-card-text-dark-left'\n } text-prussian-blue dark:text-white text-center h-1/4 select-none text-sm`}\n >\n <p>{item.description}</p>\n </div>\n <div>\n <Button\n style={{\n width: 'max-content',\n padding: '0 8px',\n margin: '0',\n background: !isRight\n ? 'linear-gradient(90deg, #0353A4 6.29%, rgba(3, 83, 164, 0) 97.35%)'\n : 'linear-gradient(270deg, #0353A4 3.97%, rgba(3, 83, 164, 0) 94.04%)',\n pointerEvents: 'none',\n userSelect: 'none',\n }}\n content={\n <div\n className={\n !isRight\n ? 'opaque-carousel-card-text-dark-right'\n : 'opaque-carousel-card-text-dark-left'\n }\n >\n {buttonText}\n </div>\n }\n onClick={() => onOpen?.(item)}\n />\n </div>\n </div>\n )\n}\n","import React from 'react'\nimport GridCard, { GridCardItem } from './GridCard'\n\nexport interface CatalogGridProps {\n items: GridCardItem[]\n buttonText?: string\n onOpen?: (item: GridCardItem) => void\n}\n\n/**\n * Wrapping flex grid of `GridCard` tiles.\n */\nexport default function CatalogGrid({ items, buttonText, onOpen }: CatalogGridProps) {\n return (\n <div className=\"flex flex-wrap gap-2\">\n {items.map((item) => (\n <GridCard key={item.key} item={item} buttonText={buttonText} onOpen={onOpen} />\n ))}\n </div>\n )\n}\n","import React, { useEffect, useMemo, useRef, useState } from 'react'\nimport GridCard, { GridCardItem } from './GridCard'\nimport OpaqueGridCard from './OpaqueGridCard'\nimport COLORS from '../../utils/colors'\n\nexport interface CatalogCarouselProps {\n items: GridCardItem[]\n buttonText?: string\n onOpen?: (item: GridCardItem) => void\n}\n\n/**\n * Three-card carousel (previous → active (scaled) → next).\n *\n * Decoupled from ThemeContext — uses CSS `dark:` classes.\n */\nexport default function CatalogCarousel({ items, buttonText, onOpen }: CatalogCarouselProps) {\n const [activeIndex, setActiveIndex] = useState(0)\n const [indexPool, setIndexPool] = useState<number[]>([])\n const cardRefs = useRef<{ cardIndex: number; ref: HTMLDivElement }[]>([])\n\n const getIndexes = useMemo(() => {\n let nextIndex = activeIndex + 1\n let previousIndex = activeIndex - 1\n if (activeIndex === 0) previousIndex = items.length - 1\n if (activeIndex === items.length - 1) nextIndex = 0\n return { previousIndex, nextIndex }\n }, [activeIndex, items.length])\n\n useEffect(() => {\n const { nextIndex, previousIndex } = getIndexes\n let indexes = [previousIndex, activeIndex, nextIndex]\n if (activeIndex !== 0 && activeIndex !== items.length - 1) {\n indexes = [...indexes].sort((a, b) => a - b)\n }\n setIndexPool(indexes)\n\n const timeouts: ReturnType<typeof setTimeout>[] = []\n cardRefs.current.forEach(({ cardIndex, ref }) => {\n if (cardIndex !== 1) {\n ref.classList.remove('animate-in')\n const t = setTimeout(() => ref.classList.add('animate-in'), 50)\n timeouts.push(t)\n }\n if (cardIndex === 1) {\n ref.classList.remove('scale-125')\n const t2 = setTimeout(() => {\n if (cardIndex === 1) ref.classList.add('scale-125')\n }, 100)\n timeouts.push(t2)\n }\n })\n return () => timeouts.forEach(clearTimeout)\n }, [activeIndex, getIndexes, items.length])\n\n const nextApp = () =>\n setActiveIndex((prev) => (prev + 1 === items.length ? 0 : prev + 1))\n\n const previousApp = () =>\n setActiveIndex((prev) => (prev - 1 === -1 ? items.length - 1 : prev - 1))\n\n return (\n <div className=\"flex items-center justify-center w-full h-full\">\n <div className=\"flex items-center gap-10\">\n <button\n type=\"button\"\n onClick={previousApp}\n aria-label=\"Previous\"\n className=\"cursor-pointer rounded-lg transition-all duration-300 hover:bg-ice-dark dark:hover:bg-independence rotate-180\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke={COLORS.PALETTE['prussian-blue']} strokeWidth={2} className=\"h-10 w-10 dark:stroke-white\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 5l7 7-7 7\" />\n </svg>\n </button>\n\n <div className=\"flex\">\n {indexPool.map((index, id) => {\n const item = items[index]\n if (!item) return null\n return id === 1 ? (\n <div\n key={id}\n ref={(ref) => {\n if (cardRefs.current.length < 3 && ref)\n cardRefs.current.push({ cardIndex: id, ref })\n }}\n className=\"transition-all duration-300 scale-125 z-10 shadow-2xl rounded-lg\"\n >\n <GridCard item={item} buttonText={buttonText} onOpen={onOpen} />\n </div>\n ) : (\n <div\n key={id}\n ref={(ref) => {\n if (cardRefs.current.length < 3 && ref)\n cardRefs.current.push({ cardIndex: id, ref })\n }}\n className=\"transition-all duration-300 shadow-2xl rounded-lg\"\n >\n <OpaqueGridCard item={item} isRight={id === 2} buttonText={buttonText} onOpen={onOpen} />\n </div>\n )\n })}\n </div>\n\n <button\n type=\"button\"\n onClick={nextApp}\n aria-label=\"Next\"\n className=\"cursor-pointer rounded-lg transition-all duration-300 hover:bg-ice-dark dark:hover:bg-independence\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke={COLORS.PALETTE['prussian-blue']} strokeWidth={2} className=\"h-10 w-10 dark:stroke-white\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 5l7 7-7 7\" />\n </svg>\n </button>\n </div>\n </div>\n )\n}\n","import React from 'react'\nimport CatalogGrid from './CatalogGrid'\nimport CatalogCarousel from './CatalogCarousel'\nimport { GridCardItem } from './GridCard'\n\nexport interface CatalogProps {\n /** 'grid' | 'carousel' */\n display?: 'grid' | 'carousel'\n items?: GridCardItem[]\n buttonText?: string\n onOpen?: (item: GridCardItem) => void\n}\n\n/**\n * Switches between grid and carousel layouts for a list of application tiles.\n *\n * @example\n * <Catalog display=\"carousel\" items={apps} onOpen={({ to }) => navigate(to!)} />\n */\nexport default function Catalog({ display = 'grid', items = [], buttonText, onOpen }: CatalogProps) {\n return (\n <div className=\"w-full h-full\">\n {display === 'grid' ? (\n <CatalogGrid items={items} buttonText={buttonText} onOpen={onOpen} />\n ) : (\n <CatalogCarousel items={items} buttonText={buttonText} onOpen={onOpen} />\n )}\n </div>\n )\n}\n","import React from 'react'\nimport * as ContextMenuPrimitive from '@radix-ui/react-context-menu'\n\n/**\n * A single action in the context menu.\n *\n * - Leaf items (no `children`) call `onClick` when activated.\n * - Parent items (with `children`) open a sub-menu on hover / arrow-right.\n * - `disabled` items render but cannot be activated; screen readers\n * announce them as disabled.\n */\nexport interface ContextMenuActionItem {\n key: React.Key\n /** Label shown for the item. May be plain text or a node. */\n value: React.ReactNode\n icon?: React.ReactNode\n /** Fires when the item is activated. Ignored when `children` is set. */\n onClick?: () => void\n /** Optional sub-menu items. */\n children?: ContextMenuActionItem[]\n /** Render as disabled — still visible but not activatable. */\n disabled?: boolean\n}\n\nexport interface ContextMenuProps {\n /** Top-level items. Each may carry nested `children` for sub-menus. */\n items: ContextMenuActionItem[]\n /**\n * The element that should respond to right-click. The entire React\n * subtree underneath becomes the trigger area. Wrap an existing\n * component / div / image — anything you can right-click on.\n */\n children: React.ReactNode\n}\n\n/**\n * Right-click context menu, built on `@radix-ui/react-context-menu`.\n *\n * **Idiomatic usage**: wrap the element that should respond to right-click.\n * Radix handles positioning (avoids viewport edges automatically), keyboard\n * navigation (↑↓ to move, → to open sub-menu, ← to close, Enter to activate,\n * Esc to dismiss), focus management, and portal-based stacking.\n *\n * @example Basic — flat menu\n * ```tsx\n * <ContextMenu\n * items={[\n * { key: 'edit', value: 'Edit', onClick: () => openEditor() },\n * { key: 'delete', value: 'Delete', onClick: () => askDelete() },\n * ]}\n * >\n * <Card vessel={vessel} />\n * </ContextMenu>\n * ```\n *\n * @example With sub-menu\n * ```tsx\n * <ContextMenu\n * items={[\n * {\n * key: 'export', value: 'Export',\n * children: [\n * { key: 'csv', value: 'as CSV', onClick: () => exportCsv() },\n * { key: 'xlsx', value: 'as Excel', onClick: () => exportXlsx() },\n * ],\n * },\n * ]}\n * >\n * <Table rows={rows} />\n * </ContextMenu>\n * ```\n */\nexport default function ContextMenu({ items, children }: ContextMenuProps) {\n return (\n <ContextMenuPrimitive.Root>\n <ContextMenuPrimitive.Trigger asChild>\n {children}\n </ContextMenuPrimitive.Trigger>\n\n <ContextMenuPrimitive.Portal>\n <ContextMenuPrimitive.Content\n className={CONTENT_CLASSNAME}\n collisionPadding={8}\n >\n {items.map((item) => renderItem(item))}\n </ContextMenuPrimitive.Content>\n </ContextMenuPrimitive.Portal>\n </ContextMenuPrimitive.Root>\n )\n}\n\n// ── Styling constants — keep markup readable ────────────────────────────────\n\nconst CONTENT_CLASSNAME = [\n // Surface — semantic tokens, both modes covered\n 'min-w-[180px] rounded-lg border border-border bg-surface shadow-lg',\n 'p-1 z-[500000] text-sm text-foreground',\n // Entry animation matches the Tooltip / Dropdown style\n 'animate-in fade-in-0 zoom-in-95',\n 'data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95',\n // Outline reset — Radix handles focus internally\n 'focus:outline-none',\n].join(' ')\n\nconst ITEM_CLASSNAME = [\n 'flex items-center justify-between gap-3 rounded-md px-2 py-1.5 cursor-pointer select-none',\n 'transition-colors duration-100',\n 'data-[highlighted]:bg-accent data-[highlighted]:text-accent-fg',\n 'data-[disabled]:opacity-40 data-[disabled]:cursor-not-allowed data-[disabled]:bg-transparent data-[disabled]:text-foreground-muted',\n 'focus:outline-none',\n].join(' ')\n\n// ── Item renderer — recursive for sub-menus ─────────────────────────────────\n\nfunction renderItem(item: ContextMenuActionItem) {\n if (item.children && item.children.length > 0) {\n // Sub-menu: Radix Sub + SubTrigger + SubContent\n return (\n <ContextMenuPrimitive.Sub key={item.key}>\n <ContextMenuPrimitive.SubTrigger\n disabled={item.disabled}\n className={ITEM_CLASSNAME}\n >\n <ContextMenuLabel icon={item.icon} value={item.value} />\n <ChevronRight />\n </ContextMenuPrimitive.SubTrigger>\n <ContextMenuPrimitive.Portal>\n <ContextMenuPrimitive.SubContent\n className={CONTENT_CLASSNAME}\n sideOffset={2}\n alignOffset={-4}\n collisionPadding={8}\n >\n {item.children.map((sub) => renderItem(sub))}\n </ContextMenuPrimitive.SubContent>\n </ContextMenuPrimitive.Portal>\n </ContextMenuPrimitive.Sub>\n )\n }\n\n return (\n <ContextMenuPrimitive.Item\n key={item.key}\n disabled={item.disabled}\n onSelect={() => item.onClick?.()}\n className={ITEM_CLASSNAME}\n >\n <ContextMenuLabel icon={item.icon} value={item.value} />\n </ContextMenuPrimitive.Item>\n )\n}\n\nfunction ContextMenuLabel({ icon, value }: { icon?: React.ReactNode; value: React.ReactNode }) {\n return (\n <span className=\"flex items-center gap-2 flex-1 min-w-0\">\n {icon && <span className=\"flex-shrink-0\">{icon}</span>}\n <span className=\"truncate\">{value}</span>\n </span>\n )\n}\n\nfunction ChevronRight() {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} className=\"h-4 w-4 flex-shrink-0\" aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 5l7 7-7 7\" />\n </svg>\n )\n}\n\n// ── Legacy type re-exports ──────────────────────────────────────────────────\n// `ContextMenuPosition` was part of the previous coordinate-based API. It\n// has no runtime equivalent in the Radix-based rewrite (positioning is\n// automatic), but is re-exported as a deprecated alias so older imports\n// keep compiling while consumers migrate.\n\n/** @deprecated The Radix rewrite positions the menu automatically — no coordinates needed. */\nexport interface ContextMenuPosition {\n x: number\n y: number\n}\n","import React, { useCallback, useEffect, useId, useLayoutEffect, useRef, useState } from 'react'\nimport { AnimatePresence, motion, useReducedMotion } from 'framer-motion'\nimport Button from '../inputs/Button'\nimport Portal from '../layout/Portal'\n\nexport interface WizardStep {\n /** Ref to the DOM element to highlight for this step. */\n stepRef: React.RefObject<HTMLElement | null>\n /** Tooltip body content. */\n description: React.ReactNode\n /**\n * Tooltip placement relative to the highlighted element.\n * - `'right'` (default) — to the right of the highlight\n * - `'left'` — to the left of the highlight\n * - `'top'` — above the highlight\n * - `'bottom'` — below the highlight\n */\n placement?: 'right' | 'left' | 'top' | 'bottom'\n /** Optional heading for the step's tooltip. */\n title?: React.ReactNode\n}\n\nexport interface WizardProps {\n /** The wrapped subtree — refs in `steps` point into this tree. */\n children: React.ReactNode\n /** Ordered list of steps to walk the user through. */\n steps: WizardStep[]\n /**\n * `localStorage` key used to remember dismissal. When the user clicks\n * \"Done\" (or \"Skip\" when dismissible), this key is set so the wizard\n * won't reopen on subsequent mounts.\n *\n * Pass `null` to disable persistence entirely (useful for tests or\n * tours that should always run).\n *\n * Default: `'oxygen.wizard.completed'`.\n */\n storageKey?: string | null\n /** Show a \"Skip tour\" button + Esc-to-dismiss. Default `true`. */\n dismissible?: boolean\n /** Called when the user reaches the final step's \"Done\" button. */\n onComplete?: () => void\n /** Called when the user skips (or presses Esc) before completing. */\n onSkip?: () => void\n}\n\n// ── Local-storage helpers (SSR-safe) ────────────────────────────────────────\n// The previous implementation called `localStorage.getItem(...)` at module-\n// effect time with no `typeof window` guard, crashing under SSR. These two\n// helpers route every access through a try/catch so server-side and\n// privacy-mode browsers (where localStorage throws) degrade silently.\n\nfunction readDismissed(key: string | null): boolean {\n if (key === null) return false\n if (typeof window === 'undefined') return false\n try {\n return window.localStorage.getItem(key) === 'true'\n } catch {\n return false\n }\n}\n\nfunction writeDismissed(key: string | null) {\n if (key === null) return\n if (typeof window === 'undefined') return\n try {\n window.localStorage.setItem(key, 'true')\n } catch {\n // Swallow — Safari private mode, quota exceeded, etc.\n }\n}\n\n// ── Bbox tracking — handles scroll + resize ────────────────────────────────\n\nfunction useTargetBbox(ref: React.RefObject<HTMLElement | null> | undefined) {\n const [bbox, setBbox] = useState<DOMRect | null>(null)\n\n useLayoutEffect(() => {\n const el = ref?.current\n if (!el) {\n setBbox(null)\n return\n }\n const update = () => setBbox(el.getBoundingClientRect())\n update()\n // Track viewport changes\n window.addEventListener('scroll', update, true)\n window.addEventListener('resize', update)\n // Track size changes on the target itself\n const ro = typeof ResizeObserver !== 'undefined' ? new ResizeObserver(update) : null\n ro?.observe(el)\n return () => {\n window.removeEventListener('scroll', update, true)\n window.removeEventListener('resize', update)\n ro?.disconnect()\n }\n }, [ref])\n\n return bbox\n}\n\n// ── Tooltip positioning ─────────────────────────────────────────────────────\n// Returns the absolute top/left of the tooltip for the given bbox + side.\n// `8 px` gap keeps the tooltip from touching the highlight.\n\nconst TOOLTIP_WIDTH = 280\nconst TOOLTIP_GAP = 12\n\nfunction tooltipStyleFor(bbox: DOMRect, placement: WizardStep['placement']): React.CSSProperties {\n const pl = placement ?? 'right'\n if (pl === 'right') return { left: bbox.right + TOOLTIP_GAP, top: bbox.top + bbox.height / 2, transform: 'translateY(-50%)', width: TOOLTIP_WIDTH }\n if (pl === 'left') return { left: bbox.left - TOOLTIP_WIDTH - TOOLTIP_GAP, top: bbox.top + bbox.height / 2, transform: 'translateY(-50%)', width: TOOLTIP_WIDTH }\n if (pl === 'bottom') return { left: bbox.left + bbox.width / 2, top: bbox.bottom + TOOLTIP_GAP, transform: 'translateX(-50%)', width: TOOLTIP_WIDTH }\n // top\n return { left: bbox.left + bbox.width / 2, top: bbox.top - TOOLTIP_GAP, transform: 'translate(-50%, -100%)', width: TOOLTIP_WIDTH }\n}\n\n// ── Focus trap — cycles Tab within the tooltip's focusable buttons ─────────\n\nfunction useFocusTrap(containerRef: React.RefObject<HTMLDivElement | null>, active: boolean) {\n useEffect(() => {\n if (!active) return\n const el = containerRef.current\n if (!el) return\n\n // Focus the primary action on mount so keyboard users land somewhere\n // sensible. setTimeout 0 lets layout settle first.\n const t = setTimeout(() => {\n const first = el.querySelector<HTMLElement>('button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])')\n first?.focus()\n }, 0)\n\n const onKey = (e: KeyboardEvent) => {\n if (e.key !== 'Tab') return\n const focusables = el.querySelectorAll<HTMLElement>(\n 'button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])'\n )\n if (focusables.length === 0) return\n const first = focusables[0]\n const last = focusables[focusables.length - 1]\n if (e.shiftKey && document.activeElement === first) {\n e.preventDefault()\n last.focus()\n } else if (!e.shiftKey && document.activeElement === last) {\n e.preventDefault()\n first.focus()\n }\n }\n document.addEventListener('keydown', onKey)\n return () => {\n clearTimeout(t)\n document.removeEventListener('keydown', onKey)\n }\n }, [containerRef, active])\n}\n\n/**\n * Guided-tour overlay that walks the user through a sequence of UI elements.\n *\n * Highlights each step's target element with an outlined \"spotlight\", shows a\n * tooltip with the description, and provides Prev / Next / Done navigation.\n * The wrapped tree is rendered unchanged; the overlay sits on top of it via a\n * portal so it always covers the real viewport regardless of where Wizard\n * lives in the React tree.\n *\n * **What's improved over the previous version**\n * - `localStorage` access is SSR-safe and try/catch-guarded (Safari private\n * mode, quota exceeded, no-storage browsers all degrade silently).\n * - No more `classList.add(...)` on consumer-owned DOM. The spotlight is a\n * portaled outline rectangle that tracks the target's bbox via\n * `ResizeObserver` + scroll/resize listeners. The consumer's DOM is never\n * mutated, so unmounting Wizard mid-tour leaves no orphan classes.\n * - Focus trap inside the tooltip — Tab and Shift+Tab cycle through the\n * tooltip's buttons. Esc dismisses (when `dismissible`).\n * - Backdrop blocks click-through on the rest of the page so the user can't\n * stumble into unrelated UI mid-tour. The highlighted target itself stays\n * click-blocked too (use the \"Next\" button to advance).\n * - Position recalculates on scroll / resize / target size changes via\n * `ResizeObserver`.\n * - All `dark-cornflower-blue` / `prussian-blue` / `bg-white` swapped for\n * semantic tokens — both light and dark modes work out of the box.\n *\n * @example\n * ```tsx\n * const dashRef = useRef<HTMLDivElement>(null)\n * const sidebarRef = useRef<HTMLElement>(null)\n *\n * <Wizard\n * steps={[\n * { stepRef: dashRef, title: 'Dashboard', description: 'Your fleet at a glance.' },\n * { stepRef: sidebarRef, title: 'Navigation', description: 'Jump between sections here.', placement: 'right' },\n * ]}\n * onComplete={() => track('onboarding_complete')}\n * >\n * <Layout dashRef={dashRef} sidebarRef={sidebarRef} />\n * </Wizard>\n * ```\n */\nexport default function Wizard({\n children,\n steps,\n storageKey = 'oxygen.wizard.completed',\n dismissible = true,\n onComplete,\n onSkip,\n}: WizardProps) {\n const tooltipRef = useRef<HTMLDivElement>(null)\n const tooltipTitleId = useId()\n const tooltipBodyId = useId()\n const reduced = useReducedMotion()\n\n // Open the wizard only when not previously dismissed and there is\n // actually at least one step.\n const [open, setOpen] = useState(() => steps.length > 0 && !readDismissed(storageKey))\n const [activeIndex, setActiveIndex] = useState(0)\n\n const step = steps[activeIndex]\n const bbox = useTargetBbox(step?.stepRef)\n\n useFocusTrap(tooltipRef, open)\n\n // Esc to dismiss (when allowed)\n useEffect(() => {\n if (!open || !dismissible) return\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault()\n handleSkip()\n }\n }\n document.addEventListener('keydown', onKey)\n return () => document.removeEventListener('keydown', onKey)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open, dismissible])\n\n const handleSkip = useCallback(() => {\n writeDismissed(storageKey)\n setOpen(false)\n onSkip?.()\n }, [storageKey, onSkip])\n\n const handleComplete = useCallback(() => {\n writeDismissed(storageKey)\n setOpen(false)\n onComplete?.()\n }, [storageKey, onComplete])\n\n const handleNext = () => {\n if (activeIndex < steps.length - 1) setActiveIndex((i) => i + 1)\n else handleComplete()\n }\n\n const handlePrev = () => {\n if (activeIndex > 0) setActiveIndex((i) => i - 1)\n }\n\n // The spotlight ring + click blocker get a small padding around the bbox\n // so they read as a halo, not as a tight outline.\n const SPOT_PAD = 6\n\n const highlightStyle: React.CSSProperties = bbox\n ? {\n left: bbox.left - SPOT_PAD,\n top: bbox.top - SPOT_PAD,\n width: bbox.width + SPOT_PAD * 2,\n height: bbox.height + SPOT_PAD * 2,\n }\n : { display: 'none' }\n\n // Four backdrop rectangles surrounding the target bbox — they share the\n // blur + tint, but leave the target area itself crystal clear. A\n // transparent fifth rect sits ON the target and blocks pointer events so\n // the user can't accidentally interact with the highlighted UI during\n // the tour (they advance via the tooltip buttons).\n const backdropTop: React.CSSProperties = bbox\n ? { left: 0, top: 0, right: 0, height: Math.max(0, bbox.top - SPOT_PAD) }\n : { display: 'none' }\n const backdropBottom: React.CSSProperties = bbox\n ? { left: 0, top: bbox.bottom + SPOT_PAD, right: 0, bottom: 0 }\n : { display: 'none' }\n const backdropLeft: React.CSSProperties = bbox\n ? {\n left: 0,\n top: bbox.top - SPOT_PAD,\n width: Math.max(0, bbox.left - SPOT_PAD),\n height: bbox.height + SPOT_PAD * 2,\n }\n : { display: 'none' }\n const backdropRight: React.CSSProperties = bbox\n ? {\n left: bbox.right + SPOT_PAD,\n top: bbox.top - SPOT_PAD,\n right: 0,\n height: bbox.height + SPOT_PAD * 2,\n }\n : { display: 'none' }\n\n const tooltipStyle = bbox ? tooltipStyleFor(bbox, step?.placement) : { display: 'none' }\n\n const isLast = activeIndex === steps.length - 1\n\n return (\n <>\n {children}\n\n <AnimatePresence>\n {open && step && (\n <Portal>\n {/* Backdrop is built from FOUR rectangles surrounding\n the target — the area inside the spotlight stays\n crystal clear (no blur, no tint). All four fade\n in/out together. */}\n {(['top', 'bottom', 'left', 'right'] as const).map((side) => (\n <motion.div\n key={side}\n className=\"fixed z-[7000000] bg-foreground/40 backdrop-blur-[2px] pointer-events-auto\"\n style={\n side === 'top' ? backdropTop :\n side === 'bottom' ? backdropBottom :\n side === 'left' ? backdropLeft :\n backdropRight\n }\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: reduced ? 0 : 0.18, ease: 'easeOut' }}\n aria-hidden=\"true\"\n />\n ))}\n\n {/* Transparent click blocker over the target — keeps\n the highlight visually untouched but stops the user\n from accidentally interacting with the spotlit UI\n mid-tour. */}\n <motion.div\n className=\"fixed z-[7000001] pointer-events-auto\"\n style={highlightStyle}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: reduced ? 0 : 0.18, ease: 'easeOut' }}\n aria-hidden=\"true\"\n />\n\n {/* Spotlight outline ring drawn on top of the blocker. */}\n <motion.div\n className=\"fixed z-[7000002] pointer-events-none rounded-md ring-2 ring-accent\"\n style={highlightStyle}\n initial={{ opacity: 0, scale: 1.08 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 1.08 }}\n transition={{\n duration: reduced ? 0 : 0.32,\n ease: [0.16, 1, 0.3, 1], // ease-out-expo — settles softly\n }}\n aria-hidden=\"true\"\n />\n\n {/* Tooltip cross-fades + slides between steps. The\n `key={activeIndex}` makes AnimatePresence treat each\n step as a separate mount, triggering enter/exit on\n navigation. Focus-trapped + Esc-dismissible. */}\n <motion.div\n key={activeIndex}\n ref={tooltipRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={step.title ? tooltipTitleId : undefined}\n aria-describedby={tooltipBodyId}\n className=\"fixed z-[7000003] rounded-lg bg-surface text-foreground border border-border shadow-xl p-4 pointer-events-auto\"\n style={tooltipStyle}\n initial={{ opacity: 0, scale: 0.96, y: 6 }}\n animate={{ opacity: 1, scale: 1, y: 0 }}\n exit={{ opacity: 0, scale: 0.97, y: 4 }}\n transition={\n reduced\n ? { duration: 0 }\n : {\n opacity: { duration: 0.18 },\n scale: { type: 'tween', duration: 0.26, ease: [0.16, 1, 0.3, 1] },\n y: { type: 'tween', duration: 0.26, ease: [0.16, 1, 0.3, 1] },\n }\n }\n >\n {step.title && (\n <h3 id={tooltipTitleId} className=\"text-sm font-semibold text-foreground mb-1\">\n {step.title}\n </h3>\n )}\n <div id={tooltipBodyId} className=\"text-sm text-foreground-secondary leading-relaxed\">\n {step.description}\n </div>\n\n <div className=\"mt-4 flex items-center justify-between\">\n {/* Step indicator */}\n <span className=\"text-xs text-foreground-muted tabular-nums\">\n {activeIndex + 1} / {steps.length}\n </span>\n\n <div className=\"flex items-center gap-2\">\n {dismissible && !isLast && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n content=\"Skip\"\n onClick={handleSkip}\n />\n )}\n {activeIndex > 0 && (\n <Button\n variant=\"secondary\"\n size=\"sm\"\n content=\"Back\"\n onClick={handlePrev}\n />\n )}\n <Button\n size=\"sm\"\n content={isLast ? 'Done' : 'Next'}\n onClick={handleNext}\n />\n </div>\n </div>\n </motion.div>\n </Portal>\n )}\n </AnimatePresence>\n </>\n )\n}\n","import React from 'react'\n\nexport interface SearchInputProps {\n value?: string\n onChange?: React.ChangeEventHandler<HTMLInputElement>\n disabled?: boolean\n label?: React.ReactNode\n htmlFor?: string\n placeholder?: string\n name?: string\n inputStyle?: React.CSSProperties\n style?: React.CSSProperties\n /** Label/input orientation. Defaults to `'vertical'`. */\n layout?: 'horizontal' | 'vertical'\n}\n\n/**\n * Search text field with a magnifier icon on the right.\n */\nconst SearchInput = React.forwardRef<HTMLInputElement, SearchInputProps>(function SearchInput(\n {\n value,\n onChange,\n disabled,\n label,\n htmlFor,\n placeholder,\n name,\n inputStyle,\n style,\n layout = 'vertical',\n },\n ref\n) {\n return (\n <div className=\"relative flex flex-col items-center justify-center\">\n <div\n className={`flex ${layout === 'vertical' ? 'flex-col' : 'flex-row items-center gap-2'}`}\n style={style ?? {}}\n >\n {label && (\n <label className=\"text-sm font-medium ml-1 max-content text-foreground\" htmlFor={htmlFor}>\n {label}\n </label>\n )}\n <div className=\"bg-surface text-foreground flex items-center gap-1 rounded-lg border border-border pr-2 focus-within:border-transparent focus-within:ring-2 focus-within:ring-accent transition-colors\">\n <input\n ref={ref}\n disabled={disabled}\n value={value}\n onChange={onChange}\n // `type=\"search\"` gives consumers the native clear button\n // and an Enter-friendly virtual keyboard hint on mobile.\n type=\"search\"\n enterKeyHint=\"search\"\n name={name}\n id={htmlFor}\n className=\"bg-transparent focus:outline-none pl-2 h-9 w-56 rounded-lg disabled:cursor-not-allowed\"\n style={inputStyle ?? {}}\n placeholder={placeholder ?? ''}\n />\n {/* Search icon — uses currentColor so it follows the input text */}\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"w-5 h-5 text-foreground-muted\" aria-hidden=\"true\">\n <path fillRule=\"evenodd\" d=\"M10.5 3.75a6.75 6.75 0 100 13.5 6.75 6.75 0 000-13.5zM2.25 10.5a8.25 8.25 0 1114.59 5.28l4.69 4.69a.75.75 0 11-1.06 1.06l-4.69-4.69A8.25 8.25 0 012.25 10.5z\" clipRule=\"evenodd\" />\n </svg>\n </div>\n </div>\n </div>\n )\n})\n\nexport default SearchInput\n","import type { ReactNode } from 'react'\n\nexport interface DropdownPillProps {\n value?: ReactNode\n hasSiblings?: boolean\n}\n\n/**\n * Pill chip used inside Dropdown to display selected values.\n */\nexport default function DropdownPill({ value, hasSiblings = false }: DropdownPillProps) {\n return (\n <div\n className={`bg-accent text-accent-fg text-sm text-ellipsis ${hasSiblings ? 'w-24' : 'w-max'} p-1 px-2 rounded-lg whitespace-nowrap overflow-hidden`}\n >\n {value}\n </div>\n )\n}\n","import React, { useEffect, useId, useState } from 'react'\nimport * as Popover from '@radix-ui/react-popover'\nimport SearchInput from './SearchInput'\nimport DropdownPill from './DropdownPill'\n\nexport interface DropdownItem {\n key: string | number\n label: React.ReactNode\n icon?: React.ReactNode\n}\n\n/**\n * Item key type — DOM-friendly subset of `React.Key` (no bigint, since UI\n * keys are always strings or numbers in practice).\n */\nexport type DropdownKey = string | number\n\n/**\n * Selected value(s). In single-select mode this is a single key matching\n * one of the items. In multi-select mode it is an array of keys.\n */\nexport type DropdownValue = DropdownKey | DropdownKey[]\n\nexport interface DropdownProps {\n isMultiselect?: boolean\n hasSearch?: boolean\n label?: React.ReactNode\n name?: string\n value?: DropdownValue\n onChange?: (e: { target: { value: DropdownValue; id?: string; name?: string } }) => void\n onBlur?: React.FocusEventHandler\n disabled?: boolean\n /** Label/input orientation. Defaults to `'vertical'`. */\n layout?: 'horizontal' | 'vertical'\n /**\n * Show a \"+N more\" pill alongside the first selected item in multiselect\n * mode. Defaults to `false` — a single pill is shown with the first\n * selection and consumers typically open the dropdown to see the rest.\n * Set `true` if you want the count visible on the trigger.\n */\n showSelectedCount?: boolean\n errorMessage?: React.ReactNode\n style?: React.CSSProperties\n htmlFor?: string\n items?: DropdownItem[]\n labelStyle?: React.CSSProperties\n placeholder?: string\n}\n\n/**\n * Select / multi-select dropdown powered by Radix Popover.\n *\n * Radix handles focus-trap within the popover, keyboard dismiss (Escape),\n * and correct portal-based z-index stacking.\n *\n * Emits `{ target: { value, id, name } }` for form-compatibility.\n *\n * @example\n * // Single-select\n * <Dropdown label=\"Vessel\" items={vessels} value={form.vessel} onChange={handleChange} htmlFor=\"vessel\" />\n *\n * // Multi-select\n * <Dropdown isMultiselect label=\"Fuels\" items={fuels} value={form.fuels} onChange={handleChange} />\n */\nexport default function Dropdown({\n isMultiselect = false,\n hasSearch = true,\n label,\n name,\n value,\n onChange,\n disabled,\n layout = 'horizontal',\n errorMessage,\n style = {},\n htmlFor,\n items = [],\n labelStyle = {},\n placeholder,\n showSelectedCount = false,\n}: DropdownProps) {\n const [open, setOpen] = useState(false)\n const [selectedItems, setSelectedItems] = useState<(string | number)[]>([])\n const [searchTerm, setSearchTerm] = useState('')\n const [innerItems, setInnerItems] = useState<DropdownItem[]>([])\n // Stable id for the error region so the combobox can point at it via\n // aria-describedby when validation fails.\n const errorId = useId()\n const hasError = errorMessage != null\n\n useEffect(() => {\n setInnerItems(items)\n }, [items])\n\n useEffect(() => {\n if (isMultiselect && Array.isArray(value)) {\n setSelectedItems(value)\n }\n }, [isMultiselect, value])\n\n const selectItem = (key: string | number) => {\n if (isMultiselect) {\n const next = selectedItems.includes(key)\n ? selectedItems.filter((it) => it !== key)\n : [...selectedItems, key]\n setSelectedItems(next)\n onChange?.({ target: { value: next, id: htmlFor, name } })\n } else {\n setSelectedItems([key])\n onChange?.({ target: { value: key, id: htmlFor, name } })\n setOpen(false)\n }\n }\n\n const onSearchChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const term = e.target.value\n setSearchTerm(term)\n setInnerItems(\n term.trim() === ''\n ? items\n : items.filter((it) =>\n String(it.label).toLowerCase().includes(term.toLowerCase())\n )\n )\n }\n\n const isSelected = (key: string | number) =>\n Array.isArray(value) ? value.includes(key) : value === key\n\n return (\n <div className=\"mt-2\">\n <div\n className={`flex ${layout === 'vertical' ? 'flex-col' : 'flex-row items-center gap-2'}`}\n >\n {label && (\n <label\n className=\"text-sm font-medium ml-1 max-content select-none text-foreground\"\n htmlFor={htmlFor}\n style={labelStyle}\n >\n {label}\n </label>\n )}\n\n <Popover.Root open={open && !disabled} onOpenChange={(o) => !disabled && setOpen(o)}>\n <Popover.Trigger asChild>\n <div\n id={htmlFor}\n role=\"combobox\"\n aria-expanded={open}\n aria-haspopup=\"listbox\"\n aria-invalid={hasError || undefined}\n aria-describedby={hasError ? errorId : undefined}\n style={style}\n className={`flex items-center justify-between relative h-9 rounded-lg border border-border cursor-pointer select-none focus:outline-none focus-visible:border-transparent focus-visible:ring-2 focus-visible:ring-accent ${disabled ? 'cursor-not-allowed bg-surface-raised text-foreground-muted' : 'bg-surface text-foreground'} ${hasError ? 'border-status-error' : ''}`}\n tabIndex={disabled ? -1 : 0}\n onKeyDown={(e) => {\n if (disabled) return\n // Open on Enter, Space, ArrowDown, ArrowUp — the\n // canonical combobox activation keys per WAI-ARIA.\n if (e.key === 'Enter' || e.key === ' ' || e.key === 'ArrowDown' || e.key === 'ArrowUp') {\n e.preventDefault()\n setOpen(true)\n }\n }}\n >\n {/* Selected value(s) */}\n <div\n className={`h-7 pl-2 ${!style?.width ? 'min-w-[240px]' : ''} flex items-center gap-1 overflow-hidden`}\n >\n {!value || (Array.isArray(value) && value.length === 0) ? (\n <span className=\"text-foreground-muted text-sm\">{placeholder}</span>\n ) : Array.isArray(value) ? (\n <>\n {value.slice(0, 1).map((val) => (\n <DropdownPill\n key={String(val)}\n hasSiblings={value.length > 1}\n value={innerItems.find((it) => it.key === val)?.label}\n />\n ))}\n {showSelectedCount && value.length > 1 && (\n <DropdownPill value={`+${value.length - 1} more`} />\n )}\n </>\n ) : (\n <DropdownPill value={innerItems.find((it) => it.key === value)?.label} />\n )}\n </div>\n\n {/* Chevron — currentColor follows trigger text */}\n <div className={`transition-transform duration-200 mr-2 ${open ? 'rotate-180' : 'rotate-0'}`} aria-hidden=\"true\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} className=\"h-4 w-4\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n </div>\n </div>\n </Popover.Trigger>\n\n <Popover.Portal>\n <Popover.Content\n align=\"start\"\n sideOffset={4}\n style={{ width: style?.width || 240 }}\n className=\"bg-surface text-foreground border border-border rounded-lg shadow-md z-50 p-2 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\"\n onInteractOutside={() => setOpen(false)}\n >\n {hasSearch && (\n <div className=\"mb-2\">\n <SearchInput\n style={{ width: '100%' }}\n inputStyle={{ width: '100%' }}\n value={searchTerm}\n onChange={onSearchChange}\n placeholder=\"Search...\"\n />\n </div>\n )}\n <div role=\"listbox\" aria-multiselectable={isMultiselect} className=\"max-h-40 overflow-y-auto\">\n {innerItems.map((item) => (\n // aria-rowindex was previously set here but\n // it's invalid ARIA on role=\"option\" (it\n // belongs on rows of a grid/treegrid). Dropped.\n // tabIndex={0} + Enter/Space handler makes the\n // option keyboard-activatable; the full\n // combobox roving-tabindex pattern is deferred\n // until the planned Phase-5 rewrite.\n <div\n key={item.key}\n role=\"option\"\n aria-selected={isSelected(item.key)}\n tabIndex={0}\n className={`flex items-center justify-between p-2 hover:bg-accent hover:text-accent-fg transition-colors duration-150 text-sm rounded-lg cursor-pointer focus:outline-none focus-visible:ring-2 focus-visible:ring-accent ${\n selectedItems.includes(item.key) ? 'bg-surface-raised text-foreground' : 'text-foreground'\n }`}\n onClick={() => selectItem(item.key)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n selectItem(item.key)\n }\n }}\n >\n <div className=\"flex items-center gap-2 text-xs\">\n {item.icon && <div>{item.icon}</div>}\n {item.label}\n </div>\n {isSelected(item.key) && (\n // currentColor — checkmark follows\n // the item's text colour, which\n // flips automatically on hover.\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M4 10l4.5 4.5L16 6\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </div>\n ))}\n </div>\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n </div>\n {hasError && (\n <div id={errorId} className=\"text-center text-status-error text-xs mt-1\">\n {errorMessage}\n </div>\n )}\n </div>\n )\n}\n","import React, { useEffect, useMemo, useRef, useState } from 'react'\nimport SearchInput from '../inputs/SearchInput'\nimport Dropdown from '../inputs/Dropdown'\nimport IconButton from './IconButton'\n\n/** ─────────────────── types ─────────────────── */\n\n/**\n * Column descriptor for the Table.\n *\n * The generic `T` is the shape of a row — `keyBind` must be one of T's\n * string-keyed properties, and `component(cellValue, row)` receives the\n * matching value with full type inference. When used without a generic\n * (`TableColumn[]`), `T` falls back to `Record<string, any>` for backwards\n * compatibility — narrower typing is preferred whenever possible:\n *\n * ```ts\n * type Vessel = { id: number; name: string; status: 'At Sea' | 'In Port' }\n * const cols: TableColumn<Vessel>[] = [\n * { key: 'name', label: 'Name', keyBind: 'name' }, // cellValue inferred as string\n * ]\n * ```\n */\nexport interface TableColumn<T extends Record<string, any> = Record<string, any>> {\n /** React reconciliation key for the column itself. */\n key: React.Key\n label: React.ReactNode\n /** Property on the row to read for this column. */\n keyBind: keyof T & string\n /** Custom cell renderer. Receives the cell value and the full row. */\n component?: (cellValue: T[keyof T], row: T) => React.ReactNode\n /** Explicit column width (CSS length or px number). Optional — defaults to auto. */\n width?: string | number\n /** Text alignment for both header and cells. Defaults to `'center'`. */\n align?: 'left' | 'center' | 'right'\n}\n\nexport interface PaginationOptions {\n enabled?: boolean\n perPage?: number\n withPicker?: boolean\n serverSide?: boolean\n /** Server-side: current 1-based page number */\n page?: number\n /** Server-side: total page count */\n maxPage?: number\n /** Server-side: total row count (used to calculate maxPage) */\n totalCount?: number\n pickerOptions?: Array<{ key: number; value: number; label: number }>\n onPageChange?: (page: number) => void\n onPerPageChange?: (perPage: number) => void\n}\n\nexport interface ExpandRowOptions<T extends Record<string, any> = Record<string, any>> {\n enabled?: boolean\n expandIcon?: React.ReactNode\n expandComponent?: (row: T) => React.ReactNode\n}\n\nexport interface TableProps<T extends Record<string, any> = Record<string, any>> {\n columns?: TableColumn<T>[]\n rows?: T[]\n /**\n * Returns a stable key for each row, used for React reconciliation AND\n * for tracking expanded state when `expandRow.enabled` is true.\n * Defaults to the row index — fine for static lists, but pass an\n * explicit getter (e.g. `(row) => row.id`) if rows can be reordered or\n * filtered while expand state should persist.\n */\n getRowKey?: (row: T, index: number) => React.Key\n pagination?: PaginationOptions\n expandRow?: ExpandRowOptions<T>\n hasSearch?: boolean\n footer?: React.ReactNode\n header?: React.ReactNode\n}\n\n/** ─────────────────── defaults ─────────────────── */\nconst DEFAULT_PICKER: PaginationOptions['pickerOptions'] = [\n { key: 1, value: 5, label: 5 },\n { key: 2, value: 10, label: 10 },\n { key: 3, value: 15, label: 15 },\n { key: 4, value: 20, label: 20 },\n]\n\nconst DEFAULT_PAGINATION: PaginationOptions = {\n enabled: true,\n perPage: 15,\n withPicker: true,\n pickerOptions: DEFAULT_PICKER,\n}\n\nconst DEFAULT_EXPAND: ExpandRowOptions = {\n enabled: false,\n}\n\n/** ─────────────────── helpers ─────────────────── */\n\nfunction createDatasets<T>(rows: T[], perPage: number | null): T[][] {\n if (!perPage) return [rows.slice()]\n const all: T[][] = []\n for (let i = 0; i < rows.length; i += perPage) {\n all.push(rows.slice(i, i + perPage))\n }\n return all\n}\n\n/**\n * Default row-key strategy — index-based. Stable across renders for static\n * lists; pass an explicit `getRowKey` for any list that mutates.\n */\nconst defaultGetRowKey = (_row: unknown, index: number): React.Key => index\n\nconst cellAlign = (align: TableColumn['align']) =>\n align === 'left' ? 'text-left' : align === 'right' ? 'text-right' : 'text-center'\n\n/** ─────────────────── sub-components ─────────────────── */\n\nfunction TableHeader<T extends Record<string, any>>({\n columns,\n hasExpand,\n}: {\n columns: TableColumn<T>[]\n hasExpand: boolean\n}) {\n return (\n <thead className=\"bg-surface-raised border-b border-border\">\n <tr>\n {hasExpand && <th aria-hidden=\"true\" className=\"w-9\" />}\n {columns.map((col) => (\n <th\n key={col.key}\n scope=\"col\"\n className={`${cellAlign(col.align)} text-sm font-semibold text-foreground py-3 px-3`}\n style={col.width != null ? { width: col.width } : undefined}\n >\n {col.label}\n </th>\n ))}\n </tr>\n </thead>\n )\n}\n\nconst DefaultExpandIcon = (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className=\"w-5 h-5 text-foreground-muted\"\n aria-hidden=\"true\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M12 2.25c-5.385 0-9.75 4.365-9.75 9.75s4.365 9.75 9.75 9.75 9.75-4.365 9.75-9.75S17.385 2.25 12 2.25zM12.75 9a.75.75 0 00-1.5 0v2.25H9a.75.75 0 000 1.5h2.25V15a.75.75 0 001.5 0v-2.25H15a.75.75 0 000-1.5h-2.25V9z\"\n clipRule=\"evenodd\"\n />\n </svg>\n)\n\nfunction TableBody<T extends Record<string, any>>({\n columns,\n rows,\n expandRow,\n getRowKey,\n}: {\n columns: TableColumn<T>[]\n rows: T[]\n expandRow: ExpandRowOptions<T>\n getRowKey: (row: T, index: number) => React.Key\n}) {\n // Expand state is keyed by the row's stable key — survives reorder/filter\n // as long as `getRowKey` returns the same value for the same row.\n const [expanded, setExpanded] = useState<Set<React.Key>>(() => new Set())\n\n const toggleRow = (rowKey: React.Key) => {\n setExpanded((prev) => {\n const next = new Set(prev)\n if (next.has(rowKey)) next.delete(rowKey)\n else next.add(rowKey)\n return next\n })\n }\n\n const hasExpand = !!expandRow.enabled\n const expandColCount = columns.length + (hasExpand ? 1 : 0)\n\n return (\n <tbody>\n {rows.map((row, i) => {\n const rowKey = getRowKey(row, i)\n const isExpanded = expanded.has(rowKey)\n return (\n <React.Fragment key={rowKey}>\n <tr\n className={`border-b border-border hover:bg-surface-raised transition-colors duration-150 ${\n i % 2 === 0 ? 'bg-surface' : 'bg-surface-raised'\n }`}\n >\n {hasExpand && (\n <td className=\"p-0 align-middle w-9\">\n <button\n type=\"button\"\n onClick={() => toggleRow(rowKey)}\n aria-expanded={isExpanded}\n aria-label={isExpanded ? 'Collapse row' : 'Expand row'}\n className={`w-9 h-9 inline-flex items-center justify-center rounded-md hover:bg-surface/80 transition-transform duration-200 focus:outline-none focus-visible:ring-2 focus-visible:ring-accent ${\n isExpanded ? 'rotate-180' : ''\n }`}\n >\n {expandRow.expandIcon ?? DefaultExpandIcon}\n </button>\n </td>\n )}\n {columns.map((col) => (\n <td\n key={col.key}\n className={`${cellAlign(col.align)} text-sm text-foreground py-2 px-3 align-middle`}\n >\n {col.component\n ? col.component(row[col.keyBind] as T[keyof T], row)\n : (row[col.keyBind] as React.ReactNode)}\n </td>\n ))}\n </tr>\n\n {hasExpand && isExpanded && (\n <tr className=\"bg-surface\">\n <td colSpan={expandColCount} className=\"p-0 border-b border-border\">\n <div className=\"p-3\">{expandRow.expandComponent?.(row)}</div>\n </td>\n </tr>\n )}\n </React.Fragment>\n )\n })}\n </tbody>\n )\n}\n\nfunction Pagination({\n activePage,\n onPageChange,\n maxPage,\n options,\n onPerPageChange,\n serverSide = false,\n}: {\n activePage: number\n onPageChange: (page: number) => void\n maxPage: number\n options: PaginationOptions\n onPerPageChange: (perPage: number) => void\n serverSide?: boolean\n}) {\n const picker = options.pickerOptions ?? DEFAULT_PICKER\n const matchedOption = picker.find(\n (o) => o.label === options.perPage || o.value === options.perPage\n )\n const [perPageKey, setPerPageKey] = useState(() => matchedOption?.key ?? picker[0]?.key)\n const displayPerPageKey = serverSide ? matchedOption?.key ?? perPageKey : perPageKey\n\n useEffect(() => {\n if (serverSide && options.perPage != null) {\n const next = picker.find((o) => o.label === options.perPage || o.value === options.perPage)\n if (next) setPerPageKey(next.key)\n }\n }, [serverSide, options.perPage, picker])\n\n const navBtn = (icon: React.ReactNode, disabled: boolean, onClick: () => void) => (\n <IconButton disabled={disabled} onClick={onClick} icon={icon} />\n )\n\n const chevronRight = (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} className=\"h-5 w-5\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 5l7 7-7 7\" />\n </svg>\n )\n\n const doubleChevronRight = (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} className=\"h-5 w-5\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M13 5l7 7-7 7M5 5l7 7-7 7\" />\n </svg>\n )\n\n return (\n <div className=\"flex gap-2 items-center justify-end pt-2\">\n {navBtn(\n <span className=\"rotate-180 inline-flex\">{doubleChevronRight}</span>,\n activePage === 0,\n () => onPageChange(0)\n )}\n {navBtn(\n <span className=\"rotate-180 inline-flex\">{chevronRight}</span>,\n activePage === 0,\n () => activePage > 0 && onPageChange(activePage - 1)\n )}\n <span className=\"bg-surface-raised rounded-lg ml-2 mr-2 shadow-sm p-2 w-10 text-center select-none text-foreground\">\n {activePage + 1}\n </span>\n {navBtn(\n chevronRight,\n activePage === maxPage,\n () => activePage < maxPage && onPageChange(activePage + 1)\n )}\n {navBtn(\n doubleChevronRight,\n activePage === maxPage,\n () => onPageChange(maxPage)\n )}\n {options.withPicker && (\n <Dropdown\n style={{ width: 80, position: 'relative', bottom: 4 }}\n hasSearch={false}\n items={picker}\n isMultiselect={false}\n value={displayPerPageKey}\n onChange={({ target: { value } }) => {\n // Pagination is single-select; ignore array values that\n // could come through from a multi-select Dropdown.\n if (Array.isArray(value)) return\n const numKey = typeof value === 'number' ? value : Number(value)\n if (!serverSide) setPerPageKey(numKey)\n const opt = picker.find((o) => o.key === numKey)\n onPerPageChange(opt?.label ?? opt?.value ?? numKey)\n }}\n />\n )}\n </div>\n )\n}\n\n/** ─────────────────── main component ─────────────────── */\n\n/**\n * Data table with optional search, pagination, and expandable rows.\n *\n * - **Typed rows**: pass a generic `T` for full type inference on columns\n * and cell renderers (`<Table<Vessel> ... />`).\n * - **Real `<table>` semantics**: keeps row / col / cell context intact for\n * screen readers and lets the browser handle column sizing natively.\n * Per-column widths via `column.width`.\n * - **Search**: client-side filter across ALL row values; result is\n * memoized so each keystroke costs O(n) once per term change, not per\n * render. Set `pagination.serverSide` to skip client-side filter and\n * pagination entirely.\n * - **Expand**: each row gets a real `<button>` with `aria-expanded`.\n * Expand state is keyed by `getRowKey(row, i)` so it survives reorders.\n *\n * @example Static, fully typed\n * ```tsx\n * type Vessel = { id: number; name: string; status: string }\n * <Table<Vessel>\n * columns={[\n * { key: 'name', label: 'Name', keyBind: 'name' },\n * { key: 'status', label: 'Status', keyBind: 'status', width: 120 },\n * ]}\n * rows={vessels}\n * getRowKey={(row) => row.id}\n * />\n * ```\n *\n * @example Server-side pagination\n * ```tsx\n * <Table\n * columns={cols}\n * rows={pageRows}\n * pagination={{\n * enabled: true, serverSide: true, perPage: 20,\n * page: currentPage, totalCount, onPageChange, onPerPageChange,\n * }}\n * />\n * ```\n */\nexport default function Table<T extends Record<string, any> = Record<string, any>>({\n columns = [],\n rows = [],\n getRowKey = defaultGetRowKey,\n pagination = DEFAULT_PAGINATION,\n expandRow = DEFAULT_EXPAND as ExpandRowOptions<T>,\n hasSearch = true,\n footer = null,\n header = null,\n}: TableProps<T>) {\n const searchRef = useRef<HTMLInputElement>(null)\n const [searchTerm, setSearchTerm] = useState('')\n const [perPage, setPerPage] = useState(\n typeof pagination.perPage === 'number' ? pagination.perPage : 15\n )\n const [activePage, setActivePage] = useState(0)\n\n const isServerSide = !!(pagination.enabled && pagination.serverSide)\n\n // Filter is derived state — memoized so each keystroke only runs the\n // O(n × columns) scan once per `searchTerm` change, not on every render.\n // Server-side mode short-circuits: the consumer's API is the filter.\n const filteredRows = useMemo(() => {\n if (isServerSide || !searchTerm) return rows\n const term = searchTerm.toLowerCase()\n return rows.filter((row) =>\n Object.values(row).some(\n (v) => v != null && String(v).toLowerCase().includes(term)\n )\n )\n }, [rows, searchTerm, isServerSide])\n\n // Pagination buckets — also derived. Re-bucketed whenever the filtered\n // set OR page size changes.\n const datasets = useMemo(() => {\n if (isServerSide) return [rows]\n return createDatasets(filteredRows, pagination.enabled ? perPage : null)\n }, [filteredRows, perPage, pagination.enabled, isServerSide, rows])\n\n const MAX_PAGE = useMemo(() => {\n if (isServerSide && typeof pagination.maxPage === 'number') return Math.max(0, pagination.maxPage)\n if (isServerSide && typeof pagination.totalCount === 'number')\n return Math.max(0, Math.ceil(pagination.totalCount / perPage) - 1)\n return datasets.length ? datasets.length - 1 : 0\n }, [isServerSide, pagination.maxPage, pagination.totalCount, perPage, datasets.length])\n\n const currentPageRows = useMemo(() => {\n if (isServerSide) return rows\n return datasets[activePage] ?? []\n }, [isServerSide, rows, datasets, activePage])\n\n // Sync per-page state with pagination prop when not server-side\n useEffect(() => {\n if (pagination.enabled && !isServerSide && typeof pagination.perPage === 'number') {\n setPerPage(pagination.perPage)\n }\n }, [pagination.enabled, pagination.perPage, isServerSide])\n\n // Server-side: mirror the per-page from props\n useEffect(() => {\n if (isServerSide && typeof pagination.perPage === 'number') setPerPage(pagination.perPage)\n }, [isServerSide, pagination.perPage])\n\n // Server-side: mirror the 1-based page from props\n useEffect(() => {\n if (isServerSide && typeof pagination.page === 'number' && pagination.page >= 1)\n setActivePage(pagination.page - 1)\n }, [isServerSide, pagination.page])\n\n const onSearchChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setSearchTerm(e.target.value)\n // Reset to the first page so the user sees the top of the filtered set.\n setActivePage(0)\n }\n\n const onPaginationChange = (perPageValue: number) => {\n setPerPage(perPageValue)\n setActivePage(0)\n if (isServerSide) pagination.onPerPageChange?.(perPageValue)\n }\n\n const handlePageChange = (newPage: number) => {\n if (isServerSide) {\n pagination.onPageChange?.(newPage + 1)\n return\n }\n setActivePage(newPage)\n }\n\n return (\n <div className=\"w-full h-max rounded-lg\">\n <div className=\"flex items-center justify-between mb-2\">\n {hasSearch && (\n <SearchInput\n ref={searchRef}\n value={searchTerm}\n onChange={onSearchChange}\n placeholder=\"Search term...\"\n />\n )}\n {pagination.enabled && (\n <Pagination\n activePage={activePage}\n onPageChange={handlePageChange}\n maxPage={MAX_PAGE}\n onPerPageChange={onPaginationChange}\n options={pagination}\n serverSide={isServerSide}\n />\n )}\n </div>\n <div>{header}</div>\n {/* Horizontal scroll wrapper — enables swipe-scroll on narrow viewports\n without forcing the table itself to layout horizontally. */}\n <div className=\"overflow-x-auto rounded-lg\">\n <table className=\"w-full border-collapse\">\n <TableHeader columns={columns} hasExpand={!!expandRow.enabled} />\n <TableBody\n columns={columns}\n rows={currentPageRows}\n expandRow={expandRow}\n getRowKey={getRowKey}\n />\n </table>\n </div>\n <div>{footer}</div>\n </div>\n )\n}\n","import React, { useId } from 'react'\nimport * as SwitchPrimitive from '@radix-ui/react-switch'\n\nexport interface ThemeSwitchProps {\n checked: boolean\n onChange: (e: { target: { checked: boolean } }) => void\n /** Optional accessible label (defaults to \"Toggle dark mode\") */\n label?: string\n}\n\n/**\n * Theme (dark-mode) toggle switch powered by Radix Switch.\n *\n * The thumb color indicates mode: green = light, slate = dark.\n * Layout (position, margin) is the parent's responsibility — this component\n * renders inline with no external margins.\n *\n * @example\n * <ThemeSwitch checked={isDark} onChange={({ target }) => setDark(target.checked)} />\n */\nexport default function ThemeSwitch({ checked, onChange, label = 'Toggle dark mode' }: ThemeSwitchProps) {\n const id = useId()\n\n return (\n <label htmlFor={id} className=\"flex items-center gap-2 cursor-pointer select-none\">\n <SwitchPrimitive.Root\n id={id}\n checked={checked}\n onCheckedChange={(c) => onChange({ target: { checked: c } })}\n aria-label={label}\n className={[\n 'relative inline-flex h-6 w-11 items-center rounded-full',\n 'transition-colors duration-200',\n 'bg-foreground-secondary data-[state=checked]:bg-accent',\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2',\n ].join(' ')}\n >\n <SwitchPrimitive.Thumb\n className={[\n 'pointer-events-none block h-5 w-5 rounded-full shadow-sm',\n 'transition-transform duration-200',\n 'data-[state=checked]:translate-x-[22px]',\n 'data-[state=unchecked]:translate-x-[2px]',\n // Moon icon (dark mode indicator) when checked, sun when unchecked\n checked ? 'bg-oxford-blue-900' : 'bg-white',\n ].join(' ')}\n >\n {/* Micro icon inside thumb */}\n {checked ? (\n // Moon\n <svg viewBox=\"0 0 16 16\" fill=\"currentColor\" className=\"w-3 h-3 m-1 text-manatee\" aria-hidden=\"true\">\n <path d=\"M6 .278a.768.768 0 0 1 .08.858 7.208 7.208 0 0 0-.878 3.46c0 4.021 3.278 7.277 7.318 7.277.527 0 1.04-.055 1.533-.16a.787.787 0 0 1 .81.316.733.733 0 0 1-.031.893A8.349 8.349 0 0 1 8.344 16C3.734 16 0 12.286 0 7.71 0 4.266 2.114 1.312 5.124.06A.752.752 0 0 1 6 .278z\" />\n </svg>\n ) : (\n // Sun\n <svg viewBox=\"0 0 16 16\" fill=\"currentColor\" className=\"w-3 h-3 m-1 text-usafa-blue\" aria-hidden=\"true\">\n <path d=\"M8 11a3 3 0 1 1 0-6 3 3 0 0 1 0 6zm0 1a4 4 0 1 0 0-8 4 4 0 0 0 0 8zM8 0a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-1 0v-2A.5.5 0 0 1 8 0zm0 13a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-1 0v-2A.5.5 0 0 1 8 13zm8-5a.5.5 0 0 1-.5.5h-2a.5.5 0 0 1 0-1h2a.5.5 0 0 1 .5.5zM3 8a.5.5 0 0 1-.5.5h-2a.5.5 0 0 1 0-1h2A.5.5 0 0 1 3 8zm10.657-5.657a.5.5 0 0 1 0 .707l-1.414 1.415a.5.5 0 1 1-.707-.708l1.414-1.414a.5.5 0 0 1 .707 0zm-9.193 9.193a.5.5 0 0 1 0 .707L3.05 13.657a.5.5 0 0 1-.707-.707l1.414-1.414a.5.5 0 0 1 .707 0zm9.193 2.121a.5.5 0 0 1-.707 0l-1.414-1.414a.5.5 0 0 1 .707-.707l1.414 1.414a.5.5 0 0 1 0 .707zM4.464 4.465a.5.5 0 0 1-.707 0L2.343 3.05a.5.5 0 1 1 .707-.707l1.414 1.414a.5.5 0 0 1 0 .707z\" />\n </svg>\n )}\n </SwitchPrimitive.Thumb>\n </SwitchPrimitive.Root>\n </label>\n )\n}\n","import React from 'react'\n\nexport interface TopBarProps {\n /** Brand area — logo, wordmark, or app name. Rendered on the leading edge. */\n brand?: React.ReactNode\n /**\n * Centre content — primary navigation links, breadcrumb, or page title.\n * On mobile (< md breakpoint) this moves below the brand row.\n */\n center?: React.ReactNode\n /**\n * Trailing actions — theme toggle, user avatar, notification bell, etc.\n * Rendered on the trailing edge.\n */\n actions?: React.ReactNode\n /**\n * Height in pixels (default 56). Controls the `h-*` style directly so\n * child scroll-offset calculations can consume it as a CSS var.\n */\n height?: number\n /** Additional className on the root element */\n className?: string\n}\n\n/**\n * App-shell top navigation bar.\n *\n * Three named slots: brand (leading), center, actions (trailing).\n * All slots are optional — omit what you don't need.\n *\n * The component is sticky by default (`sticky top-0`) with `z-[100]`.\n * Height is exposed as `--topbar-height` CSS variable on the element so\n * layout children can reference it for scroll-offset or sticky positioning.\n *\n * Light/dark aware via Phase B semantic tokens.\n *\n * @example\n * <TopBar\n * brand={<Logo />}\n * center={<NavLinks />}\n * actions={\n * <>\n * <ThemeSwitch checked={isDark} onChange={toggleDark} />\n * <UserAvatar />\n * </>\n * }\n * />\n */\nexport default function TopBar({\n brand,\n center,\n actions,\n height = 56,\n className = '',\n}: TopBarProps) {\n return (\n <header\n className={[\n 'sticky top-0 z-[100]',\n 'flex items-center justify-between gap-4',\n 'border-b border-border bg-surface',\n 'px-4 md:px-6',\n className,\n ].join(' ')}\n style={{\n height,\n // Expose as CSS var so consumers can write:\n // padding-top: calc(var(--topbar-height) + 1rem)\n ['--topbar-height' as string]: `${height}px`,\n }}\n >\n {/* ── Brand ── */}\n {brand !== undefined ? (\n <div className=\"flex items-center gap-2 flex-shrink-0\">\n {brand}\n </div>\n ) : (\n // Reserve leading space even when brand is null so center stays centred\n <div aria-hidden=\"true\" className=\"flex-shrink-0 w-0\" />\n )}\n\n {/* ── Centre ── */}\n {center !== undefined && (\n <div className=\"flex flex-1 items-center justify-center min-w-0\">\n {center}\n </div>\n )}\n\n {/* ── Actions ── */}\n {actions !== undefined && (\n <div className=\"flex items-center gap-2 flex-shrink-0\">\n {actions}\n </div>\n )}\n </header>\n )\n}\n","import React from 'react'\nimport { motion } from 'framer-motion'\nimport Tooltip, { TooltipProvider } from './Tooltip'\n\n/** ─────────────────── types ─────────────────── */\n\nexport interface SidebarItem {\n key: string\n icon: React.ReactNode\n label: string\n isActive?: boolean\n onClick?: () => void\n /** Numeric badge shown on the icon */\n badge?: number\n}\n\nexport interface SidebarSection {\n key: string\n /** Section title — visible only when expanded */\n title?: string\n items: SidebarItem[]\n}\n\nexport interface SidebarProps {\n sections: SidebarSection[]\n isExpanded: boolean\n onToggle?: () => void\n /** Expanded sidebar width in px (default 220) */\n expandedWidth?: number\n /** Collapsed sidebar width in px (default 52) */\n collapsedWidth?: number\n /** Slot rendered at the bottom of the sidebar (theme switch, user avatar…) */\n footer?: React.ReactNode\n}\n\n/** ─────────────────── sub-components ─────────────────── */\n\nfunction NavItem({\n item,\n isExpanded,\n}: {\n item: SidebarItem\n isExpanded: boolean\n}) {\n const btn = (\n <button\n type=\"button\"\n onClick={item.onClick}\n className={[\n 'group relative flex w-full items-center gap-2.5 rounded-md',\n 'px-2.5 py-2 transition-colors duration-100',\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-inset',\n item.isActive\n ? 'bg-accent/10 text-accent'\n : 'text-foreground-secondary hover:bg-surface-raised hover:text-foreground',\n ].join(' ')}\n >\n {/* Icon */}\n <span className=\"relative flex h-5 w-5 flex-shrink-0 items-center justify-center\">\n {item.icon}\n {item.badge !== undefined && item.badge > 0 && (\n <span className=\"absolute -right-1 -top-1 flex h-3.5 w-3.5 items-center justify-center rounded-full bg-status-error text-[9px] font-bold text-white leading-none\">\n {item.badge > 99 ? '99+' : item.badge}\n </span>\n )}\n </span>\n\n {/* Label — only visible when expanded */}\n {isExpanded && (\n <motion.span\n initial={false}\n animate={{ opacity: 1 }}\n className=\"truncate text-sm font-medium\"\n >\n {item.label}\n </motion.span>\n )}\n\n {/* Active indicator bar */}\n {item.isActive && (\n <span className=\"absolute inset-y-0 left-0 w-[3px] rounded-r-full bg-accent\" />\n )}\n </button>\n )\n\n if (isExpanded) return btn\n\n return (\n <Tooltip title={item.label} placement=\"right\" delayDuration={200}>\n {btn}\n </Tooltip>\n )\n}\n\n/** ─────────────────── main component ─────────────────── */\n\n/**\n * Collapsible application sidebar.\n *\n * When collapsed: icon-only with tooltips. When expanded: icon + label.\n * Width animates with an ease-out-expo curve. The parent (AppShell) is\n * responsible for shifting the main content by the sidebar width.\n *\n * @example\n * const [open, setOpen] = useState(true)\n * <Sidebar\n * sections={NAV_SECTIONS}\n * isExpanded={open}\n * onToggle={() => setOpen(o => !o)}\n * />\n */\nexport default function Sidebar({\n sections,\n isExpanded,\n onToggle,\n expandedWidth = 220,\n collapsedWidth = 52,\n footer,\n}: SidebarProps) {\n return (\n <TooltipProvider delayDuration={200}>\n <motion.aside\n initial={false}\n animate={{ width: isExpanded ? expandedWidth : collapsedWidth }}\n transition={{ type: 'tween', duration: 0.22, ease: [0.16, 1, 0.3, 1] }}\n className=\"relative flex h-full flex-col border-r border-border bg-surface overflow-hidden flex-shrink-0\"\n >\n {/* ── Toggle button ── */}\n <div className={[\n 'flex h-14 flex-shrink-0 items-center border-b border-border',\n isExpanded ? 'justify-between px-3' : 'justify-center px-1.5',\n ].join(' ')}>\n {isExpanded && (\n <motion.span\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n transition={{ delay: 0.08 }}\n className=\"text-xs font-semibold uppercase tracking-widest text-foreground-muted select-none\"\n >\n Menu\n </motion.span>\n )}\n <Tooltip title={isExpanded ? 'Collapse menu' : 'Expand menu'} placement=\"right\" delayDuration={500}>\n <button\n type=\"button\"\n onClick={onToggle}\n aria-label={isExpanded ? 'Collapse sidebar' : 'Expand sidebar'}\n className=\"flex h-8 w-8 flex-shrink-0 items-center justify-center rounded-md text-foreground-muted hover:bg-surface-raised hover:text-foreground transition-colors duration-100 focus:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n >\n <motion.svg\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"h-4 w-4\"\n animate={{ rotate: isExpanded ? 0 : 180 }}\n transition={{ type: 'tween', duration: 0.22 }}\n >\n <path d=\"M13 5l-5 5 5 5\" />\n </motion.svg>\n </button>\n </Tooltip>\n </div>\n\n {/* ── Nav items ── */}\n <nav className=\"flex-1 overflow-y-auto overflow-x-hidden py-2 px-1.5 space-y-0.5\">\n {sections.map((section, si) => (\n <div key={section.key} className={si > 0 ? 'pt-3' : ''}>\n {/* Section title — hidden when collapsed */}\n {section.title && isExpanded && (\n <motion.p\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n transition={{ delay: 0.06 }}\n className=\"px-2.5 pb-1 text-[10px] font-semibold uppercase tracking-widest text-foreground-muted select-none\"\n >\n {section.title}\n </motion.p>\n )}\n {section.items.map((item) => (\n <NavItem key={item.key} item={item} isExpanded={isExpanded} />\n ))}\n </div>\n ))}\n </nav>\n\n {/* ── Footer slot ── */}\n {footer && (\n <div className={[\n 'flex flex-shrink-0 items-center border-t border-border py-2',\n isExpanded ? 'px-3 gap-2' : 'justify-center px-1.5',\n ].join(' ')}>\n {footer}\n </div>\n )}\n </motion.aside>\n </TooltipProvider>\n )\n}\n","import React, { useEffect, useState } from 'react'\nimport { motion, AnimatePresence } from 'framer-motion'\nimport Sidebar from './Sidebar'\nimport type { SidebarSection, SidebarProps } from './Sidebar'\nimport Portal from '../layout/Portal'\n\nexport interface AppShellProps {\n /**\n * Top navigation bar.\n * Typically `<TopBar brand={...} actions={...} />`.\n * On mobile, a hamburger button is injected to the left of this slot when\n * `sidebarSections` is non-empty. The TopBar should leave some leading space\n * (or use its `center` / `actions` props) to avoid overlap.\n */\n topBar?: React.ReactNode\n\n /** Sidebar navigation sections */\n sidebarSections?: SidebarSection[]\n\n /** Expanded width of the sidebar in px (default 220) */\n sidebarExpandedWidth?: SidebarProps['expandedWidth']\n\n /** Collapsed width of the sidebar in px (default 52) */\n sidebarCollapsedWidth?: SidebarProps['collapsedWidth']\n\n /** Start expanded (default false) */\n sidebarDefaultExpanded?: boolean\n\n /** Slot rendered at the bottom of the sidebar */\n sidebarFooter?: SidebarProps['footer']\n\n /** Main page content */\n children?: React.ReactNode\n\n /** Root element className */\n className?: string\n}\n\n/**\n * Full-page application layout skeleton.\n *\n * Composes a sticky TopBar + collapsible Sidebar + scrollable content area.\n *\n * **Responsive behaviour:**\n * - **≥ md (768 px):** Sidebar renders inline, collapsible via its own toggle.\n * - **< md (mobile):** Sidebar becomes a fixed overlay drawer. A hamburger\n * button appears to the left of the TopBar slot to open it. Tapping the\n * backdrop or the sidebar's own toggle closes it.\n *\n * @example\n * <AppShell\n * topBar={<TopBar brand={<Logo />} actions={<ThemeSwitch ... />} />}\n * sidebarSections={NAV_SECTIONS}\n * >\n * <PageContent />\n * </AppShell>\n */\nexport default function AppShell({\n topBar,\n sidebarSections = [],\n sidebarExpandedWidth = 220,\n sidebarCollapsedWidth = 52,\n sidebarDefaultExpanded = false,\n sidebarFooter,\n children,\n className = '',\n}: AppShellProps) {\n const [expanded, setExpanded] = useState(sidebarDefaultExpanded)\n const [isMobile, setIsMobile] = useState(false)\n const [mobileOpen, setMobileOpen] = useState(false)\n\n // Track mobile breakpoint\n useEffect(() => {\n const mq = window.matchMedia('(max-width: 767px)')\n const update = (e: MediaQueryList | MediaQueryListEvent) => setIsMobile(e.matches)\n update(mq)\n mq.addEventListener('change', update as (e: MediaQueryListEvent) => void)\n return () => mq.removeEventListener('change', update as (e: MediaQueryListEvent) => void)\n }, [])\n\n // Auto-close mobile sidebar on resize to desktop\n useEffect(() => {\n if (!isMobile) setMobileOpen(false)\n }, [isMobile])\n\n const hasSidebar = sidebarSections.length > 0\n\n return (\n <div className={`flex flex-col h-screen bg-background ${className}`}>\n\n {/* ── TopBar row ── */}\n {topBar && (\n <div className=\"flex-shrink-0 flex items-stretch z-topbar\">\n {/* Mobile hamburger — injected to the left of the TopBar on small screens */}\n {hasSidebar && (\n <button\n type=\"button\"\n className={[\n 'md:hidden flex-shrink-0 self-stretch flex items-center justify-center w-14',\n 'border-r border-border',\n 'text-foreground-secondary hover:bg-surface-raised hover:text-foreground',\n 'transition-colors duration-100',\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-accent',\n ].join(' ')}\n onClick={() => setMobileOpen((o) => !o)}\n aria-label={mobileOpen ? 'Close navigation' : 'Open navigation'}\n aria-expanded={mobileOpen}\n >\n {mobileOpen ? (\n /* X icon */\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" aria-hidden=\"true\">\n <path d=\"M18 6 6 18M6 6l12 12\" />\n </svg>\n ) : (\n /* Hamburger icon */\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" aria-hidden=\"true\">\n <path d=\"M4 6h16M4 12h16M4 18h16\" />\n </svg>\n )}\n </button>\n )}\n {/* TopBar fills remaining width */}\n <div className=\"flex-1 min-w-0\">\n {topBar}\n </div>\n </div>\n )}\n\n {/* ── Body row: Sidebar + Content ── */}\n <div className=\"flex flex-1 overflow-hidden\">\n\n {/* Desktop inline sidebar */}\n {hasSidebar && !isMobile && (\n <Sidebar\n sections={sidebarSections}\n isExpanded={expanded}\n onToggle={() => setExpanded((e) => !e)}\n expandedWidth={sidebarExpandedWidth}\n collapsedWidth={sidebarCollapsedWidth}\n footer={sidebarFooter}\n />\n )}\n\n {/* Mobile sidebar overlay — portaled to <body> so the fixed\n backdrop and drawer always cover the real viewport, never\n a transformed/contained ancestor (page-transition libs,\n CSS `contain`, parent `will-change`, etc.). */}\n {hasSidebar && isMobile && (\n <Portal>\n {/* Backdrop */}\n <AnimatePresence>\n {mobileOpen && (\n <motion.div\n className=\"fixed inset-0 bg-black/40 z-overlay md:hidden\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.2, ease: 'easeOut' }}\n onClick={() => setMobileOpen(false)}\n aria-hidden=\"true\"\n />\n )}\n </AnimatePresence>\n\n {/* Sidebar panel */}\n <AnimatePresence>\n {mobileOpen && (\n <motion.div\n className=\"fixed inset-y-0 left-0 z-modal md:hidden\"\n initial={{ x: '-100%' }}\n animate={{ x: 0 }}\n exit={{ x: '-100%' }}\n transition={{\n type: 'tween',\n duration: 0.26,\n ease: [0.16, 1, 0.3, 1], // ease-out-expo\n }}\n >\n <Sidebar\n sections={sidebarSections}\n isExpanded={true}\n onToggle={() => setMobileOpen(false)}\n expandedWidth={sidebarExpandedWidth}\n collapsedWidth={sidebarCollapsedWidth}\n footer={sidebarFooter}\n />\n </motion.div>\n )}\n </AnimatePresence>\n </Portal>\n )}\n\n {/* Main content */}\n <main className=\"flex-1 overflow-y-auto overflow-x-hidden\">\n <div className=\"h-full p-6\">\n {children}\n </div>\n </main>\n </div>\n </div>\n )\n}\n\n// Re-export SidebarSection for consumer convenience\nexport type { SidebarSection, SidebarItem } from './Sidebar'\n","import React, { useEffect, useMemo, useRef } from 'react'\n\n// ─── Theme config types ───────────────────────────────────────────────────────\n\nexport interface ThemeColors {\n background?: string\n surface?: string\n 'surface-raised'?: string\n border?: string\n 'border-strong'?: string\n foreground?: string\n 'foreground-secondary'?: string\n 'foreground-muted'?: string\n accent?: string\n 'accent-hover'?: string\n 'accent-foreground'?: string\n error?: string\n warning?: string\n success?: string\n info?: string\n}\n\nexport interface ThemeRadius {\n sm?: string | number\n md?: string | number\n lg?: string | number\n xl?: string | number\n '2xl'?: string | number\n full?: string | number\n}\n\nexport interface ThemeShadows {\n sm?: string\n md?: string\n lg?: string\n xl?: string\n}\n\nexport interface ThemeTypography {\n /** e.g. '\"Geist\", sans-serif' */\n fontFamily?: string\n fontSizeXs?: string\n fontSizeSm?: string\n fontSizeBase?: string\n fontSizeLg?: string\n fontSizeXl?: string\n fontSize2xl?: string\n fontSize3xl?: string\n fontWeightNormal?: number | string\n fontWeightMedium?: number | string\n fontWeightSemibold?: number | string\n fontWeightBold?: number | string\n lineHeightTight?: number | string\n lineHeightSnug?: number | string\n lineHeightNormal?: number | string\n lineHeightRelaxed?: number | string\n}\n\nexport interface ThemeDensity {\n /** Height of xs control (icon buttons, tiny chips). Default: 24px */\n controlXs?: string | number\n /** Height of sm control (small inputs/buttons). Default: 28px */\n controlSm?: string | number\n /** Height of md control (default inputs/buttons). Default: 36px */\n controlMd?: string | number\n /** Height of lg control (large touch targets). Default: 44px */\n controlLg?: string | number\n /** TopBar height. Default: 56px */\n topbar?: string | number\n}\n\nexport interface ThemeMotion {\n durationFast?: string\n durationNormal?: string\n durationSlow?: string\n durationGentle?: string\n}\n\n/**\n * Partial theme override configuration.\n * Every field is optional — only the keys you provide are overridden.\n */\nexport interface ThemeConfig {\n colors?: ThemeColors\n radius?: ThemeRadius\n shadows?: ThemeShadows\n typography?: ThemeTypography\n density?: ThemeDensity\n motion?: ThemeMotion\n}\n\nexport interface ThemeProviderProps {\n /**\n * Token overrides applied in both light and dark mode (on top of the defaults).\n * For dark-specific overrides see `darkTheme`.\n */\n theme?: ThemeConfig\n\n /**\n * Additional token overrides applied only when the wrapper element carries\n * the `.dark` class (i.e. when `colorScheme=\"dark\"` or when a parent sets `.dark`).\n * Injected via a scoped `<style>` tag — no inline-style limitations.\n */\n darkTheme?: ThemeConfig\n\n /**\n * Managed color scheme.\n * - `'light'` — removes `.dark` class from the wrapper\n * - `'dark'` — adds `.dark` class to the wrapper\n * - `'system'` — follows `prefers-color-scheme` media query\n * - `'auto'` — do nothing; inherit from an ancestor (default)\n */\n colorScheme?: 'light' | 'dark' | 'system' | 'auto'\n\n children: React.ReactNode\n className?: string\n style?: React.CSSProperties\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction px(v: string | number): string {\n return typeof v === 'number' ? `${v}px` : v\n}\n\nfunction str(v: string | number | undefined): string | undefined {\n return v == null ? undefined : String(v)\n}\n\nfunction toCssVars(theme?: ThemeConfig): Record<string, string> {\n if (!theme) return {}\n const out: Record<string, string> = {}\n\n if (theme.colors) {\n for (const [k, v] of Object.entries(theme.colors)) {\n if (v != null) out[`--color-${k}`] = v\n }\n }\n if (theme.radius) {\n for (const [k, v] of Object.entries(theme.radius)) {\n if (v != null) out[`--radius-${k}`] = px(v)\n }\n }\n if (theme.shadows) {\n for (const [k, v] of Object.entries(theme.shadows)) {\n if (v != null) out[`--shadow-${k}`] = v\n }\n }\n if (theme.typography) {\n const t = theme.typography\n const map: [string, string | number | undefined][] = [\n ['--font-family-sans', t.fontFamily],\n ['--font-size-xs', t.fontSizeXs],\n ['--font-size-sm', t.fontSizeSm],\n ['--font-size-base', t.fontSizeBase],\n ['--font-size-lg', t.fontSizeLg],\n ['--font-size-xl', t.fontSizeXl],\n ['--font-size-2xl', t.fontSize2xl],\n ['--font-size-3xl', t.fontSize3xl],\n ['--font-weight-normal', t.fontWeightNormal],\n ['--font-weight-medium', t.fontWeightMedium],\n ['--font-weight-semibold', t.fontWeightSemibold],\n ['--font-weight-bold', t.fontWeightBold],\n ['--line-height-tight', t.lineHeightTight],\n ['--line-height-snug', t.lineHeightSnug],\n ['--line-height-normal', t.lineHeightNormal],\n ['--line-height-relaxed', t.lineHeightRelaxed],\n ]\n for (const [cssVar, val] of map) {\n const s = str(val)\n if (s != null) out[cssVar] = s\n }\n }\n if (theme.density) {\n const d = theme.density\n const map: [string, string | number | undefined][] = [\n ['--height-control-xs', d.controlXs],\n ['--height-control-sm', d.controlSm],\n ['--height-control-md', d.controlMd],\n ['--height-control-lg', d.controlLg],\n ['--height-topbar', d.topbar],\n ]\n for (const [cssVar, val] of map) {\n if (val != null) out[cssVar] = px(val)\n }\n }\n if (theme.motion) {\n const m = theme.motion\n const map: [string, string | undefined][] = [\n ['--duration-fast', m.durationFast],\n ['--duration-normal', m.durationNormal],\n ['--duration-slow', m.durationSlow],\n ['--duration-gentle', m.durationGentle],\n ]\n for (const [cssVar, val] of map) {\n if (val != null) out[cssVar] = val\n }\n }\n\n return out\n}\n\n// ── XSS-safe CSS-value sanitiser ─────────────────────────────────────────────\n// The dark-theme CSS vars are serialised into a `<style>` block via\n// `dangerouslySetInnerHTML`. If a consumer-supplied value contained `</style>`,\n// `;`, or `}`, it would close the style block early and let arbitrary HTML\n// (including `<script>`) execute. We allow normal CSS value characters\n// (letters, digits, punctuation needed for `rgb()`, `oklch()`, multi-word\n// font-family lists, etc.) but reject the characters that can break CSS\n// escaping — including comment delimiters and the backslash hex-escape.\n//\n// React inline `style={…}` values do NOT need this check: React applies them\n// as DOM `.style.<prop> = value`, where a malicious value can only affect\n// that single property and cannot break out into siblings.\nconst CSS_VALUE_REJECT_RE = /[;{}<>\\\\]|\\*\\/|\\/\\*/\n\nfunction isSafeCssValue(v: unknown): v is string {\n if (typeof v !== 'string') return false\n if (v.length > 500) return false // unreasonable values are suspicious\n return !CSS_VALUE_REJECT_RE.test(v)\n}\n\nfunction varsToStyleString(vars: Record<string, string>): string {\n const out: string[] = []\n for (const [k, v] of Object.entries(vars)) {\n if (!isSafeCssValue(v)) {\n // Warn unconditionally — these values are a security risk; the\n // consumer needs to fix them in both dev and prod. (We don't\n // gate on `process.env.NODE_ENV` because that's not always\n // defined in browser bundles.)\n console.warn(\n `[ThemeProvider] Dropping unsafe value for \"${k}\". ` +\n `Theme values may contain letters, digits, and CSS punctuation ` +\n `but must not include: ; { } < > \\\\ /* */`,\n )\n continue\n }\n out.push(`${k}: ${v};`)\n }\n return out.join(' ')\n}\n\n// ─── Component ───────────────────────────────────────────────────────────────\n\n/**\n * Scoped theme provider.\n *\n * Wraps children in a `<div>` that carries CSS custom-property overrides\n * as inline styles. A scoped `<style>` tag handles dark-mode overrides.\n *\n * @example Basic brand color swap\n * <ThemeProvider theme={{ colors: { accent: '#e63946', 'accent-hover': '#c1121f' } }}>\n * <App />\n * </ThemeProvider>\n *\n * @example Compact density + custom font\n * <ThemeProvider\n * theme={{\n * density: { controlMd: 30, controlLg: 38, topbar: 48 },\n * typography: { fontFamily: '\"Geist\", sans-serif' },\n * }}\n * >\n * <Dashboard />\n * </ThemeProvider>\n *\n * @example Managed dark mode\n * <ThemeProvider\n * colorScheme=\"dark\"\n * theme={{ colors: { accent: '#60a5fa' } }}\n * darkTheme={{ colors: { accent: '#93c5fd' } }}\n * >\n * <App />\n * </ThemeProvider>\n */\nexport default function ThemeProvider({\n theme,\n darkTheme,\n colorScheme = 'auto',\n children,\n className = '',\n style,\n}: ThemeProviderProps) {\n const id = React.useId().replace(/:/g, '')\n const scopeClass = `geo-th-${id}`\n\n const divRef = useRef<HTMLDivElement>(null)\n\n // ── Managed color scheme ─────────────────────────────────────────────────\n useEffect(() => {\n const el = divRef.current\n if (!el) return\n\n if (colorScheme === 'auto') return\n\n if (colorScheme === 'system') {\n const mq = window.matchMedia('(prefers-color-scheme: dark)')\n const apply = (e: MediaQueryListEvent | MediaQueryList) => {\n el.classList.toggle('dark', e.matches)\n }\n apply(mq)\n mq.addEventListener('change', apply)\n return () => mq.removeEventListener('change', apply)\n }\n\n el.classList.toggle('dark', colorScheme === 'dark')\n }, [colorScheme])\n\n // ── Inline CSS vars (light + always-on overrides) ────────────────────────\n const lightVars = useMemo(() => toCssVars(theme), [theme])\n\n // ── Scoped dark-mode override via injected <style> ───────────────────────\n const darkVarStr = useMemo(() => {\n if (!darkTheme) return ''\n const dvars = toCssVars(darkTheme)\n if (!Object.keys(dvars).length) return ''\n return `.${scopeClass}.dark { ${varsToStyleString(dvars)} }`\n // scopeClass is stable (derived from useId); only darkTheme matters\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [darkTheme])\n\n return (\n <>\n {darkVarStr && (\n <style dangerouslySetInnerHTML={{ __html: darkVarStr }} />\n )}\n <div\n ref={divRef}\n className={`${scopeClass} ${className}`.trim()}\n style={{ ...(lightVars as React.CSSProperties), ...style }}\n >\n {children}\n </div>\n </>\n )\n}\n","import React from 'react'\n\n/** ─────────────────── base ─────────────────── */\n\ninterface SkeletonBaseProps {\n className?: string\n /** Override inline styles */\n style?: React.CSSProperties\n}\n\n// Shared shimmer classes — a semi-transparent sheen sweeps across the\n// surface-raised base via a `::before` pseudo-element.\n//\n// Previously the shimmer used `bg-gradient-to-r from-border via-border-strong/40 to-border`\n// — Tailwind's `/40` opacity modifier does not produce a valid colour when the\n// underlying token is a hex-valued CSS var (the case for all our semantic\n// tokens), so the gradient resolved to a flat single colour and no movement\n// was visible. The pseudo-element approach uses `white/30` which Tailwind\n// handles correctly (white is a hex literal in the palette), and transforms\n// instead of background-position so it composites on the GPU.\nconst SHIMMER = [\n 'relative overflow-hidden rounded-sm bg-surface-raised',\n 'before:absolute before:inset-0 before:content-[\"\"]',\n 'before:bg-gradient-to-r before:from-transparent before:via-white/30 before:to-transparent',\n 'before:animate-[shimmer_1.6s_linear_infinite]',\n // Respect prefers-reduced-motion — the resting bg-surface-raised is still\n // a perfectly legible placeholder for users who have animations off.\n 'motion-reduce:before:hidden',\n].join(' ')\n\n/** ─────────────────── SkeletonBox ─────────────────── */\n\nexport interface SkeletonBoxProps extends SkeletonBaseProps {\n width?: number | string\n height?: number | string\n /** Override border-radius (defaults to token --radius-md) */\n radius?: number | string\n}\n\n/**\n * Generic rectangular loading placeholder.\n * Use for images, cards, headers, or any block element.\n *\n * @example\n * <SkeletonBox width={240} height={160} />\n * <SkeletonBox width=\"100%\" height={48} radius=\"var(--radius-lg)\" />\n */\nexport function SkeletonBox({ width, height = 16, radius, className = '', style }: SkeletonBoxProps) {\n return (\n <span\n role=\"presentation\"\n aria-hidden=\"true\"\n className={`block ${SHIMMER} ${className}`}\n style={{\n width: width ?? '100%',\n height,\n borderRadius: radius ?? 'var(--radius-md)',\n ...style,\n }}\n />\n )\n}\n\n/** ─────────────────── SkeletonText ─────────────────── */\n\nexport interface SkeletonTextProps extends SkeletonBaseProps {\n /** Number of lines (default 3) */\n lines?: number\n /** Width of the last (shortest) line as a percentage (default 60) */\n lastLineWidth?: number\n /** Line height in px (default 14) */\n lineHeight?: number\n /** Gap between lines in px (default 8) */\n gap?: number\n}\n\n/**\n * Multi-line text loading placeholder.\n * Last line is shorter to mimic real paragraph layout.\n *\n * @example\n * <SkeletonText lines={4} lastLineWidth={45} />\n */\nexport function SkeletonText({\n lines = 3,\n lastLineWidth = 60,\n lineHeight = 14,\n gap = 8,\n className = '',\n style,\n}: SkeletonTextProps) {\n return (\n <div\n role=\"presentation\"\n aria-hidden=\"true\"\n className={`flex flex-col ${className}`}\n style={{ gap, ...style }}\n >\n {Array.from({ length: lines }).map((_, i) => {\n const isLast = i === lines - 1\n const width = isLast && lines > 1 ? `${lastLineWidth}%` : '100%'\n return (\n <span\n key={i}\n className={`block ${SHIMMER}`}\n style={{ height: lineHeight, width, borderRadius: 'var(--radius-sm)' }}\n />\n )\n })}\n </div>\n )\n}\n\n/** ─────────────────── SkeletonCircle ─────────────────── */\n\nexport interface SkeletonCircleProps extends SkeletonBaseProps {\n /** Diameter in px (default 40) */\n size?: number\n}\n\n/**\n * Circular loading placeholder — avatars, icons, status indicators.\n *\n * @example\n * <SkeletonCircle size={48} />\n */\nexport function SkeletonCircle({ size = 40, className = '', style }: SkeletonCircleProps) {\n return (\n <span\n role=\"presentation\"\n aria-hidden=\"true\"\n className={`block flex-shrink-0 ${SHIMMER} ${className}`}\n style={{\n width: size,\n height: size,\n borderRadius: '50%',\n ...style,\n }}\n />\n )\n}\n\n/** ─────────────────── SkeletonCard ─────────────────── */\n\nexport interface SkeletonCardProps extends SkeletonBaseProps {\n /** Include a circular avatar in the header (default true) */\n hasAvatar?: boolean\n /** Number of text lines in the body (default 3) */\n lines?: number\n}\n\n/**\n * Composite card skeleton — avatar + heading + body text + action strip.\n * Use as a drop-in while real card data loads.\n *\n * @example\n * <div className=\"grid grid-cols-3 gap-4\">\n * {loading && Array.from({ length: 3 }).map((_, i) => <SkeletonCard key={i} />)}\n * </div>\n */\nexport function SkeletonCard({ hasAvatar = true, lines = 3, className = '', style }: SkeletonCardProps) {\n return (\n <div\n role=\"presentation\"\n aria-hidden=\"true\"\n className={`rounded-lg border border-border bg-surface p-4 ${className}`}\n style={style}\n >\n {/* Header row */}\n <div className=\"flex items-center gap-3 mb-4\">\n {hasAvatar && <SkeletonCircle size={36} />}\n <div className=\"flex-1 flex flex-col gap-2\">\n <SkeletonBox height={12} width=\"55%\" />\n <SkeletonBox height={10} width=\"35%\" />\n </div>\n </div>\n\n {/* Body text */}\n <SkeletonText lines={lines} lastLineWidth={55} />\n\n {/* Action strip */}\n <div className=\"mt-4 flex gap-2\">\n <SkeletonBox height={28} width={72} />\n <SkeletonBox height={28} width={56} />\n </div>\n </div>\n )\n}\n","import React, { useId } from 'react'\n\nexport interface TextInputProps {\n value?: string\n onChange?: React.ChangeEventHandler<HTMLInputElement>\n disabled?: boolean\n label?: React.ReactNode\n htmlFor?: string\n placeholder?: string\n name?: string\n inputStyle?: React.CSSProperties\n style?: React.CSSProperties\n /** Label/input orientation. Defaults to `'horizontal'`. */\n layout?: 'horizontal' | 'vertical'\n onBlur?: React.FocusEventHandler<HTMLInputElement>\n errorMessage?: React.ReactNode\n labelColor?: string\n id?: string\n}\n\n/**\n * Standard text input with label and validation message.\n */\nexport default function TextInput({\n value,\n onChange,\n disabled,\n label,\n htmlFor,\n placeholder,\n name,\n inputStyle,\n style,\n layout,\n onBlur,\n errorMessage,\n labelColor,\n}: TextInputProps) {\n // `useId` gives us a stable, SSR-safe id for the error region so that\n // `aria-describedby` on the input can point at it. The id only matters\n // when an error is actually being announced.\n const errorId = useId()\n const hasError = errorMessage != null\n\n return (\n <div className=\"relative flex flex-col items-center justify-center\">\n <div\n className={`flex ${layout === 'vertical' ? 'flex-col' : 'flex-row items-center gap-2'}`}\n style={style ?? {}}\n >\n {label && (\n // Render <label> only when a label is provided. An empty\n // <label htmlFor=…> announces as an unlabeled control in\n // some screen readers.\n <label\n style={{ color: labelColor || undefined }}\n className={`text-sm font-medium ml-1 max-content ${!labelColor && 'text-foreground'}`}\n htmlFor={htmlFor}\n >\n {label}\n </label>\n )}\n <input\n autoComplete=\"off\"\n disabled={disabled}\n value={value}\n onChange={onChange}\n onBlur={onBlur}\n type=\"text\"\n name={name}\n id={htmlFor}\n aria-invalid={hasError || undefined}\n aria-describedby={hasError ? errorId : undefined}\n className={`${hasError ? 'border border-status-error' : 'border border-border'} bg-surface text-foreground p-2 h-9 w-60 mt-1 rounded-lg disabled:bg-surface-raised disabled:text-foreground-muted disabled:cursor-not-allowed focus:outline-none focus:border-transparent focus:ring-2 focus:ring-accent transition-colors`}\n style={inputStyle ?? {}}\n placeholder={placeholder ?? ''}\n />\n </div>\n {/* Error region is keyed to the input via aria-describedby. Only\n rendered when there is an actual error so screen readers don't\n read empty descriptions. */}\n {hasError && (\n <div id={errorId} className=\"text-center text-status-error text-xs mt-1\">\n {errorMessage}\n </div>\n )}\n </div>\n )\n}\n","import React, { useId } from 'react'\n\nexport interface NumberInputProps {\n /** Step size for the up/down buttons and native arrow-key handling. Default `1`. */\n step?: number\n /** Current value. `undefined` renders an empty field; a number renders that value. */\n value?: number | ''\n /** Fires with the next number. Empty input resolves to `undefined`. */\n onChange?: (e: { target: { value: number | undefined; id?: string; name?: string } }) => void\n label?: React.ReactNode\n htmlFor?: string\n name?: string\n disabled?: boolean\n /** Label/input orientation. Defaults to `'horizontal'`. */\n layout?: 'horizontal' | 'vertical'\n errorMessage?: React.ReactNode\n inputStyle?: React.CSSProperties\n labelStyle?: React.CSSProperties\n placeholder?: string\n style?: React.CSSProperties\n min?: number\n max?: number\n readOnly?: boolean\n /** Optional precision for floating-point steps (number of decimal places to round to). */\n precision?: number\n}\n\n/**\n * Numeric input with keyboard-accessible increment / decrement buttons.\n *\n * **What's improved over the previous version**\n * - Step buttons are real `<button>` elements with `aria-label`, focus rings,\n * and proper keyboard activation (Enter / Space). The previous version used\n * `<span onClick>` which keyboard-only users could not reach.\n * - Floating-point drift on decimal steps (`0.1 + 0.2 = 0.30000000000000004`)\n * is rounded out via a `precision` prop or auto-inferred from the step.\n * - Empty input resolves to `undefined` instead of `NaN` — works with form\n * libraries (RHF, Formik) that treat empty as \"no value\".\n * - The decrement chevron actually points down (the previous SVG was the up\n * chevron rotated, with the up chevron itself wrongly using the same path).\n * - Width is a prop, not hardcoded `w-60`. Default is `w-full` so the input\n * flows with its parent.\n *\n * @example\n * ```tsx\n * const [qty, setQty] = useState<number | undefined>(1)\n * <NumberInput\n * label=\"Quantity\"\n * value={qty ?? ''}\n * onChange={({ target }) => setQty(target.value)}\n * min={0} max={99}\n * />\n * ```\n *\n * @example Decimal step\n * ```tsx\n * <NumberInput label=\"Tonnage\" step={0.25} precision={2} />\n * ```\n */\nexport default function NumberInput({\n step = 1,\n value,\n onChange,\n label,\n htmlFor,\n name,\n disabled,\n layout = 'horizontal',\n errorMessage,\n inputStyle,\n labelStyle,\n placeholder,\n style,\n min,\n max,\n readOnly = false,\n precision,\n}: NumberInputProps) {\n const errorId = useId()\n const hasError = errorMessage != null\n\n // Auto-infer precision from step (the count of decimal digits) when the\n // consumer hasn't supplied one. Keeps stepping clean for fractional steps\n // like 0.1 / 0.25 / 0.5 without forcing the consumer to think about FP drift.\n const inferredPrecision = precision ?? (\n Number.isInteger(step) ? 0 : (String(step).split('.')[1]?.length ?? 0)\n )\n\n const round = (n: number) => {\n if (inferredPrecision === 0) return n\n const factor = 10 ** inferredPrecision\n return Math.round(n * factor) / factor\n }\n\n // `value` may be number or '' (empty). Parse to number for arithmetic;\n // empty treated as 0 to allow stepping up from a cleared field.\n const numeric = typeof value === 'number' ? value : 0\n\n const onIncrement = () => {\n if (disabled || readOnly) return\n const next = round(numeric + step)\n if (max !== undefined && next > max) return\n onChange?.({ target: { value: next, id: htmlFor, name } })\n }\n\n const onDecrement = () => {\n if (disabled || readOnly) return\n const next = round(numeric - step)\n if (min !== undefined && next < min) return\n onChange?.({ target: { value: next, id: htmlFor, name } })\n }\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const raw = e.target.value\n if (raw === '') {\n onChange?.({ target: { value: undefined, id: htmlFor, name } })\n return\n }\n const parsed = Number(raw)\n if (Number.isNaN(parsed)) return\n onChange?.({ target: { value: round(parsed), id: htmlFor, name } })\n }\n\n return (\n <div className=\"flex flex-col gap-1\">\n <div className={`flex ${layout === 'vertical' ? 'flex-col gap-1' : 'flex-row items-center gap-2'}`}>\n {label && (\n <label\n className=\"text-sm font-medium ml-1 max-content select-none text-foreground\"\n style={labelStyle}\n htmlFor={htmlFor}\n >\n {label}\n </label>\n )}\n <div\n style={style}\n className={`flex items-center rounded-lg border overflow-hidden ${hasError ? 'border-status-error' : 'border-border'} ${disabled ? 'bg-surface-raised text-foreground-muted cursor-not-allowed' : 'bg-surface text-foreground'} focus-within:border-transparent focus-within:ring-2 focus-within:ring-accent transition-colors`}\n >\n <input\n min={min}\n max={max}\n autoComplete=\"off\"\n disabled={disabled}\n name={name}\n id={htmlFor}\n step={step}\n value={value ?? ''}\n onChange={handleInputChange}\n type=\"number\"\n aria-invalid={hasError || undefined}\n aria-describedby={hasError ? errorId : undefined}\n className=\"bg-transparent focus:outline-none h-9 w-full px-3 disabled:cursor-not-allowed [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none\"\n style={inputStyle ?? {}}\n placeholder={placeholder ?? ''}\n readOnly={readOnly}\n />\n <div className=\"flex flex-col border-l border-border h-9\">\n <button\n type=\"button\"\n tabIndex={-1}\n onClick={onIncrement}\n disabled={disabled || readOnly || (max !== undefined && numeric >= max)}\n aria-label=\"Increase value\"\n className=\"flex-1 px-1.5 flex items-center justify-center hover:bg-surface-raised disabled:opacity-30 disabled:cursor-not-allowed transition-colors focus:outline-none focus-visible:bg-surface-raised\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2.5} className=\"h-3 w-3\" aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 15l7-7 7 7\" />\n </svg>\n </button>\n <button\n type=\"button\"\n tabIndex={-1}\n onClick={onDecrement}\n disabled={disabled || readOnly || (min !== undefined && numeric <= min)}\n aria-label=\"Decrease value\"\n className=\"flex-1 px-1.5 flex items-center justify-center hover:bg-surface-raised disabled:opacity-30 disabled:cursor-not-allowed transition-colors focus:outline-none focus-visible:bg-surface-raised border-t border-border\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2.5} className=\"h-3 w-3\" aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n </div>\n </div>\n </div>\n {hasError && (\n <div id={errorId} className=\"text-xs text-status-error ml-1\">\n {errorMessage}\n </div>\n )}\n </div>\n )\n}\n","import React, { useId, useState } from 'react'\n\nexport interface PasswordProps {\n value?: string\n onChange?: React.ChangeEventHandler<HTMLInputElement>\n disabled?: boolean\n label?: React.ReactNode\n htmlFor?: string\n placeholder?: string\n name?: string\n inputStyle?: React.CSSProperties\n style?: React.CSSProperties\n /** Label/input orientation. Defaults to `'horizontal'`. */\n layout?: 'horizontal' | 'vertical'\n onBlur?: React.FocusEventHandler<HTMLInputElement>\n errorMessage?: React.ReactNode\n labelColor?: string\n iconColor?: string\n}\n\n/**\n * Password input with show/hide toggle.\n */\nexport default function Password({\n value,\n onChange,\n disabled,\n label,\n htmlFor,\n placeholder,\n name,\n inputStyle,\n style,\n layout,\n onBlur,\n errorMessage,\n labelColor,\n iconColor,\n}: PasswordProps) {\n const [passwordVisible, setPasswordVisible] = useState(false)\n // Stable, SSR-safe id for the error region — `aria-describedby` on the\n // input points here so screen readers announce the validation message.\n const errorId = useId()\n const hasError = errorMessage != null\n\n return (\n <div className=\"relative flex flex-col items-center justify-center\" style={style ?? {}}>\n <div className={`flex ${layout === 'vertical' ? 'flex-col' : 'flex-row items-center gap-2'}`}>\n {label && (\n <label\n style={{ color: labelColor || undefined }}\n className={`text-sm font-medium ml-1 max-content ${!labelColor && 'text-foreground'}`}\n htmlFor={htmlFor}\n >\n {label}\n </label>\n )}\n <div className=\"flex items-center gap-1\">\n <input\n autoComplete=\"off\"\n disabled={disabled}\n value={value}\n onChange={onChange}\n onBlur={onBlur}\n type={passwordVisible ? 'text' : 'password'}\n name={name}\n id={htmlFor}\n aria-invalid={hasError || undefined}\n aria-describedby={hasError ? errorId : undefined}\n className={`${hasError ? 'border border-status-error' : 'border border-border'} bg-surface text-foreground p-2 h-9 w-52 mt-1 rounded-lg disabled:bg-surface-raised disabled:text-foreground-muted disabled:cursor-not-allowed focus:outline-none focus:border-transparent focus:ring-2 focus:ring-accent transition-colors`}\n style={inputStyle ?? {}}\n placeholder={placeholder ?? ''}\n />\n <button\n type=\"button\"\n className=\"cursor-pointer p-1 text-foreground-secondary hover:text-foreground rounded-md focus:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n style={iconColor ? { color: iconColor } : undefined}\n onClick={() => setPasswordVisible(!passwordVisible)}\n aria-label={passwordVisible ? 'Hide password' : 'Show password'}\n >\n {passwordVisible ? (\n /* EyeSlash */\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"w-6 h-6\">\n <path d=\"M3.53 2.47a.75.75 0 00-1.06 1.06l18 18a.75.75 0 101.06-1.06l-18-18zM22.676 12.553a11.249 11.249 0 01-2.631 4.31l-3.099-3.099a5.25 5.25 0 00-6.71-6.71L7.759 4.577a11.217 11.217 0 014.242-.827c4.97 0 9.185 3.223 10.675 7.69.12.362.12.752 0 1.113z\" />\n <path d=\"M15.75 12c0 .18-.013.357-.037.53l-4.244-4.243A3.75 3.75 0 0115.75 12zM12.53 15.713l-4.243-4.244a3.75 3.75 0 004.243 4.243z\" />\n <path d=\"M6.75 12c0-.619.107-1.213.304-1.764l-3.1-3.1a11.25 11.25 0 00-2.63 4.31c-.12.362-.12.752 0 1.114 1.489 4.467 5.704 7.69 10.675 7.69 1.5 0 2.933-.294 4.242-.827l-2.477-2.477A5.25 5.25 0 016.75 12z\" />\n </svg>\n ) : (\n /* Eye */\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"w-6 h-6\">\n <path d=\"M12 15a3 3 0 100-6 3 3 0 000 6z\" />\n <path fillRule=\"evenodd\" d=\"M1.323 11.447C2.811 6.976 7.028 3.75 12.001 3.75c4.97 0 9.185 3.223 10.675 7.69.12.362.12.752 0 1.113-1.487 4.471-5.705 7.697-10.677 7.697-4.97 0-9.186-3.223-10.675-7.69a1.762 1.762 0 010-1.113zM17.25 12a5.25 5.25 0 11-10.5 0 5.25 5.25 0 0110.5 0z\" clipRule=\"evenodd\" />\n </svg>\n )}\n </button>\n </div>\n </div>\n {/* Error region keyed to the input via aria-describedby. */}\n {hasError && (\n <div id={errorId} className=\"text-center text-status-error text-xs mt-1\">\n {errorMessage}\n </div>\n )}\n </div>\n )\n}\n","import React from 'react'\nimport * as CheckboxPrimitive from '@radix-ui/react-checkbox'\n\nexport interface CheckboxProps {\n /** Controlled checked state */\n checked?: boolean\n onChange?: (e: { target: { checked: boolean; id?: string; name?: string } }) => void\n label?: React.ReactNode\n name?: string\n /** `id` for the hidden input and the `<label htmlFor>` link */\n htmlFor?: string\n errorMessage?: React.ReactNode\n disabled?: boolean\n /** @deprecated Use `checked` */\n value?: boolean\n}\n\n/**\n * Accessible checkbox powered by Radix Checkbox.\n *\n * Radix handles keyboard activation, focus ring, and `role=\"checkbox\"` ARIA.\n * The check mark pops in with a spring animation on first check.\n *\n * @example\n * <Checkbox\n * htmlFor=\"agree\"\n * label=\"I agree to the terms\"\n * checked={form.agree}\n * onChange={({ target }) => setField('agree', target.checked)}\n * />\n */\nexport default function Checkbox({\n checked,\n value, // legacy alias\n onChange,\n label,\n name,\n htmlFor,\n errorMessage,\n disabled = false,\n}: CheckboxProps) {\n // Support legacy `value` prop transparently\n const isChecked = checked ?? value ?? false\n\n return (\n <div className=\"flex flex-col gap-1\">\n <label\n htmlFor={htmlFor}\n className={[\n 'inline-flex items-center gap-2.5',\n disabled ? 'cursor-not-allowed opacity-50' : 'cursor-pointer',\n ].join(' ')}\n >\n <CheckboxPrimitive.Root\n id={htmlFor}\n name={name}\n checked={isChecked}\n disabled={disabled}\n onCheckedChange={(c) =>\n onChange?.({ target: { checked: !!c, id: htmlFor, name } })\n }\n className={[\n // Box\n 'relative flex h-[18px] w-[18px] flex-shrink-0 items-center justify-center',\n 'rounded-sm border transition-colors duration-150',\n // Unchecked\n 'border-border-strong bg-surface',\n // Checked\n 'data-[state=checked]:bg-accent data-[state=checked]:border-accent',\n // Focus\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-1',\n // Disabled\n 'disabled:cursor-not-allowed',\n ].join(' ')}\n aria-label={typeof label === 'string' ? label : undefined}\n >\n <CheckboxPrimitive.Indicator\n className=\"flex items-center justify-center data-[state=checked]:animate-check-pop\"\n >\n {/* Check mark */}\n <svg\n width=\"11\"\n height=\"9\"\n viewBox=\"0 0 11 9\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M1 4.5L4 7.5L10 1\"\n stroke=\"white\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n\n {label && (\n <span className=\"text-sm text-foreground-secondary select-none leading-snug\">\n {label}\n </span>\n )}\n </label>\n\n {errorMessage && (\n <span className=\"text-xs text-status-error pl-[26px]\">{errorMessage}</span>\n )}\n </div>\n )\n}\n","import React, { useId } from 'react'\nimport * as SwitchPrimitive from '@radix-ui/react-switch'\n\nexport interface SwitchInputProps {\n checked?: boolean\n onChange?: (e: { target: { checked: boolean } }) => void\n checkedIcon?: React.ReactNode\n uncheckedIcon?: React.ReactNode\n}\n\n/**\n * Form switch (on/off toggle) powered by Radix Switch.\n *\n * Radix handles keyboard activation, focus ring, and `role=\"switch\"` ARIA.\n * Accepts optional icon slots for the thumb in checked/unchecked states.\n *\n * Emits `{ target: { checked } }` for compatibility with existing handlers.\n *\n * @example\n * <Switch\n * checked={form.enabled}\n * onChange={({ target }) => setField('enabled', target.checked)}\n * />\n */\nexport default function Switch({\n checked = false,\n onChange,\n checkedIcon,\n uncheckedIcon,\n}: SwitchInputProps) {\n const id = useId()\n\n return (\n <div>\n {/* Spacing is the parent's responsibility — no baked-in margins. */}\n <label htmlFor={id} className=\"flex items-center cursor-pointer select-none\">\n <SwitchPrimitive.Root\n id={id}\n checked={checked}\n onCheckedChange={(c) => onChange?.({ target: { checked: c } })}\n className=\"relative inline-flex h-6 w-14 items-center rounded-full bg-foreground-secondary data-[state=checked]:bg-accent transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2\"\n >\n <SwitchPrimitive.Thumb\n className=\"pointer-events-none inline-flex h-8 w-8 items-center justify-center rounded-full bg-background text-foreground shadow transition-transform duration-200 data-[state=checked]:translate-x-[22px] data-[state=unchecked]:translate-x-[-4px]\"\n >\n {checkedIcon && uncheckedIcon\n ? checked\n ? checkedIcon\n : uncheckedIcon\n : null}\n </SwitchPrimitive.Thumb>\n </SwitchPrimitive.Root>\n </label>\n </div>\n )\n}\n","import React, { useState } from 'react'\nimport * as Popover from '@radix-ui/react-popover'\n\nexport interface AutoCompleteItem {\n key: string\n value: string\n label: string\n icon?: React.ReactNode\n}\n\nexport interface AutoCompleteProps {\n disabled?: boolean\n label?: React.ReactNode\n placeholder?: string\n name?: string\n inputStyle?: React.CSSProperties\n style?: React.CSSProperties\n /** Label/input orientation. Defaults to `'vertical'`. */\n layout?: 'horizontal' | 'vertical'\n items?: AutoCompleteItem[]\n onItemClick?: (value: string) => void\n /** Custom \"empty\" message */\n emptyText?: string\n}\n\n/**\n * Search-as-you-type autocomplete powered by Radix Popover.\n *\n * The popover opens when the input is focused and closes when an item is\n * selected or the user clicks away. Radix handles portal-based z-stacking.\n *\n * @example\n * <AutoComplete\n * label=\"Vessel\"\n * items={vessels.map(v => ({ key: v.imo, value: v.imo, label: v.name }))}\n * onItemClick={(imo) => setVessel(imo)}\n * />\n */\nexport default function AutoComplete({\n disabled,\n label,\n placeholder,\n name,\n inputStyle,\n style,\n layout = 'vertical',\n items = [],\n onItemClick,\n emptyText = 'No results found',\n}: AutoCompleteProps) {\n const [term, setTerm] = useState('')\n const [open, setOpen] = useState(false)\n\n const foundItems = term.trim()\n ? items.filter(\n ({ key, label }) =>\n label.toLowerCase().includes(term.toLowerCase()) ||\n key.toLowerCase().includes(term.toLowerCase())\n )\n : []\n\n const handleSelect = (item: AutoCompleteItem) => {\n setTerm(`${item.label} (${item.value})`)\n onItemClick?.(item.value)\n setOpen(false)\n }\n\n return (\n <div className=\"relative flex flex-col items-center justify-center\">\n <div\n className={`flex ${layout === 'vertical' ? 'flex-col' : 'flex-row items-center gap-2'}`}\n style={style ?? {}}\n >\n {label && (\n <label className=\"text-sm font-medium ml-1 max-content text-foreground\">\n {label}\n </label>\n )}\n\n <Popover.Root open={open && !disabled} onOpenChange={(o) => !disabled && setOpen(o)}>\n <Popover.Anchor asChild>\n <div className=\"bg-surface text-foreground flex items-center gap-1 rounded-lg border border-border pr-2 focus-within:border-transparent focus-within:ring-2 focus-within:ring-accent transition-colors\">\n <input\n disabled={disabled}\n value={term}\n onChange={(e) => {\n setTerm(e.target.value)\n setOpen(true)\n }}\n onFocus={() => setOpen(true)}\n type=\"text\"\n name={name}\n className=\"bg-transparent focus:outline-none pl-2 h-9 w-56 rounded-lg disabled:cursor-not-allowed\"\n style={inputStyle ?? {}}\n placeholder={placeholder ?? ''}\n autoComplete=\"off\"\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-autocomplete=\"list\"\n />\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"w-5 h-5 flex-shrink-0 text-foreground-muted\" aria-hidden=\"true\">\n <path fillRule=\"evenodd\" d=\"M10.5 3.75a6.75 6.75 0 100 13.5 6.75 6.75 0 000-13.5zM2.25 10.5a8.25 8.25 0 1114.59 5.28l4.69 4.69a.75.75 0 11-1.06 1.06l-4.69-4.69A8.25 8.25 0 012.25 10.5z\" clipRule=\"evenodd\" />\n </svg>\n </div>\n </Popover.Anchor>\n\n <Popover.Portal>\n <Popover.Content\n align=\"start\"\n sideOffset={4}\n onOpenAutoFocus={(e) => e.preventDefault()}\n className=\"w-64 bg-surface border border-border rounded-lg mt-1 shadow-md z-50 overflow-y-auto max-h-36 animate-in fade-in-0 zoom-in-95\"\n >\n {foundItems.length === 0 ? (\n <div className=\"h-full w-full flex flex-col items-center justify-center py-4 text-sm text-foreground-secondary\">\n {emptyText}\n </div>\n ) : (\n <div role=\"listbox\">\n {foundItems.map((item) => (\n // tabIndex + Enter/Space onKeyDown\n // makes each option keyboard-activatable.\n // Full roving-tabindex / arrow-key nav\n // is deferred to the Phase-5 rewrite.\n <div\n key={item.key}\n role=\"option\"\n tabIndex={0}\n className=\"text-sm flex items-center gap-2 p-2 transition-colors duration-150 hover:bg-surface-raised cursor-pointer text-foreground focus:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n onClick={() => handleSelect(item)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n handleSelect(item)\n }\n }}\n >\n {item.icon}\n <span>\n {item.label} ({item.value})\n </span>\n </div>\n ))}\n </div>\n )}\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n </div>\n </div>\n )\n}\n","import React, { useEffect, useId, useMemo, useRef, useState } from 'react'\nimport * as Popover from '@radix-ui/react-popover'\n\nexport interface TreeSelectNode {\n key: string | number\n label: React.ReactNode\n icon?: React.ReactNode\n /** Nested children. If present, this node is treated as a parent (branch). */\n children?: TreeSelectNode[]\n /** Render the node disabled — visible but not selectable. */\n disabled?: boolean\n}\n\nexport interface TreeSelectProps {\n /** Tree data. Each node may optionally carry `children` for sub-branches. */\n items: TreeSelectNode[]\n /** Currently selected key (single-select). Pass `undefined`/`null` for unset. */\n value?: string | number | null\n /** Fires with the next selected key (and the corresponding event-like target). */\n onChange?: (e: { target: { value: string | number; id?: string; name?: string } }) => void\n label?: React.ReactNode\n placeholder?: string\n /** Form control id linkage. */\n htmlFor?: string\n name?: string\n /** Label/trigger orientation. Defaults to `'horizontal'`. */\n layout?: 'horizontal' | 'vertical'\n disabled?: boolean\n errorMessage?: React.ReactNode\n style?: React.CSSProperties\n /**\n * Whether parent (branch) nodes can be selected. When `false`, parents\n * only expand/collapse and only leaves are picked. Default `true`.\n */\n parentsSelectable?: boolean\n /** Keys of nodes that should start expanded. */\n defaultExpandedKeys?: (string | number)[]\n}\n\n// ── Visible-items flattening ────────────────────────────────────────────────\n// Walk the tree depth-first and emit every node along with its depth.\n// Children of un-expanded parents are skipped. This array is what the\n// keyboard navigation moves through.\n\ninterface FlatNode {\n node: TreeSelectNode\n depth: number\n isParent: boolean\n}\n\nfunction flattenVisible(items: TreeSelectNode[], expanded: Set<React.Key>, depth = 0, out: FlatNode[] = []): FlatNode[] {\n for (const node of items) {\n const isParent = !!node.children && node.children.length > 0\n out.push({ node, depth, isParent })\n if (isParent && expanded.has(node.key)) {\n flattenVisible(node.children!, expanded, depth + 1, out)\n }\n }\n return out\n}\n\nfunction findNodeByKey(items: TreeSelectNode[], key: React.Key): TreeSelectNode | null {\n for (const n of items) {\n if (n.key === key) return n\n if (n.children) {\n const found = findNodeByKey(n.children, key)\n if (found) return found\n }\n }\n return null\n}\n\n/**\n * Hierarchical single-select with expandable branches.\n *\n * Built on `@radix-ui/react-popover` for portal positioning and click-outside.\n * Tree state (expanded keys) is local; selected value is controlled by the\n * parent.\n *\n * **Keyboard model** (focus is on the trigger or any item):\n * - `Enter` / `Space` / `↓` / `↑` on the trigger — open the popover\n * - `↓` / `↑` — move active item through the visible (un-collapsed) list\n * - `→` — expand a branch (or move into it if already expanded)\n * - `←` — collapse a branch (or move to its parent if already collapsed)\n * - `Enter` / `Space` — select the active item (if selectable)\n * - `Esc` — close the popover, return focus to the trigger\n *\n * @example\n * ```tsx\n * type FleetKey = number\n * const [fleet, setFleet] = useState<FleetKey | null>(null)\n *\n * const tree: TreeSelectNode[] = [\n * { key: 'eu', label: 'Europe', children: [\n * { key: 1, label: 'Aegean Fleet' },\n * { key: 2, label: 'Adriatic Fleet' },\n * ]},\n * { key: 'asia', label: 'Asia', children: [{ key: 3, label: 'Pacific Fleet' }] },\n * ]\n *\n * <TreeSelect\n * label=\"Fleet\"\n * items={tree}\n * value={fleet}\n * onChange={({ target }) => setFleet(target.value as FleetKey)}\n * parentsSelectable={false}\n * />\n * ```\n */\nexport default function TreeSelect({\n label,\n name,\n value,\n onChange,\n disabled,\n layout = 'horizontal',\n errorMessage,\n style,\n htmlFor,\n items = [],\n placeholder = 'Select…',\n parentsSelectable = true,\n defaultExpandedKeys = [],\n}: TreeSelectProps) {\n const errorId = useId()\n const hasError = errorMessage != null\n\n const [open, setOpen] = useState(false)\n const [expanded, setExpanded] = useState<Set<React.Key>>(() => new Set(defaultExpandedKeys))\n const [activeIndex, setActiveIndex] = useState(0)\n\n const listRef = useRef<HTMLDivElement>(null)\n\n const visible = useMemo(() => flattenVisible(items, expanded), [items, expanded])\n\n // Sync `activeIndex` only on the open transition (or when `value` changes\n // while open). Previously this ran on every `visible` mutation, so any\n // expand/collapse yanked focus back to the selected item — wrong if the\n // user was navigating to a different branch. We use a ref to track\n // whether we've already done the open-time sync.\n const didSyncOnOpenRef = useRef(false)\n useEffect(() => {\n if (!open) {\n didSyncOnOpenRef.current = false\n return\n }\n if (didSyncOnOpenRef.current) return\n const selectedIdx = visible.findIndex((v) => v.node.key === value)\n setActiveIndex(selectedIdx >= 0 ? selectedIdx : 0)\n didSyncOnOpenRef.current = true\n // visible intentionally excluded — we want to sync ONCE on open,\n // not on every expand/collapse.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open, value])\n\n const selectedNode = useMemo(\n () => (value != null ? findNodeByKey(items, value) : null),\n [items, value],\n )\n\n // ── Actions ────────────────────────────────────────────────────────────\n\n const toggleExpand = (key: React.Key) => {\n setExpanded((prev) => {\n const next = new Set(prev)\n if (next.has(key)) next.delete(key)\n else next.add(key)\n return next\n })\n }\n\n const selectKey = (key: string | number) => {\n onChange?.({ target: { value: key, id: htmlFor, name } })\n setOpen(false)\n }\n\n // ── Keyboard handler (on the listbox) ──────────────────────────────────\n\n const onListKey = (e: React.KeyboardEvent) => {\n if (visible.length === 0) return\n const cur = visible[activeIndex]\n\n if (e.key === 'ArrowDown') {\n e.preventDefault()\n setActiveIndex((i) => Math.min(i + 1, visible.length - 1))\n } else if (e.key === 'ArrowUp') {\n e.preventDefault()\n setActiveIndex((i) => Math.max(i - 1, 0))\n } else if (e.key === 'ArrowRight') {\n e.preventDefault()\n if (cur.isParent) {\n if (!expanded.has(cur.node.key)) toggleExpand(cur.node.key)\n else setActiveIndex((i) => Math.min(i + 1, visible.length - 1))\n }\n } else if (e.key === 'ArrowLeft') {\n e.preventDefault()\n if (cur.isParent && expanded.has(cur.node.key)) {\n toggleExpand(cur.node.key)\n } else if (cur.depth > 0) {\n // Walk back to the nearest ancestor\n for (let i = activeIndex - 1; i >= 0; i--) {\n if (visible[i].depth < cur.depth) { setActiveIndex(i); break }\n }\n }\n } else if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n if (cur.node.disabled) return\n if (cur.isParent && !parentsSelectable) {\n toggleExpand(cur.node.key)\n } else {\n selectKey(cur.node.key)\n }\n } else if (e.key === 'Escape') {\n e.preventDefault()\n setOpen(false)\n }\n }\n\n // ── Render ─────────────────────────────────────────────────────────────\n\n return (\n <div className=\"flex flex-col gap-1\">\n <div className={`flex ${layout === 'vertical' ? 'flex-col gap-1' : 'flex-row items-center gap-2'}`}>\n {label && (\n <label\n className=\"text-sm font-medium ml-1 max-content select-none text-foreground\"\n htmlFor={htmlFor}\n >\n {label}\n </label>\n )}\n\n <Popover.Root open={open && !disabled} onOpenChange={(o) => !disabled && setOpen(o)}>\n <Popover.Trigger asChild>\n <button\n id={htmlFor}\n type=\"button\"\n style={style}\n role=\"combobox\"\n aria-expanded={open}\n aria-haspopup=\"listbox\"\n aria-invalid={hasError || undefined}\n aria-describedby={hasError ? errorId : undefined}\n disabled={disabled}\n className={`flex items-center justify-between h-9 rounded-lg border ${hasError ? 'border-status-error' : 'border-border'} px-3 cursor-pointer select-none focus:outline-none focus-visible:border-transparent focus-visible:ring-2 focus-visible:ring-accent ${disabled ? 'cursor-not-allowed bg-surface-raised text-foreground-muted' : 'bg-surface text-foreground'} ${!style?.width ? 'min-w-[240px]' : ''}`}\n >\n <span className=\"text-sm truncate text-left\">\n {selectedNode ? selectedNode.label : <span className=\"text-foreground-muted\">{placeholder}</span>}\n </span>\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} className={`h-4 w-4 flex-shrink-0 transition-transform duration-200 ${open ? 'rotate-180' : ''}`} aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n </Popover.Trigger>\n\n <Popover.Portal>\n <Popover.Content\n align=\"start\"\n sideOffset={4}\n style={{ width: style?.width || 280 }}\n className=\"bg-surface text-foreground border border-border rounded-lg shadow-md z-50 p-1 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\"\n onOpenAutoFocus={(e) => {\n e.preventDefault()\n listRef.current?.focus()\n }}\n >\n <div\n ref={listRef}\n role=\"tree\"\n tabIndex={-1}\n aria-activedescendant={visible[activeIndex] ? `tree-opt-${visible[activeIndex].node.key}` : undefined}\n onKeyDown={onListKey}\n className=\"max-h-72 overflow-y-auto outline-none\"\n >\n {visible.length === 0 ? (\n <div className=\"px-3 py-4 text-sm text-foreground-secondary text-center\">No items</div>\n ) : (\n visible.map((v, idx) => (\n <TreeNodeRow\n key={v.node.key}\n node={v.node}\n depth={v.depth}\n isParent={v.isParent}\n isExpanded={expanded.has(v.node.key)}\n isActive={idx === activeIndex}\n isSelected={value === v.node.key}\n parentsSelectable={parentsSelectable}\n onActivate={() => {\n if (v.node.disabled) return\n if (v.isParent && !parentsSelectable) toggleExpand(v.node.key)\n else selectKey(v.node.key)\n }}\n onToggle={() => toggleExpand(v.node.key)}\n onHover={() => setActiveIndex(idx)}\n />\n ))\n )}\n </div>\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n </div>\n {hasError && (\n <div id={errorId} className=\"text-xs text-status-error ml-1\">\n {errorMessage}\n </div>\n )}\n </div>\n )\n}\n\n// ── Row component ───────────────────────────────────────────────────────────\n\ninterface RowProps {\n node: TreeSelectNode\n depth: number\n isParent: boolean\n isExpanded: boolean\n isActive: boolean\n isSelected: boolean\n parentsSelectable: boolean\n onActivate: () => void\n onToggle: () => void\n onHover: () => void\n}\n\nfunction TreeNodeRow({\n node, depth, isParent, isExpanded, isActive, isSelected,\n parentsSelectable, onActivate, onToggle, onHover,\n}: RowProps) {\n const disabled = node.disabled\n return (\n <div\n id={`tree-opt-${node.key}`}\n role=\"treeitem\"\n aria-selected={isSelected}\n aria-expanded={isParent ? isExpanded : undefined}\n aria-disabled={disabled || undefined}\n data-active={isActive ? '' : undefined}\n onMouseEnter={onHover}\n className={`flex items-center gap-1 rounded-md px-1 py-1.5 select-none cursor-pointer transition-colors duration-100 ${\n disabled\n ? 'opacity-40 cursor-not-allowed'\n : isActive\n ? 'bg-accent text-accent-fg'\n : isSelected\n ? 'bg-surface-raised'\n : 'hover:bg-surface-raised'\n }`}\n style={{ paddingLeft: depth * 16 + 4 }}\n >\n {/* Chevron — only for parents, only toggles expand. Acts as its\n own button so users can expand without selecting. */}\n {isParent ? (\n <button\n type=\"button\"\n onClick={(e) => { e.stopPropagation(); onToggle() }}\n aria-label={isExpanded ? 'Collapse' : 'Expand'}\n tabIndex={-1}\n className=\"w-5 h-5 inline-flex items-center justify-center rounded hover:bg-black/10 focus:outline-none\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2.5}\n className={`h-3 w-3 transition-transform duration-150 ${isExpanded ? 'rotate-0' : '-rotate-90'}`}\n aria-hidden=\"true\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n ) : (\n <span className=\"w-5 h-5 inline-block\" aria-hidden=\"true\" />\n )}\n\n {/* Label — clicking selects (or toggles parents when not selectable) */}\n <button\n type=\"button\"\n onClick={onActivate}\n disabled={disabled}\n tabIndex={-1}\n className=\"flex-1 flex items-center gap-2 text-sm text-left focus:outline-none disabled:cursor-not-allowed\"\n >\n {node.icon}\n <span className=\"truncate\">{node.label}</span>\n {isParent && !parentsSelectable && (\n <span className=\"ml-auto text-xs text-foreground-muted\">parent</span>\n )}\n </button>\n\n {/* Selected checkmark */}\n {isSelected && (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\" aria-hidden=\"true\" className=\"ml-1\">\n <path d=\"M4 10l4.5 4.5L16 6\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n )}\n </div>\n )\n}\n","import React, { useRef, useState } from 'react'\n\nexport interface FileInputProps {\n allowMultiple?: boolean\n onChange?: (e: { target: { files: File[]; name?: string; id?: string; value?: string } }) => void\n name?: string\n /** Accepted MIME types / extensions */\n accept?: string\n}\n\n/**\n * Drag-and-drop / click file input.\n *\n * Decoupled from ThemeContext — uses CSS `dark:` classes.\n *\n * @example\n * <FileInput\n * name=\"xlsxUpload\"\n * accept=\".xlsx\"\n * onChange={(e) => setFile(e.target.files[0])}\n * />\n */\nexport default function FileInput({\n allowMultiple = false,\n onChange,\n name,\n accept = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,.xlsx',\n}: FileInputProps) {\n const fileInput = useRef<HTMLInputElement>(null)\n const [files, setFiles] = useState<File[]>([])\n\n const openPicker = () => {\n // Native .click() is the idiomatic call — synthesising a MouseEvent\n // works but is noisy in test environments (jsdom) and unnecessary.\n fileInput.current?.click()\n }\n\n const handleFiles = (list: File[]) => {\n setFiles(list)\n onChange?.({ target: { files: list } })\n }\n\n const onDrop = (e: React.DragEvent) => {\n e.preventDefault()\n const fileList: File[] = []\n if (e.dataTransfer.items) {\n for (let i = 0; i < e.dataTransfer.items.length; i++) {\n if (e.dataTransfer.items[i].kind === 'file') {\n const f = e.dataTransfer.items[i].getAsFile()\n if (f) fileList.push(f)\n }\n }\n } else {\n for (let i = 0; i < e.dataTransfer.files.length; i++) {\n fileList.push(e.dataTransfer.files[i])\n }\n }\n handleFiles(fileList)\n }\n\n const localOnChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n handleFiles(Array.from(e.target.files ?? []))\n }\n\n const removeFile = (e: React.MouseEvent) => {\n e.stopPropagation()\n setFiles([])\n onChange?.({ target: { files: [], name, id: name, value: '' } })\n if (fileInput.current) fileInput.current.value = ''\n }\n\n return (\n // Dropzone is keyboard-activatable: role=\"button\", focusable via\n // tabIndex, and Space/Enter trigger the file picker. Without these\n // a keyboard-only user could not upload a file.\n <div\n role=\"button\"\n tabIndex={0}\n aria-label=\"Upload file — click or drop\"\n onClick={openPicker}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n openPicker()\n }\n }}\n className=\"border-2 border-dashed border-border hover:border-accent w-full h-full rounded-md transition-colors duration-200 cursor-pointer focus:outline-none focus-visible:ring-2 focus-visible:ring-accent text-foreground-secondary hover:text-foreground\"\n onDragOver={(e) => e.preventDefault()}\n onDrop={onDrop}\n >\n <input\n id={name}\n name={name}\n onChange={localOnChange}\n ref={fileInput}\n hidden\n type=\"file\"\n accept={accept}\n multiple={allowMultiple}\n />\n\n {files.length === 0 ? (\n <div className=\"flex flex-col h-full items-center justify-center gap-2\">\n {/* Upload icon — currentColor lets the parent's text-foreground drive it */}\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"w-16 h-16\" aria-hidden=\"true\">\n <path fillRule=\"evenodd\" d=\"M11.47 2.47a.75.75 0 011.06 0l4.5 4.5a.75.75 0 01-1.06 1.06l-3.22-3.22V16.5a.75.75 0 01-1.5 0V4.81L8.03 8.03a.75.75 0 01-1.06-1.06l4.5-4.5zM3 15.75a.75.75 0 01.75.75v2.25a1.5 1.5 0 001.5 1.5h13.5a1.5 1.5 0 001.5-1.5V16.5a.75.75 0 011.5 0v2.25a3 3 0 01-3 3H5.25a3 3 0 01-3-3V16.5a.75.75 0 01.75-.75z\" clipRule=\"evenodd\" />\n </svg>\n <div className=\"text-sm\">Click or Drop a file</div>\n </div>\n ) : (\n <div className=\"flex gap-3 items-center justify-center w-full h-full p-3\">\n {files.map((file, id) => (\n <div\n key={`${id}${file.name}`}\n className=\"text-xs flex flex-col items-center w-20 h-24 text-center bg-surface-raised text-foreground p-4 rounded-md relative\"\n >\n <button\n type=\"button\"\n onClick={removeFile}\n className=\"bg-status-error rounded-full w-4 h-4 absolute right-[-5px] top-[-5px] cursor-pointer flex items-center justify-center focus:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n aria-label=\"Remove file\"\n >\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 20 20\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M15 5L5 15M5 5l10 10\" stroke=\"#fff\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n {/* File icon */}\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"w-10 h-10\" aria-hidden=\"true\">\n <path fillRule=\"evenodd\" d=\"M5.625 1.5c-1.036 0-1.875.84-1.875 1.875v17.25c0 1.035.84 1.875 1.875 1.875h12.75c1.035 0 1.875-.84 1.875-1.875V12.75A3.75 3.75 0 0016.5 9h-1.875a1.875 1.875 0 01-1.875-1.875V5.25A3.75 3.75 0 009 1.5H5.625z\" clipRule=\"evenodd\" />\n <path d=\"M12.971 1.816A5.23 5.23 0 0114.25 5.25v1.875c0 .207.168.375.375.375H16.5a5.23 5.23 0 013.434 1.279 9.768 9.768 0 00-6.963-6.963z\" />\n </svg>\n <span className=\"text-ellipsis whitespace-nowrap overflow-hidden w-full\">\n {file.name}\n </span>\n </div>\n ))}\n </div>\n )}\n </div>\n )\n}\n","import React, { useEffect, useId, useMemo, useRef, useState } from 'react'\nimport * as Popover from '@radix-ui/react-popover'\n\n// ── Public API ──────────────────────────────────────────────────────────────\n\nexport interface DatePickerProps {\n /** Current date. `null` / `undefined` means \"no date selected\". */\n value?: Date | null\n /** Fires with the next date (or `null` if cleared via the clear button). */\n onChange?: (date: Date | null) => void\n label?: React.ReactNode\n /** Text shown in the trigger when no date is selected. Default `\"Select a date…\"`. */\n placeholder?: string\n htmlFor?: string\n name?: string\n /** Label/trigger orientation. Defaults to `'horizontal'`. */\n layout?: 'horizontal' | 'vertical'\n disabled?: boolean\n errorMessage?: React.ReactNode\n /** Earliest selectable date. Dates before this render disabled. */\n min?: Date\n /** Latest selectable date. Dates after this render disabled. */\n max?: Date\n style?: React.CSSProperties\n /**\n * Custom formatter for the trigger display. Defaults to\n * `YYYY-MM-DD` via `toISOString().slice(0, 10)`.\n */\n format?: (date: Date) => string\n /** 0 = Sunday, 1 = Monday. Default `0`. */\n weekStartsOn?: 0 | 1\n /** Allow the user to clear the date with a button in the popover. Default `true`. */\n clearable?: boolean\n}\n\n// Legacy alias — the previous component exported `TemporalPickerProps`. Keep\n// it for backwards-compat imports; same shape as DatePickerProps now.\nexport type TemporalPickerProps = DatePickerProps\n\n// ── Date helpers ────────────────────────────────────────────────────────────\n\nconst MONTH_NAMES = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']\nconst WEEKDAY_SHORT = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']\n\nfunction isSameDay(a: Date, b: Date) {\n return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate()\n}\n\nfunction startOfMonth(d: Date) { return new Date(d.getFullYear(), d.getMonth(), 1) }\nfunction addDays(d: Date, n: number) { const c = new Date(d); c.setDate(c.getDate() + n); return c }\nfunction addMonths(d: Date, n: number) { const c = new Date(d); c.setMonth(c.getMonth() + n); return c }\nfunction defaultFormat(d: Date) {\n const y = d.getFullYear().toString().padStart(4, '0')\n const m = (d.getMonth() + 1).toString().padStart(2, '0')\n const day = d.getDate().toString().padStart(2, '0')\n return `${y}-${m}-${day}`\n}\n\n/**\n * Build the 6×7 calendar grid for `viewMonth`. Days from the previous and\n * next month are included as \"outside\" cells so the grid always has 42 cells\n * (six rows of seven days) — keeps the layout stable across months.\n */\nfunction buildGrid(viewMonth: Date, weekStartsOn: 0 | 1): { date: Date; outside: boolean }[][] {\n const first = startOfMonth(viewMonth)\n const startOffset = (first.getDay() - weekStartsOn + 7) % 7\n const gridStart = addDays(first, -startOffset)\n const cells: { date: Date; outside: boolean }[] = []\n for (let i = 0; i < 42; i++) {\n const d = addDays(gridStart, i)\n cells.push({ date: d, outside: d.getMonth() !== viewMonth.getMonth() })\n }\n const rows: { date: Date; outside: boolean }[][] = []\n for (let r = 0; r < 6; r++) rows.push(cells.slice(r * 7, r * 7 + 7))\n return rows\n}\n\n// ── Component ──────────────────────────────────────────────────────────────\n\n/**\n * Calendar date picker built on `@radix-ui/react-popover`.\n *\n * Renders the calendar as a real `<table role=\"grid\">` with weekday `<th>`\n * headers and per-day `<td role=\"gridcell\">` cells, so screen readers get\n * proper row/column context.\n *\n * **Keyboard model** (focus is anywhere inside the grid):\n * - `←` `→` — previous / next day\n * - `↑` `↓` — previous / next week\n * - `PageUp` / `PageDown` — previous / next month\n * - `Home` / `End` — first / last day of the current week\n * - `Enter` / `Space` — select the focused day\n * - `Esc` — close the popover\n *\n * @example Required date\n * ```tsx\n * const [date, setDate] = useState<Date | null>(null)\n * <DatePicker\n * label=\"Report date\"\n * value={date}\n * onChange={setDate}\n * max={new Date()}\n * />\n * ```\n *\n * @example Custom format\n * ```tsx\n * <DatePicker\n * value={date}\n * onChange={setDate}\n * format={(d) => new Intl.DateTimeFormat('en-GB', { dateStyle: 'long' }).format(d)}\n * />\n * ```\n */\nexport default function DatePicker({\n value,\n onChange,\n label,\n placeholder = 'Select a date…',\n htmlFor,\n name: _name,\n layout = 'horizontal',\n disabled,\n errorMessage,\n min,\n max,\n style,\n format = defaultFormat,\n weekStartsOn = 0,\n clearable = true,\n}: DatePickerProps) {\n const errorId = useId()\n const hasError = errorMessage != null\n\n const [open, setOpen] = useState(false)\n // The month currently shown in the calendar. Drives navigation independently\n // of the selected `value` so users can browse without changing the date.\n const [viewMonth, setViewMonth] = useState(() => startOfMonth(value ?? new Date()))\n // The keyboard-focused day in the grid.\n const [focusDate, setFocusDate] = useState<Date>(() => value ?? new Date())\n // Which picker view is showing: days grid, months grid (12 months), or\n // years grid (12-year decade). Lets the user jump from 2026 to 1991 in\n // 3 clicks (year header → previous decade × N → pick year → pick month).\n const [view, setView] = useState<'days' | 'months' | 'years'>('days')\n\n const gridRef = useRef<HTMLTableElement>(null)\n\n // Reset view + focus when the popover opens\n useEffect(() => {\n if (!open) return\n const target = value ?? new Date()\n setViewMonth(startOfMonth(target))\n setFocusDate(target)\n setView('days')\n }, [open, value])\n\n // After the active cell changes, move DOM focus to it so screen readers\n // and keyboard users land on the right cell.\n useEffect(() => {\n if (!open) return\n const cell = gridRef.current?.querySelector<HTMLButtonElement>(`[data-day=\"${defaultFormat(focusDate)}\"]`)\n cell?.focus()\n }, [open, focusDate])\n\n const weekdays = useMemo(() => {\n const ordered = WEEKDAY_SHORT.slice(weekStartsOn).concat(WEEKDAY_SHORT.slice(0, weekStartsOn))\n return ordered\n }, [weekStartsOn])\n\n const grid = useMemo(() => buildGrid(viewMonth, weekStartsOn), [viewMonth, weekStartsOn])\n\n const isDisabled = (d: Date) => {\n if (min && d < min) return true\n if (max && d > max) return true\n return false\n }\n\n const selectDate = (d: Date) => {\n if (isDisabled(d)) return\n onChange?.(d)\n setOpen(false)\n }\n\n const onKey = (e: React.KeyboardEvent) => {\n const next = (delta: number) => {\n const nd = addDays(focusDate, delta)\n setFocusDate(nd)\n if (nd.getMonth() !== viewMonth.getMonth()) setViewMonth(startOfMonth(nd))\n }\n if (e.key === 'ArrowLeft') { e.preventDefault(); next(-1) }\n else if (e.key === 'ArrowRight') { e.preventDefault(); next(1) }\n else if (e.key === 'ArrowUp') { e.preventDefault(); next(-7) }\n else if (e.key === 'ArrowDown') { e.preventDefault(); next(7) }\n else if (e.key === 'PageUp') { e.preventDefault(); const nm = addMonths(viewMonth, -1); setViewMonth(nm); setFocusDate((d) => addMonths(d, -1)) }\n else if (e.key === 'PageDown') { e.preventDefault(); const nm = addMonths(viewMonth, 1); setViewMonth(nm); setFocusDate((d) => addMonths(d, 1)) }\n else if (e.key === 'Home') {\n e.preventDefault()\n const dow = (focusDate.getDay() - weekStartsOn + 7) % 7\n setFocusDate(addDays(focusDate, -dow))\n }\n else if (e.key === 'End') {\n e.preventDefault()\n const dow = (focusDate.getDay() - weekStartsOn + 7) % 7\n setFocusDate(addDays(focusDate, 6 - dow))\n }\n else if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); selectDate(focusDate) }\n else if (e.key === 'Escape') { e.preventDefault(); setOpen(false) }\n }\n\n const displayValue = value ? format(value) : ''\n\n return (\n <div className=\"flex flex-col gap-1\">\n <div className={`flex ${layout === 'vertical' ? 'flex-col gap-1' : 'flex-row items-center gap-2'}`}>\n {label && (\n <label\n className=\"text-sm font-medium ml-1 max-content select-none text-foreground\"\n htmlFor={htmlFor}\n >\n {label}\n </label>\n )}\n\n <Popover.Root open={open && !disabled} onOpenChange={(o) => !disabled && setOpen(o)}>\n <Popover.Trigger asChild>\n <button\n id={htmlFor}\n type=\"button\"\n disabled={disabled}\n style={style}\n aria-invalid={hasError || undefined}\n aria-describedby={hasError ? errorId : undefined}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n className={`flex items-center justify-between h-9 rounded-lg border px-3 cursor-pointer select-none focus:outline-none focus-visible:border-transparent focus-visible:ring-2 focus-visible:ring-accent ${hasError ? 'border-status-error' : 'border-border'} ${disabled ? 'cursor-not-allowed bg-surface-raised text-foreground-muted' : 'bg-surface text-foreground'} ${!style?.width ? 'min-w-[200px]' : ''}`}\n >\n <span className={`text-sm truncate ${displayValue ? '' : 'text-foreground-muted'}`}>\n {displayValue || placeholder}\n </span>\n <CalendarIcon />\n </button>\n </Popover.Trigger>\n\n <Popover.Portal>\n <Popover.Content\n align=\"start\"\n sideOffset={4}\n className=\"bg-surface text-foreground border border-border rounded-lg shadow-md z-50 p-3 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\"\n onOpenAutoFocus={(e) => {\n e.preventDefault()\n // Focus is moved by the focusDate effect once the grid mounts\n }}\n >\n {/* View-aware navigation header */}\n <div className=\"flex items-center justify-between mb-2\">\n <button\n type=\"button\"\n onClick={() => {\n if (view === 'days') setViewMonth(addMonths(viewMonth, -1))\n else if (view === 'months') setViewMonth(new Date(viewMonth.getFullYear() - 1, viewMonth.getMonth(), 1))\n else setViewMonth(new Date(viewMonth.getFullYear() - 10, viewMonth.getMonth(), 1))\n }}\n aria-label={view === 'days' ? 'Previous month' : view === 'months' ? 'Previous year' : 'Previous decade'}\n className=\"w-7 h-7 inline-flex items-center justify-center rounded-md hover:bg-surface-raised focus:outline-none focus-visible:ring-2 focus-visible:ring-accent transition-colors\"\n >\n <ChevronLeft />\n </button>\n\n {/* Header label — clicking promotes to the next-broader view.\n In `years` view it's not clickable (we're already at the top). */}\n <button\n type=\"button\"\n onClick={() => {\n if (view === 'days') setView('months')\n else if (view === 'months') setView('years')\n }}\n disabled={view === 'years'}\n aria-label=\"Change view\"\n className=\"text-sm font-semibold select-none rounded-md px-2 py-0.5 hover:bg-surface-raised focus:outline-none focus-visible:ring-2 focus-visible:ring-accent transition-colors disabled:cursor-default disabled:hover:bg-transparent\"\n >\n {view === 'days' && `${MONTH_NAMES[viewMonth.getMonth()]} ${viewMonth.getFullYear()}`}\n {view === 'months' && `${viewMonth.getFullYear()}`}\n {view === 'years' && (() => {\n const decadeStart = Math.floor(viewMonth.getFullYear() / 10) * 10\n return `${decadeStart} – ${decadeStart + 11}`\n })()}\n </button>\n\n <button\n type=\"button\"\n onClick={() => {\n if (view === 'days') setViewMonth(addMonths(viewMonth, 1))\n else if (view === 'months') setViewMonth(new Date(viewMonth.getFullYear() + 1, viewMonth.getMonth(), 1))\n else setViewMonth(new Date(viewMonth.getFullYear() + 10, viewMonth.getMonth(), 1))\n }}\n aria-label={view === 'days' ? 'Next month' : view === 'months' ? 'Next year' : 'Next decade'}\n className=\"w-7 h-7 inline-flex items-center justify-center rounded-md hover:bg-surface-raised focus:outline-none focus-visible:ring-2 focus-visible:ring-accent transition-colors\"\n >\n <ChevronRight />\n </button>\n </div>\n\n {/* MONTHS view — 4×3 grid of month buttons */}\n {view === 'months' && (\n <div className=\"grid grid-cols-3 gap-1 min-w-[224px]\">\n {MONTH_NAMES.map((name, idx) => {\n const isCurrent = value && value.getFullYear() === viewMonth.getFullYear() && value.getMonth() === idx\n return (\n <button\n key={name}\n type=\"button\"\n onClick={() => {\n setViewMonth(new Date(viewMonth.getFullYear(), idx, 1))\n setView('days')\n }}\n className={`px-2 py-2 rounded-md text-xs font-medium transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-accent ${\n isCurrent ? 'bg-accent text-accent-fg' : 'text-foreground hover:bg-surface-raised'\n }`}\n >\n {name.slice(0, 3)}\n </button>\n )\n })}\n </div>\n )}\n\n {/* YEARS view — 4×3 grid of years for the current decade\n (plus 1 spillover slot for the year after) */}\n {view === 'years' && (() => {\n const decadeStart = Math.floor(viewMonth.getFullYear() / 10) * 10\n const years = Array.from({ length: 12 }, (_, i) => decadeStart + i)\n return (\n <div className=\"grid grid-cols-3 gap-1 min-w-[224px]\">\n {years.map((y) => {\n const isCurrent = value?.getFullYear() === y\n return (\n <button\n key={y}\n type=\"button\"\n onClick={() => {\n setViewMonth(new Date(y, viewMonth.getMonth(), 1))\n setView('months')\n }}\n className={`px-2 py-2 rounded-md text-xs font-medium transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-accent ${\n isCurrent ? 'bg-accent text-accent-fg' : 'text-foreground hover:bg-surface-raised'\n }`}\n >\n {y}\n </button>\n )\n })}\n </div>\n )\n })()}\n\n {/* DAYS view — the calendar grid */}\n {view === 'days' && (\n <table\n ref={gridRef}\n role=\"grid\"\n aria-label={`${MONTH_NAMES[viewMonth.getMonth()]} ${viewMonth.getFullYear()}`}\n onKeyDown={onKey}\n className=\"border-separate border-spacing-0\"\n >\n <thead>\n <tr>\n {weekdays.map((w) => (\n <th key={w} scope=\"col\" className=\"text-[11px] font-medium text-foreground-muted uppercase tracking-wide w-8 h-8\">\n {w}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {grid.map((row, ri) => (\n <tr key={ri}>\n {row.map(({ date, outside }) => {\n const dis = isDisabled(date)\n const sel = value ? isSameDay(date, value) : false\n const focused = isSameDay(date, focusDate)\n const today = isSameDay(date, new Date())\n return (\n <td key={defaultFormat(date)} role=\"gridcell\" className=\"p-0\">\n <button\n type=\"button\"\n disabled={dis}\n tabIndex={focused ? 0 : -1}\n data-day={defaultFormat(date)}\n aria-label={defaultFormat(date)}\n aria-selected={sel || undefined}\n onClick={() => selectDate(date)}\n className={[\n 'w-8 h-8 rounded-md text-xs font-medium transition-colors duration-100',\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-1 focus-visible:ring-offset-surface',\n 'disabled:opacity-30 disabled:cursor-not-allowed',\n sel\n ? 'bg-accent text-accent-fg'\n : today\n ? 'bg-surface-raised text-foreground ring-1 ring-inset ring-accent'\n : outside\n ? 'text-foreground-muted hover:bg-surface-raised'\n : 'text-foreground hover:bg-surface-raised',\n ].join(' ')}\n >\n {date.getDate()}\n </button>\n </td>\n )\n })}\n </tr>\n ))}\n </tbody>\n </table>\n )}\n\n {/* Footer — Today + Clear */}\n <div className=\"mt-2 flex items-center justify-between gap-2 border-t border-border pt-2\">\n <button\n type=\"button\"\n onClick={() => selectDate(new Date())}\n className=\"text-xs text-accent hover:underline focus:outline-none focus-visible:ring-2 focus-visible:ring-accent rounded-sm px-1\"\n >\n Today\n </button>\n {clearable && value && (\n <button\n type=\"button\"\n onClick={() => { onChange?.(null); setOpen(false) }}\n className=\"text-xs text-foreground-secondary hover:text-foreground focus:outline-none focus-visible:ring-2 focus-visible:ring-accent rounded-sm px-1\"\n >\n Clear\n </button>\n )}\n </div>\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n </div>\n {hasError && (\n <div id={errorId} className=\"text-xs text-status-error ml-1\">\n {errorMessage}\n </div>\n )}\n </div>\n )\n}\n\n// Legacy named export so consumers importing `Temporal` keep working.\nexport const Temporal = DatePicker\n\n// ── Inline SVGs ────────────────────────────────────────────────────────────\n\nfunction CalendarIcon() {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.75} className=\"w-4 h-4 flex-shrink-0\" aria-hidden=\"true\">\n <rect x=\"3\" y=\"5\" width=\"18\" height=\"16\" rx=\"2\" />\n <path d=\"M3 9h18M8 3v4M16 3v4\" strokeLinecap=\"round\" />\n </svg>\n )\n}\n\nfunction ChevronLeft() {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} className=\"w-4 h-4\" aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15 19l-7-7 7-7\" />\n </svg>\n )\n}\n\nfunction ChevronRight() {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} className=\"w-4 h-4\" aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 5l7 7-7 7\" />\n </svg>\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/icons/icons.tsx","../src/components/layout/Portal.tsx","../src/components/layout/Box.tsx","../src/components/layout/Flex.tsx","../src/components/layout/Grid.tsx","../src/components/core/Avatar.tsx","../src/components/core/Typography.tsx","../src/components/core/IconButton.tsx","../src/components/inputs/Button.tsx","../src/components/core/Modal.tsx","../src/components/core/Drawer.tsx","../src/components/core/Tooltip.tsx","../src/components/core/Tabs.tsx","../src/components/core/Tree.tsx","../src/components/core/ToggleButton.tsx","../src/components/core/Notification.tsx","../src/components/core/LoadingSpinner.tsx","../src/components/core/FadingBase.tsx","../src/components/core/List.tsx","../src/components/core/ScalableContainer.tsx","../src/components/core/GridCard.tsx","../src/components/core/OpaqueGridCard.tsx","../src/components/core/CatalogGrid.tsx","../src/components/core/CatalogCarousel.tsx","../src/components/core/Catalog.tsx","../src/components/core/ContextMenu.tsx","../src/components/core/Wizard.tsx","../src/components/inputs/SearchInput.tsx","../src/components/inputs/DropdownPill.tsx","../src/components/inputs/Dropdown.tsx","../src/components/core/Skeleton.tsx","../src/components/core/Table.tsx","../src/components/core/Switch.tsx","../src/components/core/TopBar.tsx","../src/components/core/Sidebar.tsx","../src/components/core/AppShell.tsx","../src/components/core/ThemeProvider.tsx","../src/components/inputs/TextInput.tsx","../src/components/inputs/NumberInput.tsx","../src/components/inputs/Password.tsx","../src/components/inputs/Checkbox.tsx","../src/components/inputs/Switch.tsx","../src/components/inputs/AutoComplete.tsx","../src/components/inputs/TreeSelect.tsx","../src/components/inputs/FileInput.tsx","../src/components/inputs/DatePicker.tsx"],"names":["jsx","jsxs","Fragment","useState","useEffect","createPortal","px","GAP_MAP","ALIGN_CLASS","JUSTIFY_CLASS","Grid","AvatarPrimitive","useMemo","useReducedMotion","Dialog","AnimatePresence","motion","Dialog2","TooltipPrimitive","TabsPrimitive","Accordion","ToggleGroup","createContext","useRef","useCallback","useContext","List","colors_default","ContextMenuPrimitive","ChevronRight","useLayoutEffect","useId","React","SearchInput","Popover","SwitchPrimitive","vars","CheckboxPrimitive","SwitchPrimitive2","label","Popover2","isParent","Popover3","Popover4"],"mappings":"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","file":"index.cjs","sourcesContent":["import React from 'react'\n\nconst Moon = ({ color = 'gray' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill={color} viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className=\"w-8 h-8\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M21.752 15.002A9.718 9.718 0 0118 15.75c-5.385 0-9.75-4.365-9.75-9.75 0-1.33.266-2.597.748-3.752A9.753 9.753 0 003 11.25C3 16.635 7.365 21 12.75 21a9.753 9.753 0 009.002-5.998z\" />\n </svg>\n)\n\nconst Sun = ({ color = 'yellow' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill={color} viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className=\"w-8 h-8\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 3v2.25m6.364.386l-1.591 1.591M21 12h-2.25m-.386 6.364l-1.591-1.591M12 18.75V21m-4.773-4.227l-1.591 1.591M5.25 12H3m4.227-4.773L5.636 5.636M15.75 12a3.75 3.75 0 11-7.5 0 3.75 3.75 0 017.5 0z\" />\n </svg>\n)\n\nconst CheckCircle = ({ color = '#fff', size = 28 }) => (\n <svg width={size} height={size} viewBox=\"0 0 28 28\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fillRule=\"evenodd\" clipRule=\"evenodd\" d=\"M14 0.25C6.40625 0.25 0.25 6.40625 0.25 14C0.25 21.5937 6.40625 27.75 14 27.75C21.5937 27.75 27.75 21.5937 27.75 14C27.75 6.40625 21.5937 0.25 14 0.25ZM19.96 11.675C20.0697 11.5496 20.1533 11.4034 20.2057 11.2452C20.2582 11.087 20.2784 10.9199 20.2653 10.7537C20.2522 10.5876 20.206 10.4257 20.1295 10.2777C20.0529 10.1296 19.9475 9.99838 19.8194 9.89168C19.6914 9.78497 19.5433 9.70495 19.3839 9.65633C19.2244 9.6077 19.0569 9.59145 18.8911 9.60853C18.7253 9.62562 18.5646 9.67568 18.4184 9.75579C18.2723 9.8359 18.1436 9.94443 18.04 10.075L12.665 16.5237L9.88375 13.7412C9.648 13.5136 9.33224 13.3876 9.0045 13.3904C8.67675 13.3933 8.36324 13.5247 8.13148 13.7565C7.89972 13.9882 7.76825 14.3018 7.76541 14.6295C7.76256 14.9572 7.88855 15.273 8.11625 15.5087L11.8662 19.2587C11.9891 19.3815 12.1361 19.4773 12.298 19.5401C12.4599 19.6028 12.6331 19.6312 12.8066 19.6233C12.98 19.6154 13.15 19.5715 13.3055 19.4943C13.4611 19.4171 13.5988 19.3084 13.71 19.175L19.96 11.675Z\" fill={color} />\n </svg>\n)\n\nconst Login = ({ color = '#fff', size = 6 }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={`w-${size} h-${size}`}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15.75 9V5.25A2.25 2.25 0 0013.5 3h-6a2.25 2.25 0 00-2.25 2.25v13.5A2.25 2.25 0 007.5 21h6a2.25 2.25 0 002.25-2.25V15m3 0l3-3m0 0l-3-3m3 3H9\" />\n </svg>\n)\n\nconst Loading = ({ color = '#fff', size = 6 }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill={color} className={`w-${size} h-${size} animate-spin`}>\n <path fillRule=\"evenodd\" d=\"M4.755 10.059a7.5 7.5 0 0112.548-3.364l1.903 1.903h-3.183a.75.75 0 100 1.5h4.992a.75.75 0 00.75-.75V4.356a.75.75 0 00-1.5 0v3.18l-1.9-1.9A9 9 0 003.306 9.67a.75.75 0 101.45.388zm15.408 3.352a.75.75 0 00-.919.53 7.5 7.5 0 01-12.548 3.364l-1.902-1.903h3.183a.75.75 0 000-1.5H2.984a.75.75 0 00-.75.75v4.992a.75.75 0 001.5 0v-3.18l1.9 1.9a9 9 0 0015.059-4.035.75.75 0 00-.53-.918z\" clipRule=\"evenodd\" />\n </svg>\n)\n\nconst ToggleLoading = ({ color = '#fff', loading = false, size = 6 }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill={color} className={`w-${size} h-${size} ${loading && 'animate-spin'}`}>\n <path fillRule=\"evenodd\" d=\"M4.755 10.059a7.5 7.5 0 0112.548-3.364l1.903 1.903h-3.183a.75.75 0 100 1.5h4.992a.75.75 0 00.75-.75V4.356a.75.75 0 00-1.5 0v3.18l-1.9-1.9A9 9 0 003.306 9.67a.75.75 0 101.45.388zm15.408 3.352a.75.75 0 00-.919.53 7.5 7.5 0 01-12.548 3.364l-1.902-1.903h3.183a.75.75 0 000-1.5H2.984a.75.75 0 00-.75.75v4.992a.75.75 0 001.5 0v-3.18l1.9 1.9a9 9 0 0015.059-4.035.75.75 0 00-.53-.918z\" clipRule=\"evenodd\" />\n </svg>\n)\n\nconst Eye = ({ color = '#fff', size = 6 }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill={color} className={`w-${size} h-${size}`}>\n <path d=\"M12 15a3 3 0 100-6 3 3 0 000 6z\" />\n <path fillRule=\"evenodd\" d=\"M1.323 11.447C2.811 6.976 7.028 3.75 12.001 3.75c4.97 0 9.185 3.223 10.675 7.69.12.362.12.752 0 1.113-1.487 4.471-5.705 7.697-10.677 7.697-4.97 0-9.186-3.223-10.675-7.69a1.762 1.762 0 010-1.113zM17.25 12a5.25 5.25 0 11-10.5 0 5.25 5.25 0 0110.5 0z\" clipRule=\"evenodd\" />\n </svg>\n)\n\nconst EyeSlash = ({ color = '#fff', size = 6 }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill={color} className={`w-${size} h-${size}`}>\n <path d=\"M3.53 2.47a.75.75 0 00-1.06 1.06l18 18a.75.75 0 101.06-1.06l-18-18zM22.676 12.553a11.249 11.249 0 01-2.631 4.31l-3.099-3.099a5.25 5.25 0 00-6.71-6.71L7.759 4.577a11.217 11.217 0 014.242-.827c4.97 0 9.185 3.223 10.675 7.69.12.362.12.752 0 1.113z\" />\n <path d=\"M15.75 12c0 .18-.013.357-.037.53l-4.244-4.243A3.75 3.75 0 0115.75 12zM12.53 15.713l-4.243-4.244a3.75 3.75 0 004.243 4.243z\" />\n <path d=\"M6.75 12c0-.619.107-1.213.304-1.764l-3.1-3.1a11.25 11.25 0 00-2.63 4.31c-.12.362-.12.752 0 1.114 1.489 4.467 5.704 7.69 10.675 7.69 1.5 0 2.933-.294 4.242-.827l-2.477-2.477A5.25 5.25 0 016.75 12z\" />\n </svg>\n)\n\nconst ArrowRight = ({ color = '#fff', className = 'h-6 w-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill={color} className={className}>\n <path fillRule=\"evenodd\" d=\"M3.75 12a.75.75 0 01.75-.75h13.19l-5.47-5.47a.75.75 0 011.06-1.06l6.75 6.75a.75.75 0 010 1.06l-6.75 6.75a.75.75 0 11-1.06-1.06l5.47-5.47H4.5a.75.75 0 01-.75-.75z\" clipRule=\"evenodd\" />\n </svg>\n)\n\nconst Minus = ({ color = '#fff', className = 'h-6 w-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19.5 12h-15\" />\n </svg>\n)\n\nconst Dashboard = ({ color = '#fff', size = 30 }) => (\n <svg width={size} height={size} viewBox=\"0 0 28 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M14.4688 9.65625H24.7812M3.21875 14.3438H13.5312M14 3.09375V20.9062M2.28125 2.15625H25.7188V21.8438H2.28125V2.15625Z\" stroke={color} strokeWidth=\"2.8125\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n)\n\nconst FleetIcon = ({ color = '#fff', size = 30 }) => (\n <svg width={size} height={size} viewBox=\"0 0 30 30\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clipPath=\"url(#clip0_327_836)\">\n <path d=\"M26.5249 26.0324C26.7104 25.8203 26.93 25.7143 27.1839 25.7143C27.4377 25.7143 27.6573 25.8203 27.8428 26.0324L29.7173 28.1752L28.3993 29.6819L27.1839 28.2924L25.9684 29.6819C25.7927 29.894 25.573 30 25.3094 30C25.0458 30 24.8262 29.894 24.6504 29.6819L23.435 28.2924L22.2195 29.6819C22.034 29.894 21.8144 30 21.5605 30C21.3067 30 21.087 29.894 20.9016 29.6819L19.6861 28.2924L18.4706 29.6819C18.2852 29.894 18.0655 30 17.8117 30C17.5578 30 17.3382 29.894 17.1527 29.6819L15.9372 28.2924L14.7218 29.6819C14.5363 29.894 14.3166 30 14.0628 30C13.809 30 13.5893 29.894 13.4038 29.6819L12.1884 28.2924L10.9729 29.6819C10.7874 29.894 10.5677 30 10.3139 30C10.0601 30 9.84042 29.894 9.65493 29.6819L8.43948 28.2924L7.22402 29.6819C7.03853 29.894 6.81887 30 6.56504 30C6.31121 30 6.09155 29.894 5.90606 29.6819L4.6906 28.2924L3.47515 29.6819C3.28966 29.894 3.06999 30 2.81616 30C2.56233 30 2.34267 29.894 2.15718 29.6819L0.282745 27.5391L1.60071 26.0324L2.81616 27.4219L4.03162 26.0324C4.21711 25.8203 4.43677 25.7143 4.6906 25.7143C4.94443 25.7143 5.16409 25.8203 5.34958 26.0324L6.56504 27.4219L7.7805 26.0324C7.96599 25.8203 8.18565 25.7143 8.43948 25.7143C8.69331 25.7143 8.91297 25.8203 9.09846 26.0324L10.3139 27.4219L11.5294 26.0324C11.7149 25.8203 11.9345 25.7143 12.1884 25.7143C12.4422 25.7143 12.6618 25.8203 12.8473 26.0324L14.0628 27.4219L15.2782 26.0324C15.4637 25.8203 15.6834 25.7143 15.9372 25.7143C16.1911 25.7143 16.4107 25.8203 16.5962 26.0324L17.8117 27.4219L19.0271 26.0324C19.2126 25.8203 19.4323 25.7143 19.6861 25.7143C19.9399 25.7143 20.1596 25.8203 20.3451 26.0324L21.5605 27.4219L22.776 26.0324C22.9615 25.8203 23.1811 25.7143 23.435 25.7143C23.6888 25.7143 23.9085 25.8203 24.094 26.0324L25.3094 27.4219L26.5249 26.0324ZM3.47515 25.3962C3.28966 25.6083 3.06999 25.7143 2.81616 25.7143C2.56233 25.7143 2.34267 25.6083 2.15718 25.3962L0.282745 23.2533L1.60071 21.7467L2.81616 23.1194L4.03162 21.7467C4.21711 21.5346 4.43677 21.4286 4.6906 21.4286C4.94443 21.4286 5.16409 21.5346 5.34958 21.7467L6.56504 23.1194L7.50226 22.048V17.1429L4.42701 11.8862C4.26104 11.596 4.22687 11.2807 4.3245 10.9403C4.42213 10.5999 4.61738 10.3739 4.91026 10.2623L7.50226 9.29129V4.28571H9.3767V2.14286H13.1256V0H16.8744V2.14286H20.6233V4.28571H22.4978V9.29129L25.0898 10.2623C25.3826 10.3739 25.5779 10.5999 25.6755 10.9403C25.7731 11.2807 25.739 11.596 25.573 11.8862L22.4978 17.1429V22.048L22.776 21.7467C22.9615 21.5346 23.1811 21.4286 23.435 21.4286C23.6888 21.4286 23.9085 21.5346 24.094 21.7467L25.3094 23.1194L26.5249 21.7467C26.7104 21.5346 26.93 21.4286 27.1839 21.4286C27.4377 21.4286 27.6573 21.5346 27.8428 21.7467L29.7173 23.8895L28.3993 25.3962L27.1839 24.0067L25.9684 25.3962C25.7927 25.6083 25.573 25.7143 25.3094 25.7143C25.0458 25.7143 24.8262 25.6083 24.6504 25.3962L23.435 24.0067L22.2195 25.3962C22.034 25.6083 21.8144 25.7143 21.5605 25.7143C21.3067 25.7143 21.087 25.6083 20.9016 25.3962L19.6861 24.0067L18.4706 25.3962C18.2852 25.6083 18.0655 25.7143 17.8117 25.7143C17.5578 25.7143 17.3382 25.6083 17.1527 25.3962L15.9372 24.0067L14.7218 25.3962C14.5363 25.6083 14.3166 25.7143 14.0628 25.7143C13.809 25.7143 13.5893 25.6083 13.4038 25.3962L12.1884 24.0067L10.9729 25.3962C10.7874 25.6083 10.5677 25.7143 10.3139 25.7143C10.0601 25.7143 9.84042 25.6083 9.65493 25.3962L8.43948 24.0067L7.22402 25.3962C7.03853 25.6083 6.81887 25.7143 6.56504 25.7143C6.31121 25.7143 6.09155 25.6083 5.90606 25.3962L4.6906 24.0067L3.47515 25.3962ZM9.3767 6.42857V8.57143L15 6.42857L20.6233 8.57143V6.42857H18.7489V4.28571H11.2511V6.42857H9.3767Z\" fill={color} />\n </g>\n <defs>\n <clipPath id=\"clip0_327_836\"><rect width=\"30\" height=\"30\" fill={color} /></clipPath>\n </defs>\n </svg>\n)\n\nconst Performance = ({ color = '#fff', size = 30 }) => (\n <svg width={size} height={size} viewBox=\"0 0 30 30\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M5.64 25.515H24.36C26.0709 23.3842 27.0024 20.7327 27 18C27 11.385 21.63 6 15 6C8.37 6 3 11.385 3 18C3 20.85 3.99 23.445 5.64 25.515ZM13.5 9C13.5 8.175 14.175 7.5 15 7.5C15.825 7.5 16.5 8.175 16.5 9C16.5 9.84 15.825 10.5 15 10.5C14.175 10.5 13.5 9.84 13.5 9ZM6 12C6 11.175 6.675 10.5 7.5 10.5C8.325 10.5 9 11.175 9 12C9 12.84 8.325 13.5 7.5 13.5C6.675 13.5 6 12.84 6 12ZM12.78 17.1C14.04 15.855 22.545 11.85 22.545 11.85C22.545 11.85 18.555 20.37 17.31 21.615C16.05 22.875 14.04 22.875 12.78 21.615C12.1819 21.016 11.8459 20.204 11.8459 19.3575C11.8459 18.511 12.1819 17.699 12.78 17.1ZM4.5 19.5C4.5 18.675 5.175 18 6 18C6.825 18 7.5 18.675 7.5 19.5C7.5 20.34 6.825 21 6 21C5.175 21 4.5 20.34 4.5 19.5ZM13.5 19.5C13.5 18.675 14.175 18 15 18C15.825 18 16.5 18.675 16.5 19.5C16.5 20.34 15.825 21 15 21C14.175 21 13.5 20.34 13.5 19.5ZM22.5 19.5C22.5 18.675 23.175 18 24 18C24.825 18 25.5 18.675 25.5 19.5C25.5 20.34 24.825 21 24 21C23.175 21 22.5 20.34 22.5 19.5Z\" fill={color} />\n </svg>\n)\n\nconst Map = ({ color = '#fff', size = 30 }) => (\n <svg width={size} height={size} viewBox=\"0 0 34 30\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clipPath=\"url(#clip0_327_830)\">\n <path d=\"M16.875 0C12.7975 0 9.49219 3.30527 9.49219 7.38281C9.49219 10.6793 14.3174 16.6875 16.166 18.8684C16.5404 19.3102 17.2102 19.3102 17.584 18.8684C19.4326 16.6875 24.2578 10.6793 24.2578 7.38281C24.2578 3.30527 20.9525 0 16.875 0ZM16.875 9.84375C15.5156 9.84375 14.4141 8.74219 14.4141 7.38281C14.4141 6.02344 15.5156 4.92188 16.875 4.92188C18.2344 4.92188 19.3359 6.02344 19.3359 7.38281C19.3359 8.74219 18.2344 9.84375 16.875 9.84375ZM1.17891 12.6533C0.830964 12.7925 0.532694 13.0327 0.322564 13.343C0.112435 13.6533 8.33325e-05 14.0194 0 14.3941L0 29.0613C0 29.7246 0.669727 30.1781 1.28555 29.932L9.375 26.25V12.593C8.85703 11.6566 8.4334 10.7449 8.12988 9.87305L1.17891 12.6533ZM16.875 21.0744C16.0506 21.0744 15.2707 20.7123 14.7357 20.0807C13.5838 18.7213 12.3586 17.1732 11.25 15.5854V26.2494L22.5 29.9994V15.5859C21.3914 17.1732 20.1668 18.7219 19.0143 20.0812C18.4793 20.7123 17.6994 21.0744 16.875 21.0744ZM32.4645 9.44297L24.375 13.125V30L32.5711 26.7217C32.9191 26.5826 33.2174 26.3424 33.4275 26.0321C33.6377 25.7218 33.75 25.3556 33.75 24.9809V10.3137C33.75 9.65039 33.0803 9.19688 32.4645 9.44297Z\" fill={color} />\n </g>\n <defs>\n <clipPath id=\"clip0_327_830\"><rect width=\"33.75\" height=\"30\" fill={color} /></clipPath>\n </defs>\n </svg>\n)\n\nconst CharterParty = ({ color = '#fff', size = 30 }) => (\n <svg width={size} height={size} viewBox=\"0 0 30 30\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <mask id=\"mask0_327_823\" style={{ maskType: 'alpha' }} maskUnits=\"userSpaceOnUse\" x=\"3\" y=\"1\" width=\"24\" height=\"28\">\n <path d=\"M23.75 2.5H6.25C5.55964 2.5 5 3.05964 5 3.75V26.25C5 26.9404 5.55964 27.5 6.25 27.5H23.75C24.4404 27.5 25 26.9404 25 26.25V3.75C25 3.05964 24.4404 2.5 23.75 2.5Z\" stroke=\"white\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M10 2.5H15.625V12.5L12.8125 10L10 12.5V2.5Z\" fill={color} stroke={color} strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M10 17.5H16.25M10 21.25H20\" stroke={color} strokeWidth=\"2.5\" strokeLinecap=\"round\" />\n </mask>\n <g mask=\"url(#mask0_327_823)\"><path d=\"M0 0H30V30H0V0Z\" fill={color} /></g>\n </svg>\n)\n\nconst Compliance = ({ color = '#fff', size = 30 }) => (\n <svg width={size} height={size} viewBox=\"0 0 30 30\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clipPath=\"url(#clip0_327_821)\">\n <path d=\"M1.87499 14.9962C1.86582 11.6183 3.15973 8.36699 5.48738 5.91906C7.81504 3.47112 10.9971 2.01516 14.3712 1.85426C17.7453 1.69336 21.0514 2.83991 23.6015 5.05525C26.1515 7.27058 27.7489 10.384 28.0612 13.7475C27.6828 13.6443 27.3021 13.5499 26.9194 13.4644C24.8954 13.0002 22.8059 12.893 20.745 13.1475C19.9256 13.2506 19.1512 13.41 18.4219 13.6312C18.325 13.4207 18.2243 13.2119 18.12 13.005C17.9905 12.7506 17.8673 12.493 17.7506 12.2325C17.5856 11.8575 17.4056 11.37 17.4375 10.8525C17.475 10.2525 17.7787 9.76498 18.2681 9.39748C18.8625 8.95123 19.6106 7.92935 20.2556 6.89623C20.5669 6.4031 20.8312 5.93998 21.0187 5.60248L21.0619 5.52373C19.2523 4.36216 17.1465 3.74636 14.9962 3.74998H14.9062C15.0769 4.08748 15.2644 4.4906 15.4331 4.93873C15.8906 6.14998 16.3031 7.92373 15.5662 9.49123C14.8894 10.935 13.7212 11.31 12.8475 11.535L12.7219 11.5669C11.8725 11.7862 11.5219 11.8762 11.2669 12.2606C11.0306 12.6206 11.0737 13.0725 11.3419 13.9481L11.4037 14.145C11.5106 14.4862 11.6381 14.8912 11.7037 15.2737C11.7862 15.75 11.8087 16.3462 11.5087 16.9237C11.2532 17.4397 10.8463 17.8655 10.3425 18.1444C9.95176 18.3427 9.5312 18.4757 9.09749 18.5381L8.96999 18.5606C8.29874 18.6787 7.95749 18.7387 7.62936 19.0893C7.37249 19.365 7.21311 19.8431 7.12124 20.5369C7.08374 20.82 7.05936 21.1012 7.03686 21.3919L7.02374 21.5456C7.00327 21.8794 6.96005 22.2114 6.89436 22.5394L6.84749 22.7456C8.00741 23.9672 9.42664 24.9129 11.0006 25.5131C10.6481 26.0381 10.3219 26.5819 10.0181 27.1406C7.60928 26.1523 5.54882 24.4699 4.09879 22.3074C2.64875 20.1449 1.87467 17.5999 1.87499 14.9962ZM29.8594 16.3837C29.7756 16.2476 29.6584 16.1351 29.5189 16.057C29.3795 15.9789 29.2223 15.9377 29.0625 15.9375H29.0475C28.9738 15.9284 28.9006 15.9159 28.8281 15.9C28.64 15.8553 28.4531 15.8059 28.2675 15.7519L28.0894 15.7031C27.5677 15.5518 27.0419 15.4155 26.5125 15.2943C24.6983 14.8768 22.8251 14.7798 20.9775 15.0075C18.7237 15.2887 17.0006 16.0537 15.825 17.1487C14.6437 18.2531 14.0625 19.6556 14.0625 21.0862C14.0625 21.4294 14.0887 21.7556 14.1337 22.0612C16.1025 20.3437 18.5306 18.9544 21.2137 17.88C21.3281 17.8342 21.4504 17.8114 21.5736 17.8128C21.6968 17.8143 21.8185 17.84 21.9317 17.8885C22.045 17.937 22.1476 18.0073 22.2337 18.0954C22.3197 18.1836 22.3876 18.2878 22.4334 18.4022C22.4792 18.5165 22.502 18.6388 22.5006 18.762C22.4991 18.8852 22.4734 19.0069 22.4249 19.1202C22.3764 19.2334 22.3061 19.336 22.218 19.4221C22.1298 19.5082 22.0256 19.5761 21.9112 19.6219C20.4169 20.22 19.035 20.91 17.79 21.6881C14.6925 23.4956 12.7631 25.8169 11.3494 28.6444C11.2898 28.7549 11.253 28.8762 11.2412 29.0012C11.2294 29.1262 11.2428 29.2523 11.2807 29.372C11.3185 29.4917 11.38 29.6026 11.4616 29.6981C11.5431 29.7936 11.643 29.8717 11.7553 29.9279C11.8676 29.984 11.99 30.017 12.1153 30.025C12.2406 30.0329 12.3662 30.0156 12.4847 29.974C12.6032 29.9325 12.7121 29.8676 12.805 29.7831C12.898 29.6987 12.973 29.5965 13.0256 29.4825C13.7456 28.0462 14.6062 26.7544 15.7406 25.605C16.0418 26.1539 16.4089 26.6639 16.8337 27.1237C17.7037 28.0612 19.1081 29.0625 21.0937 29.0625C22.3162 29.0625 23.3325 28.7512 24.165 28.2075C24.99 27.6712 25.5862 26.9419 26.0325 26.1769C26.7225 24.9956 27.1181 23.5893 27.4106 22.5469C27.4856 22.2843 27.5512 22.0462 27.615 21.84C27.9394 20.7825 28.4137 19.8337 28.8525 19.0575C29.0737 18.6712 29.2819 18.3319 29.4619 18.0431L29.4919 17.9944C29.6374 17.7668 29.7737 17.5335 29.9006 17.295C29.9719 17.1521 30.0055 16.9935 29.9983 16.834C29.9911 16.6745 29.9433 16.5195 29.8594 16.3837Z\" fill={color} />\n </g>\n <defs>\n <clipPath id=\"clip0_327_821\"><rect width=\"30\" height=\"30\" fill={color} /></clipPath>\n </defs>\n </svg>\n)\n\nconst Applications = ({ color = '#fff', size = 30 }) => (\n <svg width={size} height={size} viewBox=\"0 0 30 30\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M3.28125 3.28125H11.7188V11.7188H3.28125V3.28125ZM3.28125 18.2812H11.7188V26.7188H3.28125V18.2812ZM18.2812 18.2812H26.7188V26.7188H18.2812V18.2812ZM18.2812 3.28125H26.7188V11.7188H18.2812V3.28125Z\" stroke={color} strokeWidth=\"2.8125\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n)\n\nconst PowerOff = ({ color = '#fff', size = 6 }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={`w-${size} h-${size}`}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5.636 5.636a9 9 0 1012.728 0M12 3v9\" />\n </svg>\n)\n\nconst ChevronDown = ({ color = '#fff', className = 'h-6 w-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19.5 8.25l-7.5 7.5-7.5-7.5\" />\n </svg>\n)\n\nconst ChevronRight = ({ color = '#fff', className = 'h-6 w-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M8.25 4.5l7.5 7.5-7.5 7.5\" />\n </svg>\n)\n\nconst Checked = ({ color = '#fff', size = 4 }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={`w-${size} h-${size}`}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\" />\n </svg>\n)\n\nconst Search = ({ color = '#fff', size = 4 }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={`w-${size} h-${size}`}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M21 21l-5.197-5.197m0 0A7.5 7.5 0 105.196 5.196a7.5 7.5 0 0010.607 10.607z\" />\n </svg>\n)\n\nconst Calendar = ({ color = '#fff', className = 'h-6 w-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6.75 3v2.25M17.25 3v2.25M3 18.75V7.5a2.25 2.25 0 012.25-2.25h13.5A2.25 2.25 0 0121 7.5v11.25m-18 0A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75m-18 0v-7.5A2.25 2.25 0 015.25 9h13.5A2.25 2.25 0 0121 11.25v7.5\" />\n </svg>\n)\n\nconst Clock = ({ color = '#fff', className = 'h-6 w-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 6v6h4.5m4.5 0a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n)\n\nconst ChartBoard = ({ color = '#fff', className = 'h-6 w-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.75 3v11.25A2.25 2.25 0 006 16.5h2.25M3.75 3h-1.5m1.5 0h16.5m0 0h1.5m-1.5 0v11.25A2.25 2.25 0 0118 16.5h-2.25m-7.5 0h7.5m-7.5 0l-1 3m8.5-3l1 3m0 0l.5 1.5m-.5-1.5h-9.5m0 0l-.5 1.5m.75-9l3-3 2.148 2.148A12.061 12.061 0 0116.5 7.605\" />\n </svg>\n)\n\nconst BarChartBoard = ({ color = '#fff', className = 'h-6 w-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.75 3v11.25A2.25 2.25 0 006 16.5h2.25M3.75 3h-1.5m1.5 0h16.5m0 0h1.5m-1.5 0v11.25A2.25 2.25 0 0118 16.5h-2.25m-7.5 0h7.5m-7.5 0l-1 3m8.5-3l1 3m0 0l.5 1.5m-.5-1.5h-9.5m0 0l-.5 1.5M9 11.25v1.5M12 9v3.75m3-6v6\" />\n </svg>\n)\n\nconst ChartBar = ({ color = '#fff', className = 'h-6 w-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3 13.125C3 12.504 3.504 12 4.125 12h2.25c.621 0 1.125.504 1.125 1.125v6.75C7.5 20.496 6.996 21 6.375 21h-2.25A1.125 1.125 0 013 19.875v-6.75zM9.75 8.625c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125v11.25c0 .621-.504 1.125-1.125 1.125h-2.25a1.125 1.125 0 01-1.125-1.125V8.625zM16.5 4.125c0-.621.504-1.125 1.125-1.125h2.25C20.496 3 21 3.504 21 4.125v15.75c0 .621-.504 1.125-1.125 1.125h-2.25a1.125 1.125 0 01-1.125-1.125V4.125z\" />\n </svg>\n)\n\nconst PieChart = ({ color = '#fff', className = 'h-6 w-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M10.5 6a7.5 7.5 0 107.5 7.5h-7.5V6z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M13.5 10.5H21A7.5 7.5 0 0013.5 3v7.5z\" />\n </svg>\n)\n\nconst BarChartSquare = ({ color = '#fff', className = 'h-6 w-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M7.5 14.25v2.25m3-4.5v4.5m3-6.75v6.75m3-9v9M6 20.25h12A2.25 2.25 0 0020.25 18V6A2.25 2.25 0 0018 3.75H6A2.25 2.25 0 003.75 6v12A2.25 2.25 0 006 20.25z\" />\n </svg>\n)\n\nconst Shield = ({ color = '#fff', className = 'h-6 w-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 9v3.75m0-10.036A11.959 11.959 0 013.598 6 11.99 11.99 0 003 9.75c0 5.592 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.31-.21-2.57-.598-3.75h-.152c-3.196 0-6.1-1.249-8.25-3.286zm0 13.036h.008v.008H12v-.008z\" />\n </svg>\n)\n\nconst Calculator = ({ color = '#fff', className = 'h-6 w-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15.75 15.75V18m-7.5-6.75h.008v.008H8.25v-.008zm0 2.25h.008v.008H8.25V13.5zm0 2.25h.008v.008H8.25v-.008zm0 2.25h.008v.008H8.25V18zm2.498-6.75h.007v.008h-.007v-.008zm0 2.25h.007v.008h-.007V13.5zm0 2.25h.007v.008h-.007v-.008zm0 2.25h.007v.008h-.007V18zm2.504-6.75h.008v.008h-.008v-.008zm0 2.25h.008v.008h-.008V13.5zm0 2.25h.008v.008h-.008v-.008zm0 2.25h.008v.008h-.008V18zm2.498-6.75h.008v.008h-.008v-.008zm0 2.25h.008v.008h-.008V13.5zM8.25 6h7.5v2.25h-7.5V6zM12 2.25c-1.892 0-3.758.11-5.593.322C5.307 2.7 4.5 3.65 4.5 4.757V19.5a2.25 2.25 0 002.25 2.25h10.5a2.25 2.25 0 002.25-2.25V4.757c0-1.108-.806-2.057-1.907-2.185A48.507 48.507 0 0012 2.25z\" />\n </svg>\n)\n\nconst Contract = ({ color = '#fff', className = 'h-6 w-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 12h3.75M9 15h3.75M9 18h3.75m3 .75H18a2.25 2.25 0 002.25-2.25V6.108c0-1.135-.845-2.098-1.976-2.192a48.424 48.424 0 00-1.123-.08m-5.801 0c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m0 0H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V9.375c0-.621-.504-1.125-1.125-1.125H8.25zM6.75 12h.008v.008H6.75V12zm0 3h.008v.008H6.75V15zm0 3h.008v.008H6.75V18z\" />\n </svg>\n)\n\nconst Buoy = ({ color = '#fff', className = 'h-6 w-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M16.712 4.33a9.027 9.027 0 011.652 1.306c.51.51.944 1.064 1.306 1.652M16.712 4.33l-3.448 4.138m3.448-4.138a9.014 9.014 0 00-9.424 0M19.67 7.288l-4.138 3.448m4.138-3.448a9.014 9.014 0 010 9.424m-4.138-5.976a3.736 3.736 0 00-.88-1.388 3.737 3.737 0 00-1.388-.88m2.268 2.268a3.765 3.765 0 010 2.528m-2.268-4.796a3.765 3.765 0 00-2.528 0m4.796 4.796c-.181.506-.475.982-.88 1.388a3.736 3.736 0 01-1.388.88m2.268-2.268l4.138 3.448m0 0a9.027 9.027 0 01-1.306 1.652c-.51.51-1.064.944-1.652 1.306m0 0l-3.448-4.138m3.448 4.138a9.014 9.014 0 01-9.424 0m5.976-4.138a3.765 3.765 0 01-2.528 0m0 0a3.736 3.736 0 01-1.388-.88 3.737 3.737 0 01-.88-1.388m2.268 2.268L7.288 19.67m0 0a9.024 9.024 0 01-1.652-1.306 9.027 9.027 0 01-1.306-1.652m0 0l4.138-3.448M4.33 16.712a9.014 9.014 0 010-9.424m4.138 5.976a3.765 3.765 0 010-2.528m0 0c.181-.506.475-.982.88-1.388a3.736 3.736 0 011.388-.88m-2.268 2.268L4.33 7.288m6.406 1.18L7.288 4.33m0 0a9.024 9.024 0 00-1.652 1.306A9.025 9.025 0 004.33 7.288\" />\n </svg>\n)\n\nconst Cog = ({ color = '#fff', className = 'h-6 w-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M10.343 3.94c.09-.542.56-.94 1.11-.94h1.093c.55 0 1.02.398 1.11.94l.149.894c.07.424.384.764.78.93.398.164.855.142 1.205-.108l.737-.527a1.125 1.125 0 011.45.12l.773.774c.39.389.44 1.002.12 1.45l-.527.737c-.25.35-.272.806-.107 1.204.165.397.505.71.93.78l.893.15c.543.09.94.56.94 1.109v1.094c0 .55-.397 1.02-.94 1.11l-.893.149c-.425.07-.765.383-.93.78-.165.398-.143.854.107 1.204l.527.738c.32.447.269 1.06-.12 1.45l-.774.773a1.125 1.125 0 01-1.449.12l-.738-.527c-.35-.25-.806-.272-1.203-.107-.397.165-.71.505-.781.929l-.149.894c-.09.542-.56.94-1.11.94h-1.094c-.55 0-1.019-.398-1.11-.94l-.148-.894c-.071-.424-.384-.764-.781-.93-.398-.164-.854-.142-1.204.108l-.738.527c-.447.32-1.06.269-1.45-.12l-.773-.774a1.125 1.125 0 01-.12-1.45l.527-.737c.25-.35.273-.806.108-1.204-.165-.397-.505-.71-.93-.78l-.894-.15c-.542-.09-.94-.56-.94-1.109v-1.094c0-.55.398-1.02.94-1.11l.894-.149c.424-.07.765-.383.93-.78.165-.398.143-.854-.107-1.204l-.527-.738a1.125 1.125 0 01.12-1.45l.773-.773a1.125 1.125 0 011.45-.12l.737.527c.35.25.807.272 1.204.107.397-.165.71-.505.78-.929l.15-.894z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n)\n\nconst TableIcon = ({ color = '#fff', className = 'h-6 w-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.375 19.5h17.25m-17.25 0a1.125 1.125 0 01-1.125-1.125M3.375 19.5h7.5c.621 0 1.125-.504 1.125-1.125m-9.75 0V5.625m0 12.75v-1.5c0-.621.504-1.125 1.125-1.125m18.375 2.625V5.625m0 12.75c0 .621-.504 1.125-1.125 1.125m1.125-1.125v-1.5c0-.621-.504-1.125-1.125-1.125m0 3.75h-7.5A1.125 1.125 0 0112 18.375m9.75-12.75c0-.621-.504-1.125-1.125-1.125H3.375c-.621 0-1.125.504-1.125 1.125m19.5 0v1.5c0 .621-.504 1.125-1.125 1.125M2.25 5.625v1.5c0 .621.504 1.125 1.125 1.125m0 0h17.25m-17.25 0h7.5c.621 0 1.125.504 1.125 1.125M3.375 8.25c-.621 0-1.125.504-1.125 1.125v1.5c0 .621.504 1.125 1.125 1.125m17.25-3.75h-7.5c-.621 0-1.125.504-1.125 1.125m8.625-1.125c.621 0 1.125.504 1.125 1.125v1.5c0 .621-.504 1.125-1.125 1.125m-17.25 0h7.5m-7.5 0c-.621 0-1.125.504-1.125 1.125v1.5c0 .621.504 1.125 1.125 1.125M12 10.875v-1.5m0 1.5c0 .621-.504 1.125-1.125 1.125M12 10.875c0 .621.504 1.125 1.125 1.125m-2.25 0c.621 0 1.125.504 1.125 1.125M13.125 12h7.5m-7.5 0c-.621 0-1.125.504-1.125 1.125M20.625 12c.621 0 1.125.504 1.125 1.125v1.5c0 .621-.504 1.125-1.125 1.125m-17.25 0h7.5M12 14.625v-1.5m0 1.5c0 .621-.504 1.125-1.125 1.125M12 14.625c0 .621.504 1.125 1.125 1.125m-2.25 0c.621 0 1.125.504 1.125 1.125m0 1.5v-1.5m0 0c0-.621.504-1.125 1.125-1.125m0 0h7.5\" />\n </svg>\n)\n\nconst Data = ({ color = '#fff', className = 'h-6 w-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M20.25 6.375c0 2.278-3.694 4.125-8.25 4.125S3.75 8.653 3.75 6.375m16.5 0c0-2.278-3.694-4.125-8.25-4.125S3.75 4.097 3.75 6.375m16.5 0v11.25c0 2.278-3.694 4.125-8.25 4.125s-8.25-1.847-8.25-4.125V6.375m16.5 0v3.75m-16.5-3.75v3.75m16.5 0v3.75C20.25 16.153 16.556 18 12 18s-8.25-1.847-8.25-4.125v-3.75m16.5 0c0 2.278-3.694 4.125-8.25 4.125s-8.25-1.847-8.25-4.125\" />\n </svg>\n)\n\nconst XClose = ({ color = '#fff', className = 'h-6 w-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n)\n\nconst Grid = ({ color = '#fff', size = 6 }) => (\n <svg width={size} height={size} viewBox=\"0 0 6 6\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clipPath=\"url(#clip0_401_39)\">\n <path d=\"M0.375 0.75C0.375 0.650544 0.414509 0.555161 0.484835 0.484835C0.555161 0.414509 0.650544 0.375 0.75 0.375H1.5C1.59946 0.375 1.69484 0.414509 1.76516 0.484835C1.83549 0.555161 1.875 0.650544 1.875 0.75V1.5C1.875 1.59946 1.83549 1.69484 1.76516 1.76516C1.69484 1.83549 1.59946 1.875 1.5 1.875H0.75C0.650544 1.875 0.555161 1.83549 0.484835 1.76516C0.414509 1.69484 0.375 1.59946 0.375 1.5V0.75ZM2.25 0.75C2.25 0.650544 2.28951 0.555161 2.35984 0.484835C2.43016 0.414509 2.52554 0.375 2.625 0.375H3.375C3.47446 0.375 3.56984 0.414509 3.64016 0.484835C3.71049 0.555161 3.75 0.650544 3.75 0.75V1.5C3.75 1.59946 3.71049 1.69484 3.64016 1.76516C3.56984 1.83549 3.47446 1.875 3.375 1.875H2.625C2.52554 1.875 2.43016 1.83549 2.35984 1.76516C2.28951 1.69484 2.25 1.59946 2.25 1.5V0.75ZM4.125 0.75C4.125 0.650544 4.16451 0.555161 4.23484 0.484835C4.30516 0.414509 4.40054 0.375 4.5 0.375H5.25C5.34946 0.375 5.44484 0.414509 5.51516 0.484835C5.58549 0.555161 5.625 0.650544 5.625 0.75V1.5C5.625 1.59946 5.58549 1.69484 5.51516 1.76516C5.44484 1.83549 5.34946 1.875 5.25 1.875H4.5C4.40054 1.875 4.30516 1.83549 4.23484 1.76516C4.16451 1.69484 4.125 1.59946 4.125 1.5V0.75ZM0.375 2.625C0.375 2.52554 0.414509 2.43016 0.484835 2.35984C0.555161 2.28951 0.650544 2.25 0.75 2.25H1.5C1.59946 2.25 1.69484 2.28951 1.76516 2.35984C1.83549 2.43016 1.875 2.52554 1.875 2.625V3.375C1.875 3.47446 1.83549 3.56984 1.76516 3.64016C1.69484 3.71049 1.59946 3.75 1.5 3.75H0.75C0.650544 3.75 0.555161 3.71049 0.484835 3.64016C0.414509 3.56984 0.375 3.47446 0.375 3.375V2.625ZM2.25 2.625C2.25 2.52554 2.28951 2.43016 2.35984 2.35984C2.43016 2.28951 2.52554 2.25 2.625 2.25H3.375C3.47446 2.25 3.56984 2.28951 3.64016 2.35984C3.71049 2.43016 3.75 2.52554 3.75 2.625V3.375C3.75 3.47446 3.71049 3.56984 3.64016 3.64016C3.56984 3.71049 3.47446 3.75 3.375 3.75H2.625C2.52554 3.75 2.43016 3.71049 2.35984 3.64016C2.28951 3.56984 2.25 3.47446 2.25 3.375V2.625ZM4.125 2.625C4.125 2.52554 4.16451 2.43016 4.23484 2.35984C4.30516 2.28951 4.40054 2.25 4.5 2.25H5.25C5.34946 2.25 5.44484 2.28951 5.51516 2.35984C5.58549 2.43016 5.625 2.52554 5.625 2.625V3.375C5.625 3.47446 5.58549 3.56984 5.51516 3.64016C5.44484 3.71049 5.34946 3.75 5.25 3.75H4.5C4.40054 3.75 4.30516 3.71049 4.23484 3.64016C4.16451 3.56984 4.125 3.47446 4.125 3.375V2.625ZM0.375 4.5C0.375 4.40054 0.414509 4.30516 0.484835 4.23484C0.555161 4.16451 0.650544 4.125 0.75 4.125H1.5C1.59946 4.125 1.69484 4.16451 1.76516 4.23484C1.83549 4.30516 1.875 4.40054 1.875 4.5V5.25C1.875 5.34946 1.83549 5.44484 1.76516 5.51516C1.69484 5.58549 1.59946 5.625 1.5 5.625H0.75C0.650544 5.625 0.555161 5.58549 0.484835 5.51516C0.414509 5.44484 0.375 5.34946 0.375 5.25V4.5ZM2.25 4.5C2.25 4.40054 2.28951 4.30516 2.35984 4.23484C2.43016 4.16451 2.52554 4.125 2.625 4.125H3.375C3.47446 4.125 3.56984 4.16451 3.64016 4.23484C3.71049 4.30516 3.75 4.40054 3.75 4.5V5.25C3.75 5.34946 3.71049 5.44484 3.64016 5.51516C3.56984 5.58549 3.47446 5.625 3.375 5.625H2.625C2.52554 5.625 2.43016 5.58549 2.35984 5.51516C2.28951 5.44484 2.25 5.34946 2.25 5.25V4.5ZM4.125 4.5C4.125 4.40054 4.16451 4.30516 4.23484 4.23484C4.30516 4.16451 4.40054 4.125 4.5 4.125H5.25C5.34946 4.125 5.44484 4.16451 5.51516 4.23484C5.58549 4.30516 5.625 4.40054 5.625 4.5V5.25C5.625 5.34946 5.58549 5.44484 5.51516 5.51516C5.44484 5.58549 5.34946 5.625 5.25 5.625H4.5C4.40054 5.625 4.30516 5.58549 4.23484 5.51516C4.16451 5.44484 4.125 5.34946 4.125 5.25V4.5Z\" fill={color} />\n </g>\n <defs><clipPath id=\"clip0_401_39\"><rect width=\"6\" height=\"6\" fill=\"white\" /></clipPath></defs>\n </svg>\n)\n\nconst Carousel = ({ color = '#fff', size = 6 }) => (\n <svg width={size} height={size} viewBox=\"0 0 6 6\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clipPath=\"url(#clip0_401_41)\">\n <path d=\"M1 4.75H1.5C1.5 5.02575 1.72425 5.25 2 5.25H4C4.27575 5.25 4.5 5.02575 4.5 4.75H5C5.27575 4.75 5.5 4.52575 5.5 4.25V1.75C5.5 1.47425 5.27575 1.25 5 1.25H4.5C4.5 0.97425 4.27575 0.75 4 0.75H2C1.72425 0.75 1.5 0.97425 1.5 1.25H1C0.72425 1.25 0.5 1.47425 0.5 1.75V4.25C0.5 4.52575 0.72425 4.75 1 4.75ZM5 1.75V4.25H4.5V1.75H5ZM2 1.25H4L4.00025 4.75H2V1.25ZM1 1.75H1.5V4.25H1V1.75Z\" fill={color} />\n </g>\n <defs><clipPath id=\"clip0_401_41\"><rect width=\"6\" height=\"6\" fill=\"white\" /></clipPath></defs>\n </svg>\n)\n\nconst DoubleChevronRight = ({ color = '#fff', className = 'w-6 h-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M11.25 4.5l7.5 7.5-7.5 7.5m-6-15l7.5 7.5-7.5 7.5\" />\n </svg>\n)\n\nconst PlusCircle = ({ color = '#fff', className = 'w-6 h-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 9v6m3-3H9m12 0a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n)\n\nconst Info = ({ color = '#fff', className = 'w-6 h-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M11.25 11.25l.041-.02a.75.75 0 011.063.852l-.708 2.836a.75.75 0 001.063.853l.041-.021M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9-3.75h.008v.008H12V8.25z\" />\n </svg>\n)\n\nconst Warning = ({ color = '#fff', className = 'w-6 h-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z\" />\n </svg>\n)\n\nconst ErrorIcon = ({ color = '#fff', className = 'w-6 h-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 9v3.75m0-10.036A11.959 11.959 0 013.598 6 11.99 11.99 0 003 9.75c0 5.592 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.31-.21-2.57-.598-3.75h-.152c-3.196 0-6.1-1.249-8.25-3.286zm0 13.036h.008v.008H12v-.008z\" />\n </svg>\n)\n\nconst ShowMore = ({ color = '#fff', className = 'w-6 h-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 6.75a.75.75 0 110-1.5.75.75 0 010 1.5zM12 12.75a.75.75 0 110-1.5.75.75 0 010 1.5zM12 18.75a.75.75 0 110-1.5.75.75 0 010 1.5z\" />\n </svg>\n)\n\nconst Tweak = ({ color = '#fff', className = 'w-6 h-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M10.5 6h9.75M10.5 6a1.5 1.5 0 11-3 0m3 0a1.5 1.5 0 10-3 0M3.75 6H7.5m3 12h9.75m-9.75 0a1.5 1.5 0 01-3 0m3 0a1.5 1.5 0 00-3 0m-3.75 0H7.5m9-6h3.75m-3.75 0a1.5 1.5 0 01-3 0m3 0a1.5 1.5 0 00-3 0m-9.75 0h9.75\" />\n </svg>\n)\n\nconst Download = ({ color = '#fff', className = 'w-6 h-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5M16.5 12L12 16.5m0 0L7.5 12m4.5 4.5V3\" />\n </svg>\n)\n\nconst Expand = ({ color = '#fff', className = 'w-6 h-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.75 3.75v4.5m0-4.5h4.5m-4.5 0L9 9M3.75 20.25v-4.5m0 4.5h4.5m-4.5 0L9 15M20.25 3.75h-4.5m4.5 0v4.5m0-4.5L15 9m5.25 11.25h-4.5m4.5 0v-4.5m0 4.5L15 15\" />\n </svg>\n)\n\nconst Collapse = ({ color = '#fff', className = 'w-6 h-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 9V4.5M9 9H4.5M9 9L3.75 3.75M9 15v4.5M9 15H4.5M9 15l-5.25 5.25M15 9h4.5M15 9V4.5M15 9l5.25-5.25M15 15h4.5M15 15v4.5m0-4.5l5.25 5.25\" />\n </svg>\n)\n\nconst ShieldCheck = ({ color = '#fff', className = 'w-6 h-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 12.75L11.25 15 15 9.75m-3-7.036A11.959 11.959 0 013.598 6 11.99 11.99 0 003 9.749c0 5.592 3.824 10.29 9 11.623 5.176-1.332 9-6.03 9-11.622 0-1.31-.21-2.571-.598-3.751h-.152c-3.196 0-6.1-1.248-8.25-3.285z\" />\n </svg>\n)\n\nconst XCircle = ({ color = '#fff', className = 'w-6 h-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9.75 9.75l4.5 4.5m0-4.5l-4.5 4.5M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n)\n\nconst Play = ({ color = '#fff', className = 'w-6 h-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5.25 5.653c0-.856.917-1.398 1.667-.986l11.54 6.348a1.125 1.125 0 010 1.971l-11.54 6.347a1.125 1.125 0 01-1.667-.985V5.653z\" />\n </svg>\n)\n\nconst Document = ({ color = '#fff', className = 'w-6 h-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m.75 12l3 3m0 0l3-3m-3 3v-6m-1.5-9H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z\" />\n </svg>\n)\n\nconst EditIcon = ({ color = '#fff', className = 'w-6 h-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M16.862 4.487l1.687-1.688a1.875 1.875 0 112.652 2.652L10.582 16.07a4.5 4.5 0 01-1.897 1.13L6 18l.8-2.685a4.5 4.5 0 011.13-1.897l8.932-8.931zm0 0L19.5 7.125M18 14v4.75A2.25 2.25 0 0115.75 21H5.25A2.25 2.25 0 013 18.75V8.25A2.25 2.25 0 015.25 6H10\" />\n </svg>\n)\n\nconst Upload = ({ color = '#fff', className = 'w-6 h-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 16.5V9.75m0 0l3 3m-3-3l-3 3M6.75 19.5a4.5 4.5 0 01-1.41-8.775 5.25 5.25 0 0110.233-2.33 3 3 0 013.758 3.848A3.752 3.752 0 0118 19.5H6.75z\" />\n </svg>\n)\n\nconst FileIcon = ({ color = '#fff', className = 'w-6 h-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M10.125 2.25h-4.5c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125v-9M10.125 2.25h.375a9 9 0 019 9v.375M10.125 2.25A3.375 3.375 0 0113.5 5.625v1.5c0 .621.504 1.125 1.125 1.125h1.5a3.375 3.375 0 013.375 3.375M9 15l2.25 2.25L15 12\" />\n </svg>\n)\n\nconst Delete = ({ color = '#fff', className = 'w-6 h-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M14.74 9l-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 01-2.244 2.077H8.084a2.25 2.25 0 01-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 00-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 013.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 00-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 00-7.5 0\" />\n </svg>\n)\n\nconst Bookmarks = ({ color = '#000', className = 'w-6 h-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M16.5 3.75V16.5L12 14.25 7.5 16.5V3.75m9 0H18A2.25 2.25 0 0120.25 6v12A2.25 2.25 0 0118 20.25H6A2.25 2.25 0 013.75 18V6A2.25 2.25 0 016 3.75h1.5m9 0h-9\" />\n </svg>\n)\n\nconst Save = ({ color = '#000', size = 16 }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fillRule=\"evenodd\" clipRule=\"evenodd\" d=\"M18.1716 1C18.702 1 19.2107 1.21071 19.5858 1.58579L22.4142 4.41421C22.7893 4.78929 23 5.29799 23 5.82843V20C23 21.6569 21.6569 23 20 23H4C2.34315 23 1 21.6569 1 20V4C1 2.34315 2.34315 1 4 1H18.1716ZM4 3C3.44772 3 3 3.44772 3 4V20C3 20.5523 3.44772 21 4 21L5 21L5 15C5 13.3431 6.34315 12 8 12L16 12C17.6569 12 19 13.3431 19 15V21H20C20.5523 21 21 20.5523 21 20V6.82843C21 6.29799 20.7893 5.78929 20.4142 5.41421L18.5858 3.58579C18.2107 3.21071 17.702 3 17.1716 3H17V5C17 6.65685 15.6569 8 14 8H10C8.34315 8 7 6.65685 7 5V3H4ZM17 21V15C17 14.4477 16.5523 14 16 14L8 14C7.44772 14 7 14.4477 7 15L7 21L17 21ZM9 3H15V5C15 5.55228 14.5523 6 14 6H10C9.44772 6 9 5.55228 9 5V3Z\" fill={color} />\n </svg>\n)\n\nconst CircleStack = ({ color = '#000', className = 'w-6 h-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M20.25 6.375c0 2.278-3.694 4.125-8.25 4.125S3.75 8.653 3.75 6.375m16.5 0c0-2.278-3.694-4.125-8.25-4.125S3.75 4.097 3.75 6.375m16.5 0v11.25c0 2.278-3.694 4.125-8.25 4.125s-8.25-1.847-8.25-4.125V6.375m16.5 0v3.75m-16.5-3.75v3.75m16.5 0v3.75C20.25 16.153 16.556 18 12 18s-8.25-1.847-8.25-4.125v-3.75m16.5 0c0 2.278-3.694 4.125-8.25 4.125s-8.25-1.847-8.25-4.125\" />\n </svg>\n)\n\nconst Copy = ({ color = '#000', className = 'w-6 h-6' }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke={color} className={className}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15.666 3.888A2.25 2.25 0 0 0 13.5 2.25h-3c-1.03 0-1.9.693-2.166 1.638m7.332 0c.055.194.084.4.084.612v0a.75.75 0 0 1-.75.75H9a.75.75 0 0 1-.75-.75v0c0-.212.03-.418.084-.612m7.332 0c.646.049 1.288.11 1.927.184 1.1.128 1.907 1.077 1.907 2.185V19.5a2.25 2.25 0 0 1-2.25 2.25H6.75A2.25 2.25 0 0 1 4.5 19.5V6.257c0-1.108.806-2.057 1.907-2.185a48.208 48.208 0 0 1 1.927-.184\" />\n </svg>\n)\n\nconst Icon = () => <></>\n\nIcon.Moon = Moon\nIcon.Sun = Sun\nIcon.CheckCircle = CheckCircle\nIcon.Login = Login\nIcon.Loading = Loading\nIcon.ToggleLoading = ToggleLoading\nIcon.Eye = Eye\nIcon.EyeSlash = EyeSlash\nIcon.ArrowRight = ArrowRight\nIcon.Minus = Minus\nIcon.Dashboard = Dashboard\nIcon.FleetIcon = FleetIcon\nIcon.Performance = Performance\nIcon.Map = Map\nIcon.CharterParty = CharterParty\nIcon.Compliance = Compliance\nIcon.Applications = Applications\nIcon.PowerOff = PowerOff\nIcon.ChevronDown = ChevronDown\nIcon.ChevronRight = ChevronRight\nIcon.DoubleChevronRight = DoubleChevronRight\nIcon.Checked = Checked\nIcon.Search = Search\nIcon.Calendar = Calendar\nIcon.Clock = Clock\nIcon.ChartBoard = ChartBoard\nIcon.BarChartBoard = BarChartBoard\nIcon.BarChartSquare = BarChartSquare\nIcon.ChartBar = ChartBar\nIcon.PieChart = PieChart\nIcon.Shield = Shield\nIcon.Calculator = Calculator\nIcon.Contract = Contract\nIcon.Buoy = Buoy\nIcon.Cog = Cog\nIcon.Table = TableIcon\nIcon.Data = Data\nIcon.XClose = XClose\nIcon.Grid = Grid\nIcon.Carousel = Carousel\nIcon.PlusCircle = PlusCircle\nIcon.Info = Info\nIcon.Warning = Warning\nIcon.Error = ErrorIcon\nIcon.ShowMore = ShowMore\nIcon.Tweak = Tweak\nIcon.Download = Download\nIcon.Expand = Expand\nIcon.Collapse = Collapse\nIcon.ShieldCheck = ShieldCheck\nIcon.XCircle = XCircle\nIcon.Play = Play\nIcon.Document = Document\nIcon.Edit = EditIcon\nIcon.Upload = Upload\nIcon.File = FileIcon\nIcon.Delete = Delete\nIcon.Bookmarks = Bookmarks\nIcon.Save = Save\nIcon.Copy = Copy\nIcon.CircleStack = CircleStack\n\nexport default Icon\n","import React, { useEffect, useState } from 'react'\nimport { createPortal } from 'react-dom'\n\nexport interface PortalProps {\n /** Content to render at the target node. */\n children: React.ReactNode\n /**\n * Where to mount the portal.\n * - omitted / `undefined` → `document.body` (the safe default for viewport-anchored UI)\n * - `HTMLElement` → that exact node\n * - `() => HTMLElement | null` → resolved at mount time (lets you query the DOM after layout)\n * - `null` → portal is disabled; nothing renders\n */\n target?: HTMLElement | (() => HTMLElement | null) | null\n}\n\n/**\n * SSR-safe DOM relocator. Renders `children` at a detached DOM node — by\n * default `document.body` — so that any `position: fixed` descendant resolves\n * against the real viewport, never against a transformed, filtered, or\n * contained ancestor.\n *\n * ## Why this exists\n *\n * Per the CSS spec, **any ancestor with `transform`, `filter`, `perspective`,\n * `will-change`, or `contain: layout|paint|strict` creates a new containing\n * block for `position: fixed` descendants**. The fixed element then resolves\n * its coordinates against that ancestor, not the viewport — silently breaking\n * full-screen overlays, toast viewports, mobile drawers, and loading screens\n * whenever a consumer wraps the component in:\n *\n * - a page-transition library (Framer Motion, view transitions)\n * - a modal or drawer (Storybook's centered-layout wrapper hits this too)\n * - a card with `contain: layout` or `will-change: transform`\n * - a CSS filter (`backdrop-blur`, `drop-shadow`)\n *\n * Portaling to `document.body` makes the element **immune** to any styling\n * its consumer applies to ancestor nodes. This is the same pattern Radix UI\n * uses internally for every overlay primitive (`Dialog.Portal`,\n * `Tooltip.Portal`, `Popover.Portal`, etc.).\n *\n * ## When to use it\n *\n * Wrap any element that uses `position: fixed` to anchor itself to the\n * viewport — full-screen overlays, toast viewports, drawers, loading screens,\n * command palettes, lightboxes.\n *\n * If you're already using a Radix primitive, prefer its built-in `*.Portal`\n * component (they're equivalent but lifecycle-aware for that primitive).\n *\n * ## When NOT to use it\n *\n * - For inline elements that already flow naturally with the document — Portal\n * is for **fixed/absolute escape**, not general layout.\n * - For SSR-critical content that must appear before hydration — Portal renders\n * `null` on the server and the first client render.\n * - For accessibility-critical content that depends on DOM proximity (form\n * labels, ARIA `aria-controls` targets) — escaping the tree can break focus\n * order and assistive-tech navigation.\n *\n * ## SSR / hydration\n *\n * `document.body` isn't available during SSR or the first client render.\n * `Portal` renders `null` until `useEffect` resolves the target post-mount,\n * then re-renders with the portal in place. Content that needs to appear\n * immediately on mount paints one frame later — acceptable for overlays\n * (the trigger interaction is what kicks them off anyway).\n *\n * @example Full-screen loading overlay\n * ```tsx\n * <Portal>\n * <div className=\"fixed inset-0 bg-black/40 z-overlay flex items-center justify-center\">\n * <Spinner />\n * </div>\n * </Portal>\n * ```\n *\n * @example Mount to a specific element\n * ```tsx\n * <Portal target={() => document.getElementById('app-root')}>\n * <Drawer />\n * </Portal>\n * ```\n *\n * @example Conditionally disable (render inline)\n * ```tsx\n * <Portal target={shouldPortal ? undefined : null}>\n * <Banner />\n * </Portal>\n * ```\n */\nexport default function Portal({ children, target }: PortalProps) {\n const [resolved, setResolved] = useState<HTMLElement | null>(null)\n\n useEffect(() => {\n if (target === null) {\n setResolved(null)\n return\n }\n const node =\n typeof target === 'function' ? target() :\n target ?? document.body\n setResolved(node ?? null)\n }, [target])\n\n return resolved ? createPortal(children, resolved) : null\n}\n","import React from 'react'\n\n// ── Token scales ───────────────────────────────────────────────────────────\n\nexport type Spacing = 'none' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'\n\nconst SPACING_MAP: Record<Spacing, string> = {\n 'none': '0',\n 'xs': '1',\n 'sm': '2',\n 'md': '4',\n 'lg': '6',\n 'xl': '8',\n '2xl': '12',\n}\n\nconst padding = (s?: Spacing, axis: 'p' | 'px' | 'py' | 'pt' | 'pr' | 'pb' | 'pl' = 'p') =>\n s == null ? '' : `${axis}-${SPACING_MAP[s]}`\nconst margin = (s?: Spacing, axis: 'm' | 'mx' | 'my' | 'mt' | 'mr' | 'mb' | 'ml' = 'm') =>\n s == null ? '' : `${axis}-${SPACING_MAP[s]}`\n\nexport type BoxBackground =\n | 'none' | 'background' | 'surface' | 'surface-raised' | 'accent'\nexport type BoxBorder = 'none' | 'border' | 'border-strong' | 'accent' | 'status-error'\nexport type BoxRadius = 'none' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 'full'\nexport type BoxShadow = 'none' | 'sm' | 'md' | 'lg' | 'xl'\n\nconst BG_MAP: Record<BoxBackground, string> = {\n 'none': '',\n 'background': 'bg-background',\n 'surface': 'bg-surface',\n 'surface-raised': 'bg-surface-raised',\n 'accent': 'bg-accent text-accent-fg',\n}\nconst BORDER_MAP: Record<BoxBorder, string> = {\n 'none': '',\n 'border': 'border border-border',\n 'border-strong': 'border border-border-strong',\n 'accent': 'border border-accent',\n 'status-error': 'border border-status-error',\n}\nconst RADIUS_MAP: Record<BoxRadius, string> = {\n 'none': 'rounded-none',\n 'sm': 'rounded-sm',\n 'md': 'rounded-md',\n 'lg': 'rounded-lg',\n 'xl': 'rounded-xl',\n '2xl': 'rounded-2xl',\n 'full': 'rounded-full',\n}\nconst SHADOW_MAP: Record<BoxShadow, string> = {\n 'none': '',\n 'sm': 'shadow-sm',\n 'md': 'shadow-md',\n 'lg': 'shadow-lg',\n 'xl': 'shadow-xl',\n}\n\n// ── Box ────────────────────────────────────────────────────────────────────\n\nexport interface BoxProps {\n as?: keyof React.JSX.IntrinsicElements\n /** Padding shorthand — applies to all sides. */\n p?: Spacing\n /** Horizontal padding (left + right). */\n px?: Spacing\n /** Vertical padding (top + bottom). */\n py?: Spacing\n pt?: Spacing\n pr?: Spacing\n pb?: Spacing\n pl?: Spacing\n /** Margin shorthand. */\n m?: Spacing\n mx?: Spacing\n my?: Spacing\n mt?: Spacing\n mr?: Spacing\n mb?: Spacing\n ml?: Spacing\n background?: BoxBackground\n border?: BoxBorder\n radius?: BoxRadius\n shadow?: BoxShadow\n /** Width via Tailwind class or CSS value. */\n width?: string | number\n /** Height via Tailwind class or CSS value. */\n height?: string | number\n /** Click handler — accepts any element-typed handler. */\n onClick?: React.MouseEventHandler<HTMLElement>\n className?: string\n style?: React.CSSProperties\n children?: React.ReactNode\n}\n\n/**\n * A polymorphic layout primitive — a `<div>` (by default) styled via prop\n * shortcuts to the design system's tokenised spacing, surface, border,\n * radius, and shadow scales. Use it when you'd otherwise reach for a\n * className-only `<div>` with `p-4 bg-surface border border-border rounded-lg`.\n *\n * The token shortcuts map straight to Tailwind classes under the hood, so\n * Tailwind's content scanner sees the classes and JIT-emits the CSS. There\n * is no runtime style cost beyond the className concatenation.\n *\n * Use `as` when the semantic element should differ (`<section>`, `<article>`).\n *\n * @example Padded card surface\n * ```tsx\n * <Box p=\"lg\" background=\"surface\" border=\"border\" radius=\"lg\" shadow=\"sm\">\n * <Typography variant=\"h3\">Card title</Typography>\n * </Box>\n * ```\n *\n * @example Semantic section\n * ```tsx\n * <Box as=\"section\" px=\"md\" py=\"lg\" background=\"background\">\n * <PageContent />\n * </Box>\n * ```\n */\nexport default function Box({\n as,\n p, px, py, pt, pr, pb, pl,\n m, mx, my, mt, mr, mb, ml,\n background = 'none',\n border = 'none',\n radius,\n shadow = 'none',\n width,\n height,\n onClick,\n className = '',\n style,\n children,\n}: BoxProps) {\n const Element = (as ?? 'div') as React.ElementType\n return (\n <Element\n onClick={onClick}\n className={[\n padding(p, 'p'), padding(px, 'px'), padding(py, 'py'),\n padding(pt, 'pt'), padding(pr, 'pr'), padding(pb, 'pb'), padding(pl, 'pl'),\n margin(m, 'm'), margin(mx, 'mx'), margin(my, 'my'),\n margin(mt, 'mt'), margin(mr, 'mr'), margin(mb, 'mb'), margin(ml, 'ml'),\n BG_MAP[background],\n BORDER_MAP[border],\n radius ? RADIUS_MAP[radius] : '',\n SHADOW_MAP[shadow],\n className,\n ].filter(Boolean).join(' ')}\n style={{\n width: typeof width === 'number' ? `${width}px` : width,\n height: typeof height === 'number' ? `${height}px` : height,\n ...style,\n }}\n >\n {children}\n </Element>\n )\n}\n","import React from 'react'\nimport Box, { type BoxProps, type Spacing } from './Box'\n\nexport type FlexDirection = 'row' | 'row-reverse' | 'col' | 'col-reverse'\nexport type FlexAlign = 'start' | 'center' | 'end' | 'stretch' | 'baseline'\nexport type FlexJustify = 'start' | 'center' | 'end' | 'between' | 'around' | 'evenly'\nexport type FlexWrap = 'nowrap' | 'wrap' | 'wrap-reverse'\n\nconst GAP_MAP: Record<Spacing, string> = {\n 'none': 'gap-0',\n 'xs': 'gap-1',\n 'sm': 'gap-2',\n 'md': 'gap-4',\n 'lg': 'gap-6',\n 'xl': 'gap-8',\n '2xl': 'gap-12',\n}\n\nconst DIRECTION_CLASS: Record<FlexDirection, string> = {\n 'row': 'flex-row',\n 'row-reverse': 'flex-row-reverse',\n 'col': 'flex-col',\n 'col-reverse': 'flex-col-reverse',\n}\nconst ALIGN_CLASS: Record<FlexAlign, string> = {\n start: 'items-start',\n center: 'items-center',\n end: 'items-end',\n stretch: 'items-stretch',\n baseline: 'items-baseline',\n}\nconst JUSTIFY_CLASS: Record<FlexJustify, string> = {\n start: 'justify-start',\n center: 'justify-center',\n end: 'justify-end',\n between: 'justify-between',\n around: 'justify-around',\n evenly: 'justify-evenly',\n}\nconst WRAP_CLASS: Record<FlexWrap, string> = {\n 'nowrap': 'flex-nowrap',\n 'wrap': 'flex-wrap',\n 'wrap-reverse': 'flex-wrap-reverse',\n}\n\nexport interface FlexProps extends BoxProps {\n direction?: FlexDirection\n align?: FlexAlign\n justify?: FlexJustify\n wrap?: FlexWrap\n /** Gap between children — uses the same spacing token scale as Box. */\n gap?: Spacing\n inline?: boolean\n}\n\n/**\n * `Box` with `display: flex` baked in. All Box props are accepted (padding,\n * margin, background, border, etc.) plus flex-specific controls.\n *\n * @example Horizontal row, centred, with gap\n * ```tsx\n * <Flex direction=\"row\" align=\"center\" gap=\"md\">\n * <Avatar src={user.photo} alt={user.name} />\n * <Typography variant=\"body\">{user.name}</Typography>\n * </Flex>\n * ```\n *\n * @example Vertical stack\n * ```tsx\n * <Flex direction=\"col\" gap=\"sm\">\n * <Typography variant=\"h3\">Title</Typography>\n * <Typography variant=\"body\">Body text</Typography>\n * </Flex>\n * ```\n */\nexport default function Flex({\n direction = 'row',\n align,\n justify,\n wrap,\n gap,\n inline,\n className = '',\n ...boxProps\n}: FlexProps) {\n return (\n <Box\n {...boxProps}\n className={[\n inline ? 'inline-flex' : 'flex',\n DIRECTION_CLASS[direction],\n align ? ALIGN_CLASS[align] : '',\n justify ? JUSTIFY_CLASS[justify] : '',\n wrap ? WRAP_CLASS[wrap] : '',\n gap ? GAP_MAP[gap] : '',\n className,\n ].filter(Boolean).join(' ')}\n />\n )\n}\n","import React from 'react'\nimport Box, { type BoxProps, type Spacing } from './Box'\n\nconst GAP_MAP: Record<Spacing, string> = {\n 'none': 'gap-0',\n 'xs': 'gap-1',\n 'sm': 'gap-2',\n 'md': 'gap-4',\n 'lg': 'gap-6',\n 'xl': 'gap-8',\n '2xl': 'gap-12',\n}\n\nconst COL_MAP: Record<number, string> = {\n 1: 'grid-cols-1', 2: 'grid-cols-2', 3: 'grid-cols-3', 4: 'grid-cols-4',\n 5: 'grid-cols-5', 6: 'grid-cols-6', 7: 'grid-cols-7', 8: 'grid-cols-8',\n 9: 'grid-cols-9', 10: 'grid-cols-10', 11: 'grid-cols-11', 12: 'grid-cols-12',\n}\n\nconst ROW_MAP: Record<number, string> = {\n 1: 'grid-rows-1', 2: 'grid-rows-2', 3: 'grid-rows-3',\n 4: 'grid-rows-4', 5: 'grid-rows-5', 6: 'grid-rows-6',\n}\n\nexport interface GridProps extends BoxProps {\n /**\n * Number of columns (1–12) for the most common case, OR an explicit\n * CSS grid-template-columns string for arbitrary layouts\n * (e.g. `\"200px 1fr\"` or `\"repeat(auto-fit, minmax(180px, 1fr))\"`).\n */\n cols?: number | string\n /** Same as `cols` but for rows. */\n rows?: number | string\n /** Uniform gap. Token scale, like Box's padding. */\n gap?: Spacing\n /** Horizontal-only gap (overrides `gap`). */\n gapX?: Spacing\n /** Vertical-only gap (overrides `gap`). */\n gapY?: Spacing\n /** Cross-axis alignment of items within their cell. */\n align?: 'start' | 'center' | 'end' | 'stretch'\n /** Main-axis alignment of items within their cell. */\n justify?: 'start' | 'center' | 'end' | 'stretch'\n}\n\nconst ALIGN_CLASS = {\n start: 'items-start', center: 'items-center', end: 'items-end', stretch: 'items-stretch',\n}\nconst JUSTIFY_CLASS = {\n start: 'justify-items-start', center: 'justify-items-center', end: 'justify-items-end', stretch: 'justify-items-stretch',\n}\n\n/**\n * `Box` with `display: grid` baked in. Use `cols` / `rows` as numbers for\n * the common \"N equal tracks\" case, or pass any CSS grid-template-* string\n * for arbitrary layouts (auto-fit grids, fixed-width sidebars, etc.).\n *\n * @example 3-column grid with medium gap\n * ```tsx\n * <Grid cols={3} gap=\"md\">\n * <Card />\n * <Card />\n * <Card />\n * </Grid>\n * ```\n *\n * @example Auto-fit responsive grid\n * ```tsx\n * <Grid cols=\"repeat(auto-fit, minmax(220px, 1fr))\" gap=\"lg\">\n * {items.map((it) => <Card key={it.id} {...it} />)}\n * </Grid>\n * ```\n */\nexport default function Grid({\n cols,\n rows,\n gap,\n gapX,\n gapY,\n align,\n justify,\n className = '',\n style,\n ...boxProps\n}: GridProps) {\n // For numeric cols/rows, prefer the static Tailwind class so JIT picks it\n // up. For arbitrary strings, fall back to inline style.\n const colClass = typeof cols === 'number' ? (COL_MAP[cols] ?? '') : ''\n const rowClass = typeof rows === 'number' ? (ROW_MAP[rows] ?? '') : ''\n const inlineCols = typeof cols === 'string' ? cols : undefined\n const inlineRows = typeof rows === 'string' ? rows : undefined\n\n return (\n <Box\n {...boxProps}\n className={[\n 'grid',\n colClass,\n rowClass,\n gap ? GAP_MAP[gap] : '',\n gapX ? GAP_MAP[gapX].replace('gap-', 'gap-x-') : '',\n gapY ? GAP_MAP[gapY].replace('gap-', 'gap-y-') : '',\n align ? ALIGN_CLASS[align] : '',\n justify ? JUSTIFY_CLASS[justify] : '',\n className,\n ].filter(Boolean).join(' ')}\n style={{\n gridTemplateColumns: inlineCols,\n gridTemplateRows: inlineRows,\n ...style,\n }}\n />\n )\n}\n","import React from 'react'\nimport * as AvatarPrimitive from '@radix-ui/react-avatar'\n\nexport type AvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl'\nexport type AvatarShape = 'circle' | 'square'\nexport type AvatarStatus = 'online' | 'offline' | 'away' | 'busy'\n\nexport interface AvatarProps {\n /** Image URL. If missing or fails to load, `fallback` renders instead. */\n src?: string\n /** Alt text — required when `src` is provided for screen readers. */\n alt?: string\n /**\n * Fallback rendered when the image is unavailable. Pass either:\n * - a string (e.g. user initials like \"JD\") — rendered with semi-bold weight\n * - any ReactNode (icon, emoji)\n * - omit entirely — a generic \"person\" silhouette is used\n */\n fallback?: React.ReactNode\n /** Size preset. Default `'md'`. */\n size?: AvatarSize\n /** Circle (default) or rounded square. */\n shape?: AvatarShape\n /**\n * Optional presence indicator dot in the bottom-right corner.\n * `'online' | 'offline' | 'away' | 'busy'`.\n */\n status?: AvatarStatus\n className?: string\n}\n\nconst SIZE_PX: Record<AvatarSize, number> = {\n xs: 20,\n sm: 28,\n md: 36,\n lg: 48,\n xl: 64,\n}\n\nconst TEXT_CLASS: Record<AvatarSize, string> = {\n xs: 'text-[10px]',\n sm: 'text-xs',\n md: 'text-sm',\n lg: 'text-base',\n xl: 'text-lg',\n}\n\nconst STATUS_CLASS: Record<AvatarStatus, string> = {\n online: 'bg-status-success',\n offline: 'bg-foreground-muted',\n away: 'bg-status-warning',\n busy: 'bg-status-error',\n}\n\n/**\n * Circular (or rounded-square) user avatar built on `@radix-ui/react-avatar`.\n * Radix handles the image-load lifecycle: it tries to load `src`, falls back\n * to the `fallback` slot after a short delay if the image is missing or fails\n * to decode, and re-attempts on `src` change.\n *\n * **Fallback strategy** (in order):\n * 1. `fallback` prop if provided (string or ReactNode)\n * 2. Two-character initials extracted from `alt` if `alt` is provided\n * 3. A generic \"person\" silhouette SVG\n *\n * **Status dot** is an optional presence indicator in the bottom-right —\n * online (green), away (amber), busy (red), offline (grey).\n *\n * @example Basic with image\n * ```tsx\n * <Avatar src=\"/users/jd.jpg\" alt=\"Jane Doe\" />\n * ```\n *\n * @example Fallback to initials\n * ```tsx\n * <Avatar alt=\"Jane Doe\" size=\"lg\" />\n * ```\n *\n * @example Online presence + square shape\n * ```tsx\n * <Avatar src={user.photo} alt={user.name} status=\"online\" shape=\"square\" />\n * ```\n */\nexport default function Avatar({\n src,\n alt,\n fallback,\n size = 'md',\n shape = 'circle',\n status,\n className = '',\n}: AvatarProps) {\n const px = SIZE_PX[size]\n\n const initialsFallback = (() => {\n if (fallback) return fallback\n if (alt) {\n const parts = alt.trim().split(/\\s+/).slice(0, 2)\n const initials = parts.map((p) => p[0]?.toUpperCase() ?? '').join('')\n if (initials) return initials\n }\n return <PersonSilhouette />\n })()\n\n return (\n <span\n className={`relative inline-block flex-shrink-0 ${className}`}\n style={{ width: px, height: px }}\n >\n <AvatarPrimitive.Root\n className={`flex w-full h-full items-center justify-center overflow-hidden bg-surface-raised text-foreground-secondary select-none ${\n shape === 'circle' ? 'rounded-full' : 'rounded-md'\n }`}\n >\n {src && (\n <AvatarPrimitive.Image\n src={src}\n alt={alt ?? ''}\n className=\"h-full w-full object-cover\"\n />\n )}\n <AvatarPrimitive.Fallback\n delayMs={src ? 300 : 0}\n className={`flex h-full w-full items-center justify-center font-semibold ${TEXT_CLASS[size]}`}\n >\n {initialsFallback}\n </AvatarPrimitive.Fallback>\n </AvatarPrimitive.Root>\n\n {status && (\n <span\n className={`absolute bottom-0 right-0 block rounded-full ring-2 ring-background ${STATUS_CLASS[status]}`}\n style={{\n width: Math.max(6, Math.round(px / 4)),\n height: Math.max(6, Math.round(px / 4)),\n }}\n aria-label={`Status: ${status}`}\n role=\"status\"\n />\n )}\n </span>\n )\n}\n\nfunction PersonSilhouette() {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"w-[60%] h-[60%]\" aria-hidden=\"true\">\n <path d=\"M12 12a4 4 0 100-8 4 4 0 000 8zM4 20a8 8 0 1116 0H4z\" />\n </svg>\n )\n}\n","import React from 'react'\n\nexport type TypographyVariant =\n | 'display'\n | 'h1' | 'h2' | 'h3' | 'h4'\n | 'subtitle'\n | 'body'\n | 'caption'\n | 'overline'\n | 'code'\n\nexport type TypographyColor =\n | 'foreground'\n | 'foreground-secondary'\n | 'foreground-muted'\n | 'accent'\n | 'status-error'\n | 'status-warning'\n | 'status-success'\n | 'status-info'\n | 'inherit'\n\nexport type TypographyWeight = 'normal' | 'medium' | 'semibold' | 'bold'\nexport type TypographyAlign = 'left' | 'center' | 'right' | 'justify'\n\nexport interface TypographyProps {\n /** Visual scale variant. */\n variant?: TypographyVariant\n /**\n * Element to render. Defaults are sensible per variant\n * (e.g. h1 → `<h1>`, body → `<p>`, code → `<code>`). Override\n * with `as` when the semantic element should differ from the visual\n * style (e.g. a styled-as-h1 product card heading rendered as `<div>`).\n */\n as?: keyof React.JSX.IntrinsicElements\n color?: TypographyColor\n weight?: TypographyWeight\n align?: TypographyAlign\n /** Truncate to one line with ellipsis. */\n truncate?: boolean\n /** Render the text with reduced opacity (useful for disabled states). */\n muted?: boolean\n className?: string\n style?: React.CSSProperties\n children?: React.ReactNode\n}\n\n// Variant → Tailwind class map. Each variant defines size, weight, line-height,\n// and tracking. The defaults are designed to read at the natural body rhythm\n// of the design system.\nconst VARIANT_CLASS: Record<TypographyVariant, string> = {\n display: 'text-3xl font-bold leading-tight tracking-tight',\n h1: 'text-2xl font-bold leading-tight tracking-tight',\n h2: 'text-xl font-semibold leading-snug tracking-tight',\n h3: 'text-lg font-semibold leading-snug',\n h4: 'text-base font-semibold leading-snug',\n subtitle: 'text-sm font-medium leading-snug',\n body: 'text-sm leading-normal',\n caption: 'text-xs leading-normal',\n overline: 'text-[10px] font-semibold leading-normal uppercase tracking-wider',\n code: 'text-xs leading-normal font-mono bg-surface-raised text-foreground rounded px-1 py-0.5',\n}\n\n// Default element per variant. Consumers can override with `as`.\nconst DEFAULT_ELEMENT: Record<TypographyVariant, keyof React.JSX.IntrinsicElements> = {\n display: 'h1',\n h1: 'h1',\n h2: 'h2',\n h3: 'h3',\n h4: 'h4',\n subtitle: 'p',\n body: 'p',\n caption: 'span',\n overline: 'span',\n code: 'code',\n}\n\nconst COLOR_CLASS: Record<TypographyColor, string> = {\n 'foreground': 'text-foreground',\n 'foreground-secondary': 'text-foreground-secondary',\n 'foreground-muted': 'text-foreground-muted',\n 'accent': 'text-accent',\n 'status-error': 'text-status-error',\n 'status-warning': 'text-status-warning',\n 'status-success': 'text-status-success',\n 'status-info': 'text-status-info',\n 'inherit': '',\n}\n\nconst WEIGHT_CLASS: Record<TypographyWeight, string> = {\n normal: 'font-normal',\n medium: 'font-medium',\n semibold: 'font-semibold',\n bold: 'font-bold',\n}\n\nconst ALIGN_CLASS: Record<TypographyAlign, string> = {\n left: 'text-left',\n center: 'text-center',\n right: 'text-right',\n justify: 'text-justify',\n}\n\n/**\n * Polymorphic typography primitive. `variant` picks a visual scale; `as`\n * controls the rendered element when it should differ from the default\n * for that variant (e.g. a styled-as-h2 card title rendered as `<div>`).\n *\n * **Variants** map to the design-system text scale:\n * - `display`: hero headlines\n * - `h1` – `h4`: section / subsection headings\n * - `subtitle`: emphasised lead text\n * - `body` (default): paragraph text\n * - `caption`: small label / hint text\n * - `overline`: uppercase eyebrow text\n * - `code`: inline code samples\n *\n * **Colour** accepts any semantic token; defaults to `inherit` so the\n * parent's text colour flows through (useful when nesting Typography\n * inside a coloured surface like an accent badge).\n *\n * @example Section heading\n * ```tsx\n * <Typography variant=\"h2\">Vessel performance</Typography>\n * ```\n *\n * @example Styled as h1 but rendered as div (for SEO-neutral cards)\n * ```tsx\n * <Typography variant=\"h1\" as=\"div\">Card title</Typography>\n * ```\n *\n * @example Error message\n * ```tsx\n * <Typography variant=\"caption\" color=\"status-error\">{errorText}</Typography>\n * ```\n */\nexport default function Typography({\n variant = 'body',\n as,\n color = 'inherit',\n weight,\n align,\n truncate,\n muted,\n className = '',\n style,\n children,\n}: TypographyProps) {\n const Element = (as ?? DEFAULT_ELEMENT[variant]) as React.ElementType\n return (\n <Element\n className={[\n VARIANT_CLASS[variant],\n COLOR_CLASS[color],\n weight ? WEIGHT_CLASS[weight] : '',\n align ? ALIGN_CLASS[align] : '',\n truncate ? 'truncate' : '',\n muted ? 'opacity-60' : '',\n className,\n ].filter(Boolean).join(' ')}\n style={style}\n >\n {children}\n </Element>\n )\n}\n","import { useMemo } from 'react'\n\nexport type IconButtonVariant = 'primary' | 'bordered'\n\nexport interface IconButtonProps {\n icon?: React.ReactNode\n onClick?: React.MouseEventHandler<HTMLButtonElement>\n /** Visual style. Defaults to `'primary'`. */\n type?: IconButtonVariant\n buttonType?: 'button' | 'submit' | 'reset'\n disabled?: boolean\n size?: 'sm' | 'lg'\n loading?: boolean\n loadingIcon?: React.ReactNode\n title?: string\n}\n\n/**\n * Square icon-only button.\n *\n * @example\n * <IconButton icon={<Icon.Search />} onClick={doSearch} />\n * <IconButton type=\"bordered\" icon={<Icon.Edit />} />\n */\nexport default function IconButton({\n icon,\n onClick,\n type = 'primary',\n buttonType = 'button',\n disabled = false,\n size = 'lg',\n loading = false,\n loadingIcon,\n}: IconButtonProps) {\n const colorScheme = useMemo(() => {\n if (type === 'primary') {\n // Single semantic palette handles both light and dark modes via\n // CSS vars on the consumer's ThemeProvider — no `dark:` variants\n // needed.\n return 'bg-accent text-accent-fg hover:bg-accent-hover'\n }\n if (type === 'bordered') {\n return 'bg-surface text-foreground hover:bg-surface-raised border border-border-strong'\n }\n return ''\n }, [type])\n\n return (\n <button\n type={buttonType}\n disabled={disabled || loading}\n onClick={onClick}\n className={`${size === 'sm' ? 'p-1' : 'p-2'} rounded-lg shadow-md transition-colors duration-150 ${colorScheme} disabled:bg-surface-raised disabled:text-foreground-muted disabled:cursor-not-allowed focus:outline-none focus-visible:ring-2 focus-visible:ring-accent`}\n >\n {loading ? loadingIcon : icon}\n </button>\n )\n}\n","import React from 'react'\n\nexport interface ButtonProps {\n content?: React.ReactNode\n /** Visual style variant */\n variant?: 'primary' | 'secondary' | 'ghost' | 'danger'\n /** Size — controls height, padding, and font size */\n size?: 'sm' | 'md' | 'lg'\n /** HTML button type */\n buttonType?: 'button' | 'submit' | 'reset'\n loading?: boolean\n disabled?: boolean\n /** Inline style overrides (width, etc.). Margins/layout belong in the parent. */\n style?: React.CSSProperties\n /** Leading icon — rendered before content */\n icon?: React.ReactNode\n onClick?: React.MouseEventHandler<HTMLButtonElement>\n /**\n * @deprecated Pass `variant` instead. Kept for API compat — currently no-op.\n * Will be removed in the next major version.\n */\n type?: string\n}\n\nconst VARIANT_CLASSES: Record<NonNullable<ButtonProps['variant']>, string> = {\n primary: [\n 'bg-accent text-accent-fg',\n 'hover:bg-accent-hover',\n 'active:bg-accent',\n 'disabled:bg-foreground-muted disabled:text-accent-fg/70 disabled:cursor-not-allowed',\n 'focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2',\n ].join(' '),\n\n secondary: [\n 'bg-transparent border border-accent text-accent',\n 'hover:bg-accent hover:text-accent-fg',\n 'active:bg-accent-hover active:text-accent-fg',\n 'disabled:border-foreground-muted disabled:text-foreground-muted disabled:cursor-not-allowed',\n 'focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2',\n ].join(' '),\n\n ghost: [\n // Semantic tokens handle both light and dark modes — no `dark:`\n // variants needed.\n 'bg-transparent text-foreground-secondary',\n 'hover:bg-surface-raised hover:text-foreground',\n 'active:bg-surface',\n 'disabled:text-foreground-muted disabled:cursor-not-allowed',\n 'focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2',\n ].join(' '),\n\n danger: [\n 'bg-status-error text-accent-fg',\n 'hover:opacity-90',\n 'active:opacity-100',\n 'disabled:opacity-50 disabled:cursor-not-allowed',\n 'focus-visible:ring-2 focus-visible:ring-status-error focus-visible:ring-offset-2',\n ].join(' '),\n}\n\nconst SIZE_CLASSES: Record<NonNullable<ButtonProps['size']>, string> = {\n sm: 'h-7 px-3 text-xs gap-1 rounded-md',\n md: 'h-9 px-4 text-sm gap-1.5 rounded-lg',\n lg: 'h-11 px-5 text-sm gap-2 rounded-xl',\n}\n\n/**\n * Primary action button with variant + size system.\n *\n * Width is never hardcoded — set `style={{ width }}` or let the parent grid/flex control it.\n *\n * @example\n * <Button content=\"Save\" onClick={handleSave} />\n * <Button content=\"Delete\" variant=\"danger\" size=\"sm\" />\n * <Button content=\"Cancel\" variant=\"secondary\" />\n * <Button content=\"Loading…\" loading buttonType=\"submit\" />\n */\nexport default function Button({\n content,\n variant = 'primary',\n size = 'md',\n buttonType = 'button',\n loading,\n disabled,\n style,\n icon,\n onClick,\n}: ButtonProps) {\n return (\n <button\n onClick={onClick}\n disabled={disabled || loading}\n type={buttonType}\n style={style}\n className={[\n // Base — layout, transitions, focus reset\n 'inline-flex items-center justify-center font-medium',\n 'outline-none transition-colors duration-150 select-none',\n 'whitespace-nowrap',\n SIZE_CLASSES[size],\n VARIANT_CLASSES[variant],\n ].join(' ')}\n >\n {loading ? (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className=\"w-4 h-4 animate-spin flex-shrink-0\"\n aria-hidden=\"true\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M4.755 10.059a7.5 7.5 0 0112.548-3.364l1.903 1.903h-3.183a.75.75 0 100 1.5h4.992a.75.75 0 00.75-.75V4.356a.75.75 0 00-1.5 0v3.18l-1.9-1.9A9 9 0 003.306 9.67a.75.75 0 101.45.388zm15.408 3.352a.75.75 0 00-.919.53 7.5 7.5 0 01-12.548 3.364l-1.902-1.903h3.183a.75.75 0 000-1.5H2.984a.75.75 0 00-.75.75v4.992a.75.75 0 001.5 0v-3.18l1.9 1.9a9 9 0 0015.059-4.035.75.75 0 00-.53-.918z\"\n />\n </svg>\n ) : icon ? (\n <span className=\"flex-shrink-0\" aria-hidden=\"true\">{icon}</span>\n ) : null}\n {content}\n </button>\n )\n}\n","import React from 'react'\nimport * as Dialog from '@radix-ui/react-dialog'\nimport { motion, AnimatePresence, useReducedMotion } from 'framer-motion'\nimport Button from '../inputs/Button'\n\nexport interface ModalProps {\n /**\n * Max width of the modal panel in pixels (default 600).\n * On narrow viewports the panel fills the screen minus 1 rem on each side.\n * Height is always content-driven (max 90 dvh).\n */\n width?: number\n /**\n * @deprecated Use `width` instead. The second tuple value (height) was\n * never honoured and is silently ignored. Kept for backwards\n * compatibility — will be removed in a future major version.\n */\n size?: [number, number] | [number]\n isOpen?: boolean\n onClose?: () => void\n onOk?: () => void\n onCancel?: () => void\n okText?: string\n cancelText?: string\n hasFooter?: boolean\n title?: React.ReactNode\n children?: React.ReactNode\n}\n\n/**\n * Centred modal dialog powered by Radix Dialog + Framer Motion.\n *\n * Radix handles focus-trap, escape-to-close, and ARIA roles.\n * Framer Motion drives the scale + fade enter/exit animation.\n * prefers-reduced-motion is respected via useReducedMotion().\n *\n * @example\n * <Modal isOpen={open} onClose={() => setOpen(false)} title=\"Confirm\" onOk={handleOk}>\n * Are you sure you want to delete this item?\n * </Modal>\n */\nexport default function Modal({\n width,\n size,\n isOpen = false,\n onClose,\n onOk,\n onCancel,\n okText = 'Ok',\n cancelText = 'Cancel',\n hasFooter = true,\n title,\n children,\n}: ModalProps) {\n const reduced = useReducedMotion()\n // Prefer the new `width` prop; fall back to the deprecated `size[0]`;\n // finally default to 600 px.\n const maxWidth = width ?? size?.[0] ?? 600\n\n return (\n <Dialog.Root open={isOpen} onOpenChange={(open) => { if (!open) onClose?.() }}>\n <Dialog.Portal forceMount>\n {/* ── Backdrop ── */}\n <AnimatePresence>\n {isOpen && (\n <Dialog.Overlay asChild>\n <motion.div\n className=\"fixed inset-0 bg-black/40 z-overlay\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: reduced ? 0 : 0.18, ease: 'easeOut' }}\n />\n </Dialog.Overlay>\n )}\n </AnimatePresence>\n\n {/* ── Panel ── */}\n <AnimatePresence>\n {isOpen && (\n <Dialog.Content asChild>\n <motion.div\n className=\"fixed left-1/2 top-1/2 z-modal flex flex-col w-[calc(100%-2rem)] max-h-[90dvh] bg-surface rounded-2xl shadow-xl overflow-hidden focus:outline-none\"\n style={{\n maxWidth,\n x: '-50%',\n y: '-50%',\n }}\n initial={{ opacity: 0, scale: reduced ? 1 : 0.96 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: reduced ? 1 : 0.96 }}\n transition={\n reduced\n ? { duration: 0 }\n : {\n type: 'spring',\n damping: 28,\n stiffness: 380,\n duration: 0.25,\n }\n }\n >\n {/* Header */}\n <div className=\"flex h-14 flex-shrink-0 items-center justify-between border-b border-border px-5\">\n <Dialog.Title className=\"text-base font-semibold text-foreground tracking-tight\">\n {title}\n </Dialog.Title>\n <Dialog.Close asChild>\n <button\n aria-label=\"Close\"\n className=\"flex h-7 w-7 items-center justify-center rounded-lg text-foreground-muted hover:bg-surface-raised hover:text-foreground transition-colors duration-150 focus:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n >\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 15 15\" fill=\"none\">\n <path d=\"M11.7816 4.03157C12.0062 3.80702 12.0062 3.44295 11.7816 3.2184C11.5571 2.99385 11.193 2.99385 10.9685 3.2184L7.50005 6.68682L4.03164 3.2184C3.80708 2.99385 3.44301 2.99385 3.21846 3.2184C2.99391 3.44295 2.99391 3.80702 3.21846 4.03157L6.68688 7.49999L3.21846 10.9684C2.99391 11.193 2.99391 11.557 3.21846 11.7816C3.44301 12.0061 3.80708 12.0061 4.03164 11.7816L7.50005 8.31316L10.9685 11.7816C11.193 12.0061 11.5571 12.0061 11.7816 11.7816C12.0062 11.557 12.0062 11.193 11.7816 10.9684L8.31322 7.49999L11.7816 4.03157Z\" fill=\"currentColor\" fillRule=\"evenodd\" clipRule=\"evenodd\" />\n </svg>\n </button>\n </Dialog.Close>\n </div>\n\n {/* Body — render children unconditionally so they\n stay mounted through Radix's exit animation.\n Previously `{isOpen && children}` unmounted\n children the moment isOpen flipped to false,\n losing form state mid-close. */}\n <div className={`flex-1 overflow-y-auto p-5 ${hasFooter ? '' : 'pb-5'}`}>\n {children}\n </div>\n\n {/* Footer */}\n {hasFooter && (\n <div className=\"flex flex-shrink-0 items-center justify-end gap-3 border-t border-border px-5 py-3\">\n <Button\n style={{ width: 90 }}\n content={cancelText}\n onClick={onCancel}\n />\n <Button\n style={{ width: 90 }}\n content={okText}\n onClick={onOk}\n />\n </div>\n )}\n </motion.div>\n </Dialog.Content>\n )}\n </AnimatePresence>\n </Dialog.Portal>\n </Dialog.Root>\n )\n}\n","import React from 'react'\nimport * as Dialog from '@radix-ui/react-dialog'\nimport { motion, AnimatePresence, useReducedMotion } from 'framer-motion'\nimport Button from '../inputs/Button'\n\nexport interface DrawerProps {\n isOpen?: boolean\n onClose?: () => void\n hasFooter?: boolean\n /** 'left' | 'right' — which edge the panel slides from */\n placement?: 'left' | 'right'\n width?: number\n okText?: string\n cancelText?: string\n onOk?: () => void\n onCancel?: () => void\n title?: React.ReactNode\n children?: React.ReactNode\n}\n\n/**\n * Side-sliding drawer panel powered by Radix Dialog + Framer Motion.\n *\n * Radix handles focus-trap, escape-to-close, and ARIA roles.\n * Framer Motion drives the slide enter/exit animation.\n * prefers-reduced-motion is respected via useReducedMotion().\n *\n * @example\n * <Drawer isOpen={open} placement=\"right\" onClose={() => setOpen(false)} title=\"Filters\">\n * <FilterForm />\n * </Drawer>\n */\nexport default function Drawer({\n isOpen = false,\n onClose,\n hasFooter = true,\n placement = 'right',\n width = 320,\n okText = 'Ok',\n cancelText = 'Cancel',\n onOk,\n onCancel,\n title,\n children,\n}: DrawerProps) {\n const reduced = useReducedMotion()\n const isRight = placement === 'right'\n const hiddenX = isRight ? '100%' : '-100%'\n\n return (\n <Dialog.Root open={isOpen} onOpenChange={(open) => { if (!open) onClose?.() }}>\n <Dialog.Portal forceMount>\n {/* ── Backdrop ── */}\n <AnimatePresence>\n {isOpen && (\n <Dialog.Overlay asChild>\n <motion.div\n className=\"fixed inset-0 bg-black/40 z-overlay\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: reduced ? 0 : 0.2, ease: 'easeOut' }}\n />\n </Dialog.Overlay>\n )}\n </AnimatePresence>\n\n {/* ── Panel ── */}\n <AnimatePresence>\n {isOpen && (\n <Dialog.Content asChild>\n <motion.div\n className={`fixed top-0 bottom-0 ${isRight ? 'right-0' : 'left-0'} z-modal flex flex-col bg-surface shadow-xl focus:outline-none`}\n style={{ width: `min(calc(100vw - 1rem), ${width}px)` }}\n initial={{ x: reduced ? 0 : hiddenX, opacity: reduced ? 0 : 1 }}\n animate={{ x: 0, opacity: 1 }}\n exit={{ x: reduced ? 0 : hiddenX, opacity: reduced ? 0 : 1 }}\n transition={\n reduced\n ? { duration: 0 }\n : {\n x: {\n type: 'tween',\n duration: 0.26,\n ease: [0.16, 1, 0.3, 1], // ease-out-expo\n },\n opacity: { duration: 0 },\n }\n }\n >\n {/* Header */}\n <div className={`flex h-14 flex-shrink-0 items-center justify-between border-b border-border px-5 ${isRight ? 'flex-row-reverse' : ''}`}>\n <Dialog.Title className=\"text-base font-semibold text-foreground tracking-tight\">\n {title}\n </Dialog.Title>\n <Dialog.Close asChild>\n <button\n aria-label=\"Close drawer\"\n className=\"flex h-7 w-7 items-center justify-center rounded-lg text-foreground-muted hover:bg-surface-raised hover:text-foreground transition-colors duration-150 focus:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n >\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 15 15\" fill=\"none\">\n <path d=\"M11.7816 4.03157C12.0062 3.80702 12.0062 3.44295 11.7816 3.2184C11.5571 2.99385 11.193 2.99385 10.9685 3.2184L7.50005 6.68682L4.03164 3.2184C3.80708 2.99385 3.44301 2.99385 3.21846 3.2184C2.99391 3.44295 2.99391 3.80702 3.21846 4.03157L6.68688 7.49999L3.21846 10.9684C2.99391 11.193 2.99391 11.557 3.21846 11.7816C3.44301 12.0061 3.80708 12.0061 4.03164 11.7816L7.50005 8.31316L10.9685 11.7816C11.193 12.0061 11.5571 12.0061 11.7816 11.7816C12.0062 11.557 12.0062 11.193 11.7816 10.9684L8.31322 7.49999L11.7816 4.03157Z\" fill=\"currentColor\" fillRule=\"evenodd\" clipRule=\"evenodd\" />\n </svg>\n </button>\n </Dialog.Close>\n </div>\n\n {/* Body — render children unconditionally so they\n stay mounted through Radix's exit animation.\n Previously `{isOpen && children}` unmounted\n children the moment isOpen flipped to false,\n losing form state mid-close. */}\n <div className=\"flex-1 overflow-y-auto p-5\">\n {children}\n </div>\n\n {/* Footer */}\n {hasFooter && (\n <div className={`flex flex-shrink-0 items-center gap-3 border-t border-border px-5 py-3 ${isRight ? 'justify-start' : 'justify-end'}`}>\n <Button style={{ width: 90 }} content={cancelText} onClick={onCancel} />\n <Button style={{ width: 90 }} content={okText} onClick={onOk} />\n </div>\n )}\n </motion.div>\n </Dialog.Content>\n )}\n </AnimatePresence>\n </Dialog.Portal>\n </Dialog.Root>\n )\n}\n","import React from 'react'\nimport * as TooltipPrimitive from '@radix-ui/react-tooltip'\n\nexport interface TooltipProps {\n children: React.ReactNode\n /** The text or node shown inside the tooltip */\n title: React.ReactNode\n /** Which side of the trigger the tooltip appears on */\n placement?: 'top' | 'right' | 'bottom' | 'left'\n /** Delay before showing, ms (default 300) */\n delayDuration?: number\n /** Offset from trigger in px (default 8) */\n sideOffset?: number\n}\n\n// Each placement animates in from the opposite edge (toward the trigger)\nconst ANIMATION: Record<NonNullable<TooltipProps['placement']>, string> = {\n top: 'data-[state=delayed-open]:animate-tooltip-in-top',\n bottom: 'data-[state=delayed-open]:animate-tooltip-in-bottom',\n left: 'data-[state=delayed-open]:animate-tooltip-in-left',\n right: 'data-[state=delayed-open]:animate-tooltip-in-right',\n}\n\n/**\n * Tooltip powered by Radix Tooltip.\n *\n * Radix handles keyboard navigation (Escape), pointer events, and ARIA.\n * Each placement animates in from the correct direction.\n * Wrap your app in `<TooltipProvider>` (re-exported below) to share a\n * single provider instead of nesting one per tooltip.\n *\n * @example\n * <TooltipProvider>\n * <Tooltip title=\"Delete record\" placement=\"top\">\n * <IconButton icon={<TrashIcon />} />\n * </Tooltip>\n * </TooltipProvider>\n */\nexport default function Tooltip({\n children,\n title,\n placement = 'top',\n delayDuration = 300,\n sideOffset = 8,\n}: TooltipProps) {\n return (\n <TooltipPrimitive.Provider delayDuration={delayDuration}>\n <TooltipPrimitive.Root>\n <TooltipPrimitive.Trigger asChild>\n <span className=\"inline-flex\">{children}</span>\n </TooltipPrimitive.Trigger>\n\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n side={placement}\n sideOffset={sideOffset}\n className={[\n // Layout + typography\n 'pointer-events-none z-[500000] max-w-[220px] px-2.5 py-1.5',\n // Inverted surface: dark on light, light on dark — both readable\n 'bg-foreground text-background',\n 'text-xs font-medium leading-snug',\n // Shape + shadow\n 'rounded-md shadow-md',\n // Out animation (always the same — just fade)\n 'data-[state=closed]:animate-tooltip-out',\n // In animation — direction-aware\n ANIMATION[placement],\n ].join(' ')}\n >\n {title}\n <TooltipPrimitive.Arrow\n width={10}\n height={5}\n className=\"fill-foreground\"\n />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n </TooltipPrimitive.Root>\n </TooltipPrimitive.Provider>\n )\n}\n\nexport { TooltipPrimitive as TooltipPrimitives }\nexport const TooltipProvider = TooltipPrimitive.Provider\n","import React, { useEffect, useState } from 'react'\nimport * as TabsPrimitive from '@radix-ui/react-tabs'\n\nexport interface TabItem {\n key: string\n title: React.ReactNode\n content: React.ReactNode\n}\n\nexport interface TabsProps {\n tabs?: TabItem[]\n onTabChange?: (prev: TabItem | undefined, next: TabItem | undefined) => void\n onTabClose?: (key: string) => void\n /** Only mount the active tab's content */\n isLazy?: boolean\n tabsClosable?: boolean\n defaultActiveTab?: string\n}\n\n/**\n * Scrollable pill-style tabs powered by Radix Tabs.\n *\n * Radix handles roving-tabindex keyboard navigation and ARIA roles.\n * Rounded pill style, fully themed via semantic design tokens.\n * Supports dynamic tab add/remove with automatic activation.\n *\n * @example\n * <Tabs\n * tabs={[\n * { key: 'v1', title: 'Vessel 1', content: <Panel1 /> },\n * { key: 'v2', title: 'Vessel 2', content: <Panel2 /> },\n * ]}\n * tabsClosable\n * onTabClose={(key) => removetab(key)}\n * />\n */\nexport default function Tabs({\n tabs = [],\n onTabChange,\n onTabClose,\n isLazy,\n tabsClosable = true,\n defaultActiveTab,\n}: TabsProps) {\n const [value, setValue] = useState<string>(() => defaultActiveTab ?? tabs[0]?.key ?? '')\n\n // Sync when external defaultActiveTab changes\n useEffect(() => {\n if (defaultActiveTab) setValue(defaultActiveTab)\n }, [defaultActiveTab])\n\n // When tabs are added / removed, keep a valid active tab\n useEffect(() => {\n if (tabs.length === 0) {\n setValue('')\n return\n }\n const exists = tabs.find((t) => t.key === value)\n if (!exists) {\n // Activate last tab (mimics original behaviour on close)\n setValue(tabs[tabs.length - 1].key)\n }\n }, [tabs, value])\n\n const handleValueChange = (newValue: string) => {\n const prev = tabs.find((t) => t.key === value)\n const next = tabs.find((t) => t.key === newValue)\n onTabChange?.(prev, next)\n setValue(newValue)\n }\n\n const toPreviousTab = () => {\n const idx = tabs.findIndex((t) => t.key === value)\n if (idx > 0) handleValueChange(tabs[idx - 1].key)\n }\n\n const toNextTab = () => {\n const idx = tabs.findIndex((t) => t.key === value)\n if (idx < tabs.length - 1) handleValueChange(tabs[idx + 1].key)\n }\n\n if (tabs.length === 0) return null\n\n return (\n <TabsPrimitive.Root\n value={value}\n onValueChange={handleValueChange}\n className=\"h-full max-w-full flex flex-col gap-2\"\n >\n {/* Tab strip */}\n <div className=\"bg-surface border border-border rounded-lg flex items-center justify-between flex-shrink-0 w-full p-1 overflow-hidden\">\n {/* Left chevron */}\n <button\n type=\"button\"\n onClick={toPreviousTab}\n aria-label=\"Previous tab\"\n className=\"cursor-pointer rounded-lg transition-colors duration-150 hover:bg-surface-raised text-foreground-secondary hover:text-foreground rotate-180 flex-shrink-0 focus:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} className=\"h-6 w-6\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 5l7 7-7 7\" />\n </svg>\n </button>\n\n {/* Pills list */}\n <TabsPrimitive.List\n aria-label=\"Tabs\"\n className=\"flex-1 flex items-center gap-1 overflow-x-auto overflow-y-hidden rounded-lg scroll-smooth snap-x snap-mandatory hidden-scrollbar\"\n >\n {tabs.map((tab) => (\n // Trigger + close button are SIBLINGS, not nested.\n // Nesting a clickable element inside <button> is invalid\n // HTML and breaks keyboard activation of the inner one.\n // The wrapper carries `group` so the close button can\n // react to the trigger's `data-state=active` for styling.\n <div\n key={tab.key}\n className=\"snap-start snap-always relative flex items-center flex-1 min-w-[120px] max-w-[220px] flex-shrink-0 group\"\n >\n <TabsPrimitive.Trigger\n value={tab.key}\n className={`w-full ${tabsClosable ? 'pr-8' : 'pr-3'} pl-3 py-2 rounded-3xl cursor-pointer transition-all duration-200 select-none h-10 text-left\n text-foreground-secondary bg-surface-raised\n hover:bg-surface hover:text-foreground\n data-[state=active]:bg-accent data-[state=active]:text-accent-foreground\n focus:outline-none focus-visible:ring-2 focus-visible:ring-accent`}\n >\n <span className=\"truncate text-sm block\">{tab.title}</span>\n </TabsPrimitive.Trigger>\n {tabsClosable && (\n <button\n type=\"button\"\n aria-label={`Close ${tab.title}`}\n onClick={(e) => {\n e.stopPropagation()\n onTabClose?.(tab.key)\n }}\n className=\"absolute right-1.5 top-1/2 -translate-y-1/2 rounded p-0.5 text-foreground-secondary group-data-[state=active]:text-accent-foreground hover:bg-black/10 transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 20 20\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M15 5L5 15M5 5l10 10\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n )}\n </div>\n ))}\n </TabsPrimitive.List>\n\n {/* Right chevron */}\n <button\n type=\"button\"\n onClick={toNextTab}\n aria-label=\"Next tab\"\n className=\"cursor-pointer rounded-lg transition-colors duration-150 hover:bg-surface-raised text-foreground-secondary hover:text-foreground flex-shrink-0 focus:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} className=\"h-6 w-6\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 5l7 7-7 7\" />\n </svg>\n </button>\n </div>\n\n {/* Content pane */}\n <div className=\"p-2 rounded-lg w-full flex-1 min-h-0 bg-surface border border-border overflow-hidden\">\n {isLazy ? (\n // Mount only the active content\n tabs\n .filter((t) => t.key === value)\n .map((t) => (\n <TabsPrimitive.Content key={t.key} value={t.key} className=\"w-full h-full focus:outline-none\">\n {t.content}\n </TabsPrimitive.Content>\n ))\n ) : (\n // Pre-mount all, hide non-active via Radix\n tabs.map((t) => (\n <TabsPrimitive.Content key={t.key} value={t.key} className=\"w-full h-full focus:outline-none\" forceMount>\n <div className={`w-full h-full ${t.key === value ? 'block' : 'hidden'}`}>\n {t.content}\n </div>\n </TabsPrimitive.Content>\n ))\n )}\n </div>\n </TabsPrimitive.Root>\n )\n}\n","import React from 'react'\nimport * as Accordion from '@radix-ui/react-accordion'\n\nexport interface TreeNode {\n key: string\n label: string\n nodeData?: any\n parentLabel?: string\n children?: TreeNode[]\n}\n\nexport interface TreeItemClickPayload {\n isParent: boolean\n key: string\n label: string\n data?: any\n parentLabel?: string\n}\n\nexport interface TreeProps {\n nodes: TreeNode[]\n onNodeClick: (payload: TreeItemClickPayload) => void\n defaultExpandAll?: boolean\n defaultExpandedKeys?: string[]\n}\n\n/** ─────────────────── helpers ─────────────────── */\nconst isParent = (item: TreeNode) =>\n Boolean(item.children && item.children.length > 0)\n\n/** ─────────────────── single node ─────────────────── */\ninterface NodeProps {\n item: TreeNode\n onNodeClick: TreeProps['onNodeClick']\n defaultExpandAll: boolean\n defaultExpandedKeys: string[]\n depth?: number\n}\n\nfunction TreeNodeItem({\n item,\n onNodeClick,\n defaultExpandAll,\n defaultExpandedKeys,\n depth = 0,\n}: NodeProps) {\n if (!isParent(item)) {\n return (\n <button\n type=\"button\"\n className=\"flex w-full items-center gap-2.5 cursor-pointer select-none group text-left rounded-md px-2 py-1.5 hover:bg-surface-raised transition-colors duration-150 focus:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n style={{ paddingLeft: depth * 12 + 8 }}\n onClick={() =>\n onNodeClick({\n isParent: false,\n key: item.key,\n label: item.label,\n data: item.nodeData,\n parentLabel: item.parentLabel,\n })\n }\n >\n {/* Leaf dot */}\n <span className=\"w-1.5 h-1.5 rounded-full flex-shrink-0 bg-foreground-muted group-hover:bg-accent transition-colors duration-150\" />\n <span className=\"text-sm text-foreground-secondary group-hover:text-foreground transition-colors duration-150\">\n {item.label}\n </span>\n </button>\n )\n }\n\n const initialOpen =\n defaultExpandAll || defaultExpandedKeys.includes(item.key)\n ? [item.key]\n : []\n\n return (\n <Accordion.Root\n type=\"multiple\"\n defaultValue={initialOpen}\n style={{ paddingLeft: depth * 12 }}\n >\n <Accordion.Item value={item.key} className=\"border-none\">\n {/* The Trigger handles BOTH expand/collapse (via Radix) and\n onNodeClick — clicking anywhere on the parent row fires\n both, consistently. Previously only the label fired\n onNodeClick while the chevron only toggled — asymmetric\n behaviour that confused consumers. */}\n <Accordion.Trigger\n onClick={() =>\n onNodeClick({\n isParent: true,\n key: item.key,\n label: item.label,\n data: item.nodeData,\n parentLabel: item.parentLabel,\n })\n }\n className=\"flex items-center gap-2 cursor-pointer py-1.5 px-2 group focus:outline-none focus-visible:ring-2 focus-visible:ring-accent w-full text-left rounded-md hover:bg-surface-raised transition-colors duration-150\"\n >\n {/* Chevron — rotates on open/close */}\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2.5}\n className=\"h-3.5 w-3.5 flex-shrink-0 text-foreground-muted transition-transform duration-200 group-data-[state=open]:rotate-0 group-data-[state=closed]:-rotate-90\"\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n <span className=\"text-sm font-semibold text-foreground select-none\">\n {item.label}\n </span>\n </Accordion.Trigger>\n\n <Accordion.Content className=\"overflow-hidden data-[state=open]:animate-accordion-down data-[state=closed]:animate-accordion-up\">\n <div className=\"ml-3.5 border-l border-border py-0.5\">\n {item.children!.map((child) => (\n <TreeNodeItem\n key={child.key}\n item={child}\n onNodeClick={onNodeClick}\n defaultExpandAll={defaultExpandAll}\n defaultExpandedKeys={defaultExpandedKeys}\n depth={depth + 1}\n />\n ))}\n </div>\n </Accordion.Content>\n </Accordion.Item>\n </Accordion.Root>\n )\n}\n\n/** ─────────────────── public component ─────────────────── */\n\n/**\n * Hierarchical tree view powered by Radix Accordion.\n *\n * Each parent node is an independent Accordion.Root with type=\"multiple\" so\n * sibling branches expand independently. Leaf nodes are plain buttons.\n * Expand/collapse is animated via CSS keyframes.\n *\n * @example\n * <Tree\n * nodes={fleetTree}\n * onNodeClick={({ key, isParent }) => selectNode(key)}\n * defaultExpandAll\n * />\n */\nexport default function Tree({\n nodes,\n onNodeClick,\n defaultExpandAll = false,\n defaultExpandedKeys = [],\n}: TreeProps) {\n return (\n <div className=\"p-1 w-full\">\n {nodes.map((item) => (\n <TreeNodeItem\n key={item.key}\n item={item}\n onNodeClick={onNodeClick}\n defaultExpandAll={defaultExpandAll}\n defaultExpandedKeys={defaultExpandedKeys}\n />\n ))}\n </div>\n )\n}\n","import React from 'react'\nimport * as ToggleGroup from '@radix-ui/react-toggle-group'\n\nexport interface ToggleItem {\n key: string\n label?: React.ReactNode\n icon?: React.ReactNode\n}\n\nexport interface ToggleButtonProps {\n items: ToggleItem[]\n onChange: (key: string) => void\n activeKey: string\n}\n\n/**\n * Segmented toggle-button group powered by Radix ToggleGroup.\n *\n * Radix handles keyboard navigation (arrow keys), focus ring, and\n * `role=\"group\"` / `aria-pressed` ARIA attributes.\n *\n * @example\n * <ToggleButton\n * items={[\n * { key: 'grid', icon: <Icon.Grid /> },\n * { key: 'list', icon: <Icon.List /> },\n * ]}\n * activeKey={view}\n * onChange={setView}\n * />\n */\nexport default function ToggleButton({ items, onChange, activeKey }: ToggleButtonProps) {\n return (\n <ToggleGroup.Root\n type=\"single\"\n value={activeKey}\n onValueChange={(val) => {\n // Radix passes '' when user clicks the already-selected item → keep current\n if (val) onChange(val)\n }}\n className=\"flex items-center\"\n >\n {items.map((item, index) => (\n <ToggleGroup.Item\n key={item.key}\n value={item.key}\n aria-label={typeof item.label === 'string' ? item.label : item.key}\n className={[\n // Semantic tokens handle both light and dark modes via\n // CSS vars — no `dark:` variants needed.\n index === 0 && 'rounded-l-lg border-r border-border',\n index === items.length - 1 && 'rounded-r-lg border-l border-border',\n 'p-2 cursor-pointer transition-colors duration-150 text-foreground-secondary',\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-accent',\n 'bg-surface hover:bg-surface-raised',\n 'data-[state=on]:bg-accent data-[state=on]:text-accent-fg',\n ]\n .filter(Boolean)\n .join(' ')}\n >\n {item.icon ?? item.label}\n </ToggleGroup.Item>\n ))}\n </ToggleGroup.Root>\n )\n}\n","import React, { createContext, useCallback, useContext, useEffect, useRef, useState } from 'react'\nimport { motion, AnimatePresence, useReducedMotion } from 'framer-motion'\nimport Portal from '../layout/Portal'\n\n/** ─────────────────── types ─────────────────── */\nexport type NotificationType = 'info' | 'success' | 'warning' | 'danger'\n\nexport type NotificationPosition =\n | 'top-right' | 'top-left' | 'top-center'\n | 'bottom-right' | 'bottom-left' | 'bottom-center'\n\nexport interface NotificationPayload {\n title: React.ReactNode\n description?: React.ReactNode\n /** Auto-dismiss duration in ms (default 4000). Pass `Infinity` to disable auto-dismiss. */\n duration?: number\n type?: NotificationType\n}\n\ninterface NotificationEntry extends NotificationPayload {\n id: number\n}\n\ninterface NotificationContextValue {\n open: (payload: NotificationPayload) => void\n close: (id: number) => void\n}\n\n/** ─────────────────── context ─────────────────── */\nconst NotificationContext = createContext<NotificationContextValue>({\n open: () => undefined,\n close: () => undefined,\n})\n\n/** ─────────────────── helpers ─────────────────── */\nconst TYPE_BG: Record<NotificationType, string> = {\n info: 'bg-status-info',\n success: 'bg-status-success',\n warning: 'bg-status-warning',\n danger: 'bg-status-error',\n}\n\n// Viewport positioning classes per position. The viewport is portaled to\n// `document.body`, so these `fixed` positions always resolve against the\n// real viewport.\nconst VIEWPORT_CLASSES: Record<NotificationPosition, string> = {\n 'top-right': 'fixed top-4 right-4 flex flex-col items-end',\n 'top-left': 'fixed top-4 left-4 flex flex-col items-start',\n 'top-center': 'fixed top-4 left-1/2 flex flex-col items-center -translate-x-1/2',\n 'bottom-right': 'fixed bottom-4 right-4 flex flex-col-reverse items-end',\n 'bottom-left': 'fixed bottom-4 left-4 flex flex-col-reverse items-start',\n 'bottom-center': 'fixed bottom-4 left-1/2 flex flex-col-reverse items-center -translate-x-1/2',\n}\n\n// Initial motion state per position: drop in from above for top-* and rise\n// from below for bottom-*. The y offset is large (±28px) so the trajectory\n// is clearly visible; opacity completes faster than the y/scale tween so\n// the card is already opaque while it still has travel left.\nfunction getInitialMotion(pos: NotificationPosition, reduced: boolean | null) {\n if (reduced) return { opacity: 0, y: 0, scale: 1 }\n const bottom = pos.startsWith('bottom')\n return { opacity: 0, y: bottom ? 28 : -28, scale: 0.92 }\n}\n\nfunction getExitMotion(pos: NotificationPosition, reduced: boolean | null) {\n if (reduced) return { opacity: 0, y: 0, scale: 1 }\n const bottom = pos.startsWith('bottom')\n return { opacity: 0, y: bottom ? 18 : -18, scale: 0.94 }\n}\n\nfunction TypeIcon({ type }: { type: NotificationType }) {\n if (type === 'success') {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n )\n }\n if (type === 'info') {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" /><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\" /><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\" />\n </svg>\n )\n }\n if (type === 'warning') {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M10.29 3.86L1.82 18a2 2 0 001.71 3h16.94a2 2 0 001.71-3L13.71 3.86a2 2 0 00-3.42 0z\" />\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\" /><line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\n </svg>\n )\n }\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" /><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\" /><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\" />\n </svg>\n )\n}\n\n/** ─────────────────── animated toast item ───────────────────\n *\n * Renders a single notification as a `motion.div` direct child of\n * `AnimatePresence` — no Radix Toast wrapping. The previous Radix-based\n * implementation entangled `Toast.Root`/`Toast.Viewport` lifecycles with\n * Framer Motion's exit detection in a way that suppressed enter/exit\n * animations in some configurations. A pure Framer + portal pattern is\n * simpler, more controllable, and visibly animates.\n *\n * Auto-dismiss uses a per-item `setTimeout` that pauses on hover/focus\n * and resumes on leave/blur. Tracks elapsed time so the remaining\n * duration is correct after a pause.\n */\nfunction NotificationItem({\n n,\n pos,\n onClose,\n reduced,\n}: {\n n: NotificationEntry\n pos: NotificationPosition\n onClose: (id: number) => void\n reduced: boolean | null\n}) {\n const [paused, setPaused] = useState(false)\n const duration = n.duration ?? 4000\n const isAutoDismissing = isFinite(duration) && duration > 0\n const showProgress = !reduced && isAutoDismissing\n\n // Timer management — careful with refs so React 18 strict-mode double\n // mount doesn't double-schedule the dismissal.\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n const startTimeRef = useRef<number>(0)\n const remainingRef = useRef<number>(duration)\n\n const clearTimer = useCallback(() => {\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current)\n timerRef.current = null\n }\n }, [])\n\n const scheduleDismiss = useCallback((ms: number) => {\n clearTimer()\n if (!isAutoDismissing) return\n startTimeRef.current = Date.now()\n timerRef.current = setTimeout(() => onClose(n.id), ms)\n }, [clearTimer, isAutoDismissing, n.id, onClose])\n\n // Start the timer on mount\n useEffect(() => {\n if (paused || !isAutoDismissing) return\n scheduleDismiss(remainingRef.current)\n return clearTimer\n }, [paused, isAutoDismissing, scheduleDismiss, clearTimer])\n\n // When the user hovers / focuses, capture how much time was left and\n // pause. On leave, resume with the remaining time.\n const onPauseStart = () => {\n if (!isAutoDismissing) return\n const elapsed = Date.now() - startTimeRef.current\n remainingRef.current = Math.max(0, remainingRef.current - elapsed)\n setPaused(true)\n }\n const onPauseEnd = () => {\n if (!isAutoDismissing) return\n setPaused(false)\n }\n\n return (\n <motion.div\n layout\n // pointer-events-auto re-enables clicks on the toast card itself;\n // the parent viewport is pointer-events-none so empty space doesn't\n // block interaction with the page underneath.\n className=\"pointer-events-auto\"\n initial={getInitialMotion(pos, reduced)}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={getExitMotion(pos, reduced)}\n transition={\n reduced\n ? { duration: 0 }\n : {\n // Opacity finishes in 0.15 s; y/scale take 0.34 s.\n // Card is opaque while still travelling — movement\n // is clearly visible to the user.\n opacity: { duration: 0.15 },\n y: { type: 'tween', duration: 0.34, ease: [0.16, 1, 0.3, 1] },\n scale: { type: 'tween', duration: 0.34, ease: [0.16, 1, 0.3, 1] },\n layout: { duration: 0.22, ease: [0.16, 1, 0.3, 1] },\n }\n }\n onMouseEnter={onPauseStart}\n onMouseLeave={onPauseEnd}\n onFocus={onPauseStart}\n onBlur={onPauseEnd}\n role={n.type === 'danger' || n.type === 'warning' ? 'alert' : 'status'}\n aria-live={n.type === 'danger' || n.type === 'warning' ? 'assertive' : 'polite'}\n >\n <div\n className={[\n 'w-[300px] rounded-md shadow-lg overflow-hidden focus:outline-none',\n TYPE_BG[n.type ?? 'info'],\n ].join(' ')}\n >\n {/* Content row */}\n <div className=\"flex items-start gap-3 p-3 pr-2.5\">\n <span className=\"mt-0.5 flex-shrink-0 text-white/90\">\n <TypeIcon type={n.type ?? 'info'} />\n </span>\n\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-sm font-semibold text-white leading-snug\">\n {n.title}\n </div>\n {n.description && (\n <div className=\"mt-0.5 text-xs text-white/75 leading-relaxed\">\n {n.description}\n </div>\n )}\n </div>\n\n <button\n type=\"button\"\n aria-label=\"Close notification\"\n onClick={() => onClose(n.id)}\n className=\"flex-shrink-0 mt-0.5 rounded p-1 text-white/60 hover:text-white hover:bg-white/15 transition-colors duration-100 focus:outline-none focus-visible:ring-1 focus-visible:ring-white/50\"\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M9 3L3 9M3 3l6 6\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n </button>\n </div>\n\n {/* Countdown progress bar — `notification-progress` keyframe\n drives a scaleX 1→0. animationPlayState pauses with our\n hover/focus state so the visual matches the actual timer. */}\n {showProgress && (\n <div className=\"relative h-[3px] bg-white/20 overflow-hidden\">\n <div\n className=\"absolute inset-0 bg-white/60 [transform-origin:left]\"\n style={{\n animation: `notification-progress ${duration}ms linear forwards`,\n animationPlayState: paused ? 'paused' : 'running',\n }}\n />\n </div>\n )}\n </div>\n </motion.div>\n )\n}\n\n/** ─────────────────── provider ─────────────────── */\n\n/**\n * Wrap your app in `NotificationProvider`, then call `useNotification()`\n * anywhere inside to show toast notifications.\n *\n * @param position One of 6 viewport positions (default `'top-right'`).\n *\n * @example\n * <NotificationProvider position=\"bottom-right\">\n * <App />\n * </NotificationProvider>\n *\n * // anywhere inside:\n * const { success, danger } = useNotification()\n * success({ title: 'Saved', description: 'Changes were stored.' })\n */\nexport function NotificationProvider({\n children,\n position = 'top-right',\n}: {\n children: React.ReactNode\n position?: NotificationPosition\n}) {\n const [notifications, setNotifications] = useState<NotificationEntry[]>([])\n const reduced = useReducedMotion()\n\n const open = useCallback((payload: NotificationPayload) => {\n setNotifications((prev) => [\n ...prev,\n { duration: 4000, ...payload, id: Date.now() + Math.random() },\n ])\n }, [])\n\n const close = useCallback((id: number) => {\n setNotifications((prev) => prev.filter((n) => n.id !== id))\n }, [])\n\n return (\n <NotificationContext.Provider value={{ open, close }}>\n {children}\n\n {/* Portaled into <body> so `position: fixed` resolves against the\n real viewport — see Portal.tsx for the why. */}\n <Portal>\n <ul\n role=\"region\"\n aria-label=\"Notifications\"\n className={[\n VIEWPORT_CLASSES[position],\n 'z-[500000] gap-2 w-[316px] outline-none pointer-events-none m-0 p-0 list-none',\n ].join(' ')}\n >\n <AnimatePresence initial={false}>\n {notifications.map((n) => (\n <NotificationItem\n key={n.id}\n n={n}\n pos={position}\n onClose={close}\n reduced={reduced}\n />\n ))}\n </AnimatePresence>\n </ul>\n </Portal>\n </NotificationContext.Provider>\n )\n}\n\n/** ─────────────────── hook ─────────────────── */\n\n/**\n * Returns four type-specific show functions.\n *\n * @example\n * const { info, success, warning, danger } = useNotification()\n * danger({ title: 'Save failed', description: 'Could not reach the server.' })\n */\nexport function useNotification() {\n const { open } = useContext(NotificationContext)\n return {\n info: (props: Omit<NotificationPayload, 'type'>) => open({ type: 'info', ...props }),\n success: (props: Omit<NotificationPayload, 'type'>) => open({ type: 'success', ...props }),\n warning: (props: Omit<NotificationPayload, 'type'>) => open({ type: 'warning', ...props }),\n danger: (props: Omit<NotificationPayload, 'type'>) => open({ type: 'danger', ...props }),\n }\n}\n","import React from 'react'\nimport { motion, useReducedMotion, type Variants } from 'framer-motion'\nimport Portal from '../layout/Portal'\n\nexport type LoadingSpinnerSize = 'xs' | 'sm' | 'md' | 'lg'\n\nexport interface LoadingSpinnerProps {\n /**\n * Text revealed letter-by-letter beneath the spinner. Optional — pass\n * `undefined` for a pure spinner with no caption (e.g. inline mode).\n */\n prompt?: string\n /** Spinner size variant. Defaults to `'md'`. */\n size?: LoadingSpinnerSize\n /**\n * When `true`, renders inline at the call site (no portal, no fullscreen\n * overlay, no backdrop). Useful inside cards, table rows, drawers, or\n * empty-state slots. Defaults to `false` (fullscreen overlay).\n */\n inline?: boolean\n /**\n * Optional override for the spinner ring colour. Accepts any CSS colour.\n * Defaults to the `--color-accent` token so it picks up theme overrides.\n */\n spinnerColor?: string\n /**\n * Optional override for the prompt text colour.\n * Defaults to the `--color-foreground` token (light/dark aware).\n */\n textColor?: string\n /**\n * Backdrop opacity (0 – 1) for the fullscreen overlay. Defaults to 0.8 —\n * close enough to opaque to block UI underneath while still hinting at the\n * previous state. Ignored when `inline` is true.\n */\n backdropOpacity?: number\n}\n\n// ── Size → dimensions table ─────────────────────────────────────────────────\n// Outer ring, inner ring, centre dot, ring stroke width, text size.\nconst SIZE_MAP = {\n // xs is sized to fit beside button text (~14px) — async AutoComplete,\n // Button loading prop, inline status badges, etc.\n xs: { outer: 'w-3.5 h-3.5', inner: 'w-1.5 h-1.5', dot: 'w-0.5 h-0.5', stroke: 'border-[1.5px]', text: 'text-[10px]' },\n sm: { outer: 'w-8 h-8', inner: 'w-4 h-4', dot: 'w-1 h-1', stroke: 'border-2', text: 'text-xs' },\n md: { outer: 'w-20 h-20', inner: 'w-12 h-12', dot: 'w-2 h-2', stroke: 'border-[3px]', text: 'text-2xl' },\n lg: { outer: 'w-32 h-32', inner: 'w-20 h-20', dot: 'w-3 h-3', stroke: 'border-4', text: 'text-4xl' },\n} as const satisfies Record<LoadingSpinnerSize, {\n outer: string; inner: string; dot: string; stroke: string; text: string\n}>\n\n// ── Letter-stagger variants ─────────────────────────────────────────────────\n// 60 ms stagger, 250 ms fade + lift per glyph. With `useReducedMotion` the\n// container falls back to instant reveal — the prompt stays visible.\nconst containerVariants: Variants = {\n hidden: {},\n visible: { transition: { staggerChildren: 0.05 } },\n}\n\nconst letterVariants: Variants = {\n hidden: { opacity: 0, y: 4 },\n visible: { opacity: 1, y: 0, transition: { duration: 0.22, ease: 'easeOut' } },\n}\n\n// ── Spinner core (rings + dot) ──────────────────────────────────────────────\n// Two concentric arcs rotating at different speeds in opposite directions,\n// with a centred breathing dot. Each ring uses two opposing border edges so\n// the rotation reads as a 180° arc traversal — sharper than a full ring.\n// All three elements rotate around the same centre via `relative + absolute`.\nfunction SpinnerCore({ size, color }: { size: LoadingSpinnerSize; color?: string }) {\n const dims = SIZE_MAP[size]\n const ringColor = color ?? 'var(--color-accent)'\n return (\n <div className=\"relative flex items-center justify-center\" style={{ color: ringColor }}>\n {/* Outer arc — slower clockwise */}\n <div\n className={`${dims.outer} ${dims.stroke} rounded-full border-transparent border-t-current border-r-current animate-spin`}\n style={{ animationDuration: '1.4s' }}\n aria-hidden=\"true\"\n />\n {/* Inner arc — faster counter-clockwise, lower opacity for layering */}\n <div\n className={`absolute ${dims.inner} ${dims.stroke} rounded-full border-transparent border-b-current border-l-current animate-spin opacity-60`}\n style={{ animationDuration: '0.9s', animationDirection: 'reverse' }}\n aria-hidden=\"true\"\n />\n {/* Centre dot — breathing pulse */}\n <div\n className={`absolute ${dims.dot} rounded-full bg-current animate-breathe`}\n aria-hidden=\"true\"\n />\n </div>\n )\n}\n\n/**\n * Enterprise-grade loading indicator.\n *\n * Two concentric arcs counter-rotating around a breathing centre dot, with\n * an optional staggered letter reveal beneath. Portaled to `document.body`\n * for the fullscreen overlay so it always covers the actual viewport\n * regardless of where it sits in the React tree.\n *\n * **Two modes:**\n * - **Fullscreen overlay** (default): semi-opaque backdrop with\n * `backdrop-blur-sm` for a modern depth effect. Use during page-level\n * loading, route transitions, or critical mutations.\n * - **Inline** (`inline`): just the spinner + optional caption rendered at\n * the call site. Use inside cards, table rows, drawers, empty states,\n * or anywhere a smaller loading affordance is appropriate.\n *\n * **Accessibility**: `role=\"status\"` + `aria-label`/`aria-live` make the\n * indicator announce-able to screen readers. `prefers-reduced-motion`\n * collapses the letter stagger to instant reveal — the spinner rings keep\n * rotating since a continuous spinner is informative, not decorative.\n *\n * @example Fullscreen overlay (page load)\n * ```tsx\n * {isLoading && <LoadingSpinner prompt=\"Loading vessels…\" />}\n * ```\n *\n * @example Inline (inside a card)\n * ```tsx\n * <Card>\n * {data ? <Chart data={data} /> : <LoadingSpinner inline size=\"sm\" />}\n * </Card>\n * ```\n *\n * @example Themed overlay\n * ```tsx\n * <LoadingSpinner\n * prompt=\"Saving\"\n * size=\"lg\"\n * spinnerColor=\"#10b981\"\n * backdropOpacity={0.7}\n * />\n * ```\n */\nexport default function LoadingSpinner({\n prompt,\n size = 'md',\n inline = false,\n spinnerColor,\n textColor,\n backdropOpacity = 0.8,\n}: LoadingSpinnerProps) {\n const reduced = useReducedMotion()\n const letters = prompt ? Array.from(prompt) : []\n const dims = SIZE_MAP[size]\n\n const content = (\n <>\n <SpinnerCore size={size} color={spinnerColor} />\n\n {letters.length > 0 && (\n <motion.div\n className={`${dims.text} font-semibold tracking-tight select-none`}\n style={{ color: textColor ?? 'var(--color-foreground)' }}\n variants={containerVariants}\n initial={reduced ? 'visible' : 'hidden'}\n animate=\"visible\"\n aria-hidden=\"true\"\n >\n {letters.map((letter, index) => (\n <motion.span\n key={index}\n className=\"inline-block whitespace-pre\"\n variants={letterVariants}\n >\n {letter}\n </motion.span>\n ))}\n </motion.div>\n )}\n </>\n )\n\n // ── Inline mode ─────────────────────────────────────────────────────────\n if (inline) {\n return (\n <div\n role=\"status\"\n aria-live=\"polite\"\n aria-label={prompt ?? 'Loading'}\n className=\"flex flex-col items-center justify-center gap-3\"\n >\n {content}\n </div>\n )\n }\n\n // ── Fullscreen overlay ──────────────────────────────────────────────────\n return (\n <Portal>\n <div\n role=\"status\"\n aria-live=\"polite\"\n aria-label={prompt ?? 'Loading'}\n className=\"fixed inset-0 z-[8000000] flex flex-col items-center justify-center gap-6 bg-background backdrop-blur-sm\"\n style={{ opacity: backdropOpacity }}\n >\n {content}\n </div>\n </Portal>\n )\n}\n","import React, { useEffect, useRef, useState } from 'react'\n\nexport interface FadingBaseProps {\n className?: string\n /** Controls mount/unmount with fade transition */\n isMounted?: boolean\n children?: React.ReactNode\n}\n\n/**\n * Fade-in / fade-out page container.\n *\n * Replaces `react-transition-group` with a pure CSS opacity transition.\n * The component mounts on `isMounted=true` and unmounts after the 300ms\n * fade-out completes on `isMounted=false`.\n *\n * Uses CSS `dark:` class for the glass effect — no ThemeContext dependency.\n *\n * @example\n * <FadingBase isMounted={isPageVisible}>\n * <PageContent />\n * </FadingBase>\n */\nexport default function FadingBase({\n className = '',\n isMounted = false,\n children,\n}: FadingBaseProps) {\n const [shouldRender, setShouldRender] = useState(isMounted)\n const [visible, setVisible] = useState(false)\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n useEffect(() => {\n if (isMounted) {\n setShouldRender(true)\n // rAF gives the DOM time to paint before triggering the transition\n const rafId = requestAnimationFrame(() => setVisible(true))\n return () => cancelAnimationFrame(rafId)\n } else {\n setVisible(false)\n timerRef.current = setTimeout(() => setShouldRender(false), 300)\n return () => {\n if (timerRef.current) clearTimeout(timerRef.current)\n }\n }\n }, [isMounted])\n\n if (!shouldRender) return null\n\n return (\n // `calculated-height` and `dark:glassmorphism` were orphaned CSS classes\n // (never defined anywhere). Replaced with semantic `min-h-full` +\n // `bg-surface` which works in both light and dark modes via the\n // ThemeProvider's CSS vars.\n <div\n className={`w-full min-h-full pl-2 pr-2 pb-2 transition-opacity duration-300 ${visible ? 'opacity-100' : 'opacity-0'}`}\n >\n <div className={`bg-surface w-full h-full rounded-lg p-2 ${className}`}>\n {children}\n </div>\n </div>\n )\n}\n","import React from 'react'\n\nexport interface ListItem {\n /** Stable key for React reconciliation + active-key matching. */\n key: string | number\n /** Main item text (title). Required. */\n label: React.ReactNode\n /** Optional description rendered below the label, in foreground-secondary. */\n description?: React.ReactNode\n /**\n * Optional leading slot, typically an Avatar. Anything React-renderable\n * is accepted (icon, image, status badge…).\n */\n avatar?: React.ReactNode\n /** Optional trailing slot, e.g. a badge, count, or action icon. */\n trailing?: React.ReactNode\n /** Disable interaction for this item only. */\n disabled?: boolean\n}\n\nexport interface ListProps {\n items: ListItem[]\n onItemClick: (item: ListItem) => void\n activeKey?: string | number\n /**\n * Visual density. `'compact'` for dense reference lists,\n * `'comfortable'` (default) for typical UI, `'spacious'` for hero rows.\n */\n density?: 'compact' | 'comfortable' | 'spacious'\n}\n\nconst DENSITY_PADDING: Record<NonNullable<ListProps['density']>, string> = {\n 'compact': 'py-1.5 px-2',\n 'comfortable': 'py-2.5 px-3',\n 'spacious': 'py-3.5 px-4',\n}\n\n/**\n * Vertical clickable list with optional avatar / description / trailing\n * slots per item. Built on `role=\"listbox\"` + `role=\"option\"` so screen\n * readers announce it as a selectable list. Keyboard activation works on\n * Enter and Space.\n *\n * **When to use this** over a Table:\n * - When the dataset is a simple sequence of records that the user\n * browses + picks one of (sidebar nav, contact list, vessel chooser).\n * - When each row's primary signal is a 1–2-line summary, not a tabular\n * breakdown.\n *\n * Use Table when comparing rows across multiple columns matters more than\n * picking one.\n *\n * @example Plain\n * ```tsx\n * <List\n * items={[{ key: 1, label: 'Aurora' }, { key: 2, label: 'Beacon' }]}\n * activeKey={2}\n * onItemClick={(it) => setSelected(it.key)}\n * />\n * ```\n *\n * @example With avatars + descriptions\n * ```tsx\n * <List\n * items={crew.map((c) => ({\n * key: c.id,\n * label: c.name,\n * description: c.rank,\n * avatar: <Avatar src={c.photo} alt={c.name} status={c.status} />,\n * trailing: <Badge count={c.unread} />,\n * }))}\n * onItemClick={(it) => navigate(`/crew/${it.key}`)}\n * />\n * ```\n */\nexport default function List({\n items,\n onItemClick,\n activeKey,\n density = 'comfortable',\n}: ListProps) {\n return (\n <div role=\"listbox\" className=\"flex flex-col\">\n {items.map((item) => {\n const isActive = activeKey === item.key\n const isDisabled = !!item.disabled\n return (\n <div\n key={item.key}\n role=\"option\"\n aria-selected={isActive}\n aria-disabled={isDisabled || undefined}\n tabIndex={isDisabled ? -1 : 0}\n onClick={() => !isDisabled && onItemClick(item)}\n onKeyDown={(e) => {\n if (isDisabled) return\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n onItemClick(item)\n }\n }}\n className={[\n 'flex items-center gap-3 cursor-pointer border-b border-border transition-colors duration-150',\n DENSITY_PADDING[density],\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-inset',\n isDisabled\n ? 'opacity-50 cursor-not-allowed'\n : isActive\n ? 'bg-surface-raised text-foreground'\n : 'text-foreground-secondary hover:bg-surface-raised hover:text-foreground',\n ].join(' ')}\n >\n {item.avatar && (\n <span className=\"flex-shrink-0\">{item.avatar}</span>\n )}\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-sm font-medium text-foreground truncate\">\n {item.label}\n </div>\n {item.description && (\n <div className=\"text-xs text-foreground-secondary mt-0.5 truncate\">\n {item.description}\n </div>\n )}\n </div>\n {item.trailing && (\n <span className=\"flex-shrink-0 text-foreground-muted\">{item.trailing}</span>\n )}\n </div>\n )\n })}\n </div>\n )\n}\n","import React, { useRef, useState } from 'react'\nimport { motion, useReducedMotion } from 'framer-motion'\nimport Tooltip from './Tooltip'\n\nexport interface ScalableContainerProps {\n /** Resting width. Any CSS length / percent. Default `'100%'`. */\n width?: React.CSSProperties['width']\n /** Resting height. Any CSS length / percent. Default `'auto'`. */\n height?: React.CSSProperties['height']\n /** Content to render inside. */\n children?: React.ReactNode\n /** CSS class appended to the expanded children wrapper. */\n assignClassOnClick?: string\n /** Override the expand-button icon. */\n expandIcon?: React.ReactNode\n /** Override the collapse-button icon. */\n collapseIcon?: React.ReactNode\n /**\n * Position of the toggle button inside the container.\n * Default `'top-right'` — matches the OS-window convention.\n */\n togglePosition?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right'\n}\n\nconst TOGGLE_POSITION_CLASS: Record<NonNullable<ScalableContainerProps['togglePosition']>, string> = {\n 'top-left': 'top-2 left-2',\n 'top-right': 'top-2 right-2',\n 'bottom-left': 'bottom-2 left-2',\n 'bottom-right': 'bottom-2 right-2',\n}\n\n/**\n * Container that smoothly expands to fill its parent on click and\n * collapses back to its resting size. Reads like a macOS / Windows\n * window resizing — subtle elevation shift, smooth scale, no flash\n * of colour or harsh background change.\n *\n * **What's different from the previous version**\n * - Animates BOTH width and height (was width-only).\n * - No baked-in background — the container is transparent by default,\n * so it overlays whatever surface the consumer puts behind it.\n * - Shadow lifts on expand (`shadow-md` → `shadow-2xl`) like a window\n * being raised. No colour change.\n * - The toggle button is a plain rounded chip with the chevron icon,\n * not the old `IconButton` with the heavy background. Floats over\n * the content via absolute positioning so it doesn't push layout.\n * - Configurable toggle position (default top-right, matching OS\n * close-button convention).\n *\n * @example\n * ```tsx\n * <ScalableContainer width={480} height={300}>\n * <Chart data={metrics} />\n * </ScalableContainer>\n * ```\n */\nexport default function ScalableContainer({\n width = '100%',\n height = 'auto',\n children,\n assignClassOnClick,\n expandIcon,\n collapseIcon,\n togglePosition = 'top-right',\n}: ScalableContainerProps) {\n const containerRef = useRef<HTMLDivElement>(null)\n const [isScaled, setScaled] = useState(false)\n const reduced = useReducedMotion()\n\n const onToggle = () => {\n const next = !isScaled\n setScaled(next)\n // Scroll the container into view after the resize starts so the\n // newly-expanded content is fully visible.\n requestAnimationFrame(() => containerRef.current?.scrollIntoView({ behavior: 'smooth', block: 'nearest' }))\n }\n\n const wrapperClass = isScaled ? assignClassOnClick : undefined\n\n return (\n <motion.div\n ref={containerRef}\n layout\n animate={{\n width: isScaled ? '100%' : width,\n height: isScaled ? '100%' : height,\n }}\n transition={\n reduced\n ? { duration: 0 }\n : {\n width: { type: 'tween', duration: 0.32, ease: [0.16, 1, 0.3, 1] },\n height: { type: 'tween', duration: 0.32, ease: [0.16, 1, 0.3, 1] },\n layout: { duration: 0.32, ease: [0.16, 1, 0.3, 1] },\n }\n }\n className={[\n 'relative rounded-lg overflow-hidden',\n // OS-window aesthetic: subtle elevation at rest, lifted shadow\n // when expanded. No background colour change.\n isScaled ? 'shadow-2xl' : 'shadow-md',\n 'transition-shadow duration-300',\n ].join(' ')}\n >\n {/* Toggle button — floats over content, no background flash. */}\n <Tooltip placement=\"bottom\" title={isScaled ? 'Collapse' : 'Expand'}>\n <button\n type=\"button\"\n onClick={onToggle}\n aria-label={isScaled ? 'Collapse container' : 'Expand container'}\n aria-expanded={isScaled}\n className={[\n 'absolute z-10',\n TOGGLE_POSITION_CLASS[togglePosition],\n 'w-7 h-7 inline-flex items-center justify-center',\n 'rounded-md bg-surface/80 backdrop-blur-sm border border-border',\n 'text-foreground-secondary hover:text-foreground hover:bg-surface',\n 'shadow-sm transition-colors duration-150',\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-accent',\n ].join(' ')}\n >\n {isScaled\n ? collapseIcon ?? <CollapseIcon />\n : expandIcon ?? <ExpandIcon />}\n </button>\n </Tooltip>\n\n <div className={wrapperClass}>{children}</div>\n </motion.div>\n )\n}\n\n/** Arrows-pointing-in (collapse). */\nfunction CollapseIcon() {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} className=\"w-4 h-4\" aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 9L4 4M9 9V4M9 9H4M15 9L20 4M15 9V4M15 9H20M9 15L4 20M9 15V20M9 15H4M15 15L20 20M15 15V20M15 15H20\" />\n </svg>\n )\n}\n\n/** Arrows-pointing-out (expand). */\nfunction ExpandIcon() {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} className=\"w-4 h-4\" aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M4 8V4h4M20 8V4h-4M4 16v4h4M20 16v4h-4\" />\n </svg>\n )\n}\n","import React from 'react'\nimport Button from '../inputs/Button'\n\nexport interface GridCardItem {\n key: string | number\n title: React.ReactNode\n description?: React.ReactNode\n /** Image URL or JSX element */\n cover?: string | React.ReactNode\n enabled?: boolean\n /** Arbitrary route or payload — passed back to onOpen */\n to?: string\n [key: string]: any\n}\n\nexport interface GridCardProps {\n item: GridCardItem\n buttonText?: string\n /** Called when the button is clicked. Receives the full item. */\n onOpen?: (item: GridCardItem) => void\n}\n\n/**\n * Application card tile (grid layout).\n *\n * Decoupled from React Router — navigation is delegated to the `onOpen` prop.\n *\n * @example\n * <GridCard\n * item={{ key: 'reports', title: 'Reports', enabled: true, to: '/reports' }}\n * onOpen={({ to }) => navigate(to!)}\n * />\n */\nexport default function GridCard({ item, buttonText = 'Open Application', onOpen }: GridCardProps) {\n return (\n <div className=\"flex flex-col w-[200px] h-[250px] rounded-lg bg-ice dark:bg-independence items-center justify-between p-2 shadow-2xl\">\n <div className=\"text-prussian-blue dark:text-white text-lg font-bold text-center h-1/4\">\n <h2>{item.title}</h2>\n </div>\n <div className=\"h-1/4 flex items-center justify-center\">\n {typeof item.cover === 'string' ? (\n <img src={item.cover} alt=\"Grid Card Cover\" />\n ) : (\n item.cover\n )}\n </div>\n <div className=\"text-prussian-blue text-sm dark:text-white text-center h-1/4\">\n <p>{item.description}</p>\n </div>\n <div>\n <Button\n disabled={!item.enabled}\n style={{ width: 'max-content', padding: '0 8px', margin: '0' }}\n content={buttonText}\n onClick={() => onOpen?.(item)}\n />\n </div>\n </div>\n )\n}\n","import React from 'react'\nimport Button from '../inputs/Button'\nimport { GridCardItem } from './GridCard'\n\nexport interface OpaqueGridCardProps {\n item: GridCardItem\n isRight?: boolean\n buttonText?: string\n onOpen?: (item: GridCardItem) => void\n}\n\n/**\n * Opaque carousel variant of GridCard (left or right edge of the carousel).\n *\n * Decoupled from React Router and ThemeContext.\n * Uses CSS `dark:` classes instead of `useTheme()`.\n *\n * @example\n * <OpaqueGridCard item={sideItem} isRight onOpen={({ to }) => navigate(to!)} />\n */\nexport default function OpaqueGridCard({\n item,\n isRight = false,\n buttonText = 'Open Application',\n onOpen,\n}: OpaqueGridCardProps) {\n return (\n <div\n className={`flex flex-col w-[200px] h-[250px] rounded-lg items-center p-2 ${\n !isRight\n ? 'opaque-carousel-card-left dark:opaque-carousel-card-dark-left'\n : 'opaque-carousel-card-right dark:opaque-carousel-card-dark-right'\n }`}\n >\n <div\n className={`${\n !isRight\n ? 'opaque-carousel-card-text-right dark:opaque-carousel-card-text-dark-right'\n : 'opaque-carousel-card-text-left dark:opaque-carousel-card-text-dark-left'\n } text-prussian-blue dark:text-white text-lg font-bold text-center h-1/4 select-none`}\n >\n <h2>{item.title}</h2>\n </div>\n <div className=\"h-1/4 flex items-center justify-center\">\n {typeof item.cover === 'string' ? (\n <img src={item.cover} alt=\"Grid Card Cover\" />\n ) : (\n item.cover\n )}\n </div>\n <div\n className={`${\n !isRight\n ? 'opaque-carousel-card-text-right dark:opaque-carousel-card-text-dark-right'\n : 'opaque-carousel-card-text-left dark:opaque-carousel-card-text-dark-left'\n } text-prussian-blue dark:text-white text-center h-1/4 select-none text-sm`}\n >\n <p>{item.description}</p>\n </div>\n <div>\n <Button\n style={{\n width: 'max-content',\n padding: '0 8px',\n margin: '0',\n background: !isRight\n ? 'linear-gradient(90deg, #0353A4 6.29%, rgba(3, 83, 164, 0) 97.35%)'\n : 'linear-gradient(270deg, #0353A4 3.97%, rgba(3, 83, 164, 0) 94.04%)',\n pointerEvents: 'none',\n userSelect: 'none',\n }}\n content={\n <div\n className={\n !isRight\n ? 'opaque-carousel-card-text-dark-right'\n : 'opaque-carousel-card-text-dark-left'\n }\n >\n {buttonText}\n </div>\n }\n onClick={() => onOpen?.(item)}\n />\n </div>\n </div>\n )\n}\n","import React from 'react'\nimport GridCard, { GridCardItem } from './GridCard'\n\nexport interface CatalogGridProps {\n items: GridCardItem[]\n buttonText?: string\n onOpen?: (item: GridCardItem) => void\n}\n\n/**\n * Wrapping flex grid of `GridCard` tiles.\n */\nexport default function CatalogGrid({ items, buttonText, onOpen }: CatalogGridProps) {\n return (\n <div className=\"flex flex-wrap gap-2\">\n {items.map((item) => (\n <GridCard key={item.key} item={item} buttonText={buttonText} onOpen={onOpen} />\n ))}\n </div>\n )\n}\n","import React, { useEffect, useMemo, useRef, useState } from 'react'\nimport GridCard, { GridCardItem } from './GridCard'\nimport OpaqueGridCard from './OpaqueGridCard'\nimport COLORS from '../../utils/colors'\n\nexport interface CatalogCarouselProps {\n items: GridCardItem[]\n buttonText?: string\n onOpen?: (item: GridCardItem) => void\n}\n\n/**\n * Three-card carousel (previous → active (scaled) → next).\n *\n * Decoupled from ThemeContext — uses CSS `dark:` classes.\n */\nexport default function CatalogCarousel({ items, buttonText, onOpen }: CatalogCarouselProps) {\n const [activeIndex, setActiveIndex] = useState(0)\n const [indexPool, setIndexPool] = useState<number[]>([])\n const cardRefs = useRef<{ cardIndex: number; ref: HTMLDivElement }[]>([])\n\n const getIndexes = useMemo(() => {\n let nextIndex = activeIndex + 1\n let previousIndex = activeIndex - 1\n if (activeIndex === 0) previousIndex = items.length - 1\n if (activeIndex === items.length - 1) nextIndex = 0\n return { previousIndex, nextIndex }\n }, [activeIndex, items.length])\n\n useEffect(() => {\n const { nextIndex, previousIndex } = getIndexes\n let indexes = [previousIndex, activeIndex, nextIndex]\n if (activeIndex !== 0 && activeIndex !== items.length - 1) {\n indexes = [...indexes].sort((a, b) => a - b)\n }\n setIndexPool(indexes)\n\n const timeouts: ReturnType<typeof setTimeout>[] = []\n cardRefs.current.forEach(({ cardIndex, ref }) => {\n if (cardIndex !== 1) {\n ref.classList.remove('animate-in')\n const t = setTimeout(() => ref.classList.add('animate-in'), 50)\n timeouts.push(t)\n }\n if (cardIndex === 1) {\n ref.classList.remove('scale-125')\n const t2 = setTimeout(() => {\n if (cardIndex === 1) ref.classList.add('scale-125')\n }, 100)\n timeouts.push(t2)\n }\n })\n return () => timeouts.forEach(clearTimeout)\n }, [activeIndex, getIndexes, items.length])\n\n const nextApp = () =>\n setActiveIndex((prev) => (prev + 1 === items.length ? 0 : prev + 1))\n\n const previousApp = () =>\n setActiveIndex((prev) => (prev - 1 === -1 ? items.length - 1 : prev - 1))\n\n return (\n <div className=\"flex items-center justify-center w-full h-full\">\n <div className=\"flex items-center gap-10\">\n <button\n type=\"button\"\n onClick={previousApp}\n aria-label=\"Previous\"\n className=\"cursor-pointer rounded-lg transition-all duration-300 hover:bg-ice-dark dark:hover:bg-independence rotate-180\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke={COLORS.PALETTE['prussian-blue']} strokeWidth={2} className=\"h-10 w-10 dark:stroke-white\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 5l7 7-7 7\" />\n </svg>\n </button>\n\n <div className=\"flex\">\n {indexPool.map((index, id) => {\n const item = items[index]\n if (!item) return null\n return id === 1 ? (\n <div\n key={id}\n ref={(ref) => {\n if (cardRefs.current.length < 3 && ref)\n cardRefs.current.push({ cardIndex: id, ref })\n }}\n className=\"transition-all duration-300 scale-125 z-10 shadow-2xl rounded-lg\"\n >\n <GridCard item={item} buttonText={buttonText} onOpen={onOpen} />\n </div>\n ) : (\n <div\n key={id}\n ref={(ref) => {\n if (cardRefs.current.length < 3 && ref)\n cardRefs.current.push({ cardIndex: id, ref })\n }}\n className=\"transition-all duration-300 shadow-2xl rounded-lg\"\n >\n <OpaqueGridCard item={item} isRight={id === 2} buttonText={buttonText} onOpen={onOpen} />\n </div>\n )\n })}\n </div>\n\n <button\n type=\"button\"\n onClick={nextApp}\n aria-label=\"Next\"\n className=\"cursor-pointer rounded-lg transition-all duration-300 hover:bg-ice-dark dark:hover:bg-independence\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke={COLORS.PALETTE['prussian-blue']} strokeWidth={2} className=\"h-10 w-10 dark:stroke-white\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 5l7 7-7 7\" />\n </svg>\n </button>\n </div>\n </div>\n )\n}\n","import React from 'react'\nimport CatalogGrid from './CatalogGrid'\nimport CatalogCarousel from './CatalogCarousel'\nimport { GridCardItem } from './GridCard'\n\nexport interface CatalogProps {\n /** 'grid' | 'carousel' */\n display?: 'grid' | 'carousel'\n items?: GridCardItem[]\n buttonText?: string\n onOpen?: (item: GridCardItem) => void\n}\n\n/**\n * Switches between grid and carousel layouts for a list of application tiles.\n *\n * @example\n * <Catalog display=\"carousel\" items={apps} onOpen={({ to }) => navigate(to!)} />\n */\nexport default function Catalog({ display = 'grid', items = [], buttonText, onOpen }: CatalogProps) {\n return (\n <div className=\"w-full h-full\">\n {display === 'grid' ? (\n <CatalogGrid items={items} buttonText={buttonText} onOpen={onOpen} />\n ) : (\n <CatalogCarousel items={items} buttonText={buttonText} onOpen={onOpen} />\n )}\n </div>\n )\n}\n","import React from 'react'\nimport * as ContextMenuPrimitive from '@radix-ui/react-context-menu'\n\n/**\n * A single action in the context menu.\n *\n * - Leaf items (no `children`) call `onClick` when activated.\n * - Parent items (with `children`) open a sub-menu on hover / arrow-right.\n * - `disabled` items render but cannot be activated; screen readers\n * announce them as disabled.\n */\nexport interface ContextMenuActionItem {\n key: React.Key\n /** Label shown for the item. May be plain text or a node. */\n value: React.ReactNode\n icon?: React.ReactNode\n /** Fires when the item is activated. Ignored when `children` is set. */\n onClick?: () => void\n /** Optional sub-menu items. */\n children?: ContextMenuActionItem[]\n /** Render as disabled — still visible but not activatable. */\n disabled?: boolean\n}\n\nexport interface ContextMenuProps {\n /** Top-level items. Each may carry nested `children` for sub-menus. */\n items: ContextMenuActionItem[]\n /**\n * The element that should respond to right-click. The entire React\n * subtree underneath becomes the trigger area. Wrap an existing\n * component / div / image — anything you can right-click on.\n */\n children: React.ReactNode\n}\n\n/**\n * Right-click context menu, built on `@radix-ui/react-context-menu`.\n *\n * **Idiomatic usage**: wrap the element that should respond to right-click.\n * Radix handles positioning (avoids viewport edges automatically), keyboard\n * navigation (↑↓ to move, → to open sub-menu, ← to close, Enter to activate,\n * Esc to dismiss), focus management, and portal-based stacking.\n *\n * @example Basic — flat menu\n * ```tsx\n * <ContextMenu\n * items={[\n * { key: 'edit', value: 'Edit', onClick: () => openEditor() },\n * { key: 'delete', value: 'Delete', onClick: () => askDelete() },\n * ]}\n * >\n * <Card vessel={vessel} />\n * </ContextMenu>\n * ```\n *\n * @example With sub-menu\n * ```tsx\n * <ContextMenu\n * items={[\n * {\n * key: 'export', value: 'Export',\n * children: [\n * { key: 'csv', value: 'as CSV', onClick: () => exportCsv() },\n * { key: 'xlsx', value: 'as Excel', onClick: () => exportXlsx() },\n * ],\n * },\n * ]}\n * >\n * <Table rows={rows} />\n * </ContextMenu>\n * ```\n */\nexport default function ContextMenu({ items, children }: ContextMenuProps) {\n return (\n <ContextMenuPrimitive.Root>\n <ContextMenuPrimitive.Trigger asChild>\n {children}\n </ContextMenuPrimitive.Trigger>\n\n <ContextMenuPrimitive.Portal>\n <ContextMenuPrimitive.Content\n className={CONTENT_CLASSNAME}\n collisionPadding={8}\n >\n {items.map((item) => renderItem(item))}\n </ContextMenuPrimitive.Content>\n </ContextMenuPrimitive.Portal>\n </ContextMenuPrimitive.Root>\n )\n}\n\n// ── Styling constants — keep markup readable ────────────────────────────────\n\nconst CONTENT_CLASSNAME = [\n // Surface — semantic tokens, both modes covered\n 'min-w-[180px] rounded-lg border border-border bg-surface shadow-lg',\n 'p-1 z-[500000] text-sm text-foreground',\n // Entry animation matches the Tooltip / Dropdown style\n 'animate-in fade-in-0 zoom-in-95',\n 'data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95',\n // Outline reset — Radix handles focus internally\n 'focus:outline-none',\n].join(' ')\n\nconst ITEM_CLASSNAME = [\n 'flex items-center justify-between gap-3 rounded-md px-2 py-1.5 cursor-pointer select-none',\n 'transition-colors duration-100',\n 'data-[highlighted]:bg-accent data-[highlighted]:text-accent-fg',\n 'data-[disabled]:opacity-40 data-[disabled]:cursor-not-allowed data-[disabled]:bg-transparent data-[disabled]:text-foreground-muted',\n 'focus:outline-none',\n].join(' ')\n\n// ── Item renderer — recursive for sub-menus ─────────────────────────────────\n\nfunction renderItem(item: ContextMenuActionItem) {\n if (item.children && item.children.length > 0) {\n // Sub-menu: Radix Sub + SubTrigger + SubContent\n return (\n <ContextMenuPrimitive.Sub key={item.key}>\n <ContextMenuPrimitive.SubTrigger\n disabled={item.disabled}\n className={ITEM_CLASSNAME}\n >\n <ContextMenuLabel icon={item.icon} value={item.value} />\n <ChevronRight />\n </ContextMenuPrimitive.SubTrigger>\n <ContextMenuPrimitive.Portal>\n <ContextMenuPrimitive.SubContent\n className={CONTENT_CLASSNAME}\n sideOffset={2}\n alignOffset={-4}\n collisionPadding={8}\n >\n {item.children.map((sub) => renderItem(sub))}\n </ContextMenuPrimitive.SubContent>\n </ContextMenuPrimitive.Portal>\n </ContextMenuPrimitive.Sub>\n )\n }\n\n return (\n <ContextMenuPrimitive.Item\n key={item.key}\n disabled={item.disabled}\n onSelect={() => item.onClick?.()}\n className={ITEM_CLASSNAME}\n >\n <ContextMenuLabel icon={item.icon} value={item.value} />\n </ContextMenuPrimitive.Item>\n )\n}\n\nfunction ContextMenuLabel({ icon, value }: { icon?: React.ReactNode; value: React.ReactNode }) {\n return (\n <span className=\"flex items-center gap-2 flex-1 min-w-0\">\n {icon && <span className=\"flex-shrink-0\">{icon}</span>}\n <span className=\"truncate\">{value}</span>\n </span>\n )\n}\n\nfunction ChevronRight() {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} className=\"h-4 w-4 flex-shrink-0\" aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 5l7 7-7 7\" />\n </svg>\n )\n}\n\n// ── Legacy type re-exports ──────────────────────────────────────────────────\n// `ContextMenuPosition` was part of the previous coordinate-based API. It\n// has no runtime equivalent in the Radix-based rewrite (positioning is\n// automatic), but is re-exported as a deprecated alias so older imports\n// keep compiling while consumers migrate.\n\n/** @deprecated The Radix rewrite positions the menu automatically — no coordinates needed. */\nexport interface ContextMenuPosition {\n x: number\n y: number\n}\n","import React, { useCallback, useEffect, useId, useLayoutEffect, useRef, useState } from 'react'\nimport { AnimatePresence, motion, useReducedMotion } from 'framer-motion'\nimport Button from '../inputs/Button'\nimport Portal from '../layout/Portal'\n\nexport interface WizardStep {\n /** Ref to the DOM element to highlight for this step. */\n stepRef: React.RefObject<HTMLElement | null>\n /** Tooltip body content. */\n description: React.ReactNode\n /**\n * Tooltip placement relative to the highlighted element.\n * - `'right'` (default) — to the right of the highlight\n * - `'left'` — to the left of the highlight\n * - `'top'` — above the highlight\n * - `'bottom'` — below the highlight\n */\n placement?: 'right' | 'left' | 'top' | 'bottom'\n /** Optional heading for the step's tooltip. */\n title?: React.ReactNode\n}\n\nexport interface WizardProps {\n /** The wrapped subtree — refs in `steps` point into this tree. */\n children: React.ReactNode\n /** Ordered list of steps to walk the user through. */\n steps: WizardStep[]\n /**\n * `localStorage` key used to remember dismissal. When the user clicks\n * \"Done\" (or \"Skip\" when dismissible), this key is set so the wizard\n * won't reopen on subsequent mounts.\n *\n * Pass `null` to disable persistence entirely (useful for tests or\n * tours that should always run).\n *\n * Default: `'oxygen.wizard.completed'`.\n */\n storageKey?: string | null\n /** Show a \"Skip tour\" button + Esc-to-dismiss. Default `true`. */\n dismissible?: boolean\n /** Called when the user reaches the final step's \"Done\" button. */\n onComplete?: () => void\n /** Called when the user skips (or presses Esc) before completing. */\n onSkip?: () => void\n}\n\n// ── Local-storage helpers (SSR-safe) ────────────────────────────────────────\n// The previous implementation called `localStorage.getItem(...)` at module-\n// effect time with no `typeof window` guard, crashing under SSR. These two\n// helpers route every access through a try/catch so server-side and\n// privacy-mode browsers (where localStorage throws) degrade silently.\n\nfunction readDismissed(key: string | null): boolean {\n if (key === null) return false\n if (typeof window === 'undefined') return false\n try {\n return window.localStorage.getItem(key) === 'true'\n } catch {\n return false\n }\n}\n\nfunction writeDismissed(key: string | null) {\n if (key === null) return\n if (typeof window === 'undefined') return\n try {\n window.localStorage.setItem(key, 'true')\n } catch {\n // Swallow — Safari private mode, quota exceeded, etc.\n }\n}\n\n// ── Bbox tracking — handles scroll + resize ────────────────────────────────\n\nfunction useTargetBbox(ref: React.RefObject<HTMLElement | null> | undefined) {\n const [bbox, setBbox] = useState<DOMRect | null>(null)\n\n useLayoutEffect(() => {\n const el = ref?.current\n if (!el) {\n setBbox(null)\n return\n }\n const update = () => setBbox(el.getBoundingClientRect())\n update()\n // Track viewport changes\n window.addEventListener('scroll', update, true)\n window.addEventListener('resize', update)\n // Track size changes on the target itself\n const ro = typeof ResizeObserver !== 'undefined' ? new ResizeObserver(update) : null\n ro?.observe(el)\n return () => {\n window.removeEventListener('scroll', update, true)\n window.removeEventListener('resize', update)\n ro?.disconnect()\n }\n }, [ref])\n\n return bbox\n}\n\n// ── Tooltip positioning ─────────────────────────────────────────────────────\n// Returns the absolute top/left of the tooltip for the given bbox + side.\n// `8 px` gap keeps the tooltip from touching the highlight.\n\nconst TOOLTIP_WIDTH = 280\nconst TOOLTIP_GAP = 12\n\nfunction tooltipStyleFor(bbox: DOMRect, placement: WizardStep['placement']): React.CSSProperties {\n const pl = placement ?? 'right'\n if (pl === 'right') return { left: bbox.right + TOOLTIP_GAP, top: bbox.top + bbox.height / 2, transform: 'translateY(-50%)', width: TOOLTIP_WIDTH }\n if (pl === 'left') return { left: bbox.left - TOOLTIP_WIDTH - TOOLTIP_GAP, top: bbox.top + bbox.height / 2, transform: 'translateY(-50%)', width: TOOLTIP_WIDTH }\n if (pl === 'bottom') return { left: bbox.left + bbox.width / 2, top: bbox.bottom + TOOLTIP_GAP, transform: 'translateX(-50%)', width: TOOLTIP_WIDTH }\n // top\n return { left: bbox.left + bbox.width / 2, top: bbox.top - TOOLTIP_GAP, transform: 'translate(-50%, -100%)', width: TOOLTIP_WIDTH }\n}\n\n// ── Focus trap — cycles Tab within the tooltip's focusable buttons ─────────\n\nfunction useFocusTrap(containerRef: React.RefObject<HTMLDivElement | null>, active: boolean) {\n useEffect(() => {\n if (!active) return\n const el = containerRef.current\n if (!el) return\n\n // Focus the primary action on mount so keyboard users land somewhere\n // sensible. setTimeout 0 lets layout settle first.\n const t = setTimeout(() => {\n const first = el.querySelector<HTMLElement>('button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])')\n first?.focus()\n }, 0)\n\n const onKey = (e: KeyboardEvent) => {\n if (e.key !== 'Tab') return\n const focusables = el.querySelectorAll<HTMLElement>(\n 'button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])'\n )\n if (focusables.length === 0) return\n const first = focusables[0]\n const last = focusables[focusables.length - 1]\n if (e.shiftKey && document.activeElement === first) {\n e.preventDefault()\n last.focus()\n } else if (!e.shiftKey && document.activeElement === last) {\n e.preventDefault()\n first.focus()\n }\n }\n document.addEventListener('keydown', onKey)\n return () => {\n clearTimeout(t)\n document.removeEventListener('keydown', onKey)\n }\n }, [containerRef, active])\n}\n\n/**\n * Guided-tour overlay that walks the user through a sequence of UI elements.\n *\n * Highlights each step's target element with an outlined \"spotlight\", shows a\n * tooltip with the description, and provides Prev / Next / Done navigation.\n * The wrapped tree is rendered unchanged; the overlay sits on top of it via a\n * portal so it always covers the real viewport regardless of where Wizard\n * lives in the React tree.\n *\n * **What's improved over the previous version**\n * - `localStorage` access is SSR-safe and try/catch-guarded (Safari private\n * mode, quota exceeded, no-storage browsers all degrade silently).\n * - No more `classList.add(...)` on consumer-owned DOM. The spotlight is a\n * portaled outline rectangle that tracks the target's bbox via\n * `ResizeObserver` + scroll/resize listeners. The consumer's DOM is never\n * mutated, so unmounting Wizard mid-tour leaves no orphan classes.\n * - Focus trap inside the tooltip — Tab and Shift+Tab cycle through the\n * tooltip's buttons. Esc dismisses (when `dismissible`).\n * - Backdrop blocks click-through on the rest of the page so the user can't\n * stumble into unrelated UI mid-tour. The highlighted target itself stays\n * click-blocked too (use the \"Next\" button to advance).\n * - Position recalculates on scroll / resize / target size changes via\n * `ResizeObserver`.\n * - All `dark-cornflower-blue` / `prussian-blue` / `bg-white` swapped for\n * semantic tokens — both light and dark modes work out of the box.\n *\n * @example\n * ```tsx\n * const dashRef = useRef<HTMLDivElement>(null)\n * const sidebarRef = useRef<HTMLElement>(null)\n *\n * <Wizard\n * steps={[\n * { stepRef: dashRef, title: 'Dashboard', description: 'Your fleet at a glance.' },\n * { stepRef: sidebarRef, title: 'Navigation', description: 'Jump between sections here.', placement: 'right' },\n * ]}\n * onComplete={() => track('onboarding_complete')}\n * >\n * <Layout dashRef={dashRef} sidebarRef={sidebarRef} />\n * </Wizard>\n * ```\n */\nexport default function Wizard({\n children,\n steps,\n storageKey = 'oxygen.wizard.completed',\n dismissible = true,\n onComplete,\n onSkip,\n}: WizardProps) {\n const tooltipRef = useRef<HTMLDivElement>(null)\n const tooltipTitleId = useId()\n const tooltipBodyId = useId()\n const reduced = useReducedMotion()\n\n // Open the wizard only when not previously dismissed and there is\n // actually at least one step.\n const [open, setOpen] = useState(() => steps.length > 0 && !readDismissed(storageKey))\n const [activeIndex, setActiveIndex] = useState(0)\n\n const step = steps[activeIndex]\n const bbox = useTargetBbox(step?.stepRef)\n\n useFocusTrap(tooltipRef, open)\n\n // Esc to dismiss (when allowed)\n useEffect(() => {\n if (!open || !dismissible) return\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault()\n handleSkip()\n }\n }\n document.addEventListener('keydown', onKey)\n return () => document.removeEventListener('keydown', onKey)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open, dismissible])\n\n const handleSkip = useCallback(() => {\n writeDismissed(storageKey)\n setOpen(false)\n onSkip?.()\n }, [storageKey, onSkip])\n\n const handleComplete = useCallback(() => {\n writeDismissed(storageKey)\n setOpen(false)\n onComplete?.()\n }, [storageKey, onComplete])\n\n const handleNext = () => {\n if (activeIndex < steps.length - 1) setActiveIndex((i) => i + 1)\n else handleComplete()\n }\n\n const handlePrev = () => {\n if (activeIndex > 0) setActiveIndex((i) => i - 1)\n }\n\n // The spotlight ring + click blocker get a small padding around the bbox\n // so they read as a halo, not as a tight outline.\n const SPOT_PAD = 6\n\n const highlightStyle: React.CSSProperties = bbox\n ? {\n left: bbox.left - SPOT_PAD,\n top: bbox.top - SPOT_PAD,\n width: bbox.width + SPOT_PAD * 2,\n height: bbox.height + SPOT_PAD * 2,\n }\n : { display: 'none' }\n\n // Four backdrop rectangles surrounding the target bbox — they share the\n // blur + tint, but leave the target area itself crystal clear. A\n // transparent fifth rect sits ON the target and blocks pointer events so\n // the user can't accidentally interact with the highlighted UI during\n // the tour (they advance via the tooltip buttons).\n const backdropTop: React.CSSProperties = bbox\n ? { left: 0, top: 0, right: 0, height: Math.max(0, bbox.top - SPOT_PAD) }\n : { display: 'none' }\n const backdropBottom: React.CSSProperties = bbox\n ? { left: 0, top: bbox.bottom + SPOT_PAD, right: 0, bottom: 0 }\n : { display: 'none' }\n const backdropLeft: React.CSSProperties = bbox\n ? {\n left: 0,\n top: bbox.top - SPOT_PAD,\n width: Math.max(0, bbox.left - SPOT_PAD),\n height: bbox.height + SPOT_PAD * 2,\n }\n : { display: 'none' }\n const backdropRight: React.CSSProperties = bbox\n ? {\n left: bbox.right + SPOT_PAD,\n top: bbox.top - SPOT_PAD,\n right: 0,\n height: bbox.height + SPOT_PAD * 2,\n }\n : { display: 'none' }\n\n const tooltipStyle = bbox ? tooltipStyleFor(bbox, step?.placement) : { display: 'none' }\n\n const isLast = activeIndex === steps.length - 1\n\n return (\n <>\n {children}\n\n <AnimatePresence>\n {open && step && (\n <Portal>\n {/* Backdrop is built from FOUR rectangles surrounding\n the target — the area inside the spotlight stays\n crystal clear (no blur, no tint). All four fade\n in/out together. */}\n {(['top', 'bottom', 'left', 'right'] as const).map((side) => (\n <motion.div\n key={side}\n className=\"fixed z-[7000000] bg-foreground/40 backdrop-blur-[2px] pointer-events-auto\"\n style={\n side === 'top' ? backdropTop :\n side === 'bottom' ? backdropBottom :\n side === 'left' ? backdropLeft :\n backdropRight\n }\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: reduced ? 0 : 0.18, ease: 'easeOut' }}\n aria-hidden=\"true\"\n />\n ))}\n\n {/* Transparent click blocker over the target — keeps\n the highlight visually untouched but stops the user\n from accidentally interacting with the spotlit UI\n mid-tour. */}\n <motion.div\n className=\"fixed z-[7000001] pointer-events-auto\"\n style={highlightStyle}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: reduced ? 0 : 0.18, ease: 'easeOut' }}\n aria-hidden=\"true\"\n />\n\n {/* Spotlight outline ring drawn on top of the blocker. */}\n <motion.div\n className=\"fixed z-[7000002] pointer-events-none rounded-md ring-2 ring-accent\"\n style={highlightStyle}\n initial={{ opacity: 0, scale: 1.08 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 1.08 }}\n transition={{\n duration: reduced ? 0 : 0.32,\n ease: [0.16, 1, 0.3, 1], // ease-out-expo — settles softly\n }}\n aria-hidden=\"true\"\n />\n\n {/* Tooltip cross-fades + slides between steps. The\n `key={activeIndex}` makes AnimatePresence treat each\n step as a separate mount, triggering enter/exit on\n navigation. Focus-trapped + Esc-dismissible. */}\n <motion.div\n key={activeIndex}\n ref={tooltipRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={step.title ? tooltipTitleId : undefined}\n aria-describedby={tooltipBodyId}\n className=\"fixed z-[7000003] rounded-lg bg-surface text-foreground border border-border shadow-xl p-4 pointer-events-auto\"\n style={tooltipStyle}\n initial={{ opacity: 0, scale: 0.96, y: 6 }}\n animate={{ opacity: 1, scale: 1, y: 0 }}\n exit={{ opacity: 0, scale: 0.97, y: 4 }}\n transition={\n reduced\n ? { duration: 0 }\n : {\n opacity: { duration: 0.18 },\n scale: { type: 'tween', duration: 0.26, ease: [0.16, 1, 0.3, 1] },\n y: { type: 'tween', duration: 0.26, ease: [0.16, 1, 0.3, 1] },\n }\n }\n >\n {step.title && (\n <h3 id={tooltipTitleId} className=\"text-sm font-semibold text-foreground mb-1\">\n {step.title}\n </h3>\n )}\n <div id={tooltipBodyId} className=\"text-sm text-foreground-secondary leading-relaxed\">\n {step.description}\n </div>\n\n <div className=\"mt-4 flex items-center justify-between\">\n {/* Step indicator */}\n <span className=\"text-xs text-foreground-muted tabular-nums\">\n {activeIndex + 1} / {steps.length}\n </span>\n\n <div className=\"flex items-center gap-2\">\n {dismissible && !isLast && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n content=\"Skip\"\n onClick={handleSkip}\n />\n )}\n {activeIndex > 0 && (\n <Button\n variant=\"secondary\"\n size=\"sm\"\n content=\"Back\"\n onClick={handlePrev}\n />\n )}\n <Button\n size=\"sm\"\n content={isLast ? 'Done' : 'Next'}\n onClick={handleNext}\n />\n </div>\n </div>\n </motion.div>\n </Portal>\n )}\n </AnimatePresence>\n </>\n )\n}\n","import React from 'react'\n\nexport interface SearchInputProps {\n value?: string\n onChange?: React.ChangeEventHandler<HTMLInputElement>\n disabled?: boolean\n label?: React.ReactNode\n htmlFor?: string\n placeholder?: string\n name?: string\n inputStyle?: React.CSSProperties\n style?: React.CSSProperties\n /** Label/input orientation. Defaults to `'vertical'`. */\n layout?: 'horizontal' | 'vertical'\n}\n\n/**\n * Search text field with a magnifier icon on the right.\n */\nconst SearchInput = React.forwardRef<HTMLInputElement, SearchInputProps>(function SearchInput(\n {\n value,\n onChange,\n disabled,\n label,\n htmlFor,\n placeholder,\n name,\n inputStyle,\n style,\n layout = 'vertical',\n },\n ref\n) {\n return (\n <div className=\"relative flex flex-col items-center justify-center\">\n <div\n className={`flex ${layout === 'vertical' ? 'flex-col' : 'flex-row items-center gap-2'}`}\n style={style ?? {}}\n >\n {label && (\n <label className=\"text-sm font-medium ml-1 max-content text-foreground\" htmlFor={htmlFor}>\n {label}\n </label>\n )}\n <div className=\"bg-surface text-foreground flex items-center gap-1 rounded-lg border border-border pr-2 focus-within:border-transparent focus-within:ring-2 focus-within:ring-accent transition-colors\">\n <input\n ref={ref}\n disabled={disabled}\n value={value}\n onChange={onChange}\n // `type=\"search\"` gives consumers the native clear button\n // and an Enter-friendly virtual keyboard hint on mobile.\n type=\"search\"\n enterKeyHint=\"search\"\n name={name}\n id={htmlFor}\n className=\"bg-transparent focus:outline-none pl-2 h-9 w-56 rounded-lg disabled:cursor-not-allowed\"\n style={inputStyle ?? {}}\n placeholder={placeholder ?? ''}\n />\n {/* Search icon — uses currentColor so it follows the input text */}\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"w-5 h-5 text-foreground-muted\" aria-hidden=\"true\">\n <path fillRule=\"evenodd\" d=\"M10.5 3.75a6.75 6.75 0 100 13.5 6.75 6.75 0 000-13.5zM2.25 10.5a8.25 8.25 0 1114.59 5.28l4.69 4.69a.75.75 0 11-1.06 1.06l-4.69-4.69A8.25 8.25 0 012.25 10.5z\" clipRule=\"evenodd\" />\n </svg>\n </div>\n </div>\n </div>\n )\n})\n\nexport default SearchInput\n","import type { ReactNode } from 'react'\n\nexport interface DropdownPillProps {\n value?: ReactNode\n hasSiblings?: boolean\n}\n\n/**\n * Pill chip used inside Dropdown to display selected values.\n */\nexport default function DropdownPill({ value, hasSiblings = false }: DropdownPillProps) {\n return (\n <div\n className={`bg-accent text-accent-fg text-sm text-ellipsis ${hasSiblings ? 'w-24' : 'w-max'} p-1 px-2 rounded-lg whitespace-nowrap overflow-hidden`}\n >\n {value}\n </div>\n )\n}\n","import React, { useEffect, useId, useState } from 'react'\nimport * as Popover from '@radix-ui/react-popover'\nimport SearchInput from './SearchInput'\nimport DropdownPill from './DropdownPill'\n\nexport interface DropdownItem {\n key: string | number\n label: React.ReactNode\n icon?: React.ReactNode\n}\n\n/**\n * Item key type — DOM-friendly subset of `React.Key` (no bigint, since UI\n * keys are always strings or numbers in practice).\n */\nexport type DropdownKey = string | number\n\n/**\n * Selected value(s). In single-select mode this is a single key matching\n * one of the items. In multi-select mode it is an array of keys.\n */\nexport type DropdownValue = DropdownKey | DropdownKey[]\n\nexport interface DropdownProps {\n isMultiselect?: boolean\n hasSearch?: boolean\n label?: React.ReactNode\n name?: string\n value?: DropdownValue\n onChange?: (e: { target: { value: DropdownValue; id?: string; name?: string } }) => void\n onBlur?: React.FocusEventHandler\n disabled?: boolean\n /** Label/input orientation. Defaults to `'vertical'`. */\n layout?: 'horizontal' | 'vertical'\n /**\n * Show a \"+N more\" pill alongside the first selected item in multiselect\n * mode. Defaults to `false` — a single pill is shown with the first\n * selection and consumers typically open the dropdown to see the rest.\n * Set `true` if you want the count visible on the trigger.\n */\n showSelectedCount?: boolean\n errorMessage?: React.ReactNode\n style?: React.CSSProperties\n htmlFor?: string\n items?: DropdownItem[]\n labelStyle?: React.CSSProperties\n placeholder?: string\n}\n\n/**\n * Select / multi-select dropdown powered by Radix Popover.\n *\n * Radix handles focus-trap within the popover, keyboard dismiss (Escape),\n * and correct portal-based z-index stacking.\n *\n * Emits `{ target: { value, id, name } }` for form-compatibility.\n *\n * @example\n * // Single-select\n * <Dropdown label=\"Vessel\" items={vessels} value={form.vessel} onChange={handleChange} htmlFor=\"vessel\" />\n *\n * // Multi-select\n * <Dropdown isMultiselect label=\"Fuels\" items={fuels} value={form.fuels} onChange={handleChange} />\n */\nexport default function Dropdown({\n isMultiselect = false,\n hasSearch = true,\n label,\n name,\n value,\n onChange,\n disabled,\n layout = 'horizontal',\n errorMessage,\n style = {},\n htmlFor,\n items = [],\n labelStyle = {},\n placeholder,\n showSelectedCount = false,\n}: DropdownProps) {\n const [open, setOpen] = useState(false)\n const [selectedItems, setSelectedItems] = useState<(string | number)[]>([])\n const [searchTerm, setSearchTerm] = useState('')\n const [innerItems, setInnerItems] = useState<DropdownItem[]>([])\n // Stable id for the error region so the combobox can point at it via\n // aria-describedby when validation fails.\n const errorId = useId()\n const hasError = errorMessage != null\n\n useEffect(() => {\n setInnerItems(items)\n }, [items])\n\n useEffect(() => {\n if (isMultiselect && Array.isArray(value)) {\n setSelectedItems(value)\n }\n }, [isMultiselect, value])\n\n const selectItem = (key: string | number) => {\n if (isMultiselect) {\n const next = selectedItems.includes(key)\n ? selectedItems.filter((it) => it !== key)\n : [...selectedItems, key]\n setSelectedItems(next)\n onChange?.({ target: { value: next, id: htmlFor, name } })\n } else {\n setSelectedItems([key])\n onChange?.({ target: { value: key, id: htmlFor, name } })\n setOpen(false)\n }\n }\n\n const onSearchChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const term = e.target.value\n setSearchTerm(term)\n setInnerItems(\n term.trim() === ''\n ? items\n : items.filter((it) =>\n String(it.label).toLowerCase().includes(term.toLowerCase())\n )\n )\n }\n\n const isSelected = (key: string | number) =>\n Array.isArray(value) ? value.includes(key) : value === key\n\n return (\n <div className=\"mt-2\">\n <div\n className={`flex ${layout === 'vertical' ? 'flex-col' : 'flex-row items-center gap-2'}`}\n >\n {label && (\n <label\n className=\"text-sm font-medium ml-1 max-content select-none text-foreground\"\n htmlFor={htmlFor}\n style={labelStyle}\n >\n {label}\n </label>\n )}\n\n <Popover.Root open={open && !disabled} onOpenChange={(o) => !disabled && setOpen(o)}>\n <Popover.Trigger asChild>\n <div\n id={htmlFor}\n role=\"combobox\"\n aria-expanded={open}\n aria-haspopup=\"listbox\"\n aria-invalid={hasError || undefined}\n aria-describedby={hasError ? errorId : undefined}\n style={style}\n className={`flex items-center justify-between relative h-9 rounded-lg border border-border cursor-pointer select-none focus:outline-none focus-visible:border-transparent focus-visible:ring-2 focus-visible:ring-accent ${disabled ? 'cursor-not-allowed bg-surface-raised text-foreground-muted' : 'bg-surface text-foreground'} ${hasError ? 'border-status-error' : ''}`}\n tabIndex={disabled ? -1 : 0}\n onKeyDown={(e) => {\n if (disabled) return\n // Open on Enter, Space, ArrowDown, ArrowUp — the\n // canonical combobox activation keys per WAI-ARIA.\n if (e.key === 'Enter' || e.key === ' ' || e.key === 'ArrowDown' || e.key === 'ArrowUp') {\n e.preventDefault()\n setOpen(true)\n }\n }}\n >\n {/* Selected value(s) */}\n <div\n className={`h-7 pl-2 ${!style?.width ? 'min-w-[240px]' : ''} flex items-center gap-1 overflow-hidden`}\n >\n {!value || (Array.isArray(value) && value.length === 0) ? (\n <span className=\"text-foreground-muted text-sm\">{placeholder}</span>\n ) : Array.isArray(value) ? (\n <>\n {value.slice(0, 1).map((val) => (\n <DropdownPill\n key={String(val)}\n hasSiblings={value.length > 1}\n value={innerItems.find((it) => it.key === val)?.label}\n />\n ))}\n {showSelectedCount && value.length > 1 && (\n <DropdownPill value={`+${value.length - 1} more`} />\n )}\n </>\n ) : (\n <DropdownPill value={innerItems.find((it) => it.key === value)?.label} />\n )}\n </div>\n\n {/* Chevron — currentColor follows trigger text */}\n <div className={`transition-transform duration-200 mr-2 ${open ? 'rotate-180' : 'rotate-0'}`} aria-hidden=\"true\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} className=\"h-4 w-4\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n </div>\n </div>\n </Popover.Trigger>\n\n <Popover.Portal>\n <Popover.Content\n align=\"start\"\n sideOffset={4}\n style={{ width: style?.width || 240 }}\n className=\"bg-surface text-foreground border border-border rounded-lg shadow-md z-50 p-2 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\"\n onInteractOutside={() => setOpen(false)}\n >\n {hasSearch && (\n <div className=\"mb-2\">\n <SearchInput\n style={{ width: '100%' }}\n inputStyle={{ width: '100%' }}\n value={searchTerm}\n onChange={onSearchChange}\n placeholder=\"Search...\"\n />\n </div>\n )}\n <div role=\"listbox\" aria-multiselectable={isMultiselect} className=\"max-h-40 overflow-y-auto\">\n {innerItems.map((item) => (\n // aria-rowindex was previously set here but\n // it's invalid ARIA on role=\"option\" (it\n // belongs on rows of a grid/treegrid). Dropped.\n // tabIndex={0} + Enter/Space handler makes the\n // option keyboard-activatable; the full\n // combobox roving-tabindex pattern is deferred\n // until the planned Phase-5 rewrite.\n <div\n key={item.key}\n role=\"option\"\n aria-selected={isSelected(item.key)}\n tabIndex={0}\n className={`flex items-center justify-between p-2 hover:bg-accent hover:text-accent-fg transition-colors duration-150 text-sm rounded-lg cursor-pointer focus:outline-none focus-visible:ring-2 focus-visible:ring-accent ${\n selectedItems.includes(item.key) ? 'bg-surface-raised text-foreground' : 'text-foreground'\n }`}\n onClick={() => selectItem(item.key)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n selectItem(item.key)\n }\n }}\n >\n <div className=\"flex items-center gap-2 text-xs\">\n {item.icon && <div>{item.icon}</div>}\n {item.label}\n </div>\n {isSelected(item.key) && (\n // currentColor — checkmark follows\n // the item's text colour, which\n // flips automatically on hover.\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M4 10l4.5 4.5L16 6\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </div>\n ))}\n </div>\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n </div>\n {hasError && (\n <div id={errorId} className=\"text-status-error text-xs mt-1\">\n {errorMessage}\n </div>\n )}\n </div>\n )\n}\n","import React from 'react'\n\n/** ─────────────────── base ─────────────────── */\n\ninterface SkeletonBaseProps {\n className?: string\n /** Override inline styles */\n style?: React.CSSProperties\n}\n\n// Shared shimmer classes — a semi-transparent sheen sweeps across the\n// surface-raised base via a `::before` pseudo-element.\n//\n// Previously the shimmer used `bg-gradient-to-r from-border via-border-strong/40 to-border`\n// — Tailwind's `/40` opacity modifier does not produce a valid colour when the\n// underlying token is a hex-valued CSS var (the case for all our semantic\n// tokens), so the gradient resolved to a flat single colour and no movement\n// was visible. The pseudo-element approach uses `white/30` which Tailwind\n// handles correctly (white is a hex literal in the palette), and transforms\n// instead of background-position so it composites on the GPU.\nconst SHIMMER = [\n 'relative overflow-hidden rounded-sm bg-surface-raised',\n 'before:absolute before:inset-0 before:content-[\"\"]',\n 'before:bg-gradient-to-r before:from-transparent before:via-white/30 before:to-transparent',\n 'before:animate-[shimmer_1.6s_linear_infinite]',\n // Respect prefers-reduced-motion — the resting bg-surface-raised is still\n // a perfectly legible placeholder for users who have animations off.\n 'motion-reduce:before:hidden',\n].join(' ')\n\n/** ─────────────────── SkeletonBox ─────────────────── */\n\nexport interface SkeletonBoxProps extends SkeletonBaseProps {\n width?: number | string\n height?: number | string\n /** Override border-radius (defaults to token --radius-md) */\n radius?: number | string\n}\n\n/**\n * Generic rectangular loading placeholder.\n * Use for images, cards, headers, or any block element.\n *\n * @example\n * <SkeletonBox width={240} height={160} />\n * <SkeletonBox width=\"100%\" height={48} radius=\"var(--radius-lg)\" />\n */\nexport function SkeletonBox({ width, height = 16, radius, className = '', style }: SkeletonBoxProps) {\n return (\n <span\n role=\"presentation\"\n aria-hidden=\"true\"\n className={`block ${SHIMMER} ${className}`}\n style={{\n width: width ?? '100%',\n height,\n borderRadius: radius ?? 'var(--radius-md)',\n ...style,\n }}\n />\n )\n}\n\n/** ─────────────────── SkeletonText ─────────────────── */\n\nexport interface SkeletonTextProps extends SkeletonBaseProps {\n /** Number of lines (default 3) */\n lines?: number\n /** Width of the last (shortest) line as a percentage (default 60) */\n lastLineWidth?: number\n /** Line height in px (default 14) */\n lineHeight?: number\n /** Gap between lines in px (default 8) */\n gap?: number\n}\n\n/**\n * Multi-line text loading placeholder.\n * Last line is shorter to mimic real paragraph layout.\n *\n * @example\n * <SkeletonText lines={4} lastLineWidth={45} />\n */\nexport function SkeletonText({\n lines = 3,\n lastLineWidth = 60,\n lineHeight = 14,\n gap = 8,\n className = '',\n style,\n}: SkeletonTextProps) {\n return (\n <div\n role=\"presentation\"\n aria-hidden=\"true\"\n className={`flex flex-col ${className}`}\n style={{ gap, ...style }}\n >\n {Array.from({ length: lines }).map((_, i) => {\n const isLast = i === lines - 1\n const width = isLast && lines > 1 ? `${lastLineWidth}%` : '100%'\n return (\n <span\n key={i}\n className={`block ${SHIMMER}`}\n style={{ height: lineHeight, width, borderRadius: 'var(--radius-sm)' }}\n />\n )\n })}\n </div>\n )\n}\n\n/** ─────────────────── SkeletonCircle ─────────────────── */\n\nexport interface SkeletonCircleProps extends SkeletonBaseProps {\n /** Diameter in px (default 40) */\n size?: number\n}\n\n/**\n * Circular loading placeholder — avatars, icons, status indicators.\n *\n * @example\n * <SkeletonCircle size={48} />\n */\nexport function SkeletonCircle({ size = 40, className = '', style }: SkeletonCircleProps) {\n return (\n <span\n role=\"presentation\"\n aria-hidden=\"true\"\n className={`block flex-shrink-0 ${SHIMMER} ${className}`}\n style={{\n width: size,\n height: size,\n borderRadius: '50%',\n ...style,\n }}\n />\n )\n}\n\n/** ─────────────────── SkeletonCard ─────────────────── */\n\nexport interface SkeletonCardProps extends SkeletonBaseProps {\n /** Include a circular avatar in the header (default true) */\n hasAvatar?: boolean\n /** Number of text lines in the body (default 3) */\n lines?: number\n}\n\n/**\n * Composite card skeleton — avatar + heading + body text + action strip.\n * Use as a drop-in while real card data loads.\n *\n * @example\n * <div className=\"grid grid-cols-3 gap-4\">\n * {loading && Array.from({ length: 3 }).map((_, i) => <SkeletonCard key={i} />)}\n * </div>\n */\nexport function SkeletonCard({ hasAvatar = true, lines = 3, className = '', style }: SkeletonCardProps) {\n return (\n <div\n role=\"presentation\"\n aria-hidden=\"true\"\n className={`rounded-lg border border-border bg-surface p-4 ${className}`}\n style={style}\n >\n {/* Header row */}\n <div className=\"flex items-center gap-3 mb-4\">\n {hasAvatar && <SkeletonCircle size={36} />}\n <div className=\"flex-1 flex flex-col gap-2\">\n <SkeletonBox height={12} width=\"55%\" />\n <SkeletonBox height={10} width=\"35%\" />\n </div>\n </div>\n\n {/* Body text */}\n <SkeletonText lines={lines} lastLineWidth={55} />\n\n {/* Action strip */}\n <div className=\"mt-4 flex gap-2\">\n <SkeletonBox height={28} width={72} />\n <SkeletonBox height={28} width={56} />\n </div>\n </div>\n )\n}\n","import React, { useEffect, useMemo, useRef, useState } from 'react'\nimport SearchInput from '../inputs/SearchInput'\nimport Dropdown from '../inputs/Dropdown'\nimport IconButton from './IconButton'\nimport { SkeletonBox } from './Skeleton'\n\n/** ─────────────────── types ─────────────────── */\n\n/**\n * Column descriptor for the Table.\n *\n * The generic `T` is the shape of a row — `keyBind` must be one of T's\n * string-keyed properties, and `component(cellValue, row)` receives the\n * matching value with full type inference. When used without a generic\n * (`TableColumn[]`), `T` falls back to `Record<string, any>` for backwards\n * compatibility — narrower typing is preferred whenever possible:\n *\n * ```ts\n * type Vessel = { id: number; name: string; status: 'At Sea' | 'In Port' }\n * const cols: TableColumn<Vessel>[] = [\n * { key: 'name', label: 'Name', keyBind: 'name' }, // cellValue inferred as string\n * ]\n * ```\n */\nexport interface TableColumn<T extends Record<string, any> = Record<string, any>> {\n /** React reconciliation key for the column itself. */\n key: React.Key\n label: React.ReactNode\n /** Property on the row to read for this column. */\n keyBind: keyof T & string\n /** Custom cell renderer. Receives the cell value and the full row. */\n component?: (cellValue: T[keyof T], row: T) => React.ReactNode\n /** Explicit column width (CSS length or px number). Optional — defaults to auto. */\n width?: string | number\n /** Text alignment for both header and cells. Defaults to `'center'`. */\n align?: 'left' | 'center' | 'right'\n}\n\nexport interface PaginationOptions {\n enabled?: boolean\n perPage?: number\n withPicker?: boolean\n serverSide?: boolean\n /** Server-side: current 1-based page number */\n page?: number\n /** Server-side: total page count */\n maxPage?: number\n /** Server-side: total row count (used to calculate maxPage) */\n totalCount?: number\n pickerOptions?: Array<{ key: number; value: number; label: number }>\n onPageChange?: (page: number) => void\n onPerPageChange?: (perPage: number) => void\n}\n\nexport interface ExpandRowOptions<T extends Record<string, any> = Record<string, any>> {\n enabled?: boolean\n expandIcon?: React.ReactNode\n expandComponent?: (row: T) => React.ReactNode\n}\n\nexport interface TableProps<T extends Record<string, any> = Record<string, any>> {\n columns?: TableColumn<T>[]\n rows?: T[]\n /**\n * Returns a stable key for each row, used for React reconciliation AND\n * for tracking expanded state when `expandRow.enabled` is true.\n * Defaults to the row index — fine for static lists, but pass an\n * explicit getter (e.g. `(row) => row.id`) if rows can be reordered or\n * filtered while expand state should persist.\n */\n getRowKey?: (row: T, index: number) => React.Key\n pagination?: PaginationOptions\n expandRow?: ExpandRowOptions<T>\n hasSearch?: boolean\n footer?: React.ReactNode\n header?: React.ReactNode\n /**\n * When `true`, the body renders skeleton rows (one per column with the\n * shared shimmer animation) instead of data. Use during initial data\n * fetch, server-side pagination transitions, or any time the dataset is\n * not yet ready. Combine with `pagination.serverSide` for the canonical\n * \"loading next page\" pattern.\n */\n loading?: boolean\n /** Number of skeleton rows to render when `loading` is true. Default `8`. */\n loadingRowCount?: number\n}\n\n/** ─────────────────── defaults ─────────────────── */\nconst DEFAULT_PICKER: PaginationOptions['pickerOptions'] = [\n { key: 1, value: 5, label: 5 },\n { key: 2, value: 10, label: 10 },\n { key: 3, value: 15, label: 15 },\n { key: 4, value: 20, label: 20 },\n]\n\nconst DEFAULT_PAGINATION: PaginationOptions = {\n enabled: true,\n perPage: 15,\n withPicker: true,\n pickerOptions: DEFAULT_PICKER,\n}\n\nconst DEFAULT_EXPAND: ExpandRowOptions = {\n enabled: false,\n}\n\n/** ─────────────────── helpers ─────────────────── */\n\nfunction createDatasets<T>(rows: T[], perPage: number | null): T[][] {\n if (!perPage) return [rows.slice()]\n const all: T[][] = []\n for (let i = 0; i < rows.length; i += perPage) {\n all.push(rows.slice(i, i + perPage))\n }\n return all\n}\n\n/**\n * Default row-key strategy — index-based. Stable across renders for static\n * lists; pass an explicit `getRowKey` for any list that mutates.\n */\nconst defaultGetRowKey = (_row: unknown, index: number): React.Key => index\n\nconst cellAlign = (align: TableColumn['align']) =>\n align === 'left' ? 'text-left' : align === 'right' ? 'text-right' : 'text-center'\n\n/** ─────────────────── sub-components ─────────────────── */\n\nfunction TableHeader<T extends Record<string, any>>({\n columns,\n hasExpand,\n}: {\n columns: TableColumn<T>[]\n hasExpand: boolean\n}) {\n return (\n <thead className=\"bg-surface-raised border-b border-border\">\n <tr>\n {hasExpand && <th aria-hidden=\"true\" className=\"w-9\" />}\n {columns.map((col) => (\n <th\n key={col.key}\n scope=\"col\"\n className={`${cellAlign(col.align)} text-sm font-semibold text-foreground py-3 px-3`}\n style={col.width != null ? { width: col.width } : undefined}\n >\n {col.label}\n </th>\n ))}\n </tr>\n </thead>\n )\n}\n\nconst DefaultExpandIcon = (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className=\"w-5 h-5 text-foreground-muted\"\n aria-hidden=\"true\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M12 2.25c-5.385 0-9.75 4.365-9.75 9.75s4.365 9.75 9.75 9.75 9.75-4.365 9.75-9.75S17.385 2.25 12 2.25zM12.75 9a.75.75 0 00-1.5 0v2.25H9a.75.75 0 000 1.5h2.25V15a.75.75 0 001.5 0v-2.25H15a.75.75 0 000-1.5h-2.25V9z\"\n clipRule=\"evenodd\"\n />\n </svg>\n)\n\nfunction TableBody<T extends Record<string, any>>({\n columns,\n rows,\n expandRow,\n getRowKey,\n}: {\n columns: TableColumn<T>[]\n rows: T[]\n expandRow: ExpandRowOptions<T>\n getRowKey: (row: T, index: number) => React.Key\n}) {\n // Expand state is keyed by the row's stable key — survives reorder/filter\n // as long as `getRowKey` returns the same value for the same row.\n const [expanded, setExpanded] = useState<Set<React.Key>>(() => new Set())\n\n const toggleRow = (rowKey: React.Key) => {\n setExpanded((prev) => {\n const next = new Set(prev)\n if (next.has(rowKey)) next.delete(rowKey)\n else next.add(rowKey)\n return next\n })\n }\n\n const hasExpand = !!expandRow.enabled\n const expandColCount = columns.length + (hasExpand ? 1 : 0)\n\n return (\n <tbody>\n {rows.map((row, i) => {\n const rowKey = getRowKey(row, i)\n const isExpanded = expanded.has(rowKey)\n return (\n <React.Fragment key={rowKey}>\n <tr\n className={`border-b border-border hover:bg-surface-raised transition-colors duration-150 ${\n i % 2 === 0 ? 'bg-surface' : 'bg-surface-raised'\n }`}\n >\n {hasExpand && (\n <td className=\"p-0 align-middle w-9\">\n <button\n type=\"button\"\n onClick={() => toggleRow(rowKey)}\n aria-expanded={isExpanded}\n aria-label={isExpanded ? 'Collapse row' : 'Expand row'}\n className={`w-9 h-9 inline-flex items-center justify-center rounded-md hover:bg-surface/80 transition-transform duration-200 focus:outline-none focus-visible:ring-2 focus-visible:ring-accent ${\n isExpanded ? 'rotate-180' : ''\n }`}\n >\n {expandRow.expandIcon ?? DefaultExpandIcon}\n </button>\n </td>\n )}\n {columns.map((col) => (\n <td\n key={col.key}\n className={`${cellAlign(col.align)} text-sm text-foreground py-2 px-3 align-middle`}\n >\n {col.component\n ? col.component(row[col.keyBind] as T[keyof T], row)\n : (row[col.keyBind] as React.ReactNode)}\n </td>\n ))}\n </tr>\n\n {hasExpand && isExpanded && (\n <tr className=\"bg-surface\">\n <td colSpan={expandColCount} className=\"p-0 border-b border-border\">\n <div className=\"p-3\">{expandRow.expandComponent?.(row)}</div>\n </td>\n </tr>\n )}\n </React.Fragment>\n )\n })}\n </tbody>\n )\n}\n\nfunction Pagination({\n activePage,\n onPageChange,\n maxPage,\n options,\n onPerPageChange,\n serverSide = false,\n}: {\n activePage: number\n onPageChange: (page: number) => void\n maxPage: number\n options: PaginationOptions\n onPerPageChange: (perPage: number) => void\n serverSide?: boolean\n}) {\n const picker = options.pickerOptions ?? DEFAULT_PICKER\n const matchedOption = picker.find(\n (o) => o.label === options.perPage || o.value === options.perPage\n )\n const [perPageKey, setPerPageKey] = useState(() => matchedOption?.key ?? picker[0]?.key)\n const displayPerPageKey = serverSide ? matchedOption?.key ?? perPageKey : perPageKey\n\n useEffect(() => {\n if (serverSide && options.perPage != null) {\n const next = picker.find((o) => o.label === options.perPage || o.value === options.perPage)\n if (next) setPerPageKey(next.key)\n }\n }, [serverSide, options.perPage, picker])\n\n const navBtn = (icon: React.ReactNode, disabled: boolean, onClick: () => void) => (\n <IconButton disabled={disabled} onClick={onClick} icon={icon} />\n )\n\n const chevronRight = (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} className=\"h-5 w-5\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 5l7 7-7 7\" />\n </svg>\n )\n\n const doubleChevronRight = (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} className=\"h-5 w-5\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M13 5l7 7-7 7M5 5l7 7-7 7\" />\n </svg>\n )\n\n return (\n <div className=\"flex gap-2 items-center justify-end pt-2\">\n {navBtn(\n <span className=\"rotate-180 inline-flex\">{doubleChevronRight}</span>,\n activePage === 0,\n () => onPageChange(0)\n )}\n {navBtn(\n <span className=\"rotate-180 inline-flex\">{chevronRight}</span>,\n activePage === 0,\n () => activePage > 0 && onPageChange(activePage - 1)\n )}\n <span className=\"bg-surface-raised rounded-lg ml-2 mr-2 shadow-sm p-2 w-10 text-center select-none text-foreground\">\n {activePage + 1}\n </span>\n {navBtn(\n chevronRight,\n activePage === maxPage,\n () => activePage < maxPage && onPageChange(activePage + 1)\n )}\n {navBtn(\n doubleChevronRight,\n activePage === maxPage,\n () => onPageChange(maxPage)\n )}\n {options.withPicker && (\n <Dropdown\n style={{ width: 80, position: 'relative', bottom: 4 }}\n hasSearch={false}\n items={picker}\n isMultiselect={false}\n value={displayPerPageKey}\n onChange={({ target: { value } }) => {\n // Pagination is single-select; ignore array values that\n // could come through from a multi-select Dropdown.\n if (Array.isArray(value)) return\n const numKey = typeof value === 'number' ? value : Number(value)\n if (!serverSide) setPerPageKey(numKey)\n const opt = picker.find((o) => o.key === numKey)\n onPerPageChange(opt?.label ?? opt?.value ?? numKey)\n }}\n />\n )}\n </div>\n )\n}\n\n/** ─────────────────── main component ─────────────────── */\n\n/**\n * Data table with optional search, pagination, and expandable rows.\n *\n * - **Typed rows**: pass a generic `T` for full type inference on columns\n * and cell renderers (`<Table<Vessel> ... />`).\n * - **Real `<table>` semantics**: keeps row / col / cell context intact for\n * screen readers and lets the browser handle column sizing natively.\n * Per-column widths via `column.width`.\n * - **Search**: client-side filter across ALL row values; result is\n * memoized so each keystroke costs O(n) once per term change, not per\n * render. Set `pagination.serverSide` to skip client-side filter and\n * pagination entirely.\n * - **Expand**: each row gets a real `<button>` with `aria-expanded`.\n * Expand state is keyed by `getRowKey(row, i)` so it survives reorders.\n *\n * @example Static, fully typed\n * ```tsx\n * type Vessel = { id: number; name: string; status: string }\n * <Table<Vessel>\n * columns={[\n * { key: 'name', label: 'Name', keyBind: 'name' },\n * { key: 'status', label: 'Status', keyBind: 'status', width: 120 },\n * ]}\n * rows={vessels}\n * getRowKey={(row) => row.id}\n * />\n * ```\n *\n * @example Server-side pagination\n * ```tsx\n * <Table\n * columns={cols}\n * rows={pageRows}\n * pagination={{\n * enabled: true, serverSide: true, perPage: 20,\n * page: currentPage, totalCount, onPageChange, onPerPageChange,\n * }}\n * />\n * ```\n */\nexport default function Table<T extends Record<string, any> = Record<string, any>>({\n columns = [],\n rows = [],\n getRowKey = defaultGetRowKey,\n pagination = DEFAULT_PAGINATION,\n expandRow = DEFAULT_EXPAND as ExpandRowOptions<T>,\n hasSearch = true,\n footer = null,\n header = null,\n loading = false,\n loadingRowCount = 8,\n}: TableProps<T>) {\n const searchRef = useRef<HTMLInputElement>(null)\n const [searchTerm, setSearchTerm] = useState('')\n const [perPage, setPerPage] = useState(\n typeof pagination.perPage === 'number' ? pagination.perPage : 15\n )\n const [activePage, setActivePage] = useState(0)\n\n const isServerSide = !!(pagination.enabled && pagination.serverSide)\n\n // Filter is derived state — memoized so each keystroke only runs the\n // O(n × columns) scan once per `searchTerm` change, not on every render.\n // Server-side mode short-circuits: the consumer's API is the filter.\n const filteredRows = useMemo(() => {\n if (isServerSide || !searchTerm) return rows\n const term = searchTerm.toLowerCase()\n return rows.filter((row) =>\n Object.values(row).some(\n (v) => v != null && String(v).toLowerCase().includes(term)\n )\n )\n }, [rows, searchTerm, isServerSide])\n\n // Pagination buckets — also derived. Re-bucketed whenever the filtered\n // set OR page size changes.\n const datasets = useMemo(() => {\n if (isServerSide) return [rows]\n return createDatasets(filteredRows, pagination.enabled ? perPage : null)\n }, [filteredRows, perPage, pagination.enabled, isServerSide, rows])\n\n const MAX_PAGE = useMemo(() => {\n if (isServerSide && typeof pagination.maxPage === 'number') return Math.max(0, pagination.maxPage)\n if (isServerSide && typeof pagination.totalCount === 'number')\n return Math.max(0, Math.ceil(pagination.totalCount / perPage) - 1)\n return datasets.length ? datasets.length - 1 : 0\n }, [isServerSide, pagination.maxPage, pagination.totalCount, perPage, datasets.length])\n\n const currentPageRows = useMemo(() => {\n if (isServerSide) return rows\n return datasets[activePage] ?? []\n }, [isServerSide, rows, datasets, activePage])\n\n // Sync per-page state with pagination prop when not server-side\n useEffect(() => {\n if (pagination.enabled && !isServerSide && typeof pagination.perPage === 'number') {\n setPerPage(pagination.perPage)\n }\n }, [pagination.enabled, pagination.perPage, isServerSide])\n\n // Server-side: mirror the per-page from props\n useEffect(() => {\n if (isServerSide && typeof pagination.perPage === 'number') setPerPage(pagination.perPage)\n }, [isServerSide, pagination.perPage])\n\n // Server-side: mirror the 1-based page from props\n useEffect(() => {\n if (isServerSide && typeof pagination.page === 'number' && pagination.page >= 1)\n setActivePage(pagination.page - 1)\n }, [isServerSide, pagination.page])\n\n const onSearchChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setSearchTerm(e.target.value)\n // Reset to the first page so the user sees the top of the filtered set.\n setActivePage(0)\n }\n\n const onPaginationChange = (perPageValue: number) => {\n setPerPage(perPageValue)\n setActivePage(0)\n if (isServerSide) pagination.onPerPageChange?.(perPageValue)\n }\n\n const handlePageChange = (newPage: number) => {\n if (isServerSide) {\n pagination.onPageChange?.(newPage + 1)\n return\n }\n setActivePage(newPage)\n }\n\n return (\n <div className=\"w-full h-max rounded-lg\">\n <div className=\"flex items-center justify-between mb-2\">\n {hasSearch && (\n <SearchInput\n ref={searchRef}\n value={searchTerm}\n onChange={onSearchChange}\n placeholder=\"Search term...\"\n />\n )}\n {pagination.enabled && (\n <Pagination\n activePage={activePage}\n onPageChange={handlePageChange}\n maxPage={MAX_PAGE}\n onPerPageChange={onPaginationChange}\n options={pagination}\n serverSide={isServerSide}\n />\n )}\n </div>\n <div>{header}</div>\n {/* Horizontal scroll wrapper — enables swipe-scroll on narrow viewports\n without forcing the table itself to layout horizontally. */}\n <div className=\"overflow-x-auto rounded-lg\">\n <table className=\"w-full border-collapse\" aria-busy={loading || undefined}>\n <TableHeader columns={columns} hasExpand={!!expandRow.enabled} />\n {loading ? (\n <TableSkeletonBody\n columns={columns}\n rowCount={loadingRowCount}\n hasExpand={!!expandRow.enabled}\n />\n ) : (\n <TableBody\n columns={columns}\n rows={currentPageRows}\n expandRow={expandRow}\n getRowKey={getRowKey}\n />\n )}\n </table>\n </div>\n <div>{footer}</div>\n </div>\n )\n}\n\n// ── Skeleton body ───────────────────────────────────────────────────────────\n// Renders `rowCount` placeholder rows matching the column count. Used by the\n// Table's `loading` prop during initial fetch or server-side pagination\n// transitions.\n\nfunction TableSkeletonBody<T extends Record<string, any>>({\n columns,\n rowCount,\n hasExpand,\n}: {\n columns: TableColumn<T>[]\n rowCount: number\n hasExpand: boolean\n}) {\n return (\n <tbody aria-hidden=\"true\">\n {Array.from({ length: rowCount }).map((_, i) => (\n <tr\n key={i}\n className={`border-b border-border ${i % 2 === 0 ? 'bg-surface' : 'bg-surface-raised'}`}\n >\n {hasExpand && <td className=\"p-0 align-middle w-9\" />}\n {columns.map((col) => (\n <td key={col.key} className=\"py-3 px-3 align-middle\">\n <SkeletonBox height={12} width={`${50 + (i % 4) * 12}%`} />\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n )\n}\n","import React, { useId } from 'react'\nimport * as SwitchPrimitive from '@radix-ui/react-switch'\n\nexport interface ThemeSwitchProps {\n checked: boolean\n onChange: (e: { target: { checked: boolean } }) => void\n /** Optional accessible label (defaults to \"Toggle dark mode\") */\n label?: string\n}\n\n/**\n * Theme (dark-mode) toggle switch powered by Radix Switch.\n *\n * The thumb color indicates mode: green = light, slate = dark.\n * Layout (position, margin) is the parent's responsibility — this component\n * renders inline with no external margins.\n *\n * @example\n * <ThemeSwitch checked={isDark} onChange={({ target }) => setDark(target.checked)} />\n */\nexport default function ThemeSwitch({ checked, onChange, label = 'Toggle dark mode' }: ThemeSwitchProps) {\n const id = useId()\n\n return (\n <label htmlFor={id} className=\"flex items-center gap-2 cursor-pointer select-none\">\n <SwitchPrimitive.Root\n id={id}\n checked={checked}\n onCheckedChange={(c) => onChange({ target: { checked: c } })}\n aria-label={label}\n className={[\n 'relative inline-flex h-6 w-11 items-center rounded-full',\n 'transition-colors duration-200',\n 'bg-foreground-secondary data-[state=checked]:bg-accent',\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2',\n ].join(' ')}\n >\n <SwitchPrimitive.Thumb\n className={[\n 'pointer-events-none block h-5 w-5 rounded-full shadow-sm',\n 'transition-transform duration-200',\n 'data-[state=checked]:translate-x-[22px]',\n 'data-[state=unchecked]:translate-x-[2px]',\n // Moon icon (dark mode indicator) when checked, sun when unchecked\n checked ? 'bg-oxford-blue-900' : 'bg-white',\n ].join(' ')}\n >\n {/* Micro icon inside thumb */}\n {checked ? (\n // Moon\n <svg viewBox=\"0 0 16 16\" fill=\"currentColor\" className=\"w-3 h-3 m-1 text-manatee\" aria-hidden=\"true\">\n <path d=\"M6 .278a.768.768 0 0 1 .08.858 7.208 7.208 0 0 0-.878 3.46c0 4.021 3.278 7.277 7.318 7.277.527 0 1.04-.055 1.533-.16a.787.787 0 0 1 .81.316.733.733 0 0 1-.031.893A8.349 8.349 0 0 1 8.344 16C3.734 16 0 12.286 0 7.71 0 4.266 2.114 1.312 5.124.06A.752.752 0 0 1 6 .278z\" />\n </svg>\n ) : (\n // Sun\n <svg viewBox=\"0 0 16 16\" fill=\"currentColor\" className=\"w-3 h-3 m-1 text-usafa-blue\" aria-hidden=\"true\">\n <path d=\"M8 11a3 3 0 1 1 0-6 3 3 0 0 1 0 6zm0 1a4 4 0 1 0 0-8 4 4 0 0 0 0 8zM8 0a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-1 0v-2A.5.5 0 0 1 8 0zm0 13a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-1 0v-2A.5.5 0 0 1 8 13zm8-5a.5.5 0 0 1-.5.5h-2a.5.5 0 0 1 0-1h2a.5.5 0 0 1 .5.5zM3 8a.5.5 0 0 1-.5.5h-2a.5.5 0 0 1 0-1h2A.5.5 0 0 1 3 8zm10.657-5.657a.5.5 0 0 1 0 .707l-1.414 1.415a.5.5 0 1 1-.707-.708l1.414-1.414a.5.5 0 0 1 .707 0zm-9.193 9.193a.5.5 0 0 1 0 .707L3.05 13.657a.5.5 0 0 1-.707-.707l1.414-1.414a.5.5 0 0 1 .707 0zm9.193 2.121a.5.5 0 0 1-.707 0l-1.414-1.414a.5.5 0 0 1 .707-.707l1.414 1.414a.5.5 0 0 1 0 .707zM4.464 4.465a.5.5 0 0 1-.707 0L2.343 3.05a.5.5 0 1 1 .707-.707l1.414 1.414a.5.5 0 0 1 0 .707z\" />\n </svg>\n )}\n </SwitchPrimitive.Thumb>\n </SwitchPrimitive.Root>\n </label>\n )\n}\n","import React from 'react'\n\nexport interface TopBarProps {\n /** Brand area — logo, wordmark, or app name. Rendered on the leading edge. */\n brand?: React.ReactNode\n /**\n * Centre content — primary navigation links, breadcrumb, or page title.\n * On mobile (< md breakpoint) this moves below the brand row.\n */\n center?: React.ReactNode\n /**\n * Trailing actions — theme toggle, user avatar, notification bell, etc.\n * Rendered on the trailing edge.\n */\n actions?: React.ReactNode\n /**\n * Height in pixels (default 56). Controls the `h-*` style directly so\n * child scroll-offset calculations can consume it as a CSS var.\n */\n height?: number\n /** Additional className on the root element */\n className?: string\n}\n\n/**\n * App-shell top navigation bar.\n *\n * Three named slots: brand (leading), center, actions (trailing).\n * All slots are optional — omit what you don't need.\n *\n * The component is sticky by default (`sticky top-0`) with `z-[100]`.\n * Height is exposed as `--topbar-height` CSS variable on the element so\n * layout children can reference it for scroll-offset or sticky positioning.\n *\n * Light/dark aware via Phase B semantic tokens.\n *\n * @example\n * <TopBar\n * brand={<Logo />}\n * center={<NavLinks />}\n * actions={\n * <>\n * <ThemeSwitch checked={isDark} onChange={toggleDark} />\n * <UserAvatar />\n * </>\n * }\n * />\n */\nexport default function TopBar({\n brand,\n center,\n actions,\n height = 56,\n className = '',\n}: TopBarProps) {\n return (\n <header\n className={[\n 'sticky top-0 z-[100]',\n 'flex items-center justify-between gap-4',\n 'border-b border-border bg-surface',\n 'px-4 md:px-6',\n className,\n ].join(' ')}\n style={{\n height,\n // Expose as CSS var so consumers can write:\n // padding-top: calc(var(--topbar-height) + 1rem)\n ['--topbar-height' as string]: `${height}px`,\n }}\n >\n {/* ── Brand ── */}\n {brand !== undefined ? (\n <div className=\"flex items-center gap-2 flex-shrink-0\">\n {brand}\n </div>\n ) : (\n // Reserve leading space even when brand is null so center stays centred\n <div aria-hidden=\"true\" className=\"flex-shrink-0 w-0\" />\n )}\n\n {/* ── Centre ── */}\n {center !== undefined && (\n <div className=\"flex flex-1 items-center justify-center min-w-0\">\n {center}\n </div>\n )}\n\n {/* ── Actions ── */}\n {actions !== undefined && (\n <div className=\"flex items-center gap-2 flex-shrink-0\">\n {actions}\n </div>\n )}\n </header>\n )\n}\n","import React from 'react'\nimport { motion } from 'framer-motion'\nimport Tooltip, { TooltipProvider } from './Tooltip'\n\n/** ─────────────────── types ─────────────────── */\n\nexport interface SidebarItem {\n key: string\n icon: React.ReactNode\n label: string\n isActive?: boolean\n onClick?: () => void\n /** Numeric badge shown on the icon */\n badge?: number\n}\n\nexport interface SidebarSection {\n key: string\n /** Section title — visible only when expanded */\n title?: string\n items: SidebarItem[]\n}\n\nexport interface SidebarProps {\n sections: SidebarSection[]\n isExpanded: boolean\n onToggle?: () => void\n /** Expanded sidebar width in px (default 220) */\n expandedWidth?: number\n /** Collapsed sidebar width in px (default 52) */\n collapsedWidth?: number\n /** Slot rendered at the bottom of the sidebar (theme switch, user avatar…) */\n footer?: React.ReactNode\n}\n\n/** ─────────────────── sub-components ─────────────────── */\n\nfunction NavItem({\n item,\n isExpanded,\n}: {\n item: SidebarItem\n isExpanded: boolean\n}) {\n const btn = (\n <button\n type=\"button\"\n onClick={item.onClick}\n className={[\n 'group relative flex w-full items-center gap-2.5 rounded-md',\n 'px-2.5 py-2 transition-colors duration-100',\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-inset',\n item.isActive\n ? 'bg-accent/10 text-accent'\n : 'text-foreground-secondary hover:bg-surface-raised hover:text-foreground',\n ].join(' ')}\n >\n {/* Icon */}\n <span className=\"relative flex h-5 w-5 flex-shrink-0 items-center justify-center\">\n {item.icon}\n {item.badge !== undefined && item.badge > 0 && (\n <span className=\"absolute -right-1 -top-1 flex h-3.5 w-3.5 items-center justify-center rounded-full bg-status-error text-[9px] font-bold text-white leading-none\">\n {item.badge > 99 ? '99+' : item.badge}\n </span>\n )}\n </span>\n\n {/* Label — only visible when expanded */}\n {isExpanded && (\n <motion.span\n initial={false}\n animate={{ opacity: 1 }}\n className=\"truncate text-sm font-medium\"\n >\n {item.label}\n </motion.span>\n )}\n\n {/* Active indicator bar */}\n {item.isActive && (\n <span className=\"absolute inset-y-0 left-0 w-[3px] rounded-r-full bg-accent\" />\n )}\n </button>\n )\n\n if (isExpanded) return btn\n\n return (\n <Tooltip title={item.label} placement=\"right\" delayDuration={200}>\n {btn}\n </Tooltip>\n )\n}\n\n/** ─────────────────── main component ─────────────────── */\n\n/**\n * Collapsible application sidebar.\n *\n * When collapsed: icon-only with tooltips. When expanded: icon + label.\n * Width animates with an ease-out-expo curve. The parent (AppShell) is\n * responsible for shifting the main content by the sidebar width.\n *\n * @example\n * const [open, setOpen] = useState(true)\n * <Sidebar\n * sections={NAV_SECTIONS}\n * isExpanded={open}\n * onToggle={() => setOpen(o => !o)}\n * />\n */\nexport default function Sidebar({\n sections,\n isExpanded,\n onToggle,\n expandedWidth = 220,\n collapsedWidth = 52,\n footer,\n}: SidebarProps) {\n return (\n <TooltipProvider delayDuration={200}>\n <motion.aside\n initial={false}\n animate={{ width: isExpanded ? expandedWidth : collapsedWidth }}\n transition={{ type: 'tween', duration: 0.22, ease: [0.16, 1, 0.3, 1] }}\n className=\"relative flex h-full flex-col border-r border-border bg-surface overflow-hidden flex-shrink-0\"\n >\n {/* ── Toggle button ── */}\n <div className={[\n 'flex h-14 flex-shrink-0 items-center border-b border-border',\n isExpanded ? 'justify-between px-3' : 'justify-center px-1.5',\n ].join(' ')}>\n {isExpanded && (\n <motion.span\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n transition={{ delay: 0.08 }}\n className=\"text-xs font-semibold uppercase tracking-widest text-foreground-muted select-none\"\n >\n Menu\n </motion.span>\n )}\n <Tooltip title={isExpanded ? 'Collapse menu' : 'Expand menu'} placement=\"right\" delayDuration={500}>\n <button\n type=\"button\"\n onClick={onToggle}\n aria-label={isExpanded ? 'Collapse sidebar' : 'Expand sidebar'}\n className=\"flex h-8 w-8 flex-shrink-0 items-center justify-center rounded-md text-foreground-muted hover:bg-surface-raised hover:text-foreground transition-colors duration-100 focus:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n >\n <motion.svg\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"h-4 w-4\"\n animate={{ rotate: isExpanded ? 0 : 180 }}\n transition={{ type: 'tween', duration: 0.22 }}\n >\n <path d=\"M13 5l-5 5 5 5\" />\n </motion.svg>\n </button>\n </Tooltip>\n </div>\n\n {/* ── Nav items ── */}\n <nav className=\"flex-1 overflow-y-auto overflow-x-hidden py-2 px-1.5 space-y-0.5\">\n {sections.map((section, si) => (\n <div key={section.key} className={si > 0 ? 'pt-3' : ''}>\n {/* Section title — hidden when collapsed */}\n {section.title && isExpanded && (\n <motion.p\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n transition={{ delay: 0.06 }}\n className=\"px-2.5 pb-1 text-[10px] font-semibold uppercase tracking-widest text-foreground-muted select-none\"\n >\n {section.title}\n </motion.p>\n )}\n {section.items.map((item) => (\n <NavItem key={item.key} item={item} isExpanded={isExpanded} />\n ))}\n </div>\n ))}\n </nav>\n\n {/* ── Footer slot ── */}\n {footer && (\n <div className={[\n 'flex flex-shrink-0 items-center border-t border-border py-2',\n isExpanded ? 'px-3 gap-2' : 'justify-center px-1.5',\n ].join(' ')}>\n {footer}\n </div>\n )}\n </motion.aside>\n </TooltipProvider>\n )\n}\n","import React, { useEffect, useState } from 'react'\nimport { motion, AnimatePresence } from 'framer-motion'\nimport Sidebar from './Sidebar'\nimport type { SidebarSection, SidebarProps } from './Sidebar'\nimport Portal from '../layout/Portal'\n\nexport interface AppShellProps {\n /**\n * Top navigation bar.\n * Typically `<TopBar brand={...} actions={...} />`.\n * On mobile, a hamburger button is injected to the left of this slot when\n * `sidebarSections` is non-empty. The TopBar should leave some leading space\n * (or use its `center` / `actions` props) to avoid overlap.\n */\n topBar?: React.ReactNode\n\n /** Sidebar navigation sections */\n sidebarSections?: SidebarSection[]\n\n /** Expanded width of the sidebar in px (default 220) */\n sidebarExpandedWidth?: SidebarProps['expandedWidth']\n\n /** Collapsed width of the sidebar in px (default 52) */\n sidebarCollapsedWidth?: SidebarProps['collapsedWidth']\n\n /** Start expanded (default false) */\n sidebarDefaultExpanded?: boolean\n\n /** Slot rendered at the bottom of the sidebar */\n sidebarFooter?: SidebarProps['footer']\n\n /** Main page content */\n children?: React.ReactNode\n\n /** Root element className */\n className?: string\n}\n\n/**\n * Full-page application layout skeleton.\n *\n * Composes a sticky TopBar + collapsible Sidebar + scrollable content area.\n *\n * **Responsive behaviour:**\n * - **≥ md (768 px):** Sidebar renders inline, collapsible via its own toggle.\n * - **< md (mobile):** Sidebar becomes a fixed overlay drawer. A hamburger\n * button appears to the left of the TopBar slot to open it. Tapping the\n * backdrop or the sidebar's own toggle closes it.\n *\n * @example\n * <AppShell\n * topBar={<TopBar brand={<Logo />} actions={<ThemeSwitch ... />} />}\n * sidebarSections={NAV_SECTIONS}\n * >\n * <PageContent />\n * </AppShell>\n */\nexport default function AppShell({\n topBar,\n sidebarSections = [],\n sidebarExpandedWidth = 220,\n sidebarCollapsedWidth = 52,\n sidebarDefaultExpanded = false,\n sidebarFooter,\n children,\n className = '',\n}: AppShellProps) {\n const [expanded, setExpanded] = useState(sidebarDefaultExpanded)\n const [isMobile, setIsMobile] = useState(false)\n const [mobileOpen, setMobileOpen] = useState(false)\n\n // Track mobile breakpoint\n useEffect(() => {\n const mq = window.matchMedia('(max-width: 767px)')\n const update = (e: MediaQueryList | MediaQueryListEvent) => setIsMobile(e.matches)\n update(mq)\n mq.addEventListener('change', update as (e: MediaQueryListEvent) => void)\n return () => mq.removeEventListener('change', update as (e: MediaQueryListEvent) => void)\n }, [])\n\n // Auto-close mobile sidebar on resize to desktop\n useEffect(() => {\n if (!isMobile) setMobileOpen(false)\n }, [isMobile])\n\n const hasSidebar = sidebarSections.length > 0\n\n return (\n <div className={`flex flex-col h-screen bg-background ${className}`}>\n\n {/* ── TopBar row ── */}\n {topBar && (\n <div className=\"flex-shrink-0 flex items-stretch z-topbar\">\n {/* Mobile hamburger — injected to the left of the TopBar on small screens */}\n {hasSidebar && (\n <button\n type=\"button\"\n className={[\n 'md:hidden flex-shrink-0 self-stretch flex items-center justify-center w-14',\n 'border-r border-border',\n 'text-foreground-secondary hover:bg-surface-raised hover:text-foreground',\n 'transition-colors duration-100',\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-accent',\n ].join(' ')}\n onClick={() => setMobileOpen((o) => !o)}\n aria-label={mobileOpen ? 'Close navigation' : 'Open navigation'}\n aria-expanded={mobileOpen}\n >\n {mobileOpen ? (\n /* X icon */\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" aria-hidden=\"true\">\n <path d=\"M18 6 6 18M6 6l12 12\" />\n </svg>\n ) : (\n /* Hamburger icon */\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" aria-hidden=\"true\">\n <path d=\"M4 6h16M4 12h16M4 18h16\" />\n </svg>\n )}\n </button>\n )}\n {/* TopBar fills remaining width */}\n <div className=\"flex-1 min-w-0\">\n {topBar}\n </div>\n </div>\n )}\n\n {/* ── Body row: Sidebar + Content ── */}\n <div className=\"flex flex-1 overflow-hidden\">\n\n {/* Desktop inline sidebar */}\n {hasSidebar && !isMobile && (\n <Sidebar\n sections={sidebarSections}\n isExpanded={expanded}\n onToggle={() => setExpanded((e) => !e)}\n expandedWidth={sidebarExpandedWidth}\n collapsedWidth={sidebarCollapsedWidth}\n footer={sidebarFooter}\n />\n )}\n\n {/* Mobile sidebar overlay — portaled to <body> so the fixed\n backdrop and drawer always cover the real viewport, never\n a transformed/contained ancestor (page-transition libs,\n CSS `contain`, parent `will-change`, etc.). */}\n {hasSidebar && isMobile && (\n <Portal>\n {/* Backdrop */}\n <AnimatePresence>\n {mobileOpen && (\n <motion.div\n className=\"fixed inset-0 bg-black/40 z-overlay md:hidden\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.2, ease: 'easeOut' }}\n onClick={() => setMobileOpen(false)}\n aria-hidden=\"true\"\n />\n )}\n </AnimatePresence>\n\n {/* Sidebar panel */}\n <AnimatePresence>\n {mobileOpen && (\n <motion.div\n className=\"fixed inset-y-0 left-0 z-modal md:hidden\"\n initial={{ x: '-100%' }}\n animate={{ x: 0 }}\n exit={{ x: '-100%' }}\n transition={{\n type: 'tween',\n duration: 0.26,\n ease: [0.16, 1, 0.3, 1], // ease-out-expo\n }}\n >\n <Sidebar\n sections={sidebarSections}\n isExpanded={true}\n onToggle={() => setMobileOpen(false)}\n expandedWidth={sidebarExpandedWidth}\n collapsedWidth={sidebarCollapsedWidth}\n footer={sidebarFooter}\n />\n </motion.div>\n )}\n </AnimatePresence>\n </Portal>\n )}\n\n {/* Main content */}\n <main className=\"flex-1 overflow-y-auto overflow-x-hidden\">\n <div className=\"h-full p-6\">\n {children}\n </div>\n </main>\n </div>\n </div>\n )\n}\n\n// Re-export SidebarSection for consumer convenience\nexport type { SidebarSection, SidebarItem } from './Sidebar'\n","import React, { useEffect, useMemo, useRef } from 'react'\n\n// ─── Theme config types ───────────────────────────────────────────────────────\n\nexport interface ThemeColors {\n background?: string\n surface?: string\n 'surface-raised'?: string\n border?: string\n 'border-strong'?: string\n foreground?: string\n 'foreground-secondary'?: string\n 'foreground-muted'?: string\n accent?: string\n 'accent-hover'?: string\n 'accent-foreground'?: string\n error?: string\n warning?: string\n success?: string\n info?: string\n}\n\nexport interface ThemeRadius {\n sm?: string | number\n md?: string | number\n lg?: string | number\n xl?: string | number\n '2xl'?: string | number\n full?: string | number\n}\n\nexport interface ThemeShadows {\n sm?: string\n md?: string\n lg?: string\n xl?: string\n}\n\nexport interface ThemeTypography {\n /** e.g. '\"Geist\", sans-serif' */\n fontFamily?: string\n fontSizeXs?: string\n fontSizeSm?: string\n fontSizeBase?: string\n fontSizeLg?: string\n fontSizeXl?: string\n fontSize2xl?: string\n fontSize3xl?: string\n fontWeightNormal?: number | string\n fontWeightMedium?: number | string\n fontWeightSemibold?: number | string\n fontWeightBold?: number | string\n lineHeightTight?: number | string\n lineHeightSnug?: number | string\n lineHeightNormal?: number | string\n lineHeightRelaxed?: number | string\n}\n\nexport interface ThemeDensity {\n /** Height of xs control (icon buttons, tiny chips). Default: 24px */\n controlXs?: string | number\n /** Height of sm control (small inputs/buttons). Default: 28px */\n controlSm?: string | number\n /** Height of md control (default inputs/buttons). Default: 36px */\n controlMd?: string | number\n /** Height of lg control (large touch targets). Default: 44px */\n controlLg?: string | number\n /** TopBar height. Default: 56px */\n topbar?: string | number\n}\n\nexport interface ThemeMotion {\n durationFast?: string\n durationNormal?: string\n durationSlow?: string\n durationGentle?: string\n}\n\n/**\n * Partial theme override configuration.\n * Every field is optional — only the keys you provide are overridden.\n */\nexport interface ThemeConfig {\n colors?: ThemeColors\n radius?: ThemeRadius\n shadows?: ThemeShadows\n typography?: ThemeTypography\n density?: ThemeDensity\n motion?: ThemeMotion\n}\n\nexport interface ThemeProviderProps {\n /**\n * Token overrides applied in both light and dark mode (on top of the defaults).\n * For dark-specific overrides see `darkTheme`.\n */\n theme?: ThemeConfig\n\n /**\n * Additional token overrides applied only when the wrapper element carries\n * the `.dark` class (i.e. when `colorScheme=\"dark\"` or when a parent sets `.dark`).\n * Injected via a scoped `<style>` tag — no inline-style limitations.\n */\n darkTheme?: ThemeConfig\n\n /**\n * Managed color scheme.\n * - `'light'` — removes `.dark` class from the wrapper\n * - `'dark'` — adds `.dark` class to the wrapper\n * - `'system'` — follows `prefers-color-scheme` media query\n * - `'auto'` — do nothing; inherit from an ancestor (default)\n */\n colorScheme?: 'light' | 'dark' | 'system' | 'auto'\n\n children: React.ReactNode\n className?: string\n style?: React.CSSProperties\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction px(v: string | number): string {\n return typeof v === 'number' ? `${v}px` : v\n}\n\nfunction str(v: string | number | undefined): string | undefined {\n return v == null ? undefined : String(v)\n}\n\nfunction toCssVars(theme?: ThemeConfig): Record<string, string> {\n if (!theme) return {}\n const out: Record<string, string> = {}\n\n if (theme.colors) {\n for (const [k, v] of Object.entries(theme.colors)) {\n if (v != null) out[`--color-${k}`] = v\n }\n }\n if (theme.radius) {\n for (const [k, v] of Object.entries(theme.radius)) {\n if (v != null) out[`--radius-${k}`] = px(v)\n }\n }\n if (theme.shadows) {\n for (const [k, v] of Object.entries(theme.shadows)) {\n if (v != null) out[`--shadow-${k}`] = v\n }\n }\n if (theme.typography) {\n const t = theme.typography\n const map: [string, string | number | undefined][] = [\n ['--font-family-sans', t.fontFamily],\n ['--font-size-xs', t.fontSizeXs],\n ['--font-size-sm', t.fontSizeSm],\n ['--font-size-base', t.fontSizeBase],\n ['--font-size-lg', t.fontSizeLg],\n ['--font-size-xl', t.fontSizeXl],\n ['--font-size-2xl', t.fontSize2xl],\n ['--font-size-3xl', t.fontSize3xl],\n ['--font-weight-normal', t.fontWeightNormal],\n ['--font-weight-medium', t.fontWeightMedium],\n ['--font-weight-semibold', t.fontWeightSemibold],\n ['--font-weight-bold', t.fontWeightBold],\n ['--line-height-tight', t.lineHeightTight],\n ['--line-height-snug', t.lineHeightSnug],\n ['--line-height-normal', t.lineHeightNormal],\n ['--line-height-relaxed', t.lineHeightRelaxed],\n ]\n for (const [cssVar, val] of map) {\n const s = str(val)\n if (s != null) out[cssVar] = s\n }\n }\n if (theme.density) {\n const d = theme.density\n const map: [string, string | number | undefined][] = [\n ['--height-control-xs', d.controlXs],\n ['--height-control-sm', d.controlSm],\n ['--height-control-md', d.controlMd],\n ['--height-control-lg', d.controlLg],\n ['--height-topbar', d.topbar],\n ]\n for (const [cssVar, val] of map) {\n if (val != null) out[cssVar] = px(val)\n }\n }\n if (theme.motion) {\n const m = theme.motion\n const map: [string, string | undefined][] = [\n ['--duration-fast', m.durationFast],\n ['--duration-normal', m.durationNormal],\n ['--duration-slow', m.durationSlow],\n ['--duration-gentle', m.durationGentle],\n ]\n for (const [cssVar, val] of map) {\n if (val != null) out[cssVar] = val\n }\n }\n\n return out\n}\n\n// ── XSS-safe CSS-value sanitiser ─────────────────────────────────────────────\n// The dark-theme CSS vars are serialised into a `<style>` block via\n// `dangerouslySetInnerHTML`. If a consumer-supplied value contained `</style>`,\n// `;`, or `}`, it would close the style block early and let arbitrary HTML\n// (including `<script>`) execute. We allow normal CSS value characters\n// (letters, digits, punctuation needed for `rgb()`, `oklch()`, multi-word\n// font-family lists, etc.) but reject the characters that can break CSS\n// escaping — including comment delimiters and the backslash hex-escape.\n//\n// React inline `style={…}` values do NOT need this check: React applies them\n// as DOM `.style.<prop> = value`, where a malicious value can only affect\n// that single property and cannot break out into siblings.\nconst CSS_VALUE_REJECT_RE = /[;{}<>\\\\]|\\*\\/|\\/\\*/\n\nfunction isSafeCssValue(v: unknown): v is string {\n if (typeof v !== 'string') return false\n if (v.length > 500) return false // unreasonable values are suspicious\n return !CSS_VALUE_REJECT_RE.test(v)\n}\n\nfunction varsToStyleString(vars: Record<string, string>): string {\n const out: string[] = []\n for (const [k, v] of Object.entries(vars)) {\n if (!isSafeCssValue(v)) {\n // Warn unconditionally — these values are a security risk; the\n // consumer needs to fix them in both dev and prod. (We don't\n // gate on `process.env.NODE_ENV` because that's not always\n // defined in browser bundles.)\n console.warn(\n `[ThemeProvider] Dropping unsafe value for \"${k}\". ` +\n `Theme values may contain letters, digits, and CSS punctuation ` +\n `but must not include: ; { } < > \\\\ /* */`,\n )\n continue\n }\n out.push(`${k}: ${v};`)\n }\n return out.join(' ')\n}\n\n// ─── Component ───────────────────────────────────────────────────────────────\n\n/**\n * Scoped theme provider.\n *\n * Wraps children in a `<div>` that carries CSS custom-property overrides\n * as inline styles. A scoped `<style>` tag handles dark-mode overrides.\n *\n * @example Basic brand color swap\n * <ThemeProvider theme={{ colors: { accent: '#e63946', 'accent-hover': '#c1121f' } }}>\n * <App />\n * </ThemeProvider>\n *\n * @example Compact density + custom font\n * <ThemeProvider\n * theme={{\n * density: { controlMd: 30, controlLg: 38, topbar: 48 },\n * typography: { fontFamily: '\"Geist\", sans-serif' },\n * }}\n * >\n * <Dashboard />\n * </ThemeProvider>\n *\n * @example Managed dark mode\n * <ThemeProvider\n * colorScheme=\"dark\"\n * theme={{ colors: { accent: '#60a5fa' } }}\n * darkTheme={{ colors: { accent: '#93c5fd' } }}\n * >\n * <App />\n * </ThemeProvider>\n */\nexport default function ThemeProvider({\n theme,\n darkTheme,\n colorScheme = 'auto',\n children,\n className = '',\n style,\n}: ThemeProviderProps) {\n const id = React.useId().replace(/:/g, '')\n const scopeClass = `geo-th-${id}`\n\n const divRef = useRef<HTMLDivElement>(null)\n\n // ── Managed color scheme ─────────────────────────────────────────────────\n useEffect(() => {\n const el = divRef.current\n if (!el) return\n\n if (colorScheme === 'auto') return\n\n if (colorScheme === 'system') {\n const mq = window.matchMedia('(prefers-color-scheme: dark)')\n const apply = (e: MediaQueryListEvent | MediaQueryList) => {\n el.classList.toggle('dark', e.matches)\n }\n apply(mq)\n mq.addEventListener('change', apply)\n return () => mq.removeEventListener('change', apply)\n }\n\n el.classList.toggle('dark', colorScheme === 'dark')\n }, [colorScheme])\n\n // ── Inline CSS vars (light + always-on overrides) ────────────────────────\n const lightVars = useMemo(() => toCssVars(theme), [theme])\n\n // ── Scoped dark-mode override via injected <style> ───────────────────────\n const darkVarStr = useMemo(() => {\n if (!darkTheme) return ''\n const dvars = toCssVars(darkTheme)\n if (!Object.keys(dvars).length) return ''\n return `.${scopeClass}.dark { ${varsToStyleString(dvars)} }`\n // scopeClass is stable (derived from useId); only darkTheme matters\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [darkTheme])\n\n return (\n <>\n {darkVarStr && (\n <style dangerouslySetInnerHTML={{ __html: darkVarStr }} />\n )}\n <div\n ref={divRef}\n className={`${scopeClass} ${className}`.trim()}\n style={{ ...(lightVars as React.CSSProperties), ...style }}\n >\n {children}\n </div>\n </>\n )\n}\n","import React, { useId } from 'react'\n\nexport interface TextInputProps {\n value?: string\n onChange?: React.ChangeEventHandler<HTMLInputElement>\n disabled?: boolean\n label?: React.ReactNode\n htmlFor?: string\n placeholder?: string\n name?: string\n inputStyle?: React.CSSProperties\n style?: React.CSSProperties\n /** Label/input orientation. Defaults to `'horizontal'`. */\n layout?: 'horizontal' | 'vertical'\n onBlur?: React.FocusEventHandler<HTMLInputElement>\n errorMessage?: React.ReactNode\n labelColor?: string\n id?: string\n}\n\n/**\n * Standard text input with label and validation message.\n */\nexport default function TextInput({\n value,\n onChange,\n disabled,\n label,\n htmlFor,\n placeholder,\n name,\n inputStyle,\n style,\n layout,\n onBlur,\n errorMessage,\n labelColor,\n}: TextInputProps) {\n // `useId` gives us a stable, SSR-safe id for the error region so that\n // `aria-describedby` on the input can point at it. The id only matters\n // when an error is actually being announced.\n const errorId = useId()\n const hasError = errorMessage != null\n\n return (\n // In horizontal mode the row layout is [label, input-with-error-column].\n // The error sits under the input ONLY, not spanning the label too.\n // In vertical mode the whole thing is a column.\n <div\n className={`flex ${layout === 'vertical' ? 'flex-col gap-1' : 'flex-row items-start gap-2'}`}\n style={style ?? {}}\n >\n {label && (\n <label\n style={{ color: labelColor || undefined }}\n className={`text-sm font-medium ${layout === 'horizontal' ? 'mt-2' : ''} max-content ${!labelColor && 'text-foreground'}`}\n htmlFor={htmlFor}\n >\n {label}\n </label>\n )}\n <div className=\"flex flex-col\">\n <input\n autoComplete=\"off\"\n disabled={disabled}\n value={value}\n onChange={onChange}\n onBlur={onBlur}\n type=\"text\"\n name={name}\n id={htmlFor}\n aria-invalid={hasError || undefined}\n aria-describedby={hasError ? errorId : undefined}\n className={`${hasError ? 'border border-status-error' : 'border border-border'} bg-surface text-foreground p-2 h-9 w-60 rounded-lg disabled:bg-surface-raised disabled:text-foreground-muted disabled:cursor-not-allowed focus:outline-none focus:border-transparent focus:ring-2 focus:ring-accent transition-colors`}\n style={inputStyle ?? {}}\n placeholder={placeholder ?? ''}\n />\n {hasError && (\n <div id={errorId} className=\"text-status-error text-xs mt-1\">\n {errorMessage}\n </div>\n )}\n </div>\n </div>\n )\n}\n","import React, { useId } from 'react'\n\nexport interface NumberInputProps {\n /** Step size for the up/down buttons and native arrow-key handling. Default `1`. */\n step?: number\n /** Current value. `undefined` renders an empty field; a number renders that value. */\n value?: number | ''\n /** Fires with the next number. Empty input resolves to `undefined`. */\n onChange?: (e: { target: { value: number | undefined; id?: string; name?: string } }) => void\n label?: React.ReactNode\n htmlFor?: string\n name?: string\n disabled?: boolean\n /** Label/input orientation. Defaults to `'horizontal'`. */\n layout?: 'horizontal' | 'vertical'\n errorMessage?: React.ReactNode\n inputStyle?: React.CSSProperties\n labelStyle?: React.CSSProperties\n placeholder?: string\n style?: React.CSSProperties\n min?: number\n max?: number\n readOnly?: boolean\n /** Optional precision for floating-point steps (number of decimal places to round to). */\n precision?: number\n}\n\n/**\n * Numeric input with keyboard-accessible increment / decrement buttons.\n *\n * **What's improved over the previous version**\n * - Step buttons are real `<button>` elements with `aria-label`, focus rings,\n * and proper keyboard activation (Enter / Space). The previous version used\n * `<span onClick>` which keyboard-only users could not reach.\n * - Floating-point drift on decimal steps (`0.1 + 0.2 = 0.30000000000000004`)\n * is rounded out via a `precision` prop or auto-inferred from the step.\n * - Empty input resolves to `undefined` instead of `NaN` — works with form\n * libraries (RHF, Formik) that treat empty as \"no value\".\n * - The decrement chevron actually points down (the previous SVG was the up\n * chevron rotated, with the up chevron itself wrongly using the same path).\n * - Width is a prop, not hardcoded `w-60`. Default is `w-full` so the input\n * flows with its parent.\n *\n * @example\n * ```tsx\n * const [qty, setQty] = useState<number | undefined>(1)\n * <NumberInput\n * label=\"Quantity\"\n * value={qty ?? ''}\n * onChange={({ target }) => setQty(target.value)}\n * min={0} max={99}\n * />\n * ```\n *\n * @example Decimal step\n * ```tsx\n * <NumberInput label=\"Tonnage\" step={0.25} precision={2} />\n * ```\n */\nexport default function NumberInput({\n step = 1,\n value,\n onChange,\n label,\n htmlFor,\n name,\n disabled,\n layout = 'horizontal',\n errorMessage,\n inputStyle,\n labelStyle,\n placeholder,\n style,\n min,\n max,\n readOnly = false,\n precision,\n}: NumberInputProps) {\n const errorId = useId()\n const hasError = errorMessage != null\n\n // Auto-infer precision from step (the count of decimal digits) when the\n // consumer hasn't supplied one. Keeps stepping clean for fractional steps\n // like 0.1 / 0.25 / 0.5 without forcing the consumer to think about FP drift.\n const inferredPrecision = precision ?? (\n Number.isInteger(step) ? 0 : (String(step).split('.')[1]?.length ?? 0)\n )\n\n const round = (n: number) => {\n if (inferredPrecision === 0) return n\n const factor = 10 ** inferredPrecision\n return Math.round(n * factor) / factor\n }\n\n // `value` may be number or '' (empty). Parse to number for arithmetic;\n // empty treated as 0 to allow stepping up from a cleared field.\n const numeric = typeof value === 'number' ? value : 0\n\n const onIncrement = () => {\n if (disabled || readOnly) return\n const next = round(numeric + step)\n if (max !== undefined && next > max) return\n onChange?.({ target: { value: next, id: htmlFor, name } })\n }\n\n const onDecrement = () => {\n if (disabled || readOnly) return\n const next = round(numeric - step)\n if (min !== undefined && next < min) return\n onChange?.({ target: { value: next, id: htmlFor, name } })\n }\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const raw = e.target.value\n if (raw === '') {\n onChange?.({ target: { value: undefined, id: htmlFor, name } })\n return\n }\n const parsed = Number(raw)\n if (Number.isNaN(parsed)) return\n onChange?.({ target: { value: round(parsed), id: htmlFor, name } })\n }\n\n return (\n <div className=\"flex flex-col gap-1\">\n <div className={`flex ${layout === 'vertical' ? 'flex-col gap-1' : 'flex-row items-center gap-2'}`}>\n {label && (\n <label\n className=\"text-sm font-medium ml-1 max-content select-none text-foreground\"\n style={labelStyle}\n htmlFor={htmlFor}\n >\n {label}\n </label>\n )}\n <div\n style={style}\n className={`flex items-center rounded-lg border overflow-hidden ${hasError ? 'border-status-error' : 'border-border'} ${disabled ? 'bg-surface-raised text-foreground-muted cursor-not-allowed' : 'bg-surface text-foreground'} focus-within:border-transparent focus-within:ring-2 focus-within:ring-accent transition-colors`}\n >\n <input\n min={min}\n max={max}\n autoComplete=\"off\"\n disabled={disabled}\n name={name}\n id={htmlFor}\n step={step}\n value={value ?? ''}\n onChange={handleInputChange}\n type=\"number\"\n aria-invalid={hasError || undefined}\n aria-describedby={hasError ? errorId : undefined}\n className=\"bg-transparent focus:outline-none h-9 w-full px-3 disabled:cursor-not-allowed [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none\"\n style={inputStyle ?? {}}\n placeholder={placeholder ?? ''}\n readOnly={readOnly}\n />\n <div className=\"flex flex-col border-l border-border h-9\">\n <button\n type=\"button\"\n tabIndex={-1}\n onClick={onIncrement}\n disabled={disabled || readOnly || (max !== undefined && numeric >= max)}\n aria-label=\"Increase value\"\n className=\"flex-1 px-1.5 flex items-center justify-center hover:bg-surface-raised disabled:opacity-30 disabled:cursor-not-allowed transition-colors focus:outline-none focus-visible:bg-surface-raised\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2.5} className=\"h-3 w-3\" aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 15l7-7 7 7\" />\n </svg>\n </button>\n <button\n type=\"button\"\n tabIndex={-1}\n onClick={onDecrement}\n disabled={disabled || readOnly || (min !== undefined && numeric <= min)}\n aria-label=\"Decrease value\"\n className=\"flex-1 px-1.5 flex items-center justify-center hover:bg-surface-raised disabled:opacity-30 disabled:cursor-not-allowed transition-colors focus:outline-none focus-visible:bg-surface-raised border-t border-border\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2.5} className=\"h-3 w-3\" aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n </div>\n </div>\n </div>\n {hasError && (\n <div id={errorId} className=\"text-xs text-status-error ml-1\">\n {errorMessage}\n </div>\n )}\n </div>\n )\n}\n","import React, { useId, useState } from 'react'\n\nexport interface PasswordProps {\n value?: string\n onChange?: React.ChangeEventHandler<HTMLInputElement>\n disabled?: boolean\n label?: React.ReactNode\n htmlFor?: string\n placeholder?: string\n name?: string\n inputStyle?: React.CSSProperties\n style?: React.CSSProperties\n /** Label/input orientation. Defaults to `'horizontal'`. */\n layout?: 'horizontal' | 'vertical'\n onBlur?: React.FocusEventHandler<HTMLInputElement>\n errorMessage?: React.ReactNode\n labelColor?: string\n iconColor?: string\n}\n\n/**\n * Password input with show/hide toggle.\n */\nexport default function Password({\n value,\n onChange,\n disabled,\n label,\n htmlFor,\n placeholder,\n name,\n inputStyle,\n style,\n layout,\n onBlur,\n errorMessage,\n labelColor,\n iconColor,\n}: PasswordProps) {\n const [passwordVisible, setPasswordVisible] = useState(false)\n // Stable, SSR-safe id for the error region — `aria-describedby` on the\n // input points here so screen readers announce the validation message.\n const errorId = useId()\n const hasError = errorMessage != null\n\n return (\n <div\n className={`flex ${layout === 'vertical' ? 'flex-col gap-1' : 'flex-row items-start gap-2'}`}\n style={style ?? {}}\n >\n {label && (\n <label\n style={{ color: labelColor || undefined }}\n className={`text-sm font-medium ${layout === 'horizontal' ? 'mt-2' : ''} max-content ${!labelColor && 'text-foreground'}`}\n htmlFor={htmlFor}\n >\n {label}\n </label>\n )}\n <div className=\"flex flex-col\">\n <div className=\"flex items-center gap-1\">\n <input\n autoComplete=\"off\"\n disabled={disabled}\n value={value}\n onChange={onChange}\n onBlur={onBlur}\n type={passwordVisible ? 'text' : 'password'}\n name={name}\n id={htmlFor}\n aria-invalid={hasError || undefined}\n aria-describedby={hasError ? errorId : undefined}\n className={`${hasError ? 'border border-status-error' : 'border border-border'} bg-surface text-foreground p-2 h-9 w-52 rounded-lg disabled:bg-surface-raised disabled:text-foreground-muted disabled:cursor-not-allowed focus:outline-none focus:border-transparent focus:ring-2 focus:ring-accent transition-colors`}\n style={inputStyle ?? {}}\n placeholder={placeholder ?? ''}\n />\n <button\n type=\"button\"\n className=\"cursor-pointer p-1 text-foreground-secondary hover:text-foreground rounded-md focus:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n style={iconColor ? { color: iconColor } : undefined}\n onClick={() => setPasswordVisible(!passwordVisible)}\n aria-label={passwordVisible ? 'Hide password' : 'Show password'}\n >\n {passwordVisible ? (\n /* EyeSlash */\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"w-6 h-6\">\n <path d=\"M3.53 2.47a.75.75 0 00-1.06 1.06l18 18a.75.75 0 101.06-1.06l-18-18zM22.676 12.553a11.249 11.249 0 01-2.631 4.31l-3.099-3.099a5.25 5.25 0 00-6.71-6.71L7.759 4.577a11.217 11.217 0 014.242-.827c4.97 0 9.185 3.223 10.675 7.69.12.362.12.752 0 1.113z\" />\n <path d=\"M15.75 12c0 .18-.013.357-.037.53l-4.244-4.243A3.75 3.75 0 0115.75 12zM12.53 15.713l-4.243-4.244a3.75 3.75 0 004.243 4.243z\" />\n <path d=\"M6.75 12c0-.619.107-1.213.304-1.764l-3.1-3.1a11.25 11.25 0 00-2.63 4.31c-.12.362-.12.752 0 1.114 1.489 4.467 5.704 7.69 10.675 7.69 1.5 0 2.933-.294 4.242-.827l-2.477-2.477A5.25 5.25 0 016.75 12z\" />\n </svg>\n ) : (\n /* Eye */\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"w-6 h-6\">\n <path d=\"M12 15a3 3 0 100-6 3 3 0 000 6z\" />\n <path fillRule=\"evenodd\" d=\"M1.323 11.447C2.811 6.976 7.028 3.75 12.001 3.75c4.97 0 9.185 3.223 10.675 7.69.12.362.12.752 0 1.113-1.487 4.471-5.705 7.697-10.677 7.697-4.97 0-9.186-3.223-10.675-7.69a1.762 1.762 0 010-1.113zM17.25 12a5.25 5.25 0 11-10.5 0 5.25 5.25 0 0110.5 0z\" clipRule=\"evenodd\" />\n </svg>\n )}\n </button>\n </div>\n {hasError && (\n <div id={errorId} className=\"text-status-error text-xs mt-1\">\n {errorMessage}\n </div>\n )}\n </div>\n </div>\n )\n}\n","import React from 'react'\nimport * as CheckboxPrimitive from '@radix-ui/react-checkbox'\n\nexport interface CheckboxProps {\n /** Controlled checked state */\n checked?: boolean\n onChange?: (e: { target: { checked: boolean; id?: string; name?: string } }) => void\n label?: React.ReactNode\n name?: string\n /** `id` for the hidden input and the `<label htmlFor>` link */\n htmlFor?: string\n errorMessage?: React.ReactNode\n disabled?: boolean\n /** @deprecated Use `checked` */\n value?: boolean\n}\n\n/**\n * Accessible checkbox powered by Radix Checkbox.\n *\n * Radix handles keyboard activation, focus ring, and `role=\"checkbox\"` ARIA.\n * The check mark pops in with a spring animation on first check.\n *\n * @example\n * <Checkbox\n * htmlFor=\"agree\"\n * label=\"I agree to the terms\"\n * checked={form.agree}\n * onChange={({ target }) => setField('agree', target.checked)}\n * />\n */\nexport default function Checkbox({\n checked,\n value, // legacy alias\n onChange,\n label,\n name,\n htmlFor,\n errorMessage,\n disabled = false,\n}: CheckboxProps) {\n // Support legacy `value` prop transparently\n const isChecked = checked ?? value ?? false\n\n return (\n <div className=\"flex flex-col gap-1\">\n <label\n htmlFor={htmlFor}\n className={[\n 'inline-flex items-center gap-2.5',\n disabled ? 'cursor-not-allowed opacity-50' : 'cursor-pointer',\n ].join(' ')}\n >\n <CheckboxPrimitive.Root\n id={htmlFor}\n name={name}\n checked={isChecked}\n disabled={disabled}\n onCheckedChange={(c) =>\n onChange?.({ target: { checked: !!c, id: htmlFor, name } })\n }\n className={[\n // Box\n 'relative flex h-[18px] w-[18px] flex-shrink-0 items-center justify-center',\n 'rounded-sm border transition-colors duration-150',\n // Unchecked\n 'border-border-strong bg-surface',\n // Checked\n 'data-[state=checked]:bg-accent data-[state=checked]:border-accent',\n // Focus\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-1',\n // Disabled\n 'disabled:cursor-not-allowed',\n ].join(' ')}\n aria-label={typeof label === 'string' ? label : undefined}\n >\n <CheckboxPrimitive.Indicator\n className=\"flex items-center justify-center data-[state=checked]:animate-check-pop\"\n >\n {/* Check mark */}\n <svg\n width=\"11\"\n height=\"9\"\n viewBox=\"0 0 11 9\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M1 4.5L4 7.5L10 1\"\n stroke=\"white\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n\n {label && (\n <span className=\"text-sm text-foreground-secondary select-none leading-snug\">\n {label}\n </span>\n )}\n </label>\n\n {errorMessage && (\n <span className=\"text-xs text-status-error pl-[26px]\">{errorMessage}</span>\n )}\n </div>\n )\n}\n","import React, { useId } from 'react'\nimport * as SwitchPrimitive from '@radix-ui/react-switch'\n\nexport interface SwitchInputProps {\n checked?: boolean\n onChange?: (e: { target: { checked: boolean } }) => void\n checkedIcon?: React.ReactNode\n uncheckedIcon?: React.ReactNode\n}\n\n/**\n * Form switch (on/off toggle) powered by Radix Switch.\n *\n * Radix handles keyboard activation, focus ring, and `role=\"switch\"` ARIA.\n * Accepts optional icon slots for the thumb in checked/unchecked states.\n *\n * Emits `{ target: { checked } }` for compatibility with existing handlers.\n *\n * @example\n * <Switch\n * checked={form.enabled}\n * onChange={({ target }) => setField('enabled', target.checked)}\n * />\n */\nexport default function Switch({\n checked = false,\n onChange,\n checkedIcon,\n uncheckedIcon,\n}: SwitchInputProps) {\n const id = useId()\n\n return (\n <div>\n {/* Spacing is the parent's responsibility — no baked-in margins. */}\n <label htmlFor={id} className=\"flex items-center cursor-pointer select-none\">\n <SwitchPrimitive.Root\n id={id}\n checked={checked}\n onCheckedChange={(c) => onChange?.({ target: { checked: c } })}\n className=\"relative inline-flex h-6 w-14 items-center rounded-full bg-foreground-secondary data-[state=checked]:bg-accent transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2\"\n >\n <SwitchPrimitive.Thumb\n className=\"pointer-events-none inline-flex h-8 w-8 items-center justify-center rounded-full bg-background text-foreground shadow transition-transform duration-200 data-[state=checked]:translate-x-[22px] data-[state=unchecked]:translate-x-[-4px]\"\n >\n {checkedIcon && uncheckedIcon\n ? checked\n ? checkedIcon\n : uncheckedIcon\n : null}\n </SwitchPrimitive.Thumb>\n </SwitchPrimitive.Root>\n </label>\n </div>\n )\n}\n","import React, { useEffect, useRef, useState } from 'react'\nimport * as Popover from '@radix-ui/react-popover'\nimport LoadingSpinner from '../core/LoadingSpinner'\n\nexport interface AutoCompleteItem {\n key: string\n value: string\n label: string\n icon?: React.ReactNode\n}\n\nexport interface AutoCompleteProps {\n disabled?: boolean\n label?: React.ReactNode\n placeholder?: string\n name?: string\n inputStyle?: React.CSSProperties\n style?: React.CSSProperties\n /** Label/input orientation. Defaults to `'vertical'`. */\n layout?: 'horizontal' | 'vertical'\n /**\n * Static list — when provided, the component does its own substring\n * filtering on `label` and `key`. Mutually exclusive with `onSearch`.\n */\n items?: AutoCompleteItem[]\n /**\n * Async resolver — when provided, `items` is ignored and `onSearch(term)`\n * is called (debounced) every time the user pauses typing. Its returned\n * promise drives the option list. The component manages an internal\n * `loading` state and shows an `xs` LoadingSpinner where the search icon\n * normally lives while a query is in flight.\n */\n onSearch?: (term: string) => Promise<AutoCompleteItem[]>\n /**\n * Debounce delay (ms) before `onSearch` fires after the user stops\n * typing. Default `250`. Ignored when `items` is used.\n */\n debounce?: number\n onItemClick?: (value: string) => void\n /** Custom \"empty\" message */\n emptyText?: string\n /** Custom \"loading\" message — shown in async mode while a query is in flight. */\n loadingText?: string\n}\n\n/**\n * Search-as-you-type autocomplete powered by Radix Popover. Supports two\n * modes:\n *\n * - **Static**: pass `items` — the component substring-filters locally.\n * Best for small fixed lists (≤ 200 entries).\n * - **Async**: pass `onSearch(term) => Promise<Item[]>` — the component\n * debounces input and drives the option list from the resolver. Shows\n * an `xs` LoadingSpinner while the query is in flight.\n *\n * The popover opens when the input is focused and closes when an item is\n * selected or the user clicks away.\n *\n * @example Static (small fixed list)\n * ```tsx\n * <AutoComplete\n * label=\"Vessel\"\n * items={vessels.map((v) => ({ key: v.imo, value: v.imo, label: v.name }))}\n * onItemClick={(imo) => setVessel(imo)}\n * />\n * ```\n *\n * @example Async (server-backed)\n * ```tsx\n * <AutoComplete\n * label=\"Port\"\n * debounce={300}\n * onSearch={async (term) => {\n * const res = await fetch(`/api/ports?q=${encodeURIComponent(term)}`)\n * const data = await res.json()\n * return data.map((p) => ({ key: p.unlocode, value: p.unlocode, label: p.name }))\n * }}\n * onItemClick={(unlocode) => setPort(unlocode)}\n * />\n * ```\n */\nexport default function AutoComplete({\n disabled,\n label,\n placeholder,\n name,\n inputStyle,\n style,\n layout = 'vertical',\n items,\n onSearch,\n debounce = 250,\n onItemClick,\n emptyText = 'No results found',\n loadingText = 'Searching…',\n}: AutoCompleteProps) {\n const [term, setTerm] = useState('')\n const [open, setOpen] = useState(false)\n const [asyncItems, setAsyncItems] = useState<AutoCompleteItem[]>([])\n const [loading, setLoading] = useState(false)\n\n const isAsync = typeof onSearch === 'function'\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n // Track the most recent in-flight request so out-of-order responses\n // don't overwrite fresher results.\n const requestIdRef = useRef(0)\n\n // Static filtering — only when not async\n const staticFiltered = isAsync || !items\n ? []\n : term.trim()\n ? items.filter(\n ({ key, label }) =>\n label.toLowerCase().includes(term.toLowerCase()) ||\n key.toLowerCase().includes(term.toLowerCase()),\n )\n : []\n\n // Async debounce + fetch\n useEffect(() => {\n if (!isAsync) return\n if (debounceRef.current) clearTimeout(debounceRef.current)\n if (!term.trim()) {\n setAsyncItems([])\n setLoading(false)\n return\n }\n const myId = ++requestIdRef.current\n setLoading(true)\n debounceRef.current = setTimeout(async () => {\n try {\n const res = await onSearch!(term)\n if (myId === requestIdRef.current) {\n setAsyncItems(res)\n }\n } catch {\n if (myId === requestIdRef.current) {\n setAsyncItems([])\n }\n } finally {\n if (myId === requestIdRef.current) {\n setLoading(false)\n }\n }\n }, debounce)\n return () => {\n if (debounceRef.current) clearTimeout(debounceRef.current)\n }\n }, [term, isAsync, debounce, onSearch])\n\n const foundItems = isAsync ? asyncItems : staticFiltered\n\n const handleSelect = (item: AutoCompleteItem) => {\n setTerm(`${item.label} (${item.value})`)\n onItemClick?.(item.value)\n setOpen(false)\n }\n\n return (\n <div className=\"relative flex flex-col items-center justify-center\">\n <div\n className={`flex ${layout === 'vertical' ? 'flex-col' : 'flex-row items-center gap-2'}`}\n style={style ?? {}}\n >\n {label && (\n <label className=\"text-sm font-medium ml-1 max-content text-foreground\">\n {label}\n </label>\n )}\n\n <Popover.Root open={open && !disabled} onOpenChange={(o) => !disabled && setOpen(o)}>\n <Popover.Anchor asChild>\n <div className=\"bg-surface text-foreground flex items-center gap-1 rounded-lg border border-border pr-2 focus-within:border-transparent focus-within:ring-2 focus-within:ring-accent transition-colors\">\n <input\n disabled={disabled}\n value={term}\n onChange={(e) => {\n setTerm(e.target.value)\n setOpen(true)\n }}\n onFocus={() => setOpen(true)}\n type=\"text\"\n name={name}\n className=\"bg-transparent focus:outline-none pl-2 h-9 w-56 rounded-lg disabled:cursor-not-allowed\"\n style={inputStyle ?? {}}\n placeholder={placeholder ?? ''}\n autoComplete=\"off\"\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-autocomplete=\"list\"\n aria-busy={loading || undefined}\n />\n {loading ? (\n <span className=\"w-5 h-5 flex-shrink-0 flex items-center justify-center text-accent\" aria-hidden=\"true\">\n <LoadingSpinner inline size=\"xs\" spinnerColor=\"currentColor\" />\n </span>\n ) : (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"w-5 h-5 flex-shrink-0 text-foreground-muted\" aria-hidden=\"true\">\n <path fillRule=\"evenodd\" d=\"M10.5 3.75a6.75 6.75 0 100 13.5 6.75 6.75 0 000-13.5zM2.25 10.5a8.25 8.25 0 1114.59 5.28l4.69 4.69a.75.75 0 11-1.06 1.06l-4.69-4.69A8.25 8.25 0 012.25 10.5z\" clipRule=\"evenodd\" />\n </svg>\n )}\n </div>\n </Popover.Anchor>\n\n <Popover.Portal>\n <Popover.Content\n align=\"start\"\n sideOffset={4}\n onOpenAutoFocus={(e) => e.preventDefault()}\n className=\"w-64 bg-surface border border-border rounded-lg mt-1 shadow-md z-50 overflow-y-auto max-h-36 animate-in fade-in-0 zoom-in-95\"\n >\n {loading ? (\n <div className=\"h-full w-full flex items-center justify-center gap-2 py-4 text-sm text-foreground-secondary\">\n <LoadingSpinner inline size=\"xs\" />\n <span>{loadingText}</span>\n </div>\n ) : foundItems.length === 0 ? (\n <div className=\"h-full w-full flex flex-col items-center justify-center py-4 text-sm text-foreground-secondary\">\n {emptyText}\n </div>\n ) : (\n <div role=\"listbox\">\n {foundItems.map((item) => (\n <div\n key={item.key}\n role=\"option\"\n tabIndex={0}\n className=\"text-sm flex items-center gap-2 p-2 transition-colors duration-150 hover:bg-surface-raised cursor-pointer text-foreground focus:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n onClick={() => handleSelect(item)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n handleSelect(item)\n }\n }}\n >\n {item.icon}\n <span>\n {item.label} ({item.value})\n </span>\n </div>\n ))}\n </div>\n )}\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n </div>\n </div>\n )\n}\n","import React, { useEffect, useId, useMemo, useRef, useState } from 'react'\nimport * as Popover from '@radix-ui/react-popover'\n\nexport interface TreeSelectNode {\n key: string | number\n label: React.ReactNode\n icon?: React.ReactNode\n /** Nested children. If present, this node is treated as a parent (branch). */\n children?: TreeSelectNode[]\n /** Render the node disabled — visible but not selectable. */\n disabled?: boolean\n}\n\nexport interface TreeSelectProps {\n /** Tree data. Each node may optionally carry `children` for sub-branches. */\n items: TreeSelectNode[]\n /** Currently selected key (single-select). Pass `undefined`/`null` for unset. */\n value?: string | number | null\n /** Fires with the next selected key (and the corresponding event-like target). */\n onChange?: (e: { target: { value: string | number; id?: string; name?: string } }) => void\n label?: React.ReactNode\n placeholder?: string\n /** Form control id linkage. */\n htmlFor?: string\n name?: string\n /** Label/trigger orientation. Defaults to `'horizontal'`. */\n layout?: 'horizontal' | 'vertical'\n disabled?: boolean\n errorMessage?: React.ReactNode\n style?: React.CSSProperties\n /**\n * Whether parent (branch) nodes can be selected. When `false`, parents\n * only expand/collapse and only leaves are picked. Default `true`.\n */\n parentsSelectable?: boolean\n /** Keys of nodes that should start expanded. */\n defaultExpandedKeys?: (string | number)[]\n}\n\n// ── Visible-items flattening ────────────────────────────────────────────────\n// Walk the tree depth-first and emit every node along with its depth.\n// Children of un-expanded parents are skipped. This array is what the\n// keyboard navigation moves through.\n\ninterface FlatNode {\n node: TreeSelectNode\n depth: number\n isParent: boolean\n}\n\nfunction flattenVisible(items: TreeSelectNode[], expanded: Set<React.Key>, depth = 0, out: FlatNode[] = []): FlatNode[] {\n for (const node of items) {\n const isParent = !!node.children && node.children.length > 0\n out.push({ node, depth, isParent })\n if (isParent && expanded.has(node.key)) {\n flattenVisible(node.children!, expanded, depth + 1, out)\n }\n }\n return out\n}\n\nfunction findNodeByKey(items: TreeSelectNode[], key: React.Key): TreeSelectNode | null {\n for (const n of items) {\n if (n.key === key) return n\n if (n.children) {\n const found = findNodeByKey(n.children, key)\n if (found) return found\n }\n }\n return null\n}\n\n/**\n * Hierarchical single-select with expandable branches.\n *\n * Built on `@radix-ui/react-popover` for portal positioning and click-outside.\n * Tree state (expanded keys) is local; selected value is controlled by the\n * parent.\n *\n * **Keyboard model** (focus is on the trigger or any item):\n * - `Enter` / `Space` / `↓` / `↑` on the trigger — open the popover\n * - `↓` / `↑` — move active item through the visible (un-collapsed) list\n * - `→` — expand a branch (or move into it if already expanded)\n * - `←` — collapse a branch (or move to its parent if already collapsed)\n * - `Enter` / `Space` — select the active item (if selectable)\n * - `Esc` — close the popover, return focus to the trigger\n *\n * @example\n * ```tsx\n * type FleetKey = number\n * const [fleet, setFleet] = useState<FleetKey | null>(null)\n *\n * const tree: TreeSelectNode[] = [\n * { key: 'eu', label: 'Europe', children: [\n * { key: 1, label: 'Aegean Fleet' },\n * { key: 2, label: 'Adriatic Fleet' },\n * ]},\n * { key: 'asia', label: 'Asia', children: [{ key: 3, label: 'Pacific Fleet' }] },\n * ]\n *\n * <TreeSelect\n * label=\"Fleet\"\n * items={tree}\n * value={fleet}\n * onChange={({ target }) => setFleet(target.value as FleetKey)}\n * parentsSelectable={false}\n * />\n * ```\n */\nexport default function TreeSelect({\n label,\n name,\n value,\n onChange,\n disabled,\n layout = 'horizontal',\n errorMessage,\n style,\n htmlFor,\n items = [],\n placeholder = 'Select…',\n parentsSelectable = true,\n defaultExpandedKeys = [],\n}: TreeSelectProps) {\n const errorId = useId()\n const hasError = errorMessage != null\n\n const [open, setOpen] = useState(false)\n const [expanded, setExpanded] = useState<Set<React.Key>>(() => new Set(defaultExpandedKeys))\n const [activeIndex, setActiveIndex] = useState(0)\n\n const listRef = useRef<HTMLDivElement>(null)\n\n const visible = useMemo(() => flattenVisible(items, expanded), [items, expanded])\n\n // Sync `activeIndex` only on the open transition (or when `value` changes\n // while open). Previously this ran on every `visible` mutation, so any\n // expand/collapse yanked focus back to the selected item — wrong if the\n // user was navigating to a different branch. We use a ref to track\n // whether we've already done the open-time sync.\n const didSyncOnOpenRef = useRef(false)\n useEffect(() => {\n if (!open) {\n didSyncOnOpenRef.current = false\n return\n }\n if (didSyncOnOpenRef.current) return\n const selectedIdx = visible.findIndex((v) => v.node.key === value)\n setActiveIndex(selectedIdx >= 0 ? selectedIdx : 0)\n didSyncOnOpenRef.current = true\n // visible intentionally excluded — we want to sync ONCE on open,\n // not on every expand/collapse.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open, value])\n\n const selectedNode = useMemo(\n () => (value != null ? findNodeByKey(items, value) : null),\n [items, value],\n )\n\n // ── Actions ────────────────────────────────────────────────────────────\n\n const toggleExpand = (key: React.Key) => {\n setExpanded((prev) => {\n const next = new Set(prev)\n if (next.has(key)) next.delete(key)\n else next.add(key)\n return next\n })\n }\n\n const selectKey = (key: string | number) => {\n onChange?.({ target: { value: key, id: htmlFor, name } })\n setOpen(false)\n }\n\n // ── Keyboard handler (on the listbox) ──────────────────────────────────\n\n const onListKey = (e: React.KeyboardEvent) => {\n if (visible.length === 0) return\n const cur = visible[activeIndex]\n\n if (e.key === 'ArrowDown') {\n e.preventDefault()\n setActiveIndex((i) => Math.min(i + 1, visible.length - 1))\n } else if (e.key === 'ArrowUp') {\n e.preventDefault()\n setActiveIndex((i) => Math.max(i - 1, 0))\n } else if (e.key === 'ArrowRight') {\n e.preventDefault()\n if (cur.isParent) {\n if (!expanded.has(cur.node.key)) toggleExpand(cur.node.key)\n else setActiveIndex((i) => Math.min(i + 1, visible.length - 1))\n }\n } else if (e.key === 'ArrowLeft') {\n e.preventDefault()\n if (cur.isParent && expanded.has(cur.node.key)) {\n toggleExpand(cur.node.key)\n } else if (cur.depth > 0) {\n // Walk back to the nearest ancestor\n for (let i = activeIndex - 1; i >= 0; i--) {\n if (visible[i].depth < cur.depth) { setActiveIndex(i); break }\n }\n }\n } else if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n if (cur.node.disabled) return\n if (cur.isParent && !parentsSelectable) {\n toggleExpand(cur.node.key)\n } else {\n selectKey(cur.node.key)\n }\n } else if (e.key === 'Escape') {\n e.preventDefault()\n setOpen(false)\n }\n }\n\n // ── Render ─────────────────────────────────────────────────────────────\n\n return (\n <div className=\"flex flex-col gap-1\">\n <div className={`flex ${layout === 'vertical' ? 'flex-col gap-1' : 'flex-row items-center gap-2'}`}>\n {label && (\n <label\n className=\"text-sm font-medium ml-1 max-content select-none text-foreground\"\n htmlFor={htmlFor}\n >\n {label}\n </label>\n )}\n\n <Popover.Root open={open && !disabled} onOpenChange={(o) => !disabled && setOpen(o)}>\n <Popover.Trigger asChild>\n <button\n id={htmlFor}\n type=\"button\"\n style={style}\n role=\"combobox\"\n aria-expanded={open}\n aria-haspopup=\"listbox\"\n aria-invalid={hasError || undefined}\n aria-describedby={hasError ? errorId : undefined}\n disabled={disabled}\n className={`flex items-center justify-between h-9 rounded-lg border ${hasError ? 'border-status-error' : 'border-border'} px-3 cursor-pointer select-none focus:outline-none focus-visible:border-transparent focus-visible:ring-2 focus-visible:ring-accent ${disabled ? 'cursor-not-allowed bg-surface-raised text-foreground-muted' : 'bg-surface text-foreground'} ${!style?.width ? 'min-w-[240px]' : ''}`}\n >\n <span className=\"text-sm truncate text-left\">\n {selectedNode ? selectedNode.label : <span className=\"text-foreground-muted\">{placeholder}</span>}\n </span>\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} className={`h-4 w-4 flex-shrink-0 transition-transform duration-200 ${open ? 'rotate-180' : ''}`} aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n </Popover.Trigger>\n\n <Popover.Portal>\n <Popover.Content\n align=\"start\"\n sideOffset={4}\n style={{ width: style?.width || 280 }}\n className=\"bg-surface text-foreground border border-border rounded-lg shadow-md z-50 p-1 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\"\n onOpenAutoFocus={(e) => {\n e.preventDefault()\n listRef.current?.focus()\n }}\n >\n <div\n ref={listRef}\n role=\"tree\"\n tabIndex={-1}\n aria-activedescendant={visible[activeIndex] ? `tree-opt-${visible[activeIndex].node.key}` : undefined}\n onKeyDown={onListKey}\n className=\"max-h-72 overflow-y-auto outline-none\"\n >\n {visible.length === 0 ? (\n <div className=\"px-3 py-4 text-sm text-foreground-secondary text-center\">No items</div>\n ) : (\n visible.map((v, idx) => (\n <TreeNodeRow\n key={v.node.key}\n node={v.node}\n depth={v.depth}\n isParent={v.isParent}\n isExpanded={expanded.has(v.node.key)}\n isActive={idx === activeIndex}\n isSelected={value === v.node.key}\n parentsSelectable={parentsSelectable}\n onActivate={() => {\n if (v.node.disabled) return\n if (v.isParent && !parentsSelectable) toggleExpand(v.node.key)\n else selectKey(v.node.key)\n }}\n onToggle={() => toggleExpand(v.node.key)}\n onHover={() => setActiveIndex(idx)}\n />\n ))\n )}\n </div>\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n </div>\n {hasError && (\n <div id={errorId} className=\"text-xs text-status-error ml-1\">\n {errorMessage}\n </div>\n )}\n </div>\n )\n}\n\n// ── Row component ───────────────────────────────────────────────────────────\n\ninterface RowProps {\n node: TreeSelectNode\n depth: number\n isParent: boolean\n isExpanded: boolean\n isActive: boolean\n isSelected: boolean\n parentsSelectable: boolean\n onActivate: () => void\n onToggle: () => void\n onHover: () => void\n}\n\nfunction TreeNodeRow({\n node, depth, isParent, isExpanded, isActive, isSelected,\n parentsSelectable, onActivate, onToggle, onHover,\n}: RowProps) {\n const disabled = node.disabled\n return (\n <div\n id={`tree-opt-${node.key}`}\n role=\"treeitem\"\n aria-selected={isSelected}\n aria-expanded={isParent ? isExpanded : undefined}\n aria-disabled={disabled || undefined}\n data-active={isActive ? '' : undefined}\n onMouseEnter={onHover}\n className={`flex items-center gap-1 rounded-md px-1 py-1.5 select-none cursor-pointer transition-colors duration-100 ${\n disabled\n ? 'opacity-40 cursor-not-allowed'\n : isActive\n ? 'bg-accent text-accent-fg'\n : isSelected\n ? 'bg-surface-raised'\n : 'hover:bg-surface-raised'\n }`}\n style={{ paddingLeft: depth * 16 + 4 }}\n >\n {/* Chevron — only for parents, only toggles expand. Acts as its\n own button so users can expand without selecting. */}\n {isParent ? (\n <button\n type=\"button\"\n onClick={(e) => { e.stopPropagation(); onToggle() }}\n aria-label={isExpanded ? 'Collapse' : 'Expand'}\n tabIndex={-1}\n className=\"w-5 h-5 inline-flex items-center justify-center rounded hover:bg-black/10 focus:outline-none\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2.5}\n className={`h-3 w-3 transition-transform duration-150 ${isExpanded ? 'rotate-0' : '-rotate-90'}`}\n aria-hidden=\"true\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n ) : (\n <span className=\"w-5 h-5 inline-block\" aria-hidden=\"true\" />\n )}\n\n {/* Label — clicking selects (or toggles parents when not selectable) */}\n <button\n type=\"button\"\n onClick={onActivate}\n disabled={disabled}\n tabIndex={-1}\n className=\"flex-1 flex items-center gap-2 text-sm text-left focus:outline-none disabled:cursor-not-allowed\"\n >\n {node.icon}\n <span className=\"truncate\">{node.label}</span>\n {isParent && !parentsSelectable && (\n <span className=\"ml-auto text-xs text-foreground-muted\">parent</span>\n )}\n </button>\n\n {/* Selected checkmark */}\n {isSelected && (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\" aria-hidden=\"true\" className=\"ml-1\">\n <path d=\"M4 10l4.5 4.5L16 6\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n )}\n </div>\n )\n}\n","import React, { useRef, useState } from 'react'\n\nexport interface FileInputProps {\n allowMultiple?: boolean\n onChange?: (e: { target: { files: File[]; name?: string; id?: string; value?: string } }) => void\n name?: string\n /** Accepted MIME types / extensions */\n accept?: string\n}\n\n/**\n * Drag-and-drop / click file input.\n *\n * Decoupled from ThemeContext — uses CSS `dark:` classes.\n *\n * @example\n * <FileInput\n * name=\"xlsxUpload\"\n * accept=\".xlsx\"\n * onChange={(e) => setFile(e.target.files[0])}\n * />\n */\nexport default function FileInput({\n allowMultiple = false,\n onChange,\n name,\n accept = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,.xlsx',\n}: FileInputProps) {\n const fileInput = useRef<HTMLInputElement>(null)\n const [files, setFiles] = useState<File[]>([])\n\n const openPicker = () => {\n // Native .click() is the idiomatic call — synthesising a MouseEvent\n // works but is noisy in test environments (jsdom) and unnecessary.\n fileInput.current?.click()\n }\n\n const handleFiles = (list: File[]) => {\n setFiles(list)\n onChange?.({ target: { files: list } })\n }\n\n const onDrop = (e: React.DragEvent) => {\n e.preventDefault()\n const fileList: File[] = []\n if (e.dataTransfer.items) {\n for (let i = 0; i < e.dataTransfer.items.length; i++) {\n if (e.dataTransfer.items[i].kind === 'file') {\n const f = e.dataTransfer.items[i].getAsFile()\n if (f) fileList.push(f)\n }\n }\n } else {\n for (let i = 0; i < e.dataTransfer.files.length; i++) {\n fileList.push(e.dataTransfer.files[i])\n }\n }\n handleFiles(fileList)\n }\n\n const localOnChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n handleFiles(Array.from(e.target.files ?? []))\n }\n\n const removeFile = (e: React.MouseEvent) => {\n e.stopPropagation()\n setFiles([])\n onChange?.({ target: { files: [], name, id: name, value: '' } })\n if (fileInput.current) fileInput.current.value = ''\n }\n\n return (\n // Dropzone is keyboard-activatable: role=\"button\", focusable via\n // tabIndex, and Space/Enter trigger the file picker. Without these\n // a keyboard-only user could not upload a file.\n <div\n role=\"button\"\n tabIndex={0}\n aria-label=\"Upload file — click or drop\"\n onClick={openPicker}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n openPicker()\n }\n }}\n className=\"border-2 border-dashed border-border hover:border-accent w-full h-full rounded-md transition-colors duration-200 cursor-pointer focus:outline-none focus-visible:ring-2 focus-visible:ring-accent text-foreground-secondary hover:text-foreground\"\n onDragOver={(e) => e.preventDefault()}\n onDrop={onDrop}\n >\n <input\n id={name}\n name={name}\n onChange={localOnChange}\n ref={fileInput}\n hidden\n type=\"file\"\n accept={accept}\n multiple={allowMultiple}\n />\n\n {files.length === 0 ? (\n <div className=\"flex flex-col h-full items-center justify-center gap-2\">\n {/* Upload icon — currentColor lets the parent's text-foreground drive it */}\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"w-16 h-16\" aria-hidden=\"true\">\n <path fillRule=\"evenodd\" d=\"M11.47 2.47a.75.75 0 011.06 0l4.5 4.5a.75.75 0 01-1.06 1.06l-3.22-3.22V16.5a.75.75 0 01-1.5 0V4.81L8.03 8.03a.75.75 0 01-1.06-1.06l4.5-4.5zM3 15.75a.75.75 0 01.75.75v2.25a1.5 1.5 0 001.5 1.5h13.5a1.5 1.5 0 001.5-1.5V16.5a.75.75 0 011.5 0v2.25a3 3 0 01-3 3H5.25a3 3 0 01-3-3V16.5a.75.75 0 01.75-.75z\" clipRule=\"evenodd\" />\n </svg>\n <div className=\"text-sm\">Click or Drop a file</div>\n </div>\n ) : (\n <div className=\"flex gap-3 items-center justify-center w-full h-full p-3\">\n {files.map((file, id) => (\n <div\n key={`${id}${file.name}`}\n className=\"text-xs flex flex-col items-center w-20 h-24 text-center bg-surface-raised text-foreground p-4 rounded-md relative\"\n >\n <button\n type=\"button\"\n onClick={removeFile}\n className=\"bg-status-error rounded-full w-4 h-4 absolute right-[-5px] top-[-5px] cursor-pointer flex items-center justify-center focus:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n aria-label=\"Remove file\"\n >\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 20 20\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M15 5L5 15M5 5l10 10\" stroke=\"#fff\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n {/* File icon */}\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"w-10 h-10\" aria-hidden=\"true\">\n <path fillRule=\"evenodd\" d=\"M5.625 1.5c-1.036 0-1.875.84-1.875 1.875v17.25c0 1.035.84 1.875 1.875 1.875h12.75c1.035 0 1.875-.84 1.875-1.875V12.75A3.75 3.75 0 0016.5 9h-1.875a1.875 1.875 0 01-1.875-1.875V5.25A3.75 3.75 0 009 1.5H5.625z\" clipRule=\"evenodd\" />\n <path d=\"M12.971 1.816A5.23 5.23 0 0114.25 5.25v1.875c0 .207.168.375.375.375H16.5a5.23 5.23 0 013.434 1.279 9.768 9.768 0 00-6.963-6.963z\" />\n </svg>\n <span className=\"text-ellipsis whitespace-nowrap overflow-hidden w-full\">\n {file.name}\n </span>\n </div>\n ))}\n </div>\n )}\n </div>\n )\n}\n","import React, { useEffect, useId, useMemo, useRef, useState } from 'react'\nimport * as Popover from '@radix-ui/react-popover'\n\n// ── Public API ──────────────────────────────────────────────────────────────\n\nexport interface DatePickerProps {\n /** Current date. `null` / `undefined` means \"no date selected\". */\n value?: Date | null\n /** Fires with the next date (or `null` if cleared via the clear button). */\n onChange?: (date: Date | null) => void\n label?: React.ReactNode\n /** Text shown in the trigger when no date is selected. Default `\"Select a date…\"`. */\n placeholder?: string\n htmlFor?: string\n name?: string\n /** Label/trigger orientation. Defaults to `'horizontal'`. */\n layout?: 'horizontal' | 'vertical'\n disabled?: boolean\n errorMessage?: React.ReactNode\n /** Earliest selectable date. Dates before this render disabled. */\n min?: Date\n /** Latest selectable date. Dates after this render disabled. */\n max?: Date\n style?: React.CSSProperties\n /**\n * Custom formatter for the trigger display. Defaults to\n * `YYYY-MM-DD` via `toISOString().slice(0, 10)`.\n */\n format?: (date: Date) => string\n /** 0 = Sunday, 1 = Monday. Default `0`. */\n weekStartsOn?: 0 | 1\n /** Allow the user to clear the date with a button in the popover. Default `true`. */\n clearable?: boolean\n}\n\n// Legacy alias — the previous component exported `TemporalPickerProps`. Keep\n// it for backwards-compat imports; same shape as DatePickerProps now.\nexport type TemporalPickerProps = DatePickerProps\n\n// ── Date helpers ────────────────────────────────────────────────────────────\n\nconst MONTH_NAMES = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']\nconst WEEKDAY_SHORT = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']\n\nfunction isSameDay(a: Date, b: Date) {\n return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate()\n}\n\nfunction startOfMonth(d: Date) { return new Date(d.getFullYear(), d.getMonth(), 1) }\nfunction addDays(d: Date, n: number) { const c = new Date(d); c.setDate(c.getDate() + n); return c }\nfunction addMonths(d: Date, n: number) { const c = new Date(d); c.setMonth(c.getMonth() + n); return c }\nfunction defaultFormat(d: Date) {\n const y = d.getFullYear().toString().padStart(4, '0')\n const m = (d.getMonth() + 1).toString().padStart(2, '0')\n const day = d.getDate().toString().padStart(2, '0')\n return `${y}-${m}-${day}`\n}\n\n/**\n * Build the 6×7 calendar grid for `viewMonth`. Days from the previous and\n * next month are included as \"outside\" cells so the grid always has 42 cells\n * (six rows of seven days) — keeps the layout stable across months.\n */\nfunction buildGrid(viewMonth: Date, weekStartsOn: 0 | 1): { date: Date; outside: boolean }[][] {\n const first = startOfMonth(viewMonth)\n const startOffset = (first.getDay() - weekStartsOn + 7) % 7\n const gridStart = addDays(first, -startOffset)\n const cells: { date: Date; outside: boolean }[] = []\n for (let i = 0; i < 42; i++) {\n const d = addDays(gridStart, i)\n cells.push({ date: d, outside: d.getMonth() !== viewMonth.getMonth() })\n }\n const rows: { date: Date; outside: boolean }[][] = []\n for (let r = 0; r < 6; r++) rows.push(cells.slice(r * 7, r * 7 + 7))\n return rows\n}\n\n// ── Component ──────────────────────────────────────────────────────────────\n\n/**\n * Calendar date picker built on `@radix-ui/react-popover`.\n *\n * Renders the calendar as a real `<table role=\"grid\">` with weekday `<th>`\n * headers and per-day `<td role=\"gridcell\">` cells, so screen readers get\n * proper row/column context.\n *\n * **Keyboard model** (focus is anywhere inside the grid):\n * - `←` `→` — previous / next day\n * - `↑` `↓` — previous / next week\n * - `PageUp` / `PageDown` — previous / next month\n * - `Home` / `End` — first / last day of the current week\n * - `Enter` / `Space` — select the focused day\n * - `Esc` — close the popover\n *\n * @example Required date\n * ```tsx\n * const [date, setDate] = useState<Date | null>(null)\n * <DatePicker\n * label=\"Report date\"\n * value={date}\n * onChange={setDate}\n * max={new Date()}\n * />\n * ```\n *\n * @example Custom format\n * ```tsx\n * <DatePicker\n * value={date}\n * onChange={setDate}\n * format={(d) => new Intl.DateTimeFormat('en-GB', { dateStyle: 'long' }).format(d)}\n * />\n * ```\n */\nexport default function DatePicker({\n value,\n onChange,\n label,\n placeholder = 'Select a date…',\n htmlFor,\n name: _name,\n layout = 'horizontal',\n disabled,\n errorMessage,\n min,\n max,\n style,\n format = defaultFormat,\n weekStartsOn = 0,\n clearable = true,\n}: DatePickerProps) {\n const errorId = useId()\n const hasError = errorMessage != null\n\n const [open, setOpen] = useState(false)\n // The month currently shown in the calendar. Drives navigation independently\n // of the selected `value` so users can browse without changing the date.\n const [viewMonth, setViewMonth] = useState(() => startOfMonth(value ?? new Date()))\n // The keyboard-focused day in the grid.\n const [focusDate, setFocusDate] = useState<Date>(() => value ?? new Date())\n // Which picker view is showing: days grid, months grid (12 months), or\n // years grid (12-year decade). Lets the user jump from 2026 to 1991 in\n // 3 clicks (year header → previous decade × N → pick year → pick month).\n const [view, setView] = useState<'days' | 'months' | 'years'>('days')\n\n const gridRef = useRef<HTMLTableElement>(null)\n\n // Reset view + focus when the popover opens\n useEffect(() => {\n if (!open) return\n const target = value ?? new Date()\n setViewMonth(startOfMonth(target))\n setFocusDate(target)\n setView('days')\n }, [open, value])\n\n // After the active cell changes, move DOM focus to it so screen readers\n // and keyboard users land on the right cell.\n useEffect(() => {\n if (!open) return\n const cell = gridRef.current?.querySelector<HTMLButtonElement>(`[data-day=\"${defaultFormat(focusDate)}\"]`)\n cell?.focus()\n }, [open, focusDate])\n\n const weekdays = useMemo(() => {\n const ordered = WEEKDAY_SHORT.slice(weekStartsOn).concat(WEEKDAY_SHORT.slice(0, weekStartsOn))\n return ordered\n }, [weekStartsOn])\n\n const grid = useMemo(() => buildGrid(viewMonth, weekStartsOn), [viewMonth, weekStartsOn])\n\n const isDisabled = (d: Date) => {\n if (min && d < min) return true\n if (max && d > max) return true\n return false\n }\n\n const selectDate = (d: Date) => {\n if (isDisabled(d)) return\n onChange?.(d)\n setOpen(false)\n }\n\n const onKey = (e: React.KeyboardEvent) => {\n const next = (delta: number) => {\n const nd = addDays(focusDate, delta)\n setFocusDate(nd)\n if (nd.getMonth() !== viewMonth.getMonth()) setViewMonth(startOfMonth(nd))\n }\n if (e.key === 'ArrowLeft') { e.preventDefault(); next(-1) }\n else if (e.key === 'ArrowRight') { e.preventDefault(); next(1) }\n else if (e.key === 'ArrowUp') { e.preventDefault(); next(-7) }\n else if (e.key === 'ArrowDown') { e.preventDefault(); next(7) }\n else if (e.key === 'PageUp') { e.preventDefault(); const nm = addMonths(viewMonth, -1); setViewMonth(nm); setFocusDate((d) => addMonths(d, -1)) }\n else if (e.key === 'PageDown') { e.preventDefault(); const nm = addMonths(viewMonth, 1); setViewMonth(nm); setFocusDate((d) => addMonths(d, 1)) }\n else if (e.key === 'Home') {\n e.preventDefault()\n const dow = (focusDate.getDay() - weekStartsOn + 7) % 7\n setFocusDate(addDays(focusDate, -dow))\n }\n else if (e.key === 'End') {\n e.preventDefault()\n const dow = (focusDate.getDay() - weekStartsOn + 7) % 7\n setFocusDate(addDays(focusDate, 6 - dow))\n }\n else if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); selectDate(focusDate) }\n else if (e.key === 'Escape') { e.preventDefault(); setOpen(false) }\n }\n\n const displayValue = value ? format(value) : ''\n\n return (\n <div className=\"flex flex-col gap-1\">\n <div className={`flex ${layout === 'vertical' ? 'flex-col gap-1' : 'flex-row items-center gap-2'}`}>\n {label && (\n <label\n className=\"text-sm font-medium ml-1 max-content select-none text-foreground\"\n htmlFor={htmlFor}\n >\n {label}\n </label>\n )}\n\n <Popover.Root open={open && !disabled} onOpenChange={(o) => !disabled && setOpen(o)}>\n <Popover.Trigger asChild>\n <button\n id={htmlFor}\n type=\"button\"\n disabled={disabled}\n style={style}\n aria-invalid={hasError || undefined}\n aria-describedby={hasError ? errorId : undefined}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n className={`flex items-center justify-between h-9 rounded-lg border px-3 cursor-pointer select-none focus:outline-none focus-visible:border-transparent focus-visible:ring-2 focus-visible:ring-accent ${hasError ? 'border-status-error' : 'border-border'} ${disabled ? 'cursor-not-allowed bg-surface-raised text-foreground-muted' : 'bg-surface text-foreground'} ${!style?.width ? 'min-w-[200px]' : ''}`}\n >\n <span className={`text-sm truncate ${displayValue ? '' : 'text-foreground-muted'}`}>\n {displayValue || placeholder}\n </span>\n <CalendarIcon />\n </button>\n </Popover.Trigger>\n\n <Popover.Portal>\n <Popover.Content\n align=\"start\"\n sideOffset={4}\n className=\"bg-surface text-foreground border border-border rounded-lg shadow-md z-50 p-3 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\"\n onOpenAutoFocus={(e) => {\n e.preventDefault()\n // Focus is moved by the focusDate effect once the grid mounts\n }}\n >\n {/* View-aware navigation header */}\n <div className=\"flex items-center justify-between mb-2\">\n <button\n type=\"button\"\n onClick={() => {\n if (view === 'days') setViewMonth(addMonths(viewMonth, -1))\n else if (view === 'months') setViewMonth(new Date(viewMonth.getFullYear() - 1, viewMonth.getMonth(), 1))\n else setViewMonth(new Date(viewMonth.getFullYear() - 10, viewMonth.getMonth(), 1))\n }}\n aria-label={view === 'days' ? 'Previous month' : view === 'months' ? 'Previous year' : 'Previous decade'}\n className=\"w-7 h-7 inline-flex items-center justify-center rounded-md hover:bg-surface-raised focus:outline-none focus-visible:ring-2 focus-visible:ring-accent transition-colors\"\n >\n <ChevronLeft />\n </button>\n\n {/* Header label — clicking promotes to the next-broader view.\n In `years` view it's not clickable (we're already at the top). */}\n <button\n type=\"button\"\n onClick={() => {\n if (view === 'days') setView('months')\n else if (view === 'months') setView('years')\n }}\n disabled={view === 'years'}\n aria-label=\"Change view\"\n className=\"text-sm font-semibold select-none rounded-md px-2 py-0.5 hover:bg-surface-raised focus:outline-none focus-visible:ring-2 focus-visible:ring-accent transition-colors disabled:cursor-default disabled:hover:bg-transparent\"\n >\n {view === 'days' && `${MONTH_NAMES[viewMonth.getMonth()]} ${viewMonth.getFullYear()}`}\n {view === 'months' && `${viewMonth.getFullYear()}`}\n {view === 'years' && (() => {\n const decadeStart = Math.floor(viewMonth.getFullYear() / 10) * 10\n return `${decadeStart} – ${decadeStart + 11}`\n })()}\n </button>\n\n <button\n type=\"button\"\n onClick={() => {\n if (view === 'days') setViewMonth(addMonths(viewMonth, 1))\n else if (view === 'months') setViewMonth(new Date(viewMonth.getFullYear() + 1, viewMonth.getMonth(), 1))\n else setViewMonth(new Date(viewMonth.getFullYear() + 10, viewMonth.getMonth(), 1))\n }}\n aria-label={view === 'days' ? 'Next month' : view === 'months' ? 'Next year' : 'Next decade'}\n className=\"w-7 h-7 inline-flex items-center justify-center rounded-md hover:bg-surface-raised focus:outline-none focus-visible:ring-2 focus-visible:ring-accent transition-colors\"\n >\n <ChevronRight />\n </button>\n </div>\n\n {/* MONTHS view — 4×3 grid of month buttons */}\n {view === 'months' && (\n <div className=\"grid grid-cols-3 gap-1 min-w-[224px]\">\n {MONTH_NAMES.map((name, idx) => {\n const isCurrent = value && value.getFullYear() === viewMonth.getFullYear() && value.getMonth() === idx\n return (\n <button\n key={name}\n type=\"button\"\n onClick={() => {\n setViewMonth(new Date(viewMonth.getFullYear(), idx, 1))\n setView('days')\n }}\n className={`px-2 py-2 rounded-md text-xs font-medium transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-accent ${\n isCurrent ? 'bg-accent text-accent-fg' : 'text-foreground hover:bg-surface-raised'\n }`}\n >\n {name.slice(0, 3)}\n </button>\n )\n })}\n </div>\n )}\n\n {/* YEARS view — 4×3 grid of years for the current decade\n (plus 1 spillover slot for the year after) */}\n {view === 'years' && (() => {\n const decadeStart = Math.floor(viewMonth.getFullYear() / 10) * 10\n const years = Array.from({ length: 12 }, (_, i) => decadeStart + i)\n return (\n <div className=\"grid grid-cols-3 gap-1 min-w-[224px]\">\n {years.map((y) => {\n const isCurrent = value?.getFullYear() === y\n return (\n <button\n key={y}\n type=\"button\"\n onClick={() => {\n setViewMonth(new Date(y, viewMonth.getMonth(), 1))\n setView('months')\n }}\n className={`px-2 py-2 rounded-md text-xs font-medium transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-accent ${\n isCurrent ? 'bg-accent text-accent-fg' : 'text-foreground hover:bg-surface-raised'\n }`}\n >\n {y}\n </button>\n )\n })}\n </div>\n )\n })()}\n\n {/* DAYS view — the calendar grid */}\n {view === 'days' && (\n <table\n ref={gridRef}\n role=\"grid\"\n aria-label={`${MONTH_NAMES[viewMonth.getMonth()]} ${viewMonth.getFullYear()}`}\n onKeyDown={onKey}\n className=\"border-separate border-spacing-0\"\n >\n <thead>\n <tr>\n {weekdays.map((w) => (\n <th key={w} scope=\"col\" className=\"text-[11px] font-medium text-foreground-muted uppercase tracking-wide w-8 h-8\">\n {w}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {grid.map((row, ri) => (\n <tr key={ri}>\n {row.map(({ date, outside }) => {\n const dis = isDisabled(date)\n const sel = value ? isSameDay(date, value) : false\n const focused = isSameDay(date, focusDate)\n const today = isSameDay(date, new Date())\n return (\n <td key={defaultFormat(date)} role=\"gridcell\" className=\"p-0\">\n <button\n type=\"button\"\n disabled={dis}\n tabIndex={focused ? 0 : -1}\n data-day={defaultFormat(date)}\n aria-label={defaultFormat(date)}\n aria-selected={sel || undefined}\n onClick={() => selectDate(date)}\n className={[\n 'w-8 h-8 rounded-md text-xs font-medium transition-colors duration-100',\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-1 focus-visible:ring-offset-surface',\n 'disabled:opacity-30 disabled:cursor-not-allowed',\n sel\n ? 'bg-accent text-accent-fg'\n : today\n ? 'bg-surface-raised text-foreground ring-1 ring-inset ring-accent'\n : outside\n ? 'text-foreground-muted hover:bg-surface-raised'\n : 'text-foreground hover:bg-surface-raised',\n ].join(' ')}\n >\n {date.getDate()}\n </button>\n </td>\n )\n })}\n </tr>\n ))}\n </tbody>\n </table>\n )}\n\n {/* Footer — Today + Clear */}\n <div className=\"mt-2 flex items-center justify-between gap-2 border-t border-border pt-2\">\n <button\n type=\"button\"\n onClick={() => selectDate(new Date())}\n className=\"text-xs text-accent hover:underline focus:outline-none focus-visible:ring-2 focus-visible:ring-accent rounded-sm px-1\"\n >\n Today\n </button>\n {clearable && value && (\n <button\n type=\"button\"\n onClick={() => { onChange?.(null); setOpen(false) }}\n className=\"text-xs text-foreground-secondary hover:text-foreground focus:outline-none focus-visible:ring-2 focus-visible:ring-accent rounded-sm px-1\"\n >\n Clear\n </button>\n )}\n </div>\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n </div>\n {hasError && (\n <div id={errorId} className=\"text-xs text-status-error ml-1\">\n {errorMessage}\n </div>\n )}\n </div>\n )\n}\n\n// Legacy named export so consumers importing `Temporal` keep working.\nexport const Temporal = DatePicker\n\n// ── Inline SVGs ────────────────────────────────────────────────────────────\n\nfunction CalendarIcon() {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.75} className=\"w-4 h-4 flex-shrink-0\" aria-hidden=\"true\">\n <rect x=\"3\" y=\"5\" width=\"18\" height=\"16\" rx=\"2\" />\n <path d=\"M3 9h18M8 3v4M16 3v4\" strokeLinecap=\"round\" />\n </svg>\n )\n}\n\nfunction ChevronLeft() {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} className=\"w-4 h-4\" aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15 19l-7-7 7-7\" />\n </svg>\n )\n}\n\nfunction ChevronRight() {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} className=\"w-4 h-4\" aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 5l7 7-7 7\" />\n </svg>\n )\n}\n"]}