@geomak/ui 6.11.0 → 6.13.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.
package/dist/index.js.map CHANGED
@@ -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/Accordion.tsx","../src/components/core/Breadcrumbs.tsx","../src/components/core/Badge.tsx","../src/components/core/Kbd.tsx","../src/components/core/Card.tsx","../src/components/core/CardCarousel.tsx","../src/components/core/Statistic.tsx","../src/components/core/FAB.tsx","../src/components/core/PopConfirm.tsx","../src/components/core/Calendar.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/_field.tsx","../src/components/inputs/SearchInput.tsx","../src/components/inputs/_tag.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/MegaMenu.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/RadioGroup.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","../src/components/inputs/TextArea.tsx","../src/components/inputs/SegmentedControl.tsx","../src/components/inputs/Slider.tsx","../src/components/inputs/TagsInput.tsx","../src/components/inputs/OtpInput.tsx","../src/components/inputs/Rating.tsx","../src/components/inputs/TimePicker.tsx","../src/components/inputs/DateRangePicker.tsx","../src/components/inputs/ColorPicker.tsx","../src/form/path.ts","../src/form/validate.ts","../src/form/store.ts","../src/form/bindings.ts","../src/form/useForm.ts","../src/form/context.ts","../src/form/Form.tsx","../src/form/useFormField.ts","../src/form/FormField.tsx","../src/form/useFieldArray.ts","../src/components/forms/creditCard.ts","../src/components/forms/CreditCardForm.tsx"],"names":["Map","px","jsx","GAP_MAP","ALIGN_CLASS","JUSTIFY_CLASS","Grid","jsxs","useReducedMotion","Dialog2","AnimatePresence","motion","useState","Accordion","createContext","Chevron","useContext","Fragment","SIZE","display","React","padding","Arrow","useRef","useCallback","useEffect","TONE","Calendar","useMemo","List","ChevronRight","useLayoutEffect","useId","SearchInput","Popover2","vars","SwitchPrimitive2","label","Popover3","isParent","Popover4","addMonths","buildGrid","Popover5","Popover6","MONTH_NAMES","startOfMonth","addDays","isSameDay","startOfDay","Popover7","Popover8","useSyncExternalStore"],"mappings":"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","file":"index.js","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 /** Extra classes appended to the button. */\n className?: string\n /** Inline style on the button. */\n style?: React.CSSProperties\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 className = '',\n style,\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 style={style}\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 ${className}`.trim()}\n >\n {loading ? loadingIcon : icon}\n </button>\n )\n}\n","import React from 'react'\n\nexport interface ButtonProps {\n /** Button content (text or nodes). */\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 /** Show a loading spinner and disable the control. */\n loading?: boolean\n /** Disable interaction and dim the control. */\n disabled?: boolean\n /** Inline style overrides (width, etc.). Margins/layout belong in the parent. */\n style?: React.CSSProperties\n /** Extra classes appended to the button (override variant/size styles). */\n className?: string\n /** Leading icon — rendered before content */\n icon?: React.ReactNode\n /** Click handler. */\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 className = '',\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 className,\n ].filter(Boolean).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 /** Extra classes merged onto the modal panel. */\n className?: string\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 className = '',\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 ${className}`.trim()}\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 /** Extra classes merged onto the drawer panel. */\n className?: string\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 className = '',\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 ${className}`.trim()}\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 /** Extra classes merged onto the tooltip content bubble. */\n className?: string\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 className = '',\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 className,\n ].filter(Boolean).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, {\n createContext,\n useCallback,\n useContext,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n} from 'react'\nimport * as TabsPrimitive from '@radix-ui/react-tabs'\nimport { motion, useReducedMotion } from 'framer-motion'\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\nexport type TabsVariant = 'underline' | 'segmented' | 'enclosed'\nexport type TabsSize = 'sm' | 'md' | 'lg'\nexport type TabsOrientation = 'horizontal' | 'vertical'\n\ninterface TabMeta {\n label: React.ReactNode\n icon?: React.ReactNode\n disabled?: boolean\n}\ninterface TabRecord extends TabMeta {\n value: string\n}\n\ninterface TabsContextValue {\n value: string | undefined\n variant: TabsVariant\n size: TabsSize\n orientation: TabsOrientation\n indicatorId: string\n reduced: boolean\n /** Select a tab programmatically (used by the overflow menu). */\n select: (value: string) => void\n /** Triggers register their label/icon so the overflow menu can list them. */\n registerTab: (value: string, meta: TabMeta) => void\n unregisterTab: (value: string) => void\n /** Ordered list of registered tabs. */\n getTabs: () => TabRecord[]\n}\n\nconst TabsContext = createContext<TabsContextValue | null>(null)\nfunction useTabsContext(): TabsContextValue {\n const ctx = useContext(TabsContext)\n if (!ctx) throw new Error('Tabs.List / Tabs.Trigger / Tabs.Panel must be rendered inside <Tabs>.')\n return ctx\n}\n\nconst SIZE: Record<TabsSize, { trigger: string; icon: string; add: string }> = {\n sm: { trigger: 'h-8 text-xs px-2.5', icon: 'h-3.5 w-3.5', add: 'h-8 w-8' },\n md: { trigger: 'h-10 text-sm px-3', icon: 'h-4 w-4', add: 'h-10 w-9' },\n lg: { trigger: 'h-12 text-sm px-4', icon: 'h-[18px] w-[18px]', add: 'h-12 w-10' },\n}\n\n// Marker (sliding indicator) motion. Exponential ease-out per the design system;\n// reduced-motion collapses to an instant move (no spatial animation).\nconst MARKER_TRANSITION = { duration: 0.26, ease: [0.16, 1, 0.3, 1] as const }\n\n// ── Root ──────────────────────────────────────────────────────────────────────\n\nexport interface TabsProps {\n /** Controlled active tab value. */\n value?: string\n /** Uncontrolled initial active tab value. */\n defaultValue?: string\n /** Fires with the next active value. */\n onValueChange?: (value: string) => void\n /** Visual style. `'underline'` (default) | `'segmented'` | `'enclosed'`. */\n variant?: TabsVariant\n /** Size preset. Default `'md'`. */\n size?: TabsSize\n /** `'horizontal'` (default) strip + panel below, or `'vertical'` rail + panel beside. */\n orientation?: TabsOrientation\n /** Extra classes merged onto the root. */\n className?: string\n /** Inline style on the root. */\n style?: React.CSSProperties\n children: React.ReactNode\n}\n\n/**\n * Compositional, motion-forward tab system on Radix Tabs.\n *\n * The active tab is marked by a thin cobalt indicator that *slides* between\n * tabs (the design system's \"one rare accent\" rule, not a full-fill pill).\n * Three variants — `underline` (signature), `segmented` (lifted-pill track),\n * `enclosed` (folder tabs) — plus horizontal/vertical orientation, icons,\n * count badges, closeable + add-tab, and overflow scrolling with chevrons that\n * appear only when the strip actually overflows.\n *\n * @example\n * ```tsx\n * <Tabs defaultValue=\"overview\" variant=\"underline\">\n * <Tabs.List aria-label=\"Sections\">\n * <Tabs.Trigger value=\"overview\" icon={<HomeIcon />}>Overview</Tabs.Trigger>\n * <Tabs.Trigger value=\"activity\" badge={12}>Activity</Tabs.Trigger>\n * </Tabs.List>\n * <Tabs.Panel value=\"overview\">…</Tabs.Panel>\n * <Tabs.Panel value=\"activity\">…</Tabs.Panel>\n * </Tabs>\n * ```\n */\nfunction Tabs({\n value,\n defaultValue,\n onValueChange,\n variant = 'underline',\n size = 'md',\n orientation = 'horizontal',\n className = '',\n style,\n children,\n}: TabsProps) {\n const isControlled = value !== undefined\n const [internal, setInternal] = useState<string | undefined>(defaultValue)\n const current = isControlled ? value : internal\n const reduced = !!useReducedMotion()\n const indicatorId = useId()\n\n const select = useCallback((next: string) => {\n if (!isControlled) setInternal(next)\n onValueChange?.(next)\n }, [isControlled, onValueChange])\n\n // Tab registry — triggers self-register their label/icon so the overflow\n // menu can enumerate them. `version` only bumps on membership change (add /\n // remove), so re-registering a label on every render never loops.\n const registry = useRef<Map<string, TabMeta & { order: number }>>(new Map())\n const orderRef = useRef(0)\n const [, bump] = useState(0)\n const registerTab = useCallback((val: string, meta: TabMeta) => {\n const existing = registry.current.get(val)\n registry.current.set(val, { ...meta, order: existing?.order ?? orderRef.current++ })\n if (!existing) bump((v) => v + 1)\n }, [])\n const unregisterTab = useCallback((val: string) => {\n if (registry.current.delete(val)) bump((v) => v + 1)\n }, [])\n const getTabs = useCallback((): TabRecord[] =>\n [...registry.current.entries()]\n .sort((a, b) => a[1].order - b[1].order)\n .map(([val, m]) => ({ value: val, label: m.label, icon: m.icon, disabled: m.disabled })), [])\n\n return (\n <TabsContext.Provider value={{ value: current, variant, size, orientation, indicatorId, reduced, select, registerTab, unregisterTab, getTabs }}>\n <TabsPrimitive.Root\n value={current}\n onValueChange={select}\n orientation={orientation}\n className={[\n 'flex min-w-0',\n orientation === 'vertical' ? 'flex-row gap-4' : 'flex-col gap-3',\n className,\n ].filter(Boolean).join(' ')}\n style={style}\n >\n {children}\n </TabsPrimitive.Root>\n </TabsContext.Provider>\n )\n}\n\n// ── List (tab strip + overflow handling) ────────────────────────────────────────\n\nexport interface TabsListProps {\n children: React.ReactNode\n /** Accessible name for the tab list. */\n 'aria-label'?: string\n /** Extra classes merged onto the tab strip. */\n className?: string\n}\n\nfunction TabsList({ children, 'aria-label': ariaLabel, className = '' }: TabsListProps) {\n const { variant, orientation, reduced, value } = useTabsContext()\n const horizontal = orientation === 'horizontal'\n const scrollRef = useRef<HTMLDivElement>(null)\n const [edges, setEdges] = useState({ start: false, end: false })\n\n // Segmented is a compact track (2-4 options) — never scrolls.\n const scrollable = variant !== 'segmented'\n\n useLayoutEffect(() => {\n const el = scrollRef.current\n if (!el || !scrollable) return\n const update = () => {\n if (horizontal) {\n setEdges({\n start: el.scrollLeft > 1,\n end: el.scrollLeft + el.clientWidth < el.scrollWidth - 1,\n })\n } else {\n setEdges({\n start: el.scrollTop > 1,\n end: el.scrollTop + el.clientHeight < el.scrollHeight - 1,\n })\n }\n }\n update()\n el.addEventListener('scroll', update, { passive: true })\n const ro = new ResizeObserver(update)\n ro.observe(el)\n return () => { el.removeEventListener('scroll', update); ro.disconnect() }\n }, [horizontal, scrollable, children])\n\n const nudge = useCallback((dir: 1 | -1) => {\n const el = scrollRef.current\n if (!el) return\n const amount = (horizontal ? el.clientWidth : el.clientHeight) * 0.7 * dir\n el.scrollBy({ [horizontal ? 'left' : 'top']: amount, behavior: reduced ? 'auto' : 'smooth' })\n }, [horizontal, reduced])\n\n // Keep the active tab in view when it changes (e.g. picked from the overflow\n // menu, or activated by keyboard while off-screen).\n useLayoutEffect(() => {\n const el = scrollRef.current\n if (!el || !scrollable) return\n const active = el.querySelector<HTMLElement>('[role=tab][data-state=active]')\n // `scrollIntoView` is unimplemented in jsdom; guard so tests + SSR pass.\n if (active && typeof active.scrollIntoView === 'function') {\n active.scrollIntoView({ block: 'nearest', inline: 'nearest', behavior: reduced ? 'auto' : 'smooth' })\n }\n }, [value, scrollable, reduced])\n\n // Fade the strip's own content at any overflowing edge (background-agnostic\n // via mask-image), so tabs dissolve under the chevron rather than getting\n // hard-cut.\n const maskStyle: React.CSSProperties = scrollable && (edges.start || edges.end)\n ? (() => {\n const dir = horizontal ? 'to right' : 'to bottom'\n const a = edges.start ? 'transparent, black 36px' : 'black'\n const b = edges.end ? 'black calc(100% - 36px), transparent' : 'black'\n const img = `linear-gradient(${dir}, ${a}, ${b})`\n return { maskImage: img, WebkitMaskImage: img }\n })()\n : {}\n\n const trackClass = (() => {\n if (variant === 'segmented') {\n return horizontal\n ? 'inline-flex items-center gap-1 rounded-lg border border-border bg-surface-raised p-1 w-fit'\n : 'inline-flex flex-col items-stretch gap-1 rounded-lg border border-border bg-surface-raised p-1 w-fit'\n }\n // underline + enclosed share a hairline the strip sits on\n const hairline = horizontal ? 'border-b border-border' : 'border-r border-border'\n const align = variant === 'enclosed' && horizontal ? 'items-end' : 'items-stretch'\n return `flex ${horizontal ? 'flex-row' : 'flex-col'} ${align} gap-1 ${hairline}`\n })()\n\n const scrollClass = scrollable\n ? horizontal\n ? 'overflow-x-auto overflow-y-hidden hidden-scrollbar'\n : 'overflow-y-auto overflow-x-hidden hidden-scrollbar'\n : ''\n\n const overflowing = scrollable && (edges.start || edges.end)\n\n return (\n <div className={['relative flex min-w-0 gap-1', horizontal ? 'flex-row items-stretch' : 'flex-col items-stretch', className].filter(Boolean).join(' ')}>\n {scrollable && edges.start && (\n <Chevron side=\"start\" orientation={orientation} onClick={() => nudge(-1)} />\n )}\n\n <TabsPrimitive.List\n ref={scrollRef}\n aria-label={ariaLabel}\n className={[scrollClass, trackClass, 'min-w-0 flex-1'].filter(Boolean).join(' ')}\n style={maskStyle}\n >\n {children}\n </TabsPrimitive.List>\n\n {scrollable && edges.end && (\n <Chevron side=\"end\" orientation={orientation} onClick={() => nudge(1)} />\n )}\n\n {/* Quick-select: jump to any tab when the strip overflows. */}\n {overflowing && <OverflowMenu />}\n </div>\n )\n}\n\nfunction Chevron({ side, orientation, onClick }: { side: 'start' | 'end'; orientation: TabsOrientation; onClick: () => void }) {\n const horizontal = orientation === 'horizontal'\n // Rotate a single right-chevron glyph to the needed direction.\n const rotate =\n horizontal\n ? (side === 'start' ? 'rotate-180' : '')\n : (side === 'start' ? '-rotate-90' : 'rotate-90')\n return (\n <button\n type=\"button\"\n aria-label={side === 'start' ? 'Scroll tabs backward' : 'Scroll tabs forward'}\n onClick={onClick}\n className=\"flex-shrink-0 self-center flex h-7 w-7 items-center justify-center rounded-full border border-border bg-surface text-foreground-secondary shadow-sm hover:text-foreground hover:bg-surface-raised transition-colors 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-4 w-4 ${rotate}`} aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 5l7 7-7 7\" />\n </svg>\n </button>\n )\n}\n\n// ── Overflow quick-select menu ───────────────────────────────────────────────\n// A \"jump to any tab\" affordance shown only when the strip overflows. Opens on\n// hover (mouse) and on click / keyboard (touch + a11y); picking a tab activates\n// it and scrolls it into view.\nfunction OverflowMenu() {\n const { getTabs, value, select, orientation } = useTabsContext()\n const horizontal = orientation === 'horizontal'\n const [open, setOpen] = useState(false)\n const wrapRef = useRef<HTMLDivElement>(null)\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const openNow = () => { if (timer.current) clearTimeout(timer.current); setOpen(true) }\n const closeSoon = () => { timer.current = setTimeout(() => setOpen(false), 160) }\n\n useLayoutEffect(() => {\n if (!open) return\n const onDoc = (e: MouseEvent) => { if (wrapRef.current && !wrapRef.current.contains(e.target as Node)) setOpen(false) }\n const onKey = (e: KeyboardEvent) => { if (e.key === 'Escape') setOpen(false) }\n document.addEventListener('mousedown', onDoc)\n document.addEventListener('keydown', onKey)\n return () => { document.removeEventListener('mousedown', onDoc); document.removeEventListener('keydown', onKey) }\n }, [open])\n\n const tabs = getTabs()\n\n return (\n <div\n ref={wrapRef}\n className=\"relative flex-shrink-0 self-center\"\n onMouseEnter={openNow}\n onMouseLeave={closeSoon}\n >\n <button\n type=\"button\"\n aria-haspopup=\"menu\"\n aria-expanded={open}\n aria-label=\"Show all tabs\"\n onClick={() => setOpen((o) => !o)}\n className=\"flex h-7 w-7 items-center justify-center rounded-full border border-border bg-surface text-foreground-secondary shadow-sm hover:text-foreground hover:bg-surface-raised data-[expanded=true]:text-foreground transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n data-expanded={open}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"h-4 w-4\" aria-hidden=\"true\">\n <circle cx=\"5\" cy=\"12\" r=\"1.6\" /><circle cx=\"12\" cy=\"12\" r=\"1.6\" /><circle cx=\"19\" cy=\"12\" r=\"1.6\" />\n </svg>\n </button>\n\n {open && (\n <div\n role=\"menu\"\n onMouseEnter={openNow}\n onMouseLeave={closeSoon}\n className={`absolute z-30 ${horizontal ? 'right-0 top-full mt-1.5' : 'left-full top-0 ml-1.5'} min-w-[184px] max-h-72 overflow-y-auto hidden-scrollbar rounded-lg border border-border bg-surface p-1 shadow-md animate-in fade-in-0 zoom-in-95`}\n >\n {tabs.map((t) => {\n const isActive = t.value === value\n return (\n <button\n key={t.value}\n type=\"button\"\n role=\"menuitem\"\n disabled={t.disabled}\n onClick={() => { select(t.value); setOpen(false) }}\n className={`flex w-full items-center gap-2 rounded-md px-2.5 py-1.5 text-left text-sm transition-colors disabled:opacity-40 disabled:cursor-not-allowed focus:outline-none focus-visible:ring-2 focus-visible:ring-accent ${isActive ? 'bg-surface-raised text-accent' : 'text-foreground-secondary hover:bg-surface-raised hover:text-foreground'}`}\n >\n {t.icon && <span className=\"flex-shrink-0 inline-flex h-4 w-4 items-center justify-center\">{t.icon}</span>}\n <span className=\"flex-1 truncate\">{t.label}</span>\n {isActive && (\n <svg viewBox=\"0 0 20 20\" fill=\"none\" className=\"h-4 w-4 flex-shrink-0 text-accent\" aria-hidden=\"true\">\n <path d=\"M4 10l4.5 4.5L16 6\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n )}\n </button>\n )\n })}\n </div>\n )}\n </div>\n )\n}\n\n// ── Trigger ─────────────────────────────────────────────────────────────────────\n\nexport interface TabsTriggerProps {\n /** Value that activates this tab and its matching `<Tabs.Panel>`. */\n value: string\n /** Optional leading icon. */\n icon?: React.ReactNode\n /** Optional trailing count badge (number or node). */\n badge?: React.ReactNode\n /** Render a × close button and call `onClose`. */\n closeable?: boolean\n onClose?: () => void\n disabled?: boolean\n /** Extra classes merged onto the trigger. */\n className?: string\n children: React.ReactNode\n}\n\nfunction TabsTrigger({ value, icon, badge, closeable, onClose, disabled, className = '', children }: TabsTriggerProps) {\n const { value: active, variant, size, orientation, indicatorId, reduced, registerTab, unregisterTab } = useTabsContext()\n const isActive = active === value\n const horizontal = orientation === 'horizontal'\n const sz = SIZE[size]\n\n // Self-register so the overflow menu can list this tab. Re-runs cheaply on\n // label/icon change; only mount/unmount bumps the registry version.\n useLayoutEffect(() => {\n registerTab(value, { label: children, icon, disabled })\n return () => unregisterTab(value)\n }, [value, children, icon, disabled, registerTab, unregisterTab])\n\n // Horizontal tabs centre their content and size to fit; vertical tabs fill\n // the rail width and left-align so icons/labels line up in a column.\n const layoutCls = horizontal ? 'justify-center flex-shrink-0' : 'justify-start w-full'\n const base = 'group/trigger relative inline-flex items-center whitespace-nowrap font-medium select-none transition-colors duration-150 focus:outline-none disabled:opacity-40 disabled:cursor-not-allowed'\n\n const variantCls =\n variant === 'segmented'\n ? `rounded-md ${isActive ? 'text-accent' : 'text-foreground-secondary hover:text-foreground'} focus-visible:text-accent`\n : variant === 'enclosed'\n ? `${horizontal ? 'rounded-t-md border border-b-0 -mb-px' : 'rounded-l-md border border-r-0 -mr-px'} ${isActive ? 'bg-surface border-border text-foreground' : 'border-transparent text-foreground-secondary hover:text-foreground hover:bg-surface-raised'} focus-visible:text-accent`\n : `${isActive ? 'text-accent' : 'text-foreground-secondary hover:text-foreground'} focus-visible:text-accent`\n\n const trigger = (\n <TabsPrimitive.Trigger\n value={value}\n disabled={disabled}\n className={[base, sz.trigger, layoutCls, closeable ? 'pr-8' : '', variantCls, className].filter(Boolean).join(' ')}\n >\n {/* Segmented lifted pill — slides between tabs. */}\n {variant === 'segmented' && isActive && (\n <motion.span\n layoutId={`${indicatorId}-seg`}\n className=\"absolute inset-0 rounded-md bg-surface shadow-sm\"\n transition={reduced ? { duration: 0 } : MARKER_TRANSITION}\n aria-hidden=\"true\"\n />\n )}\n\n <span className=\"relative z-[1] inline-flex items-center gap-2 min-w-0\">\n {icon && <span className={`flex-shrink-0 inline-flex items-center justify-center ${sz.icon}`}>{icon}</span>}\n <span className=\"truncate\">{children}</span>\n {badge != null && (\n // Unopinionated count chip: a subtle blue-tinted slate pill\n // with near-white text, consistent across active/inactive.\n // Both tokens are theme-relative, so it self-inverts in dark\n // mode (light pill + dark text) and always stays legible.\n <span className=\"ml-0.5 inline-flex h-[18px] min-w-[18px] items-center justify-center rounded-full bg-foreground-secondary px-1.5 text-[11px] font-semibold leading-none text-background\">\n {badge}\n </span>\n )}\n </span>\n\n {/* Underline marker — slides between tabs (horizontal: bottom edge;\n vertical: right edge of the rail). */}\n {variant === 'underline' && isActive && (\n <motion.span\n layoutId={`${indicatorId}-line`}\n className={horizontal ? 'absolute left-2 right-2 bottom-0 h-0.5 rounded-full bg-accent' : 'absolute top-1.5 bottom-1.5 right-0 w-0.5 rounded-full bg-accent'}\n transition={reduced ? { duration: 0 } : MARKER_TRANSITION}\n aria-hidden=\"true\"\n />\n )}\n </TabsPrimitive.Trigger>\n )\n\n if (!closeable) return trigger\n\n // The close control is a SIBLING of the trigger (a <button> nested inside a\n // <button> is invalid HTML and breaks keyboard activation).\n return (\n <span className={`relative inline-flex items-center ${horizontal ? 'flex-shrink-0' : 'w-full'}`}>\n {trigger}\n <button\n type=\"button\"\n aria-label=\"Close tab\"\n onClick={(e) => { e.stopPropagation(); onClose?.() }}\n className=\"absolute right-1.5 top-1/2 z-[2] -translate-y-1/2 inline-flex h-5 w-5 items-center justify-center rounded text-foreground-muted hover:text-status-error hover:bg-surface-raised transition-colors focus:outline-none focus-visible:ring-1 focus-visible:ring-accent\"\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 20 20\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M15 5L5 15M5 5l10 10\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n </span>\n )\n}\n\n// ── Add ──────────────────────────────────────────────────────────────────────\n\nexport interface TabsAddProps {\n onClick?: () => void\n 'aria-label'?: string\n className?: string\n}\n\nfunction TabsAdd({ onClick, 'aria-label': ariaLabel = 'Add tab', className = '' }: TabsAddProps) {\n const { size } = useTabsContext()\n return (\n <button\n type=\"button\"\n onClick={onClick}\n aria-label={ariaLabel}\n className={`flex-shrink-0 inline-flex items-center justify-center rounded-md text-foreground-muted hover:text-foreground hover:bg-surface-raised transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-accent ${SIZE[size].add} ${className}`.trim()}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} className=\"h-4 w-4\" aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 5v14M5 12h14\" />\n </svg>\n </button>\n )\n}\n\n// ── Panel ─────────────────────────────────────────────────────────────────────\n\nexport interface TabsPanelProps {\n /** Value of the tab this panel belongs to. */\n value: string\n /**\n * Keep the panel mounted when inactive (preserves scroll / form state).\n * Default `false` — panels mount lazily on first activation.\n */\n keepMounted?: boolean\n /** Extra classes merged onto the panel. */\n className?: string\n style?: React.CSSProperties\n children: React.ReactNode\n}\n\nfunction TabsPanel({ value, keepMounted, className = '', style, children }: TabsPanelProps) {\n return (\n <TabsPrimitive.Content\n value={value}\n forceMount={keepMounted || undefined}\n className={['min-w-0 flex-1 focus:outline-none data-[state=inactive]:hidden', className].filter(Boolean).join(' ')}\n style={style}\n >\n {children}\n </TabsPrimitive.Content>\n )\n}\n\n// ── Compound export ─────────────────────────────────────────────────────────────\n\nTabs.List = TabsList\nTabs.Trigger = TabsTrigger\nTabs.Panel = TabsPanel\nTabs.Add = TabsAdd\n\nexport default Tabs\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 /** Extra classes merged onto the tree root. */\n className?: string\n /** Inline style on the tree root. */\n style?: React.CSSProperties\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 className = '',\n style,\n}: TreeProps) {\n return (\n <div className={`p-1 w-full ${className}`.trim()} style={style}>\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, { createContext, useContext } from 'react'\nimport * as AccordionPrimitive from '@radix-ui/react-accordion'\n\n// ── Context (carries the chevron preference down to each item) ──────────────────\n\ntype AccordionVariant = 'separated' | 'contained'\nconst AccordionCtx = createContext<{ variant: AccordionVariant }>({ variant: 'separated' })\n\n// ── Root ────────────────────────────────────────────────────────────────────────\n\nexport interface AccordionProps {\n /** `AccordionItem` children. */\n children: React.ReactNode\n /**\n * `'single'` (default) allows one open panel at a time; `'multiple'` lets\n * any number be open together.\n */\n type?: 'single' | 'multiple'\n /** Uncontrolled initial open value(s). */\n defaultValue?: string | string[]\n /** Controlled open value(s). */\n value?: string | string[]\n /** Fires when the open set changes. */\n onValueChange?: (value: string | string[]) => void\n /** In `single` mode, allow the open item to be collapsed. Default `true`. */\n collapsible?: boolean\n /**\n * Visual style:\n * - `'separated'` (default) — each item is its own bordered card with gaps.\n * - `'contained'` — one bordered surface with divider lines between items.\n */\n variant?: AccordionVariant\n /** Extra classes merged onto the root. */\n className?: string\n style?: React.CSSProperties\n}\n\n/**\n * Vertically stacked, collapsible panels built on `@radix-ui/react-accordion`.\n * Radix handles open/close state, keyboard navigation (↑/↓/Home/End), and ARIA;\n * the content height animates via the shared `accordion-down` / `accordion-up`\n * keyframes (reduced-motion safe — the height var simply snaps).\n *\n * @example\n * ```tsx\n * <Accordion type=\"single\" defaultValue=\"a\" collapsible>\n * <Accordion.Item value=\"a\" title=\"What is included?\">\n * Everything in the Pro plan, plus priority support.\n * </Accordion.Item>\n * <Accordion.Item value=\"b\" title=\"Can I cancel anytime?\">\n * Yes — cancel from billing settings, no questions asked.\n * </Accordion.Item>\n * </Accordion>\n * ```\n */\nfunction Accordion({\n children,\n type = 'single',\n defaultValue,\n value,\n onValueChange,\n collapsible = true,\n variant = 'separated',\n className = '',\n style,\n}: AccordionProps) {\n // Radix types `single` and `multiple` roots differently; this component\n // exposes one ergonomic surface and forwards the right props per mode.\n const common = {\n className: [\n variant === 'contained'\n ? 'rounded-lg border border-border bg-surface overflow-hidden divide-y divide-border'\n : 'flex flex-col gap-2',\n className,\n ].filter(Boolean).join(' '),\n style,\n }\n\n const inner = <AccordionCtx.Provider value={{ variant }}>{children}</AccordionCtx.Provider>\n\n if (type === 'multiple') {\n return (\n <AccordionPrimitive.Root\n type=\"multiple\"\n defaultValue={defaultValue as string[] | undefined}\n value={value as string[] | undefined}\n onValueChange={onValueChange as ((v: string[]) => void) | undefined}\n {...common}\n >\n {inner}\n </AccordionPrimitive.Root>\n )\n }\n\n return (\n <AccordionPrimitive.Root\n type=\"single\"\n collapsible={collapsible}\n defaultValue={defaultValue as string | undefined}\n value={value as string | undefined}\n onValueChange={onValueChange as ((v: string) => void) | undefined}\n {...common}\n >\n {inner}\n </AccordionPrimitive.Root>\n )\n}\n\n// ── Item ──────────────────────────────────────────────────────────────────────────\n\nexport interface AccordionItemProps {\n /** Unique value identifying this panel (used for open state). */\n value: string\n /** Header content — the always-visible trigger label. */\n title: React.ReactNode\n /** Optional leading icon shown before the title. */\n icon?: React.ReactNode\n /** Panel body, revealed when open. */\n children: React.ReactNode\n /** Disable this item (header non-interactive, dimmed). */\n disabled?: boolean\n className?: string\n}\n\nconst Chevron = (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} aria-hidden=\"true\"\n className=\"h-4 w-4 flex-shrink-0 text-foreground-muted transition-transform duration-200 group-data-[state=open]/acc:rotate-180 group-data-[state=open]/acc:text-accent\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n)\n\nfunction AccordionItem({ value, title, icon, children, disabled, className = '' }: AccordionItemProps) {\n const { variant } = useContext(AccordionCtx)\n return (\n <AccordionPrimitive.Item\n value={value}\n disabled={disabled}\n className={[\n variant === 'separated' ? 'rounded-lg border border-border bg-surface overflow-hidden' : '',\n 'data-[disabled]:opacity-60',\n className,\n ].filter(Boolean).join(' ')}\n >\n <AccordionPrimitive.Header className=\"m-0\">\n <AccordionPrimitive.Trigger\n className=\"group/acc flex w-full items-center gap-3 px-4 py-3 text-left select-none\n text-sm font-medium text-foreground transition-colors\n hover:bg-surface-raised data-[state=open]:text-accent\n focus:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-inset\n disabled:cursor-not-allowed\"\n >\n {icon && <span className=\"flex h-5 w-5 flex-shrink-0 items-center justify-center text-foreground-muted group-data-[state=open]/acc:text-accent\">{icon}</span>}\n <span className=\"flex-1 min-w-0\">{title}</span>\n {Chevron}\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n <AccordionPrimitive.Content\n className=\"overflow-hidden data-[state=open]:animate-accordion-down data-[state=closed]:animate-accordion-up\"\n >\n <div className=\"px-4 pb-4 pt-0 text-sm text-foreground-secondary leading-relaxed\">\n {children}\n </div>\n </AccordionPrimitive.Content>\n </AccordionPrimitive.Item>\n )\n}\n\n// ── Compound export ─────────────────────────────────────────────────────────────\n\nAccordion.Item = AccordionItem\n\nexport default Accordion\n","import React, { useState } from 'react'\n\nexport interface BreadcrumbItem {\n /** Visible label. */\n label: React.ReactNode\n /** Link target. Omit on the current (last) crumb. */\n href?: string\n /** Optional leading icon. */\n icon?: React.ReactNode\n /** Click handler (router navigation). */\n onClick?: React.MouseEventHandler\n}\n\nexport interface BreadcrumbsProps {\n /** Ordered trail, root → current. The last item renders as the current page. */\n items: BreadcrumbItem[]\n /** Separator between crumbs. Default a chevron. */\n separator?: React.ReactNode\n /**\n * Collapse the middle of long trails into an expandable ellipsis once the\n * count exceeds this. The first and last crumb always stay visible. Set `0`\n * to never collapse. Default `0`.\n */\n maxItems?: number\n /** Accessible label for the nav landmark. Default `'Breadcrumb'`. */\n 'aria-label'?: string\n className?: string\n style?: React.CSSProperties\n}\n\nconst DefaultSeparator = (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} aria-hidden=\"true\" className=\"h-3.5 w-3.5 text-foreground-muted\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 5l7 7-7 7\" />\n </svg>\n)\n\nconst crumbBase = 'inline-flex items-center gap-1.5 rounded px-1 -mx-1 text-sm transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-accent'\n\nfunction Crumb({ item, current }: { item: BreadcrumbItem; current: boolean }) {\n const inner = (\n <>\n {item.icon && <span className=\"flex h-4 w-4 flex-shrink-0 items-center justify-center\">{item.icon}</span>}\n <span className=\"truncate\">{item.label}</span>\n </>\n )\n if (current) {\n return (\n <span aria-current=\"page\" className={`${crumbBase} font-medium text-foreground max-w-[16rem]`}>\n {inner}\n </span>\n )\n }\n if (item.href || item.onClick) {\n return (\n <a href={item.href} onClick={item.onClick} className={`${crumbBase} text-foreground-secondary hover:text-foreground max-w-[12rem]`}>\n {inner}\n </a>\n )\n }\n return <span className={`${crumbBase} text-foreground-secondary max-w-[12rem]`}>{inner}</span>\n}\n\n/**\n * A breadcrumb trail. Renders a `<nav><ol>` of crumbs separated by a chevron;\n * the last crumb is the current page (`aria-current=\"page\"`, not a link). Long\n * trails can collapse their middle into a clickable ellipsis via `maxItems`.\n *\n * @example\n * ```tsx\n * <Breadcrumbs\n * items={[\n * { label: 'Home', href: '/' },\n * { label: 'Fleet', href: '/fleet' },\n * { label: 'Aurora' },\n * ]}\n * />\n * ```\n */\nexport default function Breadcrumbs({\n items,\n separator = DefaultSeparator,\n maxItems = 0,\n 'aria-label': ariaLabel = 'Breadcrumb',\n className = '',\n style,\n}: BreadcrumbsProps) {\n const [expanded, setExpanded] = useState(false)\n\n const shouldCollapse = maxItems > 0 && items.length > maxItems && !expanded\n // Keep the first crumb + the last (maxItems - 1) crumbs; ellipsis stands in\n // for everything between.\n const visible: Array<{ item: BreadcrumbItem; index: number } | 'ellipsis'> = []\n if (shouldCollapse) {\n const tailCount = Math.max(1, maxItems - 1)\n visible.push({ item: items[0], index: 0 })\n visible.push('ellipsis')\n for (let i = items.length - tailCount; i < items.length; i++) visible.push({ item: items[i], index: i })\n } else {\n items.forEach((item, index) => visible.push({ item, index }))\n }\n\n return (\n <nav aria-label={ariaLabel} className={['min-w-0', className].filter(Boolean).join(' ')} style={style}>\n <ol className=\"flex items-center gap-1.5 flex-nowrap min-w-0\">\n {visible.map((entry, i) => {\n const isLast = i === visible.length - 1\n return (\n <li key={entry === 'ellipsis' ? 'ellipsis' : entry.index} className=\"flex items-center gap-1.5 min-w-0\">\n {entry === 'ellipsis' ? (\n <button\n type=\"button\"\n onClick={() => setExpanded(true)}\n aria-label=\"Show hidden breadcrumbs\"\n className=\"inline-flex h-6 items-center rounded px-1.5 text-sm text-foreground-secondary hover:bg-surface-raised hover:text-foreground focus:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n >\n …\n </button>\n ) : (\n <Crumb item={entry.item} current={entry.index === items.length - 1} />\n )}\n {!isLast && <span className=\"flex-shrink-0\">{separator}</span>}\n </li>\n )\n })}\n </ol>\n </nav>\n )\n}\n","import React from 'react'\n\nexport type BadgeTone = 'neutral' | 'accent' | 'success' | 'warning' | 'error' | 'info'\nexport type BadgeVariant = 'solid' | 'soft' | 'outline'\nexport type BadgeSize = 'sm' | 'md'\n\nexport interface BadgeProps {\n /** Pill label (label mode) when no `count` / `dot` is given. */\n children?: React.ReactNode\n /** Semantic colour. Default `'neutral'`. */\n tone?: BadgeTone\n /** Fill style. Default `'soft'`. */\n variant?: BadgeVariant\n /** Size preset. Default `'md'`. */\n size?: BadgeSize\n /** Optional leading icon (label mode). */\n icon?: React.ReactNode\n /**\n * Indicator mode — a numeric counter. With `children` it overlays the\n * top-right corner of the wrapped element; without, it renders inline.\n */\n count?: number\n /** Cap the displayed count (e.g. `99+`). Default `99`. */\n max?: number\n /** Render a bare dot indicator (no number). Overrides `count` display. */\n dot?: boolean\n /** Show the indicator even when `count` is 0. Default `false`. */\n showZero?: boolean\n className?: string\n style?: React.CSSProperties\n}\n\n// tone → [solid, soft, outline] class sets\nconst TONE: Record<BadgeTone, { solid: string; soft: string; outline: string; dot: string }> = {\n neutral: {\n solid: 'bg-foreground-secondary text-background',\n soft: 'bg-surface-raised text-foreground-secondary',\n outline: 'border border-border text-foreground-secondary',\n dot: 'bg-foreground-secondary',\n },\n accent: {\n solid: 'bg-accent text-accent-fg',\n soft: 'bg-accent/10 text-accent',\n outline: 'border border-accent text-accent',\n dot: 'bg-accent',\n },\n success: {\n solid: 'bg-status-success text-white',\n soft: 'bg-status-success/12 text-status-success',\n outline: 'border border-status-success text-status-success',\n dot: 'bg-status-success',\n },\n warning: {\n solid: 'bg-status-warning text-white',\n soft: 'bg-status-warning/15 text-status-warning',\n outline: 'border border-status-warning text-status-warning',\n dot: 'bg-status-warning',\n },\n error: {\n solid: 'bg-status-error text-white',\n soft: 'bg-status-error/12 text-status-error',\n outline: 'border border-status-error text-status-error',\n dot: 'bg-status-error',\n },\n info: {\n solid: 'bg-status-info text-white',\n soft: 'bg-status-info/12 text-status-info',\n outline: 'border border-status-info text-status-info',\n dot: 'bg-status-info',\n },\n}\n\nconst SIZE: Record<BadgeSize, string> = {\n sm: 'h-[18px] px-1.5 text-[11px] gap-1 rounded-full',\n md: 'h-5 px-2 text-xs gap-1 rounded-full',\n}\n\n/**\n * A small status / count indicator. Three uses:\n *\n * 1. **Label pill** — `<Badge tone=\"success\">Active</Badge>`.\n * 2. **Inline count** — `<Badge count={5} tone=\"error\" />`.\n * 3. **Overlay** — wrap an element to anchor a count/dot to its top-right:\n * `<Badge count={3} tone=\"error\"><IconButton … /></Badge>`.\n *\n * @example\n * <Badge tone=\"accent\" variant=\"soft\">Beta</Badge>\n * <Badge dot tone=\"success\"><Avatar … /></Badge>\n */\nexport default function Badge({\n children,\n tone = 'neutral',\n variant = 'soft',\n size = 'md',\n icon,\n count,\n max = 99,\n dot = false,\n showZero = false,\n className = '',\n style,\n}: BadgeProps) {\n const isIndicator = dot || count != null\n const hidden = !dot && count != null && count === 0 && !showZero\n const display = count != null && count > max ? `${max}+` : count\n\n // ── Label pill (no indicator props) ──────────────────────────────────────\n if (!isIndicator) {\n return (\n <span\n className={[\n 'inline-flex items-center font-medium select-none whitespace-nowrap leading-none',\n SIZE[size],\n TONE[tone][variant],\n className,\n ].filter(Boolean).join(' ')}\n style={style}\n >\n {icon && <span className=\"flex h-3.5 w-3.5 items-center justify-center\">{icon}</span>}\n {children}\n </span>\n )\n }\n\n // ── Indicator (dot or count) ─────────────────────────────────────────────\n const indicator = dot ? (\n <span\n className={['inline-block rounded-full', size === 'sm' ? 'h-2 w-2' : 'h-2.5 w-2.5', TONE[tone].dot, className].filter(Boolean).join(' ')}\n style={children ? undefined : style}\n aria-hidden={children ? true : undefined}\n />\n ) : (\n <span\n className={[\n 'inline-flex items-center justify-center rounded-full font-semibold leading-none tabular-nums',\n size === 'sm' ? 'h-4 min-w-4 px-1 text-[10px]' : 'h-[18px] min-w-[18px] px-1.5 text-[11px]',\n TONE[tone].solid,\n className,\n ].filter(Boolean).join(' ')}\n style={children ? undefined : style}\n >\n {display}\n </span>\n )\n\n // Inline (no wrapped child).\n if (!children) return hidden ? null : indicator\n\n // Overlay anchored to the child's top-right.\n return (\n <span className=\"relative inline-flex\" style={style}>\n {children}\n {!hidden && (\n <span className=\"absolute -top-1 -right-1 flex\">{indicator}</span>\n )}\n </span>\n )\n}\n","import React from 'react'\n\nexport type KbdSize = 'sm' | 'md'\n\nexport interface KbdProps {\n /** A single key's label when `keys` is not used. */\n children?: React.ReactNode\n /**\n * A key combination — each entry renders as its own key cap, joined by\n * `separator`. e.g. `['Ctrl', 'K']` → `Ctrl + K`.\n */\n keys?: string[]\n /** Joiner between caps in a combo. Default `'+'`. */\n separator?: React.ReactNode\n /** Size preset. Default `'md'`. */\n size?: KbdSize\n className?: string\n style?: React.CSSProperties\n}\n\nconst SIZE: Record<KbdSize, string> = {\n sm: 'h-5 min-w-[20px] px-1.5 text-[11px]',\n md: 'h-6 min-w-[24px] px-2 text-xs',\n}\n\nconst cap =\n 'inline-flex items-center justify-center rounded-md border border-border border-b-2 ' +\n 'bg-surface-raised font-medium text-foreground-secondary leading-none select-none ' +\n 'font-sans shadow-sm'\n\n/**\n * Renders keyboard keys as styled caps — a single key via `children`, or a\n * combination via `keys` (each rendered as its own cap, joined by `separator`).\n *\n * @example\n * <Kbd>Esc</Kbd>\n * <Kbd keys={['Ctrl', 'K']} />\n * <Kbd keys={['⌘', '⇧', 'P']} size=\"sm\" />\n */\nexport default function Kbd({\n children,\n keys,\n separator = '+',\n size = 'md',\n className = '',\n style,\n}: KbdProps) {\n if (keys && keys.length > 0) {\n return (\n <span className={['inline-flex items-center gap-1', className].filter(Boolean).join(' ')} style={style}>\n {keys.map((k, i) => (\n <React.Fragment key={`${k}-${i}`}>\n {i > 0 && <span className=\"text-foreground-muted text-xs select-none\">{separator}</span>}\n <kbd className={[cap, SIZE[size]].join(' ')}>{k}</kbd>\n </React.Fragment>\n ))}\n </span>\n )\n }\n\n return (\n <kbd className={[cap, SIZE[size], className].filter(Boolean).join(' ')} style={style}>\n {children}\n </kbd>\n )\n}\n","import React from 'react'\n\ntype Pad = 'none' | 'sm' | 'md' | 'lg'\nconst PAD: Record<Pad, string> = { none: '', sm: 'p-3', md: 'p-5', lg: 'p-6' }\n\n// ── Root ────────────────────────────────────────────────────────────────────────\n\nexport interface CardProps {\n children: React.ReactNode\n /**\n * Make the whole card a single interactive surface: hover lift, pointer\n * cursor, focus ring, and (with `onClick`) button semantics + Enter/Space\n * activation.\n */\n interactive?: boolean\n /** Click handler. With `interactive`, the card becomes keyboard-activatable. */\n onClick?: React.MouseEventHandler\n /**\n * Padding on the root. Leave `'none'` (default) when composing with\n * `Card.Header` / `Card.Body` / `Card.Footer` (they bring their own); set a\n * value for a quick flat card.\n */\n padding?: Pad\n /** Drop the border + shadow for a flat, borderless surface. */\n flush?: boolean\n className?: string\n style?: React.CSSProperties\n}\n\n/**\n * A surface container with optional header / media / body / footer sections.\n *\n * @example Composed\n * ```tsx\n * <Card>\n * <Card.Media><img src={cover} alt=\"\" /></Card.Media>\n * <Card.Header title=\"Aurora\" subtitle=\"Bulk carrier\" action={<IconButton … />} />\n * <Card.Body>Last seen off the North Sea, en route to Rotterdam.</Card.Body>\n * <Card.Footer><Button content=\"Track\" /></Card.Footer>\n * </Card>\n * ```\n *\n * @example Quick flat card\n * ```tsx\n * <Card padding=\"md\" interactive onClick={open}>Click me</Card>\n * ```\n */\nfunction Card({ children, interactive, onClick, padding = 'none', flush, className = '', style }: CardProps) {\n const base = [\n 'rounded-xl overflow-hidden bg-surface',\n flush ? '' : 'border border-border shadow-sm',\n PAD[padding],\n interactive\n ? 'transition-[transform,box-shadow] duration-200 ease-out hover:-translate-y-0.5 hover:shadow-md ' +\n 'cursor-pointer focus:outline-none focus-visible:ring-2 focus-visible:ring-accent'\n : '',\n className,\n ].filter(Boolean).join(' ')\n\n if (interactive && onClick) {\n return (\n <div\n role=\"button\"\n tabIndex={0}\n onClick={onClick}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n onClick(e as unknown as React.MouseEvent)\n }\n }}\n className={base}\n style={style}\n >\n {children}\n </div>\n )\n }\n\n return (\n <div onClick={onClick} className={base} style={style}>\n {children}\n </div>\n )\n}\n\n// ── Media (full-bleed image / visual slot) ──────────────────────────────────────\n\nexport interface CardMediaProps {\n children: React.ReactNode\n className?: string\n}\nfunction CardMedia({ children, className = '' }: CardMediaProps) {\n return <div className={['[&>img]:block [&>img]:w-full [&>img]:object-cover', className].filter(Boolean).join(' ')}>{children}</div>\n}\n\n// ── Header (title + subtitle + trailing action) ─────────────────────────────────\n\nexport interface CardHeaderProps {\n title?: React.ReactNode\n subtitle?: React.ReactNode\n /** Trailing slot — actions, menu, badge. */\n action?: React.ReactNode\n /** Leading slot — avatar / icon. */\n avatar?: React.ReactNode\n children?: React.ReactNode\n className?: string\n}\nfunction CardHeader({ title, subtitle, action, avatar, children, className = '' }: CardHeaderProps) {\n return (\n <div className={['flex items-start gap-3 px-5 pt-5', children ? 'pb-0' : 'pb-3', className].filter(Boolean).join(' ')}>\n {avatar && <div className=\"flex-shrink-0\">{avatar}</div>}\n <div className=\"min-w-0 flex-1\">\n {title && <div className=\"text-sm font-semibold text-foreground leading-snug\">{title}</div>}\n {subtitle && <div className=\"text-xs text-foreground-muted leading-snug mt-0.5\">{subtitle}</div>}\n {children}\n </div>\n {action && <div className=\"flex-shrink-0 -mt-1 -mr-1\">{action}</div>}\n </div>\n )\n}\n\n// ── Body ────────────────────────────────────────────────────────────────────────\n\nexport interface CardBodyProps {\n children: React.ReactNode\n className?: string\n}\nfunction CardBody({ children, className = '' }: CardBodyProps) {\n return <div className={['px-5 py-4 text-sm text-foreground-secondary leading-relaxed', className].filter(Boolean).join(' ')}>{children}</div>\n}\n\n// ── Footer ──────────────────────────────────────────────────────────────────────\n\nexport interface CardFooterProps {\n children: React.ReactNode\n /** Drop the top divider. */\n noDivider?: boolean\n className?: string\n}\nfunction CardFooter({ children, noDivider, className = '' }: CardFooterProps) {\n return (\n <div className={['flex items-center gap-2 px-5 py-3', noDivider ? '' : 'border-t border-border', className].filter(Boolean).join(' ')}>\n {children}\n </div>\n )\n}\n\n// ── Compound export ─────────────────────────────────────────────────────────────\n\nCard.Media = CardMedia\nCard.Header = CardHeader\nCard.Body = CardBody\nCard.Footer = CardFooter\n\nexport default Card\n","import React, { useCallback, useEffect, useRef, useState } from 'react'\n\nexport interface CardCarouselProps {\n /** The slides — typically `Card`s. Each becomes a snap target. */\n children: React.ReactNode\n /** Width of each slide. Number → px. Default `280`. */\n itemWidth?: number | string\n /** Gap between slides in px. Default `16`. */\n gap?: number\n /** Show prev / next arrow buttons. Default `true`. */\n showArrows?: boolean\n /** Show position dots. Default `false`. */\n showDots?: boolean\n /** Accessible label for the region. Default `'Carousel'`. */\n 'aria-label'?: string\n className?: string\n style?: React.CSSProperties\n}\n\nconst Arrow = ({ dir }: { dir: 'left' | 'right' }) => (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} aria-hidden=\"true\" className=\"h-5 w-5\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d={dir === 'left' ? 'M15 19l-7-7 7-7' : 'M9 5l7 7-7 7'} />\n </svg>\n)\n\n/**\n * A horizontal, scroll-snap carousel for cards. Native scrolling drives it\n * (trackpad / touch / wheel), with optional arrow buttons and position dots.\n * Arrows disable at the ends; the scrollbar is hidden but scrolling is intact.\n *\n * @example\n * ```tsx\n * <CardCarousel itemWidth={300} showDots>\n * {vessels.map((v) => <Card key={v.id}>…</Card>)}\n * </CardCarousel>\n * ```\n */\nexport default function CardCarousel({\n children,\n itemWidth = 280,\n gap = 16,\n showArrows = true,\n showDots = false,\n 'aria-label': ariaLabel = 'Carousel',\n className = '',\n style,\n}: CardCarouselProps) {\n const scrollerRef = useRef<HTMLDivElement>(null)\n const slides = React.Children.toArray(children)\n const [active, setActive] = useState(0)\n const [atStart, setAtStart] = useState(true)\n const [atEnd, setAtEnd] = useState(false)\n const width = typeof itemWidth === 'number' ? `${itemWidth}px` : itemWidth\n\n const update = useCallback(() => {\n const el = scrollerRef.current\n if (!el) return\n const step = el.clientWidth // fall back; recomputed below per-slide\n void step\n setAtStart(el.scrollLeft <= 1)\n setAtEnd(el.scrollLeft + el.clientWidth >= el.scrollWidth - 1)\n // Active index = nearest slide to the current scroll offset.\n const first = el.firstElementChild as HTMLElement | null\n const slideW = first ? first.getBoundingClientRect().width + gap : el.clientWidth\n setActive(Math.round(el.scrollLeft / slideW))\n }, [gap])\n\n useEffect(() => {\n update()\n const el = scrollerRef.current\n if (!el) return\n el.addEventListener('scroll', update, { passive: true })\n window.addEventListener('resize', update)\n return () => {\n el.removeEventListener('scroll', update)\n window.removeEventListener('resize', update)\n }\n }, [update])\n\n const scrollByDir = (dir: -1 | 1) => {\n const el = scrollerRef.current\n if (!el) return\n const first = el.firstElementChild as HTMLElement | null\n const slideW = first ? first.getBoundingClientRect().width + gap : el.clientWidth\n el.scrollBy({ left: dir * slideW, behavior: 'smooth' })\n }\n\n const scrollTo = (i: number) => {\n const el = scrollerRef.current\n if (!el) return\n const first = el.firstElementChild as HTMLElement | null\n const slideW = first ? first.getBoundingClientRect().width + gap : el.clientWidth\n el.scrollTo({ left: i * slideW, behavior: 'smooth' })\n }\n\n const arrowBtn =\n 'absolute top-1/2 -translate-y-1/2 z-10 flex h-9 w-9 items-center justify-center rounded-full ' +\n 'border border-border bg-surface text-foreground-secondary shadow-md transition ' +\n 'hover:text-foreground hover:bg-surface-raised disabled:opacity-0 disabled:pointer-events-none ' +\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-accent'\n\n return (\n <section aria-label={ariaLabel} className={['relative', className].filter(Boolean).join(' ')} style={style}>\n {showArrows && (\n <button type=\"button\" aria-label=\"Previous\" onClick={() => scrollByDir(-1)} disabled={atStart} className={`${arrowBtn} left-1`}>\n <Arrow dir=\"left\" />\n </button>\n )}\n\n <div\n ref={scrollerRef}\n className=\"flex overflow-x-auto snap-x snap-mandatory hidden-scrollbar scroll-smooth\"\n style={{ gap }}\n >\n {slides.map((slide, i) => (\n <div key={i} className=\"snap-start flex-shrink-0\" style={{ width }}>\n {slide}\n </div>\n ))}\n </div>\n\n {showArrows && (\n <button type=\"button\" aria-label=\"Next\" onClick={() => scrollByDir(1)} disabled={atEnd} className={`${arrowBtn} right-1`}>\n <Arrow dir=\"right\" />\n </button>\n )}\n\n {showDots && slides.length > 1 && (\n <div className=\"mt-3 flex items-center justify-center gap-1.5\">\n {slides.map((_, i) => (\n <button\n key={i}\n type=\"button\"\n aria-label={`Go to slide ${i + 1}`}\n aria-current={i === active}\n onClick={() => scrollTo(i)}\n className={[\n 'h-1.5 rounded-full transition-all duration-200 focus:outline-none focus-visible:ring-2 focus-visible:ring-accent',\n i === active ? 'w-5 bg-accent' : 'w-1.5 bg-border hover:bg-foreground-muted',\n ].join(' ')}\n />\n ))}\n </div>\n )}\n </section>\n )\n}\n","import React from 'react'\n\nexport type StatisticSize = 'sm' | 'md' | 'lg'\nexport type DeltaDirection = 'up' | 'down' | 'neutral'\n\nexport interface StatisticDelta {\n /** The change to show beside the arrow, e.g. `'12%'` or `+340`. */\n value: React.ReactNode\n /** Arrow + colour direction. Default inferred `'neutral'`. */\n direction?: DeltaDirection\n /**\n * Whether an `up` direction is a good thing (green) or bad (red). For\n * metrics like churn or latency, set `false` so a rise reads red.\n * Default `true`.\n */\n positiveIsGood?: boolean\n /** Optional trailing context, e.g. `'vs last month'`. */\n label?: React.ReactNode\n}\n\nexport interface StatisticProps {\n /** Caption above the value. */\n label: React.ReactNode\n /** The metric itself. */\n value: React.ReactNode\n /** Rendered before the value (currency symbol, etc.). */\n prefix?: React.ReactNode\n /** Rendered after the value (unit, %). */\n suffix?: React.ReactNode\n /** Leading icon in a tinted square. */\n icon?: React.ReactNode\n /** Trend indicator under the value. */\n delta?: StatisticDelta\n /** Secondary help text under everything. */\n helpText?: React.ReactNode\n /** Size preset. Default `'md'`. */\n size?: StatisticSize\n /** Text alignment. Default `'left'`. */\n align?: 'left' | 'center'\n className?: string\n style?: React.CSSProperties\n}\n\nconst VALUE_SIZE: Record<StatisticSize, string> = {\n sm: 'text-xl',\n md: 'text-3xl',\n lg: 'text-4xl',\n}\n\nconst TONE: Record<'good' | 'bad' | 'neutral', string> = {\n good: 'text-status-success',\n bad: 'text-status-error',\n neutral: 'text-foreground-muted',\n}\n\nconst ArrowUp = (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2.2} aria-hidden=\"true\" className=\"h-3.5 w-3.5\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 19V5M5 12l7-7 7 7\" />\n </svg>\n)\nconst ArrowDown = (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2.2} aria-hidden=\"true\" className=\"h-3.5 w-3.5\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 5v14M5 12l7 7 7-7\" />\n </svg>\n)\n\n/**\n * A single metric: caption, value (with optional prefix/suffix and icon), and an\n * optional trend delta whose colour follows direction — flipped for metrics\n * where a rise is bad via `positiveIsGood: false`.\n *\n * @example\n * <Statistic label=\"Revenue\" value=\"48,210\" prefix=\"$\" delta={{ value: '12%', direction: 'up', label: 'vs last month' }} />\n * <Statistic label=\"Churn\" value=\"3.1\" suffix=\"%\" delta={{ value: '0.4pt', direction: 'up', positiveIsGood: false }} />\n */\nexport default function Statistic({\n label,\n value,\n prefix,\n suffix,\n icon,\n delta,\n helpText,\n size = 'md',\n align = 'left',\n className = '',\n style,\n}: StatisticProps) {\n const dir = delta?.direction ?? 'neutral'\n const positiveIsGood = delta?.positiveIsGood ?? true\n const deltaTone: 'good' | 'bad' | 'neutral' =\n dir === 'neutral' ? 'neutral' : (dir === 'up') === positiveIsGood ? 'good' : 'bad'\n\n return (\n <div\n className={['flex gap-3', align === 'center' ? 'flex-col items-center text-center' : 'items-start', className].filter(Boolean).join(' ')}\n style={style}\n >\n {icon && align === 'left' && (\n <span className=\"flex h-10 w-10 flex-shrink-0 items-center justify-center rounded-lg bg-accent/10 text-accent\">\n <span className=\"h-5 w-5 inline-flex items-center justify-center\">{icon}</span>\n </span>\n )}\n <div className=\"min-w-0\">\n <div className=\"text-xs font-medium uppercase tracking-wide text-foreground-muted\">{label}</div>\n <div className={`mt-1 flex items-baseline gap-0.5 font-semibold text-foreground tabular-nums ${VALUE_SIZE[size]} ${align === 'center' ? 'justify-center' : ''}`}>\n {prefix && <span className=\"text-foreground-muted text-[0.6em] font-medium self-center\">{prefix}</span>}\n <span className=\"leading-none\">{value}</span>\n {suffix && <span className=\"text-foreground-muted text-[0.5em] font-medium self-center\">{suffix}</span>}\n </div>\n {delta && (\n <div className={`mt-1.5 flex items-center gap-1 text-sm font-medium ${align === 'center' ? 'justify-center' : ''} ${TONE[deltaTone]}`}>\n {dir === 'up' ? ArrowUp : dir === 'down' ? ArrowDown : null}\n <span>{delta.value}</span>\n {delta.label && <span className=\"text-foreground-muted font-normal\">{delta.label}</span>}\n </div>\n )}\n {helpText && <div className=\"mt-1 text-xs text-foreground-muted\">{helpText}</div>}\n </div>\n </div>\n )\n}\n","import React, { useState } from 'react'\nimport { AnimatePresence, motion, useReducedMotion } from 'framer-motion'\n\nexport type FABPosition = 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left'\nexport type FABSize = 'md' | 'lg'\nexport type FABTone = 'accent' | 'neutral'\n\nexport interface FABAction {\n icon: React.ReactNode\n /** Accessible label + the text shown on the action's pill. */\n label: string\n onClick?: React.MouseEventHandler\n}\n\nexport interface FABProps {\n /** Main button icon. */\n icon: React.ReactNode\n /** Accessible label for the main button (required — it's icon-only). */\n label: string\n /** Click handler. Ignored when `actions` is provided (the button toggles the dial). */\n onClick?: React.MouseEventHandler\n /** Speed-dial sub-actions. When set, the main button opens/closes the dial. */\n actions?: FABAction[]\n /** Corner placement. Default `'bottom-right'`. */\n position?: FABPosition\n /** Size preset. Default `'lg'`. */\n size?: FABSize\n /** Colour. Default `'accent'`. */\n tone?: FABTone\n /**\n * `position: fixed` to the viewport (default) or `absolute` to the nearest\n * positioned ancestor — set `false` to anchor inside a `relative` container.\n */\n fixed?: boolean\n className?: string\n style?: React.CSSProperties\n}\n\nconst POS: Record<FABPosition, string> = {\n 'bottom-right': 'bottom-6 right-6 items-end',\n 'bottom-left': 'bottom-6 left-6 items-start',\n 'top-right': 'top-6 right-6 items-end',\n 'top-left': 'top-6 left-6 items-start',\n}\n\nconst SIZE: Record<FABSize, string> = {\n md: 'h-12 w-12',\n lg: 'h-14 w-14',\n}\n\nconst TONE: Record<FABTone, string> = {\n accent: 'bg-accent text-accent-fg hover:bg-accent-hover',\n neutral: 'bg-foreground-secondary text-background hover:opacity-90',\n}\n\n/**\n * A floating action button. On its own it's a single round action; given\n * `actions`, it becomes a speed dial that expands a labelled stack on click.\n * Positions to a viewport corner by default (or a relative container with\n * `fixed={false}`).\n *\n * @example Single\n * <FAB icon={<PlusIcon />} label=\"New record\" onClick={create} />\n *\n * @example Speed dial\n * <FAB icon={<PlusIcon />} label=\"Create\" actions={[\n * { icon: <FileIcon />, label: 'Document', onClick: newDoc },\n * { icon: <FolderIcon />, label: 'Folder', onClick: newFolder },\n * ]} />\n */\nexport default function FAB({\n icon,\n label,\n onClick,\n actions,\n position = 'bottom-right',\n size = 'lg',\n tone = 'accent',\n fixed = true,\n className = '',\n style,\n}: FABProps) {\n const [open, setOpen] = useState(false)\n const reduced = useReducedMotion()\n const hasDial = !!actions && actions.length > 0\n const bottom = position.startsWith('bottom')\n const alignRight = position.endsWith('right')\n\n const dial = hasDial && (\n <AnimatePresence>\n {open && (\n <motion.ul\n className={`flex flex-col gap-3 ${bottom ? 'mb-3' : 'mt-3 order-last'} ${alignRight ? 'items-end' : 'items-start'}`}\n initial=\"hidden\"\n animate=\"show\"\n exit=\"hidden\"\n variants={{ show: { transition: { staggerChildren: reduced ? 0 : 0.04, staggerDirection: bottom ? -1 : 1 } } }}\n >\n {actions!.map((a, i) => (\n <motion.li\n key={i}\n className={`flex items-center gap-2 ${alignRight ? 'flex-row' : 'flex-row-reverse'}`}\n variants={{\n hidden: { opacity: 0, y: reduced ? 0 : bottom ? 8 : -8, scale: reduced ? 1 : 0.9 },\n show: { opacity: 1, y: 0, scale: 1 },\n }}\n >\n <span className=\"rounded-md bg-surface px-2 py-1 text-xs font-medium text-foreground shadow-md border border-border whitespace-nowrap\">\n {a.label}\n </span>\n <button\n type=\"button\"\n aria-label={a.label}\n onClick={(e) => { a.onClick?.(e); setOpen(false) }}\n className=\"flex h-11 w-11 items-center justify-center rounded-full bg-surface text-foreground-secondary shadow-lg border border-border transition hover:text-foreground hover:bg-surface-raised focus:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n >\n <span className=\"h-5 w-5 inline-flex items-center justify-center\">{a.icon}</span>\n </button>\n </motion.li>\n ))}\n </motion.ul>\n )}\n </AnimatePresence>\n )\n\n return (\n <div\n className={[fixed ? 'fixed' : 'absolute', 'z-40 flex flex-col', POS[position], className].filter(Boolean).join(' ')}\n style={style}\n >\n {bottom && dial}\n <button\n type=\"button\"\n aria-label={label}\n aria-expanded={hasDial ? open : undefined}\n onClick={(e) => (hasDial ? setOpen((o) => !o) : onClick?.(e))}\n className={[\n 'flex items-center justify-center rounded-full shadow-lg transition-[background-color,transform] duration-200',\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2',\n SIZE[size],\n TONE[tone],\n hasDial && open ? 'rotate-45' : '',\n ].filter(Boolean).join(' ')}\n >\n <span className=\"h-6 w-6 inline-flex items-center justify-center\">{icon}</span>\n </button>\n {!bottom && dial}\n </div>\n )\n}\n","import React, { useState } from 'react'\nimport * as Popover from '@radix-ui/react-popover'\nimport Button from '../inputs/Button'\n\nexport type PopConfirmTone = 'default' | 'danger'\n\nexport interface PopConfirmProps {\n /** The trigger element. Cloned as the popover anchor (rendered `asChild`). */\n children: React.ReactElement\n /** The confirmation question / heading. */\n title: React.ReactNode\n /** Optional secondary line under the title. */\n description?: React.ReactNode\n /** Runs on confirm. If it returns a promise, the confirm button shows a loading state until it settles. */\n onConfirm?: () => void | Promise<void>\n /** Runs on cancel / dismiss. */\n onCancel?: () => void\n /** Confirm button label. Default `'Confirm'`. */\n confirmText?: React.ReactNode\n /** Cancel button label. Default `'Cancel'`. */\n cancelText?: React.ReactNode\n /** `'danger'` colours the confirm button red. Default `'default'`. */\n tone?: PopConfirmTone\n /** Leading icon shown beside the title. */\n icon?: React.ReactNode\n /** Side of the trigger to open on. Default `'top'`. */\n side?: 'top' | 'right' | 'bottom' | 'left'\n /** Controlled open state (optional). */\n open?: boolean\n onOpenChange?: (open: boolean) => void\n className?: string\n}\n\n/**\n * A lightweight confirm prompt anchored to its trigger, on Radix Popover. Use it\n * for in-place \"are you sure?\" gates (delete, archive) instead of a full Modal.\n * An async `onConfirm` keeps the confirm button in a loading state until it\n * resolves, then closes.\n *\n * @example\n * ```tsx\n * <PopConfirm title=\"Delete this vessel?\" tone=\"danger\" confirmText=\"Delete\" onConfirm={remove}>\n * <Button content=\"Delete\" variant=\"danger\" />\n * </PopConfirm>\n * ```\n */\nexport default function PopConfirm({\n children,\n title,\n description,\n onConfirm,\n onCancel,\n confirmText = 'Confirm',\n cancelText = 'Cancel',\n tone = 'default',\n icon,\n side = 'top',\n open,\n onOpenChange,\n className = '',\n}: PopConfirmProps) {\n const [uncontrolledOpen, setUncontrolledOpen] = useState(false)\n const [loading, setLoading] = useState(false)\n const isOpen = open ?? uncontrolledOpen\n\n const setOpen = (next: boolean) => {\n onOpenChange?.(next)\n if (open === undefined) setUncontrolledOpen(next)\n }\n\n const handleConfirm = async () => {\n try {\n setLoading(true)\n await onConfirm?.()\n setOpen(false)\n } finally {\n setLoading(false)\n }\n }\n\n const handleCancel = () => {\n onCancel?.()\n setOpen(false)\n }\n\n return (\n <Popover.Root open={isOpen} onOpenChange={(o) => (o ? setOpen(true) : handleCancel())}>\n <Popover.Trigger asChild>{children}</Popover.Trigger>\n <Popover.Portal>\n <Popover.Content\n side={side}\n sideOffset={8}\n collisionPadding={12}\n className={[\n 'z-[400] w-64 rounded-lg border border-border bg-surface p-3.5 shadow-lg',\n 'data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95',\n 'data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95',\n className,\n ].filter(Boolean).join(' ')}\n >\n <div className=\"flex gap-2.5\">\n {icon && (\n <span className={`mt-0.5 flex h-5 w-5 flex-shrink-0 items-center justify-center ${tone === 'danger' ? 'text-status-error' : 'text-status-warning'}`}>\n {icon}\n </span>\n )}\n <div className=\"min-w-0\">\n <div className=\"text-sm font-medium text-foreground\">{title}</div>\n {description && <div className=\"mt-1 text-xs text-foreground-secondary leading-snug\">{description}</div>}\n </div>\n </div>\n <div className=\"mt-3 flex justify-end gap-2\">\n <Button content={cancelText} size=\"sm\" variant=\"ghost\" onClick={handleCancel} />\n <Button\n content={confirmText}\n size=\"sm\"\n variant={tone === 'danger' ? 'danger' : 'primary'}\n loading={loading}\n onClick={handleConfirm}\n />\n </div>\n <Popover.Arrow className=\"fill-surface\" />\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n )\n}\n","import React, { useMemo, useState } from 'react'\n\nexport interface CalendarEvent {\n /** The day this event lands on (time ignored). */\n date: Date\n /** Optional dot colour (any CSS colour). Defaults to the accent token. */\n color?: string\n /** Optional label (used as the dot's title tooltip). */\n label?: string\n}\n\nexport interface CalendarProps {\n /** Selected day. */\n value?: Date | null\n /** Fires with the clicked day. */\n onChange?: (date: Date) => void\n /** Controlled visible month (any day within it). */\n month?: Date\n /** Uncontrolled initial visible month. */\n defaultMonth?: Date\n /** Fires when the user pages months. */\n onMonthChange?: (month: Date) => void\n /** Event markers — rendered as up to three dots beneath the day. */\n events?: CalendarEvent[]\n /** Earliest / latest selectable day. */\n min?: Date\n max?: Date\n /** First column: 0 Sunday (default), 1 Monday. */\n weekStartsOn?: 0 | 1\n className?: string\n style?: React.CSSProperties\n}\n\nconst WEEKDAYS = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']\nconst MONTHS = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']\n\nconst startOfDay = (d: Date) => new Date(d.getFullYear(), d.getMonth(), d.getDate())\nconst sameDay = (a: Date, b: Date) => a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate()\nconst addMonths = (d: Date, n: number) => new Date(d.getFullYear(), d.getMonth() + n, 1)\n\nfunction buildGrid(month: Date, weekStartsOn: 0 | 1): Date[] {\n const first = new Date(month.getFullYear(), month.getMonth(), 1)\n const offset = (first.getDay() - weekStartsOn + 7) % 7\n const start = new Date(first)\n start.setDate(first.getDate() - offset)\n return Array.from({ length: 42 }, (_, i) => {\n const d = new Date(start)\n d.setDate(start.getDate() + i)\n return d\n })\n}\n\nconst NavIcon = ({ dir }: { dir: 'left' | 'right' }) => (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} aria-hidden=\"true\" className=\"h-4 w-4\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d={dir === 'left' ? 'M15 19l-7-7 7-7' : 'M9 5l7 7-7 7'} />\n </svg>\n)\n\n/**\n * A month-grid calendar — dependency-free date math, optional event dots, and\n * `min`/`max` bounds. Display + single-day selection; pair with your own state\n * for the value. For a popover date *field*, use **Temporal** (DatePicker).\n *\n * @example\n * ```tsx\n * const [day, setDay] = useState<Date | null>(null)\n * <Calendar value={day} onChange={setDay} events={[{ date: new Date(), label: 'Today' }]} />\n * ```\n */\nexport default function Calendar({\n value,\n onChange,\n month,\n defaultMonth,\n onMonthChange,\n events,\n min,\n max,\n weekStartsOn = 0,\n className = '',\n style,\n}: CalendarProps) {\n const today = useMemo(() => startOfDay(new Date()), [])\n const [internalMonth, setInternalMonth] = useState<Date>(() => month ?? defaultMonth ?? value ?? today)\n const visible = month ?? internalMonth\n\n const setMonth = (next: Date) => {\n onMonthChange?.(next)\n if (month === undefined) setInternalMonth(next)\n }\n\n const grid = useMemo(() => buildGrid(visible, weekStartsOn), [visible, weekStartsOn])\n const weekdays = useMemo(() => Array.from({ length: 7 }, (_, i) => WEEKDAYS[(i + weekStartsOn) % 7]), [weekStartsOn])\n\n const eventsByDay = useMemo(() => {\n const map = new Map<string, CalendarEvent[]>()\n for (const ev of events ?? []) {\n const key = startOfDay(ev.date).toDateString()\n const arr = map.get(key) ?? []\n arr.push(ev)\n map.set(key, arr)\n }\n return map\n }, [events])\n\n const disabled = (d: Date) => (min && d < startOfDay(min)) || (max && d > startOfDay(max))\n\n return (\n <div className={['inline-block rounded-lg border border-border bg-surface p-3 select-none', className].filter(Boolean).join(' ')} style={style}>\n {/* Header */}\n <div className=\"mb-2 flex items-center justify-between px-1\">\n <button\n type=\"button\"\n aria-label=\"Previous month\"\n onClick={() => setMonth(addMonths(visible, -1))}\n className=\"flex h-7 w-7 items-center justify-center rounded-md text-foreground-secondary hover:bg-surface-raised hover:text-foreground focus:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n >\n <NavIcon dir=\"left\" />\n </button>\n <div className=\"text-sm font-semibold text-foreground\" aria-live=\"polite\">\n {MONTHS[visible.getMonth()]} {visible.getFullYear()}\n </div>\n <button\n type=\"button\"\n aria-label=\"Next month\"\n onClick={() => setMonth(addMonths(visible, 1))}\n className=\"flex h-7 w-7 items-center justify-center rounded-md text-foreground-secondary hover:bg-surface-raised hover:text-foreground focus:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n >\n <NavIcon dir=\"right\" />\n </button>\n </div>\n\n {/* Weekday row */}\n <div className=\"grid grid-cols-7 mb-1\">\n {weekdays.map((w) => (\n <div key={w} className=\"text-center text-[11px] font-medium uppercase tracking-wide text-foreground-muted py-1\">\n {w}\n </div>\n ))}\n </div>\n\n {/* Day grid */}\n <div className=\"grid grid-cols-7 gap-0.5\" role=\"grid\">\n {grid.map((d, i) => {\n const inMonth = d.getMonth() === visible.getMonth()\n const isSelected = value != null && sameDay(d, value)\n const isToday = sameDay(d, today)\n const isDisabled = disabled(d)\n const dayEvents = eventsByDay.get(d.toDateString()) ?? []\n return (\n <button\n key={i}\n type=\"button\"\n role=\"gridcell\"\n aria-selected={isSelected}\n aria-current={isToday ? 'date' : undefined}\n disabled={isDisabled}\n onClick={() => onChange?.(startOfDay(d))}\n className={[\n 'relative flex h-9 w-9 flex-col items-center justify-center rounded-md text-sm transition-colors',\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-accent',\n isSelected\n ? 'bg-accent text-accent-fg font-semibold'\n : inMonth\n ? 'text-foreground hover:bg-surface-raised'\n : 'text-foreground-muted hover:bg-surface-raised',\n isDisabled ? 'opacity-40 cursor-not-allowed hover:bg-transparent' : '',\n !isSelected && isToday ? 'ring-1 ring-inset ring-accent/60' : '',\n ].filter(Boolean).join(' ')}\n >\n <span className=\"leading-none\">{d.getDate()}</span>\n {dayEvents.length > 0 && (\n <span className=\"absolute bottom-1 flex gap-0.5\">\n {dayEvents.slice(0, 3).map((ev, j) => (\n <span\n key={j}\n title={ev.label}\n className=\"h-1 w-1 rounded-full\"\n style={{ backgroundColor: ev.color ?? (isSelected ? 'var(--color-accent-fg)' : 'var(--color-accent)') }}\n />\n ))}\n </span>\n )}\n </button>\n )\n })}\n </div>\n </div>\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 /** Extra classes merged onto the spinner root. */\n className?: string\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 className = '',\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 ${className}`.trim()}\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 ${className}`.trim()}\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 /** Extra classes merged onto the list root. */\n className?: string\n /** Inline style on the list root. */\n style?: React.CSSProperties\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 className = '',\n style,\n}: ListProps) {\n return (\n <div role=\"listbox\" className={`flex flex-col ${className}`.trim()} style={style}>\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 /** Width when expanded. Default `'100%'` (fills parent). */\n expandedWidth?: React.CSSProperties['width']\n /** Height when expanded. Default `'100%'`. Set a concrete value (e.g. 420)\n * when the container lives in normal flow and should push siblings down. */\n expandedHeight?: React.CSSProperties['height']\n /** Controlled expanded state. */\n expanded?: boolean\n /** Fires when the user toggles. */\n onExpandedChange?: (expanded: boolean) => void\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 /** Extra classes merged onto the container root. */\n className?: string\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 expandedWidth = '100%',\n expandedHeight = '100%',\n expanded,\n onExpandedChange,\n children,\n assignClassOnClick,\n expandIcon,\n collapseIcon,\n togglePosition = 'top-right',\n className = '',\n}: ScalableContainerProps) {\n const containerRef = useRef<HTMLDivElement>(null)\n const [internalScaled, setInternalScaled] = useState(false)\n const isScaled = expanded ?? internalScaled\n const reduced = useReducedMotion()\n\n const onToggle = () => {\n const next = !isScaled\n if (expanded === undefined) setInternalScaled(next)\n onExpandedChange?.(next)\n // After the expand transition settles, scroll the container into view\n // so the newly-grown content is fully visible (only when growing).\n if (next) {\n window.setTimeout(\n () => containerRef.current?.scrollIntoView({ behavior: 'smooth', block: 'nearest' }),\n reduced ? 0 : 340,\n )\n }\n }\n\n const wrapperClass = isScaled ? assignClassOnClick : undefined\n\n return (\n <motion.div\n ref={containerRef}\n animate={{\n width: isScaled ? expandedWidth : width,\n height: isScaled ? expandedHeight : 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 }\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 className,\n ].filter(Boolean).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 /** Extra classes merged onto the card root. */\n className?: string\n /** Inline style on the card root. */\n style?: React.CSSProperties\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, className = '', style }: 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 ${className}`.trim()} style={style}>\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 /** Extra classes merged onto the card root. */\n className?: string\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 className = '',\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 } ${className}`.trim()}\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 /** Extra classes merged onto the grid root. */\n className?: string\n}\n\n/**\n * Wrapping flex grid of `GridCard` tiles.\n */\nexport default function CatalogGrid({ items, buttonText, onOpen, className = '' }: CatalogGridProps) {\n return (\n <div className={`flex flex-wrap gap-2 ${className}`.trim()}>\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 /** Extra classes merged onto the carousel root. */\n className?: string\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, className = '' }: 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 ${className}`.trim()}>\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 /** Extra classes merged onto the catalog root. */\n className?: string\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, className = '' }: CatalogProps) {\n return (\n <div className={`w-full h-full ${className}`.trim()}>\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 /** Extra classes merged onto the menu content panel. */\n className?: string\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, className = '' }: 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} ${className}`.trim()}\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'\nimport Tooltip from '../core/Tooltip'\n\n/**\n * Shared field foundation for all oxygen-ui inputs.\n *\n * Centralises the things every input must agree on:\n * - the **size scale** (sm / md / lg) → control height + text size + padding\n * - the **refined focus treatment** — a crisp 1px accent border plus a soft\n * 3px low-opacity halo (NOT a heavy solid ring band)\n * - the **resting / hover / error / disabled** border + background states\n * - a **`<Field>` wrapper** handling label, error region, layout\n * (horizontal / vertical) and `aria` linkage consistently\n *\n * All values map to design-system tokens (control heights, semantic colours,\n * radii) so a consumer's ThemeProvider override flows straight through.\n */\n\nexport type FieldSize = 'sm' | 'md' | 'lg'\n\ninterface SizeSpec {\n /** Control height utility (token-backed). */\n control: string\n /** Text size for the value. */\n text: string\n /** Horizontal padding. */\n padX: string\n /** Gap between adornments inside the control. */\n gap: string\n}\n\nexport const FIELD_SIZE: Record<FieldSize, SizeSpec> = {\n sm: { control: 'h-control-sm', text: 'text-xs', padX: 'px-2.5', gap: 'gap-1.5' },\n md: { control: 'h-control-md', text: 'text-sm', padX: 'px-3', gap: 'gap-2' },\n lg: { control: 'h-control-lg', text: 'text-sm', padX: 'px-3.5', gap: 'gap-2.5' },\n}\n\n// ── Focus + state literals ───────────────────────────────────────────────────\n// These MUST be written as full literal strings so Tailwind's JIT scanner\n// emits the CSS. Do not template the variant prefix.\n\n// CONSISTENCY: every input shows the IDENTICAL focus treatment under the same\n// conditions — the border turns accent. We deliberately use NO ring/box-shadow\n// halo: a ring is a box-shadow that any ancestor with `overflow` (incl. the\n// Storybook canvas) clips, producing the choppy \"rounded-top, square-bottom\"\n// artifact. A border-colour change can never be clipped and reads cleanly.\n// `:focus` (not `:focus-visible`) so it shows on mouse + keyboard, matching\n// text inputs (focus-within). `data-[state=open]` keeps it lit while a popover\n// trigger's panel is open even after Radix moves focus into the panel.\nconst FOCUS_WITHIN =\n 'focus-within:outline-none focus-within:border-accent'\nconst FOCUS_ELEMENT =\n 'focus:outline-none focus:border-accent data-[state=open]:border-accent'\nconst FOCUS_WITHIN_ERROR =\n 'focus-within:border-status-error'\nconst FOCUS_ELEMENT_ERROR =\n 'focus:border-status-error data-[state=open]:border-status-error'\n\nexport interface FieldShellOptions {\n size?: FieldSize\n hasError?: boolean\n disabled?: boolean\n /**\n * `true` for wrapper elements that hold a real `<input>` inside\n * (focus-within), `false` for elements that are themselves focusable\n * like `<button>` triggers (focus-visible). Default `false`.\n */\n focusWithin?: boolean\n /** Append height/padding utilities (for single-line inputs). Default `true`. */\n sized?: boolean\n}\n\n/**\n * Compose the className for an input's outer \"shell\" — the bordered, rounded\n * box that carries the focus ring. Apply to the `<input>` directly, or to a\n * wrapper `<div>` that contains an input plus adornments (pass\n * `focusWithin: true` in that case).\n */\nexport function fieldShell({\n size = 'md',\n hasError = false,\n disabled = false,\n focusWithin = false,\n sized = true,\n}: FieldShellOptions = {}): string {\n const s = FIELD_SIZE[size]\n return [\n 'w-full rounded-lg border bg-surface text-foreground',\n 'transition-[color,box-shadow,border-color] duration-150',\n s.text,\n sized ? `${s.control} ${s.padX}` : '',\n // resting border\n hasError ? 'border-status-error' : 'border-border',\n // hover (only when interactive + no error)\n disabled\n ? 'bg-surface-raised text-foreground-muted cursor-not-allowed'\n : hasError ? '' : 'hover:border-border-strong',\n // focus\n focusWithin ? FOCUS_WITHIN : FOCUS_ELEMENT,\n hasError ? (focusWithin ? FOCUS_WITHIN_ERROR : FOCUS_ELEMENT_ERROR) : '',\n // placeholder colour for native inputs\n 'placeholder:text-foreground-muted',\n ].filter(Boolean).join(' ')\n}\n\n// ── Help icon + shared label ──────────────────────────────────────────────────\n\n/**\n * Small themed \"info\" affordance shown beside a field label. Hovering or\n * focusing it reveals `helperText` in a tooltip. Rendered as a `type=\"button\"`\n * so it never submits an enclosing form, and coloured from semantic tokens so\n * it follows the active theme.\n */\nexport function FieldHelpIcon({ text }: { text: React.ReactNode }) {\n return (\n <Tooltip title={text} placement=\"top\">\n <button\n type=\"button\"\n aria-label=\"More information\"\n className=\"inline-flex items-center justify-center rounded-full text-foreground-muted transition-colors hover:text-foreground focus:outline-none focus-visible:text-accent\"\n >\n <svg viewBox=\"0 0 16 16\" className=\"h-3.5 w-3.5\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.5} aria-hidden=\"true\">\n <circle cx=\"8\" cy=\"8\" r=\"6.25\" />\n <path strokeLinecap=\"round\" d=\"M8 7.4v3.4\" />\n <circle cx=\"8\" cy=\"5.1\" r=\"0.65\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n </button>\n </Tooltip>\n )\n}\n\nexport interface FieldLabelProps {\n label?: React.ReactNode\n htmlFor?: string\n required?: boolean\n /** Reveals an info icon + tooltip beside the label. */\n helperText?: React.ReactNode\n /** Apply horizontal-layout spacing (no-wrap, shrink). */\n horizontal?: boolean\n /**\n * Vertical alignment of the label against the control in horizontal layout.\n * `'start'` (default) nudges the label down to meet a standard ~36px input's\n * first line; `'center'` removes that offset so the label centres against a\n * short control (Switch, SegmentedControl).\n */\n align?: 'start' | 'center'\n style?: React.CSSProperties\n /** Label column width in horizontal layout. */\n width?: string | number\n className?: string\n}\n\n/**\n * The label row shared by every input — label text + required asterisk +\n * optional `helperText` info icon. Components that render their own label\n * outside `<Field>` (Dropdown, DatePicker, Switch, SegmentedControl) use this\n * so the affordance is pixel-identical everywhere.\n *\n * Returns `null` when there's nothing to show (no label and no helperText).\n */\nexport function FieldLabel({\n label,\n htmlFor,\n required,\n helperText,\n horizontal = false,\n align = 'start',\n style,\n width,\n className = '',\n}: FieldLabelProps) {\n if (label == null && helperText == null) return null\n return (\n <div\n style={{ width: horizontal ? width : undefined, ...style }}\n className={[\n 'flex items-center gap-1',\n horizontal ? 'flex-shrink-0 whitespace-nowrap' : '',\n // Only the 'start' alignment needs the top nudge; 'center' relies\n // on the row's items-center to line up with a short control.\n horizontal && align === 'start' ? 'mt-2' : '',\n className,\n ].filter(Boolean).join(' ')}\n >\n {label != null && (\n <label htmlFor={htmlFor} className=\"text-sm font-medium text-foreground select-none\">\n {label}\n {required && <span className=\"text-status-error ml-0.5\" aria-hidden=\"true\">*</span>}\n </label>\n )}\n {helperText != null && <FieldHelpIcon text={helperText} />}\n </div>\n )\n}\n\n// ── Field wrapper ─────────────────────────────────────────────────────────────\n\nexport interface FieldProps {\n label?: React.ReactNode\n /** `id` of the control — links the `<label htmlFor>`. */\n htmlFor?: string\n /** `id` for the error region — pair with `aria-describedby` on the control. */\n errorId?: string\n errorMessage?: React.ReactNode\n /** Orientation of label vs control. Default `'vertical'`. */\n layout?: 'horizontal' | 'vertical'\n /** Show a required asterisk after the label. */\n required?: boolean\n /** Contextual help revealed via an info icon + tooltip beside the label. */\n helperText?: React.ReactNode\n /**\n * Label alignment against the control in horizontal layout. `'start'`\n * (default) for standard-height inputs; `'center'` for short controls\n * (Switch) so the label lines up with the control's centre.\n */\n labelAlign?: 'start' | 'center'\n labelStyle?: React.CSSProperties\n /** Width of the label column in horizontal layout (CSS length). */\n labelWidth?: string | number\n className?: string\n /** The control itself (input / trigger / dropzone). */\n children: React.ReactNode\n}\n\n/**\n * Layout wrapper shared by every input. Renders:\n *\n * ```\n * vertical: horizontal:\n * [label] [label] [ control ]\n * [ control ] [ error message ]\n * [ error ]\n * ```\n *\n * The error message always sits under the **control only** (never spanning\n * the label in horizontal layout). Label uses full-contrast foreground +\n * medium weight so it reads as the anchor, while the input's placeholder is\n * muted — establishing hierarchy without making the label tiny.\n */\nexport function Field({\n label,\n htmlFor,\n errorId,\n errorMessage,\n layout = 'vertical',\n required,\n helperText,\n labelAlign = 'start',\n labelStyle,\n labelWidth,\n className = '',\n children,\n}: FieldProps) {\n const hasError = errorMessage != null\n const horizontal = layout === 'horizontal'\n return (\n <div\n className={[\n 'flex',\n horizontal\n ? `flex-row gap-3 ${labelAlign === 'center' ? 'items-center' : 'items-start'}`\n : 'flex-col gap-1.5',\n className,\n ].filter(Boolean).join(' ')}\n >\n <FieldLabel\n label={label}\n htmlFor={htmlFor}\n required={required}\n helperText={helperText}\n horizontal={horizontal}\n align={labelAlign}\n style={labelStyle}\n width={labelWidth}\n />\n <div className=\"flex flex-col min-w-0 flex-1\">\n {children}\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 { Field, fieldShell, type FieldSize } from './_field'\n\nexport interface SearchInputProps {\n /** Controlled value. */\n value?: string\n /** Fires when the value changes. */\n onChange?: React.ChangeEventHandler<HTMLInputElement>\n /** Disable interaction and dim the control. */\n disabled?: boolean\n /** Field label, placed above (vertical) or beside (horizontal) the control. */\n label?: React.ReactNode\n /** The control id; the field label links to it for accessibility. */\n htmlFor?: string\n /** Placeholder shown when the field is empty. */\n placeholder?: string\n /** Native form field name (used for FormData serialisation). */\n name?: string\n /** Inline style applied to the inner input element. */\n inputStyle?: React.CSSProperties\n /** Inline style applied to the control shell. */\n style?: React.CSSProperties\n /** Label/input orientation. Defaults to `'vertical'`. */\n layout?: 'horizontal' | 'vertical'\n /** Size preset. Default `'md'`. */\n size?: FieldSize\n /** Override the leading search icon. */\n icon?: React.ReactNode\n /** Contextual help revealed via an info icon + tooltip beside the label. */\n helperText?: React.ReactNode\n /** Extra classes merged onto the field root element. */\n className?: string\n}\n\nconst SearchIcon = (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"w-4 h-4\" 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\n/**\n * Search field with a leading magnifier icon. Uses `type=\"search\"` for the\n * native clear affordance and a search-friendly mobile keyboard. Full-width\n * by default. Override the icon via `icon`.\n *\n * @example\n * ```tsx\n * <SearchInput value={q} onChange={(e) => setQ(e.target.value)} placeholder=\"Search vessels…\" />\n * ```\n */\nconst SearchInput = React.forwardRef<HTMLInputElement, SearchInputProps>(function SearchInput(\n { value, onChange, disabled, label, htmlFor, placeholder, name, inputStyle, style, layout = 'vertical', size = 'md', icon, helperText, className },\n ref,\n) {\n return (\n <Field className={className} label={label} htmlFor={htmlFor} layout={layout} helperText={helperText}>\n <div\n className={`flex items-center ${fieldShell({ size, disabled, focusWithin: true })}`}\n style={style}\n >\n <span className=\"flex-shrink-0 mr-2 text-foreground-muted\">{icon ?? SearchIcon}</span>\n <input\n ref={ref}\n disabled={disabled}\n value={value}\n onChange={onChange}\n type=\"search\"\n enterKeyHint=\"search\"\n name={name}\n id={htmlFor}\n className=\"min-w-0 flex-1 bg-transparent outline-none disabled:cursor-not-allowed placeholder:text-foreground-muted\"\n style={inputStyle}\n placeholder={placeholder ?? ''}\n />\n </div>\n </Field>\n )\n})\n\nexport default SearchInput\n","import React from 'react'\n\nexport interface TagProps {\n children: React.ReactNode\n /** When provided, renders a × button that calls this on click. */\n onRemove?: () => void\n /** Accessible label for the remove button. */\n removeLabel?: string\n disabled?: boolean\n}\n\n/**\n * Internal chip used by TagsInput and Dropdown for selected values. Subtle\n * bordered surface (not a heavy accent fill) with an optional × remove\n * button. Kept internal — consumers compose tags through the inputs, not\n * directly.\n */\nexport default function Tag({ children, onRemove, removeLabel, disabled }: TagProps) {\n return (\n <span className=\"inline-flex items-center gap-1 rounded-md border border-border bg-surface-raised text-foreground text-xs pl-2 pr-1 py-0.5 max-w-full\">\n <span className=\"truncate\">{children}</span>\n {onRemove && (\n <button\n type=\"button\"\n disabled={disabled}\n onClick={(e) => { e.stopPropagation(); onRemove() }}\n aria-label={removeLabel ?? 'Remove'}\n className=\"inline-flex items-center justify-center w-4 h-4 flex-shrink-0 rounded text-foreground-muted hover:text-status-error hover:bg-surface transition-colors focus:outline-none focus-visible:ring-1 focus-visible:ring-accent disabled:cursor-not-allowed\"\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=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n </button>\n )}\n </span>\n )\n}\n","import React, { useEffect, useId, useLayoutEffect, useRef, useState } from 'react'\nimport * as Popover from '@radix-ui/react-popover'\nimport SearchInput from './SearchInput'\nimport Tag from './_tag'\nimport { fieldShell, FieldLabel } from './_field'\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 /** Enable multi-select (value becomes an array of keys). */\n isMultiselect?: boolean\n /** Show a search box inside the dropdown panel. */\n hasSearch?: boolean\n /** Field label, placed above (vertical) or beside (horizontal) the control. */\n label?: React.ReactNode\n /** Native form field name (used for FormData serialisation). */\n name?: string\n /** Controlled value. */\n value?: DropdownValue\n /** Fires when the value changes. */\n onChange?: (e: { target: { value: DropdownValue; id?: string; name?: string } }) => void\n /** Blur handler — useful for touched/validation timing. */\n onBlur?: React.FocusEventHandler\n /** Disable interaction and dim the control. */\n disabled?: boolean\n /** Label/input orientation. Defaults to `'vertical'`. */\n layout?: 'horizontal' | 'vertical'\n /** Contextual help revealed via an info icon + tooltip beside the label. */\n helperText?: React.ReactNode\n /** Show a required asterisk after the label. */\n required?: boolean\n /** Validation message — shown under the control; also flags it red and sets aria-invalid. */\n errorMessage?: React.ReactNode\n /** Inline style applied to the control shell. */\n style?: React.CSSProperties\n /** The control id; the field label links to it for accessibility. */\n htmlFor?: string\n /** The selectable items. */\n items?: DropdownItem[]\n /** Inline style applied to the label. */\n labelStyle?: React.CSSProperties\n /** Placeholder shown when the field is empty. */\n placeholder?: string\n /** Size preset. Default `'md'`. */\n size?: import('./_field').FieldSize\n /** Extra classes merged onto the component root. */\n className?: string\n}\n\n/**\n * Single-line tag row for multi-select values. Shows as many removable tag\n * chips as fit on one line, then collapses the remainder into a \"+N more\"\n * chip — so the trigger never grows in width OR height as the selection\n * changes.\n *\n * Sizing is measured off a hidden, off-layout copy of the full tag set (so the\n * widths are always available even after we've collapsed the visible row), and\n * recomputed via a ResizeObserver whenever the trigger width changes.\n */\nfunction MultiTagRow({\n values,\n disabled,\n labelFor,\n onRemove,\n}: {\n values: (string | number)[]\n disabled?: boolean\n labelFor: (key: string | number) => React.ReactNode\n onRemove: (key: string | number) => void\n}) {\n const wrapRef = useRef<HTMLDivElement>(null)\n const measureRef = useRef<HTMLDivElement>(null)\n const [visibleCount, setVisibleCount] = useState(values.length)\n\n const key = values.map(String).join('|')\n\n useLayoutEffect(() => {\n const wrap = wrapRef.current\n const measure = measureRef.current\n if (!wrap || !measure) return\n\n const GAP = 6 // gap-1.5 → 0.375rem\n\n const recompute = () => {\n const avail = wrap.clientWidth\n const tagEls = Array.from(measure.querySelectorAll<HTMLElement>('[data-mt]'))\n const moreEl = measure.querySelector<HTMLElement>('[data-mm]')\n const widths = tagEls.map((e) => e.offsetWidth)\n const moreW = moreEl ? moreEl.offsetWidth : 0\n if (widths.length === 0) { setVisibleCount(0); return }\n\n // How many tags fit with no \"+N more\" chip?\n let used = 0\n let count = 0\n for (let i = 0; i < widths.length; i++) {\n const w = widths[i] + (i > 0 ? GAP : 0)\n if (used + w <= avail) { used += w; count++ } else break\n }\n\n // If some are hidden, reserve room for the \"+N more\" chip and\n // shrink the visible count until tags + chip fit.\n if (count < widths.length) {\n while (count > 0) {\n let t = 0\n for (let i = 0; i < count; i++) t += widths[i] + (i > 0 ? GAP : 0)\n t += GAP + moreW\n if (t <= avail) break\n count--\n }\n }\n setVisibleCount(count)\n }\n\n recompute()\n const ro = new ResizeObserver(recompute)\n ro.observe(wrap)\n return () => ro.disconnect()\n }, [key])\n\n const hidden = values.length - visibleCount\n const moreChip = (n: number) => (\n <span className=\"inline-flex items-center flex-shrink-0 rounded-md border border-border bg-surface-raised text-foreground-secondary text-xs px-2 py-0.5\">\n +{n} more\n </span>\n )\n\n return (\n <div ref={wrapRef} className=\"relative flex-1 min-w-0 flex flex-nowrap items-center gap-1.5 overflow-hidden\">\n {/* Hidden measuring copy — full set + a sample more chip. Off-layout\n so it never affects the trigger size, but measurable. */}\n <div\n ref={measureRef}\n aria-hidden=\"true\"\n className=\"absolute invisible pointer-events-none flex flex-nowrap items-center gap-1.5\"\n style={{ left: -9999, top: -9999 }}\n >\n {values.map((val) => (\n <span data-mt key={`m-${val}`}>\n <Tag removeLabel=\"x\" onRemove={() => {}}>{labelFor(val)}</Tag>\n </span>\n ))}\n <span data-mm>{moreChip(values.length)}</span>\n </div>\n\n {/* Visible row */}\n {values.slice(0, visibleCount).map((val) => (\n <Tag\n key={String(val)}\n disabled={disabled}\n removeLabel={`Remove ${labelFor(val)}`}\n onRemove={() => onRemove(val)}\n >\n {labelFor(val)}\n </Tag>\n ))}\n {hidden > 0 && moreChip(hidden)}\n </div>\n )\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 helperText,\n required,\n errorMessage,\n style = {},\n htmlFor,\n items = [],\n labelStyle = {},\n placeholder,\n size = 'md',\n className = '',\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 // Remove a selected value via its tag's × button. In multi-select this\n // toggles the option off; in single-select it clears the field.\n const removeSelected = (key: string | number) => {\n if (isMultiselect) {\n const next = selectedItems.filter((it) => it !== key)\n setSelectedItems(next)\n onChange?.({ target: { value: next, id: htmlFor, name } })\n } else {\n setSelectedItems([])\n onChange?.({ target: { value: '', id: htmlFor, name } })\n }\n }\n\n const labelFor = (key: string | number) => innerItems.find((it) => it.key === key)?.label ?? String(key)\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={className || undefined}>\n <div\n className={`flex ${layout === 'vertical' ? 'flex-col gap-1.5' : 'flex-row items-start gap-3'}`}\n >\n <FieldLabel\n label={label}\n htmlFor={htmlFor}\n required={required}\n helperText={helperText}\n horizontal={layout === 'horizontal'}\n style={labelStyle}\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 // A definite width keeps the trigger from shrink-\n // wrapping to its tags — the selection count changes\n // what's shown, never the box size. Override via\n // `style={{ width: '100%' }}` to fill a container.\n style={{ width: 240, ...style }}\n className={`flex items-center justify-between gap-2 cursor-pointer select-none min-h-[36px] px-3 py-1.5 ${fieldShell({ size, hasError, disabled, sized: false })}`}\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) — rendered as removable tags.\n Clicking a tag's × deselects (multi) or clears\n (single). The × calls stopPropagation so it\n doesn't toggle the popover. Multi-select collapses\n overflow into a \"+N more\" chip on a single line. */}\n {!value || (Array.isArray(value) && value.length === 0) ? (\n <span className=\"flex-1 min-w-0 truncate text-foreground-muted text-sm\">{placeholder}</span>\n ) : Array.isArray(value) ? (\n <MultiTagRow\n values={value}\n disabled={disabled}\n labelFor={labelFor}\n onRemove={removeSelected}\n />\n ) : (\n <div className=\"flex-1 min-w-0 flex items-center overflow-hidden\">\n <Tag\n disabled={disabled}\n removeLabel={`Remove ${labelFor(value)}`}\n onRemove={() => removeSelected(value)}\n >\n {labelFor(value)}\n </Tag>\n </div>\n )}\n\n {/* Chevron — currentColor follows trigger text */}\n <div className={`flex-shrink-0 text-foreground-muted transition-transform duration-200 ${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. The animated sweep lives in `.oxy-skeleton::after`\n// (src/styles/_animations.scss) where the band colour is `color-mix`-ed from\n// `--color-foreground`, so it stays visible in BOTH light and dark themes — a\n// fixed white sheen vanishes on a light `surface-raised` base. The element\n// keeps `bg-surface-raised` as a Tailwind utility so consumers can override the\n// resting colour via `className` / `style`. Reduced-motion hides the sweep but\n// the legible base placeholder remains.\nconst SHIMMER = 'oxy-skeleton rounded-sm bg-surface-raised'\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 { AnimatePresence, motion, useReducedMotion } from 'framer-motion'\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 /** Extra classes merged onto the table wrapper root. */\n className?: string\n /** Inline style on the table wrapper root. */\n style?: React.CSSProperties\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 const reduced = useReducedMotion()\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 {/* Expansion row is always present; the panel animates\n its height + fade via AnimatePresence so the content\n mounts only while open (and during the collapse\n transition). The border lives on the panel so a\n collapsed row leaves no stray divider. */}\n {hasExpand && (\n <tr className=\"bg-surface\">\n <td colSpan={expandColCount} className=\"p-0\">\n <AnimatePresence initial={false}>\n {isExpanded && (\n <motion.div\n key=\"expand\"\n initial={{ height: 0, opacity: 0 }}\n animate={{ height: 'auto', opacity: 1 }}\n exit={{ height: 0, opacity: 0 }}\n transition={\n reduced\n ? { duration: 0 }\n : { height: { duration: 0.28, ease: [0.16, 1, 0.3, 1] }, opacity: { duration: 0.2 } }\n }\n style={{ overflow: 'hidden' }}\n className=\"border-b border-border\"\n >\n <div className=\"p-3\">{expandRow.expandComponent?.(row)}</div>\n </motion.div>\n )}\n </AnimatePresence>\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 className = '',\n style,\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 ${className}`.trim()} style={style}>\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 /** Extra classes merged onto the root label. */\n className?: 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', className = '' }: ThemeSwitchProps) {\n const id = useId()\n\n return (\n <label htmlFor={id} className={`flex items-center gap-2 cursor-pointer select-none ${className}`.trim()}>\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 /** Extra classes merged onto the sidebar root (`<aside>`). */\n className?: string\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 className = '',\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 ${className}`.trim()}\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, { createContext, useContext, useState } from 'react'\nimport * as NavigationMenu from '@radix-ui/react-navigation-menu'\n\ntype Align = 'start' | 'center' | 'end'\nconst MegaMenuContext = createContext<{ align: Align }>({ align: 'start' })\n\n// ── Root ──────────────────────────────────────────────────────────────────────\n\nexport interface MegaMenuProps {\n /** `MegaMenu.Item` children. */\n children: React.ReactNode\n /** Where the dropdown panel aligns under the bar. Default `'start'`. */\n align?: 'start' | 'center' | 'end'\n /** Delay (ms) before a hovered item opens. Default `200`. */\n delayDuration?: number\n /**\n * Below the `md` breakpoint, collapse the hover bar into a tap-friendly\n * hamburger disclosure (a vertical accordion of the same items). Hover\n * mega-panels don't work on touch, so this is the graceful fallback.\n * Set `false` to render the desktop bar at every width (e.g. when you\n * provide your own mobile navigation). Default `true`.\n */\n responsive?: boolean\n /** Label for the mobile disclosure toggle. Default `'Menu'`. */\n mobileLabel?: React.ReactNode\n /** Extra classes merged onto the menu bar root. */\n className?: string\n style?: React.CSSProperties\n 'aria-label'?: string\n}\n\n/**\n * Horizontal navigation bar with wide \"mega\" dropdown panels, built on\n * `@radix-ui/react-navigation-menu` (hover-intent open, arrow-key navigation,\n * focus management, and a shared animated viewport for free).\n *\n * Compose top-level items with `MegaMenu.Item`. An item with children opens a\n * panel (`MegaMenu.Panel` → `MegaMenu.Section` → `MegaMenu.Link`, plus an\n * optional `MegaMenu.Featured` promo column); an item with just `href` is a\n * plain top-level link. Each panel positions itself under the bar and sizes to\n * its content.\n *\n * @example\n * ```tsx\n * <MegaMenu aria-label=\"Main\">\n * <MegaMenu.Item label=\"Products\">\n * <MegaMenu.Panel>\n * <MegaMenu.Section title=\"Platform\">\n * <MegaMenu.Link href=\"/analytics\" icon={<ChartIcon />} description=\"Dashboards & reports\">\n * Analytics\n * </MegaMenu.Link>\n * </MegaMenu.Section>\n * </MegaMenu.Panel>\n * </MegaMenu.Item>\n * <MegaMenu.Item label=\"Pricing\" href=\"/pricing\" />\n * </MegaMenu>\n * ```\n */\nfunction MegaMenu({\n children,\n align = 'start',\n delayDuration = 200,\n responsive = true,\n mobileLabel = 'Menu',\n className = '',\n style,\n 'aria-label': ariaLabel,\n}: MegaMenuProps) {\n return (\n <MegaMenuContext.Provider value={{ align }}>\n {/* Desktop: hover-intent bar. Hidden below `md` when responsive. */}\n <NavigationMenu.Root\n delayDuration={delayDuration}\n aria-label={ariaLabel}\n className={[\n 'relative z-10 w-full',\n responsive ? 'hidden md:flex' : 'flex',\n className,\n ].filter(Boolean).join(' ')}\n style={style}\n >\n <NavigationMenu.List className=\"flex items-center gap-1\">\n {children}\n </NavigationMenu.List>\n </NavigationMenu.Root>\n\n {/* Mobile: tap-friendly disclosure accordion. */}\n {responsive && (\n <MegaMenuMobile label={mobileLabel}>\n {children}\n </MegaMenuMobile>\n )}\n </MegaMenuContext.Provider>\n )\n}\n\n// ── Item ──────────────────────────────────────────────────────────────────────\n\nexport interface MegaMenuItemProps {\n /** Top-level label shown in the bar. */\n label: React.ReactNode\n /** Optional leading icon for the top-level item. */\n icon?: React.ReactNode\n /** When set (and no children), the item is a plain top-level link. */\n href?: string\n /** The panel (`MegaMenu.Panel`) revealed on hover/focus. Omit for a link. */\n children?: React.ReactNode\n className?: string\n}\n\nconst TOP_ITEM =\n 'group/top inline-flex items-center gap-1.5 h-10 px-3 rounded-md text-sm font-medium select-none ' +\n 'text-foreground-secondary hover:text-foreground hover:bg-surface-raised ' +\n 'data-[state=open]:text-accent data-[active]:text-accent ' +\n 'transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-accent'\n\nfunction MegaMenuItem({ label, icon, href, children, className = '' }: MegaMenuItemProps) {\n const { align } = useContext(MegaMenuContext)\n const pos = align === 'center' ? 'left-1/2 -translate-x-1/2' : align === 'end' ? 'right-0' : 'left-0'\n if (!children) {\n return (\n <NavigationMenu.Item>\n <NavigationMenu.Link href={href} className={[TOP_ITEM, className].filter(Boolean).join(' ')}>\n {icon && <span className=\"flex h-4 w-4 flex-shrink-0 items-center justify-center\">{icon}</span>}\n {label}\n </NavigationMenu.Link>\n </NavigationMenu.Item>\n )\n }\n return (\n <NavigationMenu.Item>\n <NavigationMenu.Trigger className={[TOP_ITEM, className].filter(Boolean).join(' ')}>\n {icon && <span className=\"flex h-4 w-4 flex-shrink-0 items-center justify-center\">{icon}</span>}\n {label}\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} aria-hidden=\"true\"\n className=\"h-3.5 w-3.5 text-foreground-muted transition-transform duration-200 group-data-[state=open]/top:rotate-180 group-data-[state=open]/top:text-accent\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n </NavigationMenu.Trigger>\n {/* The panel is a self-positioning absolute dropdown (no shared\n Radix Viewport). It sizes to its own content, so there's no\n viewport-width feedback loop. Positioned under the bar (the\n Root is `relative`) per the `align` prop. */}\n <NavigationMenu.Content\n className={`absolute top-full mt-2 ${pos} z-20 overflow-hidden rounded-lg border border-border bg-surface shadow-lg\n data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95\n data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95`}\n >\n {children}\n </NavigationMenu.Content>\n </NavigationMenu.Item>\n )\n}\n\n// ── Panel layout ────────────────────────────────────────────────────────────────\n\nexport interface MegaMenuPanelProps {\n children: React.ReactNode\n /** Cap the panel to roughly this many side-by-side columns before wrapping. Default: single row. */\n columns?: 1 | 2 | 3 | 4\n className?: string\n style?: React.CSSProperties\n}\n\nfunction MegaMenuPanel({ children, columns, className = '', style }: MegaMenuPanelProps) {\n // Grid with a *definite* panel width — this is the key to both a stable\n // width (no Radix-viewport feedback loop, since the panel is a\n // self-positioning absolute element) AND sections that spread to fill,\n // rather than shrink-wrapping to min-content the way the old flex layout\n // did. `1fr` / `auto-fit` resolve correctly because `width` is concrete.\n const layout: React.CSSProperties = columns\n ? {\n gridTemplateColumns: `repeat(${columns}, minmax(0, 1fr))`,\n width: `min(92vw, ${columns * 272}px)`,\n }\n : {\n gridTemplateColumns: 'repeat(auto-fit, minmax(220px, 1fr))',\n width: 'min(92vw, 760px)',\n }\n return (\n <div\n className={['grid gap-6 p-6', className].filter(Boolean).join(' ')}\n style={{ ...layout, maxWidth: 'min(92vw, 960px)', ...style }}\n >\n {children}\n </div>\n )\n}\n\n// ── Section (a titled column of links) ──────────────────────────────────────────\n\nexport interface MegaMenuSectionProps {\n /** Section heading (uppercase eyebrow). */\n title?: React.ReactNode\n children: React.ReactNode\n className?: string\n}\n\nfunction MegaMenuSection({ title, children, className = '' }: MegaMenuSectionProps) {\n return (\n <div className={['min-w-0 flex flex-col', className].filter(Boolean).join(' ')}>\n {title && (\n <p className=\"px-3 pb-1.5 text-[11px] font-semibold uppercase tracking-widest text-foreground-muted select-none\">\n {title}\n </p>\n )}\n <div className=\"flex flex-col gap-0.5\">{children}</div>\n </div>\n )\n}\n\n// ── Link (rich icon + title + description) ───────────────────────────────────────\n\nexport interface MegaMenuLinkProps {\n href?: string\n /** Leading icon, shown in a tinted square. */\n icon?: React.ReactNode\n /** Secondary line under the title. */\n description?: React.ReactNode\n /** Mark as the active route. */\n active?: boolean\n onClick?: React.MouseEventHandler\n children: React.ReactNode\n className?: string\n}\n\nfunction MegaMenuLink({ href, icon, description, active, onClick, children, className = '' }: MegaMenuLinkProps) {\n return (\n <NavigationMenu.Link\n active={active}\n href={href}\n onClick={onClick}\n className={[\n 'group/link flex items-start gap-3 rounded-md p-3 transition-colors select-none',\n 'hover:bg-surface-raised focus:outline-none focus-visible:ring-2 focus-visible:ring-accent',\n 'data-[active]:bg-surface-raised',\n className,\n ].filter(Boolean).join(' ')}\n >\n {icon && (\n <span className=\"flex h-9 w-9 flex-shrink-0 items-center justify-center rounded-md bg-surface-raised text-accent group-hover/link:bg-surface group-data-[active]/link:bg-surface transition-colors\">\n <span className=\"h-[18px] w-[18px] inline-flex items-center justify-center\">{icon}</span>\n </span>\n )}\n <span className=\"flex flex-col min-w-0\">\n <span className=\"text-sm font-medium text-foreground group-data-[active]/link:text-accent\">{children}</span>\n {description && <span className=\"text-xs text-foreground-muted leading-snug mt-0.5\">{description}</span>}\n </span>\n </NavigationMenu.Link>\n )\n}\n\n// ── Featured (promo column) ──────────────────────────────────────────────────────\n\nexport interface MegaMenuFeaturedProps {\n children: React.ReactNode\n className?: string\n}\n\nfunction MegaMenuFeatured({ children, className = '' }: MegaMenuFeaturedProps) {\n return (\n <div className={['min-w-0 rounded-lg bg-surface-raised border border-border p-4 flex flex-col', className].filter(Boolean).join(' ')}>\n {children}\n </div>\n )\n}\n\n// ── Mobile disclosure (responsive fallback) ─────────────────────────────────────\n// Hover mega-panels are unusable on touch, so below `md` we render a self-\n// contained accordion built from the SAME compound children. We introspect the\n// element tree (Item → Panel → Section/Featured → Link) by component identity\n// and re-render it with plain anchors — no Radix NavigationMenu context needed,\n// so nothing depends on the desktop bar being mounted.\n\ntype AnyEl = React.ReactElement<Record<string, unknown>>\nconst elementsOfType = (children: React.ReactNode, type: unknown): AnyEl[] =>\n React.Children.toArray(children).filter(\n (c): c is AnyEl => React.isValidElement(c) && c.type === type,\n )\n\nconst MOBILE_CHEVRON = (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} aria-hidden=\"true\"\n className=\"h-4 w-4 flex-shrink-0 text-foreground-muted transition-transform duration-200\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n)\n\nfunction MobileLinkRow({ link, onNavigate }: { link: AnyEl; onNavigate: () => void }) {\n const { href, icon, description, active, onClick, children } = link.props as {\n href?: string; icon?: React.ReactNode; description?: React.ReactNode\n active?: boolean; onClick?: React.MouseEventHandler; children?: React.ReactNode\n }\n return (\n <a\n href={href}\n onClick={(e) => { onClick?.(e); onNavigate() }}\n data-active={active ? '' : undefined}\n className=\"flex items-start gap-3 rounded-md p-2.5 transition-colors select-none\n hover:bg-surface-raised focus:outline-none focus-visible:ring-2 focus-visible:ring-accent\n data-[active]:bg-surface-raised\"\n >\n {icon && (\n <span className=\"flex h-8 w-8 flex-shrink-0 items-center justify-center rounded-md bg-surface-raised text-accent\">\n <span className=\"h-[17px] w-[17px] inline-flex items-center justify-center\">{icon}</span>\n </span>\n )}\n <span className=\"flex flex-col min-w-0\">\n <span className=\"text-sm font-medium text-foreground data-[active]:text-accent\">{children}</span>\n {description && <span className=\"text-xs text-foreground-muted leading-snug mt-0.5\">{description}</span>}\n </span>\n </a>\n )\n}\n\nfunction MobilePanel({ panel, onNavigate }: { panel: AnyEl; onNavigate: () => void }) {\n const nodes = React.Children.toArray((panel.props as { children?: React.ReactNode }).children)\n return (\n <div className=\"flex flex-col gap-4 px-2 pb-3 pt-1\">\n {nodes.map((node, i) => {\n if (!React.isValidElement(node)) return null\n const el = node as AnyEl\n if (el.type === MegaMenuSection) {\n const { title, children } = el.props as { title?: React.ReactNode; children?: React.ReactNode }\n return (\n <div key={i} className=\"flex flex-col\">\n {title && (\n <p className=\"px-2.5 pb-1 text-[11px] font-semibold uppercase tracking-widest text-foreground-muted select-none\">\n {title}\n </p>\n )}\n <div className=\"flex flex-col gap-0.5\">\n {elementsOfType(children, MegaMenuLink).map((lnk, j) => (\n <MobileLinkRow key={j} link={lnk} onNavigate={onNavigate} />\n ))}\n </div>\n </div>\n )\n }\n if (el.type === MegaMenuFeatured) {\n return (\n <div key={i} className=\"rounded-lg bg-surface-raised border border-border p-3 flex flex-col\">\n {(el.props as { children?: React.ReactNode }).children}\n </div>\n )\n }\n return <div key={i}>{node}</div>\n })}\n </div>\n )\n}\n\nfunction MegaMenuMobile({\n children,\n label,\n}: {\n children: React.ReactNode\n label: React.ReactNode\n}) {\n const [open, setOpen] = useState(false)\n const [expanded, setExpanded] = useState<number | null>(null)\n const items = elementsOfType(children, MegaMenuItem)\n\n return (\n <div className=\"md:hidden w-full\">\n <button\n type=\"button\"\n onClick={() => setOpen((o) => !o)}\n aria-expanded={open}\n className=\"inline-flex items-center gap-2 h-10 px-3 rounded-md text-sm font-medium\n text-foreground-secondary hover:text-foreground hover:bg-surface-raised\n focus:outline-none focus-visible:ring-2 focus-visible:ring-accent transition-colors\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} aria-hidden=\"true\" className=\"h-5 w-5\">\n {open\n ? <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 6l12 12M18 6L6 18\" />\n : <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M4 7h16M4 12h16M4 17h16\" />}\n </svg>\n {label}\n </button>\n\n {open && (\n <div className=\"mt-2 overflow-hidden rounded-lg border border-border bg-surface shadow-lg\">\n {items.map((item, i) => {\n const { label: itemLabel, icon, href, children: panel } = item.props as {\n label?: React.ReactNode; icon?: React.ReactNode; href?: string; children?: React.ReactNode\n }\n const hasPanel = panel != null\n const isOpen = expanded === i\n const rowBase =\n 'flex w-full items-center gap-2 px-3 h-11 text-sm font-medium text-foreground-secondary ' +\n 'hover:bg-surface-raised hover:text-foreground transition-colors ' +\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-accent'\n const divider = i > 0 ? 'border-t border-border' : ''\n\n if (!hasPanel) {\n return (\n <a\n key={i}\n href={href}\n onClick={() => setOpen(false)}\n className={[rowBase, divider].filter(Boolean).join(' ')}\n >\n {icon && <span className=\"flex h-4 w-4 flex-shrink-0 items-center justify-center\">{icon}</span>}\n {itemLabel}\n </a>\n )\n }\n\n return (\n <div key={i} className={divider || undefined}>\n <button\n type=\"button\"\n onClick={() => setExpanded(isOpen ? null : i)}\n aria-expanded={isOpen}\n className={[rowBase, isOpen ? 'text-accent' : ''].filter(Boolean).join(' ')}\n >\n {icon && <span className=\"flex h-4 w-4 flex-shrink-0 items-center justify-center\">{icon}</span>}\n <span className=\"flex-1 text-left\">{itemLabel}</span>\n <span className={isOpen ? 'rotate-180' : ''}>{MOBILE_CHEVRON}</span>\n </button>\n {isOpen && <MobilePanel panel={panel as AnyEl} onNavigate={() => setOpen(false)} />}\n </div>\n )\n })}\n </div>\n )}\n </div>\n )\n}\n\n// ── Compound export ─────────────────────────────────────────────────────────────\n\nMegaMenu.Item = MegaMenuItem\nMegaMenu.Panel = MegaMenuPanel\nMegaMenu.Section = MegaMenuSection\nMegaMenu.Link = MegaMenuLink\nMegaMenu.Featured = MegaMenuFeatured\n\nexport default MegaMenu\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'\nimport { Field, fieldShell, type FieldSize } from './_field'\n\nexport interface TextInputProps {\n /** Controlled string value. */\n value?: string\n /** Native change handler — read `e.target.value`. */\n onChange?: React.ChangeEventHandler<HTMLInputElement>\n /** Disable interaction and dim the field. */\n disabled?: boolean\n /** Field label rendered above (vertical) or beside (horizontal) the input. */\n label?: React.ReactNode\n /** `id` for the input + the `<label htmlFor>` link. */\n htmlFor?: string\n /** Placeholder shown when the field is empty. */\n placeholder?: string\n /** Native form field name (used for `FormData` serialisation). */\n name?: string\n /** Native input type. Defaults to `'text'`. */\n type?: 'text' | 'email' | 'url' | 'tel'\n /** Inline style applied to the `<input>` element. */\n inputStyle?: React.CSSProperties\n /** Inline style applied to the field shell / adornment wrapper. */\n style?: React.CSSProperties\n /** Label/input orientation. Defaults to `'vertical'`. */\n layout?: 'horizontal' | 'vertical'\n /** Size preset — controls height, padding, and font. Default `'md'`. */\n size?: FieldSize\n /** Native blur handler. */\n onBlur?: React.FocusEventHandler<HTMLInputElement>\n /** Validation message — shown under the input; also flags it red + `aria-invalid`. */\n errorMessage?: React.ReactNode\n /** Contextual help revealed via an info icon + tooltip beside the label. */\n helperText?: React.ReactNode\n /** Extra classes merged onto the field root element. */\n className?: string\n /** Mark the field required (renders an asterisk after the label). */\n required?: boolean\n /** Optional leading adornment (icon / prefix). */\n prefix?: React.ReactNode\n /** Optional trailing adornment (icon / suffix / unit). */\n suffix?: React.ReactNode\n /** @deprecated Use `htmlFor`. */\n id?: string\n}\n\n/**\n * Single-line text input. Full-width by default (responsive) — constrain it\n * with the parent layout or `style={{ maxWidth }}`. Supports an optional\n * leading `prefix` and trailing `suffix` adornment (icon, unit, etc.).\n *\n * @example\n * ```tsx\n * <TextInput label=\"Vessel name\" value={name} onChange={(e) => setName(e.target.value)} />\n * ```\n *\n * @example With adornment + error\n * ```tsx\n * <TextInput\n * label=\"IMO\"\n * prefix={<HashIcon />}\n * value={imo}\n * onChange={onChange}\n * errorMessage={touched && !valid ? 'Invalid IMO number' : undefined}\n * />\n * ```\n */\nexport default function TextInput({\n value,\n onChange,\n disabled,\n label,\n htmlFor,\n placeholder,\n name,\n type = 'text',\n inputStyle,\n style,\n layout = 'vertical',\n size = 'md',\n onBlur,\n errorMessage,\n helperText,\n className,\n required,\n prefix,\n suffix,\n}: TextInputProps) {\n const errorId = useId()\n const hasError = errorMessage != null\n const hasAdornment = prefix != null || suffix != null\n\n const input = (\n <input\n autoComplete=\"off\"\n disabled={disabled}\n value={value}\n onChange={onChange}\n onBlur={onBlur}\n type={type}\n name={name}\n id={htmlFor}\n aria-invalid={hasError || undefined}\n aria-describedby={hasError ? errorId : undefined}\n placeholder={placeholder ?? ''}\n // When wrapped for adornments, the input is borderless/transparent\n // and the wrapper carries the shell. Otherwise the input IS the shell.\n className={\n hasAdornment\n ? 'min-w-0 flex-1 bg-transparent outline-none disabled:cursor-not-allowed placeholder:text-foreground-muted'\n : fieldShell({ size, hasError, disabled })\n }\n style={inputStyle}\n />\n )\n\n return (\n <Field className={className}\n label={label}\n htmlFor={htmlFor}\n errorId={errorId}\n errorMessage={errorMessage}\n helperText={helperText}\n layout={layout}\n required={required}\n >\n {hasAdornment ? (\n <div\n className={`flex items-center ${fieldShell({ size, hasError, disabled, focusWithin: true })}`}\n style={style}\n >\n {prefix && <span className=\"flex-shrink-0 mr-2 text-foreground-muted\">{prefix}</span>}\n {input}\n {suffix && <span className=\"flex-shrink-0 ml-2 text-foreground-muted\">{suffix}</span>}\n </div>\n ) : (\n input\n )}\n </Field>\n )\n}\n","import React, { useId } from 'react'\nimport { Field, fieldShell, type FieldSize } from './_field'\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 /** Field label, placed above (vertical) or beside (horizontal) the control. */\n label?: React.ReactNode\n /** The control id; the field label links to it for accessibility. */\n htmlFor?: string\n /** Native form field name (used for FormData serialisation). */\n name?: string\n /** Disable interaction and dim the control. */\n disabled?: boolean\n /** Label/input orientation. Defaults to `'vertical'`. */\n layout?: 'horizontal' | 'vertical'\n /** Size preset. Default `'md'`. */\n size?: FieldSize\n /** Validation message — shown under the control; also flags it red and sets aria-invalid. */\n errorMessage?: React.ReactNode\n /** Contextual help revealed via an info icon + tooltip beside the label. */\n helperText?: React.ReactNode\n /** Extra classes merged onto the field root element. */\n className?: string\n /** Show a required asterisk after the label. */\n required?: boolean\n /** Inline style applied to the inner input element. */\n inputStyle?: React.CSSProperties\n /** Inline style applied to the label. */\n labelStyle?: React.CSSProperties\n /** Placeholder shown when the field is empty. */\n placeholder?: string\n /** Inline style applied to the control shell. */\n style?: React.CSSProperties\n /** Minimum allowed value. */\n min?: number\n /** Maximum allowed value. */\n max?: number\n /** Render read-only — visible but not editable. */\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 = 'vertical',\n size = 'md',\n errorMessage,\n helperText,\n className,\n required,\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 <Field className={className}\n label={label}\n htmlFor={htmlFor}\n errorId={errorId}\n errorMessage={errorMessage} helperText={helperText}\n layout={layout}\n required={required}\n labelStyle={labelStyle}\n >\n {/* `overflow-hidden` clips the stepper buttons to the rounded\n shell; `pr-0` removes the shell's right padding so the steppers\n sit flush against the edge. */}\n <div\n style={style}\n className={`flex items-center overflow-hidden pr-0 ${fieldShell({ size, hasError, disabled, focusWithin: true })}`}\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=\"min-w-0 flex-1 bg-transparent outline-none h-full disabled:cursor-not-allowed [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none placeholder:text-foreground-muted\"\n style={inputStyle}\n placeholder={placeholder ?? ''}\n readOnly={readOnly}\n />\n <div className=\"flex flex-col self-stretch border-l border-border flex-shrink-0\">\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 text-foreground-muted hover:bg-surface-raised hover:text-foreground disabled:opacity-30 disabled:cursor-not-allowed transition-colors\"\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 text-foreground-muted hover:bg-surface-raised hover:text-foreground disabled:opacity-30 disabled:cursor-not-allowed transition-colors 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 </Field>\n )\n}\n","import React, { useId, useState } from 'react'\nimport { Field, fieldShell, FIELD_SIZE, type FieldSize } from './_field'\n\nexport interface PasswordProps {\n /** Controlled value. */\n value?: string\n /** Fires when the value changes. */\n onChange?: React.ChangeEventHandler<HTMLInputElement>\n /** Disable interaction and dim the control. */\n disabled?: boolean\n /** Field label, placed above (vertical) or beside (horizontal) the control. */\n label?: React.ReactNode\n /** The control id; the field label links to it for accessibility. */\n htmlFor?: string\n /** Placeholder shown when the field is empty. */\n placeholder?: string\n /** Native form field name (used for FormData serialisation). */\n name?: string\n /** Inline style applied to the inner input element. */\n inputStyle?: React.CSSProperties\n /** Inline style applied to the control shell. */\n style?: React.CSSProperties\n /** Label/input orientation. Defaults to `'vertical'`. */\n layout?: 'horizontal' | 'vertical'\n /** Size preset — controls height, padding, and font. Default `'md'`. */\n size?: FieldSize\n /** Blur handler — useful for touched/validation timing. */\n onBlur?: React.FocusEventHandler<HTMLInputElement>\n /** Validation message — shown under the control; also flags it red and sets aria-invalid. */\n errorMessage?: React.ReactNode\n /** Contextual help revealed via an info icon + tooltip beside the label. */\n helperText?: React.ReactNode\n /** Extra classes merged onto the field root element. */\n className?: string\n /** Show a required asterisk after the label. */\n required?: boolean\n /** Override the \"reveal\" (password hidden) icon. */\n showIcon?: React.ReactNode\n /** Override the \"hide\" (password visible) icon. */\n hideIcon?: React.ReactNode\n}\n\nconst EyeIcon = (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"w-5 h-5\" aria-hidden=\"true\">\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 EyeSlashIcon = (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"w-5 h-5\" aria-hidden=\"true\">\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\n/**\n * Password input with a show/hide reveal toggle. Full-width by default.\n * The reveal/hide icons can be overridden via `showIcon` / `hideIcon`.\n *\n * @example\n * ```tsx\n * <Password label=\"Password\" value={pw} onChange={(e) => setPw(e.target.value)} />\n * ```\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 = 'vertical',\n size = 'md',\n onBlur,\n errorMessage,\n helperText,\n className,\n required,\n showIcon,\n hideIcon,\n}: PasswordProps) {\n const [visible, setVisible] = useState(false)\n const errorId = useId()\n const hasError = errorMessage != null\n\n return (\n <Field className={className}\n label={label}\n htmlFor={htmlFor}\n errorId={errorId}\n errorMessage={errorMessage} helperText={helperText}\n layout={layout}\n required={required}\n >\n <div\n className={`flex items-center ${fieldShell({ size, hasError, disabled, focusWithin: true })}`}\n style={style}\n >\n <input\n autoComplete=\"off\"\n disabled={disabled}\n value={value}\n onChange={onChange}\n onBlur={onBlur}\n type={visible ? 'text' : 'password'}\n name={name}\n id={htmlFor}\n aria-invalid={hasError || undefined}\n aria-describedby={hasError ? errorId : undefined}\n placeholder={placeholder ?? ''}\n className=\"min-w-0 flex-1 bg-transparent outline-none disabled:cursor-not-allowed placeholder:text-foreground-muted\"\n style={inputStyle}\n />\n <button\n type=\"button\"\n disabled={disabled}\n className={`flex-shrink-0 ml-2 ${FIELD_SIZE[size].gap} rounded text-foreground-muted hover:text-foreground transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-accent disabled:cursor-not-allowed`}\n onClick={() => setVisible((v) => !v)}\n aria-label={visible ? 'Hide password' : 'Show password'}\n >\n {visible ? (hideIcon ?? EyeSlashIcon) : (showIcon ?? EyeIcon)}\n </button>\n </div>\n </Field>\n )\n}\n","import React, { useId } from 'react'\nimport * as CheckboxPrimitive from '@radix-ui/react-checkbox'\nimport { FieldHelpIcon } from './_field'\n\nexport interface CheckboxProps {\n /** Controlled checked state. */\n checked?: boolean\n /** Fires `{ target: { checked, id, name } }` for form-handler compatibility. */\n onChange?: (e: { target: { checked: boolean; id?: string; name?: string } }) => void\n /** Primary label text. */\n label?: React.ReactNode\n /** Secondary line rendered under the label (same affordance as RadioGroup options). */\n description?: React.ReactNode\n /** Native form field name. */\n name?: string\n /** `id` for the control and the `<label htmlFor>` link. */\n htmlFor?: string\n /** Validation message — shown under the control; also flags the box red + `aria-invalid`. */\n errorMessage?: React.ReactNode\n /** Contextual help revealed via an info icon + tooltip beside the label. */\n helperText?: React.ReactNode\n /** Disable interaction + dim the control. */\n disabled?: boolean\n /** Show a required asterisk after the label. */\n required?: boolean\n /**\n * Box + label arrangement.\n * - `'horizontal'` (default): box and label on one row.\n * - `'vertical'`: box and label stacked.\n */\n layout?: 'horizontal' | 'vertical'\n /**\n * Which side of the box the label sits on.\n * - `'right'` (default): box then label.\n * - `'left'`: label then box (the description always wraps under the label).\n */\n labelPosition?: 'left' | 'right'\n /** @deprecated Use `checked`. Kept for API compatibility. */\n value?: boolean\n /** Extra classes merged onto the component root. */\n className?: string\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 on first check. Supports a secondary\n * `description`, `helperText` tooltip, left/right label placement, and the\n * shared error treatment — so it lines up with every other input in a form.\n *\n * Emits `{ target: { checked, id, name } }` for drop-in use with existing\n * change handlers.\n *\n * @example\n * <Checkbox\n * htmlFor=\"agree\"\n * label=\"I agree to the terms\"\n * description=\"You can revoke consent any time in settings.\"\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 description,\n name,\n htmlFor,\n errorMessage,\n helperText,\n disabled = false,\n required,\n layout = 'horizontal',\n labelPosition = 'right',\n className = '',\n}: CheckboxProps) {\n const isChecked = checked ?? value ?? false\n const labelFirst = labelPosition === 'left'\n const errorId = useId()\n const hasError = errorMessage != null\n\n const box = (\n <CheckboxPrimitive.Root\n id={htmlFor}\n name={name}\n checked={isChecked}\n disabled={disabled}\n required={required}\n onCheckedChange={(c) => onChange?.({ target: { checked: !!c, id: htmlFor, name } })}\n className={[\n 'relative mt-0.5 flex h-[18px] w-[18px] flex-shrink-0 items-center justify-center',\n 'rounded-sm border transition-colors duration-150',\n hasError ? 'border-status-error' : 'border-border-strong',\n 'data-[state=checked]:bg-accent data-[state=checked]:border-accent',\n // Focus halo matches the field tokens for a consistent look.\n 'focus:outline-none focus-visible:ring-[3px] focus-visible:ring-focus-ring',\n 'disabled:cursor-not-allowed',\n ].join(' ')}\n aria-label={typeof label === 'string' ? label : undefined}\n aria-invalid={hasError || undefined}\n aria-describedby={hasError ? errorId : undefined}\n >\n <CheckboxPrimitive.Indicator className=\"flex items-center justify-center data-[state=checked]:animate-check-pop\">\n <svg width=\"11\" height=\"9\" viewBox=\"0 0 11 9\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M1 4.5L4 7.5L10 1\" stroke=\"white\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n )\n\n const labelText = label != null && (\n <label\n htmlFor={htmlFor}\n className={['block select-none text-sm text-foreground leading-snug', disabled ? 'cursor-not-allowed opacity-50' : 'cursor-pointer'].join(' ')}\n >\n {label}\n {required && <span className=\"text-status-error ml-0.5\" aria-hidden=\"true\">*</span>}\n </label>\n )\n const descriptionEl = description != null && (\n <label\n htmlFor={htmlFor}\n className={`block text-xs text-foreground-secondary mt-0.5 ${disabled ? 'opacity-50 cursor-not-allowed' : 'cursor-pointer'}`}\n >\n {description}\n </label>\n )\n\n // Compose box + label, with the description always wrapping UNDER the label.\n let content: React.ReactNode\n if (layout === 'vertical') {\n content = (\n <span className=\"flex flex-col items-start gap-1.5\">\n {labelFirst ? <>{labelText}{box}</> : <>{box}{labelText}</>}\n {descriptionEl}\n </span>\n )\n } else if (labelFirst) {\n content = (\n <span className=\"flex flex-col\">\n <span className=\"flex items-start gap-2.5\">{labelText}{box}</span>\n {descriptionEl}\n </span>\n )\n } else {\n content = (\n <span className=\"flex items-start gap-2.5\">\n {box}\n <span className=\"flex flex-col\">{labelText}{descriptionEl}</span>\n </span>\n )\n }\n\n return (\n <div className={`flex flex-col gap-1 ${className}`.trim()}>\n <div className=\"flex items-start gap-1\">\n {content}\n {helperText != null && <FieldHelpIcon text={helperText} />}\n </div>\n {hasError && <span id={errorId} className=\"text-xs text-status-error mt-0.5\">{errorMessage}</span>}\n </div>\n )\n}\n","import React, { useId } from 'react'\nimport * as RadioGroupPrimitive from '@radix-ui/react-radio-group'\nimport { Field, type FieldSize } from './_field'\n\nexport interface RadioOption {\n /** Stable value submitted / reported on change. */\n value: string\n /** Main label text. */\n label: React.ReactNode\n /** Optional secondary description rendered under the label. */\n description?: React.ReactNode\n /** Disable this option only. */\n disabled?: boolean\n}\n\nexport interface RadioGroupProps {\n /** The selectable options. */\n options: RadioOption[]\n /** Controlled selected value. */\n value?: string\n /** Uncontrolled initial value. */\n defaultValue?: string\n /** Fires when the value changes. */\n onChange?: (value: string) => void\n /** Native form field name (used for FormData serialisation). */\n name?: string\n /** Field label, placed above (vertical) or beside (horizontal) the control. */\n label?: React.ReactNode\n /**\n * Option arrangement. `'vertical'` (default) stacks options in a column;\n * `'horizontal'` lays them in a row. Named `layout` for consistency with\n * the other inputs.\n */\n layout?: 'vertical' | 'horizontal'\n /**\n * Where each option's label sits relative to its radio dot.\n * `'right'` (default) → dot then label; `'left'` → label then dot.\n */\n labelPosition?: 'left' | 'right'\n /** Size preset — controls the dot + text size. Default `'md'`. */\n size?: FieldSize\n /** Disable interaction and dim the control. */\n disabled?: boolean\n /** Show a required asterisk after the label. */\n required?: boolean\n /** Contextual help revealed via an info icon + tooltip beside the label. */\n helperText?: React.ReactNode\n /** Extra classes merged onto the field root element. */\n className?: string\n /** Validation message — shown under the control; also flags it red and sets aria-invalid. */\n errorMessage?: React.ReactNode\n}\n\nconst DOT_SIZE: Record<FieldSize, string> = {\n sm: 'h-3.5 w-3.5',\n md: 'h-4 w-4',\n lg: 'h-5 w-5',\n}\n\nconst TEXT_SIZE: Record<FieldSize, string> = {\n sm: 'text-xs',\n md: 'text-sm',\n lg: 'text-base',\n}\n\n/**\n * Radio group built on `@radix-ui/react-radio-group`. Each option can carry\n * a `description`, and options can be disabled individually. Radix handles\n * arrow-key roving focus, `role=\"radiogroup\"`, and selection semantics.\n *\n * Form-friendly: pass `name` for native form serialisation, `errorMessage`\n * for validation, `required` for the asterisk + `aria-required`.\n *\n * @example\n * ```tsx\n * <RadioGroup\n * label=\"Notification frequency\"\n * name=\"freq\"\n * value={freq}\n * onChange={setFreq}\n * options={[\n * { value: 'realtime', label: 'Real-time', description: 'Notify me immediately' },\n * { value: 'daily', label: 'Daily digest' },\n * { value: 'off', label: 'Off', disabled: true },\n * ]}\n * />\n * ```\n */\nexport default function RadioGroup({\n options,\n value,\n defaultValue,\n onChange,\n name,\n label,\n layout = 'vertical',\n labelPosition = 'right',\n size = 'md',\n disabled,\n required,\n helperText,\n className,\n errorMessage,\n}: RadioGroupProps) {\n const errorId = useId()\n const groupId = useId()\n const hasError = errorMessage != null\n const labelFirst = labelPosition === 'left'\n\n return (\n <Field className={className}\n label={label}\n htmlFor={groupId}\n errorId={errorId}\n errorMessage={errorMessage}\n required={required}\n helperText={helperText}\n >\n <RadioGroupPrimitive.Root\n id={groupId}\n name={name}\n value={value}\n defaultValue={defaultValue}\n onValueChange={onChange}\n disabled={disabled}\n required={required}\n aria-invalid={hasError || undefined}\n aria-describedby={hasError ? errorId : undefined}\n orientation={layout}\n className={layout === 'horizontal' ? 'flex flex-row flex-wrap gap-5' : 'flex flex-col gap-3'}\n >\n {options.map((opt) => {\n const itemId = `${groupId}-${opt.value}`\n const dot = (\n <RadioGroupPrimitive.Item\n id={itemId}\n value={opt.value}\n disabled={opt.disabled}\n className={[\n DOT_SIZE[size],\n 'mt-0.5 flex-shrink-0 rounded-full border bg-surface transition-colors duration-150',\n 'border-border-strong',\n 'hover:border-accent',\n 'data-[state=checked]:border-accent',\n // Border-only focus, consistent with the fields.\n 'focus:outline-none focus-visible:border-accent',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n ].join(' ')}\n >\n <RadioGroupPrimitive.Indicator className=\"flex h-full w-full items-center justify-center\">\n <span className=\"block h-1/2 w-1/2 rounded-full bg-accent\" />\n </RadioGroupPrimitive.Indicator>\n </RadioGroupPrimitive.Item>\n )\n const labelClass = [\n 'block select-none',\n opt.disabled ? 'cursor-not-allowed opacity-50' : 'cursor-pointer',\n ].join(' ')\n const labelTextEl = (\n <label htmlFor={itemId} className={labelClass}>\n <span className={`block ${TEXT_SIZE[size]} text-foreground`}>{opt.label}</span>\n </label>\n )\n const descriptionEl = opt.description ? (\n <label\n htmlFor={itemId}\n className={`block text-xs text-foreground-secondary mt-0.5 ${opt.disabled ? 'opacity-50 cursor-not-allowed' : 'cursor-pointer'}`}\n >\n {opt.description}\n </label>\n ) : null\n\n // Label-left: dot sits directly beside the label on the\n // first line, and any description wraps UNDER the label\n // (full width) — so the dot never gets pushed away by a long\n // description, and dots line up under each other.\n if (labelFirst) {\n return (\n <div key={opt.value} className=\"flex flex-col\">\n <div className=\"flex items-start gap-2.5\">\n {labelTextEl}\n {dot}\n </div>\n {descriptionEl}\n </div>\n )\n }\n // Label-right (default): dot first, then label + description.\n return (\n <div key={opt.value} className=\"flex items-start gap-2.5\">\n {dot}\n <span className=\"flex flex-col\">\n {labelTextEl}\n {descriptionEl}\n </span>\n </div>\n )\n })}\n </RadioGroupPrimitive.Root>\n </Field>\n )\n}\n","import React, { useId, useState } from 'react'\nimport * as SwitchPrimitive from '@radix-ui/react-switch'\nimport { Field } from './_field'\n\nexport interface SwitchInputProps {\n /** Controlled on/off state. */\n checked?: boolean\n /** Uncontrolled initial state. */\n defaultChecked?: boolean\n /** Fires when the value changes. */\n onChange?: (e: { target: { checked: boolean; name?: string } }) => void\n /** Thumb icon shown when on. */\n checkedIcon?: React.ReactNode\n /** Thumb icon shown when off. */\n uncheckedIcon?: React.ReactNode\n\n // ── Field-level labelling (mode 1) ──────────────────────────────────────\n /**\n * Central field label, positioned per `layout` (above in vertical, beside\n * in horizontal) — the same affordance every other input uses.\n */\n label?: React.ReactNode\n /** Label/control orientation. Default `'horizontal'`. */\n layout?: 'horizontal' | 'vertical'\n /** Contextual help revealed via an info icon + tooltip beside the label. */\n helperText?: React.ReactNode\n /** Extra classes merged onto the field root element. */\n className?: string\n\n // ── Per-state labelling (mode 2) ────────────────────────────────────────\n /** Label rendered to the left of the track, emphasised while off. */\n offLabel?: React.ReactNode\n /** Label rendered to the right of the track, emphasised while on. */\n onLabel?: React.ReactNode\n\n // ── Form participation ──────────────────────────────────────────────────\n /** Native form field name (used for FormData serialisation). */\n name?: string\n /** Show a required asterisk after the label. */\n required?: boolean\n /** Disable interaction and dim the control. */\n disabled?: boolean\n /** Validation message — shown under the control; also flags it red and sets aria-invalid. */\n errorMessage?: React.ReactNode\n}\n\n/**\n * Form switch (on/off toggle) powered by Radix Switch.\n *\n * Two labelling modes, usable together or apart:\n * - **central `label`** positioned by `layout` (the standard field label), and\n * - **per-state `offLabel` / `onLabel`** flanking the track, each emphasised\n * when its state is active (the \"Off ▮ On\" pattern).\n *\n * Form-ready: pass `name` for native serialisation (Radix emits a hidden\n * input), `errorMessage` for validation, `required` for the asterisk.\n *\n * Works controlled (`checked` + `onChange`) or uncontrolled (`defaultChecked`).\n *\n * @example\n * <Switch label=\"Email notifications\" checked={on} onChange={({ target }) => setOn(target.checked)} />\n * <Switch offLabel=\"Monthly\" onLabel=\"Yearly\" checked={yearly} onChange={...} />\n */\nexport default function Switch({\n checked,\n defaultChecked = false,\n onChange,\n checkedIcon,\n uncheckedIcon,\n label,\n layout = 'horizontal',\n helperText,\n className,\n offLabel,\n onLabel,\n name,\n required,\n disabled,\n errorMessage,\n}: SwitchInputProps) {\n const id = useId()\n const errorId = useId()\n const hasError = errorMessage != null\n\n // Controlled when `checked` is provided; otherwise track internally so the\n // per-state labels still light up correctly.\n const isControlled = checked !== undefined\n const [internal, setInternal] = useState(defaultChecked)\n const isOn = isControlled ? checked : internal\n\n const handle = (c: boolean) => {\n if (!isControlled) setInternal(c)\n onChange?.({ target: { checked: c, name } })\n }\n\n const stateLabel = (active: boolean) =>\n [\n 'text-sm select-none transition-colors',\n active ? 'text-foreground font-medium' : 'text-foreground-muted',\n disabled ? 'opacity-50' : 'cursor-pointer',\n ].filter(Boolean).join(' ')\n\n return (\n <Field className={className}\n label={label}\n htmlFor={id}\n errorId={errorId}\n errorMessage={errorMessage}\n layout={layout}\n required={required}\n helperText={helperText}\n // The switch track is short (24px); centre the label against it\n // rather than nudging down to a 36px input's first line.\n labelAlign=\"center\"\n >\n <div className=\"flex items-center gap-2.5\">\n {offLabel != null && (\n <label htmlFor={id} className={stateLabel(!isOn)}>{offLabel}</label>\n )}\n\n <SwitchPrimitive.Root\n id={id}\n name={name}\n checked={isOn}\n onCheckedChange={handle}\n disabled={disabled}\n required={required}\n aria-invalid={hasError || undefined}\n aria-describedby={hasError ? errorId : undefined}\n className=\"relative inline-flex h-6 w-11 flex-shrink-0 items-center rounded-full bg-foreground-secondary data-[state=checked]:bg-accent transition-colors focus:outline-none focus-visible:ring-[3px] focus-visible:ring-focus-ring disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n {/* Thumb is 20px inside a 24px track (2px inset each side),\n travelling 2px → 22px. Keeping the thumb SMALLER than the\n track is what makes it read as a clean pill rather than a\n bulging blob. */}\n <SwitchPrimitive.Thumb\n className=\"pointer-events-none flex h-5 w-5 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-[2px]\"\n >\n {checkedIcon && uncheckedIcon\n ? <span className=\"flex items-center justify-center w-3 h-3\">{isOn ? checkedIcon : uncheckedIcon}</span>\n : null}\n </SwitchPrimitive.Thumb>\n </SwitchPrimitive.Root>\n\n {onLabel != null && (\n <label htmlFor={id} className={stateLabel(isOn)}>{onLabel}</label>\n )}\n </div>\n </Field>\n )\n}\n","import React, { useEffect, useId, useRef, useState } from 'react'\nimport * as Popover from '@radix-ui/react-popover'\nimport LoadingSpinner from '../core/LoadingSpinner'\nimport { Field, fieldShell, type FieldSize } from './_field'\n\nexport interface AutoCompleteItem {\n key: string\n value: string\n label: string\n icon?: React.ReactNode\n}\n\nexport interface AutoCompleteProps {\n /** Disable interaction and dim the control. */\n disabled?: boolean\n /** Field label, placed above (vertical) or beside (horizontal) the control. */\n label?: React.ReactNode\n /** Placeholder shown when the field is empty. */\n placeholder?: string\n /** Native form field name (used for FormData serialisation). */\n name?: string\n /** Inline style applied to the inner input element. */\n inputStyle?: React.CSSProperties\n /** Inline style applied to the control shell. */\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 /** Fires when a suggestion is selected, with its value. */\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 /** Size preset. Default `'md'`. */\n size?: FieldSize\n /** Override the leading search icon (hidden while loading). */\n icon?: React.ReactNode\n /** Validation message — turns the field red and links via aria-describedby. */\n errorMessage?: React.ReactNode\n /** Contextual help revealed via an info icon + tooltip beside the label. */\n helperText?: React.ReactNode\n /** Extra classes merged onto the field root element. */\n className?: string\n /** Mark required (asterisk after the label). */\n required?: boolean\n /** The control id; the field label links to it for accessibility. */\n htmlFor?: 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 size = 'md',\n icon,\n errorMessage,\n helperText,\n className,\n required,\n htmlFor,\n}: AutoCompleteProps) {\n const errorId = useId()\n const hasError = errorMessage != null\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 <Field className={className}\n label={label}\n htmlFor={htmlFor}\n errorId={errorId}\n errorMessage={errorMessage} helperText={helperText}\n layout={layout}\n required={required}\n >\n <Popover.Root open={open && !disabled} onOpenChange={(o) => !disabled && setOpen(o)}>\n <Popover.Anchor asChild>\n <div className={`flex items-center ${fieldShell({ size, hasError, disabled, focusWithin: true })}`} style={style}>\n <input\n id={htmlFor}\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=\"min-w-0 flex-1 bg-transparent outline-none disabled:cursor-not-allowed placeholder:text-foreground-muted\"\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 aria-invalid={hasError || undefined}\n aria-describedby={hasError ? errorId : undefined}\n />\n {loading ? (\n <span className=\"ml-2 w-4 h-4 flex-shrink-0 flex items-center justify-center text-accent\" aria-hidden=\"true\">\n <LoadingSpinner inline size=\"xs\" spinnerColor=\"currentColor\" />\n </span>\n ) : (\n <span className=\"ml-2 flex-shrink-0 text-foreground-muted\">\n {icon ?? (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"w-4 h-4\" 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 </span>\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 </Field>\n )\n}\n","import React, { useEffect, useId, useMemo, useRef, useState } from 'react'\nimport * as Popover from '@radix-ui/react-popover'\nimport { fieldShell, Field, type FieldSize } from './_field'\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 /** Field label, placed above (vertical) or beside (horizontal) the control. */\n label?: React.ReactNode\n /** Placeholder shown when the field is empty. */\n placeholder?: string\n /** Form control id linkage. */\n htmlFor?: string\n /** Native form field name (used for FormData serialisation). */\n name?: string\n /** Label/trigger orientation. Defaults to `'horizontal'`. */\n layout?: 'horizontal' | 'vertical'\n /** Contextual help revealed via an info icon + tooltip beside the label. */\n helperText?: React.ReactNode\n /** Extra classes merged onto the field root element. */\n className?: string\n /** Show a required asterisk after the label. */\n required?: boolean\n /** Disable interaction and dim the control. */\n disabled?: boolean\n /** Validation message — shown under the control; also flags it red and sets aria-invalid. */\n errorMessage?: React.ReactNode\n /** Inline style applied to the control shell. */\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 /** Size preset. Default `'md'`. */\n size?: FieldSize\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 helperText,\n className,\n required,\n errorMessage,\n style,\n htmlFor,\n items = [],\n placeholder = 'Select…',\n parentsSelectable = true,\n defaultExpandedKeys = [],\n size = 'md',\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 <Field className={className}\n label={label}\n htmlFor={htmlFor}\n errorId={errorId}\n errorMessage={errorMessage}\n layout={layout}\n required={required}\n helperText={helperText}\n >\n <div>\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 cursor-pointer select-none ${!style?.width ? 'min-w-[240px]' : ''} ${fieldShell({ size, hasError, disabled })}`}\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 </Field>\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, { useId, useRef, useState } from 'react'\nimport { Field } from './_field'\n\nexport interface FileInputProps {\n /** Allow selecting more than one file. */\n allowMultiple?: boolean\n /** Fires when the value changes. */\n onChange?: (e: { target: { files: File[]; name?: string; id?: string; value?: string } }) => void\n /** Native form field name (used for FormData serialisation). */\n name?: string\n /** The control id; the field label links to it for accessibility. */\n htmlFor?: string\n /** Field label, placed above (vertical) or beside (horizontal) the control. */\n label?: React.ReactNode\n /** Accepted MIME types / extensions, e.g. `'.xlsx,application/pdf'`. */\n accept?: string\n /** Primary call-to-action copy. Default `'Click to upload or drag and drop'`. */\n prompt?: React.ReactNode\n /** Secondary hint under the prompt — typically the accepted types / max size. */\n hint?: React.ReactNode\n /** Maximum file size in bytes. Files above this are rejected with an error. */\n maxSize?: number\n /** Validation message — shown under the control; also flags it red and sets aria-invalid. */\n errorMessage?: React.ReactNode\n /** Contextual help revealed via an info icon + tooltip beside the label. */\n helperText?: React.ReactNode\n /** Extra classes merged onto the field root element. */\n className?: string\n /** Disable interaction and dim the control. */\n disabled?: boolean\n /** Show a required asterisk after the label. */\n required?: boolean\n /** Override the upload glyph in the empty state. */\n icon?: React.ReactNode\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B'\n const units = ['B', 'KB', 'MB', 'GB']\n const i = Math.floor(Math.log(bytes) / Math.log(1024))\n return `${(bytes / Math.pow(1024, i)).toFixed(i === 0 ? 0 : 1)} ${units[i]}`\n}\n\nconst UploadGlyph = (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.5} className=\"w-6 h-6\" aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 16V4m0 0L8 8m4-4l4 4M4 16v2a2 2 0 002 2h12a2 2 0 002-2v-2\" />\n </svg>\n)\n\nconst FileGlyph = (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.5} className=\"w-5 h-5\" aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M14 3v4a1 1 0 001 1h4M5 3h9l5 5v11a2 2 0 01-2 2H5a2 2 0 01-2-2V5a2 2 0 012-2z\" />\n </svg>\n)\n\n/**\n * Drag-and-drop file input with an enterprise dropzone aesthetic: a calm\n * dashed surface with a contained icon badge, primary + secondary copy, an\n * accent-tinted drag-over state, and selected files shown as horizontal chips\n * with name + size and a remove button.\n *\n * Keyboard-accessible (the dropzone is a `role=\"button\"` activatable via\n * Enter / Space) and form-friendly (`errorMessage`, `required`, `name`).\n *\n * @example\n * ```tsx\n * <FileInput\n * label=\"Crew manifest\"\n * accept=\".xlsx,.csv\"\n * hint=\"XLSX or CSV, up to 5 MB\"\n * maxSize={5 * 1024 * 1024}\n * onChange={(e) => setFile(e.target.files[0])}\n * />\n * ```\n */\nexport default function FileInput({\n allowMultiple = false,\n onChange,\n name,\n htmlFor,\n label,\n accept,\n prompt = 'Click to upload or drag and drop',\n hint,\n maxSize,\n errorMessage,\n helperText,\n className,\n disabled,\n required,\n icon,\n}: FileInputProps) {\n const inputRef = useRef<HTMLInputElement>(null)\n const errorId = useId()\n const [files, setFiles] = useState<File[]>([])\n const [dragging, setDragging] = useState(false)\n const [sizeError, setSizeError] = useState<string | null>(null)\n\n const effectiveError = errorMessage ?? sizeError ?? undefined\n\n const openPicker = () => { if (!disabled) inputRef.current?.click() }\n\n const commit = (list: File[]) => {\n if (maxSize != null) {\n const tooBig = list.find((f) => f.size > maxSize)\n if (tooBig) {\n setSizeError(`\"${tooBig.name}\" exceeds the ${formatBytes(maxSize)} limit`)\n return\n }\n }\n setSizeError(null)\n setFiles(list)\n onChange?.({ target: { files: list, name, id: htmlFor ?? name } })\n }\n\n const onDrop = (e: React.DragEvent) => {\n e.preventDefault()\n setDragging(false)\n if (disabled) return\n const dropped = Array.from(e.dataTransfer.files ?? [])\n commit(allowMultiple ? dropped : dropped.slice(0, 1))\n }\n\n const removeFile = (idx: number) => {\n const next = files.filter((_, i) => i !== idx)\n setFiles(next)\n setSizeError(null)\n onChange?.({ target: { files: next, name, id: htmlFor ?? name, value: '' } })\n if (next.length === 0 && inputRef.current) inputRef.current.value = ''\n }\n\n return (\n <Field className={className}\n label={label}\n htmlFor={htmlFor}\n errorId={errorId}\n errorMessage={effectiveError} helperText={helperText}\n required={required}\n >\n <div\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-label={typeof prompt === 'string' ? prompt : 'Upload file'}\n aria-disabled={disabled || undefined}\n aria-invalid={effectiveError != null || undefined}\n aria-describedby={effectiveError != null ? errorId : undefined}\n onClick={openPicker}\n onKeyDown={(e) => {\n if (disabled) return\n if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); openPicker() }\n }}\n onDragOver={(e) => { e.preventDefault(); if (!disabled) setDragging(true) }}\n onDragLeave={() => setDragging(false)}\n onDrop={onDrop}\n className={[\n 'group flex flex-col items-center justify-center gap-3 w-full rounded-xl border border-dashed px-6 py-8 text-center',\n 'transition-colors duration-150 focus:outline-none focus-visible:ring-[3px] focus-visible:ring-focus-ring',\n disabled\n ? 'border-border bg-surface-raised cursor-not-allowed opacity-60'\n : effectiveError != null\n ? 'border-status-error bg-surface cursor-pointer'\n : dragging\n ? 'border-accent bg-surface-raised cursor-copy'\n : 'border-border bg-surface hover:border-border-strong cursor-pointer',\n ].join(' ')}\n >\n <input\n id={htmlFor ?? name}\n name={name}\n onChange={(e) => commit(Array.from(e.target.files ?? []))}\n ref={inputRef}\n hidden\n type=\"file\"\n accept={accept}\n multiple={allowMultiple}\n disabled={disabled}\n />\n\n {/* Icon badge — a contained surface, not a giant raw glyph. */}\n <span\n className={[\n 'flex h-11 w-11 items-center justify-center rounded-full transition-colors duration-150',\n dragging ? 'bg-accent text-accent-fg' : 'bg-surface-raised text-foreground-secondary group-hover:text-foreground',\n ].join(' ')}\n >\n {icon ?? UploadGlyph}\n </span>\n\n <div className=\"space-y-0.5\">\n <div className=\"text-sm font-medium text-foreground\">\n {dragging ? 'Drop to upload' : prompt}\n </div>\n {hint && <div className=\"text-xs text-foreground-muted\">{hint}</div>}\n </div>\n </div>\n\n {/* Selected file chips */}\n {files.length > 0 && (\n <ul className=\"mt-3 flex flex-col gap-2\">\n {files.map((file, idx) => (\n <li\n key={`${idx}-${file.name}`}\n className=\"flex items-center gap-3 rounded-lg border border-border bg-surface px-3 py-2\"\n >\n <span className=\"flex-shrink-0 text-foreground-muted\">{FileGlyph}</span>\n <span className=\"flex-1 min-w-0\">\n <span className=\"block text-sm text-foreground truncate\">{file.name}</span>\n <span className=\"block text-xs text-foreground-muted\">{formatBytes(file.size)}</span>\n </span>\n <button\n type=\"button\"\n onClick={(e) => { e.stopPropagation(); removeFile(idx) }}\n aria-label={`Remove ${file.name}`}\n className=\"flex-shrink-0 w-7 h-7 inline-flex items-center justify-center rounded-md text-foreground-muted hover:text-status-error hover:bg-surface-raised 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.75\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n </li>\n ))}\n </ul>\n )}\n </Field>\n )\n}\n","import React, { useEffect, useId, useMemo, useRef, useState } from 'react'\nimport * as Popover from '@radix-ui/react-popover'\nimport { fieldShell, FieldLabel, type FieldSize } from './_field'\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 /** Field label, placed above (vertical) or beside (horizontal) the control. */\n label?: React.ReactNode\n /** Text shown in the trigger when no date is selected. Default `\"Select a date…\"`. */\n placeholder?: string\n /** The control id; the field label links to it for accessibility. */\n htmlFor?: string\n /** Native form field name (used for FormData serialisation). */\n name?: string\n /** Label/trigger orientation. Defaults to `'horizontal'`. */\n layout?: 'horizontal' | 'vertical'\n /** Contextual help revealed via an info icon + tooltip beside the label. */\n helperText?: React.ReactNode\n /** Show a required asterisk after the label. */\n required?: boolean\n /** Disable interaction and dim the control. */\n disabled?: boolean\n /** Validation message — shown under the control; also flags it red and sets aria-invalid. */\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 /** Inline style applied to the control shell. */\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 /** Size preset. Default `'md'`. */\n size?: FieldSize\n /** Extra classes merged onto the component root. */\n className?: string\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 helperText,\n required,\n disabled,\n errorMessage,\n min,\n max,\n style,\n format = defaultFormat,\n weekStartsOn = 0,\n clearable = true,\n size = 'md',\n className = '',\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 ${className}`.trim()}>\n <div className={`flex ${layout === 'vertical' ? 'flex-col gap-1.5' : 'flex-row items-start gap-3'}`}>\n <FieldLabel\n label={label}\n htmlFor={htmlFor}\n required={required}\n helperText={helperText}\n horizontal={layout === 'horizontal'}\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 cursor-pointer select-none ${!style?.width ? 'min-w-[200px]' : ''} ${fieldShell({ size, hasError, disabled })}`}\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","import React, { useId, useLayoutEffect, useRef } from 'react'\nimport { Field, fieldShell, type FieldSize } from './_field'\n\nexport interface TextAreaProps {\n /** Controlled value. */\n value?: string\n /** Fires when the value changes. */\n onChange?: React.ChangeEventHandler<HTMLTextAreaElement>\n /** Blur handler — useful for touched/validation timing. */\n onBlur?: React.FocusEventHandler<HTMLTextAreaElement>\n /** Disable interaction and dim the control. */\n disabled?: boolean\n /** Field label, placed above (vertical) or beside (horizontal) the control. */\n label?: React.ReactNode\n /** The control id; the field label links to it for accessibility. */\n htmlFor?: string\n /** Placeholder shown when the field is empty. */\n placeholder?: string\n /** Native form field name (used for FormData serialisation). */\n name?: string\n /** Label/control orientation. Default `'vertical'`. */\n layout?: 'horizontal' | 'vertical'\n /** Size preset — controls text size + padding. Default `'md'`. */\n size?: FieldSize\n /** Visible rows when not auto-growing. Default `4`. */\n rows?: number\n /**\n * Grow the textarea to fit its content instead of scrolling. When set, the\n * field expands between `rows` (min) and `maxRows` (cap, then scrolls).\n */\n autoGrow?: boolean\n /** Max rows when `autoGrow` is on. Default `12`. */\n maxRows?: number\n /** Native maxlength. When set with `showCount`, a live counter renders. */\n maxLength?: number\n /** Show a character counter (uses `maxLength` as the denominator if present). */\n showCount?: boolean\n /** CSS `resize` behaviour. Default `'vertical'` (or `'none'` when autoGrow). */\n resize?: 'none' | 'vertical' | 'horizontal' | 'both'\n /** Validation message — shown under the control; also flags it red and sets aria-invalid. */\n errorMessage?: React.ReactNode\n /** Contextual help revealed via an info icon + tooltip beside the label. */\n helperText?: React.ReactNode\n /** Extra classes merged onto the field root element. */\n className?: string\n /** Show a required asterisk after the label. */\n required?: boolean\n /** Inline style applied to the control shell. */\n style?: React.CSSProperties\n /** Inline style applied to the inner input element. */\n inputStyle?: React.CSSProperties\n}\n\nconst LINE_HEIGHT_PX = 21 // ~1.5 × 14px body text\n\n/**\n * Multi-line text input on the shared field foundation. Optional auto-grow\n * (expands with content between `rows` and `maxRows`), character counter, and\n * resize control. Same refined Halo Focus and error handling as the other\n * inputs.\n *\n * @example\n * ```tsx\n * <TextArea label=\"Notes\" value={notes} onChange={(e) => setNotes(e.target.value)} autoGrow />\n * ```\n *\n * @example With counter\n * ```tsx\n * <TextArea label=\"Bio\" maxLength={280} showCount value={bio} onChange={onChange} />\n * ```\n */\nexport default function TextArea({\n value,\n onChange,\n onBlur,\n disabled,\n label,\n htmlFor,\n placeholder,\n name,\n layout = 'vertical',\n size = 'md',\n rows = 4,\n autoGrow = false,\n maxRows = 12,\n maxLength,\n showCount = false,\n resize,\n errorMessage,\n helperText,\n className,\n required,\n style,\n inputStyle,\n}: TextAreaProps) {\n const errorId = useId()\n const hasError = errorMessage != null\n const ref = useRef<HTMLTextAreaElement>(null)\n\n // Auto-grow: recompute height on value change, clamped to maxRows.\n useLayoutEffect(() => {\n if (!autoGrow) return\n const el = ref.current\n if (!el) return\n el.style.height = 'auto'\n const maxH = maxRows * LINE_HEIGHT_PX + 16 // + vertical padding\n el.style.height = `${Math.min(el.scrollHeight, maxH)}px`\n el.style.overflowY = el.scrollHeight > maxH ? 'auto' : 'hidden'\n }, [value, autoGrow, maxRows])\n\n const count = typeof value === 'string' ? value.length : 0\n const resizeClass =\n (resize ?? (autoGrow ? 'none' : 'vertical')) === 'none' ? 'resize-none'\n : (resize ?? 'vertical') === 'horizontal' ? 'resize-x'\n : (resize ?? 'vertical') === 'both' ? 'resize'\n : 'resize-y'\n\n return (\n <Field className={className}\n label={label}\n htmlFor={htmlFor}\n errorId={errorId}\n errorMessage={errorMessage} helperText={helperText}\n layout={layout}\n required={required}\n >\n <textarea\n ref={ref}\n disabled={disabled}\n value={value}\n onChange={onChange}\n onBlur={onBlur}\n name={name}\n id={htmlFor}\n rows={rows}\n maxLength={maxLength}\n placeholder={placeholder ?? ''}\n aria-invalid={hasError || undefined}\n aria-describedby={hasError ? errorId : undefined}\n className={`${fieldShell({ size, hasError, disabled, sized: false })} px-3 py-2 leading-normal ${resizeClass}`}\n style={{ ...style, ...inputStyle }}\n />\n {showCount && (\n <div className=\"mt-1 text-right text-xs text-foreground-muted tabular-nums\">\n {maxLength != null ? `${count} / ${maxLength}` : count}\n </div>\n )}\n </Field>\n )\n}\n","import React, { useId, useState } from 'react'\nimport * as ToggleGroup from '@radix-ui/react-toggle-group'\nimport { Field, type FieldSize } from './_field'\n\nexport interface SegmentedOption {\n value: string\n label: React.ReactNode\n icon?: React.ReactNode\n disabled?: boolean\n}\n\nexport interface SegmentedControlProps {\n /** The selectable options. */\n options: SegmentedOption[]\n /** Controlled selected value. */\n value?: string\n /** Uncontrolled initial value. */\n defaultValue?: string\n /** Fires when the value changes. */\n onChange?: (value: string) => void\n /** Size preset. Default `'md'`. */\n size?: FieldSize\n /** Stretch to fill the container, segments share the width equally. */\n fullWidth?: boolean\n /** Disable interaction and dim the control. */\n disabled?: boolean\n\n // ── Field participation ─────────────────────────────────────────────────\n /** Optional label, positioned per `layout`. */\n label?: React.ReactNode\n /** Label/control orientation. Default `'vertical'`. */\n layout?: 'horizontal' | 'vertical'\n /** Contextual help revealed via an info icon + tooltip beside the label. */\n helperText?: React.ReactNode\n /** Extra classes merged onto the field root element. */\n className?: string\n /** Native form field name (emits a hidden input carrying the value). */\n name?: string\n /** Show a required asterisk after the label. */\n required?: boolean\n /** Validation message — shown under the control; also flags it red and sets aria-invalid. */\n errorMessage?: React.ReactNode\n /** Accessible label for the control. */\n 'aria-label'?: string\n}\n\nconst SIZE: Record<FieldSize, { h: string; text: string; pad: string }> = {\n sm: { h: 'h-control-sm', text: 'text-xs', pad: 'px-2.5' },\n md: { h: 'h-control-md', text: 'text-sm', pad: 'px-3.5' },\n lg: { h: 'h-control-lg', text: 'text-sm', pad: 'px-4' },\n}\n\n/**\n * Text-first segmented control for 2 to 4 mutually exclusive options\n * (view switchers, billing period, density). Built on\n * `@radix-ui/react-toggle-group` (single, non-deselectable) so arrow-key\n * roving focus comes for free.\n *\n * The selected segment lifts onto a surface-white \"pill\" inside a tinted\n * track, the macOS / iOS segmented-control pattern, rendered with the\n * system's tight radii and accent-colored active text.\n *\n * Form-ready: optional `label` (positioned via `layout`), `helperText`,\n * `errorMessage`, and a hidden input emitted when `name` is set.\n *\n * @example\n * ```tsx\n * <SegmentedControl\n * label=\"View\"\n * value={view}\n * onChange={setView}\n * options={[\n * { value: 'list', label: 'List' },\n * { value: 'board', label: 'Board' },\n * { value: 'calendar', label: 'Calendar' },\n * ]}\n * />\n * ```\n */\nexport default function SegmentedControl({\n options,\n value,\n defaultValue,\n onChange,\n size = 'md',\n fullWidth = false,\n disabled,\n label,\n layout = 'vertical',\n helperText,\n className,\n name,\n required,\n errorMessage,\n 'aria-label': ariaLabel,\n}: SegmentedControlProps) {\n const sz = SIZE[size]\n const groupId = useId()\n const errorId = useId()\n const hasError = errorMessage != null\n\n // Mirror the value internally so the hidden form input (and uncontrolled\n // usage) reflect the current selection.\n const isControlled = value !== undefined\n const [internal, setInternal] = useState(defaultValue)\n const current = isControlled ? value : internal\n\n const handle = (v: string) => {\n if (!v) return\n if (!isControlled) setInternal(v)\n onChange?.(v)\n }\n\n return (\n <Field className={className}\n label={label}\n htmlFor={groupId}\n errorId={errorId}\n errorMessage={errorMessage}\n layout={layout}\n required={required}\n helperText={helperText}\n >\n {name && <input type=\"hidden\" name={name} value={current ?? ''} />}\n <ToggleGroup.Root\n id={groupId}\n type=\"single\"\n value={current}\n onValueChange={handle}\n disabled={disabled}\n aria-label={ariaLabel ?? (typeof label === 'string' ? label : undefined)}\n aria-invalid={hasError || undefined}\n aria-describedby={hasError ? errorId : undefined}\n className={[\n 'inline-flex items-center gap-1 rounded-lg border bg-surface-raised p-1',\n hasError ? 'border-status-error' : 'border-border',\n sz.h,\n fullWidth ? 'flex w-full' : 'w-fit',\n disabled ? 'opacity-60 cursor-not-allowed' : '',\n ].filter(Boolean).join(' ')}\n >\n {options.map((opt) => (\n <ToggleGroup.Item\n key={opt.value}\n value={opt.value}\n disabled={opt.disabled}\n className={[\n 'inline-flex items-center justify-center gap-1.5 rounded-md select-none whitespace-nowrap',\n 'transition-colors duration-150 h-full',\n sz.text,\n sz.pad,\n fullWidth ? 'flex-1' : '',\n // Resting: muted text, transparent. Hover lifts the text.\n 'text-foreground-secondary hover:text-foreground',\n // Active: surface-white pill + accent text + subtle shadow.\n 'data-[state=on]:bg-surface data-[state=on]:text-accent data-[state=on]:shadow-sm',\n 'focus:outline-none focus-visible:ring-[3px] focus-visible:ring-focus-ring',\n 'disabled:opacity-40 disabled:cursor-not-allowed',\n ].filter(Boolean).join(' ')}\n >\n {opt.icon && <span className=\"flex-shrink-0\">{opt.icon}</span>}\n {opt.label}\n </ToggleGroup.Item>\n ))}\n </ToggleGroup.Root>\n </Field>\n )\n}\n","import React, { useId, useState } from 'react'\nimport * as SliderPrimitive from '@radix-ui/react-slider'\nimport { Field, FieldHelpIcon, type FieldSize } from './_field'\n\n/**\n * Slider value. A single number for a one-thumb slider, or a `[min, max]`\n * tuple for a two-thumb range slider. The shape you pass determines the mode.\n */\nexport type SliderValue = number | [number, number]\n\nexport interface SliderMark {\n value: number\n label?: React.ReactNode\n}\n\nexport interface SliderProps {\n /** Controlled value. */\n value?: SliderValue\n /** Uncontrolled initial value. */\n defaultValue?: SliderValue\n /** Fires when the value changes. */\n onChange?: (value: SliderValue) => void\n /** Fired once at the end of a drag/keyboard interaction. */\n onChangeEnd?: (value: SliderValue) => void\n /** Minimum allowed value. */\n min?: number\n /** Maximum allowed value. */\n max?: number\n /** Step increment between values. */\n step?: number\n /** Field label, placed above (vertical) or beside (horizontal) the control. */\n label?: React.ReactNode\n /** Show the current value(s) next to the label. */\n showValue?: boolean\n /** Format the displayed value (tooltip + value readout). */\n formatValue?: (n: number) => string\n /** Tick marks under the track. */\n marks?: SliderMark[]\n /** Show a value tooltip above the thumb while dragging. */\n tooltip?: boolean\n /** Size preset — controls height, padding, and font. Default 'md'. */\n size?: FieldSize\n /** Disable interaction and dim the control. */\n disabled?: boolean\n /** Validation message — shown under the control; also flags it red and sets aria-invalid. */\n errorMessage?: React.ReactNode\n /** Contextual help revealed via an info icon + tooltip beside the label. */\n helperText?: React.ReactNode\n /** Extra classes merged onto the field root element. */\n className?: string\n /** Show a required asterisk after the label. */\n required?: boolean\n /** Native form field name (used for FormData serialisation). */\n name?: string\n /** The control id; the field label links to it for accessibility. */\n htmlFor?: string\n}\n\nconst TRACK_H: Record<FieldSize, string> = { sm: 'h-1', md: 'h-1.5', lg: 'h-2' }\nconst THUMB: Record<FieldSize, string> = { sm: 'h-3.5 w-3.5', md: 'h-4 w-4', lg: 'h-5 w-5' }\n\nconst toArray = (v: SliderValue | undefined): number[] | undefined =>\n v == null ? undefined : Array.isArray(v) ? v : [v]\n\n/**\n * Range slider on `@radix-ui/react-slider`. Pass a single number for a\n * one-thumb slider or a `[min, max]` tuple for a two-thumb range. Optional\n * tick marks, a drag tooltip, and a value readout beside the label.\n *\n * @example Single\n * ```tsx\n * <Slider label=\"Volume\" value={vol} onChange={(v) => setVol(v as number)} showValue />\n * ```\n *\n * @example Range with marks\n * ```tsx\n * <Slider\n * label=\"Price\"\n * value={[20, 80]}\n * onChange={(v) => setRange(v as [number, number])}\n * marks={[{ value: 0, label: '$0' }, { value: 50, label: '$50' }, { value: 100, label: '$100' }]}\n * tooltip\n * />\n * ```\n */\nexport default function Slider({\n value,\n defaultValue,\n onChange,\n onChangeEnd,\n min = 0,\n max = 100,\n step = 1,\n label,\n showValue = false,\n formatValue = (n) => String(n),\n marks,\n tooltip = false,\n size = 'md',\n disabled,\n errorMessage,\n helperText,\n className,\n required,\n name,\n htmlFor,\n}: SliderProps) {\n const errorId = useId()\n const hasError = errorMessage != null\n const isRange = Array.isArray(value ?? defaultValue)\n\n // Track the live value for the tooltip / readout even in uncontrolled mode.\n const [internal, setInternal] = useState<number[]>(\n () => toArray(value) ?? toArray(defaultValue) ?? [min],\n )\n const current = toArray(value) ?? internal\n const [dragging, setDragging] = useState(false)\n\n const emit = (arr: number[]) => {\n setInternal(arr)\n const next: SliderValue = isRange ? [arr[0], arr[1]] : arr[0]\n onChange?.(next)\n }\n\n const valueText = current.map(formatValue).join(' – ')\n\n return (\n <Field className={className} label={undefined} errorId={errorId} errorMessage={errorMessage}>\n {(label || showValue) && (\n <div className=\"flex items-center justify-between mb-2\">\n {label && (\n <span className=\"flex items-center gap-1\">\n <label htmlFor={htmlFor} className=\"text-sm font-medium text-foreground select-none\">\n {label}\n {required && <span className=\"text-status-error ml-0.5\" aria-hidden=\"true\">*</span>}\n </label>\n {helperText != null && <FieldHelpIcon text={helperText} />}\n </span>\n )}\n {showValue && (\n <span className=\"text-sm text-foreground-secondary tabular-nums\">{valueText}</span>\n )}\n </div>\n )}\n\n <SliderPrimitive.Root\n id={htmlFor}\n name={name}\n value={toArray(value)}\n defaultValue={toArray(defaultValue)}\n min={min}\n max={max}\n step={step}\n disabled={disabled}\n aria-invalid={hasError || undefined}\n aria-describedby={hasError ? errorId : undefined}\n onValueChange={(v) => { emit(v); setDragging(true) }}\n onValueCommit={(v) => {\n setDragging(false)\n onChangeEnd?.(isRange ? [v[0], v[1]] : v[0])\n }}\n className=\"relative flex items-center select-none touch-none w-full h-5\"\n >\n <SliderPrimitive.Track className={`relative grow rounded-full bg-surface-raised border border-border ${TRACK_H[size]}`}>\n <SliderPrimitive.Range className=\"absolute h-full rounded-full bg-accent\" />\n </SliderPrimitive.Track>\n {current.map((_, i) => (\n <SliderPrimitive.Thumb\n key={i}\n className={`group relative block ${THUMB[size]} rounded-full border-2 border-accent bg-surface shadow-sm transition-shadow\n focus:outline-none focus-visible:ring-[3px] focus-visible:ring-focus-ring\n disabled:cursor-not-allowed`}\n >\n {tooltip && (\n <span\n className={`pointer-events-none absolute -top-8 left-1/2 -translate-x-1/2 rounded-md bg-foreground px-1.5 py-0.5 text-xs text-background tabular-nums whitespace-nowrap transition-opacity ${\n dragging ? 'opacity-100' : 'opacity-0 group-hover:opacity-100 group-focus-visible:opacity-100'\n }`}\n >\n {formatValue(current[i])}\n </span>\n )}\n </SliderPrimitive.Thumb>\n ))}\n </SliderPrimitive.Root>\n\n {marks && marks.length > 0 && (\n <div className=\"relative mt-2 h-4\">\n {marks.map((m) => {\n const pct = ((m.value - min) / (max - min)) * 100\n return (\n <span\n key={m.value}\n className=\"absolute -translate-x-1/2 text-xs text-foreground-muted tabular-nums\"\n style={{ left: `${pct}%` }}\n >\n {m.label ?? m.value}\n </span>\n )\n })}\n </div>\n )}\n </Field>\n )\n}\n","import React, { useId, useRef, useState } from 'react'\nimport { Field, fieldShell, type FieldSize } from './_field'\nimport Tag from './_tag'\n\nexport interface TagsInputProps {\n /** Controlled list of tags. */\n value?: string[]\n /** Uncontrolled initial tags. */\n defaultValue?: string[]\n /** Fires when the value changes. */\n onChange?: (tags: string[]) => void\n /** Field label, placed above (vertical) or beside (horizontal) the control. */\n label?: React.ReactNode\n /** The control id; the field label links to it for accessibility. */\n htmlFor?: string\n /** Native form field name (used for FormData serialisation). */\n name?: string\n /** Placeholder shown when the field is empty. */\n placeholder?: string\n /** Label/control orientation: 'horizontal' or 'vertical'. */\n layout?: 'horizontal' | 'vertical'\n /** Size preset — controls height, padding, and font. Default 'md'. */\n size?: FieldSize\n /** Disable interaction and dim the control. */\n disabled?: boolean\n /** Validation message — shown under the control; also flags it red and sets aria-invalid. */\n errorMessage?: React.ReactNode\n /** Contextual help revealed via an info icon + tooltip beside the label. */\n helperText?: React.ReactNode\n /** Extra classes merged onto the field root element. */\n className?: string\n /** Show a required asterisk after the label. */\n required?: boolean\n /** Maximum number of tags. Further input is ignored once reached. */\n maxTags?: number\n /** Reject duplicate tags (case-insensitive). Default `true`. */\n dedupe?: boolean\n /**\n * Validate a candidate tag before adding. Return `false` (or a string error\n * to surface) to reject. Receives the trimmed candidate + current tags.\n */\n validate?: (tag: string, tags: string[]) => boolean | string\n /** Characters that commit the current input as a tag. Default Enter + comma. */\n separators?: string[]\n}\n\n/**\n * Free-text entry that produces removable tag chips, distinct from Dropdown\n * (which picks from a fixed list). Type and press Enter or comma to add;\n * Backspace on an empty field removes the last tag; pasting a delimited string\n * splits into multiple tags. Optional dedupe, max-count, and per-tag validation.\n *\n * @example\n * ```tsx\n * <TagsInput label=\"Recipients\" value={emails} onChange={setEmails}\n * validate={(t) => /.+@.+\\..+/.test(t) || 'Not a valid email'} />\n * ```\n */\nexport default function TagsInput({\n value,\n defaultValue,\n onChange,\n label,\n htmlFor,\n name,\n placeholder = 'Add and press Enter',\n layout = 'vertical',\n size = 'md',\n disabled,\n errorMessage,\n helperText,\n className,\n required,\n maxTags,\n dedupe = true,\n validate,\n separators = ['Enter', ','],\n}: TagsInputProps) {\n const errorId = useId()\n const inputRef = useRef<HTMLInputElement>(null)\n const [internal, setInternal] = useState<string[]>(defaultValue ?? [])\n const [draft, setDraft] = useState('')\n const [localError, setLocalError] = useState<string | null>(null)\n\n const tags = value ?? internal\n const hasError = errorMessage != null || localError != null\n const errorText = errorMessage ?? localError ?? undefined\n\n const commitTags = (next: string[]) => {\n setInternal(next)\n onChange?.(next)\n }\n\n const addTag = (raw: string): boolean => {\n const tag = raw.trim()\n if (!tag) return false\n if (maxTags != null && tags.length >= maxTags) return false\n if (dedupe && tags.some((t) => t.toLowerCase() === tag.toLowerCase())) {\n setLocalError(`\"${tag}\" is already added`)\n return false\n }\n if (validate) {\n const res = validate(tag, tags)\n if (res !== true) {\n setLocalError(typeof res === 'string' ? res : `\"${tag}\" is not valid`)\n return false\n }\n }\n setLocalError(null)\n commitTags([...tags, tag])\n return true\n }\n\n const removeTag = (idx: number) => {\n commitTags(tags.filter((_, i) => i !== idx))\n setLocalError(null)\n }\n\n const onKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (separators.includes(e.key)) {\n e.preventDefault()\n if (addTag(draft)) setDraft('')\n } else if (e.key === 'Backspace' && draft === '' && tags.length > 0) {\n removeTag(tags.length - 1)\n }\n }\n\n const onPaste = (e: React.ClipboardEvent<HTMLInputElement>) => {\n const text = e.clipboardData.getData('text')\n // Split paste on commas / newlines / semicolons; if it yields multiple\n // parts, add them all and prevent the raw paste.\n const parts = text.split(/[\\n,;]+/).map((p) => p.trim()).filter(Boolean)\n if (parts.length > 1) {\n e.preventDefault()\n let added = false\n for (const p of parts) added = addTag(p) || added\n if (added) setDraft('')\n }\n }\n\n const atMax = maxTags != null && tags.length >= maxTags\n\n return (\n <Field className={className}\n label={label}\n htmlFor={htmlFor}\n errorId={errorId}\n errorMessage={errorText} helperText={helperText}\n layout={layout}\n required={required}\n >\n <div\n className={`flex flex-wrap items-center gap-1.5 min-h-[36px] ${fieldShell({ size, hasError, disabled, focusWithin: true, sized: false })} px-2 py-1.5`}\n onClick={() => inputRef.current?.focus()}\n >\n {tags.map((tag, idx) => (\n <Tag\n key={`${tag}-${idx}`}\n disabled={disabled}\n removeLabel={`Remove ${tag}`}\n onRemove={() => removeTag(idx)}\n >\n {tag}\n </Tag>\n ))}\n <input\n ref={inputRef}\n id={htmlFor}\n name={name}\n disabled={disabled || atMax}\n value={draft}\n onChange={(e) => { setDraft(e.target.value); if (localError) setLocalError(null) }}\n onKeyDown={onKeyDown}\n onPaste={onPaste}\n onBlur={() => { if (addTag(draft)) setDraft('') }}\n placeholder={atMax ? '' : (tags.length === 0 ? placeholder : '')}\n aria-invalid={hasError || undefined}\n aria-describedby={hasError ? errorId : undefined}\n autoComplete=\"off\"\n className=\"flex-1 min-w-[6rem] bg-transparent outline-none text-sm placeholder:text-foreground-muted disabled:cursor-not-allowed\"\n />\n </div>\n </Field>\n )\n}\n","import React, { useId, useRef } from 'react'\nimport { Field, type FieldSize } from './_field'\n\nexport interface OtpInputProps {\n /** Number of code boxes. Default `6`. */\n length?: number\n /** Controlled value. */\n value?: string\n /** Fires when the value changes. */\n onChange?: (code: string) => void\n /** Fired when every box is filled. */\n onComplete?: (code: string) => void\n /** Field label, placed above (vertical) or beside (horizontal) the control. */\n label?: React.ReactNode\n /** The control id; the field label links to it for accessibility. */\n htmlFor?: string\n /** Native form field name (used for FormData serialisation). */\n name?: string\n /** `'numeric'` (default) restricts to digits; `'alphanumeric'` allows letters too. */\n mode?: 'numeric' | 'alphanumeric'\n /** Render boxes as masked dots (for PIN entry). */\n masked?: boolean\n /** Size preset — controls height, padding, and font. Default 'md'. */\n size?: FieldSize\n /** Disable interaction and dim the control. */\n disabled?: boolean\n /** Validation message — shown under the control; also flags it red and sets aria-invalid. */\n errorMessage?: React.ReactNode\n /** Show a required asterisk after the label. */\n required?: boolean\n /** Label/control orientation. Default `'vertical'`. */\n layout?: 'horizontal' | 'vertical'\n /** Contextual help revealed via an info icon + tooltip beside the label. */\n helperText?: React.ReactNode\n /** Extra classes merged onto the field root element. */\n className?: string\n /** Render a visual gap after this many boxes (e.g. `3` → `123 456`). */\n groupAfter?: number\n}\n\nconst BOX_SIZE: Record<FieldSize, string> = {\n sm: 'h-9 w-8 text-sm',\n md: 'h-11 w-10 text-base',\n lg: 'h-14 w-12 text-lg',\n}\n\n/**\n * Segmented one-time-code / PIN input. Auto-advances as the user types,\n * Backspace retreats, and pasting a code spreads it across the boxes. Set\n * `masked` for PIN entry, `mode=\"alphanumeric\"` for letter codes.\n *\n * @example\n * ```tsx\n * <OtpInput length={6} value={code} onChange={setCode} onComplete={verify} />\n * ```\n */\nexport default function OtpInput({\n length = 6,\n value = '',\n onChange,\n onComplete,\n label,\n htmlFor,\n name,\n mode = 'numeric',\n masked = false,\n size = 'md',\n disabled,\n errorMessage,\n required,\n layout = 'vertical',\n helperText,\n className,\n groupAfter,\n}: OtpInputProps) {\n const errorId = useId()\n const hasError = errorMessage != null\n const refs = useRef<(HTMLInputElement | null)[]>([])\n\n // Normalise the controlled value into an array of single chars.\n const chars = Array.from({ length }, (_, i) => value[i] ?? '')\n\n const pattern = mode === 'numeric' ? /[0-9]/ : /[a-zA-Z0-9]/\n\n const emit = (next: string) => {\n onChange?.(next)\n if (next.length === length && !next.includes(' ') && [...next].every(Boolean)) {\n onComplete?.(next)\n }\n }\n\n const setCharAt = (idx: number, char: string) => {\n const arr = chars.slice()\n arr[idx] = char\n emit(arr.join(''))\n }\n\n const focusBox = (idx: number) => {\n const el = refs.current[Math.max(0, Math.min(length - 1, idx))]\n el?.focus()\n el?.select()\n }\n\n const onBoxChange = (idx: number, raw: string) => {\n const char = raw.slice(-1)\n if (char && !pattern.test(char)) return\n setCharAt(idx, char)\n if (char) focusBox(idx + 1)\n }\n\n const onKeyDown = (idx: number, e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Backspace') {\n if (chars[idx]) {\n setCharAt(idx, '')\n } else if (idx > 0) {\n setCharAt(idx - 1, '')\n focusBox(idx - 1)\n }\n } else if (e.key === 'ArrowLeft') {\n e.preventDefault(); focusBox(idx - 1)\n } else if (e.key === 'ArrowRight') {\n e.preventDefault(); focusBox(idx + 1)\n }\n }\n\n const onPaste = (e: React.ClipboardEvent<HTMLInputElement>) => {\n e.preventDefault()\n const text = e.clipboardData.getData('text').trim()\n const valid = [...text].filter((c) => pattern.test(c)).slice(0, length)\n if (valid.length === 0) return\n emit(valid.join(''))\n focusBox(valid.length)\n }\n\n return (\n <Field className={className} label={label} htmlFor={htmlFor} errorId={errorId} errorMessage={errorMessage} required={required} layout={layout} helperText={helperText}>\n <div className=\"flex items-center gap-2\" role=\"group\" aria-label={typeof label === 'string' ? label : 'One-time code'}>\n {chars.map((char, idx) => (\n <React.Fragment key={idx}>\n <input\n ref={(el) => { refs.current[idx] = el }}\n id={idx === 0 ? htmlFor : undefined}\n name={idx === 0 ? name : undefined}\n value={char}\n disabled={disabled}\n inputMode={mode === 'numeric' ? 'numeric' : 'text'}\n autoComplete={idx === 0 ? 'one-time-code' : 'off'}\n type={masked && char ? 'password' : 'text'}\n maxLength={1}\n aria-label={`Digit ${idx + 1}`}\n aria-invalid={hasError || undefined}\n aria-describedby={hasError ? errorId : undefined}\n onChange={(e) => onBoxChange(idx, e.target.value)}\n onKeyDown={(e) => onKeyDown(idx, e)}\n onPaste={onPaste}\n onFocus={(e) => e.target.select()}\n className={[\n BOX_SIZE[size],\n 'text-center font-medium rounded-lg border bg-surface text-foreground',\n 'transition-[border-color] duration-150',\n hasError ? 'border-status-error' : 'border-border',\n 'hover:border-border-strong',\n // Border-only focus, consistent with every field (no clip-prone ring).\n 'focus:outline-none focus:border-accent',\n 'disabled:bg-surface-raised disabled:text-foreground-muted disabled:cursor-not-allowed',\n ].join(' ')}\n />\n {groupAfter && (idx + 1) % groupAfter === 0 && idx < length - 1 && (\n <span className=\"w-2 text-center text-foreground-muted\" aria-hidden=\"true\">·</span>\n )}\n </React.Fragment>\n ))}\n </div>\n </Field>\n )\n}\n","import React, { useId, useState } from 'react'\nimport { Field, type FieldSize } from './_field'\n\nexport interface RatingProps {\n /** Controlled value. */\n value?: number\n /** Uncontrolled initial value. */\n defaultValue?: number\n /** Fires when the value changes. */\n onChange?: (value: number) => void\n /** Number of icons. Default `5`. */\n count?: number\n /** Allow half-icon precision. Default `false`. */\n allowHalf?: boolean\n /** Read-only display (no hover / click). */\n readOnly?: boolean\n /** Clicking the current value again clears to 0. Default `true`. */\n clearable?: boolean\n /** Field label, placed above (vertical) or beside (horizontal) the control. */\n label?: React.ReactNode\n /** Size preset — controls height, padding, and font. Default 'md'. */\n size?: FieldSize\n /** Disable interaction and dim the control. */\n disabled?: boolean\n /** Override the icon. Receives a `filled` flag. Default is a star. */\n icon?: (filled: boolean) => React.ReactNode\n /** Validation message — shown under the control; also flags it red and sets aria-invalid. */\n errorMessage?: React.ReactNode\n /** Native form field name (used for FormData serialisation). */\n name?: string\n /** Label/control orientation. Default `'vertical'`. */\n layout?: 'horizontal' | 'vertical'\n /** Contextual help revealed via an info icon + tooltip beside the label. */\n helperText?: React.ReactNode\n /** Extra classes merged onto the field root element. */\n className?: string\n /** Show a required asterisk after the label. */\n required?: boolean\n}\n\nconst ICON_SIZE: Record<FieldSize, string> = { sm: 'w-4 h-4', md: 'w-5 h-5', lg: 'w-7 h-7' }\n\nconst Star = (filled: boolean) => (\n <svg viewBox=\"0 0 24 24\" fill={filled ? 'currentColor' : 'none'} stroke=\"currentColor\" strokeWidth={filled ? 0 : 1.5} className=\"w-full h-full\" aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M11.48 3.5a.56.56 0 011.04 0l2.13 4.77 5.18.5a.56.56 0 01.32.97l-3.9 3.46 1.15 5.1a.56.56 0 01-.83.6L12 16.8l-4.57 2.6a.56.56 0 01-.83-.6l1.15-5.1-3.9-3.46a.56.56 0 01.32-.97l5.18-.5L11.48 3.5z\" />\n </svg>\n)\n\n/**\n * Star (or custom glyph) rating with optional half-steps, hover preview, and\n * read-only mode. Keyboard accessible: arrow keys adjust, Home/End jump to\n * min/max.\n *\n * @example\n * ```tsx\n * <Rating label=\"Quality\" value={rating} onChange={setRating} allowHalf />\n * ```\n *\n * @example Read-only display\n * ```tsx\n * <Rating value={4.5} allowHalf readOnly />\n * ```\n */\nexport default function Rating({\n value,\n defaultValue = 0,\n onChange,\n count = 5,\n allowHalf = false,\n readOnly = false,\n clearable = true,\n label,\n size = 'md',\n disabled,\n icon = Star,\n errorMessage,\n name,\n layout = 'vertical',\n helperText,\n className,\n required,\n}: RatingProps) {\n const errorId = useId()\n const [internal, setInternal] = useState(defaultValue)\n const [hover, setHover] = useState<number | null>(null)\n\n const current = value ?? internal\n const display = hover ?? current\n const interactive = !readOnly && !disabled\n\n const commit = (next: number) => {\n const v = clearable && next === current ? 0 : next\n setInternal(v)\n onChange?.(v)\n }\n\n const onKeyDown = (e: React.KeyboardEvent) => {\n if (!interactive) return\n const step = allowHalf ? 0.5 : 1\n if (e.key === 'ArrowRight' || e.key === 'ArrowUp') { e.preventDefault(); commit(Math.min(count, current + step)) }\n else if (e.key === 'ArrowLeft' || e.key === 'ArrowDown') { e.preventDefault(); commit(Math.max(0, current - step)) }\n else if (e.key === 'Home') { e.preventDefault(); commit(0) }\n else if (e.key === 'End') { e.preventDefault(); commit(count) }\n }\n\n return (\n <Field className={className} label={label} errorId={errorId} errorMessage={errorMessage} layout={layout} required={required} helperText={helperText}>\n <div\n role={interactive ? 'slider' : 'img'}\n aria-label={typeof label === 'string' ? label : 'Rating'}\n aria-valuenow={interactive ? current : undefined}\n aria-valuemin={interactive ? 0 : undefined}\n aria-valuemax={interactive ? count : undefined}\n aria-valuetext={`${current} of ${count}`}\n tabIndex={interactive ? 0 : -1}\n onKeyDown={onKeyDown}\n onMouseLeave={() => setHover(null)}\n className=\"inline-flex items-center gap-1 text-accent focus:outline-none focus-visible:ring-[3px] focus-visible:ring-focus-ring rounded-md w-max\"\n >\n {name && <input type=\"hidden\" name={name} value={current} />}\n {Array.from({ length: count }, (_, i) => {\n const starValue = i + 1\n const fillFraction = Math.max(0, Math.min(1, display - i))\n return (\n <span\n key={i}\n className={`relative ${ICON_SIZE[size]} ${interactive ? 'cursor-pointer' : ''} ${disabled ? 'opacity-50' : ''}`}\n onMouseMove={(e) => {\n if (!interactive) return\n if (allowHalf) {\n const rect = e.currentTarget.getBoundingClientRect()\n const half = e.clientX - rect.left < rect.width / 2\n setHover(i + (half ? 0.5 : 1))\n } else {\n setHover(starValue)\n }\n }}\n onClick={(e) => {\n if (!interactive) return\n if (allowHalf) {\n const rect = e.currentTarget.getBoundingClientRect()\n const half = e.clientX - rect.left < rect.width / 2\n commit(i + (half ? 0.5 : 1))\n } else {\n commit(starValue)\n }\n }}\n >\n {/* Empty layer — full star outline */}\n <span className=\"absolute inset-0 text-foreground-muted\">{icon(false)}</span>\n {/* Filled layer: a clip box (width = fill fraction)\n containing a FULL-SIZE star pinned left, so a\n 50% clip reveals the exact left half — not a\n squished half-width star. */}\n <span\n className=\"absolute inset-y-0 left-0 overflow-hidden\"\n style={{ width: `${fillFraction * 100}%` }}\n >\n <span className={`block absolute inset-y-0 left-0 ${ICON_SIZE[size]} max-w-none`}>\n {icon(true)}\n </span>\n </span>\n </span>\n )\n })}\n </div>\n </Field>\n )\n}\n","import React, { useId, useState } from 'react'\nimport * as Popover from '@radix-ui/react-popover'\nimport { Field, fieldShell, type FieldSize } from './_field'\n\nexport interface TimePickerProps {\n /** Value as `\"HH:mm\"` (24h) or `\"HH:mm:ss\"`. `null`/`undefined` = unset. */\n value?: string | null\n /** Fires when the value changes. */\n onChange?: (value: string | null) => void\n /** Field label, placed above (vertical) or beside (horizontal) the control. */\n label?: React.ReactNode\n /** The control id; the field label links to it for accessibility. */\n htmlFor?: string\n /** Native form field name (used for FormData serialisation). */\n name?: string\n /** Placeholder shown when the field is empty. */\n placeholder?: string\n /** Label/control orientation: 'horizontal' or 'vertical'. */\n layout?: 'horizontal' | 'vertical'\n /** Size preset — controls height, padding, and font. Default 'md'. */\n size?: FieldSize\n /** Display in 12-hour format with AM/PM (value stays 24h `\"HH:mm\"`). */\n use12Hours?: boolean\n /** Include a seconds column. Default `false`. */\n withSeconds?: boolean\n /** Minute step. Default `1`. Use `5` / `15` for coarse pickers. */\n minuteStep?: number\n /** Disable interaction and dim the control. */\n disabled?: boolean\n /** Validation message — shown under the control; also flags it red and sets aria-invalid. */\n errorMessage?: React.ReactNode\n /** Contextual help revealed via an info icon + tooltip beside the label. */\n helperText?: React.ReactNode\n /** Extra classes merged onto the field root element. */\n className?: string\n /** Show a required asterisk after the label. */\n required?: boolean\n /** Inline style applied to the control shell. */\n style?: React.CSSProperties\n}\n\nconst pad = (n: number) => n.toString().padStart(2, '0')\n\nfunction parse(value?: string | null): { h: number; m: number; s: number } | null {\n if (!value) return null\n const [h, m, s] = value.split(':').map(Number)\n if (Number.isNaN(h) || Number.isNaN(m)) return null\n return { h, m, s: Number.isNaN(s) ? 0 : s }\n}\n\nfunction display(value: string | null | undefined, use12: boolean, withSeconds: boolean): string {\n const p = parse(value)\n if (!p) return ''\n if (use12) {\n const period = p.h >= 12 ? 'PM' : 'AM'\n const h12 = p.h % 12 === 0 ? 12 : p.h % 12\n return `${h12}:${pad(p.m)}${withSeconds ? `:${pad(p.s)}` : ''} ${period}`\n }\n return `${pad(p.h)}:${pad(p.m)}${withSeconds ? `:${pad(p.s)}` : ''}`\n}\n\n/**\n * Time picker with scrollable hour / minute (/ second) columns in a popover.\n * Value is a 24-hour `\"HH:mm\"` (or `\"HH:mm:ss\"`) string regardless of whether\n * the display is 12- or 24-hour, so it's stable to store and submit.\n *\n * @example\n * ```tsx\n * <TimePicker label=\"Departure\" value={time} onChange={setTime} minuteStep={15} use12Hours />\n * ```\n */\nexport default function TimePicker({\n value,\n onChange,\n label,\n htmlFor,\n name,\n placeholder = 'Select a time…',\n layout = 'vertical',\n size = 'md',\n use12Hours = false,\n withSeconds = false,\n minuteStep = 1,\n disabled,\n errorMessage,\n helperText,\n className,\n required,\n style,\n}: TimePickerProps) {\n const errorId = useId()\n const hasError = errorMessage != null\n const [open, setOpen] = useState(false)\n\n const parsed = parse(value) ?? { h: 0, m: 0, s: 0 }\n\n const update = (next: Partial<{ h: number; m: number; s: number }>) => {\n const merged = { ...parsed, ...next }\n onChange?.(`${pad(merged.h)}:${pad(merged.m)}${withSeconds ? `:${pad(merged.s)}` : ''}`)\n }\n\n const hours = use12Hours\n ? Array.from({ length: 12 }, (_, i) => i + 1) // 1..12\n : Array.from({ length: 24 }, (_, i) => i) // 0..23\n const minutes = Array.from({ length: Math.ceil(60 / minuteStep) }, (_, i) => i * minuteStep)\n const seconds = Array.from({ length: 60 }, (_, i) => i)\n\n // For 12h display, map the stored 24h hour to a column selection.\n const selectedHourCol = use12Hours ? (parsed.h % 12 === 0 ? 12 : parsed.h % 12) : parsed.h\n const period = parsed.h >= 12 ? 'PM' : 'AM'\n\n const setHour12 = (h12: number, p: 'AM' | 'PM') => {\n const h24 = p === 'AM' ? (h12 === 12 ? 0 : h12) : (h12 === 12 ? 12 : h12 + 12)\n update({ h: h24 })\n }\n\n const Column = ({ items, selected, onPick, fmt }: {\n items: number[]; selected: number; onPick: (n: number) => void; fmt?: (n: number) => string\n }) => (\n <div className=\"flex flex-col overflow-y-auto max-h-48 w-14 hidden-scrollbar\" role=\"listbox\">\n {items.map((n) => (\n <button\n key={n}\n type=\"button\"\n role=\"option\"\n aria-selected={selected === n}\n onClick={() => onPick(n)}\n className={`py-1.5 text-sm rounded-md text-center transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-accent ${\n selected === n ? 'bg-accent text-accent-fg' : 'text-foreground hover:bg-surface-raised'\n }`}\n >\n {fmt ? fmt(n) : pad(n)}\n </button>\n ))}\n </div>\n )\n\n return (\n <Field className={className} label={label} htmlFor={htmlFor} errorId={errorId} errorMessage={errorMessage} helperText={helperText} layout={layout} required={required}>\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 className={`flex items-center justify-between cursor-pointer select-none ${!style?.width ? 'min-w-[160px]' : ''} ${fieldShell({ size, hasError, disabled })}`}\n >\n <span className={`text-sm truncate ${value ? '' : 'text-foreground-muted'}`}>\n {display(value, use12Hours, withSeconds) || placeholder}\n </span>\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.75} className=\"w-4 h-4 flex-shrink-0 text-foreground-muted ml-2\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"9\" /><path d=\"M12 7v5l3 2\" strokeLinecap=\"round\" />\n </svg>\n </button>\n </Popover.Trigger>\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-2 flex gap-1 animate-in fade-in-0 zoom-in-95\"\n >\n <Column items={hours} selected={selectedHourCol}\n onPick={(h) => use12Hours ? setHour12(h, period as 'AM' | 'PM') : update({ h })}\n fmt={use12Hours ? (n) => String(n) : pad} />\n <Column items={minutes} selected={parsed.m} onPick={(m) => update({ m })} />\n {withSeconds && <Column items={seconds} selected={parsed.s} onPick={(s) => update({ s })} />}\n {use12Hours && (\n <div className=\"flex flex-col gap-1 w-12\">\n {(['AM', 'PM'] as const).map((p) => (\n <button\n key={p}\n type=\"button\"\n onClick={() => setHour12(selectedHourCol, p)}\n className={`py-1.5 text-sm rounded-md transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-accent ${\n period === p ? 'bg-accent text-accent-fg' : 'text-foreground hover:bg-surface-raised'\n }`}\n >\n {p}\n </button>\n ))}\n </div>\n )}\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n {name && <input type=\"hidden\" name={name} value={value ?? ''} />}\n </Field>\n )\n}\n","import React, { useId, useMemo, useState } from 'react'\nimport * as Popover from '@radix-ui/react-popover'\nimport { Field, fieldShell, type FieldSize } from './_field'\n\nexport interface DateRange {\n start: Date | null\n end: Date | null\n}\n\nexport interface DateRangePreset {\n label: string\n /** Returns the range when clicked. */\n range: () => DateRange\n}\n\nexport interface DateRangePickerProps {\n /** Controlled value. */\n value?: DateRange\n /** Fires when the value changes. */\n onChange?: (range: DateRange) => void\n /** Field label, placed above (vertical) or beside (horizontal) the control. */\n label?: React.ReactNode\n /** The control id; the field label links to it for accessibility. */\n htmlFor?: string\n /** Placeholder shown when the field is empty. */\n placeholder?: string\n /** Label/control orientation: 'horizontal' or 'vertical'. */\n layout?: 'horizontal' | 'vertical'\n /** Size preset — controls height, padding, and font. Default 'md'. */\n size?: FieldSize\n /** Earliest selectable date. */\n min?: Date\n /** Latest selectable date. */\n max?: Date\n /** 0 = Sunday, 1 = Monday. Default `0`. */\n weekStartsOn?: 0 | 1\n /** Quick-select presets shown in a rail beside the calendars. */\n presets?: DateRangePreset[]\n /** Custom formatter for the displayed value. */\n format?: (d: Date) => string\n /** Disable interaction and dim the control. */\n disabled?: boolean\n /** Validation message — shown under the control; also flags it red and sets aria-invalid. */\n errorMessage?: React.ReactNode\n /** Contextual help revealed via an info icon + tooltip beside the label. */\n helperText?: React.ReactNode\n /** Extra classes merged onto the field root element. */\n className?: string\n /** Show a required asterisk after the label. */\n required?: boolean\n /** Inline style applied to the control shell. */\n style?: React.CSSProperties\n}\n\nconst MONTH_NAMES = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']\nconst WEEKDAY = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']\n\nconst startOfMonth = (d: Date) => new Date(d.getFullYear(), d.getMonth(), 1)\nconst addMonths = (d: Date, n: number) => new Date(d.getFullYear(), d.getMonth() + n, 1)\nconst addDays = (d: Date, n: number) => { const c = new Date(d); c.setDate(c.getDate() + n); return c }\nconst isSameDay = (a: Date, b: Date) => a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate()\nconst startOfDay = (d: Date) => new Date(d.getFullYear(), d.getMonth(), d.getDate())\nconst defaultFmt = (d: Date) => `${d.getFullYear()}-${`${d.getMonth() + 1}`.padStart(2, '0')}-${`${d.getDate()}`.padStart(2, '0')}`\n\nfunction buildGrid(viewMonth: Date, weekStartsOn: 0 | 1) {\n const first = startOfMonth(viewMonth)\n const offset = (first.getDay() - weekStartsOn + 7) % 7\n const gridStart = addDays(first, -offset)\n return Array.from({ length: 42 }, (_, i) => {\n const d = addDays(gridStart, i)\n return { date: d, outside: d.getMonth() !== viewMonth.getMonth() }\n })\n}\n\n/**\n * Two-month range date picker. Click a start date, then an end date; the span\n * between highlights as you hover. Optional quick-select presets (Today,\n * Last 7 days, This month, etc.) in a side rail.\n *\n * @example\n * ```tsx\n * <DateRangePicker\n * label=\"Reporting period\"\n * value={range}\n * onChange={setRange}\n * presets={[\n * { label: 'Last 7 days', range: () => ({ start: addDays(new Date(), -6), end: new Date() }) },\n * ]}\n * />\n * ```\n */\nexport default function DateRangePicker({\n value = { start: null, end: null },\n onChange,\n label,\n htmlFor,\n placeholder = 'Select a date range…',\n layout = 'vertical',\n size = 'md',\n min,\n max,\n weekStartsOn = 0,\n presets,\n format = defaultFmt,\n disabled,\n errorMessage,\n helperText,\n className,\n required,\n style,\n}: DateRangePickerProps) {\n const errorId = useId()\n const hasError = errorMessage != null\n const [open, setOpen] = useState(false)\n const [leftMonth, setLeftMonth] = useState(() => startOfMonth(value.start ?? new Date()))\n // While selecting, we hold the in-progress start and hover end.\n const [pendingStart, setPendingStart] = useState<Date | null>(null)\n const [hoverDate, setHoverDate] = useState<Date | null>(null)\n\n const weekdays = useMemo(\n () => WEEKDAY.slice(weekStartsOn).concat(WEEKDAY.slice(0, weekStartsOn)),\n [weekStartsOn],\n )\n\n const isDisabled = (d: Date) => (min && d < startOfDay(min)) || (max && d > startOfDay(max))\n\n // The range currently being visualised (committed value, or in-progress).\n const effective: DateRange = pendingStart\n ? { start: pendingStart, end: hoverDate }\n : value\n\n const inRange = (d: Date) => {\n const { start, end } = effective\n if (!start || !end) return false\n const [a, b] = start <= end ? [start, end] : [end, start]\n return d >= startOfDay(a) && d <= startOfDay(b)\n }\n\n const onDayClick = (d: Date) => {\n if (isDisabled(d)) return\n if (!pendingStart) {\n setPendingStart(d)\n setHoverDate(d)\n onChange?.({ start: d, end: null })\n } else {\n const [start, end] = pendingStart <= d ? [pendingStart, d] : [d, pendingStart]\n onChange?.({ start, end })\n setPendingStart(null)\n setHoverDate(null)\n setOpen(false)\n }\n }\n\n const triggerText = value.start && value.end\n ? `${format(value.start)} – ${format(value.end)}`\n : value.start\n ? `${format(value.start)} – …`\n : ''\n\n const renderMonth = (viewMonth: Date) => {\n const cells = buildGrid(viewMonth, weekStartsOn)\n return (\n <div>\n <div className=\"text-sm font-semibold text-center mb-2 select-none\">\n {MONTH_NAMES[viewMonth.getMonth()]} {viewMonth.getFullYear()}\n </div>\n <div className=\"grid grid-cols-7 gap-y-1\">\n {weekdays.map((w) => (\n <div key={w} className=\"text-[11px] font-medium text-foreground-muted uppercase text-center\">{w}</div>\n ))}\n {cells.map(({ date, outside }) => {\n const dis = isDisabled(date)\n const isStart = effective.start && isSameDay(date, effective.start)\n const isEnd = effective.end && isSameDay(date, effective.end)\n const within = inRange(date) && !isStart && !isEnd\n return (\n <button\n key={defaultFmt(date)}\n type=\"button\"\n disabled={dis}\n onMouseEnter={() => pendingStart && setHoverDate(date)}\n onClick={() => onDayClick(date)}\n className={[\n 'h-8 text-xs font-medium transition-colors',\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-accent',\n 'disabled:opacity-30 disabled:cursor-not-allowed',\n isStart || isEnd\n ? 'bg-accent text-accent-fg rounded-md'\n : within\n ? 'bg-surface-raised text-foreground rounded-none'\n : outside\n ? 'text-foreground-muted hover:bg-surface-raised rounded-md'\n : 'text-foreground hover:bg-surface-raised rounded-md',\n ].join(' ')}\n >\n {date.getDate()}\n </button>\n )\n })}\n </div>\n </div>\n )\n }\n\n return (\n <Field className={className} label={label} htmlFor={htmlFor} errorId={errorId} errorMessage={errorMessage} helperText={helperText} layout={layout} required={required}>\n <Popover.Root open={open && !disabled} onOpenChange={(o) => { if (!disabled) { setOpen(o); if (!o) { setPendingStart(null); setHoverDate(null) } } }}>\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 className={`flex items-center justify-between cursor-pointer select-none ${!style?.width ? 'min-w-[240px]' : ''} ${fieldShell({ size, hasError, disabled })}`}\n >\n <span className={`text-sm truncate ${triggerText ? '' : 'text-foreground-muted'}`}>\n {triggerText || placeholder}\n </span>\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.75} className=\"w-4 h-4 flex-shrink-0 text-foreground-muted ml-2\" aria-hidden=\"true\">\n <rect x=\"3\" y=\"5\" width=\"18\" height=\"16\" rx=\"2\" /><path d=\"M3 9h18M8 3v4M16 3v4\" strokeLinecap=\"round\" />\n </svg>\n </button>\n </Popover.Trigger>\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 flex gap-3 animate-in fade-in-0 zoom-in-95\"\n >\n {presets && presets.length > 0 && (\n <div className=\"flex flex-col gap-1 pr-3 border-r border-border min-w-[120px]\">\n {presets.map((p) => (\n <button\n key={p.label}\n type=\"button\"\n onClick={() => { onChange?.(p.range()); setOpen(false) }}\n className=\"text-left text-xs px-2 py-1.5 rounded-md text-foreground-secondary hover:bg-surface-raised hover:text-foreground transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n >\n {p.label}\n </button>\n ))}\n </div>\n )}\n <div className=\"flex gap-4\">\n <div className=\"relative\">\n <button\n type=\"button\"\n onClick={() => setLeftMonth(addMonths(leftMonth, -1))}\n aria-label=\"Previous month\"\n className=\"absolute -top-1 left-0 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\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} className=\"w-4 h-4\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15 19l-7-7 7-7\" /></svg>\n </button>\n {renderMonth(leftMonth)}\n </div>\n <div className=\"relative\">\n <button\n type=\"button\"\n onClick={() => setLeftMonth(addMonths(leftMonth, 1))}\n aria-label=\"Next month\"\n className=\"absolute -top-1 right-0 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\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} className=\"w-4 h-4\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 5l7 7-7 7\" /></svg>\n </button>\n {renderMonth(addMonths(leftMonth, 1))}\n </div>\n </div>\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n </Field>\n )\n}\n","import React, { useId, useState } from 'react'\nimport * as Popover from '@radix-ui/react-popover'\nimport { Field, fieldShell, type FieldSize } from './_field'\n\nexport interface ColorPickerProps {\n /** Hex string, e.g. `\"#0466c8\"`. */\n value?: string\n /** Fires when the value changes. */\n onChange?: (hex: string) => void\n /** Field label, placed above (vertical) or beside (horizontal) the control. */\n label?: React.ReactNode\n /** The control id; the field label links to it for accessibility. */\n htmlFor?: string\n /** Native form field name (used for FormData serialisation). */\n name?: string\n /** Label/control orientation: 'horizontal' or 'vertical'. */\n layout?: 'horizontal' | 'vertical'\n /** Size preset — controls height, padding, and font. Default 'md'. */\n size?: FieldSize\n /** Preset swatches shown in the popover. Defaults to a balanced 12-color set. */\n swatches?: string[]\n /** Show the native eyedropper / full picker fallback via `<input type=\"color\">`. Default `true`. */\n allowCustom?: boolean\n /** Disable interaction and dim the control. */\n disabled?: boolean\n /** Validation message — shown under the control; also flags it red and sets aria-invalid. */\n errorMessage?: React.ReactNode\n /** Contextual help revealed via an info icon + tooltip beside the label. */\n helperText?: React.ReactNode\n /** Extra classes merged onto the field root element. */\n className?: string\n /** Show a required asterisk after the label. */\n required?: boolean\n /** Placeholder shown when the field is empty. */\n placeholder?: string\n}\n\nconst DEFAULT_SWATCHES = [\n '#0466c8', '#1e8449', '#d68910', '#c0392b', '#8e44ad', '#16a085',\n '#2c3e50', '#7f8c8d', '#e84393', '#00b894', '#fdcb6e', '#0a1929',\n]\n\nconst HEX_RE = /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/\n\n/**\n * Color picker: a swatch trigger that opens a popover with preset swatches, a\n * hex input, and (optionally) the native full picker for custom colors. Value\n * is a hex string, easy to store and submit.\n *\n * @example\n * ```tsx\n * <ColorPicker label=\"Brand colour\" value={color} onChange={setColor} />\n * ```\n */\nexport default function ColorPicker({\n value = '',\n onChange,\n label,\n htmlFor,\n name,\n layout = 'vertical',\n size = 'md',\n swatches = DEFAULT_SWATCHES,\n allowCustom = true,\n disabled,\n errorMessage,\n helperText,\n className,\n required,\n placeholder = 'Pick a colour…',\n}: ColorPickerProps) {\n const errorId = useId()\n const hasError = errorMessage != null\n const [open, setOpen] = useState(false)\n const [draft, setDraft] = useState(value)\n\n const valid = HEX_RE.test(value)\n\n const pick = (hex: string) => {\n onChange?.(hex)\n setDraft(hex)\n }\n\n const commitDraft = (raw: string) => {\n const hex = raw.startsWith('#') ? raw : `#${raw}`\n setDraft(hex)\n if (HEX_RE.test(hex)) onChange?.(hex)\n }\n\n return (\n <Field className={className} label={label} htmlFor={htmlFor} errorId={errorId} errorMessage={errorMessage} helperText={helperText} layout={layout} required={required}>\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 aria-invalid={hasError || undefined}\n aria-describedby={hasError ? errorId : undefined}\n className={`flex items-center gap-2 cursor-pointer select-none ${fieldShell({ size, hasError, disabled })}`}\n >\n <span\n className=\"h-4 w-4 flex-shrink-0 rounded border border-border\"\n style={{ backgroundColor: valid ? value : 'transparent' }}\n aria-hidden=\"true\"\n />\n <span className={`flex-1 text-left text-sm truncate ${valid ? 'text-foreground' : 'text-foreground-muted'}`}>\n {valid ? value.toLowerCase() : placeholder}\n </span>\n </button>\n </Popover.Trigger>\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 w-56 animate-in fade-in-0 zoom-in-95\"\n >\n <div className=\"grid grid-cols-6 gap-2 mb-3\">\n {swatches.map((sw) => (\n <button\n key={sw}\n type=\"button\"\n onClick={() => { pick(sw); setOpen(false) }}\n aria-label={sw}\n className={`h-7 w-7 rounded-md border transition-transform hover:scale-110 focus:outline-none focus-visible:ring-2 focus-visible:ring-accent ${\n value.toLowerCase() === sw.toLowerCase() ? 'border-accent ring-2 ring-focus-ring' : 'border-border'\n }`}\n style={{ backgroundColor: sw }}\n />\n ))}\n </div>\n <div className=\"flex items-center gap-2\">\n <input\n value={draft}\n onChange={(e) => commitDraft(e.target.value)}\n placeholder=\"#0466c8\"\n aria-label=\"Hex colour\"\n className={`flex-1 ${fieldShell({ size: 'sm' })}`}\n />\n {allowCustom && (\n <input\n type=\"color\"\n value={valid ? value : '#000000'}\n onChange={(e) => pick(e.target.value)}\n aria-label=\"Custom colour\"\n className=\"h-7 w-9 rounded-md border border-border bg-surface cursor-pointer p-0.5\"\n />\n )}\n </div>\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n {name && <input type=\"hidden\" name={name} value={valid ? value : ''} />}\n </Field>\n )\n}\n","/**\n * Tiny immutable path helpers for nested form values — supports dotted paths\n * with numeric segments (e.g. `\"users.0.email\"`). Zero dependencies; written\n * so field arrays and nested objects \"just work\" without lodash.\n */\n\n/** Deep-clone preserving Date instances (form values may hold dates). */\nexport function deepClone<T>(v: T): T {\n if (v === null || typeof v !== 'object') return v\n if (v instanceof Date) return new Date(v.getTime()) as unknown as T\n if (Array.isArray(v)) return v.map(deepClone) as unknown as T\n const out: Record<string, unknown> = {}\n for (const k in v as Record<string, unknown>) out[k] = deepClone((v as Record<string, unknown>)[k])\n return out as T\n}\n\n/** Read a value at a dotted path. Returns `undefined` for missing branches. */\nexport function getPath(obj: unknown, path: string): unknown {\n if (!path) return obj\n const parts = path.split('.')\n let cur: unknown = obj\n for (const p of parts) {\n if (cur == null || typeof cur !== 'object') return undefined\n cur = (cur as Record<string, unknown>)[p]\n }\n return cur\n}\n\n/**\n * Return a NEW object/array with `value` set at the dotted path, structurally\n * sharing untouched branches. Creates arrays for numeric segments and objects\n * otherwise, so `setPath({}, 'users.0.name', 'x')` yields `{ users: [{ name: 'x' }] }`.\n */\nexport function setPath<T>(obj: T, path: string, value: unknown): T {\n const parts = path.split('.')\n const root: Record<string, unknown> | unknown[] = Array.isArray(obj)\n ? [...(obj as unknown[])]\n : { ...((obj as Record<string, unknown>) ?? {}) }\n let cur: Record<string, unknown> | unknown[] = root\n for (let i = 0; i < parts.length - 1; i++) {\n const p = parts[i]\n const nextIsIndex = /^\\d+$/.test(parts[i + 1])\n const child = (cur as Record<string, unknown>)[p]\n const next = Array.isArray(child)\n ? [...child]\n : child && typeof child === 'object'\n ? { ...(child as Record<string, unknown>) }\n : nextIsIndex\n ? []\n : {}\n ;(cur as Record<string, unknown>)[p] = next\n cur = next as Record<string, unknown> | unknown[]\n }\n ;(cur as Record<string, unknown>)[parts[parts.length - 1]] = value\n return root as T\n}\n","/**\n * Native, dependency-free validation. A field carries one rule or an array of\n * rules; rules run in order and the first failure wins. Rules are plain data\n * (required / pattern / min / max / length) plus an escape hatch `validate`\n * for anything custom — including async checks (uniqueness, server lookups) and\n * third-party schemas: `validate: (v) => zodSchema.safeParse(v).success ? undefined : 'msg'`.\n */\n\nexport type FormValues = Record<string, unknown>\n\n/** A numeric/length constraint, optionally with its own message. */\ntype Bound = number | { value: number; message?: string }\n/** A regex constraint, optionally with its own message. */\ntype Pattern = RegExp | { value: RegExp; message?: string }\n\nexport interface FieldRule<V = unknown> {\n /** Reject empty values. Pass a string to set the message. */\n required?: boolean | string\n /** Reject strings that don't match. */\n pattern?: Pattern\n /** Minimum numeric value. */\n min?: Bound\n /** Maximum numeric value. */\n max?: Bound\n /** Minimum length for strings / arrays. */\n minLength?: Bound\n /** Maximum length for strings / arrays. */\n maxLength?: Bound\n /**\n * Custom validator. Return an error string to fail, or a falsy value to\n * pass. May be async. Receives the field value and the whole form's values\n * (for cross-field checks like \"confirm password\").\n */\n validate?: (\n value: V,\n values: FormValues,\n ) => string | undefined | null | false | Promise<string | undefined | null | false>\n /** Fallback message used by required/pattern when they don't set their own. */\n message?: string\n}\n\nexport type FieldRules<V = unknown> = FieldRule<V> | FieldRule<V>[]\nexport type RulesMap = Record<string, FieldRules>\n\n/** Empty = no value to validate against (null / '' / [] / unchecked). */\nfunction isEmpty(v: unknown): boolean {\n return (\n v == null ||\n v === '' ||\n v === false ||\n (Array.isArray(v) && v.length === 0)\n )\n}\n\nconst boundValue = (b: Bound) => (typeof b === 'number' ? b : b.value)\nconst boundMessage = (b: Bound, fallback: string) =>\n typeof b === 'number' ? fallback : b.message ?? fallback\n\n/** Does this rule set make the field required? (drives the `*` asterisk.) */\nexport function isRequired(rules: FieldRules | undefined): boolean {\n if (!rules) return false\n const list = Array.isArray(rules) ? rules : [rules]\n return list.some((r) => !!r.required)\n}\n\n/**\n * Run a field's rules and resolve the first error message, or `undefined` when\n * valid. Optional-and-empty fields short-circuit to valid (only `required`\n * fires on empty).\n */\nexport async function runFieldRules(\n value: unknown,\n rules: FieldRules | undefined,\n values: FormValues,\n): Promise<string | undefined> {\n if (!rules) return undefined\n const list = Array.isArray(rules) ? rules : [rules]\n\n for (const rule of list) {\n if (rule.required && isEmpty(value)) {\n return typeof rule.required === 'string'\n ? rule.required\n : rule.message ?? 'This field is required'\n }\n\n // Optional + empty → nothing else to check for this rule.\n if (isEmpty(value)) {\n // still allow a custom validator to opt in on empty values\n if (rule.validate) {\n const res = await rule.validate(value as never, values)\n if (res) return typeof res === 'string' ? res : rule.message ?? 'Invalid value'\n }\n continue\n }\n\n if (rule.pattern) {\n const re = rule.pattern instanceof RegExp ? rule.pattern : rule.pattern.value\n const msg =\n rule.pattern instanceof RegExp\n ? rule.message ?? 'Invalid format'\n : rule.pattern.message ?? rule.message ?? 'Invalid format'\n if (typeof value === 'string' && !re.test(value)) return msg\n }\n\n if (rule.min != null && typeof value === 'number') {\n const m = boundValue(rule.min)\n if (value < m) return boundMessage(rule.min, rule.message ?? `Must be at least ${m}`)\n }\n if (rule.max != null && typeof value === 'number') {\n const m = boundValue(rule.max)\n if (value > m) return boundMessage(rule.max, rule.message ?? `Must be at most ${m}`)\n }\n\n if (rule.minLength != null) {\n const len = (value as { length?: number })?.length\n const m = boundValue(rule.minLength)\n if (typeof len === 'number' && len < m)\n return boundMessage(rule.minLength, rule.message ?? `Must be at least ${m} characters`)\n }\n if (rule.maxLength != null) {\n const len = (value as { length?: number })?.length\n const m = boundValue(rule.maxLength)\n if (typeof len === 'number' && len > m)\n return boundMessage(rule.maxLength, rule.message ?? `Must be at most ${m} characters`)\n }\n\n if (rule.validate) {\n const res = await rule.validate(value as never, values)\n if (res) return typeof res === 'string' ? res : rule.message ?? 'Invalid value'\n }\n }\n\n return undefined\n}\n\n/** Common ready-made patterns so callers don't re-type regexes. */\nexport const patterns = {\n email: /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/,\n url: /^https?:\\/\\/[^\\s/$.?#].[^\\s]*$/i,\n // Loose international phone: + and 7-15 digits, spaces/dashes allowed.\n phone: /^\\+?[\\d\\s-]{7,15}$/,\n // Digits only.\n digits: /^\\d+$/,\n} as const\n","import { deepClone, getPath, setPath } from './path'\nimport { runFieldRules, type FieldRules, type FormValues, type RulesMap } from './validate'\n\nexport type ValidateTrigger = 'onChange' | 'onBlur' | 'onSubmit'\n\nexport interface FormStoreOptions {\n initialValues?: FormValues\n /** Static rules keyed by field name. Dynamic fields register their own. */\n rules?: RulesMap\n /**\n * When a field revalidates. `'onSubmit'` is always implied. Default\n * `['onChange', 'onBlur', 'onSubmit']` — error appears once a field is\n * touched and updates live as the user types.\n */\n validateOn?: ValidateTrigger[]\n}\n\nexport type ErrorMap = Record<string, string | undefined>\n\n/** Stable per-field view handed to subscribers; ref only changes on real change. */\nexport interface FieldSnapshot {\n value: unknown\n error: string | undefined\n /** touched OR the form was submitted — i.e. \"should the error be shown\". */\n showError: boolean\n}\n\n/**\n * Framework-agnostic form store. Holds values/errors/touched, runs validation,\n * and notifies React via `useSyncExternalStore`. Field components subscribe to\n * a memoized per-field snapshot so a keystroke in one field doesn't re-render\n * the others.\n */\nexport class FormStore {\n private listeners = new Set<() => void>()\n private fieldCache = new Map<string, { value: unknown; error: string | undefined; showError: boolean; snap: FieldSnapshot }>()\n\n values: FormValues\n errors: ErrorMap = {}\n touched: Record<string, boolean> = {}\n submitted = false\n validating = false\n\n readonly initialValues: FormValues\n private rules: RulesMap\n readonly validateOn: ValidateTrigger[]\n\n // Field-array key bookkeeping (stable React keys across reorder/removal).\n private keys: Record<string, number[]> = {}\n private keySeq = 1\n\n // Root snapshot — a new ref on every change, for form-level subscribers.\n private rootSnap: { v: number } = { v: 0 }\n\n constructor(opts: FormStoreOptions = {}) {\n this.initialValues = deepClone(opts.initialValues ?? {})\n this.values = deepClone(opts.initialValues ?? {})\n this.rules = { ...(opts.rules ?? {}) }\n this.validateOn = opts.validateOn ?? ['onChange', 'onBlur', 'onSubmit']\n }\n\n // ── subscription ────────────────────────────────────────────────────────\n subscribe = (l: () => void): (() => void) => {\n this.listeners.add(l)\n return () => { this.listeners.delete(l) }\n }\n private emit() {\n this.rootSnap = { v: this.rootSnap.v + 1 }\n this.listeners.forEach((l) => l())\n }\n getRootSnapshot = (): { v: number } => this.rootSnap\n\n getFieldSnapshot = (name: string): FieldSnapshot => {\n const value = getPath(this.values, name)\n const error = this.errors[name]\n const showError = (!!this.touched[name] || this.submitted) && error != null\n const prev = this.fieldCache.get(name)\n if (prev && Object.is(prev.value, value) && prev.error === error && prev.showError === showError) {\n return prev.snap\n }\n const snap: FieldSnapshot = { value, error, showError }\n this.fieldCache.set(name, { value, error, showError, snap })\n return snap\n }\n\n // ── rule registry (for dynamic / array fields) ──────────────────────────\n setRule(name: string, rules: FieldRules | undefined) {\n if (rules == null) delete this.rules[name]\n else this.rules[name] = rules\n }\n removeRule(name: string) { delete this.rules[name] }\n getRule(name: string): FieldRules | undefined { return this.rules[name] }\n\n // ── reads ────────────────────────────────────────────────────────────────\n getValues = (): FormValues => this.values\n getValue = (name: string): unknown => getPath(this.values, name)\n get isValid(): boolean { return Object.values(this.errors).every((e) => !e) }\n\n // ── writes ────────────────────────────────────────────────────────────────\n setValue = (name: string, value: unknown, opts: { validate?: boolean; touch?: boolean } = {}) => {\n this.values = setPath(this.values, name, value)\n if (opts.touch) this.touched = { ...this.touched, [name]: true }\n this.emit()\n const shouldValidate = opts.validate ?? this.validateOn.includes('onChange')\n if (shouldValidate) void this.validateField(name)\n }\n\n setValues = (patch: FormValues, opts: { validate?: boolean } = {}) => {\n for (const k of Object.keys(patch)) this.values = setPath(this.values, k, patch[k])\n this.emit()\n if (opts.validate) void this.validateAll()\n }\n\n setError = (name: string, error: string | undefined) => {\n if (this.errors[name] === error) return\n this.errors = { ...this.errors, [name]: error || undefined }\n this.emit()\n }\n\n touch = (name: string, opts: { validate?: boolean } = {}) => {\n if (!this.touched[name]) {\n this.touched = { ...this.touched, [name]: true }\n this.emit()\n }\n if (opts.validate ?? this.validateOn.includes('onBlur')) void this.validateField(name)\n }\n\n setSubmitted = (v: boolean) => { this.submitted = v; this.emit() }\n\n // ── validation ─────────────────────────────────────────────────────────────\n async validateField(name: string): Promise<string | undefined> {\n const err = await runFieldRules(getPath(this.values, name), this.rules[name], this.values)\n this.setError(name, err)\n return err\n }\n\n async validateAll(): Promise<ErrorMap> {\n this.validating = true\n this.emit()\n const names = Object.keys(this.rules)\n const entries = await Promise.all(\n names.map(async (n) => [n, await runFieldRules(getPath(this.values, n), this.rules[n], this.values)] as const),\n )\n const errors: ErrorMap = {}\n for (const [n, e] of entries) errors[n] = e\n this.errors = errors\n this.validating = false\n this.emit()\n return errors\n }\n\n reset = (values?: FormValues) => {\n this.values = deepClone(values ?? this.initialValues)\n this.errors = {}\n this.touched = {}\n this.submitted = false\n this.keys = {}\n this.fieldCache.clear()\n this.emit()\n }\n\n // ── field arrays ───────────────────────────────────────────────────────────\n getKeys(name: string): number[] {\n const arr = (getPath(this.values, name) as unknown[]) ?? []\n let keys = this.keys[name]\n if (!keys || keys.length !== arr.length) {\n keys = arr.map((_, i) => (keys && keys[i] != null ? keys[i] : this.keySeq++))\n this.keys[name] = keys\n }\n return keys\n }\n arrayAppend = (name: string, item: unknown = {}) => {\n const arr = [...((getPath(this.values, name) as unknown[]) ?? [])]\n arr.push(item)\n this.keys[name] = [...this.getKeys(name), this.keySeq++]\n this.setValue(name, arr, { validate: false })\n }\n arrayRemove = (name: string, index: number) => {\n const arr = [...((getPath(this.values, name) as unknown[]) ?? [])]\n arr.splice(index, 1)\n const k = [...this.getKeys(name)]\n k.splice(index, 1)\n this.keys[name] = k\n // Re-index errors/touched for the removed branch so stale messages clear.\n this.clearBranch(name)\n this.setValue(name, arr, { validate: false })\n }\n arrayMove = (name: string, from: number, to: number) => {\n const arr = [...((getPath(this.values, name) as unknown[]) ?? [])]\n if (from < 0 || to < 0 || from >= arr.length || to >= arr.length) return\n const [moved] = arr.splice(from, 1)\n arr.splice(to, 0, moved)\n const k = [...this.getKeys(name)]\n const [mk] = k.splice(from, 1)\n k.splice(to, 0, mk)\n this.keys[name] = k\n this.clearBranch(name)\n this.setValue(name, arr, { validate: false })\n }\n\n /** Drop any errors/touched flags under `name.` — used when an array shifts. */\n private clearBranch(name: string) {\n const prefix = name + '.'\n const errors: ErrorMap = {}\n for (const k of Object.keys(this.errors)) if (!k.startsWith(prefix)) errors[k] = this.errors[k]\n const touched: Record<string, boolean> = {}\n for (const k of Object.keys(this.touched)) if (!k.startsWith(prefix)) touched[k] = this.touched[k]\n this.errors = errors\n this.touched = touched\n }\n}\n","import type React from 'react'\nimport type { FormStore, FieldSnapshot } from './store'\nimport { isRequired } from './validate'\n\n/**\n * How a control reports changes, so one binder can drive any of our inputs:\n * - `value` — `onChange(value)` directly (RadioGroup, Slider, Rating,\n * SegmentedControl, TagsInput, OtpInput, DatePicker, ColorPicker…)\n * - `native` — `onChange(e)` reading `e.target.value` (TextInput, Password,\n * TextArea, NumberInput, SearchInput)\n * - `checked` — `onChange({target:{checked}})` (Switch, Checkbox)\n * - `target` — `onChange({target:{value}})` (Dropdown, TreeSelect)\n */\nexport type FieldKind = 'value' | 'native' | 'checked' | 'target'\n\ninterface Adapter {\n prop: 'value' | 'checked'\n toValue: (arg: unknown) => unknown\n /** Apply an empty fallback so native inputs stay controlled. */\n applyEmpty: boolean\n empty: unknown\n}\n\nconst getTarget = (arg: unknown): Record<string, unknown> | undefined => {\n const t = (arg as { target?: unknown })?.target\n return t && typeof t === 'object' ? (t as Record<string, unknown>) : undefined\n}\n\nconst ADAPTERS: Record<FieldKind, Adapter> = {\n value: { prop: 'value', toValue: (v) => v, applyEmpty: false, empty: undefined },\n native: { prop: 'value', toValue: (e) => getTarget(e)?.value, applyEmpty: true, empty: '' },\n checked: { prop: 'checked', toValue: (e) => getTarget(e)?.checked, applyEmpty: true, empty: false },\n target: { prop: 'value', toValue: (e) => getTarget(e)?.value, applyEmpty: false, empty: undefined },\n}\n\nexport interface FieldBindings {\n name: string\n id: string\n htmlFor: string\n required?: boolean\n errorMessage?: React.ReactNode\n onChange: (arg: unknown) => void\n onBlur: () => void\n /** `value` or `checked`, depending on the control kind. */\n [prop: string]: unknown\n}\n\n/**\n * Produce the props to spread onto a control: the current value (under the\n * right prop), a normalising `onChange`, `onBlur` to mark touched, the field\n * `name`/`id`, the derived `required` flag (from its rules), and the gated\n * `errorMessage` (shown once touched or after a submit attempt).\n */\nexport function buildBindings(\n store: FormStore,\n name: string,\n kind: FieldKind,\n snap: FieldSnapshot,\n): FieldBindings {\n const a = ADAPTERS[kind]\n const raw = snap.value\n const value = a.applyEmpty ? raw ?? a.empty : raw\n return {\n name,\n id: name,\n htmlFor: name,\n required: isRequired(store.getRule(name)) || undefined,\n errorMessage: snap.showError ? snap.error : undefined,\n [a.prop]: value,\n onChange: (arg: unknown) => store.setValue(name, a.toValue(arg), { touch: true }),\n onBlur: () => store.touch(name),\n }\n}\n","import { useCallback, useRef, useSyncExternalStore } from 'react'\nimport { FormStore, type FormStoreOptions, type ErrorMap } from './store'\nimport { buildBindings, type FieldBindings, type FieldKind } from './bindings'\nimport type { FieldRules, FormValues } from './validate'\n\nexport interface UseFormReturn {\n /** The underlying store — pass to `<Form form={...}>` and for imperative use. */\n store: FormStore\n values: FormValues\n errors: ErrorMap\n touched: Record<string, boolean>\n submitted: boolean\n isSubmitting: boolean\n isValid: boolean\n\n // imperative helpers\n getValue: (name: string) => unknown\n getValues: () => FormValues\n setValue: (name: string, value: unknown, opts?: { validate?: boolean; touch?: boolean }) => void\n setValues: (patch: FormValues) => void\n setError: (name: string, error: string | undefined) => void\n validateField: (name: string) => Promise<string | undefined>\n validateAll: () => Promise<ErrorMap>\n reset: (values?: FormValues) => void\n\n /**\n * Bind a control whose `onChange` receives the value directly (RadioGroup,\n * Slider, DatePicker, SegmentedControl, TagsInput, OtpInput, …).\n * Spread the result onto the control: `<Slider {...form.field('volume')} />`.\n */\n field: (name: string, rules?: FieldRules) => FieldBindings\n /** Bind a native input (`e.target.value`): TextInput, Password, TextArea, NumberInput. */\n fieldNative: (name: string, rules?: FieldRules) => FieldBindings\n /** Bind a checkable (`{target:{checked}}`): Switch, Checkbox. */\n fieldChecked: (name: string, rules?: FieldRules) => FieldBindings\n /** Bind a `{target:{value}}` control: Dropdown, TreeSelect. */\n fieldTarget: (name: string, rules?: FieldRules) => FieldBindings\n}\n\n/**\n * Create a form instance. State lives in a stable {@link FormStore}; the hook\n * re-renders the calling component on any change so the spread `field()`\n * bindings stay current. For large forms, isolate re-renders with\n * `useFormField` / `<FormField>` instead of reading everything here.\n *\n * Validation lives at the form level (rules map or per-field `rules` arg), and\n * the inputs only *receive* their error — they never validate themselves.\n *\n * @example\n * ```tsx\n * const form = useForm({ initialValues: { email: '' } })\n * <Form form={form} onFinish={(v) => save(v)}>\n * <TextInput label=\"Email\" {...form.fieldNative('email', { required: true, pattern: patterns.email })} />\n * <Button type=\"submit\">Save</Button>\n * </Form>\n * ```\n */\nexport function useForm(options: FormStoreOptions = {}): UseFormReturn {\n const ref = useRef<FormStore | null>(null)\n if (ref.current === null) ref.current = new FormStore(options)\n const store = ref.current\n\n // Re-render this component whenever the store changes.\n useSyncExternalStore(store.subscribe, store.getRootSnapshot, store.getRootSnapshot)\n\n const make = useCallback(\n (kind: FieldKind) => (name: string, rules?: FieldRules): FieldBindings => {\n if (rules !== undefined) store.setRule(name, rules)\n return buildBindings(store, name, kind, store.getFieldSnapshot(name))\n },\n [store],\n )\n\n return {\n store,\n values: store.values,\n errors: store.errors,\n touched: store.touched,\n submitted: store.submitted,\n isSubmitting: store.validating,\n isValid: store.isValid,\n\n getValue: store.getValue,\n getValues: store.getValues,\n setValue: (name, value, opts) => store.setValue(name, value, opts),\n setValues: (patch) => store.setValues(patch),\n setError: store.setError,\n validateField: (name) => store.validateField(name),\n validateAll: () => store.validateAll(),\n reset: store.reset,\n\n field: make('value'),\n fieldNative: make('native'),\n fieldChecked: make('checked'),\n fieldTarget: make('target'),\n }\n}\n","import { createContext, useContext } from 'react'\nimport type { FormStore } from './store'\n\n/** The store provided by `<Form>` to descendant fields / field-arrays. */\nexport const FormContext = createContext<FormStore | null>(null)\n\n/** Read the enclosing `<Form>`'s store. Throws if used outside a `<Form>`. */\nexport function useFormStore(): FormStore {\n const store = useContext(FormContext)\n if (!store) {\n throw new Error('useFormStore must be used within a <Form>. Did you forget to wrap your fields?')\n }\n return store\n}\n","import React, { useRef } from 'react'\nimport { FormContext } from './context'\nimport type { UseFormReturn } from './useForm'\nimport type { ErrorMap } from './store'\nimport type { FormValues } from './validate'\n\nexport interface FormProps extends Omit<React.FormHTMLAttributes<HTMLFormElement>, 'onSubmit' | 'action'> {\n /** The instance from `useForm()`. */\n form: UseFormReturn\n /**\n * SPA submit handler — called with the validated values once all rules\n * pass. Receiving this puts the form in client mode (`preventDefault`).\n */\n onFinish?: (values: FormValues) => void | Promise<void>\n /** Called when a submit attempt fails validation. */\n onFinishFailed?: (errors: ErrorMap, values: FormValues) => void\n /**\n * SSR / progressive-enhancement submit. A function receives the native\n * `FormData` (React 19 server action style); a string is used as the\n * native `<form action>` URL. Either way the form validates first and only\n * proceeds when valid. Async rules are awaited before a native submit.\n */\n action?: string | ((data: FormData) => void | Promise<void>)\n children: React.ReactNode\n}\n\n/**\n * Form wrapper. Owns submission: on submit it marks the form submitted, runs\n * every field's rules, and only then dispatches — to `onFinish(values)` in SPA\n * mode or to `action` (function or native URL) for SSR. Renders a real\n * `<form noValidate>` so our inputs' `name`s serialise into `FormData` while we\n * still show our own validation messages.\n *\n * @example SPA\n * <Form form={form} onFinish={(v) => api.save(v)}>…</Form>\n * @example Server action (SSR)\n * <Form form={form} action={saveAction}>…</Form>\n */\nexport function Form({\n form,\n onFinish,\n onFinishFailed,\n action,\n children,\n ...rest\n}: FormProps) {\n const ref = useRef<HTMLFormElement>(null)\n // Lets the async path re-submit natively without re-running validation.\n const bypass = useRef(false)\n\n const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {\n if (bypass.current) { bypass.current = false; return } // native submit passes through\n e.preventDefault()\n\n const store = form.store\n store.setSubmitted(true)\n const errors = await store.validateAll()\n const hasError = Object.values(errors).some(Boolean)\n\n if (hasError) {\n onFinishFailed?.(errors, store.getValues())\n focusFirstError(ref.current, errors)\n return\n }\n\n if (onFinish) {\n await onFinish(store.getValues())\n return\n }\n\n if (typeof action === 'function') {\n action(new FormData(ref.current!))\n return\n }\n if (typeof action === 'string') {\n // Valid → let the browser POST/GET natively to the action URL.\n bypass.current = true\n ref.current!.requestSubmit()\n }\n }\n\n return (\n <FormContext.Provider value={form.store}>\n <form\n ref={ref}\n noValidate\n action={typeof action === 'string' ? action : undefined}\n onSubmit={handleSubmit}\n {...rest}\n >\n {children}\n </form>\n </FormContext.Provider>\n )\n}\n\n/** Move focus to the first control with an error, for keyboard + AT users. */\nfunction focusFirstError(formEl: HTMLFormElement | null, errors: ErrorMap) {\n if (!formEl) return\n const firstName = Object.keys(errors).find((k) => errors[k])\n if (!firstName) return\n const el = formEl.querySelector<HTMLElement>(`[name=\"${CSS.escape(firstName)}\"], #${CSS.escape(firstName)}`)\n el?.focus()\n}\n","import { useEffect, useSyncExternalStore } from 'react'\nimport { useFormStore } from './context'\nimport { buildBindings, type FieldBindings, type FieldKind } from './bindings'\nimport type { FieldRules } from './validate'\n\nexport interface UseFormFieldOptions {\n /** How the control reports changes. Default `'value'`. */\n kind?: FieldKind\n /** Rules for this field — registered on the form (and cleaned up on unmount). */\n rules?: FieldRules\n}\n\n/**\n * Subscribe a single field to the enclosing `<Form>`. Unlike reading bindings\n * off `useForm()`, this isolates re-renders to just this field via a memoized\n * per-field snapshot — the right choice for large or dynamic forms. Registering\n * `rules` here also unregisters them on unmount, which is what makes field\n * arrays validate correctly as rows come and go.\n *\n * @example\n * const email = useFormField('email', { kind: 'native', rules: { required: true } })\n * <TextInput label=\"Email\" {...email} />\n */\nexport function useFormField(name: string, options: UseFormFieldOptions = {}): FieldBindings {\n const store = useFormStore()\n const { kind = 'value', rules } = options\n\n // Register during render (idempotent) so `required` + submit validation see\n // the rule immediately; clean up on unmount so removed array rows don't\n // leave dangling rules behind.\n if (rules !== undefined && store.getRule(name) !== rules) store.setRule(name, rules)\n useEffect(() => {\n return () => { if (rules !== undefined) store.removeRule(name) }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [store, name])\n\n const snap = useSyncExternalStore(\n store.subscribe,\n () => store.getFieldSnapshot(name),\n )\n return buildBindings(store, name, kind, snap)\n}\n","import React from 'react'\nimport { useFormField, type UseFormFieldOptions } from './useFormField'\nimport type { FieldBindings } from './bindings'\n\nexport interface FormFieldProps extends UseFormFieldOptions {\n name: string\n /** Render-prop receiving the bindings to spread onto a control. */\n children: (field: FieldBindings) => React.ReactNode\n}\n\n/**\n * Render-prop wrapper around {@link useFormField}. Isolates a field's\n * re-renders from the rest of the form.\n *\n * @example\n * <FormField name=\"role\" rules={{ required: 'Pick a role' }}>\n * {(field) => <RadioGroup label=\"Role\" options={ROLES} {...field} />}\n * </FormField>\n */\nexport function FormField({ name, kind, rules, children }: FormFieldProps) {\n const field = useFormField(name, { kind, rules })\n return <>{children(field)}</>\n}\n","import { useSyncExternalStore } from 'react'\nimport { useFormStore } from './context'\n\nexport interface FieldArrayItem {\n /** Stable React key — survives reorders and removals. */\n key: number\n /** Dotted base path for this row, e.g. `\"contacts.2\"`. */\n name: string\n index: number\n}\n\nexport interface UseFieldArrayReturn {\n fields: FieldArrayItem[]\n /** Append a row (optionally seeded with values). */\n append: (item?: unknown) => void\n /** Remove the row at `index` (clears its errors/touched too). */\n remove: (index: number) => void\n /** Reorder a row. */\n move: (from: number, to: number) => void\n /** Replace the entire array. */\n replace: (items: unknown[]) => void\n}\n\n/**\n * Dynamic, AntD-style repeating fields. Returns rows with stable keys plus\n * add/remove/move helpers. Build each row's field names from `field.name`,\n * e.g. `${field.name}.email`.\n *\n * @example\n * const { fields, append, remove } = useFieldArray('contacts')\n * {fields.map((f, i) => (\n * <div key={f.key}>\n * <TextInput {...useFormField(`${f.name}.email`, { kind: 'native', rules: { required: true } })} />\n * <Button onClick={() => remove(i)}>Remove</Button>\n * </div>\n * ))}\n * <Button onClick={() => append({ email: '' })}>Add contact</Button>\n */\nexport function useFieldArray(name: string): UseFieldArrayReturn {\n const store = useFormStore()\n useSyncExternalStore(store.subscribe, store.getRootSnapshot, store.getRootSnapshot)\n\n const arr = (store.getValue(name) as unknown[]) ?? []\n const keys = store.getKeys(name)\n\n return {\n fields: arr.map((_, i) => ({ key: keys[i], name: `${name}.${i}`, index: i })),\n append: (item: unknown = {}) => store.arrayAppend(name, item),\n remove: (index: number) => store.arrayRemove(name, index),\n move: (from: number, to: number) => store.arrayMove(name, from, to),\n replace: (items: unknown[]) => store.setValue(name, items, { validate: false }),\n }\n}\n","/**\n * Zero-dependency credit-card helpers: brand detection, Luhn checksum, and\n * display formatting. Pure functions — no React, no deps — so they're unit\n * testable and reusable.\n */\n\nexport interface CardBrand {\n /** Stable id, e.g. `'visa'`. */\n id: string\n /** Human label, e.g. `'Visa'`. */\n label: string\n /** Short badge text, e.g. `'VISA'`. */\n short: string\n /** Accent colour for the brand badge (hex). */\n color: string\n /** Matches the leading digits of the card number. */\n pattern: RegExp\n /** Valid total digit lengths for this brand. */\n lengths: number[]\n /** Expected CVV length (3 for most, 4 for Amex). */\n cvv: number\n /** Zero-based digit indices to insert a space before (grouping). */\n gaps: number[]\n}\n\n/** Recognised brands, in match-priority order. */\nexport const CARD_BRANDS: CardBrand[] = [\n { id: 'amex', label: 'American Express', short: 'AMEX', color: '#1F72CD', pattern: /^3[47]/, lengths: [15], cvv: 4, gaps: [4, 10] },\n { id: 'visa', label: 'Visa', short: 'VISA', color: '#1A1F71', pattern: /^4/, lengths: [16, 18, 19], cvv: 3, gaps: [4, 8, 12, 16] },\n { id: 'mastercard', label: 'Mastercard', short: 'MC', color: '#EB001B', pattern: /^(5[1-5]|2[2-7])/, lengths: [16], cvv: 3, gaps: [4, 8, 12] },\n { id: 'discover', label: 'Discover', short: 'DISC', color: '#FF6000', pattern: /^(6011|64[4-9]|65)/, lengths: [16, 19], cvv: 3, gaps: [4, 8, 12] },\n { id: 'diners', label: 'Diners Club', short: 'DINERS', color: '#0079BE', pattern: /^(36|38|30[0-5])/, lengths: [14, 16, 19], cvv: 3, gaps: [4, 10] },\n { id: 'jcb', label: 'JCB', short: 'JCB', color: '#0B4EA2', pattern: /^35/, lengths: [16, 17, 18, 19], cvv: 3, gaps: [4, 8, 12] },\n]\n\n/** Strip everything but digits. */\nexport const onlyDigits = (s: string): string => (s || '').replace(/\\D/g, '')\n\n/** Detect the card brand from a (possibly partial) number. `null` if unknown. */\nexport function detectBrand(value: string): CardBrand | null {\n const d = onlyDigits(value)\n if (!d) return null\n return CARD_BRANDS.find((b) => b.pattern.test(d)) ?? null\n}\n\n/** Max digit length to accept for a value (longest length of its brand, else 19). */\nexport function maxCardLength(value: string): number {\n const b = detectBrand(value)\n return b ? Math.max(...b.lengths) : 19\n}\n\n/** Luhn (mod-10) checksum — the standard card-number integrity check. */\nexport function luhnValid(value: string): boolean {\n const s = onlyDigits(value)\n if (s.length < 12) return false\n let sum = 0\n let double = false\n for (let i = s.length - 1; i >= 0; i--) {\n let n = s.charCodeAt(i) - 48\n if (double) { n *= 2; if (n > 9) n -= 9 }\n sum += n\n double = !double\n }\n return sum % 10 === 0\n}\n\n/** Format a card number with brand-aware grouping (e.g. `4242 4242 4242 4242`). */\nexport function formatCardNumber(value: string): string {\n const brand = detectBrand(value)\n const digits = onlyDigits(value).slice(0, maxCardLength(value))\n const gaps = brand?.gaps ?? [4, 8, 12, 16]\n let out = ''\n for (let i = 0; i < digits.length; i++) {\n if (gaps.includes(i)) out += ' '\n out += digits[i]\n }\n return out\n}\n\n/** Validate a card number: known brand, complete length, passing Luhn. */\nexport function cardNumberError(value: string): string | undefined {\n const d = onlyDigits(value)\n if (!d) return 'Card number is required'\n const brand = detectBrand(d)\n if (!brand) return 'Unsupported card type'\n if (!brand.lengths.includes(d.length)) return 'Card number is incomplete'\n if (!luhnValid(d)) return 'Card number looks invalid'\n return undefined\n}\n\n/** Format expiry keystrokes into `MM/YY`, auto-padding the month and slashing. */\nexport function formatExpiry(value: string): string {\n let d = onlyDigits(value).slice(0, 4)\n // Auto-pad a single month digit > 1 (e.g. \"5\" → \"05\").\n if (d.length === 1 && d > '1') d = '0' + d\n if (d.length <= 2) return d\n return `${d.slice(0, 2)}/${d.slice(2)}`\n}\n\n/** Validate `MM/YY`: well-formed, real month, not in the past. */\nexport function expiryError(value: string, now: Date = new Date()): string | undefined {\n if (!value) return 'Expiry is required'\n const m = value.match(/^(\\d{2})\\/(\\d{2})$/)\n if (!m) return 'Use MM/YY'\n const mm = Number(m[1])\n const yy = Number(m[2])\n if (mm < 1 || mm > 12) return 'Invalid month'\n // Card is valid through the last day of its expiry month.\n const endOfMonth = new Date(2000 + yy, mm, 0, 23, 59, 59, 999)\n if (endOfMonth < now) return 'Card has expired'\n return undefined\n}\n\n/** Validate the CVV against the detected brand's expected length. */\nexport function cvvError(value: string, cardNumber: string): string | undefined {\n const need = detectBrand(cardNumber)?.cvv ?? 3\n const d = onlyDigits(value)\n if (!d) return 'CVV is required'\n if (d.length !== need) return `CVV must be ${need} digits`\n return undefined\n}\n","import React, { useEffect, useRef } from 'react'\nimport { useForm, Form } from '../../form'\nimport type { FormValues } from '../../form'\nimport TextInput from '../inputs/TextInput'\nimport Button from '../inputs/Button'\nimport type { FieldSize } from '../inputs/_field'\nimport {\n type CardBrand,\n detectBrand,\n formatCardNumber,\n formatExpiry,\n onlyDigits,\n cardNumberError,\n expiryError,\n cvvError,\n} from './creditCard'\n\n/** The normalised value emitted on change / submit. */\nexport interface CreditCardValue {\n /** Digits only (no spaces). */\n number: string\n /** Cardholder name. */\n name: string\n /** `MM/YY`. */\n expiry: string\n /** Digits only. */\n cvv: string\n /** Detected brand id (`'visa'`, `'amex'`…) or `null`. */\n brand: string | null\n}\n\nexport interface CreditCardFormProps {\n /** Called with the validated card once every field passes on submit. */\n onSubmit?: (card: CreditCardValue) => void | Promise<void>\n /** Called on every keystroke with the current (possibly invalid) card. */\n onChange?: (card: CreditCardValue) => void\n /** Seed the fields (uncontrolled). Number/expiry are auto-formatted. */\n defaultValue?: Partial<CreditCardValue>\n /** Size preset for the inner fields. Default `'md'`. */\n size?: FieldSize\n /** Disable every field + the submit button. */\n disabled?: boolean\n /** Require the cardholder name. Default `true`. */\n requireName?: boolean\n /** Hide the built-in submit button (when embedding in a larger form). */\n hideSubmit?: boolean\n /** Submit button label. Default `'Pay'`. */\n submitLabel?: React.ReactNode\n /** Extra classes on the root `<form>`. */\n className?: string\n /** Inline style on the root `<form>`. */\n style?: React.CSSProperties\n}\n\nconst toCard = (vals: FormValues): CreditCardValue => {\n const number = String(vals.number ?? '')\n return {\n number: onlyDigits(number),\n name: String(vals.name ?? ''),\n expiry: String(vals.expiry ?? ''),\n cvv: onlyDigits(String(vals.cvv ?? '')),\n brand: detectBrand(number)?.id ?? null,\n }\n}\n\n/** Small brand badge: a card glyph tinted to the brand + its short code. */\nfunction BrandMark({ brand }: { brand: CardBrand | null }) {\n return (\n <span className=\"flex items-center gap-1.5\" aria-live=\"polite\">\n <svg width=\"28\" height=\"18\" viewBox=\"0 0 28 18\" fill=\"none\" aria-hidden=\"true\">\n <rect x=\"0.5\" y=\"0.5\" width=\"27\" height=\"17\" rx=\"3\" fill=\"var(--color-surface-raised)\" stroke=\"var(--color-border)\" />\n <rect x=\"0.5\" y=\"3.75\" width=\"27\" height=\"3.5\" fill={brand ? brand.color : 'var(--color-border-strong)'} />\n </svg>\n {brand && (\n <span className=\"text-[10px] font-bold uppercase tracking-wide\" style={{ color: brand.color }}>\n {brand.short}\n </span>\n )}\n <span className=\"sr-only\">{brand ? brand.label : 'Unknown card type'}</span>\n </span>\n )\n}\n\n/**\n * Unified credit-card form built on the oxygen-ui {@link useForm} Form API.\n *\n * One component owns all four fields and their cross-field rules — card number\n * (brand detection + grouping + Luhn), expiry (`MM/YY`, real month, not past),\n * CVV (brand-aware length), and cardholder name. It is deliberately NOT shipped\n * as separate inputs: a CVV or expiry field has no meaning outside a card form.\n *\n * Self-contained: render it and handle `onSubmit(card)`; the card is only\n * delivered once everything validates. Use `onChange` for live updates (e.g. a\n * card preview) and `hideSubmit` to embed it inside a larger form.\n *\n * @example\n * <CreditCardForm onSubmit={(card) => pay(card)} submitLabel=\"Pay $49\" />\n */\nexport default function CreditCardForm({\n onSubmit,\n onChange,\n defaultValue,\n size = 'md',\n disabled,\n requireName = true,\n hideSubmit = false,\n submitLabel = 'Pay',\n className = '',\n style,\n}: CreditCardFormProps) {\n // Initial values are read once by useForm; seed (and format) from defaultValue.\n const initial = useRef<FormValues>({\n number: formatCardNumber(defaultValue?.number ?? ''),\n name: defaultValue?.name ?? '',\n expiry: formatExpiry(defaultValue?.expiry ?? ''),\n cvv: onlyDigits(defaultValue?.cvv ?? ''),\n }).current\n\n const form = useForm({ initialValues: initial })\n\n const numberStr = String(form.values.number ?? '')\n const brand = detectBrand(numberStr)\n\n // Live change callback.\n useEffect(() => {\n onChange?.(toCard(form.values))\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [form.values.number, form.values.name, form.values.expiry, form.values.cvv])\n\n // Base bindings (errorMessage + name + id) — value/onChange are overridden\n // below so we can format keystrokes brand-by-brand.\n const numberBind = form.fieldNative('number', {\n required: 'Card number is required',\n validate: (v) => cardNumberError(String(v)),\n })\n const nameBind = form.fieldNative('name', requireName ? { required: 'Cardholder name is required' } : undefined)\n const expiryBind = form.fieldNative('expiry', {\n required: 'Expiry is required',\n validate: (v) => expiryError(String(v)),\n })\n const cvvBind = form.fieldNative('cvv', {\n required: 'CVV is required',\n validate: (v) => cvvError(String(v), numberStr),\n })\n\n const cvvLen = brand?.cvv ?? 3\n\n return (\n <Form\n form={form}\n onFinish={(vals) => onSubmit?.(toCard(vals))}\n className={`flex flex-col gap-4 ${className}`.trim()}\n style={style}\n >\n <TextInput\n {...numberBind}\n label=\"Card number\"\n placeholder=\"1234 5678 9012 3456\"\n size={size}\n disabled={disabled}\n value={numberStr}\n onChange={(e) => form.setValue('number', formatCardNumber(e.target.value), { touch: true })}\n suffix={<BrandMark brand={brand} />}\n />\n\n <TextInput\n {...nameBind}\n label=\"Cardholder name\"\n placeholder=\"Jane Appleseed\"\n size={size}\n disabled={disabled}\n value={String(form.values.name ?? '')}\n onChange={(e) => form.setValue('name', e.target.value, { touch: true })}\n />\n\n <div className=\"flex items-start gap-3\">\n <div className=\"flex-1\">\n <TextInput\n {...expiryBind}\n label=\"Expiry\"\n placeholder=\"MM/YY\"\n size={size}\n disabled={disabled}\n value={String(form.values.expiry ?? '')}\n onChange={(e) => form.setValue('expiry', formatExpiry(e.target.value), { touch: true })}\n />\n </div>\n <div className=\"flex-1\">\n <TextInput\n {...cvvBind}\n label=\"CVV\"\n placeholder={cvvLen === 4 ? '1234' : '123'}\n size={size}\n disabled={disabled}\n value={String(form.values.cvv ?? '')}\n onChange={(e) => form.setValue('cvv', onlyDigits(e.target.value).slice(0, cvvLen), { touch: true })}\n />\n </div>\n </div>\n\n {!hideSubmit && (\n <Button content={submitLabel} buttonType=\"submit\" variant=\"primary\" disabled={disabled} />\n )}\n </Form>\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/Accordion.tsx","../src/components/core/Breadcrumbs.tsx","../src/components/core/Badge.tsx","../src/components/core/Kbd.tsx","../src/components/core/Card.tsx","../src/components/core/CardCarousel.tsx","../src/components/core/Statistic.tsx","../src/components/core/FAB.tsx","../src/components/core/PopConfirm.tsx","../src/components/core/Calendar.tsx","../src/components/core/Cart.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/_field.tsx","../src/components/inputs/SearchInput.tsx","../src/components/inputs/_tag.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/MegaMenu.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/RadioGroup.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","../src/components/inputs/TextArea.tsx","../src/components/inputs/SegmentedControl.tsx","../src/components/inputs/Slider.tsx","../src/components/inputs/TagsInput.tsx","../src/components/inputs/OtpInput.tsx","../src/components/inputs/Rating.tsx","../src/components/inputs/TimePicker.tsx","../src/components/inputs/DateRangePicker.tsx","../src/components/inputs/ColorPicker.tsx","../src/form/path.ts","../src/form/validate.ts","../src/form/store.ts","../src/form/bindings.ts","../src/form/useForm.ts","../src/form/context.ts","../src/form/Form.tsx","../src/form/useFormField.ts","../src/form/FormField.tsx","../src/form/useFieldArray.ts","../src/components/forms/creditCard.ts","../src/components/forms/CreditCardForm.tsx"],"names":["Map","px","jsx","GAP_MAP","ALIGN_CLASS","JUSTIFY_CLASS","Grid","jsxs","useReducedMotion","Dialog2","AnimatePresence","motion","useState","Accordion","createContext","Chevron","useContext","Fragment","SIZE","display","React","padding","Arrow","useRef","useCallback","useEffect","TONE","Calendar","useMemo","List","ChevronRight","useLayoutEffect","useId","SearchInput","Popover2","vars","SwitchPrimitive2","label","Popover3","isParent","Popover4","addMonths","defaultFormat","buildGrid","Popover5","Popover6","MONTH_NAMES","startOfMonth","addDays","isSameDay","startOfDay","Popover7","Popover8","useSyncExternalStore"],"mappings":"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","file":"index.js","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 /** Extra classes appended to the button. */\n className?: string\n /** Inline style on the button. */\n style?: React.CSSProperties\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 className = '',\n style,\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 style={style}\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 ${className}`.trim()}\n >\n {loading ? loadingIcon : icon}\n </button>\n )\n}\n","import React from 'react'\n\nexport interface ButtonProps {\n /** Button content (text or nodes). */\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 /** Show a loading spinner and disable the control. */\n loading?: boolean\n /** Disable interaction and dim the control. */\n disabled?: boolean\n /** Inline style overrides (width, etc.). Margins/layout belong in the parent. */\n style?: React.CSSProperties\n /** Extra classes appended to the button (override variant/size styles). */\n className?: string\n /** Leading icon — rendered before content */\n icon?: React.ReactNode\n /** Click handler. */\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 className = '',\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 className,\n ].filter(Boolean).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 /** Extra classes merged onto the modal panel. */\n className?: string\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 className = '',\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 ${className}`.trim()}\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 /** Extra classes merged onto the drawer panel. */\n className?: string\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 className = '',\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 ${className}`.trim()}\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 /** Extra classes merged onto the tooltip content bubble. */\n className?: string\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 className = '',\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 className,\n ].filter(Boolean).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, {\n createContext,\n useCallback,\n useContext,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n} from 'react'\nimport * as TabsPrimitive from '@radix-ui/react-tabs'\nimport { motion, useReducedMotion } from 'framer-motion'\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\nexport type TabsVariant = 'underline' | 'segmented' | 'enclosed'\nexport type TabsSize = 'sm' | 'md' | 'lg'\nexport type TabsOrientation = 'horizontal' | 'vertical'\n\ninterface TabMeta {\n label: React.ReactNode\n icon?: React.ReactNode\n disabled?: boolean\n}\ninterface TabRecord extends TabMeta {\n value: string\n}\n\ninterface TabsContextValue {\n value: string | undefined\n variant: TabsVariant\n size: TabsSize\n orientation: TabsOrientation\n indicatorId: string\n reduced: boolean\n /** Select a tab programmatically (used by the overflow menu). */\n select: (value: string) => void\n /** Triggers register their label/icon so the overflow menu can list them. */\n registerTab: (value: string, meta: TabMeta) => void\n unregisterTab: (value: string) => void\n /** Ordered list of registered tabs. */\n getTabs: () => TabRecord[]\n}\n\nconst TabsContext = createContext<TabsContextValue | null>(null)\nfunction useTabsContext(): TabsContextValue {\n const ctx = useContext(TabsContext)\n if (!ctx) throw new Error('Tabs.List / Tabs.Trigger / Tabs.Panel must be rendered inside <Tabs>.')\n return ctx\n}\n\nconst SIZE: Record<TabsSize, { trigger: string; icon: string; add: string }> = {\n sm: { trigger: 'h-8 text-xs px-2.5', icon: 'h-3.5 w-3.5', add: 'h-8 w-8' },\n md: { trigger: 'h-10 text-sm px-3', icon: 'h-4 w-4', add: 'h-10 w-9' },\n lg: { trigger: 'h-12 text-sm px-4', icon: 'h-[18px] w-[18px]', add: 'h-12 w-10' },\n}\n\n// Marker (sliding indicator) motion. Exponential ease-out per the design system;\n// reduced-motion collapses to an instant move (no spatial animation).\nconst MARKER_TRANSITION = { duration: 0.26, ease: [0.16, 1, 0.3, 1] as const }\n\n// ── Root ──────────────────────────────────────────────────────────────────────\n\nexport interface TabsProps {\n /** Controlled active tab value. */\n value?: string\n /** Uncontrolled initial active tab value. */\n defaultValue?: string\n /** Fires with the next active value. */\n onValueChange?: (value: string) => void\n /** Visual style. `'underline'` (default) | `'segmented'` | `'enclosed'`. */\n variant?: TabsVariant\n /** Size preset. Default `'md'`. */\n size?: TabsSize\n /** `'horizontal'` (default) strip + panel below, or `'vertical'` rail + panel beside. */\n orientation?: TabsOrientation\n /** Extra classes merged onto the root. */\n className?: string\n /** Inline style on the root. */\n style?: React.CSSProperties\n children: React.ReactNode\n}\n\n/**\n * Compositional, motion-forward tab system on Radix Tabs.\n *\n * The active tab is marked by a thin cobalt indicator that *slides* between\n * tabs (the design system's \"one rare accent\" rule, not a full-fill pill).\n * Three variants — `underline` (signature), `segmented` (lifted-pill track),\n * `enclosed` (folder tabs) — plus horizontal/vertical orientation, icons,\n * count badges, closeable + add-tab, and overflow scrolling with chevrons that\n * appear only when the strip actually overflows.\n *\n * @example\n * ```tsx\n * <Tabs defaultValue=\"overview\" variant=\"underline\">\n * <Tabs.List aria-label=\"Sections\">\n * <Tabs.Trigger value=\"overview\" icon={<HomeIcon />}>Overview</Tabs.Trigger>\n * <Tabs.Trigger value=\"activity\" badge={12}>Activity</Tabs.Trigger>\n * </Tabs.List>\n * <Tabs.Panel value=\"overview\">…</Tabs.Panel>\n * <Tabs.Panel value=\"activity\">…</Tabs.Panel>\n * </Tabs>\n * ```\n */\nfunction Tabs({\n value,\n defaultValue,\n onValueChange,\n variant = 'underline',\n size = 'md',\n orientation = 'horizontal',\n className = '',\n style,\n children,\n}: TabsProps) {\n const isControlled = value !== undefined\n const [internal, setInternal] = useState<string | undefined>(defaultValue)\n const current = isControlled ? value : internal\n const reduced = !!useReducedMotion()\n const indicatorId = useId()\n\n const select = useCallback((next: string) => {\n if (!isControlled) setInternal(next)\n onValueChange?.(next)\n }, [isControlled, onValueChange])\n\n // Tab registry — triggers self-register their label/icon so the overflow\n // menu can enumerate them. `version` only bumps on membership change (add /\n // remove), so re-registering a label on every render never loops.\n const registry = useRef<Map<string, TabMeta & { order: number }>>(new Map())\n const orderRef = useRef(0)\n const [, bump] = useState(0)\n const registerTab = useCallback((val: string, meta: TabMeta) => {\n const existing = registry.current.get(val)\n registry.current.set(val, { ...meta, order: existing?.order ?? orderRef.current++ })\n if (!existing) bump((v) => v + 1)\n }, [])\n const unregisterTab = useCallback((val: string) => {\n if (registry.current.delete(val)) bump((v) => v + 1)\n }, [])\n const getTabs = useCallback((): TabRecord[] =>\n [...registry.current.entries()]\n .sort((a, b) => a[1].order - b[1].order)\n .map(([val, m]) => ({ value: val, label: m.label, icon: m.icon, disabled: m.disabled })), [])\n\n return (\n <TabsContext.Provider value={{ value: current, variant, size, orientation, indicatorId, reduced, select, registerTab, unregisterTab, getTabs }}>\n <TabsPrimitive.Root\n value={current}\n onValueChange={select}\n orientation={orientation}\n className={[\n 'flex min-w-0',\n orientation === 'vertical' ? 'flex-row gap-4' : 'flex-col gap-3',\n className,\n ].filter(Boolean).join(' ')}\n style={style}\n >\n {children}\n </TabsPrimitive.Root>\n </TabsContext.Provider>\n )\n}\n\n// ── List (tab strip + overflow handling) ────────────────────────────────────────\n\nexport interface TabsListProps {\n children: React.ReactNode\n /** Accessible name for the tab list. */\n 'aria-label'?: string\n /** Extra classes merged onto the tab strip. */\n className?: string\n}\n\nfunction TabsList({ children, 'aria-label': ariaLabel, className = '' }: TabsListProps) {\n const { variant, orientation, reduced, value } = useTabsContext()\n const horizontal = orientation === 'horizontal'\n const scrollRef = useRef<HTMLDivElement>(null)\n const [edges, setEdges] = useState({ start: false, end: false })\n\n // Segmented is a compact track (2-4 options) — never scrolls.\n const scrollable = variant !== 'segmented'\n\n useLayoutEffect(() => {\n const el = scrollRef.current\n if (!el || !scrollable) return\n const update = () => {\n if (horizontal) {\n setEdges({\n start: el.scrollLeft > 1,\n end: el.scrollLeft + el.clientWidth < el.scrollWidth - 1,\n })\n } else {\n setEdges({\n start: el.scrollTop > 1,\n end: el.scrollTop + el.clientHeight < el.scrollHeight - 1,\n })\n }\n }\n update()\n el.addEventListener('scroll', update, { passive: true })\n const ro = new ResizeObserver(update)\n ro.observe(el)\n return () => { el.removeEventListener('scroll', update); ro.disconnect() }\n }, [horizontal, scrollable, children])\n\n const nudge = useCallback((dir: 1 | -1) => {\n const el = scrollRef.current\n if (!el) return\n const amount = (horizontal ? el.clientWidth : el.clientHeight) * 0.7 * dir\n el.scrollBy({ [horizontal ? 'left' : 'top']: amount, behavior: reduced ? 'auto' : 'smooth' })\n }, [horizontal, reduced])\n\n // Keep the active tab in view when it changes (e.g. picked from the overflow\n // menu, or activated by keyboard while off-screen).\n useLayoutEffect(() => {\n const el = scrollRef.current\n if (!el || !scrollable) return\n const active = el.querySelector<HTMLElement>('[role=tab][data-state=active]')\n // `scrollIntoView` is unimplemented in jsdom; guard so tests + SSR pass.\n if (active && typeof active.scrollIntoView === 'function') {\n active.scrollIntoView({ block: 'nearest', inline: 'nearest', behavior: reduced ? 'auto' : 'smooth' })\n }\n }, [value, scrollable, reduced])\n\n // Fade the strip's own content at any overflowing edge (background-agnostic\n // via mask-image), so tabs dissolve under the chevron rather than getting\n // hard-cut.\n const maskStyle: React.CSSProperties = scrollable && (edges.start || edges.end)\n ? (() => {\n const dir = horizontal ? 'to right' : 'to bottom'\n const a = edges.start ? 'transparent, black 36px' : 'black'\n const b = edges.end ? 'black calc(100% - 36px), transparent' : 'black'\n const img = `linear-gradient(${dir}, ${a}, ${b})`\n return { maskImage: img, WebkitMaskImage: img }\n })()\n : {}\n\n const trackClass = (() => {\n if (variant === 'segmented') {\n return horizontal\n ? 'inline-flex items-center gap-1 rounded-lg border border-border bg-surface-raised p-1 w-fit'\n : 'inline-flex flex-col items-stretch gap-1 rounded-lg border border-border bg-surface-raised p-1 w-fit'\n }\n // underline + enclosed share a hairline the strip sits on\n const hairline = horizontal ? 'border-b border-border' : 'border-r border-border'\n const align = variant === 'enclosed' && horizontal ? 'items-end' : 'items-stretch'\n return `flex ${horizontal ? 'flex-row' : 'flex-col'} ${align} gap-1 ${hairline}`\n })()\n\n const scrollClass = scrollable\n ? horizontal\n ? 'overflow-x-auto overflow-y-hidden hidden-scrollbar'\n : 'overflow-y-auto overflow-x-hidden hidden-scrollbar'\n : ''\n\n const overflowing = scrollable && (edges.start || edges.end)\n\n return (\n <div className={['relative flex min-w-0 gap-1', horizontal ? 'flex-row items-stretch' : 'flex-col items-stretch', className].filter(Boolean).join(' ')}>\n {scrollable && edges.start && (\n <Chevron side=\"start\" orientation={orientation} onClick={() => nudge(-1)} />\n )}\n\n <TabsPrimitive.List\n ref={scrollRef}\n aria-label={ariaLabel}\n className={[scrollClass, trackClass, 'min-w-0 flex-1'].filter(Boolean).join(' ')}\n style={maskStyle}\n >\n {children}\n </TabsPrimitive.List>\n\n {scrollable && edges.end && (\n <Chevron side=\"end\" orientation={orientation} onClick={() => nudge(1)} />\n )}\n\n {/* Quick-select: jump to any tab when the strip overflows. */}\n {overflowing && <OverflowMenu />}\n </div>\n )\n}\n\nfunction Chevron({ side, orientation, onClick }: { side: 'start' | 'end'; orientation: TabsOrientation; onClick: () => void }) {\n const horizontal = orientation === 'horizontal'\n // Rotate a single right-chevron glyph to the needed direction.\n const rotate =\n horizontal\n ? (side === 'start' ? 'rotate-180' : '')\n : (side === 'start' ? '-rotate-90' : 'rotate-90')\n return (\n <button\n type=\"button\"\n aria-label={side === 'start' ? 'Scroll tabs backward' : 'Scroll tabs forward'}\n onClick={onClick}\n className=\"flex-shrink-0 self-center flex h-7 w-7 items-center justify-center rounded-full border border-border bg-surface text-foreground-secondary shadow-sm hover:text-foreground hover:bg-surface-raised transition-colors 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-4 w-4 ${rotate}`} aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 5l7 7-7 7\" />\n </svg>\n </button>\n )\n}\n\n// ── Overflow quick-select menu ───────────────────────────────────────────────\n// A \"jump to any tab\" affordance shown only when the strip overflows. Opens on\n// hover (mouse) and on click / keyboard (touch + a11y); picking a tab activates\n// it and scrolls it into view.\nfunction OverflowMenu() {\n const { getTabs, value, select, orientation } = useTabsContext()\n const horizontal = orientation === 'horizontal'\n const [open, setOpen] = useState(false)\n const wrapRef = useRef<HTMLDivElement>(null)\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const openNow = () => { if (timer.current) clearTimeout(timer.current); setOpen(true) }\n const closeSoon = () => { timer.current = setTimeout(() => setOpen(false), 160) }\n\n useLayoutEffect(() => {\n if (!open) return\n const onDoc = (e: MouseEvent) => { if (wrapRef.current && !wrapRef.current.contains(e.target as Node)) setOpen(false) }\n const onKey = (e: KeyboardEvent) => { if (e.key === 'Escape') setOpen(false) }\n document.addEventListener('mousedown', onDoc)\n document.addEventListener('keydown', onKey)\n return () => { document.removeEventListener('mousedown', onDoc); document.removeEventListener('keydown', onKey) }\n }, [open])\n\n const tabs = getTabs()\n\n return (\n <div\n ref={wrapRef}\n className=\"relative flex-shrink-0 self-center\"\n onMouseEnter={openNow}\n onMouseLeave={closeSoon}\n >\n <button\n type=\"button\"\n aria-haspopup=\"menu\"\n aria-expanded={open}\n aria-label=\"Show all tabs\"\n onClick={() => setOpen((o) => !o)}\n className=\"flex h-7 w-7 items-center justify-center rounded-full border border-border bg-surface text-foreground-secondary shadow-sm hover:text-foreground hover:bg-surface-raised data-[expanded=true]:text-foreground transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n data-expanded={open}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"h-4 w-4\" aria-hidden=\"true\">\n <circle cx=\"5\" cy=\"12\" r=\"1.6\" /><circle cx=\"12\" cy=\"12\" r=\"1.6\" /><circle cx=\"19\" cy=\"12\" r=\"1.6\" />\n </svg>\n </button>\n\n {open && (\n <div\n role=\"menu\"\n onMouseEnter={openNow}\n onMouseLeave={closeSoon}\n className={`absolute z-30 ${horizontal ? 'right-0 top-full mt-1.5' : 'left-full top-0 ml-1.5'} min-w-[184px] max-h-72 overflow-y-auto hidden-scrollbar rounded-lg border border-border bg-surface p-1 shadow-md animate-in fade-in-0 zoom-in-95`}\n >\n {tabs.map((t) => {\n const isActive = t.value === value\n return (\n <button\n key={t.value}\n type=\"button\"\n role=\"menuitem\"\n disabled={t.disabled}\n onClick={() => { select(t.value); setOpen(false) }}\n className={`flex w-full items-center gap-2 rounded-md px-2.5 py-1.5 text-left text-sm transition-colors disabled:opacity-40 disabled:cursor-not-allowed focus:outline-none focus-visible:ring-2 focus-visible:ring-accent ${isActive ? 'bg-surface-raised text-accent' : 'text-foreground-secondary hover:bg-surface-raised hover:text-foreground'}`}\n >\n {t.icon && <span className=\"flex-shrink-0 inline-flex h-4 w-4 items-center justify-center\">{t.icon}</span>}\n <span className=\"flex-1 truncate\">{t.label}</span>\n {isActive && (\n <svg viewBox=\"0 0 20 20\" fill=\"none\" className=\"h-4 w-4 flex-shrink-0 text-accent\" aria-hidden=\"true\">\n <path d=\"M4 10l4.5 4.5L16 6\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n )}\n </button>\n )\n })}\n </div>\n )}\n </div>\n )\n}\n\n// ── Trigger ─────────────────────────────────────────────────────────────────────\n\nexport interface TabsTriggerProps {\n /** Value that activates this tab and its matching `<Tabs.Panel>`. */\n value: string\n /** Optional leading icon. */\n icon?: React.ReactNode\n /** Optional trailing count badge (number or node). */\n badge?: React.ReactNode\n /** Render a × close button and call `onClose`. */\n closeable?: boolean\n onClose?: () => void\n disabled?: boolean\n /** Extra classes merged onto the trigger. */\n className?: string\n children: React.ReactNode\n}\n\nfunction TabsTrigger({ value, icon, badge, closeable, onClose, disabled, className = '', children }: TabsTriggerProps) {\n const { value: active, variant, size, orientation, indicatorId, reduced, registerTab, unregisterTab } = useTabsContext()\n const isActive = active === value\n const horizontal = orientation === 'horizontal'\n const sz = SIZE[size]\n\n // Self-register so the overflow menu can list this tab. Re-runs cheaply on\n // label/icon change; only mount/unmount bumps the registry version.\n useLayoutEffect(() => {\n registerTab(value, { label: children, icon, disabled })\n return () => unregisterTab(value)\n }, [value, children, icon, disabled, registerTab, unregisterTab])\n\n // Horizontal tabs centre their content and size to fit; vertical tabs fill\n // the rail width and left-align so icons/labels line up in a column.\n const layoutCls = horizontal ? 'justify-center flex-shrink-0' : 'justify-start w-full'\n const base = 'group/trigger relative inline-flex items-center whitespace-nowrap font-medium select-none transition-colors duration-150 focus:outline-none disabled:opacity-40 disabled:cursor-not-allowed'\n\n const variantCls =\n variant === 'segmented'\n ? `rounded-md ${isActive ? 'text-accent' : 'text-foreground-secondary hover:text-foreground'} focus-visible:text-accent`\n : variant === 'enclosed'\n ? `${horizontal ? 'rounded-t-md border border-b-0 -mb-px' : 'rounded-l-md border border-r-0 -mr-px'} ${isActive ? 'bg-surface border-border text-foreground' : 'border-transparent text-foreground-secondary hover:text-foreground hover:bg-surface-raised'} focus-visible:text-accent`\n : `${isActive ? 'text-accent' : 'text-foreground-secondary hover:text-foreground'} focus-visible:text-accent`\n\n const trigger = (\n <TabsPrimitive.Trigger\n value={value}\n disabled={disabled}\n className={[base, sz.trigger, layoutCls, closeable ? 'pr-8' : '', variantCls, className].filter(Boolean).join(' ')}\n >\n {/* Segmented lifted pill — slides between tabs. */}\n {variant === 'segmented' && isActive && (\n <motion.span\n layoutId={`${indicatorId}-seg`}\n className=\"absolute inset-0 rounded-md bg-surface shadow-sm\"\n transition={reduced ? { duration: 0 } : MARKER_TRANSITION}\n aria-hidden=\"true\"\n />\n )}\n\n <span className=\"relative z-[1] inline-flex items-center gap-2 min-w-0\">\n {icon && <span className={`flex-shrink-0 inline-flex items-center justify-center ${sz.icon}`}>{icon}</span>}\n <span className=\"truncate\">{children}</span>\n {badge != null && (\n // Unopinionated count chip: a subtle blue-tinted slate pill\n // with near-white text, consistent across active/inactive.\n // Both tokens are theme-relative, so it self-inverts in dark\n // mode (light pill + dark text) and always stays legible.\n <span className=\"ml-0.5 inline-flex h-[18px] min-w-[18px] items-center justify-center rounded-full bg-foreground-secondary px-1.5 text-[11px] font-semibold leading-none text-background\">\n {badge}\n </span>\n )}\n </span>\n\n {/* Underline marker — slides between tabs (horizontal: bottom edge;\n vertical: right edge of the rail). */}\n {variant === 'underline' && isActive && (\n <motion.span\n layoutId={`${indicatorId}-line`}\n className={horizontal ? 'absolute left-2 right-2 bottom-0 h-0.5 rounded-full bg-accent' : 'absolute top-1.5 bottom-1.5 right-0 w-0.5 rounded-full bg-accent'}\n transition={reduced ? { duration: 0 } : MARKER_TRANSITION}\n aria-hidden=\"true\"\n />\n )}\n </TabsPrimitive.Trigger>\n )\n\n if (!closeable) return trigger\n\n // The close control is a SIBLING of the trigger (a <button> nested inside a\n // <button> is invalid HTML and breaks keyboard activation).\n return (\n <span className={`relative inline-flex items-center ${horizontal ? 'flex-shrink-0' : 'w-full'}`}>\n {trigger}\n <button\n type=\"button\"\n aria-label=\"Close tab\"\n onClick={(e) => { e.stopPropagation(); onClose?.() }}\n className=\"absolute right-1.5 top-1/2 z-[2] -translate-y-1/2 inline-flex h-5 w-5 items-center justify-center rounded text-foreground-muted hover:text-status-error hover:bg-surface-raised transition-colors focus:outline-none focus-visible:ring-1 focus-visible:ring-accent\"\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 20 20\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M15 5L5 15M5 5l10 10\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n </span>\n )\n}\n\n// ── Add ──────────────────────────────────────────────────────────────────────\n\nexport interface TabsAddProps {\n onClick?: () => void\n 'aria-label'?: string\n className?: string\n}\n\nfunction TabsAdd({ onClick, 'aria-label': ariaLabel = 'Add tab', className = '' }: TabsAddProps) {\n const { size } = useTabsContext()\n return (\n <button\n type=\"button\"\n onClick={onClick}\n aria-label={ariaLabel}\n className={`flex-shrink-0 inline-flex items-center justify-center rounded-md text-foreground-muted hover:text-foreground hover:bg-surface-raised transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-accent ${SIZE[size].add} ${className}`.trim()}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} className=\"h-4 w-4\" aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 5v14M5 12h14\" />\n </svg>\n </button>\n )\n}\n\n// ── Panel ─────────────────────────────────────────────────────────────────────\n\nexport interface TabsPanelProps {\n /** Value of the tab this panel belongs to. */\n value: string\n /**\n * Keep the panel mounted when inactive (preserves scroll / form state).\n * Default `false` — panels mount lazily on first activation.\n */\n keepMounted?: boolean\n /** Extra classes merged onto the panel. */\n className?: string\n style?: React.CSSProperties\n children: React.ReactNode\n}\n\nfunction TabsPanel({ value, keepMounted, className = '', style, children }: TabsPanelProps) {\n return (\n <TabsPrimitive.Content\n value={value}\n forceMount={keepMounted || undefined}\n className={['min-w-0 flex-1 focus:outline-none data-[state=inactive]:hidden', className].filter(Boolean).join(' ')}\n style={style}\n >\n {children}\n </TabsPrimitive.Content>\n )\n}\n\n// ── Compound export ─────────────────────────────────────────────────────────────\n\nTabs.List = TabsList\nTabs.Trigger = TabsTrigger\nTabs.Panel = TabsPanel\nTabs.Add = TabsAdd\n\nexport default Tabs\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 /** Extra classes merged onto the tree root. */\n className?: string\n /** Inline style on the tree root. */\n style?: React.CSSProperties\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 className = '',\n style,\n}: TreeProps) {\n return (\n <div className={`p-1 w-full ${className}`.trim()} style={style}>\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, { createContext, useContext } from 'react'\nimport * as AccordionPrimitive from '@radix-ui/react-accordion'\n\n// ── Context (carries the chevron preference down to each item) ──────────────────\n\ntype AccordionVariant = 'separated' | 'contained'\nconst AccordionCtx = createContext<{ variant: AccordionVariant }>({ variant: 'separated' })\n\n// ── Root ────────────────────────────────────────────────────────────────────────\n\nexport interface AccordionProps {\n /** `AccordionItem` children. */\n children: React.ReactNode\n /**\n * `'single'` (default) allows one open panel at a time; `'multiple'` lets\n * any number be open together.\n */\n type?: 'single' | 'multiple'\n /** Uncontrolled initial open value(s). */\n defaultValue?: string | string[]\n /** Controlled open value(s). */\n value?: string | string[]\n /** Fires when the open set changes. */\n onValueChange?: (value: string | string[]) => void\n /** In `single` mode, allow the open item to be collapsed. Default `true`. */\n collapsible?: boolean\n /**\n * Visual style:\n * - `'separated'` (default) — each item is its own bordered card with gaps.\n * - `'contained'` — one bordered surface with divider lines between items.\n */\n variant?: AccordionVariant\n /** Extra classes merged onto the root. */\n className?: string\n style?: React.CSSProperties\n}\n\n/**\n * Vertically stacked, collapsible panels built on `@radix-ui/react-accordion`.\n * Radix handles open/close state, keyboard navigation (↑/↓/Home/End), and ARIA;\n * the content height animates via the shared `accordion-down` / `accordion-up`\n * keyframes (reduced-motion safe — the height var simply snaps).\n *\n * @example\n * ```tsx\n * <Accordion type=\"single\" defaultValue=\"a\" collapsible>\n * <Accordion.Item value=\"a\" title=\"What is included?\">\n * Everything in the Pro plan, plus priority support.\n * </Accordion.Item>\n * <Accordion.Item value=\"b\" title=\"Can I cancel anytime?\">\n * Yes — cancel from billing settings, no questions asked.\n * </Accordion.Item>\n * </Accordion>\n * ```\n */\nfunction Accordion({\n children,\n type = 'single',\n defaultValue,\n value,\n onValueChange,\n collapsible = true,\n variant = 'separated',\n className = '',\n style,\n}: AccordionProps) {\n // Radix types `single` and `multiple` roots differently; this component\n // exposes one ergonomic surface and forwards the right props per mode.\n const common = {\n className: [\n variant === 'contained'\n ? 'rounded-lg border border-border bg-surface overflow-hidden divide-y divide-border'\n : 'flex flex-col gap-2',\n className,\n ].filter(Boolean).join(' '),\n style,\n }\n\n const inner = <AccordionCtx.Provider value={{ variant }}>{children}</AccordionCtx.Provider>\n\n if (type === 'multiple') {\n return (\n <AccordionPrimitive.Root\n type=\"multiple\"\n defaultValue={defaultValue as string[] | undefined}\n value={value as string[] | undefined}\n onValueChange={onValueChange as ((v: string[]) => void) | undefined}\n {...common}\n >\n {inner}\n </AccordionPrimitive.Root>\n )\n }\n\n return (\n <AccordionPrimitive.Root\n type=\"single\"\n collapsible={collapsible}\n defaultValue={defaultValue as string | undefined}\n value={value as string | undefined}\n onValueChange={onValueChange as ((v: string) => void) | undefined}\n {...common}\n >\n {inner}\n </AccordionPrimitive.Root>\n )\n}\n\n// ── Item ──────────────────────────────────────────────────────────────────────────\n\nexport interface AccordionItemProps {\n /** Unique value identifying this panel (used for open state). */\n value: string\n /** Header content — the always-visible trigger label. */\n title: React.ReactNode\n /** Optional leading icon shown before the title. */\n icon?: React.ReactNode\n /** Panel body, revealed when open. */\n children: React.ReactNode\n /** Disable this item (header non-interactive, dimmed). */\n disabled?: boolean\n className?: string\n}\n\nconst Chevron = (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} aria-hidden=\"true\"\n className=\"h-4 w-4 flex-shrink-0 text-foreground-muted transition-transform duration-200 group-data-[state=open]/acc:rotate-180 group-data-[state=open]/acc:text-accent\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n)\n\nfunction AccordionItem({ value, title, icon, children, disabled, className = '' }: AccordionItemProps) {\n const { variant } = useContext(AccordionCtx)\n return (\n <AccordionPrimitive.Item\n value={value}\n disabled={disabled}\n className={[\n variant === 'separated' ? 'rounded-lg border border-border bg-surface overflow-hidden' : '',\n 'data-[disabled]:opacity-60',\n className,\n ].filter(Boolean).join(' ')}\n >\n <AccordionPrimitive.Header className=\"m-0\">\n <AccordionPrimitive.Trigger\n className=\"group/acc flex w-full items-center gap-3 px-4 py-3 text-left select-none\n text-sm font-medium text-foreground transition-colors\n hover:bg-surface-raised data-[state=open]:text-accent\n focus:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-inset\n disabled:cursor-not-allowed\"\n >\n {icon && <span className=\"flex h-5 w-5 flex-shrink-0 items-center justify-center text-foreground-muted group-data-[state=open]/acc:text-accent\">{icon}</span>}\n <span className=\"flex-1 min-w-0\">{title}</span>\n {Chevron}\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n <AccordionPrimitive.Content\n className=\"overflow-hidden data-[state=open]:animate-accordion-down data-[state=closed]:animate-accordion-up\"\n >\n <div className=\"px-4 pb-4 pt-0 text-sm text-foreground-secondary leading-relaxed\">\n {children}\n </div>\n </AccordionPrimitive.Content>\n </AccordionPrimitive.Item>\n )\n}\n\n// ── Compound export ─────────────────────────────────────────────────────────────\n\nAccordion.Item = AccordionItem\n\nexport default Accordion\n","import React, { useState } from 'react'\n\nexport interface BreadcrumbItem {\n /** Visible label. */\n label: React.ReactNode\n /** Link target. Omit on the current (last) crumb. */\n href?: string\n /** Optional leading icon. */\n icon?: React.ReactNode\n /** Click handler (router navigation). */\n onClick?: React.MouseEventHandler\n}\n\nexport interface BreadcrumbsProps {\n /** Ordered trail, root → current. The last item renders as the current page. */\n items: BreadcrumbItem[]\n /** Separator between crumbs. Default a chevron. */\n separator?: React.ReactNode\n /**\n * Collapse the middle of long trails into an expandable ellipsis once the\n * count exceeds this. The first and last crumb always stay visible. Set `0`\n * to never collapse. Default `0`.\n */\n maxItems?: number\n /** Accessible label for the nav landmark. Default `'Breadcrumb'`. */\n 'aria-label'?: string\n className?: string\n style?: React.CSSProperties\n}\n\nconst DefaultSeparator = (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} aria-hidden=\"true\" className=\"h-3.5 w-3.5 text-foreground-muted\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 5l7 7-7 7\" />\n </svg>\n)\n\nconst crumbBase = 'inline-flex items-center gap-1.5 rounded px-1 -mx-1 text-sm transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-accent'\n\nfunction Crumb({ item, current }: { item: BreadcrumbItem; current: boolean }) {\n const inner = (\n <>\n {item.icon && <span className=\"flex h-4 w-4 flex-shrink-0 items-center justify-center\">{item.icon}</span>}\n <span className=\"truncate\">{item.label}</span>\n </>\n )\n if (current) {\n return (\n <span aria-current=\"page\" className={`${crumbBase} font-medium text-foreground max-w-[16rem]`}>\n {inner}\n </span>\n )\n }\n if (item.href || item.onClick) {\n return (\n <a href={item.href} onClick={item.onClick} className={`${crumbBase} text-foreground-secondary hover:text-foreground max-w-[12rem]`}>\n {inner}\n </a>\n )\n }\n return <span className={`${crumbBase} text-foreground-secondary max-w-[12rem]`}>{inner}</span>\n}\n\n/**\n * A breadcrumb trail. Renders a `<nav><ol>` of crumbs separated by a chevron;\n * the last crumb is the current page (`aria-current=\"page\"`, not a link). Long\n * trails can collapse their middle into a clickable ellipsis via `maxItems`.\n *\n * @example\n * ```tsx\n * <Breadcrumbs\n * items={[\n * { label: 'Home', href: '/' },\n * { label: 'Fleet', href: '/fleet' },\n * { label: 'Aurora' },\n * ]}\n * />\n * ```\n */\nexport default function Breadcrumbs({\n items,\n separator = DefaultSeparator,\n maxItems = 0,\n 'aria-label': ariaLabel = 'Breadcrumb',\n className = '',\n style,\n}: BreadcrumbsProps) {\n const [expanded, setExpanded] = useState(false)\n\n const shouldCollapse = maxItems > 0 && items.length > maxItems && !expanded\n // Keep the first crumb + the last (maxItems - 1) crumbs; ellipsis stands in\n // for everything between.\n const visible: Array<{ item: BreadcrumbItem; index: number } | 'ellipsis'> = []\n if (shouldCollapse) {\n const tailCount = Math.max(1, maxItems - 1)\n visible.push({ item: items[0], index: 0 })\n visible.push('ellipsis')\n for (let i = items.length - tailCount; i < items.length; i++) visible.push({ item: items[i], index: i })\n } else {\n items.forEach((item, index) => visible.push({ item, index }))\n }\n\n return (\n <nav aria-label={ariaLabel} className={['min-w-0', className].filter(Boolean).join(' ')} style={style}>\n <ol className=\"flex items-center gap-1.5 flex-nowrap min-w-0\">\n {visible.map((entry, i) => {\n const isLast = i === visible.length - 1\n return (\n <li key={entry === 'ellipsis' ? 'ellipsis' : entry.index} className=\"flex items-center gap-1.5 min-w-0\">\n {entry === 'ellipsis' ? (\n <button\n type=\"button\"\n onClick={() => setExpanded(true)}\n aria-label=\"Show hidden breadcrumbs\"\n className=\"inline-flex h-6 items-center rounded px-1.5 text-sm text-foreground-secondary hover:bg-surface-raised hover:text-foreground focus:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n >\n …\n </button>\n ) : (\n <Crumb item={entry.item} current={entry.index === items.length - 1} />\n )}\n {!isLast && <span className=\"flex-shrink-0\">{separator}</span>}\n </li>\n )\n })}\n </ol>\n </nav>\n )\n}\n","import React from 'react'\n\nexport type BadgeTone = 'neutral' | 'accent' | 'success' | 'warning' | 'error' | 'info'\nexport type BadgeVariant = 'solid' | 'soft' | 'outline'\nexport type BadgeSize = 'sm' | 'md'\n\nexport interface BadgeProps {\n /** Pill label (label mode) when no `count` / `dot` is given. */\n children?: React.ReactNode\n /** Semantic colour. Default `'neutral'`. */\n tone?: BadgeTone\n /** Fill style. Default `'soft'`. */\n variant?: BadgeVariant\n /** Size preset. Default `'md'`. */\n size?: BadgeSize\n /** Optional leading icon (label mode). */\n icon?: React.ReactNode\n /**\n * Indicator mode — a numeric counter. With `children` it overlays the\n * top-right corner of the wrapped element; without, it renders inline.\n */\n count?: number\n /** Cap the displayed count (e.g. `99+`). Default `99`. */\n max?: number\n /** Render a bare dot indicator (no number). Overrides `count` display. */\n dot?: boolean\n /** Show the indicator even when `count` is 0. Default `false`. */\n showZero?: boolean\n className?: string\n style?: React.CSSProperties\n}\n\n// tone → [solid, soft, outline] class sets\nconst TONE: Record<BadgeTone, { solid: string; soft: string; outline: string; dot: string }> = {\n neutral: {\n solid: 'bg-foreground-secondary text-background',\n soft: 'bg-surface-raised text-foreground-secondary',\n outline: 'border border-border text-foreground-secondary',\n dot: 'bg-foreground-secondary',\n },\n accent: {\n solid: 'bg-accent text-accent-fg',\n soft: 'bg-accent/10 text-accent',\n outline: 'border border-accent text-accent',\n dot: 'bg-accent',\n },\n success: {\n solid: 'bg-status-success text-white',\n soft: 'bg-status-success/12 text-status-success',\n outline: 'border border-status-success text-status-success',\n dot: 'bg-status-success',\n },\n warning: {\n solid: 'bg-status-warning text-white',\n soft: 'bg-status-warning/15 text-status-warning',\n outline: 'border border-status-warning text-status-warning',\n dot: 'bg-status-warning',\n },\n error: {\n solid: 'bg-status-error text-white',\n soft: 'bg-status-error/12 text-status-error',\n outline: 'border border-status-error text-status-error',\n dot: 'bg-status-error',\n },\n info: {\n solid: 'bg-status-info text-white',\n soft: 'bg-status-info/12 text-status-info',\n outline: 'border border-status-info text-status-info',\n dot: 'bg-status-info',\n },\n}\n\nconst SIZE: Record<BadgeSize, string> = {\n sm: 'h-[18px] px-1.5 text-[11px] gap-1 rounded-full',\n md: 'h-5 px-2 text-xs gap-1 rounded-full',\n}\n\n/**\n * A small status / count indicator. Three uses:\n *\n * 1. **Label pill** — `<Badge tone=\"success\">Active</Badge>`.\n * 2. **Inline count** — `<Badge count={5} tone=\"error\" />`.\n * 3. **Overlay** — wrap an element to anchor a count/dot to its top-right:\n * `<Badge count={3} tone=\"error\"><IconButton … /></Badge>`.\n *\n * @example\n * <Badge tone=\"accent\" variant=\"soft\">Beta</Badge>\n * <Badge dot tone=\"success\"><Avatar … /></Badge>\n */\nexport default function Badge({\n children,\n tone = 'neutral',\n variant = 'soft',\n size = 'md',\n icon,\n count,\n max = 99,\n dot = false,\n showZero = false,\n className = '',\n style,\n}: BadgeProps) {\n const isIndicator = dot || count != null\n const hidden = !dot && count != null && count === 0 && !showZero\n const display = count != null && count > max ? `${max}+` : count\n\n // ── Label pill (no indicator props) ──────────────────────────────────────\n if (!isIndicator) {\n return (\n <span\n className={[\n 'inline-flex items-center font-medium select-none whitespace-nowrap leading-none',\n SIZE[size],\n TONE[tone][variant],\n className,\n ].filter(Boolean).join(' ')}\n style={style}\n >\n {icon && <span className=\"flex h-3.5 w-3.5 items-center justify-center\">{icon}</span>}\n {children}\n </span>\n )\n }\n\n // ── Indicator (dot or count) ─────────────────────────────────────────────\n const indicator = dot ? (\n <span\n className={['inline-block rounded-full', size === 'sm' ? 'h-2 w-2' : 'h-2.5 w-2.5', TONE[tone].dot, className].filter(Boolean).join(' ')}\n style={children ? undefined : style}\n aria-hidden={children ? true : undefined}\n />\n ) : (\n <span\n className={[\n 'inline-flex items-center justify-center rounded-full font-semibold leading-none tabular-nums',\n size === 'sm' ? 'h-4 min-w-4 px-1 text-[10px]' : 'h-[18px] min-w-[18px] px-1.5 text-[11px]',\n TONE[tone].solid,\n className,\n ].filter(Boolean).join(' ')}\n style={children ? undefined : style}\n >\n {display}\n </span>\n )\n\n // Inline (no wrapped child).\n if (!children) return hidden ? null : indicator\n\n // Overlay anchored to the child's top-right.\n return (\n <span className=\"relative inline-flex\" style={style}>\n {children}\n {!hidden && (\n <span className=\"absolute -top-1 -right-1 flex\">{indicator}</span>\n )}\n </span>\n )\n}\n","import React from 'react'\n\nexport type KbdSize = 'sm' | 'md'\n\nexport interface KbdProps {\n /** A single key's label when `keys` is not used. */\n children?: React.ReactNode\n /**\n * A key combination — each entry renders as its own key cap, joined by\n * `separator`. e.g. `['Ctrl', 'K']` → `Ctrl + K`.\n */\n keys?: string[]\n /** Joiner between caps in a combo. Default `'+'`. */\n separator?: React.ReactNode\n /** Size preset. Default `'md'`. */\n size?: KbdSize\n className?: string\n style?: React.CSSProperties\n}\n\nconst SIZE: Record<KbdSize, string> = {\n sm: 'h-5 min-w-[20px] px-1.5 text-[11px]',\n md: 'h-6 min-w-[24px] px-2 text-xs',\n}\n\nconst cap =\n 'inline-flex items-center justify-center rounded-md border border-border border-b-2 ' +\n 'bg-surface-raised font-medium text-foreground-secondary leading-none select-none ' +\n 'font-sans shadow-sm'\n\n/**\n * Renders keyboard keys as styled caps — a single key via `children`, or a\n * combination via `keys` (each rendered as its own cap, joined by `separator`).\n *\n * @example\n * <Kbd>Esc</Kbd>\n * <Kbd keys={['Ctrl', 'K']} />\n * <Kbd keys={['⌘', '⇧', 'P']} size=\"sm\" />\n */\nexport default function Kbd({\n children,\n keys,\n separator = '+',\n size = 'md',\n className = '',\n style,\n}: KbdProps) {\n if (keys && keys.length > 0) {\n return (\n <span className={['inline-flex items-center gap-1', className].filter(Boolean).join(' ')} style={style}>\n {keys.map((k, i) => (\n <React.Fragment key={`${k}-${i}`}>\n {i > 0 && <span className=\"text-foreground-muted text-xs select-none\">{separator}</span>}\n <kbd className={[cap, SIZE[size]].join(' ')}>{k}</kbd>\n </React.Fragment>\n ))}\n </span>\n )\n }\n\n return (\n <kbd className={[cap, SIZE[size], className].filter(Boolean).join(' ')} style={style}>\n {children}\n </kbd>\n )\n}\n","import React from 'react'\n\ntype Pad = 'none' | 'sm' | 'md' | 'lg'\nconst PAD: Record<Pad, string> = { none: '', sm: 'p-3', md: 'p-5', lg: 'p-6' }\n\n// ── Root ────────────────────────────────────────────────────────────────────────\n\nexport interface CardProps {\n children: React.ReactNode\n /**\n * Make the whole card a single interactive surface: hover lift, pointer\n * cursor, focus ring, and (with `onClick`) button semantics + Enter/Space\n * activation.\n */\n interactive?: boolean\n /** Click handler. With `interactive`, the card becomes keyboard-activatable. */\n onClick?: React.MouseEventHandler\n /**\n * Padding on the root. Leave `'none'` (default) when composing with\n * `Card.Header` / `Card.Body` / `Card.Footer` (they bring their own); set a\n * value for a quick flat card.\n */\n padding?: Pad\n /** Drop the border + shadow for a flat, borderless surface. */\n flush?: boolean\n className?: string\n style?: React.CSSProperties\n}\n\n/**\n * A surface container with optional header / media / body / footer sections.\n *\n * @example Composed\n * ```tsx\n * <Card>\n * <Card.Media><img src={cover} alt=\"\" /></Card.Media>\n * <Card.Header title=\"Aurora\" subtitle=\"Bulk carrier\" action={<IconButton … />} />\n * <Card.Body>Last seen off the North Sea, en route to Rotterdam.</Card.Body>\n * <Card.Footer><Button content=\"Track\" /></Card.Footer>\n * </Card>\n * ```\n *\n * @example Quick flat card\n * ```tsx\n * <Card padding=\"md\" interactive onClick={open}>Click me</Card>\n * ```\n */\nfunction Card({ children, interactive, onClick, padding = 'none', flush, className = '', style }: CardProps) {\n const base = [\n 'rounded-xl overflow-hidden bg-surface',\n flush ? '' : 'border border-border shadow-sm',\n PAD[padding],\n interactive\n ? 'transition-[transform,box-shadow] duration-200 ease-out hover:-translate-y-0.5 hover:shadow-md ' +\n 'cursor-pointer focus:outline-none focus-visible:ring-2 focus-visible:ring-accent'\n : '',\n className,\n ].filter(Boolean).join(' ')\n\n if (interactive && onClick) {\n return (\n <div\n role=\"button\"\n tabIndex={0}\n onClick={onClick}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n onClick(e as unknown as React.MouseEvent)\n }\n }}\n className={base}\n style={style}\n >\n {children}\n </div>\n )\n }\n\n return (\n <div onClick={onClick} className={base} style={style}>\n {children}\n </div>\n )\n}\n\n// ── Media (full-bleed image / visual slot) ──────────────────────────────────────\n\nexport interface CardMediaProps {\n children: React.ReactNode\n className?: string\n}\nfunction CardMedia({ children, className = '' }: CardMediaProps) {\n return <div className={['[&>img]:block [&>img]:w-full [&>img]:object-cover', className].filter(Boolean).join(' ')}>{children}</div>\n}\n\n// ── Header (title + subtitle + trailing action) ─────────────────────────────────\n\nexport interface CardHeaderProps {\n title?: React.ReactNode\n subtitle?: React.ReactNode\n /** Trailing slot — actions, menu, badge. */\n action?: React.ReactNode\n /** Leading slot — avatar / icon. */\n avatar?: React.ReactNode\n children?: React.ReactNode\n className?: string\n}\nfunction CardHeader({ title, subtitle, action, avatar, children, className = '' }: CardHeaderProps) {\n return (\n <div className={['flex items-start gap-3 px-5 pt-5', children ? 'pb-0' : 'pb-3', className].filter(Boolean).join(' ')}>\n {avatar && <div className=\"flex-shrink-0\">{avatar}</div>}\n <div className=\"min-w-0 flex-1\">\n {title && <div className=\"text-sm font-semibold text-foreground leading-snug\">{title}</div>}\n {subtitle && <div className=\"text-xs text-foreground-muted leading-snug mt-0.5\">{subtitle}</div>}\n {children}\n </div>\n {action && <div className=\"flex-shrink-0 -mt-1 -mr-1\">{action}</div>}\n </div>\n )\n}\n\n// ── Body ────────────────────────────────────────────────────────────────────────\n\nexport interface CardBodyProps {\n children: React.ReactNode\n className?: string\n}\nfunction CardBody({ children, className = '' }: CardBodyProps) {\n return <div className={['px-5 py-4 text-sm text-foreground-secondary leading-relaxed', className].filter(Boolean).join(' ')}>{children}</div>\n}\n\n// ── Footer ──────────────────────────────────────────────────────────────────────\n\nexport interface CardFooterProps {\n children: React.ReactNode\n /** Drop the top divider. */\n noDivider?: boolean\n className?: string\n}\nfunction CardFooter({ children, noDivider, className = '' }: CardFooterProps) {\n return (\n <div className={['flex items-center gap-2 px-5 py-3', noDivider ? '' : 'border-t border-border', className].filter(Boolean).join(' ')}>\n {children}\n </div>\n )\n}\n\n// ── Compound export ─────────────────────────────────────────────────────────────\n\nCard.Media = CardMedia\nCard.Header = CardHeader\nCard.Body = CardBody\nCard.Footer = CardFooter\n\nexport default Card\n","import React, { useCallback, useEffect, useRef, useState } from 'react'\n\nexport interface CardCarouselProps {\n /** The slides — typically `Card`s. Each becomes a snap target. */\n children: React.ReactNode\n /** Width of each slide. Number → px. Default `280`. */\n itemWidth?: number | string\n /** Gap between slides in px. Default `16`. */\n gap?: number\n /** Show prev / next arrow buttons. Default `true`. */\n showArrows?: boolean\n /** Show position dots. Default `false`. */\n showDots?: boolean\n /** Accessible label for the region. Default `'Carousel'`. */\n 'aria-label'?: string\n className?: string\n style?: React.CSSProperties\n}\n\nconst Arrow = ({ dir }: { dir: 'left' | 'right' }) => (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} aria-hidden=\"true\" className=\"h-5 w-5\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d={dir === 'left' ? 'M15 19l-7-7 7-7' : 'M9 5l7 7-7 7'} />\n </svg>\n)\n\n/**\n * A horizontal, scroll-snap carousel for cards. Native scrolling drives it\n * (trackpad / touch / wheel), with optional arrow buttons and position dots.\n * Arrows disable at the ends; the scrollbar is hidden but scrolling is intact.\n *\n * @example\n * ```tsx\n * <CardCarousel itemWidth={300} showDots>\n * {vessels.map((v) => <Card key={v.id}>…</Card>)}\n * </CardCarousel>\n * ```\n */\nexport default function CardCarousel({\n children,\n itemWidth = 280,\n gap = 16,\n showArrows = true,\n showDots = false,\n 'aria-label': ariaLabel = 'Carousel',\n className = '',\n style,\n}: CardCarouselProps) {\n const scrollerRef = useRef<HTMLDivElement>(null)\n const slides = React.Children.toArray(children)\n const [active, setActive] = useState(0)\n const [atStart, setAtStart] = useState(true)\n const [atEnd, setAtEnd] = useState(false)\n const width = typeof itemWidth === 'number' ? `${itemWidth}px` : itemWidth\n\n const update = useCallback(() => {\n const el = scrollerRef.current\n if (!el) return\n const step = el.clientWidth // fall back; recomputed below per-slide\n void step\n setAtStart(el.scrollLeft <= 1)\n setAtEnd(el.scrollLeft + el.clientWidth >= el.scrollWidth - 1)\n // Active index = nearest slide to the current scroll offset.\n const first = el.firstElementChild as HTMLElement | null\n const slideW = first ? first.getBoundingClientRect().width + gap : el.clientWidth\n setActive(Math.round(el.scrollLeft / slideW))\n }, [gap])\n\n useEffect(() => {\n update()\n const el = scrollerRef.current\n if (!el) return\n el.addEventListener('scroll', update, { passive: true })\n window.addEventListener('resize', update)\n return () => {\n el.removeEventListener('scroll', update)\n window.removeEventListener('resize', update)\n }\n }, [update])\n\n const scrollByDir = (dir: -1 | 1) => {\n const el = scrollerRef.current\n if (!el) return\n const first = el.firstElementChild as HTMLElement | null\n const slideW = first ? first.getBoundingClientRect().width + gap : el.clientWidth\n el.scrollBy({ left: dir * slideW, behavior: 'smooth' })\n }\n\n const scrollTo = (i: number) => {\n const el = scrollerRef.current\n if (!el) return\n const first = el.firstElementChild as HTMLElement | null\n const slideW = first ? first.getBoundingClientRect().width + gap : el.clientWidth\n el.scrollTo({ left: i * slideW, behavior: 'smooth' })\n }\n\n const arrowBtn =\n 'absolute top-1/2 -translate-y-1/2 z-10 flex h-9 w-9 items-center justify-center rounded-full ' +\n 'border border-border bg-surface text-foreground-secondary shadow-md transition ' +\n 'hover:text-foreground hover:bg-surface-raised disabled:opacity-0 disabled:pointer-events-none ' +\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-accent'\n\n return (\n <section aria-label={ariaLabel} className={['relative', className].filter(Boolean).join(' ')} style={style}>\n {showArrows && (\n <button type=\"button\" aria-label=\"Previous\" onClick={() => scrollByDir(-1)} disabled={atStart} className={`${arrowBtn} left-1`}>\n <Arrow dir=\"left\" />\n </button>\n )}\n\n <div\n ref={scrollerRef}\n className=\"flex overflow-x-auto snap-x snap-mandatory hidden-scrollbar scroll-smooth\"\n style={{ gap }}\n >\n {slides.map((slide, i) => (\n <div key={i} className=\"snap-start flex-shrink-0\" style={{ width }}>\n {slide}\n </div>\n ))}\n </div>\n\n {showArrows && (\n <button type=\"button\" aria-label=\"Next\" onClick={() => scrollByDir(1)} disabled={atEnd} className={`${arrowBtn} right-1`}>\n <Arrow dir=\"right\" />\n </button>\n )}\n\n {showDots && slides.length > 1 && (\n <div className=\"mt-3 flex items-center justify-center gap-1.5\">\n {slides.map((_, i) => (\n <button\n key={i}\n type=\"button\"\n aria-label={`Go to slide ${i + 1}`}\n aria-current={i === active}\n onClick={() => scrollTo(i)}\n className={[\n 'h-1.5 rounded-full transition-all duration-200 focus:outline-none focus-visible:ring-2 focus-visible:ring-accent',\n i === active ? 'w-5 bg-accent' : 'w-1.5 bg-border hover:bg-foreground-muted',\n ].join(' ')}\n />\n ))}\n </div>\n )}\n </section>\n )\n}\n","import React from 'react'\n\nexport type StatisticSize = 'sm' | 'md' | 'lg'\nexport type DeltaDirection = 'up' | 'down' | 'neutral'\n\nexport interface StatisticDelta {\n /** The change to show beside the arrow, e.g. `'12%'` or `+340`. */\n value: React.ReactNode\n /** Arrow + colour direction. Default inferred `'neutral'`. */\n direction?: DeltaDirection\n /**\n * Whether an `up` direction is a good thing (green) or bad (red). For\n * metrics like churn or latency, set `false` so a rise reads red.\n * Default `true`.\n */\n positiveIsGood?: boolean\n /** Optional trailing context, e.g. `'vs last month'`. */\n label?: React.ReactNode\n}\n\nexport interface StatisticProps {\n /** Caption above the value. */\n label: React.ReactNode\n /** The metric itself. */\n value: React.ReactNode\n /** Rendered before the value (currency symbol, etc.). */\n prefix?: React.ReactNode\n /** Rendered after the value (unit, %). */\n suffix?: React.ReactNode\n /** Leading icon in a tinted square. */\n icon?: React.ReactNode\n /** Trend indicator under the value. */\n delta?: StatisticDelta\n /** Secondary help text under everything. */\n helpText?: React.ReactNode\n /** Size preset. Default `'md'`. */\n size?: StatisticSize\n /** Text alignment. Default `'left'`. */\n align?: 'left' | 'center'\n className?: string\n style?: React.CSSProperties\n}\n\nconst VALUE_SIZE: Record<StatisticSize, string> = {\n sm: 'text-xl',\n md: 'text-3xl',\n lg: 'text-4xl',\n}\n\nconst TONE: Record<'good' | 'bad' | 'neutral', string> = {\n good: 'text-status-success',\n bad: 'text-status-error',\n neutral: 'text-foreground-muted',\n}\n\nconst ArrowUp = (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2.2} aria-hidden=\"true\" className=\"h-3.5 w-3.5\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 19V5M5 12l7-7 7 7\" />\n </svg>\n)\nconst ArrowDown = (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2.2} aria-hidden=\"true\" className=\"h-3.5 w-3.5\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 5v14M5 12l7 7 7-7\" />\n </svg>\n)\n\n/**\n * A single metric: caption, value (with optional prefix/suffix and icon), and an\n * optional trend delta whose colour follows direction — flipped for metrics\n * where a rise is bad via `positiveIsGood: false`.\n *\n * @example\n * <Statistic label=\"Revenue\" value=\"48,210\" prefix=\"$\" delta={{ value: '12%', direction: 'up', label: 'vs last month' }} />\n * <Statistic label=\"Churn\" value=\"3.1\" suffix=\"%\" delta={{ value: '0.4pt', direction: 'up', positiveIsGood: false }} />\n */\nexport default function Statistic({\n label,\n value,\n prefix,\n suffix,\n icon,\n delta,\n helpText,\n size = 'md',\n align = 'left',\n className = '',\n style,\n}: StatisticProps) {\n const dir = delta?.direction ?? 'neutral'\n const positiveIsGood = delta?.positiveIsGood ?? true\n const deltaTone: 'good' | 'bad' | 'neutral' =\n dir === 'neutral' ? 'neutral' : (dir === 'up') === positiveIsGood ? 'good' : 'bad'\n\n return (\n <div\n className={['flex gap-3', align === 'center' ? 'flex-col items-center text-center' : 'items-start', className].filter(Boolean).join(' ')}\n style={style}\n >\n {icon && align === 'left' && (\n <span className=\"flex h-10 w-10 flex-shrink-0 items-center justify-center rounded-lg bg-accent/10 text-accent\">\n <span className=\"h-5 w-5 inline-flex items-center justify-center\">{icon}</span>\n </span>\n )}\n <div className=\"min-w-0\">\n <div className=\"text-xs font-medium uppercase tracking-wide text-foreground-muted\">{label}</div>\n <div className={`mt-1 flex items-baseline gap-0.5 font-semibold text-foreground tabular-nums ${VALUE_SIZE[size]} ${align === 'center' ? 'justify-center' : ''}`}>\n {prefix && <span className=\"text-foreground-muted text-[0.6em] font-medium self-center\">{prefix}</span>}\n <span className=\"leading-none\">{value}</span>\n {suffix && <span className=\"text-foreground-muted text-[0.5em] font-medium self-center\">{suffix}</span>}\n </div>\n {delta && (\n <div className={`mt-1.5 flex items-center gap-1 text-sm font-medium ${align === 'center' ? 'justify-center' : ''} ${TONE[deltaTone]}`}>\n {dir === 'up' ? ArrowUp : dir === 'down' ? ArrowDown : null}\n <span>{delta.value}</span>\n {delta.label && <span className=\"text-foreground-muted font-normal\">{delta.label}</span>}\n </div>\n )}\n {helpText && <div className=\"mt-1 text-xs text-foreground-muted\">{helpText}</div>}\n </div>\n </div>\n )\n}\n","import React, { useState } from 'react'\nimport { AnimatePresence, motion, useReducedMotion } from 'framer-motion'\n\nexport type FABPosition = 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left'\nexport type FABSize = 'md' | 'lg'\nexport type FABTone = 'accent' | 'neutral'\n\nexport interface FABAction {\n icon: React.ReactNode\n /** Accessible label + the text shown on the action's pill. */\n label: string\n onClick?: React.MouseEventHandler\n}\n\nexport interface FABProps {\n /** Main button icon. */\n icon: React.ReactNode\n /** Accessible label for the main button (required — it's icon-only). */\n label: string\n /** Click handler. Ignored when `actions` is provided (the button toggles the dial). */\n onClick?: React.MouseEventHandler\n /** Speed-dial sub-actions. When set, the main button opens/closes the dial. */\n actions?: FABAction[]\n /** Corner placement. Default `'bottom-right'`. */\n position?: FABPosition\n /** Size preset. Default `'lg'`. */\n size?: FABSize\n /** Colour. Default `'accent'`. */\n tone?: FABTone\n /**\n * `position: fixed` to the viewport (default) or `absolute` to the nearest\n * positioned ancestor — set `false` to anchor inside a `relative` container.\n */\n fixed?: boolean\n className?: string\n style?: React.CSSProperties\n}\n\nconst POS: Record<FABPosition, string> = {\n 'bottom-right': 'bottom-6 right-6 items-end',\n 'bottom-left': 'bottom-6 left-6 items-start',\n 'top-right': 'top-6 right-6 items-end',\n 'top-left': 'top-6 left-6 items-start',\n}\n\nconst SIZE: Record<FABSize, string> = {\n md: 'h-12 w-12',\n lg: 'h-14 w-14',\n}\n\nconst TONE: Record<FABTone, string> = {\n accent: 'bg-accent text-accent-fg hover:bg-accent-hover',\n neutral: 'bg-foreground-secondary text-background hover:opacity-90',\n}\n\n/**\n * A floating action button. On its own it's a single round action; given\n * `actions`, it becomes a speed dial that expands a labelled stack on click.\n * Positions to a viewport corner by default (or a relative container with\n * `fixed={false}`).\n *\n * @example Single\n * <FAB icon={<PlusIcon />} label=\"New record\" onClick={create} />\n *\n * @example Speed dial\n * <FAB icon={<PlusIcon />} label=\"Create\" actions={[\n * { icon: <FileIcon />, label: 'Document', onClick: newDoc },\n * { icon: <FolderIcon />, label: 'Folder', onClick: newFolder },\n * ]} />\n */\nexport default function FAB({\n icon,\n label,\n onClick,\n actions,\n position = 'bottom-right',\n size = 'lg',\n tone = 'accent',\n fixed = true,\n className = '',\n style,\n}: FABProps) {\n const [open, setOpen] = useState(false)\n const reduced = useReducedMotion()\n const hasDial = !!actions && actions.length > 0\n const bottom = position.startsWith('bottom')\n const alignRight = position.endsWith('right')\n\n const dial = hasDial && (\n <AnimatePresence>\n {open && (\n <motion.ul\n className={`flex flex-col gap-3 ${bottom ? 'mb-3' : 'mt-3 order-last'} ${alignRight ? 'items-end' : 'items-start'}`}\n initial=\"hidden\"\n animate=\"show\"\n exit=\"hidden\"\n variants={{ show: { transition: { staggerChildren: reduced ? 0 : 0.04, staggerDirection: bottom ? -1 : 1 } } }}\n >\n {actions!.map((a, i) => (\n <motion.li\n key={i}\n className={`flex items-center gap-2 ${alignRight ? 'flex-row' : 'flex-row-reverse'}`}\n variants={{\n hidden: { opacity: 0, y: reduced ? 0 : bottom ? 8 : -8, scale: reduced ? 1 : 0.9 },\n show: { opacity: 1, y: 0, scale: 1 },\n }}\n >\n <span className=\"rounded-md bg-surface px-2 py-1 text-xs font-medium text-foreground shadow-md border border-border whitespace-nowrap\">\n {a.label}\n </span>\n <button\n type=\"button\"\n aria-label={a.label}\n onClick={(e) => { a.onClick?.(e); setOpen(false) }}\n className=\"flex h-11 w-11 items-center justify-center rounded-full bg-surface text-foreground-secondary shadow-lg border border-border transition hover:text-foreground hover:bg-surface-raised focus:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n >\n <span className=\"h-5 w-5 inline-flex items-center justify-center\">{a.icon}</span>\n </button>\n </motion.li>\n ))}\n </motion.ul>\n )}\n </AnimatePresence>\n )\n\n return (\n <div\n className={[fixed ? 'fixed' : 'absolute', 'z-40 flex flex-col', POS[position], className].filter(Boolean).join(' ')}\n style={style}\n >\n {bottom && dial}\n <button\n type=\"button\"\n aria-label={label}\n aria-expanded={hasDial ? open : undefined}\n onClick={(e) => (hasDial ? setOpen((o) => !o) : onClick?.(e))}\n className={[\n 'flex items-center justify-center rounded-full shadow-lg transition-[background-color,transform] duration-200',\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2',\n SIZE[size],\n TONE[tone],\n hasDial && open ? 'rotate-45' : '',\n ].filter(Boolean).join(' ')}\n >\n <span className=\"h-6 w-6 inline-flex items-center justify-center\">{icon}</span>\n </button>\n {!bottom && dial}\n </div>\n )\n}\n","import React, { useState } from 'react'\nimport * as Popover from '@radix-ui/react-popover'\nimport Button from '../inputs/Button'\n\nexport type PopConfirmTone = 'default' | 'danger'\n\nexport interface PopConfirmProps {\n /** The trigger element. Cloned as the popover anchor (rendered `asChild`). */\n children: React.ReactElement\n /** The confirmation question / heading. */\n title: React.ReactNode\n /** Optional secondary line under the title. */\n description?: React.ReactNode\n /** Runs on confirm. If it returns a promise, the confirm button shows a loading state until it settles. */\n onConfirm?: () => void | Promise<void>\n /** Runs on cancel / dismiss. */\n onCancel?: () => void\n /** Confirm button label. Default `'Confirm'`. */\n confirmText?: React.ReactNode\n /** Cancel button label. Default `'Cancel'`. */\n cancelText?: React.ReactNode\n /** `'danger'` colours the confirm button red. Default `'default'`. */\n tone?: PopConfirmTone\n /** Leading icon shown beside the title. */\n icon?: React.ReactNode\n /** Side of the trigger to open on. Default `'top'`. */\n side?: 'top' | 'right' | 'bottom' | 'left'\n /** Controlled open state (optional). */\n open?: boolean\n onOpenChange?: (open: boolean) => void\n className?: string\n}\n\n/**\n * A lightweight confirm prompt anchored to its trigger, on Radix Popover. Use it\n * for in-place \"are you sure?\" gates (delete, archive) instead of a full Modal.\n * An async `onConfirm` keeps the confirm button in a loading state until it\n * resolves, then closes.\n *\n * @example\n * ```tsx\n * <PopConfirm title=\"Delete this vessel?\" tone=\"danger\" confirmText=\"Delete\" onConfirm={remove}>\n * <Button content=\"Delete\" variant=\"danger\" />\n * </PopConfirm>\n * ```\n */\nexport default function PopConfirm({\n children,\n title,\n description,\n onConfirm,\n onCancel,\n confirmText = 'Confirm',\n cancelText = 'Cancel',\n tone = 'default',\n icon,\n side = 'top',\n open,\n onOpenChange,\n className = '',\n}: PopConfirmProps) {\n const [uncontrolledOpen, setUncontrolledOpen] = useState(false)\n const [loading, setLoading] = useState(false)\n const isOpen = open ?? uncontrolledOpen\n\n const setOpen = (next: boolean) => {\n onOpenChange?.(next)\n if (open === undefined) setUncontrolledOpen(next)\n }\n\n const handleConfirm = async () => {\n try {\n setLoading(true)\n await onConfirm?.()\n setOpen(false)\n } finally {\n setLoading(false)\n }\n }\n\n const handleCancel = () => {\n onCancel?.()\n setOpen(false)\n }\n\n return (\n <Popover.Root open={isOpen} onOpenChange={(o) => (o ? setOpen(true) : handleCancel())}>\n <Popover.Trigger asChild>{children}</Popover.Trigger>\n <Popover.Portal>\n <Popover.Content\n side={side}\n sideOffset={8}\n collisionPadding={12}\n className={[\n 'z-[400] w-64 rounded-lg border border-border bg-surface p-3.5 shadow-lg',\n 'data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95',\n 'data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95',\n className,\n ].filter(Boolean).join(' ')}\n >\n <div className=\"flex gap-2.5\">\n {icon && (\n <span className={`mt-0.5 flex h-5 w-5 flex-shrink-0 items-center justify-center ${tone === 'danger' ? 'text-status-error' : 'text-status-warning'}`}>\n {icon}\n </span>\n )}\n <div className=\"min-w-0\">\n <div className=\"text-sm font-medium text-foreground\">{title}</div>\n {description && <div className=\"mt-1 text-xs text-foreground-secondary leading-snug\">{description}</div>}\n </div>\n </div>\n <div className=\"mt-3 flex justify-end gap-2\">\n <Button content={cancelText} size=\"sm\" variant=\"ghost\" onClick={handleCancel} />\n <Button\n content={confirmText}\n size=\"sm\"\n variant={tone === 'danger' ? 'danger' : 'primary'}\n loading={loading}\n onClick={handleConfirm}\n />\n </div>\n <Popover.Arrow className=\"fill-surface\" />\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n )\n}\n","import React, { useMemo, useState } from 'react'\n\nexport interface CalendarEvent {\n /** The day this event lands on (time ignored). */\n date: Date\n /** Optional dot colour (any CSS colour). Defaults to the accent token. */\n color?: string\n /** Optional label (used as the dot's title tooltip). */\n label?: string\n}\n\nexport interface CalendarProps {\n /** Selected day. */\n value?: Date | null\n /** Fires with the clicked day. */\n onChange?: (date: Date) => void\n /** Controlled visible month (any day within it). */\n month?: Date\n /** Uncontrolled initial visible month. */\n defaultMonth?: Date\n /** Fires when the user pages months. */\n onMonthChange?: (month: Date) => void\n /** Event markers — rendered as up to three dots beneath the day. */\n events?: CalendarEvent[]\n /** Earliest / latest selectable day. */\n min?: Date\n max?: Date\n /** First column: 0 Sunday (default), 1 Monday. */\n weekStartsOn?: 0 | 1\n className?: string\n style?: React.CSSProperties\n}\n\nconst WEEKDAYS = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']\nconst MONTHS = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']\n\nconst startOfDay = (d: Date) => new Date(d.getFullYear(), d.getMonth(), d.getDate())\nconst sameDay = (a: Date, b: Date) => a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate()\nconst addMonths = (d: Date, n: number) => new Date(d.getFullYear(), d.getMonth() + n, 1)\n\nfunction buildGrid(month: Date, weekStartsOn: 0 | 1): Date[] {\n const first = new Date(month.getFullYear(), month.getMonth(), 1)\n const offset = (first.getDay() - weekStartsOn + 7) % 7\n const start = new Date(first)\n start.setDate(first.getDate() - offset)\n return Array.from({ length: 42 }, (_, i) => {\n const d = new Date(start)\n d.setDate(start.getDate() + i)\n return d\n })\n}\n\nconst NavIcon = ({ dir }: { dir: 'left' | 'right' }) => (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} aria-hidden=\"true\" className=\"h-4 w-4\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d={dir === 'left' ? 'M15 19l-7-7 7-7' : 'M9 5l7 7-7 7'} />\n </svg>\n)\n\n/**\n * A month-grid calendar — dependency-free date math, optional event dots, and\n * `min`/`max` bounds. Display + single-day selection; pair with your own state\n * for the value. For a popover date *field*, use **Temporal** (DatePicker).\n *\n * @example\n * ```tsx\n * const [day, setDay] = useState<Date | null>(null)\n * <Calendar value={day} onChange={setDay} events={[{ date: new Date(), label: 'Today' }]} />\n * ```\n */\nexport default function Calendar({\n value,\n onChange,\n month,\n defaultMonth,\n onMonthChange,\n events,\n min,\n max,\n weekStartsOn = 0,\n className = '',\n style,\n}: CalendarProps) {\n const today = useMemo(() => startOfDay(new Date()), [])\n const [internalMonth, setInternalMonth] = useState<Date>(() => month ?? defaultMonth ?? value ?? today)\n const visible = month ?? internalMonth\n\n const setMonth = (next: Date) => {\n onMonthChange?.(next)\n if (month === undefined) setInternalMonth(next)\n }\n\n const grid = useMemo(() => buildGrid(visible, weekStartsOn), [visible, weekStartsOn])\n const weekdays = useMemo(() => Array.from({ length: 7 }, (_, i) => WEEKDAYS[(i + weekStartsOn) % 7]), [weekStartsOn])\n\n const eventsByDay = useMemo(() => {\n const map = new Map<string, CalendarEvent[]>()\n for (const ev of events ?? []) {\n const key = startOfDay(ev.date).toDateString()\n const arr = map.get(key) ?? []\n arr.push(ev)\n map.set(key, arr)\n }\n return map\n }, [events])\n\n const disabled = (d: Date) => (min && d < startOfDay(min)) || (max && d > startOfDay(max))\n\n return (\n <div className={['inline-block rounded-lg border border-border bg-surface p-3 select-none', className].filter(Boolean).join(' ')} style={style}>\n {/* Header */}\n <div className=\"mb-2 flex items-center justify-between px-1\">\n <button\n type=\"button\"\n aria-label=\"Previous month\"\n onClick={() => setMonth(addMonths(visible, -1))}\n className=\"flex h-7 w-7 items-center justify-center rounded-md text-foreground-secondary hover:bg-surface-raised hover:text-foreground focus:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n >\n <NavIcon dir=\"left\" />\n </button>\n <div className=\"text-sm font-semibold text-foreground\" aria-live=\"polite\">\n {MONTHS[visible.getMonth()]} {visible.getFullYear()}\n </div>\n <button\n type=\"button\"\n aria-label=\"Next month\"\n onClick={() => setMonth(addMonths(visible, 1))}\n className=\"flex h-7 w-7 items-center justify-center rounded-md text-foreground-secondary hover:bg-surface-raised hover:text-foreground focus:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n >\n <NavIcon dir=\"right\" />\n </button>\n </div>\n\n {/* Weekday row */}\n <div className=\"grid grid-cols-7 mb-1\">\n {weekdays.map((w) => (\n <div key={w} className=\"text-center text-[11px] font-medium uppercase tracking-wide text-foreground-muted py-1\">\n {w}\n </div>\n ))}\n </div>\n\n {/* Day grid */}\n <div className=\"grid grid-cols-7 gap-0.5\" role=\"grid\">\n {grid.map((d, i) => {\n const inMonth = d.getMonth() === visible.getMonth()\n const isSelected = value != null && sameDay(d, value)\n const isToday = sameDay(d, today)\n const isDisabled = disabled(d)\n const dayEvents = eventsByDay.get(d.toDateString()) ?? []\n return (\n <button\n key={i}\n type=\"button\"\n role=\"gridcell\"\n aria-selected={isSelected}\n aria-current={isToday ? 'date' : undefined}\n disabled={isDisabled}\n onClick={() => onChange?.(startOfDay(d))}\n className={[\n 'relative flex h-9 w-9 flex-col items-center justify-center rounded-md text-sm transition-colors',\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-accent',\n isSelected\n ? 'bg-accent text-accent-fg font-semibold'\n : inMonth\n ? 'text-foreground hover:bg-surface-raised'\n : 'text-foreground-muted hover:bg-surface-raised',\n isDisabled ? 'opacity-40 cursor-not-allowed hover:bg-transparent' : '',\n !isSelected && isToday ? 'ring-1 ring-inset ring-accent/60' : '',\n ].filter(Boolean).join(' ')}\n >\n <span className=\"leading-none\">{d.getDate()}</span>\n {dayEvents.length > 0 && (\n <span className=\"absolute bottom-1 flex gap-0.5\">\n {dayEvents.slice(0, 3).map((ev, j) => (\n <span\n key={j}\n title={ev.label}\n className=\"h-1 w-1 rounded-full\"\n style={{ backgroundColor: ev.color ?? (isSelected ? 'var(--color-accent-fg)' : 'var(--color-accent)') }}\n />\n ))}\n </span>\n )}\n </button>\n )\n })}\n </div>\n </div>\n )\n}\n","import React from 'react'\n\nexport interface CartLineItem {\n id: string | number\n /** Product name. */\n name: React.ReactNode\n /** Unit price. */\n price: number\n /** Quantity in the cart. */\n quantity: number\n /** Optional thumbnail URL. */\n image?: string\n /** Optional secondary line (variant, SKU). */\n meta?: React.ReactNode\n /** Per-line quantity ceiling. */\n max?: number\n}\n\nexport interface CartSummaryRow {\n label: React.ReactNode\n /** Signed amount — negative for discounts. */\n value: number\n /** Render in muted/normal style instead of emphasised. */\n muted?: boolean\n}\n\nexport interface CartProps {\n /** Line items. */\n items: CartLineItem[]\n /** Fires when a line's stepper changes (clamped to 1..max). */\n onQuantityChange?: (id: CartLineItem['id'], quantity: number) => void\n /** Fires when a line's remove button is pressed. */\n onRemove?: (id: CartLineItem['id']) => void\n /** Extra summary rows (shipping, tax, discount) added to the subtotal for the total. */\n summaryRows?: CartSummaryRow[]\n /** Price formatter. Default `'$' + value.toFixed(2)`. */\n formatPrice?: (value: number) => string\n /** Checkout button label. Default `'Checkout'`. */\n checkoutLabel?: React.ReactNode\n /** Checkout handler. Omit to hide the button. */\n onCheckout?: () => void\n /** Shown when there are no items. */\n emptyState?: React.ReactNode\n className?: string\n style?: React.CSSProperties\n}\n\nconst defaultFormat = (v: number) => `${v < 0 ? '-' : ''}$${Math.abs(v).toFixed(2)}`\n\nconst Stepper = ({\n quantity,\n max,\n onChange,\n}: {\n quantity: number\n max?: number\n onChange?: (q: number) => void\n}) => {\n const btn = 'flex h-7 w-7 items-center justify-center text-foreground-secondary hover:bg-surface-raised disabled:opacity-40 disabled:hover:bg-transparent focus:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-inset transition-colors'\n return (\n <div className=\"inline-flex items-center rounded-md border border-border overflow-hidden\">\n <button type=\"button\" aria-label=\"Decrease quantity\" disabled={quantity <= 1} onClick={() => onChange?.(quantity - 1)} className={btn}>\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} className=\"h-3.5 w-3.5\"><path strokeLinecap=\"round\" d=\"M5 12h14\" /></svg>\n </button>\n <span className=\"w-8 text-center text-sm tabular-nums text-foreground select-none\">{quantity}</span>\n <button type=\"button\" aria-label=\"Increase quantity\" disabled={max != null && quantity >= max} onClick={() => onChange?.(quantity + 1)} className={btn}>\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} className=\"h-3.5 w-3.5\"><path strokeLinecap=\"round\" d=\"M12 5v14M5 12h14\" /></svg>\n </button>\n </div>\n )\n}\n\n/**\n * A shopping-cart panel: line items with thumbnail, quantity stepper, and\n * remove, plus a summary that totals the subtotal with any extra rows\n * (shipping, tax, discount) and an optional checkout button.\n *\n * Stateless and controlled — you own the items array and react to\n * `onQuantityChange` / `onRemove`.\n *\n * @example\n * ```tsx\n * <Cart\n * items={items}\n * onQuantityChange={(id, q) => setQty(id, q)}\n * onRemove={removeItem}\n * summaryRows={[{ label: 'Shipping', value: 9.5 }]}\n * onCheckout={checkout}\n * />\n * ```\n */\nexport default function Cart({\n items,\n onQuantityChange,\n onRemove,\n summaryRows = [],\n formatPrice = defaultFormat,\n checkoutLabel = 'Checkout',\n onCheckout,\n emptyState,\n className = '',\n style,\n}: CartProps) {\n const subtotal = items.reduce((sum, it) => sum + it.price * it.quantity, 0)\n const total = subtotal + summaryRows.reduce((sum, r) => sum + r.value, 0)\n\n return (\n <div className={['flex flex-col rounded-xl border border-border bg-surface', className].filter(Boolean).join(' ')} style={style}>\n {items.length === 0 ? (\n <div className=\"p-8 text-center text-sm text-foreground-muted\">\n {emptyState ?? 'Your cart is empty.'}\n </div>\n ) : (\n <ul className=\"divide-y divide-border\">\n {items.map((it) => (\n <li key={it.id} className=\"flex items-center gap-3 p-3\">\n <div className=\"h-14 w-14 flex-shrink-0 overflow-hidden rounded-md bg-surface-raised\">\n {it.image && <img src={it.image} alt=\"\" className=\"h-full w-full object-cover\" />}\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-sm font-medium text-foreground\">{it.name}</div>\n {it.meta && <div className=\"truncate text-xs text-foreground-muted mt-0.5\">{it.meta}</div>}\n <div className=\"mt-1.5 flex items-center gap-3\">\n <Stepper quantity={it.quantity} max={it.max} onChange={(q) => onQuantityChange?.(it.id, Math.max(1, q))} />\n {onRemove && (\n <button\n type=\"button\"\n onClick={() => onRemove(it.id)}\n className=\"text-xs text-foreground-muted hover:text-status-error transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-accent rounded px-1\"\n >\n Remove\n </button>\n )}\n </div>\n </div>\n <div className=\"flex-shrink-0 text-sm font-semibold text-foreground tabular-nums\">\n {formatPrice(it.price * it.quantity)}\n </div>\n </li>\n ))}\n </ul>\n )}\n\n {items.length > 0 && (\n <div className=\"border-t border-border p-4\">\n <dl className=\"space-y-1.5\">\n <div className=\"flex items-center justify-between text-sm\">\n <dt className=\"text-foreground-secondary\">Subtotal</dt>\n <dd className=\"tabular-nums text-foreground\">{formatPrice(subtotal)}</dd>\n </div>\n {summaryRows.map((r, i) => (\n <div key={i} className=\"flex items-center justify-between text-sm\">\n <dt className={r.muted ? 'text-foreground-muted' : 'text-foreground-secondary'}>{r.label}</dt>\n <dd className={`tabular-nums ${r.value < 0 ? 'text-status-success' : 'text-foreground'}`}>{formatPrice(r.value)}</dd>\n </div>\n ))}\n <div className=\"flex items-center justify-between border-t border-border pt-2 mt-1 text-base font-semibold\">\n <dt className=\"text-foreground\">Total</dt>\n <dd className=\"tabular-nums text-foreground\">{formatPrice(total)}</dd>\n </div>\n </dl>\n\n {onCheckout && (\n <button\n type=\"button\"\n onClick={onCheckout}\n className=\"mt-4 w-full rounded-lg bg-accent px-4 py-2.5 text-sm font-semibold text-accent-fg transition-colors hover:bg-accent-hover focus:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2\"\n >\n {checkoutLabel}\n </button>\n )}\n </div>\n )}\n </div>\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 /** Extra classes merged onto the spinner root. */\n className?: string\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 className = '',\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 ${className}`.trim()}\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 ${className}`.trim()}\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 /** Extra classes merged onto the list root. */\n className?: string\n /** Inline style on the list root. */\n style?: React.CSSProperties\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 className = '',\n style,\n}: ListProps) {\n return (\n <div role=\"listbox\" className={`flex flex-col ${className}`.trim()} style={style}>\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 /** Width when expanded. Default `'100%'` (fills parent). */\n expandedWidth?: React.CSSProperties['width']\n /** Height when expanded. Default `'100%'`. Set a concrete value (e.g. 420)\n * when the container lives in normal flow and should push siblings down. */\n expandedHeight?: React.CSSProperties['height']\n /** Controlled expanded state. */\n expanded?: boolean\n /** Fires when the user toggles. */\n onExpandedChange?: (expanded: boolean) => void\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 /** Extra classes merged onto the container root. */\n className?: string\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 expandedWidth = '100%',\n expandedHeight = '100%',\n expanded,\n onExpandedChange,\n children,\n assignClassOnClick,\n expandIcon,\n collapseIcon,\n togglePosition = 'top-right',\n className = '',\n}: ScalableContainerProps) {\n const containerRef = useRef<HTMLDivElement>(null)\n const [internalScaled, setInternalScaled] = useState(false)\n const isScaled = expanded ?? internalScaled\n const reduced = useReducedMotion()\n\n const onToggle = () => {\n const next = !isScaled\n if (expanded === undefined) setInternalScaled(next)\n onExpandedChange?.(next)\n // After the expand transition settles, scroll the container into view\n // so the newly-grown content is fully visible (only when growing).\n if (next) {\n window.setTimeout(\n () => containerRef.current?.scrollIntoView({ behavior: 'smooth', block: 'nearest' }),\n reduced ? 0 : 340,\n )\n }\n }\n\n const wrapperClass = isScaled ? assignClassOnClick : undefined\n\n return (\n <motion.div\n ref={containerRef}\n animate={{\n width: isScaled ? expandedWidth : width,\n height: isScaled ? expandedHeight : 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 }\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 className,\n ].filter(Boolean).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 /** Extra classes merged onto the card root. */\n className?: string\n /** Inline style on the card root. */\n style?: React.CSSProperties\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, className = '', style }: 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 ${className}`.trim()} style={style}>\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 /** Extra classes merged onto the card root. */\n className?: string\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 className = '',\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 } ${className}`.trim()}\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 /** Extra classes merged onto the grid root. */\n className?: string\n}\n\n/**\n * Wrapping flex grid of `GridCard` tiles.\n */\nexport default function CatalogGrid({ items, buttonText, onOpen, className = '' }: CatalogGridProps) {\n return (\n <div className={`flex flex-wrap gap-2 ${className}`.trim()}>\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 /** Extra classes merged onto the carousel root. */\n className?: string\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, className = '' }: 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 ${className}`.trim()}>\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 /** Extra classes merged onto the catalog root. */\n className?: string\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, className = '' }: CatalogProps) {\n return (\n <div className={`w-full h-full ${className}`.trim()}>\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 /** Extra classes merged onto the menu content panel. */\n className?: string\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, className = '' }: 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} ${className}`.trim()}\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'\nimport Tooltip from '../core/Tooltip'\n\n/**\n * Shared field foundation for all oxygen-ui inputs.\n *\n * Centralises the things every input must agree on:\n * - the **size scale** (sm / md / lg) → control height + text size + padding\n * - the **refined focus treatment** — a crisp 1px accent border plus a soft\n * 3px low-opacity halo (NOT a heavy solid ring band)\n * - the **resting / hover / error / disabled** border + background states\n * - a **`<Field>` wrapper** handling label, error region, layout\n * (horizontal / vertical) and `aria` linkage consistently\n *\n * All values map to design-system tokens (control heights, semantic colours,\n * radii) so a consumer's ThemeProvider override flows straight through.\n */\n\nexport type FieldSize = 'sm' | 'md' | 'lg'\n\ninterface SizeSpec {\n /** Control height utility (token-backed). */\n control: string\n /** Text size for the value. */\n text: string\n /** Horizontal padding. */\n padX: string\n /** Gap between adornments inside the control. */\n gap: string\n}\n\nexport const FIELD_SIZE: Record<FieldSize, SizeSpec> = {\n sm: { control: 'h-control-sm', text: 'text-xs', padX: 'px-2.5', gap: 'gap-1.5' },\n md: { control: 'h-control-md', text: 'text-sm', padX: 'px-3', gap: 'gap-2' },\n lg: { control: 'h-control-lg', text: 'text-sm', padX: 'px-3.5', gap: 'gap-2.5' },\n}\n\n// ── Focus + state literals ───────────────────────────────────────────────────\n// These MUST be written as full literal strings so Tailwind's JIT scanner\n// emits the CSS. Do not template the variant prefix.\n\n// CONSISTENCY: every input shows the IDENTICAL focus treatment under the same\n// conditions — the border turns accent. We deliberately use NO ring/box-shadow\n// halo: a ring is a box-shadow that any ancestor with `overflow` (incl. the\n// Storybook canvas) clips, producing the choppy \"rounded-top, square-bottom\"\n// artifact. A border-colour change can never be clipped and reads cleanly.\n// `:focus` (not `:focus-visible`) so it shows on mouse + keyboard, matching\n// text inputs (focus-within). `data-[state=open]` keeps it lit while a popover\n// trigger's panel is open even after Radix moves focus into the panel.\nconst FOCUS_WITHIN =\n 'focus-within:outline-none focus-within:border-accent'\nconst FOCUS_ELEMENT =\n 'focus:outline-none focus:border-accent data-[state=open]:border-accent'\nconst FOCUS_WITHIN_ERROR =\n 'focus-within:border-status-error'\nconst FOCUS_ELEMENT_ERROR =\n 'focus:border-status-error data-[state=open]:border-status-error'\n\nexport interface FieldShellOptions {\n size?: FieldSize\n hasError?: boolean\n disabled?: boolean\n /**\n * `true` for wrapper elements that hold a real `<input>` inside\n * (focus-within), `false` for elements that are themselves focusable\n * like `<button>` triggers (focus-visible). Default `false`.\n */\n focusWithin?: boolean\n /** Append height/padding utilities (for single-line inputs). Default `true`. */\n sized?: boolean\n}\n\n/**\n * Compose the className for an input's outer \"shell\" — the bordered, rounded\n * box that carries the focus ring. Apply to the `<input>` directly, or to a\n * wrapper `<div>` that contains an input plus adornments (pass\n * `focusWithin: true` in that case).\n */\nexport function fieldShell({\n size = 'md',\n hasError = false,\n disabled = false,\n focusWithin = false,\n sized = true,\n}: FieldShellOptions = {}): string {\n const s = FIELD_SIZE[size]\n return [\n 'w-full rounded-lg border bg-surface text-foreground',\n 'transition-[color,box-shadow,border-color] duration-150',\n s.text,\n sized ? `${s.control} ${s.padX}` : '',\n // resting border\n hasError ? 'border-status-error' : 'border-border',\n // hover (only when interactive + no error)\n disabled\n ? 'bg-surface-raised text-foreground-muted cursor-not-allowed'\n : hasError ? '' : 'hover:border-border-strong',\n // focus\n focusWithin ? FOCUS_WITHIN : FOCUS_ELEMENT,\n hasError ? (focusWithin ? FOCUS_WITHIN_ERROR : FOCUS_ELEMENT_ERROR) : '',\n // placeholder colour for native inputs\n 'placeholder:text-foreground-muted',\n ].filter(Boolean).join(' ')\n}\n\n// ── Help icon + shared label ──────────────────────────────────────────────────\n\n/**\n * Small themed \"info\" affordance shown beside a field label. Hovering or\n * focusing it reveals `helperText` in a tooltip. Rendered as a `type=\"button\"`\n * so it never submits an enclosing form, and coloured from semantic tokens so\n * it follows the active theme.\n */\nexport function FieldHelpIcon({ text }: { text: React.ReactNode }) {\n return (\n <Tooltip title={text} placement=\"top\">\n <button\n type=\"button\"\n aria-label=\"More information\"\n className=\"inline-flex items-center justify-center rounded-full text-foreground-muted transition-colors hover:text-foreground focus:outline-none focus-visible:text-accent\"\n >\n <svg viewBox=\"0 0 16 16\" className=\"h-3.5 w-3.5\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.5} aria-hidden=\"true\">\n <circle cx=\"8\" cy=\"8\" r=\"6.25\" />\n <path strokeLinecap=\"round\" d=\"M8 7.4v3.4\" />\n <circle cx=\"8\" cy=\"5.1\" r=\"0.65\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n </button>\n </Tooltip>\n )\n}\n\nexport interface FieldLabelProps {\n label?: React.ReactNode\n htmlFor?: string\n required?: boolean\n /** Reveals an info icon + tooltip beside the label. */\n helperText?: React.ReactNode\n /** Apply horizontal-layout spacing (no-wrap, shrink). */\n horizontal?: boolean\n /**\n * Vertical alignment of the label against the control in horizontal layout.\n * `'start'` (default) nudges the label down to meet a standard ~36px input's\n * first line; `'center'` removes that offset so the label centres against a\n * short control (Switch, SegmentedControl).\n */\n align?: 'start' | 'center'\n style?: React.CSSProperties\n /** Label column width in horizontal layout. */\n width?: string | number\n className?: string\n}\n\n/**\n * The label row shared by every input — label text + required asterisk +\n * optional `helperText` info icon. Components that render their own label\n * outside `<Field>` (Dropdown, DatePicker, Switch, SegmentedControl) use this\n * so the affordance is pixel-identical everywhere.\n *\n * Returns `null` when there's nothing to show (no label and no helperText).\n */\nexport function FieldLabel({\n label,\n htmlFor,\n required,\n helperText,\n horizontal = false,\n align = 'start',\n style,\n width,\n className = '',\n}: FieldLabelProps) {\n if (label == null && helperText == null) return null\n return (\n <div\n style={{ width: horizontal ? width : undefined, ...style }}\n className={[\n 'flex items-center gap-1',\n horizontal ? 'flex-shrink-0 whitespace-nowrap' : '',\n // Only the 'start' alignment needs the top nudge; 'center' relies\n // on the row's items-center to line up with a short control.\n horizontal && align === 'start' ? 'mt-2' : '',\n className,\n ].filter(Boolean).join(' ')}\n >\n {label != null && (\n <label htmlFor={htmlFor} className=\"text-sm font-medium text-foreground select-none\">\n {label}\n {required && <span className=\"text-status-error ml-0.5\" aria-hidden=\"true\">*</span>}\n </label>\n )}\n {helperText != null && <FieldHelpIcon text={helperText} />}\n </div>\n )\n}\n\n// ── Field wrapper ─────────────────────────────────────────────────────────────\n\nexport interface FieldProps {\n label?: React.ReactNode\n /** `id` of the control — links the `<label htmlFor>`. */\n htmlFor?: string\n /** `id` for the error region — pair with `aria-describedby` on the control. */\n errorId?: string\n errorMessage?: React.ReactNode\n /** Orientation of label vs control. Default `'vertical'`. */\n layout?: 'horizontal' | 'vertical'\n /** Show a required asterisk after the label. */\n required?: boolean\n /** Contextual help revealed via an info icon + tooltip beside the label. */\n helperText?: React.ReactNode\n /**\n * Label alignment against the control in horizontal layout. `'start'`\n * (default) for standard-height inputs; `'center'` for short controls\n * (Switch) so the label lines up with the control's centre.\n */\n labelAlign?: 'start' | 'center'\n labelStyle?: React.CSSProperties\n /** Width of the label column in horizontal layout (CSS length). */\n labelWidth?: string | number\n className?: string\n /** The control itself (input / trigger / dropzone). */\n children: React.ReactNode\n}\n\n/**\n * Layout wrapper shared by every input. Renders:\n *\n * ```\n * vertical: horizontal:\n * [label] [label] [ control ]\n * [ control ] [ error message ]\n * [ error ]\n * ```\n *\n * The error message always sits under the **control only** (never spanning\n * the label in horizontal layout). Label uses full-contrast foreground +\n * medium weight so it reads as the anchor, while the input's placeholder is\n * muted — establishing hierarchy without making the label tiny.\n */\nexport function Field({\n label,\n htmlFor,\n errorId,\n errorMessage,\n layout = 'vertical',\n required,\n helperText,\n labelAlign = 'start',\n labelStyle,\n labelWidth,\n className = '',\n children,\n}: FieldProps) {\n const hasError = errorMessage != null\n const horizontal = layout === 'horizontal'\n return (\n <div\n className={[\n 'flex',\n horizontal\n ? `flex-row gap-3 ${labelAlign === 'center' ? 'items-center' : 'items-start'}`\n : 'flex-col gap-1.5',\n className,\n ].filter(Boolean).join(' ')}\n >\n <FieldLabel\n label={label}\n htmlFor={htmlFor}\n required={required}\n helperText={helperText}\n horizontal={horizontal}\n align={labelAlign}\n style={labelStyle}\n width={labelWidth}\n />\n <div className=\"flex flex-col min-w-0 flex-1\">\n {children}\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 { Field, fieldShell, type FieldSize } from './_field'\n\nexport interface SearchInputProps {\n /** Controlled value. */\n value?: string\n /** Fires when the value changes. */\n onChange?: React.ChangeEventHandler<HTMLInputElement>\n /** Disable interaction and dim the control. */\n disabled?: boolean\n /** Field label, placed above (vertical) or beside (horizontal) the control. */\n label?: React.ReactNode\n /** The control id; the field label links to it for accessibility. */\n htmlFor?: string\n /** Placeholder shown when the field is empty. */\n placeholder?: string\n /** Native form field name (used for FormData serialisation). */\n name?: string\n /** Inline style applied to the inner input element. */\n inputStyle?: React.CSSProperties\n /** Inline style applied to the control shell. */\n style?: React.CSSProperties\n /** Label/input orientation. Defaults to `'vertical'`. */\n layout?: 'horizontal' | 'vertical'\n /** Size preset. Default `'md'`. */\n size?: FieldSize\n /** Override the leading search icon. */\n icon?: React.ReactNode\n /** Contextual help revealed via an info icon + tooltip beside the label. */\n helperText?: React.ReactNode\n /** Extra classes merged onto the field root element. */\n className?: string\n}\n\nconst SearchIcon = (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"w-4 h-4\" 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\n/**\n * Search field with a leading magnifier icon. Uses `type=\"search\"` for the\n * native clear affordance and a search-friendly mobile keyboard. Full-width\n * by default. Override the icon via `icon`.\n *\n * @example\n * ```tsx\n * <SearchInput value={q} onChange={(e) => setQ(e.target.value)} placeholder=\"Search vessels…\" />\n * ```\n */\nconst SearchInput = React.forwardRef<HTMLInputElement, SearchInputProps>(function SearchInput(\n { value, onChange, disabled, label, htmlFor, placeholder, name, inputStyle, style, layout = 'vertical', size = 'md', icon, helperText, className },\n ref,\n) {\n return (\n <Field className={className} label={label} htmlFor={htmlFor} layout={layout} helperText={helperText}>\n <div\n className={`flex items-center ${fieldShell({ size, disabled, focusWithin: true })}`}\n style={style}\n >\n <span className=\"flex-shrink-0 mr-2 text-foreground-muted\">{icon ?? SearchIcon}</span>\n <input\n ref={ref}\n disabled={disabled}\n value={value}\n onChange={onChange}\n type=\"search\"\n enterKeyHint=\"search\"\n name={name}\n id={htmlFor}\n className=\"min-w-0 flex-1 bg-transparent outline-none disabled:cursor-not-allowed placeholder:text-foreground-muted\"\n style={inputStyle}\n placeholder={placeholder ?? ''}\n />\n </div>\n </Field>\n )\n})\n\nexport default SearchInput\n","import React from 'react'\n\nexport interface TagProps {\n children: React.ReactNode\n /** When provided, renders a × button that calls this on click. */\n onRemove?: () => void\n /** Accessible label for the remove button. */\n removeLabel?: string\n disabled?: boolean\n}\n\n/**\n * Internal chip used by TagsInput and Dropdown for selected values. Subtle\n * bordered surface (not a heavy accent fill) with an optional × remove\n * button. Kept internal — consumers compose tags through the inputs, not\n * directly.\n */\nexport default function Tag({ children, onRemove, removeLabel, disabled }: TagProps) {\n return (\n <span className=\"inline-flex items-center gap-1 rounded-md border border-border bg-surface-raised text-foreground text-xs pl-2 pr-1 py-0.5 max-w-full\">\n <span className=\"truncate\">{children}</span>\n {onRemove && (\n <button\n type=\"button\"\n disabled={disabled}\n onClick={(e) => { e.stopPropagation(); onRemove() }}\n aria-label={removeLabel ?? 'Remove'}\n className=\"inline-flex items-center justify-center w-4 h-4 flex-shrink-0 rounded text-foreground-muted hover:text-status-error hover:bg-surface transition-colors focus:outline-none focus-visible:ring-1 focus-visible:ring-accent disabled:cursor-not-allowed\"\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=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n </button>\n )}\n </span>\n )\n}\n","import React, { useEffect, useId, useLayoutEffect, useRef, useState } from 'react'\nimport * as Popover from '@radix-ui/react-popover'\nimport SearchInput from './SearchInput'\nimport Tag from './_tag'\nimport { fieldShell, FieldLabel } from './_field'\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 /** Enable multi-select (value becomes an array of keys). */\n isMultiselect?: boolean\n /** Show a search box inside the dropdown panel. */\n hasSearch?: boolean\n /** Field label, placed above (vertical) or beside (horizontal) the control. */\n label?: React.ReactNode\n /** Native form field name (used for FormData serialisation). */\n name?: string\n /** Controlled value. */\n value?: DropdownValue\n /** Fires when the value changes. */\n onChange?: (e: { target: { value: DropdownValue; id?: string; name?: string } }) => void\n /** Blur handler — useful for touched/validation timing. */\n onBlur?: React.FocusEventHandler\n /** Disable interaction and dim the control. */\n disabled?: boolean\n /** Label/input orientation. Defaults to `'vertical'`. */\n layout?: 'horizontal' | 'vertical'\n /** Contextual help revealed via an info icon + tooltip beside the label. */\n helperText?: React.ReactNode\n /** Show a required asterisk after the label. */\n required?: boolean\n /** Validation message — shown under the control; also flags it red and sets aria-invalid. */\n errorMessage?: React.ReactNode\n /** Inline style applied to the control shell. */\n style?: React.CSSProperties\n /** The control id; the field label links to it for accessibility. */\n htmlFor?: string\n /** The selectable items. */\n items?: DropdownItem[]\n /** Inline style applied to the label. */\n labelStyle?: React.CSSProperties\n /** Placeholder shown when the field is empty. */\n placeholder?: string\n /** Size preset. Default `'md'`. */\n size?: import('./_field').FieldSize\n /** Extra classes merged onto the component root. */\n className?: string\n}\n\n/**\n * Single-line tag row for multi-select values. Shows as many removable tag\n * chips as fit on one line, then collapses the remainder into a \"+N more\"\n * chip — so the trigger never grows in width OR height as the selection\n * changes.\n *\n * Sizing is measured off a hidden, off-layout copy of the full tag set (so the\n * widths are always available even after we've collapsed the visible row), and\n * recomputed via a ResizeObserver whenever the trigger width changes.\n */\nfunction MultiTagRow({\n values,\n disabled,\n labelFor,\n onRemove,\n}: {\n values: (string | number)[]\n disabled?: boolean\n labelFor: (key: string | number) => React.ReactNode\n onRemove: (key: string | number) => void\n}) {\n const wrapRef = useRef<HTMLDivElement>(null)\n const measureRef = useRef<HTMLDivElement>(null)\n const [visibleCount, setVisibleCount] = useState(values.length)\n\n const key = values.map(String).join('|')\n\n useLayoutEffect(() => {\n const wrap = wrapRef.current\n const measure = measureRef.current\n if (!wrap || !measure) return\n\n const GAP = 6 // gap-1.5 → 0.375rem\n\n const recompute = () => {\n const avail = wrap.clientWidth\n const tagEls = Array.from(measure.querySelectorAll<HTMLElement>('[data-mt]'))\n const moreEl = measure.querySelector<HTMLElement>('[data-mm]')\n const widths = tagEls.map((e) => e.offsetWidth)\n const moreW = moreEl ? moreEl.offsetWidth : 0\n if (widths.length === 0) { setVisibleCount(0); return }\n\n // How many tags fit with no \"+N more\" chip?\n let used = 0\n let count = 0\n for (let i = 0; i < widths.length; i++) {\n const w = widths[i] + (i > 0 ? GAP : 0)\n if (used + w <= avail) { used += w; count++ } else break\n }\n\n // If some are hidden, reserve room for the \"+N more\" chip and\n // shrink the visible count until tags + chip fit.\n if (count < widths.length) {\n while (count > 0) {\n let t = 0\n for (let i = 0; i < count; i++) t += widths[i] + (i > 0 ? GAP : 0)\n t += GAP + moreW\n if (t <= avail) break\n count--\n }\n }\n setVisibleCount(count)\n }\n\n recompute()\n const ro = new ResizeObserver(recompute)\n ro.observe(wrap)\n return () => ro.disconnect()\n }, [key])\n\n const hidden = values.length - visibleCount\n const moreChip = (n: number) => (\n <span className=\"inline-flex items-center flex-shrink-0 rounded-md border border-border bg-surface-raised text-foreground-secondary text-xs px-2 py-0.5\">\n +{n} more\n </span>\n )\n\n return (\n <div ref={wrapRef} className=\"relative flex-1 min-w-0 flex flex-nowrap items-center gap-1.5 overflow-hidden\">\n {/* Hidden measuring copy — full set + a sample more chip. Off-layout\n so it never affects the trigger size, but measurable. */}\n <div\n ref={measureRef}\n aria-hidden=\"true\"\n className=\"absolute invisible pointer-events-none flex flex-nowrap items-center gap-1.5\"\n style={{ left: -9999, top: -9999 }}\n >\n {values.map((val) => (\n <span data-mt key={`m-${val}`}>\n <Tag removeLabel=\"x\" onRemove={() => {}}>{labelFor(val)}</Tag>\n </span>\n ))}\n <span data-mm>{moreChip(values.length)}</span>\n </div>\n\n {/* Visible row */}\n {values.slice(0, visibleCount).map((val) => (\n <Tag\n key={String(val)}\n disabled={disabled}\n removeLabel={`Remove ${labelFor(val)}`}\n onRemove={() => onRemove(val)}\n >\n {labelFor(val)}\n </Tag>\n ))}\n {hidden > 0 && moreChip(hidden)}\n </div>\n )\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 helperText,\n required,\n errorMessage,\n style = {},\n htmlFor,\n items = [],\n labelStyle = {},\n placeholder,\n size = 'md',\n className = '',\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 // Remove a selected value via its tag's × button. In multi-select this\n // toggles the option off; in single-select it clears the field.\n const removeSelected = (key: string | number) => {\n if (isMultiselect) {\n const next = selectedItems.filter((it) => it !== key)\n setSelectedItems(next)\n onChange?.({ target: { value: next, id: htmlFor, name } })\n } else {\n setSelectedItems([])\n onChange?.({ target: { value: '', id: htmlFor, name } })\n }\n }\n\n const labelFor = (key: string | number) => innerItems.find((it) => it.key === key)?.label ?? String(key)\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={className || undefined}>\n <div\n className={`flex ${layout === 'vertical' ? 'flex-col gap-1.5' : 'flex-row items-start gap-3'}`}\n >\n <FieldLabel\n label={label}\n htmlFor={htmlFor}\n required={required}\n helperText={helperText}\n horizontal={layout === 'horizontal'}\n style={labelStyle}\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 // A definite width keeps the trigger from shrink-\n // wrapping to its tags — the selection count changes\n // what's shown, never the box size. Override via\n // `style={{ width: '100%' }}` to fill a container.\n style={{ width: 240, ...style }}\n className={`flex items-center justify-between gap-2 cursor-pointer select-none min-h-[36px] px-3 py-1.5 ${fieldShell({ size, hasError, disabled, sized: false })}`}\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) — rendered as removable tags.\n Clicking a tag's × deselects (multi) or clears\n (single). The × calls stopPropagation so it\n doesn't toggle the popover. Multi-select collapses\n overflow into a \"+N more\" chip on a single line. */}\n {!value || (Array.isArray(value) && value.length === 0) ? (\n <span className=\"flex-1 min-w-0 truncate text-foreground-muted text-sm\">{placeholder}</span>\n ) : Array.isArray(value) ? (\n <MultiTagRow\n values={value}\n disabled={disabled}\n labelFor={labelFor}\n onRemove={removeSelected}\n />\n ) : (\n <div className=\"flex-1 min-w-0 flex items-center overflow-hidden\">\n <Tag\n disabled={disabled}\n removeLabel={`Remove ${labelFor(value)}`}\n onRemove={() => removeSelected(value)}\n >\n {labelFor(value)}\n </Tag>\n </div>\n )}\n\n {/* Chevron — currentColor follows trigger text */}\n <div className={`flex-shrink-0 text-foreground-muted transition-transform duration-200 ${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. The animated sweep lives in `.oxy-skeleton::after`\n// (src/styles/_animations.scss) where the band colour is `color-mix`-ed from\n// `--color-foreground`, so it stays visible in BOTH light and dark themes — a\n// fixed white sheen vanishes on a light `surface-raised` base. The element\n// keeps `bg-surface-raised` as a Tailwind utility so consumers can override the\n// resting colour via `className` / `style`. Reduced-motion hides the sweep but\n// the legible base placeholder remains.\nconst SHIMMER = 'oxy-skeleton rounded-sm bg-surface-raised'\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 { AnimatePresence, motion, useReducedMotion } from 'framer-motion'\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 /** Extra classes merged onto the table wrapper root. */\n className?: string\n /** Inline style on the table wrapper root. */\n style?: React.CSSProperties\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 const reduced = useReducedMotion()\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 {/* Expansion row is always present; the panel animates\n its height + fade via AnimatePresence so the content\n mounts only while open (and during the collapse\n transition). The border lives on the panel so a\n collapsed row leaves no stray divider. */}\n {hasExpand && (\n <tr className=\"bg-surface\">\n <td colSpan={expandColCount} className=\"p-0\">\n <AnimatePresence initial={false}>\n {isExpanded && (\n <motion.div\n key=\"expand\"\n initial={{ height: 0, opacity: 0 }}\n animate={{ height: 'auto', opacity: 1 }}\n exit={{ height: 0, opacity: 0 }}\n transition={\n reduced\n ? { duration: 0 }\n : { height: { duration: 0.28, ease: [0.16, 1, 0.3, 1] }, opacity: { duration: 0.2 } }\n }\n style={{ overflow: 'hidden' }}\n className=\"border-b border-border\"\n >\n <div className=\"p-3\">{expandRow.expandComponent?.(row)}</div>\n </motion.div>\n )}\n </AnimatePresence>\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 className = '',\n style,\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 ${className}`.trim()} style={style}>\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 /** Extra classes merged onto the root label. */\n className?: 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', className = '' }: ThemeSwitchProps) {\n const id = useId()\n\n return (\n <label htmlFor={id} className={`flex items-center gap-2 cursor-pointer select-none ${className}`.trim()}>\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 /** Extra classes merged onto the sidebar root (`<aside>`). */\n className?: string\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 className = '',\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 ${className}`.trim()}\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, { createContext, useContext, useState } from 'react'\nimport * as NavigationMenu from '@radix-ui/react-navigation-menu'\n\ntype Align = 'start' | 'center' | 'end'\nconst MegaMenuContext = createContext<{ align: Align }>({ align: 'start' })\n\n// ── Root ──────────────────────────────────────────────────────────────────────\n\nexport interface MegaMenuProps {\n /** `MegaMenu.Item` children. */\n children: React.ReactNode\n /** Where the dropdown panel aligns under the bar. Default `'start'`. */\n align?: 'start' | 'center' | 'end'\n /** Delay (ms) before a hovered item opens. Default `200`. */\n delayDuration?: number\n /**\n * Below the `md` breakpoint, collapse the hover bar into a tap-friendly\n * hamburger disclosure (a vertical accordion of the same items). Hover\n * mega-panels don't work on touch, so this is the graceful fallback.\n * Set `false` to render the desktop bar at every width (e.g. when you\n * provide your own mobile navigation). Default `true`.\n */\n responsive?: boolean\n /** Label for the mobile disclosure toggle. Default `'Menu'`. */\n mobileLabel?: React.ReactNode\n /** Extra classes merged onto the menu bar root. */\n className?: string\n style?: React.CSSProperties\n 'aria-label'?: string\n}\n\n/**\n * Horizontal navigation bar with wide \"mega\" dropdown panels, built on\n * `@radix-ui/react-navigation-menu` (hover-intent open, arrow-key navigation,\n * focus management, and a shared animated viewport for free).\n *\n * Compose top-level items with `MegaMenu.Item`. An item with children opens a\n * panel (`MegaMenu.Panel` → `MegaMenu.Section` → `MegaMenu.Link`, plus an\n * optional `MegaMenu.Featured` promo column); an item with just `href` is a\n * plain top-level link. Each panel positions itself under the bar and sizes to\n * its content.\n *\n * @example\n * ```tsx\n * <MegaMenu aria-label=\"Main\">\n * <MegaMenu.Item label=\"Products\">\n * <MegaMenu.Panel>\n * <MegaMenu.Section title=\"Platform\">\n * <MegaMenu.Link href=\"/analytics\" icon={<ChartIcon />} description=\"Dashboards & reports\">\n * Analytics\n * </MegaMenu.Link>\n * </MegaMenu.Section>\n * </MegaMenu.Panel>\n * </MegaMenu.Item>\n * <MegaMenu.Item label=\"Pricing\" href=\"/pricing\" />\n * </MegaMenu>\n * ```\n */\nfunction MegaMenu({\n children,\n align = 'start',\n delayDuration = 200,\n responsive = true,\n mobileLabel = 'Menu',\n className = '',\n style,\n 'aria-label': ariaLabel,\n}: MegaMenuProps) {\n return (\n <MegaMenuContext.Provider value={{ align }}>\n {/* Desktop: hover-intent bar. Hidden below `md` when responsive. */}\n <NavigationMenu.Root\n delayDuration={delayDuration}\n aria-label={ariaLabel}\n className={[\n 'relative z-10 w-full',\n responsive ? 'hidden md:flex' : 'flex',\n className,\n ].filter(Boolean).join(' ')}\n style={style}\n >\n <NavigationMenu.List className=\"flex items-center gap-1\">\n {children}\n </NavigationMenu.List>\n </NavigationMenu.Root>\n\n {/* Mobile: tap-friendly disclosure accordion. */}\n {responsive && (\n <MegaMenuMobile label={mobileLabel}>\n {children}\n </MegaMenuMobile>\n )}\n </MegaMenuContext.Provider>\n )\n}\n\n// ── Item ──────────────────────────────────────────────────────────────────────\n\nexport interface MegaMenuItemProps {\n /** Top-level label shown in the bar. */\n label: React.ReactNode\n /** Optional leading icon for the top-level item. */\n icon?: React.ReactNode\n /** When set (and no children), the item is a plain top-level link. */\n href?: string\n /** The panel (`MegaMenu.Panel`) revealed on hover/focus. Omit for a link. */\n children?: React.ReactNode\n className?: string\n}\n\nconst TOP_ITEM =\n 'group/top inline-flex items-center gap-1.5 h-10 px-3 rounded-md text-sm font-medium select-none ' +\n 'text-foreground-secondary hover:text-foreground hover:bg-surface-raised ' +\n 'data-[state=open]:text-accent data-[active]:text-accent ' +\n 'transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-accent'\n\nfunction MegaMenuItem({ label, icon, href, children, className = '' }: MegaMenuItemProps) {\n const { align } = useContext(MegaMenuContext)\n const pos = align === 'center' ? 'left-1/2 -translate-x-1/2' : align === 'end' ? 'right-0' : 'left-0'\n if (!children) {\n return (\n <NavigationMenu.Item>\n <NavigationMenu.Link href={href} className={[TOP_ITEM, className].filter(Boolean).join(' ')}>\n {icon && <span className=\"flex h-4 w-4 flex-shrink-0 items-center justify-center\">{icon}</span>}\n {label}\n </NavigationMenu.Link>\n </NavigationMenu.Item>\n )\n }\n return (\n <NavigationMenu.Item>\n <NavigationMenu.Trigger className={[TOP_ITEM, className].filter(Boolean).join(' ')}>\n {icon && <span className=\"flex h-4 w-4 flex-shrink-0 items-center justify-center\">{icon}</span>}\n {label}\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} aria-hidden=\"true\"\n className=\"h-3.5 w-3.5 text-foreground-muted transition-transform duration-200 group-data-[state=open]/top:rotate-180 group-data-[state=open]/top:text-accent\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n </NavigationMenu.Trigger>\n {/* The panel is a self-positioning absolute dropdown (no shared\n Radix Viewport). It sizes to its own content, so there's no\n viewport-width feedback loop. Positioned under the bar (the\n Root is `relative`) per the `align` prop. */}\n <NavigationMenu.Content\n className={`absolute top-full mt-2 ${pos} z-20 overflow-hidden rounded-lg border border-border bg-surface shadow-lg\n data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95\n data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95`}\n >\n {children}\n </NavigationMenu.Content>\n </NavigationMenu.Item>\n )\n}\n\n// ── Panel layout ────────────────────────────────────────────────────────────────\n\nexport interface MegaMenuPanelProps {\n children: React.ReactNode\n /** Cap the panel to roughly this many side-by-side columns before wrapping. Default: single row. */\n columns?: 1 | 2 | 3 | 4\n className?: string\n style?: React.CSSProperties\n}\n\nfunction MegaMenuPanel({ children, columns, className = '', style }: MegaMenuPanelProps) {\n // Grid with a *definite* panel width — this is the key to both a stable\n // width (no Radix-viewport feedback loop, since the panel is a\n // self-positioning absolute element) AND sections that spread to fill,\n // rather than shrink-wrapping to min-content the way the old flex layout\n // did. `1fr` / `auto-fit` resolve correctly because `width` is concrete.\n const layout: React.CSSProperties = columns\n ? {\n gridTemplateColumns: `repeat(${columns}, minmax(0, 1fr))`,\n width: `min(92vw, ${columns * 272}px)`,\n }\n : {\n gridTemplateColumns: 'repeat(auto-fit, minmax(220px, 1fr))',\n width: 'min(92vw, 760px)',\n }\n return (\n <div\n className={['grid gap-6 p-6', className].filter(Boolean).join(' ')}\n style={{ ...layout, maxWidth: 'min(92vw, 960px)', ...style }}\n >\n {children}\n </div>\n )\n}\n\n// ── Section (a titled column of links) ──────────────────────────────────────────\n\nexport interface MegaMenuSectionProps {\n /** Section heading (uppercase eyebrow). */\n title?: React.ReactNode\n children: React.ReactNode\n className?: string\n}\n\nfunction MegaMenuSection({ title, children, className = '' }: MegaMenuSectionProps) {\n return (\n <div className={['min-w-0 flex flex-col', className].filter(Boolean).join(' ')}>\n {title && (\n <p className=\"px-3 pb-1.5 text-[11px] font-semibold uppercase tracking-widest text-foreground-muted select-none\">\n {title}\n </p>\n )}\n <div className=\"flex flex-col gap-0.5\">{children}</div>\n </div>\n )\n}\n\n// ── Link (rich icon + title + description) ───────────────────────────────────────\n\nexport interface MegaMenuLinkProps {\n href?: string\n /** Leading icon, shown in a tinted square. */\n icon?: React.ReactNode\n /** Secondary line under the title. */\n description?: React.ReactNode\n /** Mark as the active route. */\n active?: boolean\n onClick?: React.MouseEventHandler\n children: React.ReactNode\n className?: string\n}\n\nfunction MegaMenuLink({ href, icon, description, active, onClick, children, className = '' }: MegaMenuLinkProps) {\n return (\n <NavigationMenu.Link\n active={active}\n href={href}\n onClick={onClick}\n className={[\n 'group/link flex items-start gap-3 rounded-md p-3 transition-colors select-none',\n 'hover:bg-surface-raised focus:outline-none focus-visible:ring-2 focus-visible:ring-accent',\n 'data-[active]:bg-surface-raised',\n className,\n ].filter(Boolean).join(' ')}\n >\n {icon && (\n <span className=\"flex h-9 w-9 flex-shrink-0 items-center justify-center rounded-md bg-surface-raised text-accent group-hover/link:bg-surface group-data-[active]/link:bg-surface transition-colors\">\n <span className=\"h-[18px] w-[18px] inline-flex items-center justify-center\">{icon}</span>\n </span>\n )}\n <span className=\"flex flex-col min-w-0\">\n <span className=\"text-sm font-medium text-foreground group-data-[active]/link:text-accent\">{children}</span>\n {description && <span className=\"text-xs text-foreground-muted leading-snug mt-0.5\">{description}</span>}\n </span>\n </NavigationMenu.Link>\n )\n}\n\n// ── Featured (promo column) ──────────────────────────────────────────────────────\n\nexport interface MegaMenuFeaturedProps {\n children: React.ReactNode\n className?: string\n}\n\nfunction MegaMenuFeatured({ children, className = '' }: MegaMenuFeaturedProps) {\n return (\n <div className={['min-w-0 rounded-lg bg-surface-raised border border-border p-4 flex flex-col', className].filter(Boolean).join(' ')}>\n {children}\n </div>\n )\n}\n\n// ── Mobile disclosure (responsive fallback) ─────────────────────────────────────\n// Hover mega-panels are unusable on touch, so below `md` we render a self-\n// contained accordion built from the SAME compound children. We introspect the\n// element tree (Item → Panel → Section/Featured → Link) by component identity\n// and re-render it with plain anchors — no Radix NavigationMenu context needed,\n// so nothing depends on the desktop bar being mounted.\n\ntype AnyEl = React.ReactElement<Record<string, unknown>>\nconst elementsOfType = (children: React.ReactNode, type: unknown): AnyEl[] =>\n React.Children.toArray(children).filter(\n (c): c is AnyEl => React.isValidElement(c) && c.type === type,\n )\n\nconst MOBILE_CHEVRON = (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} aria-hidden=\"true\"\n className=\"h-4 w-4 flex-shrink-0 text-foreground-muted transition-transform duration-200\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n)\n\nfunction MobileLinkRow({ link, onNavigate }: { link: AnyEl; onNavigate: () => void }) {\n const { href, icon, description, active, onClick, children } = link.props as {\n href?: string; icon?: React.ReactNode; description?: React.ReactNode\n active?: boolean; onClick?: React.MouseEventHandler; children?: React.ReactNode\n }\n return (\n <a\n href={href}\n onClick={(e) => { onClick?.(e); onNavigate() }}\n data-active={active ? '' : undefined}\n className=\"flex items-start gap-3 rounded-md p-2.5 transition-colors select-none\n hover:bg-surface-raised focus:outline-none focus-visible:ring-2 focus-visible:ring-accent\n data-[active]:bg-surface-raised\"\n >\n {icon && (\n <span className=\"flex h-8 w-8 flex-shrink-0 items-center justify-center rounded-md bg-surface-raised text-accent\">\n <span className=\"h-[17px] w-[17px] inline-flex items-center justify-center\">{icon}</span>\n </span>\n )}\n <span className=\"flex flex-col min-w-0\">\n <span className=\"text-sm font-medium text-foreground data-[active]:text-accent\">{children}</span>\n {description && <span className=\"text-xs text-foreground-muted leading-snug mt-0.5\">{description}</span>}\n </span>\n </a>\n )\n}\n\nfunction MobilePanel({ panel, onNavigate }: { panel: AnyEl; onNavigate: () => void }) {\n const nodes = React.Children.toArray((panel.props as { children?: React.ReactNode }).children)\n return (\n <div className=\"flex flex-col gap-4 px-2 pb-3 pt-1\">\n {nodes.map((node, i) => {\n if (!React.isValidElement(node)) return null\n const el = node as AnyEl\n if (el.type === MegaMenuSection) {\n const { title, children } = el.props as { title?: React.ReactNode; children?: React.ReactNode }\n return (\n <div key={i} className=\"flex flex-col\">\n {title && (\n <p className=\"px-2.5 pb-1 text-[11px] font-semibold uppercase tracking-widest text-foreground-muted select-none\">\n {title}\n </p>\n )}\n <div className=\"flex flex-col gap-0.5\">\n {elementsOfType(children, MegaMenuLink).map((lnk, j) => (\n <MobileLinkRow key={j} link={lnk} onNavigate={onNavigate} />\n ))}\n </div>\n </div>\n )\n }\n if (el.type === MegaMenuFeatured) {\n return (\n <div key={i} className=\"rounded-lg bg-surface-raised border border-border p-3 flex flex-col\">\n {(el.props as { children?: React.ReactNode }).children}\n </div>\n )\n }\n return <div key={i}>{node}</div>\n })}\n </div>\n )\n}\n\nfunction MegaMenuMobile({\n children,\n label,\n}: {\n children: React.ReactNode\n label: React.ReactNode\n}) {\n const [open, setOpen] = useState(false)\n const [expanded, setExpanded] = useState<number | null>(null)\n const items = elementsOfType(children, MegaMenuItem)\n\n return (\n <div className=\"md:hidden w-full\">\n <button\n type=\"button\"\n onClick={() => setOpen((o) => !o)}\n aria-expanded={open}\n className=\"inline-flex items-center gap-2 h-10 px-3 rounded-md text-sm font-medium\n text-foreground-secondary hover:text-foreground hover:bg-surface-raised\n focus:outline-none focus-visible:ring-2 focus-visible:ring-accent transition-colors\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} aria-hidden=\"true\" className=\"h-5 w-5\">\n {open\n ? <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 6l12 12M18 6L6 18\" />\n : <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M4 7h16M4 12h16M4 17h16\" />}\n </svg>\n {label}\n </button>\n\n {open && (\n <div className=\"mt-2 overflow-hidden rounded-lg border border-border bg-surface shadow-lg\">\n {items.map((item, i) => {\n const { label: itemLabel, icon, href, children: panel } = item.props as {\n label?: React.ReactNode; icon?: React.ReactNode; href?: string; children?: React.ReactNode\n }\n const hasPanel = panel != null\n const isOpen = expanded === i\n const rowBase =\n 'flex w-full items-center gap-2 px-3 h-11 text-sm font-medium text-foreground-secondary ' +\n 'hover:bg-surface-raised hover:text-foreground transition-colors ' +\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-accent'\n const divider = i > 0 ? 'border-t border-border' : ''\n\n if (!hasPanel) {\n return (\n <a\n key={i}\n href={href}\n onClick={() => setOpen(false)}\n className={[rowBase, divider].filter(Boolean).join(' ')}\n >\n {icon && <span className=\"flex h-4 w-4 flex-shrink-0 items-center justify-center\">{icon}</span>}\n {itemLabel}\n </a>\n )\n }\n\n return (\n <div key={i} className={divider || undefined}>\n <button\n type=\"button\"\n onClick={() => setExpanded(isOpen ? null : i)}\n aria-expanded={isOpen}\n className={[rowBase, isOpen ? 'text-accent' : ''].filter(Boolean).join(' ')}\n >\n {icon && <span className=\"flex h-4 w-4 flex-shrink-0 items-center justify-center\">{icon}</span>}\n <span className=\"flex-1 text-left\">{itemLabel}</span>\n <span className={isOpen ? 'rotate-180' : ''}>{MOBILE_CHEVRON}</span>\n </button>\n {isOpen && <MobilePanel panel={panel as AnyEl} onNavigate={() => setOpen(false)} />}\n </div>\n )\n })}\n </div>\n )}\n </div>\n )\n}\n\n// ── Compound export ─────────────────────────────────────────────────────────────\n\nMegaMenu.Item = MegaMenuItem\nMegaMenu.Panel = MegaMenuPanel\nMegaMenu.Section = MegaMenuSection\nMegaMenu.Link = MegaMenuLink\nMegaMenu.Featured = MegaMenuFeatured\n\nexport default MegaMenu\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'\nimport { Field, fieldShell, type FieldSize } from './_field'\n\nexport interface TextInputProps {\n /** Controlled string value. */\n value?: string\n /** Native change handler — read `e.target.value`. */\n onChange?: React.ChangeEventHandler<HTMLInputElement>\n /** Disable interaction and dim the field. */\n disabled?: boolean\n /** Field label rendered above (vertical) or beside (horizontal) the input. */\n label?: React.ReactNode\n /** `id` for the input + the `<label htmlFor>` link. */\n htmlFor?: string\n /** Placeholder shown when the field is empty. */\n placeholder?: string\n /** Native form field name (used for `FormData` serialisation). */\n name?: string\n /** Native input type. Defaults to `'text'`. */\n type?: 'text' | 'email' | 'url' | 'tel'\n /** Inline style applied to the `<input>` element. */\n inputStyle?: React.CSSProperties\n /** Inline style applied to the field shell / adornment wrapper. */\n style?: React.CSSProperties\n /** Label/input orientation. Defaults to `'vertical'`. */\n layout?: 'horizontal' | 'vertical'\n /** Size preset — controls height, padding, and font. Default `'md'`. */\n size?: FieldSize\n /** Native blur handler. */\n onBlur?: React.FocusEventHandler<HTMLInputElement>\n /** Validation message — shown under the input; also flags it red + `aria-invalid`. */\n errorMessage?: React.ReactNode\n /** Contextual help revealed via an info icon + tooltip beside the label. */\n helperText?: React.ReactNode\n /** Extra classes merged onto the field root element. */\n className?: string\n /** Mark the field required (renders an asterisk after the label). */\n required?: boolean\n /** Optional leading adornment (icon / prefix). */\n prefix?: React.ReactNode\n /** Optional trailing adornment (icon / suffix / unit). */\n suffix?: React.ReactNode\n /** @deprecated Use `htmlFor`. */\n id?: string\n}\n\n/**\n * Single-line text input. Full-width by default (responsive) — constrain it\n * with the parent layout or `style={{ maxWidth }}`. Supports an optional\n * leading `prefix` and trailing `suffix` adornment (icon, unit, etc.).\n *\n * @example\n * ```tsx\n * <TextInput label=\"Vessel name\" value={name} onChange={(e) => setName(e.target.value)} />\n * ```\n *\n * @example With adornment + error\n * ```tsx\n * <TextInput\n * label=\"IMO\"\n * prefix={<HashIcon />}\n * value={imo}\n * onChange={onChange}\n * errorMessage={touched && !valid ? 'Invalid IMO number' : undefined}\n * />\n * ```\n */\nexport default function TextInput({\n value,\n onChange,\n disabled,\n label,\n htmlFor,\n placeholder,\n name,\n type = 'text',\n inputStyle,\n style,\n layout = 'vertical',\n size = 'md',\n onBlur,\n errorMessage,\n helperText,\n className,\n required,\n prefix,\n suffix,\n}: TextInputProps) {\n const errorId = useId()\n const hasError = errorMessage != null\n const hasAdornment = prefix != null || suffix != null\n\n const input = (\n <input\n autoComplete=\"off\"\n disabled={disabled}\n value={value}\n onChange={onChange}\n onBlur={onBlur}\n type={type}\n name={name}\n id={htmlFor}\n aria-invalid={hasError || undefined}\n aria-describedby={hasError ? errorId : undefined}\n placeholder={placeholder ?? ''}\n // When wrapped for adornments, the input is borderless/transparent\n // and the wrapper carries the shell. Otherwise the input IS the shell.\n className={\n hasAdornment\n ? 'min-w-0 flex-1 bg-transparent outline-none disabled:cursor-not-allowed placeholder:text-foreground-muted'\n : fieldShell({ size, hasError, disabled })\n }\n style={inputStyle}\n />\n )\n\n return (\n <Field className={className}\n label={label}\n htmlFor={htmlFor}\n errorId={errorId}\n errorMessage={errorMessage}\n helperText={helperText}\n layout={layout}\n required={required}\n >\n {hasAdornment ? (\n <div\n className={`flex items-center ${fieldShell({ size, hasError, disabled, focusWithin: true })}`}\n style={style}\n >\n {prefix && <span className=\"flex-shrink-0 mr-2 text-foreground-muted\">{prefix}</span>}\n {input}\n {suffix && <span className=\"flex-shrink-0 ml-2 text-foreground-muted\">{suffix}</span>}\n </div>\n ) : (\n input\n )}\n </Field>\n )\n}\n","import React, { useId } from 'react'\nimport { Field, fieldShell, type FieldSize } from './_field'\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 /** Field label, placed above (vertical) or beside (horizontal) the control. */\n label?: React.ReactNode\n /** The control id; the field label links to it for accessibility. */\n htmlFor?: string\n /** Native form field name (used for FormData serialisation). */\n name?: string\n /** Disable interaction and dim the control. */\n disabled?: boolean\n /** Label/input orientation. Defaults to `'vertical'`. */\n layout?: 'horizontal' | 'vertical'\n /** Size preset. Default `'md'`. */\n size?: FieldSize\n /** Validation message — shown under the control; also flags it red and sets aria-invalid. */\n errorMessage?: React.ReactNode\n /** Contextual help revealed via an info icon + tooltip beside the label. */\n helperText?: React.ReactNode\n /** Extra classes merged onto the field root element. */\n className?: string\n /** Show a required asterisk after the label. */\n required?: boolean\n /** Inline style applied to the inner input element. */\n inputStyle?: React.CSSProperties\n /** Inline style applied to the label. */\n labelStyle?: React.CSSProperties\n /** Placeholder shown when the field is empty. */\n placeholder?: string\n /** Inline style applied to the control shell. */\n style?: React.CSSProperties\n /** Minimum allowed value. */\n min?: number\n /** Maximum allowed value. */\n max?: number\n /** Render read-only — visible but not editable. */\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 = 'vertical',\n size = 'md',\n errorMessage,\n helperText,\n className,\n required,\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 <Field className={className}\n label={label}\n htmlFor={htmlFor}\n errorId={errorId}\n errorMessage={errorMessage} helperText={helperText}\n layout={layout}\n required={required}\n labelStyle={labelStyle}\n >\n {/* `overflow-hidden` clips the stepper buttons to the rounded\n shell; `pr-0` removes the shell's right padding so the steppers\n sit flush against the edge. */}\n <div\n style={style}\n className={`flex items-center overflow-hidden pr-0 ${fieldShell({ size, hasError, disabled, focusWithin: true })}`}\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=\"min-w-0 flex-1 bg-transparent outline-none h-full disabled:cursor-not-allowed [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none placeholder:text-foreground-muted\"\n style={inputStyle}\n placeholder={placeholder ?? ''}\n readOnly={readOnly}\n />\n <div className=\"flex flex-col self-stretch border-l border-border flex-shrink-0\">\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 text-foreground-muted hover:bg-surface-raised hover:text-foreground disabled:opacity-30 disabled:cursor-not-allowed transition-colors\"\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 text-foreground-muted hover:bg-surface-raised hover:text-foreground disabled:opacity-30 disabled:cursor-not-allowed transition-colors 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 </Field>\n )\n}\n","import React, { useId, useState } from 'react'\nimport { Field, fieldShell, FIELD_SIZE, type FieldSize } from './_field'\n\nexport interface PasswordProps {\n /** Controlled value. */\n value?: string\n /** Fires when the value changes. */\n onChange?: React.ChangeEventHandler<HTMLInputElement>\n /** Disable interaction and dim the control. */\n disabled?: boolean\n /** Field label, placed above (vertical) or beside (horizontal) the control. */\n label?: React.ReactNode\n /** The control id; the field label links to it for accessibility. */\n htmlFor?: string\n /** Placeholder shown when the field is empty. */\n placeholder?: string\n /** Native form field name (used for FormData serialisation). */\n name?: string\n /** Inline style applied to the inner input element. */\n inputStyle?: React.CSSProperties\n /** Inline style applied to the control shell. */\n style?: React.CSSProperties\n /** Label/input orientation. Defaults to `'vertical'`. */\n layout?: 'horizontal' | 'vertical'\n /** Size preset — controls height, padding, and font. Default `'md'`. */\n size?: FieldSize\n /** Blur handler — useful for touched/validation timing. */\n onBlur?: React.FocusEventHandler<HTMLInputElement>\n /** Validation message — shown under the control; also flags it red and sets aria-invalid. */\n errorMessage?: React.ReactNode\n /** Contextual help revealed via an info icon + tooltip beside the label. */\n helperText?: React.ReactNode\n /** Extra classes merged onto the field root element. */\n className?: string\n /** Show a required asterisk after the label. */\n required?: boolean\n /** Override the \"reveal\" (password hidden) icon. */\n showIcon?: React.ReactNode\n /** Override the \"hide\" (password visible) icon. */\n hideIcon?: React.ReactNode\n}\n\nconst EyeIcon = (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"w-5 h-5\" aria-hidden=\"true\">\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 EyeSlashIcon = (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"w-5 h-5\" aria-hidden=\"true\">\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\n/**\n * Password input with a show/hide reveal toggle. Full-width by default.\n * The reveal/hide icons can be overridden via `showIcon` / `hideIcon`.\n *\n * @example\n * ```tsx\n * <Password label=\"Password\" value={pw} onChange={(e) => setPw(e.target.value)} />\n * ```\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 = 'vertical',\n size = 'md',\n onBlur,\n errorMessage,\n helperText,\n className,\n required,\n showIcon,\n hideIcon,\n}: PasswordProps) {\n const [visible, setVisible] = useState(false)\n const errorId = useId()\n const hasError = errorMessage != null\n\n return (\n <Field className={className}\n label={label}\n htmlFor={htmlFor}\n errorId={errorId}\n errorMessage={errorMessage} helperText={helperText}\n layout={layout}\n required={required}\n >\n <div\n className={`flex items-center ${fieldShell({ size, hasError, disabled, focusWithin: true })}`}\n style={style}\n >\n <input\n autoComplete=\"off\"\n disabled={disabled}\n value={value}\n onChange={onChange}\n onBlur={onBlur}\n type={visible ? 'text' : 'password'}\n name={name}\n id={htmlFor}\n aria-invalid={hasError || undefined}\n aria-describedby={hasError ? errorId : undefined}\n placeholder={placeholder ?? ''}\n className=\"min-w-0 flex-1 bg-transparent outline-none disabled:cursor-not-allowed placeholder:text-foreground-muted\"\n style={inputStyle}\n />\n <button\n type=\"button\"\n disabled={disabled}\n className={`flex-shrink-0 ml-2 ${FIELD_SIZE[size].gap} rounded text-foreground-muted hover:text-foreground transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-accent disabled:cursor-not-allowed`}\n onClick={() => setVisible((v) => !v)}\n aria-label={visible ? 'Hide password' : 'Show password'}\n >\n {visible ? (hideIcon ?? EyeSlashIcon) : (showIcon ?? EyeIcon)}\n </button>\n </div>\n </Field>\n )\n}\n","import React, { useId } from 'react'\nimport * as CheckboxPrimitive from '@radix-ui/react-checkbox'\nimport { FieldHelpIcon } from './_field'\n\nexport interface CheckboxProps {\n /** Controlled checked state. */\n checked?: boolean\n /** Fires `{ target: { checked, id, name } }` for form-handler compatibility. */\n onChange?: (e: { target: { checked: boolean; id?: string; name?: string } }) => void\n /** Primary label text. */\n label?: React.ReactNode\n /** Secondary line rendered under the label (same affordance as RadioGroup options). */\n description?: React.ReactNode\n /** Native form field name. */\n name?: string\n /** `id` for the control and the `<label htmlFor>` link. */\n htmlFor?: string\n /** Validation message — shown under the control; also flags the box red + `aria-invalid`. */\n errorMessage?: React.ReactNode\n /** Contextual help revealed via an info icon + tooltip beside the label. */\n helperText?: React.ReactNode\n /** Disable interaction + dim the control. */\n disabled?: boolean\n /** Show a required asterisk after the label. */\n required?: boolean\n /**\n * Box + label arrangement.\n * - `'horizontal'` (default): box and label on one row.\n * - `'vertical'`: box and label stacked.\n */\n layout?: 'horizontal' | 'vertical'\n /**\n * Which side of the box the label sits on.\n * - `'right'` (default): box then label.\n * - `'left'`: label then box (the description always wraps under the label).\n */\n labelPosition?: 'left' | 'right'\n /** @deprecated Use `checked`. Kept for API compatibility. */\n value?: boolean\n /** Extra classes merged onto the component root. */\n className?: string\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 on first check. Supports a secondary\n * `description`, `helperText` tooltip, left/right label placement, and the\n * shared error treatment — so it lines up with every other input in a form.\n *\n * Emits `{ target: { checked, id, name } }` for drop-in use with existing\n * change handlers.\n *\n * @example\n * <Checkbox\n * htmlFor=\"agree\"\n * label=\"I agree to the terms\"\n * description=\"You can revoke consent any time in settings.\"\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 description,\n name,\n htmlFor,\n errorMessage,\n helperText,\n disabled = false,\n required,\n layout = 'horizontal',\n labelPosition = 'right',\n className = '',\n}: CheckboxProps) {\n const isChecked = checked ?? value ?? false\n const labelFirst = labelPosition === 'left'\n const errorId = useId()\n const hasError = errorMessage != null\n\n const box = (\n <CheckboxPrimitive.Root\n id={htmlFor}\n name={name}\n checked={isChecked}\n disabled={disabled}\n required={required}\n onCheckedChange={(c) => onChange?.({ target: { checked: !!c, id: htmlFor, name } })}\n className={[\n 'relative mt-0.5 flex h-[18px] w-[18px] flex-shrink-0 items-center justify-center',\n 'rounded-sm border transition-colors duration-150',\n hasError ? 'border-status-error' : 'border-border-strong',\n 'data-[state=checked]:bg-accent data-[state=checked]:border-accent',\n // Focus halo matches the field tokens for a consistent look.\n 'focus:outline-none focus-visible:ring-[3px] focus-visible:ring-focus-ring',\n 'disabled:cursor-not-allowed',\n ].join(' ')}\n aria-label={typeof label === 'string' ? label : undefined}\n aria-invalid={hasError || undefined}\n aria-describedby={hasError ? errorId : undefined}\n >\n <CheckboxPrimitive.Indicator className=\"flex items-center justify-center data-[state=checked]:animate-check-pop\">\n <svg width=\"11\" height=\"9\" viewBox=\"0 0 11 9\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M1 4.5L4 7.5L10 1\" stroke=\"white\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n )\n\n const labelText = label != null && (\n <label\n htmlFor={htmlFor}\n className={['block select-none text-sm text-foreground leading-snug', disabled ? 'cursor-not-allowed opacity-50' : 'cursor-pointer'].join(' ')}\n >\n {label}\n {required && <span className=\"text-status-error ml-0.5\" aria-hidden=\"true\">*</span>}\n </label>\n )\n const descriptionEl = description != null && (\n <label\n htmlFor={htmlFor}\n className={`block text-xs text-foreground-secondary mt-0.5 ${disabled ? 'opacity-50 cursor-not-allowed' : 'cursor-pointer'}`}\n >\n {description}\n </label>\n )\n\n // Compose box + label, with the description always wrapping UNDER the label.\n let content: React.ReactNode\n if (layout === 'vertical') {\n content = (\n <span className=\"flex flex-col items-start gap-1.5\">\n {labelFirst ? <>{labelText}{box}</> : <>{box}{labelText}</>}\n {descriptionEl}\n </span>\n )\n } else if (labelFirst) {\n content = (\n <span className=\"flex flex-col\">\n <span className=\"flex items-start gap-2.5\">{labelText}{box}</span>\n {descriptionEl}\n </span>\n )\n } else {\n content = (\n <span className=\"flex items-start gap-2.5\">\n {box}\n <span className=\"flex flex-col\">{labelText}{descriptionEl}</span>\n </span>\n )\n }\n\n return (\n <div className={`flex flex-col gap-1 ${className}`.trim()}>\n <div className=\"flex items-start gap-1\">\n {content}\n {helperText != null && <FieldHelpIcon text={helperText} />}\n </div>\n {hasError && <span id={errorId} className=\"text-xs text-status-error mt-0.5\">{errorMessage}</span>}\n </div>\n )\n}\n","import React, { useId } from 'react'\nimport * as RadioGroupPrimitive from '@radix-ui/react-radio-group'\nimport { Field, type FieldSize } from './_field'\n\nexport interface RadioOption {\n /** Stable value submitted / reported on change. */\n value: string\n /** Main label text. */\n label: React.ReactNode\n /** Optional secondary description rendered under the label. */\n description?: React.ReactNode\n /** Disable this option only. */\n disabled?: boolean\n}\n\nexport interface RadioGroupProps {\n /** The selectable options. */\n options: RadioOption[]\n /** Controlled selected value. */\n value?: string\n /** Uncontrolled initial value. */\n defaultValue?: string\n /** Fires when the value changes. */\n onChange?: (value: string) => void\n /** Native form field name (used for FormData serialisation). */\n name?: string\n /** Field label, placed above (vertical) or beside (horizontal) the control. */\n label?: React.ReactNode\n /**\n * Option arrangement. `'vertical'` (default) stacks options in a column;\n * `'horizontal'` lays them in a row. Named `layout` for consistency with\n * the other inputs.\n */\n layout?: 'vertical' | 'horizontal'\n /**\n * Where each option's label sits relative to its radio dot.\n * `'right'` (default) → dot then label; `'left'` → label then dot.\n */\n labelPosition?: 'left' | 'right'\n /** Size preset — controls the dot + text size. Default `'md'`. */\n size?: FieldSize\n /** Disable interaction and dim the control. */\n disabled?: boolean\n /** Show a required asterisk after the label. */\n required?: boolean\n /** Contextual help revealed via an info icon + tooltip beside the label. */\n helperText?: React.ReactNode\n /** Extra classes merged onto the field root element. */\n className?: string\n /** Validation message — shown under the control; also flags it red and sets aria-invalid. */\n errorMessage?: React.ReactNode\n}\n\nconst DOT_SIZE: Record<FieldSize, string> = {\n sm: 'h-3.5 w-3.5',\n md: 'h-4 w-4',\n lg: 'h-5 w-5',\n}\n\nconst TEXT_SIZE: Record<FieldSize, string> = {\n sm: 'text-xs',\n md: 'text-sm',\n lg: 'text-base',\n}\n\n/**\n * Radio group built on `@radix-ui/react-radio-group`. Each option can carry\n * a `description`, and options can be disabled individually. Radix handles\n * arrow-key roving focus, `role=\"radiogroup\"`, and selection semantics.\n *\n * Form-friendly: pass `name` for native form serialisation, `errorMessage`\n * for validation, `required` for the asterisk + `aria-required`.\n *\n * @example\n * ```tsx\n * <RadioGroup\n * label=\"Notification frequency\"\n * name=\"freq\"\n * value={freq}\n * onChange={setFreq}\n * options={[\n * { value: 'realtime', label: 'Real-time', description: 'Notify me immediately' },\n * { value: 'daily', label: 'Daily digest' },\n * { value: 'off', label: 'Off', disabled: true },\n * ]}\n * />\n * ```\n */\nexport default function RadioGroup({\n options,\n value,\n defaultValue,\n onChange,\n name,\n label,\n layout = 'vertical',\n labelPosition = 'right',\n size = 'md',\n disabled,\n required,\n helperText,\n className,\n errorMessage,\n}: RadioGroupProps) {\n const errorId = useId()\n const groupId = useId()\n const hasError = errorMessage != null\n const labelFirst = labelPosition === 'left'\n\n return (\n <Field className={className}\n label={label}\n htmlFor={groupId}\n errorId={errorId}\n errorMessage={errorMessage}\n required={required}\n helperText={helperText}\n >\n <RadioGroupPrimitive.Root\n id={groupId}\n name={name}\n value={value}\n defaultValue={defaultValue}\n onValueChange={onChange}\n disabled={disabled}\n required={required}\n aria-invalid={hasError || undefined}\n aria-describedby={hasError ? errorId : undefined}\n orientation={layout}\n className={layout === 'horizontal' ? 'flex flex-row flex-wrap gap-5' : 'flex flex-col gap-3'}\n >\n {options.map((opt) => {\n const itemId = `${groupId}-${opt.value}`\n const dot = (\n <RadioGroupPrimitive.Item\n id={itemId}\n value={opt.value}\n disabled={opt.disabled}\n className={[\n DOT_SIZE[size],\n 'mt-0.5 flex-shrink-0 rounded-full border bg-surface transition-colors duration-150',\n 'border-border-strong',\n 'hover:border-accent',\n 'data-[state=checked]:border-accent',\n // Border-only focus, consistent with the fields.\n 'focus:outline-none focus-visible:border-accent',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n ].join(' ')}\n >\n <RadioGroupPrimitive.Indicator className=\"flex h-full w-full items-center justify-center\">\n <span className=\"block h-1/2 w-1/2 rounded-full bg-accent\" />\n </RadioGroupPrimitive.Indicator>\n </RadioGroupPrimitive.Item>\n )\n const labelClass = [\n 'block select-none',\n opt.disabled ? 'cursor-not-allowed opacity-50' : 'cursor-pointer',\n ].join(' ')\n const labelTextEl = (\n <label htmlFor={itemId} className={labelClass}>\n <span className={`block ${TEXT_SIZE[size]} text-foreground`}>{opt.label}</span>\n </label>\n )\n const descriptionEl = opt.description ? (\n <label\n htmlFor={itemId}\n className={`block text-xs text-foreground-secondary mt-0.5 ${opt.disabled ? 'opacity-50 cursor-not-allowed' : 'cursor-pointer'}`}\n >\n {opt.description}\n </label>\n ) : null\n\n // Label-left: dot sits directly beside the label on the\n // first line, and any description wraps UNDER the label\n // (full width) — so the dot never gets pushed away by a long\n // description, and dots line up under each other.\n if (labelFirst) {\n return (\n <div key={opt.value} className=\"flex flex-col\">\n <div className=\"flex items-start gap-2.5\">\n {labelTextEl}\n {dot}\n </div>\n {descriptionEl}\n </div>\n )\n }\n // Label-right (default): dot first, then label + description.\n return (\n <div key={opt.value} className=\"flex items-start gap-2.5\">\n {dot}\n <span className=\"flex flex-col\">\n {labelTextEl}\n {descriptionEl}\n </span>\n </div>\n )\n })}\n </RadioGroupPrimitive.Root>\n </Field>\n )\n}\n","import React, { useId, useState } from 'react'\nimport * as SwitchPrimitive from '@radix-ui/react-switch'\nimport { Field } from './_field'\n\nexport interface SwitchInputProps {\n /** Controlled on/off state. */\n checked?: boolean\n /** Uncontrolled initial state. */\n defaultChecked?: boolean\n /** Fires when the value changes. */\n onChange?: (e: { target: { checked: boolean; name?: string } }) => void\n /** Thumb icon shown when on. */\n checkedIcon?: React.ReactNode\n /** Thumb icon shown when off. */\n uncheckedIcon?: React.ReactNode\n\n // ── Field-level labelling (mode 1) ──────────────────────────────────────\n /**\n * Central field label, positioned per `layout` (above in vertical, beside\n * in horizontal) — the same affordance every other input uses.\n */\n label?: React.ReactNode\n /** Label/control orientation. Default `'horizontal'`. */\n layout?: 'horizontal' | 'vertical'\n /** Contextual help revealed via an info icon + tooltip beside the label. */\n helperText?: React.ReactNode\n /** Extra classes merged onto the field root element. */\n className?: string\n\n // ── Per-state labelling (mode 2) ────────────────────────────────────────\n /** Label rendered to the left of the track, emphasised while off. */\n offLabel?: React.ReactNode\n /** Label rendered to the right of the track, emphasised while on. */\n onLabel?: React.ReactNode\n\n // ── Form participation ──────────────────────────────────────────────────\n /** Native form field name (used for FormData serialisation). */\n name?: string\n /** Show a required asterisk after the label. */\n required?: boolean\n /** Disable interaction and dim the control. */\n disabled?: boolean\n /** Validation message — shown under the control; also flags it red and sets aria-invalid. */\n errorMessage?: React.ReactNode\n}\n\n/**\n * Form switch (on/off toggle) powered by Radix Switch.\n *\n * Two labelling modes, usable together or apart:\n * - **central `label`** positioned by `layout` (the standard field label), and\n * - **per-state `offLabel` / `onLabel`** flanking the track, each emphasised\n * when its state is active (the \"Off ▮ On\" pattern).\n *\n * Form-ready: pass `name` for native serialisation (Radix emits a hidden\n * input), `errorMessage` for validation, `required` for the asterisk.\n *\n * Works controlled (`checked` + `onChange`) or uncontrolled (`defaultChecked`).\n *\n * @example\n * <Switch label=\"Email notifications\" checked={on} onChange={({ target }) => setOn(target.checked)} />\n * <Switch offLabel=\"Monthly\" onLabel=\"Yearly\" checked={yearly} onChange={...} />\n */\nexport default function Switch({\n checked,\n defaultChecked = false,\n onChange,\n checkedIcon,\n uncheckedIcon,\n label,\n layout = 'horizontal',\n helperText,\n className,\n offLabel,\n onLabel,\n name,\n required,\n disabled,\n errorMessage,\n}: SwitchInputProps) {\n const id = useId()\n const errorId = useId()\n const hasError = errorMessage != null\n\n // Controlled when `checked` is provided; otherwise track internally so the\n // per-state labels still light up correctly.\n const isControlled = checked !== undefined\n const [internal, setInternal] = useState(defaultChecked)\n const isOn = isControlled ? checked : internal\n\n const handle = (c: boolean) => {\n if (!isControlled) setInternal(c)\n onChange?.({ target: { checked: c, name } })\n }\n\n const stateLabel = (active: boolean) =>\n [\n 'text-sm select-none transition-colors',\n active ? 'text-foreground font-medium' : 'text-foreground-muted',\n disabled ? 'opacity-50' : 'cursor-pointer',\n ].filter(Boolean).join(' ')\n\n return (\n <Field className={className}\n label={label}\n htmlFor={id}\n errorId={errorId}\n errorMessage={errorMessage}\n layout={layout}\n required={required}\n helperText={helperText}\n // The switch track is short (24px); centre the label against it\n // rather than nudging down to a 36px input's first line.\n labelAlign=\"center\"\n >\n <div className=\"flex items-center gap-2.5\">\n {offLabel != null && (\n <label htmlFor={id} className={stateLabel(!isOn)}>{offLabel}</label>\n )}\n\n <SwitchPrimitive.Root\n id={id}\n name={name}\n checked={isOn}\n onCheckedChange={handle}\n disabled={disabled}\n required={required}\n aria-invalid={hasError || undefined}\n aria-describedby={hasError ? errorId : undefined}\n className=\"relative inline-flex h-6 w-11 flex-shrink-0 items-center rounded-full bg-foreground-secondary data-[state=checked]:bg-accent transition-colors focus:outline-none focus-visible:ring-[3px] focus-visible:ring-focus-ring disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n {/* Thumb is 20px inside a 24px track (2px inset each side),\n travelling 2px → 22px. Keeping the thumb SMALLER than the\n track is what makes it read as a clean pill rather than a\n bulging blob. */}\n <SwitchPrimitive.Thumb\n className=\"pointer-events-none flex h-5 w-5 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-[2px]\"\n >\n {checkedIcon && uncheckedIcon\n ? <span className=\"flex items-center justify-center w-3 h-3\">{isOn ? checkedIcon : uncheckedIcon}</span>\n : null}\n </SwitchPrimitive.Thumb>\n </SwitchPrimitive.Root>\n\n {onLabel != null && (\n <label htmlFor={id} className={stateLabel(isOn)}>{onLabel}</label>\n )}\n </div>\n </Field>\n )\n}\n","import React, { useEffect, useId, useRef, useState } from 'react'\nimport * as Popover from '@radix-ui/react-popover'\nimport LoadingSpinner from '../core/LoadingSpinner'\nimport { Field, fieldShell, type FieldSize } from './_field'\n\nexport interface AutoCompleteItem {\n key: string\n value: string\n label: string\n icon?: React.ReactNode\n}\n\nexport interface AutoCompleteProps {\n /** Disable interaction and dim the control. */\n disabled?: boolean\n /** Field label, placed above (vertical) or beside (horizontal) the control. */\n label?: React.ReactNode\n /** Placeholder shown when the field is empty. */\n placeholder?: string\n /** Native form field name (used for FormData serialisation). */\n name?: string\n /** Inline style applied to the inner input element. */\n inputStyle?: React.CSSProperties\n /** Inline style applied to the control shell. */\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 /** Fires when a suggestion is selected, with its value. */\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 /** Size preset. Default `'md'`. */\n size?: FieldSize\n /** Override the leading search icon (hidden while loading). */\n icon?: React.ReactNode\n /** Validation message — turns the field red and links via aria-describedby. */\n errorMessage?: React.ReactNode\n /** Contextual help revealed via an info icon + tooltip beside the label. */\n helperText?: React.ReactNode\n /** Extra classes merged onto the field root element. */\n className?: string\n /** Mark required (asterisk after the label). */\n required?: boolean\n /** The control id; the field label links to it for accessibility. */\n htmlFor?: 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 size = 'md',\n icon,\n errorMessage,\n helperText,\n className,\n required,\n htmlFor,\n}: AutoCompleteProps) {\n const errorId = useId()\n const hasError = errorMessage != null\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 <Field className={className}\n label={label}\n htmlFor={htmlFor}\n errorId={errorId}\n errorMessage={errorMessage} helperText={helperText}\n layout={layout}\n required={required}\n >\n <Popover.Root open={open && !disabled} onOpenChange={(o) => !disabled && setOpen(o)}>\n <Popover.Anchor asChild>\n <div className={`flex items-center ${fieldShell({ size, hasError, disabled, focusWithin: true })}`} style={style}>\n <input\n id={htmlFor}\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=\"min-w-0 flex-1 bg-transparent outline-none disabled:cursor-not-allowed placeholder:text-foreground-muted\"\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 aria-invalid={hasError || undefined}\n aria-describedby={hasError ? errorId : undefined}\n />\n {loading ? (\n <span className=\"ml-2 w-4 h-4 flex-shrink-0 flex items-center justify-center text-accent\" aria-hidden=\"true\">\n <LoadingSpinner inline size=\"xs\" spinnerColor=\"currentColor\" />\n </span>\n ) : (\n <span className=\"ml-2 flex-shrink-0 text-foreground-muted\">\n {icon ?? (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"w-4 h-4\" 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 </span>\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 </Field>\n )\n}\n","import React, { useEffect, useId, useMemo, useRef, useState } from 'react'\nimport * as Popover from '@radix-ui/react-popover'\nimport { fieldShell, Field, type FieldSize } from './_field'\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 /** Field label, placed above (vertical) or beside (horizontal) the control. */\n label?: React.ReactNode\n /** Placeholder shown when the field is empty. */\n placeholder?: string\n /** Form control id linkage. */\n htmlFor?: string\n /** Native form field name (used for FormData serialisation). */\n name?: string\n /** Label/trigger orientation. Defaults to `'horizontal'`. */\n layout?: 'horizontal' | 'vertical'\n /** Contextual help revealed via an info icon + tooltip beside the label. */\n helperText?: React.ReactNode\n /** Extra classes merged onto the field root element. */\n className?: string\n /** Show a required asterisk after the label. */\n required?: boolean\n /** Disable interaction and dim the control. */\n disabled?: boolean\n /** Validation message — shown under the control; also flags it red and sets aria-invalid. */\n errorMessage?: React.ReactNode\n /** Inline style applied to the control shell. */\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 /** Size preset. Default `'md'`. */\n size?: FieldSize\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 helperText,\n className,\n required,\n errorMessage,\n style,\n htmlFor,\n items = [],\n placeholder = 'Select…',\n parentsSelectable = true,\n defaultExpandedKeys = [],\n size = 'md',\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 <Field className={className}\n label={label}\n htmlFor={htmlFor}\n errorId={errorId}\n errorMessage={errorMessage}\n layout={layout}\n required={required}\n helperText={helperText}\n >\n <div>\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 cursor-pointer select-none ${!style?.width ? 'min-w-[240px]' : ''} ${fieldShell({ size, hasError, disabled })}`}\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 </Field>\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, { useId, useRef, useState } from 'react'\nimport { Field } from './_field'\n\nexport interface FileInputProps {\n /** Allow selecting more than one file. */\n allowMultiple?: boolean\n /** Fires when the value changes. */\n onChange?: (e: { target: { files: File[]; name?: string; id?: string; value?: string } }) => void\n /** Native form field name (used for FormData serialisation). */\n name?: string\n /** The control id; the field label links to it for accessibility. */\n htmlFor?: string\n /** Field label, placed above (vertical) or beside (horizontal) the control. */\n label?: React.ReactNode\n /** Accepted MIME types / extensions, e.g. `'.xlsx,application/pdf'`. */\n accept?: string\n /** Primary call-to-action copy. Default `'Click to upload or drag and drop'`. */\n prompt?: React.ReactNode\n /** Secondary hint under the prompt — typically the accepted types / max size. */\n hint?: React.ReactNode\n /** Maximum file size in bytes. Files above this are rejected with an error. */\n maxSize?: number\n /** Validation message — shown under the control; also flags it red and sets aria-invalid. */\n errorMessage?: React.ReactNode\n /** Contextual help revealed via an info icon + tooltip beside the label. */\n helperText?: React.ReactNode\n /** Extra classes merged onto the field root element. */\n className?: string\n /** Disable interaction and dim the control. */\n disabled?: boolean\n /** Show a required asterisk after the label. */\n required?: boolean\n /** Override the upload glyph in the empty state. */\n icon?: React.ReactNode\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B'\n const units = ['B', 'KB', 'MB', 'GB']\n const i = Math.floor(Math.log(bytes) / Math.log(1024))\n return `${(bytes / Math.pow(1024, i)).toFixed(i === 0 ? 0 : 1)} ${units[i]}`\n}\n\nconst UploadGlyph = (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.5} className=\"w-6 h-6\" aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 16V4m0 0L8 8m4-4l4 4M4 16v2a2 2 0 002 2h12a2 2 0 002-2v-2\" />\n </svg>\n)\n\nconst FileGlyph = (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.5} className=\"w-5 h-5\" aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M14 3v4a1 1 0 001 1h4M5 3h9l5 5v11a2 2 0 01-2 2H5a2 2 0 01-2-2V5a2 2 0 012-2z\" />\n </svg>\n)\n\n/**\n * Drag-and-drop file input with an enterprise dropzone aesthetic: a calm\n * dashed surface with a contained icon badge, primary + secondary copy, an\n * accent-tinted drag-over state, and selected files shown as horizontal chips\n * with name + size and a remove button.\n *\n * Keyboard-accessible (the dropzone is a `role=\"button\"` activatable via\n * Enter / Space) and form-friendly (`errorMessage`, `required`, `name`).\n *\n * @example\n * ```tsx\n * <FileInput\n * label=\"Crew manifest\"\n * accept=\".xlsx,.csv\"\n * hint=\"XLSX or CSV, up to 5 MB\"\n * maxSize={5 * 1024 * 1024}\n * onChange={(e) => setFile(e.target.files[0])}\n * />\n * ```\n */\nexport default function FileInput({\n allowMultiple = false,\n onChange,\n name,\n htmlFor,\n label,\n accept,\n prompt = 'Click to upload or drag and drop',\n hint,\n maxSize,\n errorMessage,\n helperText,\n className,\n disabled,\n required,\n icon,\n}: FileInputProps) {\n const inputRef = useRef<HTMLInputElement>(null)\n const errorId = useId()\n const [files, setFiles] = useState<File[]>([])\n const [dragging, setDragging] = useState(false)\n const [sizeError, setSizeError] = useState<string | null>(null)\n\n const effectiveError = errorMessage ?? sizeError ?? undefined\n\n const openPicker = () => { if (!disabled) inputRef.current?.click() }\n\n const commit = (list: File[]) => {\n if (maxSize != null) {\n const tooBig = list.find((f) => f.size > maxSize)\n if (tooBig) {\n setSizeError(`\"${tooBig.name}\" exceeds the ${formatBytes(maxSize)} limit`)\n return\n }\n }\n setSizeError(null)\n setFiles(list)\n onChange?.({ target: { files: list, name, id: htmlFor ?? name } })\n }\n\n const onDrop = (e: React.DragEvent) => {\n e.preventDefault()\n setDragging(false)\n if (disabled) return\n const dropped = Array.from(e.dataTransfer.files ?? [])\n commit(allowMultiple ? dropped : dropped.slice(0, 1))\n }\n\n const removeFile = (idx: number) => {\n const next = files.filter((_, i) => i !== idx)\n setFiles(next)\n setSizeError(null)\n onChange?.({ target: { files: next, name, id: htmlFor ?? name, value: '' } })\n if (next.length === 0 && inputRef.current) inputRef.current.value = ''\n }\n\n return (\n <Field className={className}\n label={label}\n htmlFor={htmlFor}\n errorId={errorId}\n errorMessage={effectiveError} helperText={helperText}\n required={required}\n >\n <div\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-label={typeof prompt === 'string' ? prompt : 'Upload file'}\n aria-disabled={disabled || undefined}\n aria-invalid={effectiveError != null || undefined}\n aria-describedby={effectiveError != null ? errorId : undefined}\n onClick={openPicker}\n onKeyDown={(e) => {\n if (disabled) return\n if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); openPicker() }\n }}\n onDragOver={(e) => { e.preventDefault(); if (!disabled) setDragging(true) }}\n onDragLeave={() => setDragging(false)}\n onDrop={onDrop}\n className={[\n 'group flex flex-col items-center justify-center gap-3 w-full rounded-xl border border-dashed px-6 py-8 text-center',\n 'transition-colors duration-150 focus:outline-none focus-visible:ring-[3px] focus-visible:ring-focus-ring',\n disabled\n ? 'border-border bg-surface-raised cursor-not-allowed opacity-60'\n : effectiveError != null\n ? 'border-status-error bg-surface cursor-pointer'\n : dragging\n ? 'border-accent bg-surface-raised cursor-copy'\n : 'border-border bg-surface hover:border-border-strong cursor-pointer',\n ].join(' ')}\n >\n <input\n id={htmlFor ?? name}\n name={name}\n onChange={(e) => commit(Array.from(e.target.files ?? []))}\n ref={inputRef}\n hidden\n type=\"file\"\n accept={accept}\n multiple={allowMultiple}\n disabled={disabled}\n />\n\n {/* Icon badge — a contained surface, not a giant raw glyph. */}\n <span\n className={[\n 'flex h-11 w-11 items-center justify-center rounded-full transition-colors duration-150',\n dragging ? 'bg-accent text-accent-fg' : 'bg-surface-raised text-foreground-secondary group-hover:text-foreground',\n ].join(' ')}\n >\n {icon ?? UploadGlyph}\n </span>\n\n <div className=\"space-y-0.5\">\n <div className=\"text-sm font-medium text-foreground\">\n {dragging ? 'Drop to upload' : prompt}\n </div>\n {hint && <div className=\"text-xs text-foreground-muted\">{hint}</div>}\n </div>\n </div>\n\n {/* Selected file chips */}\n {files.length > 0 && (\n <ul className=\"mt-3 flex flex-col gap-2\">\n {files.map((file, idx) => (\n <li\n key={`${idx}-${file.name}`}\n className=\"flex items-center gap-3 rounded-lg border border-border bg-surface px-3 py-2\"\n >\n <span className=\"flex-shrink-0 text-foreground-muted\">{FileGlyph}</span>\n <span className=\"flex-1 min-w-0\">\n <span className=\"block text-sm text-foreground truncate\">{file.name}</span>\n <span className=\"block text-xs text-foreground-muted\">{formatBytes(file.size)}</span>\n </span>\n <button\n type=\"button\"\n onClick={(e) => { e.stopPropagation(); removeFile(idx) }}\n aria-label={`Remove ${file.name}`}\n className=\"flex-shrink-0 w-7 h-7 inline-flex items-center justify-center rounded-md text-foreground-muted hover:text-status-error hover:bg-surface-raised 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.75\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n </li>\n ))}\n </ul>\n )}\n </Field>\n )\n}\n","import React, { useEffect, useId, useMemo, useRef, useState } from 'react'\nimport * as Popover from '@radix-ui/react-popover'\nimport { fieldShell, FieldLabel, type FieldSize } from './_field'\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 /** Field label, placed above (vertical) or beside (horizontal) the control. */\n label?: React.ReactNode\n /** Text shown in the trigger when no date is selected. Default `\"Select a date…\"`. */\n placeholder?: string\n /** The control id; the field label links to it for accessibility. */\n htmlFor?: string\n /** Native form field name (used for FormData serialisation). */\n name?: string\n /** Label/trigger orientation. Defaults to `'horizontal'`. */\n layout?: 'horizontal' | 'vertical'\n /** Contextual help revealed via an info icon + tooltip beside the label. */\n helperText?: React.ReactNode\n /** Show a required asterisk after the label. */\n required?: boolean\n /** Disable interaction and dim the control. */\n disabled?: boolean\n /** Validation message — shown under the control; also flags it red and sets aria-invalid. */\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 /** Inline style applied to the control shell. */\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 /** Size preset. Default `'md'`. */\n size?: FieldSize\n /** Extra classes merged onto the component root. */\n className?: string\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 helperText,\n required,\n disabled,\n errorMessage,\n min,\n max,\n style,\n format = defaultFormat,\n weekStartsOn = 0,\n clearable = true,\n size = 'md',\n className = '',\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 ${className}`.trim()}>\n <div className={`flex ${layout === 'vertical' ? 'flex-col gap-1.5' : 'flex-row items-start gap-3'}`}>\n <FieldLabel\n label={label}\n htmlFor={htmlFor}\n required={required}\n helperText={helperText}\n horizontal={layout === 'horizontal'}\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 cursor-pointer select-none ${!style?.width ? 'min-w-[200px]' : ''} ${fieldShell({ size, hasError, disabled })}`}\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","import React, { useId, useLayoutEffect, useRef } from 'react'\nimport { Field, fieldShell, type FieldSize } from './_field'\n\nexport interface TextAreaProps {\n /** Controlled value. */\n value?: string\n /** Fires when the value changes. */\n onChange?: React.ChangeEventHandler<HTMLTextAreaElement>\n /** Blur handler — useful for touched/validation timing. */\n onBlur?: React.FocusEventHandler<HTMLTextAreaElement>\n /** Disable interaction and dim the control. */\n disabled?: boolean\n /** Field label, placed above (vertical) or beside (horizontal) the control. */\n label?: React.ReactNode\n /** The control id; the field label links to it for accessibility. */\n htmlFor?: string\n /** Placeholder shown when the field is empty. */\n placeholder?: string\n /** Native form field name (used for FormData serialisation). */\n name?: string\n /** Label/control orientation. Default `'vertical'`. */\n layout?: 'horizontal' | 'vertical'\n /** Size preset — controls text size + padding. Default `'md'`. */\n size?: FieldSize\n /** Visible rows when not auto-growing. Default `4`. */\n rows?: number\n /**\n * Grow the textarea to fit its content instead of scrolling. When set, the\n * field expands between `rows` (min) and `maxRows` (cap, then scrolls).\n */\n autoGrow?: boolean\n /** Max rows when `autoGrow` is on. Default `12`. */\n maxRows?: number\n /** Native maxlength. When set with `showCount`, a live counter renders. */\n maxLength?: number\n /** Show a character counter (uses `maxLength` as the denominator if present). */\n showCount?: boolean\n /** CSS `resize` behaviour. Default `'vertical'` (or `'none'` when autoGrow). */\n resize?: 'none' | 'vertical' | 'horizontal' | 'both'\n /** Validation message — shown under the control; also flags it red and sets aria-invalid. */\n errorMessage?: React.ReactNode\n /** Contextual help revealed via an info icon + tooltip beside the label. */\n helperText?: React.ReactNode\n /** Extra classes merged onto the field root element. */\n className?: string\n /** Show a required asterisk after the label. */\n required?: boolean\n /** Inline style applied to the control shell. */\n style?: React.CSSProperties\n /** Inline style applied to the inner input element. */\n inputStyle?: React.CSSProperties\n}\n\nconst LINE_HEIGHT_PX = 21 // ~1.5 × 14px body text\n\n/**\n * Multi-line text input on the shared field foundation. Optional auto-grow\n * (expands with content between `rows` and `maxRows`), character counter, and\n * resize control. Same refined Halo Focus and error handling as the other\n * inputs.\n *\n * @example\n * ```tsx\n * <TextArea label=\"Notes\" value={notes} onChange={(e) => setNotes(e.target.value)} autoGrow />\n * ```\n *\n * @example With counter\n * ```tsx\n * <TextArea label=\"Bio\" maxLength={280} showCount value={bio} onChange={onChange} />\n * ```\n */\nexport default function TextArea({\n value,\n onChange,\n onBlur,\n disabled,\n label,\n htmlFor,\n placeholder,\n name,\n layout = 'vertical',\n size = 'md',\n rows = 4,\n autoGrow = false,\n maxRows = 12,\n maxLength,\n showCount = false,\n resize,\n errorMessage,\n helperText,\n className,\n required,\n style,\n inputStyle,\n}: TextAreaProps) {\n const errorId = useId()\n const hasError = errorMessage != null\n const ref = useRef<HTMLTextAreaElement>(null)\n\n // Auto-grow: recompute height on value change, clamped to maxRows.\n useLayoutEffect(() => {\n if (!autoGrow) return\n const el = ref.current\n if (!el) return\n el.style.height = 'auto'\n const maxH = maxRows * LINE_HEIGHT_PX + 16 // + vertical padding\n el.style.height = `${Math.min(el.scrollHeight, maxH)}px`\n el.style.overflowY = el.scrollHeight > maxH ? 'auto' : 'hidden'\n }, [value, autoGrow, maxRows])\n\n const count = typeof value === 'string' ? value.length : 0\n const resizeClass =\n (resize ?? (autoGrow ? 'none' : 'vertical')) === 'none' ? 'resize-none'\n : (resize ?? 'vertical') === 'horizontal' ? 'resize-x'\n : (resize ?? 'vertical') === 'both' ? 'resize'\n : 'resize-y'\n\n return (\n <Field className={className}\n label={label}\n htmlFor={htmlFor}\n errorId={errorId}\n errorMessage={errorMessage} helperText={helperText}\n layout={layout}\n required={required}\n >\n <textarea\n ref={ref}\n disabled={disabled}\n value={value}\n onChange={onChange}\n onBlur={onBlur}\n name={name}\n id={htmlFor}\n rows={rows}\n maxLength={maxLength}\n placeholder={placeholder ?? ''}\n aria-invalid={hasError || undefined}\n aria-describedby={hasError ? errorId : undefined}\n className={`${fieldShell({ size, hasError, disabled, sized: false })} px-3 py-2 leading-normal ${resizeClass}`}\n style={{ ...style, ...inputStyle }}\n />\n {showCount && (\n <div className=\"mt-1 text-right text-xs text-foreground-muted tabular-nums\">\n {maxLength != null ? `${count} / ${maxLength}` : count}\n </div>\n )}\n </Field>\n )\n}\n","import React, { useId, useState } from 'react'\nimport * as ToggleGroup from '@radix-ui/react-toggle-group'\nimport { Field, type FieldSize } from './_field'\n\nexport interface SegmentedOption {\n value: string\n label: React.ReactNode\n icon?: React.ReactNode\n disabled?: boolean\n}\n\nexport interface SegmentedControlProps {\n /** The selectable options. */\n options: SegmentedOption[]\n /** Controlled selected value. */\n value?: string\n /** Uncontrolled initial value. */\n defaultValue?: string\n /** Fires when the value changes. */\n onChange?: (value: string) => void\n /** Size preset. Default `'md'`. */\n size?: FieldSize\n /** Stretch to fill the container, segments share the width equally. */\n fullWidth?: boolean\n /** Disable interaction and dim the control. */\n disabled?: boolean\n\n // ── Field participation ─────────────────────────────────────────────────\n /** Optional label, positioned per `layout`. */\n label?: React.ReactNode\n /** Label/control orientation. Default `'vertical'`. */\n layout?: 'horizontal' | 'vertical'\n /** Contextual help revealed via an info icon + tooltip beside the label. */\n helperText?: React.ReactNode\n /** Extra classes merged onto the field root element. */\n className?: string\n /** Native form field name (emits a hidden input carrying the value). */\n name?: string\n /** Show a required asterisk after the label. */\n required?: boolean\n /** Validation message — shown under the control; also flags it red and sets aria-invalid. */\n errorMessage?: React.ReactNode\n /** Accessible label for the control. */\n 'aria-label'?: string\n}\n\nconst SIZE: Record<FieldSize, { h: string; text: string; pad: string }> = {\n sm: { h: 'h-control-sm', text: 'text-xs', pad: 'px-2.5' },\n md: { h: 'h-control-md', text: 'text-sm', pad: 'px-3.5' },\n lg: { h: 'h-control-lg', text: 'text-sm', pad: 'px-4' },\n}\n\n/**\n * Text-first segmented control for 2 to 4 mutually exclusive options\n * (view switchers, billing period, density). Built on\n * `@radix-ui/react-toggle-group` (single, non-deselectable) so arrow-key\n * roving focus comes for free.\n *\n * The selected segment lifts onto a surface-white \"pill\" inside a tinted\n * track, the macOS / iOS segmented-control pattern, rendered with the\n * system's tight radii and accent-colored active text.\n *\n * Form-ready: optional `label` (positioned via `layout`), `helperText`,\n * `errorMessage`, and a hidden input emitted when `name` is set.\n *\n * @example\n * ```tsx\n * <SegmentedControl\n * label=\"View\"\n * value={view}\n * onChange={setView}\n * options={[\n * { value: 'list', label: 'List' },\n * { value: 'board', label: 'Board' },\n * { value: 'calendar', label: 'Calendar' },\n * ]}\n * />\n * ```\n */\nexport default function SegmentedControl({\n options,\n value,\n defaultValue,\n onChange,\n size = 'md',\n fullWidth = false,\n disabled,\n label,\n layout = 'vertical',\n helperText,\n className,\n name,\n required,\n errorMessage,\n 'aria-label': ariaLabel,\n}: SegmentedControlProps) {\n const sz = SIZE[size]\n const groupId = useId()\n const errorId = useId()\n const hasError = errorMessage != null\n\n // Mirror the value internally so the hidden form input (and uncontrolled\n // usage) reflect the current selection.\n const isControlled = value !== undefined\n const [internal, setInternal] = useState(defaultValue)\n const current = isControlled ? value : internal\n\n const handle = (v: string) => {\n if (!v) return\n if (!isControlled) setInternal(v)\n onChange?.(v)\n }\n\n return (\n <Field className={className}\n label={label}\n htmlFor={groupId}\n errorId={errorId}\n errorMessage={errorMessage}\n layout={layout}\n required={required}\n helperText={helperText}\n >\n {name && <input type=\"hidden\" name={name} value={current ?? ''} />}\n <ToggleGroup.Root\n id={groupId}\n type=\"single\"\n value={current}\n onValueChange={handle}\n disabled={disabled}\n aria-label={ariaLabel ?? (typeof label === 'string' ? label : undefined)}\n aria-invalid={hasError || undefined}\n aria-describedby={hasError ? errorId : undefined}\n className={[\n 'inline-flex items-center gap-1 rounded-lg border bg-surface-raised p-1',\n hasError ? 'border-status-error' : 'border-border',\n sz.h,\n fullWidth ? 'flex w-full' : 'w-fit',\n disabled ? 'opacity-60 cursor-not-allowed' : '',\n ].filter(Boolean).join(' ')}\n >\n {options.map((opt) => (\n <ToggleGroup.Item\n key={opt.value}\n value={opt.value}\n disabled={opt.disabled}\n className={[\n 'inline-flex items-center justify-center gap-1.5 rounded-md select-none whitespace-nowrap',\n 'transition-colors duration-150 h-full',\n sz.text,\n sz.pad,\n fullWidth ? 'flex-1' : '',\n // Resting: muted text, transparent. Hover lifts the text.\n 'text-foreground-secondary hover:text-foreground',\n // Active: surface-white pill + accent text + subtle shadow.\n 'data-[state=on]:bg-surface data-[state=on]:text-accent data-[state=on]:shadow-sm',\n 'focus:outline-none focus-visible:ring-[3px] focus-visible:ring-focus-ring',\n 'disabled:opacity-40 disabled:cursor-not-allowed',\n ].filter(Boolean).join(' ')}\n >\n {opt.icon && <span className=\"flex-shrink-0\">{opt.icon}</span>}\n {opt.label}\n </ToggleGroup.Item>\n ))}\n </ToggleGroup.Root>\n </Field>\n )\n}\n","import React, { useId, useState } from 'react'\nimport * as SliderPrimitive from '@radix-ui/react-slider'\nimport { Field, FieldHelpIcon, type FieldSize } from './_field'\n\n/**\n * Slider value. A single number for a one-thumb slider, or a `[min, max]`\n * tuple for a two-thumb range slider. The shape you pass determines the mode.\n */\nexport type SliderValue = number | [number, number]\n\nexport interface SliderMark {\n value: number\n label?: React.ReactNode\n}\n\nexport interface SliderProps {\n /** Controlled value. */\n value?: SliderValue\n /** Uncontrolled initial value. */\n defaultValue?: SliderValue\n /** Fires when the value changes. */\n onChange?: (value: SliderValue) => void\n /** Fired once at the end of a drag/keyboard interaction. */\n onChangeEnd?: (value: SliderValue) => void\n /** Minimum allowed value. */\n min?: number\n /** Maximum allowed value. */\n max?: number\n /** Step increment between values. */\n step?: number\n /** Field label, placed above (vertical) or beside (horizontal) the control. */\n label?: React.ReactNode\n /** Show the current value(s) next to the label. */\n showValue?: boolean\n /** Format the displayed value (tooltip + value readout). */\n formatValue?: (n: number) => string\n /** Tick marks under the track. */\n marks?: SliderMark[]\n /** Show a value tooltip above the thumb while dragging. */\n tooltip?: boolean\n /** Size preset — controls height, padding, and font. Default 'md'. */\n size?: FieldSize\n /** Disable interaction and dim the control. */\n disabled?: boolean\n /** Validation message — shown under the control; also flags it red and sets aria-invalid. */\n errorMessage?: React.ReactNode\n /** Contextual help revealed via an info icon + tooltip beside the label. */\n helperText?: React.ReactNode\n /** Extra classes merged onto the field root element. */\n className?: string\n /** Show a required asterisk after the label. */\n required?: boolean\n /** Native form field name (used for FormData serialisation). */\n name?: string\n /** The control id; the field label links to it for accessibility. */\n htmlFor?: string\n}\n\nconst TRACK_H: Record<FieldSize, string> = { sm: 'h-1', md: 'h-1.5', lg: 'h-2' }\nconst THUMB: Record<FieldSize, string> = { sm: 'h-3.5 w-3.5', md: 'h-4 w-4', lg: 'h-5 w-5' }\n\nconst toArray = (v: SliderValue | undefined): number[] | undefined =>\n v == null ? undefined : Array.isArray(v) ? v : [v]\n\n/**\n * Range slider on `@radix-ui/react-slider`. Pass a single number for a\n * one-thumb slider or a `[min, max]` tuple for a two-thumb range. Optional\n * tick marks, a drag tooltip, and a value readout beside the label.\n *\n * @example Single\n * ```tsx\n * <Slider label=\"Volume\" value={vol} onChange={(v) => setVol(v as number)} showValue />\n * ```\n *\n * @example Range with marks\n * ```tsx\n * <Slider\n * label=\"Price\"\n * value={[20, 80]}\n * onChange={(v) => setRange(v as [number, number])}\n * marks={[{ value: 0, label: '$0' }, { value: 50, label: '$50' }, { value: 100, label: '$100' }]}\n * tooltip\n * />\n * ```\n */\nexport default function Slider({\n value,\n defaultValue,\n onChange,\n onChangeEnd,\n min = 0,\n max = 100,\n step = 1,\n label,\n showValue = false,\n formatValue = (n) => String(n),\n marks,\n tooltip = false,\n size = 'md',\n disabled,\n errorMessage,\n helperText,\n className,\n required,\n name,\n htmlFor,\n}: SliderProps) {\n const errorId = useId()\n const hasError = errorMessage != null\n const isRange = Array.isArray(value ?? defaultValue)\n\n // Track the live value for the tooltip / readout even in uncontrolled mode.\n const [internal, setInternal] = useState<number[]>(\n () => toArray(value) ?? toArray(defaultValue) ?? [min],\n )\n const current = toArray(value) ?? internal\n const [dragging, setDragging] = useState(false)\n\n const emit = (arr: number[]) => {\n setInternal(arr)\n const next: SliderValue = isRange ? [arr[0], arr[1]] : arr[0]\n onChange?.(next)\n }\n\n const valueText = current.map(formatValue).join(' – ')\n\n return (\n <Field className={className} label={undefined} errorId={errorId} errorMessage={errorMessage}>\n {(label || showValue) && (\n <div className=\"flex items-center justify-between mb-2\">\n {label && (\n <span className=\"flex items-center gap-1\">\n <label htmlFor={htmlFor} className=\"text-sm font-medium text-foreground select-none\">\n {label}\n {required && <span className=\"text-status-error ml-0.5\" aria-hidden=\"true\">*</span>}\n </label>\n {helperText != null && <FieldHelpIcon text={helperText} />}\n </span>\n )}\n {showValue && (\n <span className=\"text-sm text-foreground-secondary tabular-nums\">{valueText}</span>\n )}\n </div>\n )}\n\n <SliderPrimitive.Root\n id={htmlFor}\n name={name}\n value={toArray(value)}\n defaultValue={toArray(defaultValue)}\n min={min}\n max={max}\n step={step}\n disabled={disabled}\n aria-invalid={hasError || undefined}\n aria-describedby={hasError ? errorId : undefined}\n onValueChange={(v) => { emit(v); setDragging(true) }}\n onValueCommit={(v) => {\n setDragging(false)\n onChangeEnd?.(isRange ? [v[0], v[1]] : v[0])\n }}\n className=\"relative flex items-center select-none touch-none w-full h-5\"\n >\n <SliderPrimitive.Track className={`relative grow rounded-full bg-surface-raised border border-border ${TRACK_H[size]}`}>\n <SliderPrimitive.Range className=\"absolute h-full rounded-full bg-accent\" />\n </SliderPrimitive.Track>\n {current.map((_, i) => (\n <SliderPrimitive.Thumb\n key={i}\n className={`group relative block ${THUMB[size]} rounded-full border-2 border-accent bg-surface shadow-sm transition-shadow\n focus:outline-none focus-visible:ring-[3px] focus-visible:ring-focus-ring\n disabled:cursor-not-allowed`}\n >\n {tooltip && (\n <span\n className={`pointer-events-none absolute -top-8 left-1/2 -translate-x-1/2 rounded-md bg-foreground px-1.5 py-0.5 text-xs text-background tabular-nums whitespace-nowrap transition-opacity ${\n dragging ? 'opacity-100' : 'opacity-0 group-hover:opacity-100 group-focus-visible:opacity-100'\n }`}\n >\n {formatValue(current[i])}\n </span>\n )}\n </SliderPrimitive.Thumb>\n ))}\n </SliderPrimitive.Root>\n\n {marks && marks.length > 0 && (\n <div className=\"relative mt-2 h-4\">\n {marks.map((m) => {\n const pct = ((m.value - min) / (max - min)) * 100\n return (\n <span\n key={m.value}\n className=\"absolute -translate-x-1/2 text-xs text-foreground-muted tabular-nums\"\n style={{ left: `${pct}%` }}\n >\n {m.label ?? m.value}\n </span>\n )\n })}\n </div>\n )}\n </Field>\n )\n}\n","import React, { useId, useRef, useState } from 'react'\nimport { Field, fieldShell, type FieldSize } from './_field'\nimport Tag from './_tag'\n\nexport interface TagsInputProps {\n /** Controlled list of tags. */\n value?: string[]\n /** Uncontrolled initial tags. */\n defaultValue?: string[]\n /** Fires when the value changes. */\n onChange?: (tags: string[]) => void\n /** Field label, placed above (vertical) or beside (horizontal) the control. */\n label?: React.ReactNode\n /** The control id; the field label links to it for accessibility. */\n htmlFor?: string\n /** Native form field name (used for FormData serialisation). */\n name?: string\n /** Placeholder shown when the field is empty. */\n placeholder?: string\n /** Label/control orientation: 'horizontal' or 'vertical'. */\n layout?: 'horizontal' | 'vertical'\n /** Size preset — controls height, padding, and font. Default 'md'. */\n size?: FieldSize\n /** Disable interaction and dim the control. */\n disabled?: boolean\n /** Validation message — shown under the control; also flags it red and sets aria-invalid. */\n errorMessage?: React.ReactNode\n /** Contextual help revealed via an info icon + tooltip beside the label. */\n helperText?: React.ReactNode\n /** Extra classes merged onto the field root element. */\n className?: string\n /** Show a required asterisk after the label. */\n required?: boolean\n /** Maximum number of tags. Further input is ignored once reached. */\n maxTags?: number\n /** Reject duplicate tags (case-insensitive). Default `true`. */\n dedupe?: boolean\n /**\n * Validate a candidate tag before adding. Return `false` (or a string error\n * to surface) to reject. Receives the trimmed candidate + current tags.\n */\n validate?: (tag: string, tags: string[]) => boolean | string\n /** Characters that commit the current input as a tag. Default Enter + comma. */\n separators?: string[]\n}\n\n/**\n * Free-text entry that produces removable tag chips, distinct from Dropdown\n * (which picks from a fixed list). Type and press Enter or comma to add;\n * Backspace on an empty field removes the last tag; pasting a delimited string\n * splits into multiple tags. Optional dedupe, max-count, and per-tag validation.\n *\n * @example\n * ```tsx\n * <TagsInput label=\"Recipients\" value={emails} onChange={setEmails}\n * validate={(t) => /.+@.+\\..+/.test(t) || 'Not a valid email'} />\n * ```\n */\nexport default function TagsInput({\n value,\n defaultValue,\n onChange,\n label,\n htmlFor,\n name,\n placeholder = 'Add and press Enter',\n layout = 'vertical',\n size = 'md',\n disabled,\n errorMessage,\n helperText,\n className,\n required,\n maxTags,\n dedupe = true,\n validate,\n separators = ['Enter', ','],\n}: TagsInputProps) {\n const errorId = useId()\n const inputRef = useRef<HTMLInputElement>(null)\n const [internal, setInternal] = useState<string[]>(defaultValue ?? [])\n const [draft, setDraft] = useState('')\n const [localError, setLocalError] = useState<string | null>(null)\n\n const tags = value ?? internal\n const hasError = errorMessage != null || localError != null\n const errorText = errorMessage ?? localError ?? undefined\n\n const commitTags = (next: string[]) => {\n setInternal(next)\n onChange?.(next)\n }\n\n const addTag = (raw: string): boolean => {\n const tag = raw.trim()\n if (!tag) return false\n if (maxTags != null && tags.length >= maxTags) return false\n if (dedupe && tags.some((t) => t.toLowerCase() === tag.toLowerCase())) {\n setLocalError(`\"${tag}\" is already added`)\n return false\n }\n if (validate) {\n const res = validate(tag, tags)\n if (res !== true) {\n setLocalError(typeof res === 'string' ? res : `\"${tag}\" is not valid`)\n return false\n }\n }\n setLocalError(null)\n commitTags([...tags, tag])\n return true\n }\n\n const removeTag = (idx: number) => {\n commitTags(tags.filter((_, i) => i !== idx))\n setLocalError(null)\n }\n\n const onKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (separators.includes(e.key)) {\n e.preventDefault()\n if (addTag(draft)) setDraft('')\n } else if (e.key === 'Backspace' && draft === '' && tags.length > 0) {\n removeTag(tags.length - 1)\n }\n }\n\n const onPaste = (e: React.ClipboardEvent<HTMLInputElement>) => {\n const text = e.clipboardData.getData('text')\n // Split paste on commas / newlines / semicolons; if it yields multiple\n // parts, add them all and prevent the raw paste.\n const parts = text.split(/[\\n,;]+/).map((p) => p.trim()).filter(Boolean)\n if (parts.length > 1) {\n e.preventDefault()\n let added = false\n for (const p of parts) added = addTag(p) || added\n if (added) setDraft('')\n }\n }\n\n const atMax = maxTags != null && tags.length >= maxTags\n\n return (\n <Field className={className}\n label={label}\n htmlFor={htmlFor}\n errorId={errorId}\n errorMessage={errorText} helperText={helperText}\n layout={layout}\n required={required}\n >\n <div\n className={`flex flex-wrap items-center gap-1.5 min-h-[36px] ${fieldShell({ size, hasError, disabled, focusWithin: true, sized: false })} px-2 py-1.5`}\n onClick={() => inputRef.current?.focus()}\n >\n {tags.map((tag, idx) => (\n <Tag\n key={`${tag}-${idx}`}\n disabled={disabled}\n removeLabel={`Remove ${tag}`}\n onRemove={() => removeTag(idx)}\n >\n {tag}\n </Tag>\n ))}\n <input\n ref={inputRef}\n id={htmlFor}\n name={name}\n disabled={disabled || atMax}\n value={draft}\n onChange={(e) => { setDraft(e.target.value); if (localError) setLocalError(null) }}\n onKeyDown={onKeyDown}\n onPaste={onPaste}\n onBlur={() => { if (addTag(draft)) setDraft('') }}\n placeholder={atMax ? '' : (tags.length === 0 ? placeholder : '')}\n aria-invalid={hasError || undefined}\n aria-describedby={hasError ? errorId : undefined}\n autoComplete=\"off\"\n className=\"flex-1 min-w-[6rem] bg-transparent outline-none text-sm placeholder:text-foreground-muted disabled:cursor-not-allowed\"\n />\n </div>\n </Field>\n )\n}\n","import React, { useId, useRef } from 'react'\nimport { Field, type FieldSize } from './_field'\n\nexport interface OtpInputProps {\n /** Number of code boxes. Default `6`. */\n length?: number\n /** Controlled value. */\n value?: string\n /** Fires when the value changes. */\n onChange?: (code: string) => void\n /** Fired when every box is filled. */\n onComplete?: (code: string) => void\n /** Field label, placed above (vertical) or beside (horizontal) the control. */\n label?: React.ReactNode\n /** The control id; the field label links to it for accessibility. */\n htmlFor?: string\n /** Native form field name (used for FormData serialisation). */\n name?: string\n /** `'numeric'` (default) restricts to digits; `'alphanumeric'` allows letters too. */\n mode?: 'numeric' | 'alphanumeric'\n /** Render boxes as masked dots (for PIN entry). */\n masked?: boolean\n /** Size preset — controls height, padding, and font. Default 'md'. */\n size?: FieldSize\n /** Disable interaction and dim the control. */\n disabled?: boolean\n /** Validation message — shown under the control; also flags it red and sets aria-invalid. */\n errorMessage?: React.ReactNode\n /** Show a required asterisk after the label. */\n required?: boolean\n /** Label/control orientation. Default `'vertical'`. */\n layout?: 'horizontal' | 'vertical'\n /** Contextual help revealed via an info icon + tooltip beside the label. */\n helperText?: React.ReactNode\n /** Extra classes merged onto the field root element. */\n className?: string\n /** Render a visual gap after this many boxes (e.g. `3` → `123 456`). */\n groupAfter?: number\n}\n\nconst BOX_SIZE: Record<FieldSize, string> = {\n sm: 'h-9 w-8 text-sm',\n md: 'h-11 w-10 text-base',\n lg: 'h-14 w-12 text-lg',\n}\n\n/**\n * Segmented one-time-code / PIN input. Auto-advances as the user types,\n * Backspace retreats, and pasting a code spreads it across the boxes. Set\n * `masked` for PIN entry, `mode=\"alphanumeric\"` for letter codes.\n *\n * @example\n * ```tsx\n * <OtpInput length={6} value={code} onChange={setCode} onComplete={verify} />\n * ```\n */\nexport default function OtpInput({\n length = 6,\n value = '',\n onChange,\n onComplete,\n label,\n htmlFor,\n name,\n mode = 'numeric',\n masked = false,\n size = 'md',\n disabled,\n errorMessage,\n required,\n layout = 'vertical',\n helperText,\n className,\n groupAfter,\n}: OtpInputProps) {\n const errorId = useId()\n const hasError = errorMessage != null\n const refs = useRef<(HTMLInputElement | null)[]>([])\n\n // Normalise the controlled value into an array of single chars.\n const chars = Array.from({ length }, (_, i) => value[i] ?? '')\n\n const pattern = mode === 'numeric' ? /[0-9]/ : /[a-zA-Z0-9]/\n\n const emit = (next: string) => {\n onChange?.(next)\n if (next.length === length && !next.includes(' ') && [...next].every(Boolean)) {\n onComplete?.(next)\n }\n }\n\n const setCharAt = (idx: number, char: string) => {\n const arr = chars.slice()\n arr[idx] = char\n emit(arr.join(''))\n }\n\n const focusBox = (idx: number) => {\n const el = refs.current[Math.max(0, Math.min(length - 1, idx))]\n el?.focus()\n el?.select()\n }\n\n const onBoxChange = (idx: number, raw: string) => {\n const char = raw.slice(-1)\n if (char && !pattern.test(char)) return\n setCharAt(idx, char)\n if (char) focusBox(idx + 1)\n }\n\n const onKeyDown = (idx: number, e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Backspace') {\n if (chars[idx]) {\n setCharAt(idx, '')\n } else if (idx > 0) {\n setCharAt(idx - 1, '')\n focusBox(idx - 1)\n }\n } else if (e.key === 'ArrowLeft') {\n e.preventDefault(); focusBox(idx - 1)\n } else if (e.key === 'ArrowRight') {\n e.preventDefault(); focusBox(idx + 1)\n }\n }\n\n const onPaste = (e: React.ClipboardEvent<HTMLInputElement>) => {\n e.preventDefault()\n const text = e.clipboardData.getData('text').trim()\n const valid = [...text].filter((c) => pattern.test(c)).slice(0, length)\n if (valid.length === 0) return\n emit(valid.join(''))\n focusBox(valid.length)\n }\n\n return (\n <Field className={className} label={label} htmlFor={htmlFor} errorId={errorId} errorMessage={errorMessage} required={required} layout={layout} helperText={helperText}>\n <div className=\"flex items-center gap-2\" role=\"group\" aria-label={typeof label === 'string' ? label : 'One-time code'}>\n {chars.map((char, idx) => (\n <React.Fragment key={idx}>\n <input\n ref={(el) => { refs.current[idx] = el }}\n id={idx === 0 ? htmlFor : undefined}\n name={idx === 0 ? name : undefined}\n value={char}\n disabled={disabled}\n inputMode={mode === 'numeric' ? 'numeric' : 'text'}\n autoComplete={idx === 0 ? 'one-time-code' : 'off'}\n type={masked && char ? 'password' : 'text'}\n maxLength={1}\n aria-label={`Digit ${idx + 1}`}\n aria-invalid={hasError || undefined}\n aria-describedby={hasError ? errorId : undefined}\n onChange={(e) => onBoxChange(idx, e.target.value)}\n onKeyDown={(e) => onKeyDown(idx, e)}\n onPaste={onPaste}\n onFocus={(e) => e.target.select()}\n className={[\n BOX_SIZE[size],\n 'text-center font-medium rounded-lg border bg-surface text-foreground',\n 'transition-[border-color] duration-150',\n hasError ? 'border-status-error' : 'border-border',\n 'hover:border-border-strong',\n // Border-only focus, consistent with every field (no clip-prone ring).\n 'focus:outline-none focus:border-accent',\n 'disabled:bg-surface-raised disabled:text-foreground-muted disabled:cursor-not-allowed',\n ].join(' ')}\n />\n {groupAfter && (idx + 1) % groupAfter === 0 && idx < length - 1 && (\n <span className=\"w-2 text-center text-foreground-muted\" aria-hidden=\"true\">·</span>\n )}\n </React.Fragment>\n ))}\n </div>\n </Field>\n )\n}\n","import React, { useId, useState } from 'react'\nimport { Field, type FieldSize } from './_field'\n\nexport interface RatingProps {\n /** Controlled value. */\n value?: number\n /** Uncontrolled initial value. */\n defaultValue?: number\n /** Fires when the value changes. */\n onChange?: (value: number) => void\n /** Number of icons. Default `5`. */\n count?: number\n /** Allow half-icon precision. Default `false`. */\n allowHalf?: boolean\n /** Read-only display (no hover / click). */\n readOnly?: boolean\n /** Clicking the current value again clears to 0. Default `true`. */\n clearable?: boolean\n /** Field label, placed above (vertical) or beside (horizontal) the control. */\n label?: React.ReactNode\n /** Size preset — controls height, padding, and font. Default 'md'. */\n size?: FieldSize\n /** Disable interaction and dim the control. */\n disabled?: boolean\n /** Override the icon. Receives a `filled` flag. Default is a star. */\n icon?: (filled: boolean) => React.ReactNode\n /** Validation message — shown under the control; also flags it red and sets aria-invalid. */\n errorMessage?: React.ReactNode\n /** Native form field name (used for FormData serialisation). */\n name?: string\n /** Label/control orientation. Default `'vertical'`. */\n layout?: 'horizontal' | 'vertical'\n /** Contextual help revealed via an info icon + tooltip beside the label. */\n helperText?: React.ReactNode\n /** Extra classes merged onto the field root element. */\n className?: string\n /** Show a required asterisk after the label. */\n required?: boolean\n}\n\nconst ICON_SIZE: Record<FieldSize, string> = { sm: 'w-4 h-4', md: 'w-5 h-5', lg: 'w-7 h-7' }\n\nconst Star = (filled: boolean) => (\n <svg viewBox=\"0 0 24 24\" fill={filled ? 'currentColor' : 'none'} stroke=\"currentColor\" strokeWidth={filled ? 0 : 1.5} className=\"w-full h-full\" aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M11.48 3.5a.56.56 0 011.04 0l2.13 4.77 5.18.5a.56.56 0 01.32.97l-3.9 3.46 1.15 5.1a.56.56 0 01-.83.6L12 16.8l-4.57 2.6a.56.56 0 01-.83-.6l1.15-5.1-3.9-3.46a.56.56 0 01.32-.97l5.18-.5L11.48 3.5z\" />\n </svg>\n)\n\n/**\n * Star (or custom glyph) rating with optional half-steps, hover preview, and\n * read-only mode. Keyboard accessible: arrow keys adjust, Home/End jump to\n * min/max.\n *\n * @example\n * ```tsx\n * <Rating label=\"Quality\" value={rating} onChange={setRating} allowHalf />\n * ```\n *\n * @example Read-only display\n * ```tsx\n * <Rating value={4.5} allowHalf readOnly />\n * ```\n */\nexport default function Rating({\n value,\n defaultValue = 0,\n onChange,\n count = 5,\n allowHalf = false,\n readOnly = false,\n clearable = true,\n label,\n size = 'md',\n disabled,\n icon = Star,\n errorMessage,\n name,\n layout = 'vertical',\n helperText,\n className,\n required,\n}: RatingProps) {\n const errorId = useId()\n const [internal, setInternal] = useState(defaultValue)\n const [hover, setHover] = useState<number | null>(null)\n\n const current = value ?? internal\n const display = hover ?? current\n const interactive = !readOnly && !disabled\n\n const commit = (next: number) => {\n const v = clearable && next === current ? 0 : next\n setInternal(v)\n onChange?.(v)\n }\n\n const onKeyDown = (e: React.KeyboardEvent) => {\n if (!interactive) return\n const step = allowHalf ? 0.5 : 1\n if (e.key === 'ArrowRight' || e.key === 'ArrowUp') { e.preventDefault(); commit(Math.min(count, current + step)) }\n else if (e.key === 'ArrowLeft' || e.key === 'ArrowDown') { e.preventDefault(); commit(Math.max(0, current - step)) }\n else if (e.key === 'Home') { e.preventDefault(); commit(0) }\n else if (e.key === 'End') { e.preventDefault(); commit(count) }\n }\n\n return (\n <Field className={className} label={label} errorId={errorId} errorMessage={errorMessage} layout={layout} required={required} helperText={helperText}>\n <div\n role={interactive ? 'slider' : 'img'}\n aria-label={typeof label === 'string' ? label : 'Rating'}\n aria-valuenow={interactive ? current : undefined}\n aria-valuemin={interactive ? 0 : undefined}\n aria-valuemax={interactive ? count : undefined}\n aria-valuetext={`${current} of ${count}`}\n tabIndex={interactive ? 0 : -1}\n onKeyDown={onKeyDown}\n onMouseLeave={() => setHover(null)}\n className=\"inline-flex items-center gap-1 text-accent focus:outline-none focus-visible:ring-[3px] focus-visible:ring-focus-ring rounded-md w-max\"\n >\n {name && <input type=\"hidden\" name={name} value={current} />}\n {Array.from({ length: count }, (_, i) => {\n const starValue = i + 1\n const fillFraction = Math.max(0, Math.min(1, display - i))\n return (\n <span\n key={i}\n className={`relative ${ICON_SIZE[size]} ${interactive ? 'cursor-pointer' : ''} ${disabled ? 'opacity-50' : ''}`}\n onMouseMove={(e) => {\n if (!interactive) return\n if (allowHalf) {\n const rect = e.currentTarget.getBoundingClientRect()\n const half = e.clientX - rect.left < rect.width / 2\n setHover(i + (half ? 0.5 : 1))\n } else {\n setHover(starValue)\n }\n }}\n onClick={(e) => {\n if (!interactive) return\n if (allowHalf) {\n const rect = e.currentTarget.getBoundingClientRect()\n const half = e.clientX - rect.left < rect.width / 2\n commit(i + (half ? 0.5 : 1))\n } else {\n commit(starValue)\n }\n }}\n >\n {/* Empty layer — full star outline */}\n <span className=\"absolute inset-0 text-foreground-muted\">{icon(false)}</span>\n {/* Filled layer: a clip box (width = fill fraction)\n containing a FULL-SIZE star pinned left, so a\n 50% clip reveals the exact left half — not a\n squished half-width star. */}\n <span\n className=\"absolute inset-y-0 left-0 overflow-hidden\"\n style={{ width: `${fillFraction * 100}%` }}\n >\n <span className={`block absolute inset-y-0 left-0 ${ICON_SIZE[size]} max-w-none`}>\n {icon(true)}\n </span>\n </span>\n </span>\n )\n })}\n </div>\n </Field>\n )\n}\n","import React, { useId, useState } from 'react'\nimport * as Popover from '@radix-ui/react-popover'\nimport { Field, fieldShell, type FieldSize } from './_field'\n\nexport interface TimePickerProps {\n /** Value as `\"HH:mm\"` (24h) or `\"HH:mm:ss\"`. `null`/`undefined` = unset. */\n value?: string | null\n /** Fires when the value changes. */\n onChange?: (value: string | null) => void\n /** Field label, placed above (vertical) or beside (horizontal) the control. */\n label?: React.ReactNode\n /** The control id; the field label links to it for accessibility. */\n htmlFor?: string\n /** Native form field name (used for FormData serialisation). */\n name?: string\n /** Placeholder shown when the field is empty. */\n placeholder?: string\n /** Label/control orientation: 'horizontal' or 'vertical'. */\n layout?: 'horizontal' | 'vertical'\n /** Size preset — controls height, padding, and font. Default 'md'. */\n size?: FieldSize\n /** Display in 12-hour format with AM/PM (value stays 24h `\"HH:mm\"`). */\n use12Hours?: boolean\n /** Include a seconds column. Default `false`. */\n withSeconds?: boolean\n /** Minute step. Default `1`. Use `5` / `15` for coarse pickers. */\n minuteStep?: number\n /** Disable interaction and dim the control. */\n disabled?: boolean\n /** Validation message — shown under the control; also flags it red and sets aria-invalid. */\n errorMessage?: React.ReactNode\n /** Contextual help revealed via an info icon + tooltip beside the label. */\n helperText?: React.ReactNode\n /** Extra classes merged onto the field root element. */\n className?: string\n /** Show a required asterisk after the label. */\n required?: boolean\n /** Inline style applied to the control shell. */\n style?: React.CSSProperties\n}\n\nconst pad = (n: number) => n.toString().padStart(2, '0')\n\nfunction parse(value?: string | null): { h: number; m: number; s: number } | null {\n if (!value) return null\n const [h, m, s] = value.split(':').map(Number)\n if (Number.isNaN(h) || Number.isNaN(m)) return null\n return { h, m, s: Number.isNaN(s) ? 0 : s }\n}\n\nfunction display(value: string | null | undefined, use12: boolean, withSeconds: boolean): string {\n const p = parse(value)\n if (!p) return ''\n if (use12) {\n const period = p.h >= 12 ? 'PM' : 'AM'\n const h12 = p.h % 12 === 0 ? 12 : p.h % 12\n return `${h12}:${pad(p.m)}${withSeconds ? `:${pad(p.s)}` : ''} ${period}`\n }\n return `${pad(p.h)}:${pad(p.m)}${withSeconds ? `:${pad(p.s)}` : ''}`\n}\n\n/**\n * Time picker with scrollable hour / minute (/ second) columns in a popover.\n * Value is a 24-hour `\"HH:mm\"` (or `\"HH:mm:ss\"`) string regardless of whether\n * the display is 12- or 24-hour, so it's stable to store and submit.\n *\n * @example\n * ```tsx\n * <TimePicker label=\"Departure\" value={time} onChange={setTime} minuteStep={15} use12Hours />\n * ```\n */\nexport default function TimePicker({\n value,\n onChange,\n label,\n htmlFor,\n name,\n placeholder = 'Select a time…',\n layout = 'vertical',\n size = 'md',\n use12Hours = false,\n withSeconds = false,\n minuteStep = 1,\n disabled,\n errorMessage,\n helperText,\n className,\n required,\n style,\n}: TimePickerProps) {\n const errorId = useId()\n const hasError = errorMessage != null\n const [open, setOpen] = useState(false)\n\n const parsed = parse(value) ?? { h: 0, m: 0, s: 0 }\n\n const update = (next: Partial<{ h: number; m: number; s: number }>) => {\n const merged = { ...parsed, ...next }\n onChange?.(`${pad(merged.h)}:${pad(merged.m)}${withSeconds ? `:${pad(merged.s)}` : ''}`)\n }\n\n const hours = use12Hours\n ? Array.from({ length: 12 }, (_, i) => i + 1) // 1..12\n : Array.from({ length: 24 }, (_, i) => i) // 0..23\n const minutes = Array.from({ length: Math.ceil(60 / minuteStep) }, (_, i) => i * minuteStep)\n const seconds = Array.from({ length: 60 }, (_, i) => i)\n\n // For 12h display, map the stored 24h hour to a column selection.\n const selectedHourCol = use12Hours ? (parsed.h % 12 === 0 ? 12 : parsed.h % 12) : parsed.h\n const period = parsed.h >= 12 ? 'PM' : 'AM'\n\n const setHour12 = (h12: number, p: 'AM' | 'PM') => {\n const h24 = p === 'AM' ? (h12 === 12 ? 0 : h12) : (h12 === 12 ? 12 : h12 + 12)\n update({ h: h24 })\n }\n\n const Column = ({ items, selected, onPick, fmt }: {\n items: number[]; selected: number; onPick: (n: number) => void; fmt?: (n: number) => string\n }) => (\n <div className=\"flex flex-col overflow-y-auto max-h-48 w-14 hidden-scrollbar\" role=\"listbox\">\n {items.map((n) => (\n <button\n key={n}\n type=\"button\"\n role=\"option\"\n aria-selected={selected === n}\n onClick={() => onPick(n)}\n className={`py-1.5 text-sm rounded-md text-center transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-accent ${\n selected === n ? 'bg-accent text-accent-fg' : 'text-foreground hover:bg-surface-raised'\n }`}\n >\n {fmt ? fmt(n) : pad(n)}\n </button>\n ))}\n </div>\n )\n\n return (\n <Field className={className} label={label} htmlFor={htmlFor} errorId={errorId} errorMessage={errorMessage} helperText={helperText} layout={layout} required={required}>\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 className={`flex items-center justify-between cursor-pointer select-none ${!style?.width ? 'min-w-[160px]' : ''} ${fieldShell({ size, hasError, disabled })}`}\n >\n <span className={`text-sm truncate ${value ? '' : 'text-foreground-muted'}`}>\n {display(value, use12Hours, withSeconds) || placeholder}\n </span>\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.75} className=\"w-4 h-4 flex-shrink-0 text-foreground-muted ml-2\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"9\" /><path d=\"M12 7v5l3 2\" strokeLinecap=\"round\" />\n </svg>\n </button>\n </Popover.Trigger>\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-2 flex gap-1 animate-in fade-in-0 zoom-in-95\"\n >\n <Column items={hours} selected={selectedHourCol}\n onPick={(h) => use12Hours ? setHour12(h, period as 'AM' | 'PM') : update({ h })}\n fmt={use12Hours ? (n) => String(n) : pad} />\n <Column items={minutes} selected={parsed.m} onPick={(m) => update({ m })} />\n {withSeconds && <Column items={seconds} selected={parsed.s} onPick={(s) => update({ s })} />}\n {use12Hours && (\n <div className=\"flex flex-col gap-1 w-12\">\n {(['AM', 'PM'] as const).map((p) => (\n <button\n key={p}\n type=\"button\"\n onClick={() => setHour12(selectedHourCol, p)}\n className={`py-1.5 text-sm rounded-md transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-accent ${\n period === p ? 'bg-accent text-accent-fg' : 'text-foreground hover:bg-surface-raised'\n }`}\n >\n {p}\n </button>\n ))}\n </div>\n )}\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n {name && <input type=\"hidden\" name={name} value={value ?? ''} />}\n </Field>\n )\n}\n","import React, { useId, useMemo, useState } from 'react'\nimport * as Popover from '@radix-ui/react-popover'\nimport { Field, fieldShell, type FieldSize } from './_field'\n\nexport interface DateRange {\n start: Date | null\n end: Date | null\n}\n\nexport interface DateRangePreset {\n label: string\n /** Returns the range when clicked. */\n range: () => DateRange\n}\n\nexport interface DateRangePickerProps {\n /** Controlled value. */\n value?: DateRange\n /** Fires when the value changes. */\n onChange?: (range: DateRange) => void\n /** Field label, placed above (vertical) or beside (horizontal) the control. */\n label?: React.ReactNode\n /** The control id; the field label links to it for accessibility. */\n htmlFor?: string\n /** Placeholder shown when the field is empty. */\n placeholder?: string\n /** Label/control orientation: 'horizontal' or 'vertical'. */\n layout?: 'horizontal' | 'vertical'\n /** Size preset — controls height, padding, and font. Default 'md'. */\n size?: FieldSize\n /** Earliest selectable date. */\n min?: Date\n /** Latest selectable date. */\n max?: Date\n /** 0 = Sunday, 1 = Monday. Default `0`. */\n weekStartsOn?: 0 | 1\n /** Quick-select presets shown in a rail beside the calendars. */\n presets?: DateRangePreset[]\n /** Custom formatter for the displayed value. */\n format?: (d: Date) => string\n /** Disable interaction and dim the control. */\n disabled?: boolean\n /** Validation message — shown under the control; also flags it red and sets aria-invalid. */\n errorMessage?: React.ReactNode\n /** Contextual help revealed via an info icon + tooltip beside the label. */\n helperText?: React.ReactNode\n /** Extra classes merged onto the field root element. */\n className?: string\n /** Show a required asterisk after the label. */\n required?: boolean\n /** Inline style applied to the control shell. */\n style?: React.CSSProperties\n}\n\nconst MONTH_NAMES = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']\nconst WEEKDAY = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']\n\nconst startOfMonth = (d: Date) => new Date(d.getFullYear(), d.getMonth(), 1)\nconst addMonths = (d: Date, n: number) => new Date(d.getFullYear(), d.getMonth() + n, 1)\nconst addDays = (d: Date, n: number) => { const c = new Date(d); c.setDate(c.getDate() + n); return c }\nconst isSameDay = (a: Date, b: Date) => a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate()\nconst startOfDay = (d: Date) => new Date(d.getFullYear(), d.getMonth(), d.getDate())\nconst defaultFmt = (d: Date) => `${d.getFullYear()}-${`${d.getMonth() + 1}`.padStart(2, '0')}-${`${d.getDate()}`.padStart(2, '0')}`\n\nfunction buildGrid(viewMonth: Date, weekStartsOn: 0 | 1) {\n const first = startOfMonth(viewMonth)\n const offset = (first.getDay() - weekStartsOn + 7) % 7\n const gridStart = addDays(first, -offset)\n return Array.from({ length: 42 }, (_, i) => {\n const d = addDays(gridStart, i)\n return { date: d, outside: d.getMonth() !== viewMonth.getMonth() }\n })\n}\n\n/**\n * Two-month range date picker. Click a start date, then an end date; the span\n * between highlights as you hover. Optional quick-select presets (Today,\n * Last 7 days, This month, etc.) in a side rail.\n *\n * @example\n * ```tsx\n * <DateRangePicker\n * label=\"Reporting period\"\n * value={range}\n * onChange={setRange}\n * presets={[\n * { label: 'Last 7 days', range: () => ({ start: addDays(new Date(), -6), end: new Date() }) },\n * ]}\n * />\n * ```\n */\nexport default function DateRangePicker({\n value = { start: null, end: null },\n onChange,\n label,\n htmlFor,\n placeholder = 'Select a date range…',\n layout = 'vertical',\n size = 'md',\n min,\n max,\n weekStartsOn = 0,\n presets,\n format = defaultFmt,\n disabled,\n errorMessage,\n helperText,\n className,\n required,\n style,\n}: DateRangePickerProps) {\n const errorId = useId()\n const hasError = errorMessage != null\n const [open, setOpen] = useState(false)\n const [leftMonth, setLeftMonth] = useState(() => startOfMonth(value.start ?? new Date()))\n // While selecting, we hold the in-progress start and hover end.\n const [pendingStart, setPendingStart] = useState<Date | null>(null)\n const [hoverDate, setHoverDate] = useState<Date | null>(null)\n\n const weekdays = useMemo(\n () => WEEKDAY.slice(weekStartsOn).concat(WEEKDAY.slice(0, weekStartsOn)),\n [weekStartsOn],\n )\n\n const isDisabled = (d: Date) => (min && d < startOfDay(min)) || (max && d > startOfDay(max))\n\n // The range currently being visualised (committed value, or in-progress).\n const effective: DateRange = pendingStart\n ? { start: pendingStart, end: hoverDate }\n : value\n\n const inRange = (d: Date) => {\n const { start, end } = effective\n if (!start || !end) return false\n const [a, b] = start <= end ? [start, end] : [end, start]\n return d >= startOfDay(a) && d <= startOfDay(b)\n }\n\n const onDayClick = (d: Date) => {\n if (isDisabled(d)) return\n if (!pendingStart) {\n setPendingStart(d)\n setHoverDate(d)\n onChange?.({ start: d, end: null })\n } else {\n const [start, end] = pendingStart <= d ? [pendingStart, d] : [d, pendingStart]\n onChange?.({ start, end })\n setPendingStart(null)\n setHoverDate(null)\n setOpen(false)\n }\n }\n\n const triggerText = value.start && value.end\n ? `${format(value.start)} – ${format(value.end)}`\n : value.start\n ? `${format(value.start)} – …`\n : ''\n\n const renderMonth = (viewMonth: Date) => {\n const cells = buildGrid(viewMonth, weekStartsOn)\n return (\n <div>\n <div className=\"text-sm font-semibold text-center mb-2 select-none\">\n {MONTH_NAMES[viewMonth.getMonth()]} {viewMonth.getFullYear()}\n </div>\n <div className=\"grid grid-cols-7 gap-y-1\">\n {weekdays.map((w) => (\n <div key={w} className=\"text-[11px] font-medium text-foreground-muted uppercase text-center\">{w}</div>\n ))}\n {cells.map(({ date, outside }) => {\n const dis = isDisabled(date)\n const isStart = effective.start && isSameDay(date, effective.start)\n const isEnd = effective.end && isSameDay(date, effective.end)\n const within = inRange(date) && !isStart && !isEnd\n return (\n <button\n key={defaultFmt(date)}\n type=\"button\"\n disabled={dis}\n onMouseEnter={() => pendingStart && setHoverDate(date)}\n onClick={() => onDayClick(date)}\n className={[\n 'h-8 text-xs font-medium transition-colors',\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-accent',\n 'disabled:opacity-30 disabled:cursor-not-allowed',\n isStart || isEnd\n ? 'bg-accent text-accent-fg rounded-md'\n : within\n ? 'bg-surface-raised text-foreground rounded-none'\n : outside\n ? 'text-foreground-muted hover:bg-surface-raised rounded-md'\n : 'text-foreground hover:bg-surface-raised rounded-md',\n ].join(' ')}\n >\n {date.getDate()}\n </button>\n )\n })}\n </div>\n </div>\n )\n }\n\n return (\n <Field className={className} label={label} htmlFor={htmlFor} errorId={errorId} errorMessage={errorMessage} helperText={helperText} layout={layout} required={required}>\n <Popover.Root open={open && !disabled} onOpenChange={(o) => { if (!disabled) { setOpen(o); if (!o) { setPendingStart(null); setHoverDate(null) } } }}>\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 className={`flex items-center justify-between cursor-pointer select-none ${!style?.width ? 'min-w-[240px]' : ''} ${fieldShell({ size, hasError, disabled })}`}\n >\n <span className={`text-sm truncate ${triggerText ? '' : 'text-foreground-muted'}`}>\n {triggerText || placeholder}\n </span>\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.75} className=\"w-4 h-4 flex-shrink-0 text-foreground-muted ml-2\" aria-hidden=\"true\">\n <rect x=\"3\" y=\"5\" width=\"18\" height=\"16\" rx=\"2\" /><path d=\"M3 9h18M8 3v4M16 3v4\" strokeLinecap=\"round\" />\n </svg>\n </button>\n </Popover.Trigger>\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 flex gap-3 animate-in fade-in-0 zoom-in-95\"\n >\n {presets && presets.length > 0 && (\n <div className=\"flex flex-col gap-1 pr-3 border-r border-border min-w-[120px]\">\n {presets.map((p) => (\n <button\n key={p.label}\n type=\"button\"\n onClick={() => { onChange?.(p.range()); setOpen(false) }}\n className=\"text-left text-xs px-2 py-1.5 rounded-md text-foreground-secondary hover:bg-surface-raised hover:text-foreground transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n >\n {p.label}\n </button>\n ))}\n </div>\n )}\n <div className=\"flex gap-4\">\n <div className=\"relative\">\n <button\n type=\"button\"\n onClick={() => setLeftMonth(addMonths(leftMonth, -1))}\n aria-label=\"Previous month\"\n className=\"absolute -top-1 left-0 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\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} className=\"w-4 h-4\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15 19l-7-7 7-7\" /></svg>\n </button>\n {renderMonth(leftMonth)}\n </div>\n <div className=\"relative\">\n <button\n type=\"button\"\n onClick={() => setLeftMonth(addMonths(leftMonth, 1))}\n aria-label=\"Next month\"\n className=\"absolute -top-1 right-0 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\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} className=\"w-4 h-4\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 5l7 7-7 7\" /></svg>\n </button>\n {renderMonth(addMonths(leftMonth, 1))}\n </div>\n </div>\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n </Field>\n )\n}\n","import React, { useId, useState } from 'react'\nimport * as Popover from '@radix-ui/react-popover'\nimport { Field, fieldShell, type FieldSize } from './_field'\n\nexport interface ColorPickerProps {\n /** Hex string, e.g. `\"#0466c8\"`. */\n value?: string\n /** Fires when the value changes. */\n onChange?: (hex: string) => void\n /** Field label, placed above (vertical) or beside (horizontal) the control. */\n label?: React.ReactNode\n /** The control id; the field label links to it for accessibility. */\n htmlFor?: string\n /** Native form field name (used for FormData serialisation). */\n name?: string\n /** Label/control orientation: 'horizontal' or 'vertical'. */\n layout?: 'horizontal' | 'vertical'\n /** Size preset — controls height, padding, and font. Default 'md'. */\n size?: FieldSize\n /** Preset swatches shown in the popover. Defaults to a balanced 12-color set. */\n swatches?: string[]\n /** Show the native eyedropper / full picker fallback via `<input type=\"color\">`. Default `true`. */\n allowCustom?: boolean\n /** Disable interaction and dim the control. */\n disabled?: boolean\n /** Validation message — shown under the control; also flags it red and sets aria-invalid. */\n errorMessage?: React.ReactNode\n /** Contextual help revealed via an info icon + tooltip beside the label. */\n helperText?: React.ReactNode\n /** Extra classes merged onto the field root element. */\n className?: string\n /** Show a required asterisk after the label. */\n required?: boolean\n /** Placeholder shown when the field is empty. */\n placeholder?: string\n}\n\nconst DEFAULT_SWATCHES = [\n '#0466c8', '#1e8449', '#d68910', '#c0392b', '#8e44ad', '#16a085',\n '#2c3e50', '#7f8c8d', '#e84393', '#00b894', '#fdcb6e', '#0a1929',\n]\n\nconst HEX_RE = /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/\n\n/**\n * Color picker: a swatch trigger that opens a popover with preset swatches, a\n * hex input, and (optionally) the native full picker for custom colors. Value\n * is a hex string, easy to store and submit.\n *\n * @example\n * ```tsx\n * <ColorPicker label=\"Brand colour\" value={color} onChange={setColor} />\n * ```\n */\nexport default function ColorPicker({\n value = '',\n onChange,\n label,\n htmlFor,\n name,\n layout = 'vertical',\n size = 'md',\n swatches = DEFAULT_SWATCHES,\n allowCustom = true,\n disabled,\n errorMessage,\n helperText,\n className,\n required,\n placeholder = 'Pick a colour…',\n}: ColorPickerProps) {\n const errorId = useId()\n const hasError = errorMessage != null\n const [open, setOpen] = useState(false)\n const [draft, setDraft] = useState(value)\n\n const valid = HEX_RE.test(value)\n\n const pick = (hex: string) => {\n onChange?.(hex)\n setDraft(hex)\n }\n\n const commitDraft = (raw: string) => {\n const hex = raw.startsWith('#') ? raw : `#${raw}`\n setDraft(hex)\n if (HEX_RE.test(hex)) onChange?.(hex)\n }\n\n return (\n <Field className={className} label={label} htmlFor={htmlFor} errorId={errorId} errorMessage={errorMessage} helperText={helperText} layout={layout} required={required}>\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 aria-invalid={hasError || undefined}\n aria-describedby={hasError ? errorId : undefined}\n className={`flex items-center gap-2 cursor-pointer select-none ${fieldShell({ size, hasError, disabled })}`}\n >\n <span\n className=\"h-4 w-4 flex-shrink-0 rounded border border-border\"\n style={{ backgroundColor: valid ? value : 'transparent' }}\n aria-hidden=\"true\"\n />\n <span className={`flex-1 text-left text-sm truncate ${valid ? 'text-foreground' : 'text-foreground-muted'}`}>\n {valid ? value.toLowerCase() : placeholder}\n </span>\n </button>\n </Popover.Trigger>\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 w-56 animate-in fade-in-0 zoom-in-95\"\n >\n <div className=\"grid grid-cols-6 gap-2 mb-3\">\n {swatches.map((sw) => (\n <button\n key={sw}\n type=\"button\"\n onClick={() => { pick(sw); setOpen(false) }}\n aria-label={sw}\n className={`h-7 w-7 rounded-md border transition-transform hover:scale-110 focus:outline-none focus-visible:ring-2 focus-visible:ring-accent ${\n value.toLowerCase() === sw.toLowerCase() ? 'border-accent ring-2 ring-focus-ring' : 'border-border'\n }`}\n style={{ backgroundColor: sw }}\n />\n ))}\n </div>\n <div className=\"flex items-center gap-2\">\n <input\n value={draft}\n onChange={(e) => commitDraft(e.target.value)}\n placeholder=\"#0466c8\"\n aria-label=\"Hex colour\"\n className={`flex-1 ${fieldShell({ size: 'sm' })}`}\n />\n {allowCustom && (\n <input\n type=\"color\"\n value={valid ? value : '#000000'}\n onChange={(e) => pick(e.target.value)}\n aria-label=\"Custom colour\"\n className=\"h-7 w-9 rounded-md border border-border bg-surface cursor-pointer p-0.5\"\n />\n )}\n </div>\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n {name && <input type=\"hidden\" name={name} value={valid ? value : ''} />}\n </Field>\n )\n}\n","/**\n * Tiny immutable path helpers for nested form values — supports dotted paths\n * with numeric segments (e.g. `\"users.0.email\"`). Zero dependencies; written\n * so field arrays and nested objects \"just work\" without lodash.\n */\n\n/** Deep-clone preserving Date instances (form values may hold dates). */\nexport function deepClone<T>(v: T): T {\n if (v === null || typeof v !== 'object') return v\n if (v instanceof Date) return new Date(v.getTime()) as unknown as T\n if (Array.isArray(v)) return v.map(deepClone) as unknown as T\n const out: Record<string, unknown> = {}\n for (const k in v as Record<string, unknown>) out[k] = deepClone((v as Record<string, unknown>)[k])\n return out as T\n}\n\n/** Read a value at a dotted path. Returns `undefined` for missing branches. */\nexport function getPath(obj: unknown, path: string): unknown {\n if (!path) return obj\n const parts = path.split('.')\n let cur: unknown = obj\n for (const p of parts) {\n if (cur == null || typeof cur !== 'object') return undefined\n cur = (cur as Record<string, unknown>)[p]\n }\n return cur\n}\n\n/**\n * Return a NEW object/array with `value` set at the dotted path, structurally\n * sharing untouched branches. Creates arrays for numeric segments and objects\n * otherwise, so `setPath({}, 'users.0.name', 'x')` yields `{ users: [{ name: 'x' }] }`.\n */\nexport function setPath<T>(obj: T, path: string, value: unknown): T {\n const parts = path.split('.')\n const root: Record<string, unknown> | unknown[] = Array.isArray(obj)\n ? [...(obj as unknown[])]\n : { ...((obj as Record<string, unknown>) ?? {}) }\n let cur: Record<string, unknown> | unknown[] = root\n for (let i = 0; i < parts.length - 1; i++) {\n const p = parts[i]\n const nextIsIndex = /^\\d+$/.test(parts[i + 1])\n const child = (cur as Record<string, unknown>)[p]\n const next = Array.isArray(child)\n ? [...child]\n : child && typeof child === 'object'\n ? { ...(child as Record<string, unknown>) }\n : nextIsIndex\n ? []\n : {}\n ;(cur as Record<string, unknown>)[p] = next\n cur = next as Record<string, unknown> | unknown[]\n }\n ;(cur as Record<string, unknown>)[parts[parts.length - 1]] = value\n return root as T\n}\n","/**\n * Native, dependency-free validation. A field carries one rule or an array of\n * rules; rules run in order and the first failure wins. Rules are plain data\n * (required / pattern / min / max / length) plus an escape hatch `validate`\n * for anything custom — including async checks (uniqueness, server lookups) and\n * third-party schemas: `validate: (v) => zodSchema.safeParse(v).success ? undefined : 'msg'`.\n */\n\nexport type FormValues = Record<string, unknown>\n\n/** A numeric/length constraint, optionally with its own message. */\ntype Bound = number | { value: number; message?: string }\n/** A regex constraint, optionally with its own message. */\ntype Pattern = RegExp | { value: RegExp; message?: string }\n\nexport interface FieldRule<V = unknown> {\n /** Reject empty values. Pass a string to set the message. */\n required?: boolean | string\n /** Reject strings that don't match. */\n pattern?: Pattern\n /** Minimum numeric value. */\n min?: Bound\n /** Maximum numeric value. */\n max?: Bound\n /** Minimum length for strings / arrays. */\n minLength?: Bound\n /** Maximum length for strings / arrays. */\n maxLength?: Bound\n /**\n * Custom validator. Return an error string to fail, or a falsy value to\n * pass. May be async. Receives the field value and the whole form's values\n * (for cross-field checks like \"confirm password\").\n */\n validate?: (\n value: V,\n values: FormValues,\n ) => string | undefined | null | false | Promise<string | undefined | null | false>\n /** Fallback message used by required/pattern when they don't set their own. */\n message?: string\n}\n\nexport type FieldRules<V = unknown> = FieldRule<V> | FieldRule<V>[]\nexport type RulesMap = Record<string, FieldRules>\n\n/** Empty = no value to validate against (null / '' / [] / unchecked). */\nfunction isEmpty(v: unknown): boolean {\n return (\n v == null ||\n v === '' ||\n v === false ||\n (Array.isArray(v) && v.length === 0)\n )\n}\n\nconst boundValue = (b: Bound) => (typeof b === 'number' ? b : b.value)\nconst boundMessage = (b: Bound, fallback: string) =>\n typeof b === 'number' ? fallback : b.message ?? fallback\n\n/** Does this rule set make the field required? (drives the `*` asterisk.) */\nexport function isRequired(rules: FieldRules | undefined): boolean {\n if (!rules) return false\n const list = Array.isArray(rules) ? rules : [rules]\n return list.some((r) => !!r.required)\n}\n\n/**\n * Run a field's rules and resolve the first error message, or `undefined` when\n * valid. Optional-and-empty fields short-circuit to valid (only `required`\n * fires on empty).\n */\nexport async function runFieldRules(\n value: unknown,\n rules: FieldRules | undefined,\n values: FormValues,\n): Promise<string | undefined> {\n if (!rules) return undefined\n const list = Array.isArray(rules) ? rules : [rules]\n\n for (const rule of list) {\n if (rule.required && isEmpty(value)) {\n return typeof rule.required === 'string'\n ? rule.required\n : rule.message ?? 'This field is required'\n }\n\n // Optional + empty → nothing else to check for this rule.\n if (isEmpty(value)) {\n // still allow a custom validator to opt in on empty values\n if (rule.validate) {\n const res = await rule.validate(value as never, values)\n if (res) return typeof res === 'string' ? res : rule.message ?? 'Invalid value'\n }\n continue\n }\n\n if (rule.pattern) {\n const re = rule.pattern instanceof RegExp ? rule.pattern : rule.pattern.value\n const msg =\n rule.pattern instanceof RegExp\n ? rule.message ?? 'Invalid format'\n : rule.pattern.message ?? rule.message ?? 'Invalid format'\n if (typeof value === 'string' && !re.test(value)) return msg\n }\n\n if (rule.min != null && typeof value === 'number') {\n const m = boundValue(rule.min)\n if (value < m) return boundMessage(rule.min, rule.message ?? `Must be at least ${m}`)\n }\n if (rule.max != null && typeof value === 'number') {\n const m = boundValue(rule.max)\n if (value > m) return boundMessage(rule.max, rule.message ?? `Must be at most ${m}`)\n }\n\n if (rule.minLength != null) {\n const len = (value as { length?: number })?.length\n const m = boundValue(rule.minLength)\n if (typeof len === 'number' && len < m)\n return boundMessage(rule.minLength, rule.message ?? `Must be at least ${m} characters`)\n }\n if (rule.maxLength != null) {\n const len = (value as { length?: number })?.length\n const m = boundValue(rule.maxLength)\n if (typeof len === 'number' && len > m)\n return boundMessage(rule.maxLength, rule.message ?? `Must be at most ${m} characters`)\n }\n\n if (rule.validate) {\n const res = await rule.validate(value as never, values)\n if (res) return typeof res === 'string' ? res : rule.message ?? 'Invalid value'\n }\n }\n\n return undefined\n}\n\n/** Common ready-made patterns so callers don't re-type regexes. */\nexport const patterns = {\n email: /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/,\n url: /^https?:\\/\\/[^\\s/$.?#].[^\\s]*$/i,\n // Loose international phone: + and 7-15 digits, spaces/dashes allowed.\n phone: /^\\+?[\\d\\s-]{7,15}$/,\n // Digits only.\n digits: /^\\d+$/,\n} as const\n","import { deepClone, getPath, setPath } from './path'\nimport { runFieldRules, type FieldRules, type FormValues, type RulesMap } from './validate'\n\nexport type ValidateTrigger = 'onChange' | 'onBlur' | 'onSubmit'\n\nexport interface FormStoreOptions {\n initialValues?: FormValues\n /** Static rules keyed by field name. Dynamic fields register their own. */\n rules?: RulesMap\n /**\n * When a field revalidates. `'onSubmit'` is always implied. Default\n * `['onChange', 'onBlur', 'onSubmit']` — error appears once a field is\n * touched and updates live as the user types.\n */\n validateOn?: ValidateTrigger[]\n}\n\nexport type ErrorMap = Record<string, string | undefined>\n\n/** Stable per-field view handed to subscribers; ref only changes on real change. */\nexport interface FieldSnapshot {\n value: unknown\n error: string | undefined\n /** touched OR the form was submitted — i.e. \"should the error be shown\". */\n showError: boolean\n}\n\n/**\n * Framework-agnostic form store. Holds values/errors/touched, runs validation,\n * and notifies React via `useSyncExternalStore`. Field components subscribe to\n * a memoized per-field snapshot so a keystroke in one field doesn't re-render\n * the others.\n */\nexport class FormStore {\n private listeners = new Set<() => void>()\n private fieldCache = new Map<string, { value: unknown; error: string | undefined; showError: boolean; snap: FieldSnapshot }>()\n\n values: FormValues\n errors: ErrorMap = {}\n touched: Record<string, boolean> = {}\n submitted = false\n validating = false\n\n readonly initialValues: FormValues\n private rules: RulesMap\n readonly validateOn: ValidateTrigger[]\n\n // Field-array key bookkeeping (stable React keys across reorder/removal).\n private keys: Record<string, number[]> = {}\n private keySeq = 1\n\n // Root snapshot — a new ref on every change, for form-level subscribers.\n private rootSnap: { v: number } = { v: 0 }\n\n constructor(opts: FormStoreOptions = {}) {\n this.initialValues = deepClone(opts.initialValues ?? {})\n this.values = deepClone(opts.initialValues ?? {})\n this.rules = { ...(opts.rules ?? {}) }\n this.validateOn = opts.validateOn ?? ['onChange', 'onBlur', 'onSubmit']\n }\n\n // ── subscription ────────────────────────────────────────────────────────\n subscribe = (l: () => void): (() => void) => {\n this.listeners.add(l)\n return () => { this.listeners.delete(l) }\n }\n private emit() {\n this.rootSnap = { v: this.rootSnap.v + 1 }\n this.listeners.forEach((l) => l())\n }\n getRootSnapshot = (): { v: number } => this.rootSnap\n\n getFieldSnapshot = (name: string): FieldSnapshot => {\n const value = getPath(this.values, name)\n const error = this.errors[name]\n const showError = (!!this.touched[name] || this.submitted) && error != null\n const prev = this.fieldCache.get(name)\n if (prev && Object.is(prev.value, value) && prev.error === error && prev.showError === showError) {\n return prev.snap\n }\n const snap: FieldSnapshot = { value, error, showError }\n this.fieldCache.set(name, { value, error, showError, snap })\n return snap\n }\n\n // ── rule registry (for dynamic / array fields) ──────────────────────────\n setRule(name: string, rules: FieldRules | undefined) {\n if (rules == null) delete this.rules[name]\n else this.rules[name] = rules\n }\n removeRule(name: string) { delete this.rules[name] }\n getRule(name: string): FieldRules | undefined { return this.rules[name] }\n\n // ── reads ────────────────────────────────────────────────────────────────\n getValues = (): FormValues => this.values\n getValue = (name: string): unknown => getPath(this.values, name)\n get isValid(): boolean { return Object.values(this.errors).every((e) => !e) }\n\n // ── writes ────────────────────────────────────────────────────────────────\n setValue = (name: string, value: unknown, opts: { validate?: boolean; touch?: boolean } = {}) => {\n this.values = setPath(this.values, name, value)\n if (opts.touch) this.touched = { ...this.touched, [name]: true }\n this.emit()\n const shouldValidate = opts.validate ?? this.validateOn.includes('onChange')\n if (shouldValidate) void this.validateField(name)\n }\n\n setValues = (patch: FormValues, opts: { validate?: boolean } = {}) => {\n for (const k of Object.keys(patch)) this.values = setPath(this.values, k, patch[k])\n this.emit()\n if (opts.validate) void this.validateAll()\n }\n\n setError = (name: string, error: string | undefined) => {\n if (this.errors[name] === error) return\n this.errors = { ...this.errors, [name]: error || undefined }\n this.emit()\n }\n\n touch = (name: string, opts: { validate?: boolean } = {}) => {\n if (!this.touched[name]) {\n this.touched = { ...this.touched, [name]: true }\n this.emit()\n }\n if (opts.validate ?? this.validateOn.includes('onBlur')) void this.validateField(name)\n }\n\n setSubmitted = (v: boolean) => { this.submitted = v; this.emit() }\n\n // ── validation ─────────────────────────────────────────────────────────────\n async validateField(name: string): Promise<string | undefined> {\n const err = await runFieldRules(getPath(this.values, name), this.rules[name], this.values)\n this.setError(name, err)\n return err\n }\n\n async validateAll(): Promise<ErrorMap> {\n this.validating = true\n this.emit()\n const names = Object.keys(this.rules)\n const entries = await Promise.all(\n names.map(async (n) => [n, await runFieldRules(getPath(this.values, n), this.rules[n], this.values)] as const),\n )\n const errors: ErrorMap = {}\n for (const [n, e] of entries) errors[n] = e\n this.errors = errors\n this.validating = false\n this.emit()\n return errors\n }\n\n reset = (values?: FormValues) => {\n this.values = deepClone(values ?? this.initialValues)\n this.errors = {}\n this.touched = {}\n this.submitted = false\n this.keys = {}\n this.fieldCache.clear()\n this.emit()\n }\n\n // ── field arrays ───────────────────────────────────────────────────────────\n getKeys(name: string): number[] {\n const arr = (getPath(this.values, name) as unknown[]) ?? []\n let keys = this.keys[name]\n if (!keys || keys.length !== arr.length) {\n keys = arr.map((_, i) => (keys && keys[i] != null ? keys[i] : this.keySeq++))\n this.keys[name] = keys\n }\n return keys\n }\n arrayAppend = (name: string, item: unknown = {}) => {\n const arr = [...((getPath(this.values, name) as unknown[]) ?? [])]\n arr.push(item)\n this.keys[name] = [...this.getKeys(name), this.keySeq++]\n this.setValue(name, arr, { validate: false })\n }\n arrayRemove = (name: string, index: number) => {\n const arr = [...((getPath(this.values, name) as unknown[]) ?? [])]\n arr.splice(index, 1)\n const k = [...this.getKeys(name)]\n k.splice(index, 1)\n this.keys[name] = k\n // Re-index errors/touched for the removed branch so stale messages clear.\n this.clearBranch(name)\n this.setValue(name, arr, { validate: false })\n }\n arrayMove = (name: string, from: number, to: number) => {\n const arr = [...((getPath(this.values, name) as unknown[]) ?? [])]\n if (from < 0 || to < 0 || from >= arr.length || to >= arr.length) return\n const [moved] = arr.splice(from, 1)\n arr.splice(to, 0, moved)\n const k = [...this.getKeys(name)]\n const [mk] = k.splice(from, 1)\n k.splice(to, 0, mk)\n this.keys[name] = k\n this.clearBranch(name)\n this.setValue(name, arr, { validate: false })\n }\n\n /** Drop any errors/touched flags under `name.` — used when an array shifts. */\n private clearBranch(name: string) {\n const prefix = name + '.'\n const errors: ErrorMap = {}\n for (const k of Object.keys(this.errors)) if (!k.startsWith(prefix)) errors[k] = this.errors[k]\n const touched: Record<string, boolean> = {}\n for (const k of Object.keys(this.touched)) if (!k.startsWith(prefix)) touched[k] = this.touched[k]\n this.errors = errors\n this.touched = touched\n }\n}\n","import type React from 'react'\nimport type { FormStore, FieldSnapshot } from './store'\nimport { isRequired } from './validate'\n\n/**\n * How a control reports changes, so one binder can drive any of our inputs:\n * - `value` — `onChange(value)` directly (RadioGroup, Slider, Rating,\n * SegmentedControl, TagsInput, OtpInput, DatePicker, ColorPicker…)\n * - `native` — `onChange(e)` reading `e.target.value` (TextInput, Password,\n * TextArea, NumberInput, SearchInput)\n * - `checked` — `onChange({target:{checked}})` (Switch, Checkbox)\n * - `target` — `onChange({target:{value}})` (Dropdown, TreeSelect)\n */\nexport type FieldKind = 'value' | 'native' | 'checked' | 'target'\n\ninterface Adapter {\n prop: 'value' | 'checked'\n toValue: (arg: unknown) => unknown\n /** Apply an empty fallback so native inputs stay controlled. */\n applyEmpty: boolean\n empty: unknown\n}\n\nconst getTarget = (arg: unknown): Record<string, unknown> | undefined => {\n const t = (arg as { target?: unknown })?.target\n return t && typeof t === 'object' ? (t as Record<string, unknown>) : undefined\n}\n\nconst ADAPTERS: Record<FieldKind, Adapter> = {\n value: { prop: 'value', toValue: (v) => v, applyEmpty: false, empty: undefined },\n native: { prop: 'value', toValue: (e) => getTarget(e)?.value, applyEmpty: true, empty: '' },\n checked: { prop: 'checked', toValue: (e) => getTarget(e)?.checked, applyEmpty: true, empty: false },\n target: { prop: 'value', toValue: (e) => getTarget(e)?.value, applyEmpty: false, empty: undefined },\n}\n\nexport interface FieldBindings {\n name: string\n id: string\n htmlFor: string\n required?: boolean\n errorMessage?: React.ReactNode\n onChange: (arg: unknown) => void\n onBlur: () => void\n /** `value` or `checked`, depending on the control kind. */\n [prop: string]: unknown\n}\n\n/**\n * Produce the props to spread onto a control: the current value (under the\n * right prop), a normalising `onChange`, `onBlur` to mark touched, the field\n * `name`/`id`, the derived `required` flag (from its rules), and the gated\n * `errorMessage` (shown once touched or after a submit attempt).\n */\nexport function buildBindings(\n store: FormStore,\n name: string,\n kind: FieldKind,\n snap: FieldSnapshot,\n): FieldBindings {\n const a = ADAPTERS[kind]\n const raw = snap.value\n const value = a.applyEmpty ? raw ?? a.empty : raw\n return {\n name,\n id: name,\n htmlFor: name,\n required: isRequired(store.getRule(name)) || undefined,\n errorMessage: snap.showError ? snap.error : undefined,\n [a.prop]: value,\n onChange: (arg: unknown) => store.setValue(name, a.toValue(arg), { touch: true }),\n onBlur: () => store.touch(name),\n }\n}\n","import { useCallback, useRef, useSyncExternalStore } from 'react'\nimport { FormStore, type FormStoreOptions, type ErrorMap } from './store'\nimport { buildBindings, type FieldBindings, type FieldKind } from './bindings'\nimport type { FieldRules, FormValues } from './validate'\n\nexport interface UseFormReturn {\n /** The underlying store — pass to `<Form form={...}>` and for imperative use. */\n store: FormStore\n values: FormValues\n errors: ErrorMap\n touched: Record<string, boolean>\n submitted: boolean\n isSubmitting: boolean\n isValid: boolean\n\n // imperative helpers\n getValue: (name: string) => unknown\n getValues: () => FormValues\n setValue: (name: string, value: unknown, opts?: { validate?: boolean; touch?: boolean }) => void\n setValues: (patch: FormValues) => void\n setError: (name: string, error: string | undefined) => void\n validateField: (name: string) => Promise<string | undefined>\n validateAll: () => Promise<ErrorMap>\n reset: (values?: FormValues) => void\n\n /**\n * Bind a control whose `onChange` receives the value directly (RadioGroup,\n * Slider, DatePicker, SegmentedControl, TagsInput, OtpInput, …).\n * Spread the result onto the control: `<Slider {...form.field('volume')} />`.\n */\n field: (name: string, rules?: FieldRules) => FieldBindings\n /** Bind a native input (`e.target.value`): TextInput, Password, TextArea, NumberInput. */\n fieldNative: (name: string, rules?: FieldRules) => FieldBindings\n /** Bind a checkable (`{target:{checked}}`): Switch, Checkbox. */\n fieldChecked: (name: string, rules?: FieldRules) => FieldBindings\n /** Bind a `{target:{value}}` control: Dropdown, TreeSelect. */\n fieldTarget: (name: string, rules?: FieldRules) => FieldBindings\n}\n\n/**\n * Create a form instance. State lives in a stable {@link FormStore}; the hook\n * re-renders the calling component on any change so the spread `field()`\n * bindings stay current. For large forms, isolate re-renders with\n * `useFormField` / `<FormField>` instead of reading everything here.\n *\n * Validation lives at the form level (rules map or per-field `rules` arg), and\n * the inputs only *receive* their error — they never validate themselves.\n *\n * @example\n * ```tsx\n * const form = useForm({ initialValues: { email: '' } })\n * <Form form={form} onFinish={(v) => save(v)}>\n * <TextInput label=\"Email\" {...form.fieldNative('email', { required: true, pattern: patterns.email })} />\n * <Button type=\"submit\">Save</Button>\n * </Form>\n * ```\n */\nexport function useForm(options: FormStoreOptions = {}): UseFormReturn {\n const ref = useRef<FormStore | null>(null)\n if (ref.current === null) ref.current = new FormStore(options)\n const store = ref.current\n\n // Re-render this component whenever the store changes.\n useSyncExternalStore(store.subscribe, store.getRootSnapshot, store.getRootSnapshot)\n\n const make = useCallback(\n (kind: FieldKind) => (name: string, rules?: FieldRules): FieldBindings => {\n if (rules !== undefined) store.setRule(name, rules)\n return buildBindings(store, name, kind, store.getFieldSnapshot(name))\n },\n [store],\n )\n\n return {\n store,\n values: store.values,\n errors: store.errors,\n touched: store.touched,\n submitted: store.submitted,\n isSubmitting: store.validating,\n isValid: store.isValid,\n\n getValue: store.getValue,\n getValues: store.getValues,\n setValue: (name, value, opts) => store.setValue(name, value, opts),\n setValues: (patch) => store.setValues(patch),\n setError: store.setError,\n validateField: (name) => store.validateField(name),\n validateAll: () => store.validateAll(),\n reset: store.reset,\n\n field: make('value'),\n fieldNative: make('native'),\n fieldChecked: make('checked'),\n fieldTarget: make('target'),\n }\n}\n","import { createContext, useContext } from 'react'\nimport type { FormStore } from './store'\n\n/** The store provided by `<Form>` to descendant fields / field-arrays. */\nexport const FormContext = createContext<FormStore | null>(null)\n\n/** Read the enclosing `<Form>`'s store. Throws if used outside a `<Form>`. */\nexport function useFormStore(): FormStore {\n const store = useContext(FormContext)\n if (!store) {\n throw new Error('useFormStore must be used within a <Form>. Did you forget to wrap your fields?')\n }\n return store\n}\n","import React, { useRef } from 'react'\nimport { FormContext } from './context'\nimport type { UseFormReturn } from './useForm'\nimport type { ErrorMap } from './store'\nimport type { FormValues } from './validate'\n\nexport interface FormProps extends Omit<React.FormHTMLAttributes<HTMLFormElement>, 'onSubmit' | 'action'> {\n /** The instance from `useForm()`. */\n form: UseFormReturn\n /**\n * SPA submit handler — called with the validated values once all rules\n * pass. Receiving this puts the form in client mode (`preventDefault`).\n */\n onFinish?: (values: FormValues) => void | Promise<void>\n /** Called when a submit attempt fails validation. */\n onFinishFailed?: (errors: ErrorMap, values: FormValues) => void\n /**\n * SSR / progressive-enhancement submit. A function receives the native\n * `FormData` (React 19 server action style); a string is used as the\n * native `<form action>` URL. Either way the form validates first and only\n * proceeds when valid. Async rules are awaited before a native submit.\n */\n action?: string | ((data: FormData) => void | Promise<void>)\n children: React.ReactNode\n}\n\n/**\n * Form wrapper. Owns submission: on submit it marks the form submitted, runs\n * every field's rules, and only then dispatches — to `onFinish(values)` in SPA\n * mode or to `action` (function or native URL) for SSR. Renders a real\n * `<form noValidate>` so our inputs' `name`s serialise into `FormData` while we\n * still show our own validation messages.\n *\n * @example SPA\n * <Form form={form} onFinish={(v) => api.save(v)}>…</Form>\n * @example Server action (SSR)\n * <Form form={form} action={saveAction}>…</Form>\n */\nexport function Form({\n form,\n onFinish,\n onFinishFailed,\n action,\n children,\n ...rest\n}: FormProps) {\n const ref = useRef<HTMLFormElement>(null)\n // Lets the async path re-submit natively without re-running validation.\n const bypass = useRef(false)\n\n const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {\n if (bypass.current) { bypass.current = false; return } // native submit passes through\n e.preventDefault()\n\n const store = form.store\n store.setSubmitted(true)\n const errors = await store.validateAll()\n const hasError = Object.values(errors).some(Boolean)\n\n if (hasError) {\n onFinishFailed?.(errors, store.getValues())\n focusFirstError(ref.current, errors)\n return\n }\n\n if (onFinish) {\n await onFinish(store.getValues())\n return\n }\n\n if (typeof action === 'function') {\n action(new FormData(ref.current!))\n return\n }\n if (typeof action === 'string') {\n // Valid → let the browser POST/GET natively to the action URL.\n bypass.current = true\n ref.current!.requestSubmit()\n }\n }\n\n return (\n <FormContext.Provider value={form.store}>\n <form\n ref={ref}\n noValidate\n action={typeof action === 'string' ? action : undefined}\n onSubmit={handleSubmit}\n {...rest}\n >\n {children}\n </form>\n </FormContext.Provider>\n )\n}\n\n/** Move focus to the first control with an error, for keyboard + AT users. */\nfunction focusFirstError(formEl: HTMLFormElement | null, errors: ErrorMap) {\n if (!formEl) return\n const firstName = Object.keys(errors).find((k) => errors[k])\n if (!firstName) return\n const el = formEl.querySelector<HTMLElement>(`[name=\"${CSS.escape(firstName)}\"], #${CSS.escape(firstName)}`)\n el?.focus()\n}\n","import { useEffect, useSyncExternalStore } from 'react'\nimport { useFormStore } from './context'\nimport { buildBindings, type FieldBindings, type FieldKind } from './bindings'\nimport type { FieldRules } from './validate'\n\nexport interface UseFormFieldOptions {\n /** How the control reports changes. Default `'value'`. */\n kind?: FieldKind\n /** Rules for this field — registered on the form (and cleaned up on unmount). */\n rules?: FieldRules\n}\n\n/**\n * Subscribe a single field to the enclosing `<Form>`. Unlike reading bindings\n * off `useForm()`, this isolates re-renders to just this field via a memoized\n * per-field snapshot — the right choice for large or dynamic forms. Registering\n * `rules` here also unregisters them on unmount, which is what makes field\n * arrays validate correctly as rows come and go.\n *\n * @example\n * const email = useFormField('email', { kind: 'native', rules: { required: true } })\n * <TextInput label=\"Email\" {...email} />\n */\nexport function useFormField(name: string, options: UseFormFieldOptions = {}): FieldBindings {\n const store = useFormStore()\n const { kind = 'value', rules } = options\n\n // Register during render (idempotent) so `required` + submit validation see\n // the rule immediately; clean up on unmount so removed array rows don't\n // leave dangling rules behind.\n if (rules !== undefined && store.getRule(name) !== rules) store.setRule(name, rules)\n useEffect(() => {\n return () => { if (rules !== undefined) store.removeRule(name) }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [store, name])\n\n const snap = useSyncExternalStore(\n store.subscribe,\n () => store.getFieldSnapshot(name),\n )\n return buildBindings(store, name, kind, snap)\n}\n","import React from 'react'\nimport { useFormField, type UseFormFieldOptions } from './useFormField'\nimport type { FieldBindings } from './bindings'\n\nexport interface FormFieldProps extends UseFormFieldOptions {\n name: string\n /** Render-prop receiving the bindings to spread onto a control. */\n children: (field: FieldBindings) => React.ReactNode\n}\n\n/**\n * Render-prop wrapper around {@link useFormField}. Isolates a field's\n * re-renders from the rest of the form.\n *\n * @example\n * <FormField name=\"role\" rules={{ required: 'Pick a role' }}>\n * {(field) => <RadioGroup label=\"Role\" options={ROLES} {...field} />}\n * </FormField>\n */\nexport function FormField({ name, kind, rules, children }: FormFieldProps) {\n const field = useFormField(name, { kind, rules })\n return <>{children(field)}</>\n}\n","import { useSyncExternalStore } from 'react'\nimport { useFormStore } from './context'\n\nexport interface FieldArrayItem {\n /** Stable React key — survives reorders and removals. */\n key: number\n /** Dotted base path for this row, e.g. `\"contacts.2\"`. */\n name: string\n index: number\n}\n\nexport interface UseFieldArrayReturn {\n fields: FieldArrayItem[]\n /** Append a row (optionally seeded with values). */\n append: (item?: unknown) => void\n /** Remove the row at `index` (clears its errors/touched too). */\n remove: (index: number) => void\n /** Reorder a row. */\n move: (from: number, to: number) => void\n /** Replace the entire array. */\n replace: (items: unknown[]) => void\n}\n\n/**\n * Dynamic, AntD-style repeating fields. Returns rows with stable keys plus\n * add/remove/move helpers. Build each row's field names from `field.name`,\n * e.g. `${field.name}.email`.\n *\n * @example\n * const { fields, append, remove } = useFieldArray('contacts')\n * {fields.map((f, i) => (\n * <div key={f.key}>\n * <TextInput {...useFormField(`${f.name}.email`, { kind: 'native', rules: { required: true } })} />\n * <Button onClick={() => remove(i)}>Remove</Button>\n * </div>\n * ))}\n * <Button onClick={() => append({ email: '' })}>Add contact</Button>\n */\nexport function useFieldArray(name: string): UseFieldArrayReturn {\n const store = useFormStore()\n useSyncExternalStore(store.subscribe, store.getRootSnapshot, store.getRootSnapshot)\n\n const arr = (store.getValue(name) as unknown[]) ?? []\n const keys = store.getKeys(name)\n\n return {\n fields: arr.map((_, i) => ({ key: keys[i], name: `${name}.${i}`, index: i })),\n append: (item: unknown = {}) => store.arrayAppend(name, item),\n remove: (index: number) => store.arrayRemove(name, index),\n move: (from: number, to: number) => store.arrayMove(name, from, to),\n replace: (items: unknown[]) => store.setValue(name, items, { validate: false }),\n }\n}\n","/**\n * Zero-dependency credit-card helpers: brand detection, Luhn checksum, and\n * display formatting. Pure functions — no React, no deps — so they're unit\n * testable and reusable.\n */\n\nexport interface CardBrand {\n /** Stable id, e.g. `'visa'`. */\n id: string\n /** Human label, e.g. `'Visa'`. */\n label: string\n /** Short badge text, e.g. `'VISA'`. */\n short: string\n /** Accent colour for the brand badge (hex). */\n color: string\n /** Matches the leading digits of the card number. */\n pattern: RegExp\n /** Valid total digit lengths for this brand. */\n lengths: number[]\n /** Expected CVV length (3 for most, 4 for Amex). */\n cvv: number\n /** Zero-based digit indices to insert a space before (grouping). */\n gaps: number[]\n}\n\n/** Recognised brands, in match-priority order. */\nexport const CARD_BRANDS: CardBrand[] = [\n { id: 'amex', label: 'American Express', short: 'AMEX', color: '#1F72CD', pattern: /^3[47]/, lengths: [15], cvv: 4, gaps: [4, 10] },\n { id: 'visa', label: 'Visa', short: 'VISA', color: '#1A1F71', pattern: /^4/, lengths: [16, 18, 19], cvv: 3, gaps: [4, 8, 12, 16] },\n { id: 'mastercard', label: 'Mastercard', short: 'MC', color: '#EB001B', pattern: /^(5[1-5]|2[2-7])/, lengths: [16], cvv: 3, gaps: [4, 8, 12] },\n { id: 'discover', label: 'Discover', short: 'DISC', color: '#FF6000', pattern: /^(6011|64[4-9]|65)/, lengths: [16, 19], cvv: 3, gaps: [4, 8, 12] },\n { id: 'diners', label: 'Diners Club', short: 'DINERS', color: '#0079BE', pattern: /^(36|38|30[0-5])/, lengths: [14, 16, 19], cvv: 3, gaps: [4, 10] },\n { id: 'jcb', label: 'JCB', short: 'JCB', color: '#0B4EA2', pattern: /^35/, lengths: [16, 17, 18, 19], cvv: 3, gaps: [4, 8, 12] },\n]\n\n/** Strip everything but digits. */\nexport const onlyDigits = (s: string): string => (s || '').replace(/\\D/g, '')\n\n/** Detect the card brand from a (possibly partial) number. `null` if unknown. */\nexport function detectBrand(value: string): CardBrand | null {\n const d = onlyDigits(value)\n if (!d) return null\n return CARD_BRANDS.find((b) => b.pattern.test(d)) ?? null\n}\n\n/** Max digit length to accept for a value (longest length of its brand, else 19). */\nexport function maxCardLength(value: string): number {\n const b = detectBrand(value)\n return b ? Math.max(...b.lengths) : 19\n}\n\n/** Luhn (mod-10) checksum — the standard card-number integrity check. */\nexport function luhnValid(value: string): boolean {\n const s = onlyDigits(value)\n if (s.length < 12) return false\n let sum = 0\n let double = false\n for (let i = s.length - 1; i >= 0; i--) {\n let n = s.charCodeAt(i) - 48\n if (double) { n *= 2; if (n > 9) n -= 9 }\n sum += n\n double = !double\n }\n return sum % 10 === 0\n}\n\n/** Format a card number with brand-aware grouping (e.g. `4242 4242 4242 4242`). */\nexport function formatCardNumber(value: string): string {\n const brand = detectBrand(value)\n const digits = onlyDigits(value).slice(0, maxCardLength(value))\n const gaps = brand?.gaps ?? [4, 8, 12, 16]\n let out = ''\n for (let i = 0; i < digits.length; i++) {\n if (gaps.includes(i)) out += ' '\n out += digits[i]\n }\n return out\n}\n\n/** Validate a card number: known brand, complete length, passing Luhn. */\nexport function cardNumberError(value: string): string | undefined {\n const d = onlyDigits(value)\n if (!d) return 'Card number is required'\n const brand = detectBrand(d)\n if (!brand) return 'Unsupported card type'\n if (!brand.lengths.includes(d.length)) return 'Card number is incomplete'\n if (!luhnValid(d)) return 'Card number looks invalid'\n return undefined\n}\n\n/** Format expiry keystrokes into `MM/YY`, auto-padding the month and slashing. */\nexport function formatExpiry(value: string): string {\n let d = onlyDigits(value).slice(0, 4)\n // Auto-pad a single month digit > 1 (e.g. \"5\" → \"05\").\n if (d.length === 1 && d > '1') d = '0' + d\n if (d.length <= 2) return d\n return `${d.slice(0, 2)}/${d.slice(2)}`\n}\n\n/** Validate `MM/YY`: well-formed, real month, not in the past. */\nexport function expiryError(value: string, now: Date = new Date()): string | undefined {\n if (!value) return 'Expiry is required'\n const m = value.match(/^(\\d{2})\\/(\\d{2})$/)\n if (!m) return 'Use MM/YY'\n const mm = Number(m[1])\n const yy = Number(m[2])\n if (mm < 1 || mm > 12) return 'Invalid month'\n // Card is valid through the last day of its expiry month.\n const endOfMonth = new Date(2000 + yy, mm, 0, 23, 59, 59, 999)\n if (endOfMonth < now) return 'Card has expired'\n return undefined\n}\n\n/** Validate the CVV against the detected brand's expected length. */\nexport function cvvError(value: string, cardNumber: string): string | undefined {\n const need = detectBrand(cardNumber)?.cvv ?? 3\n const d = onlyDigits(value)\n if (!d) return 'CVV is required'\n if (d.length !== need) return `CVV must be ${need} digits`\n return undefined\n}\n","import React, { useEffect, useRef } from 'react'\nimport { useForm, Form } from '../../form'\nimport type { FormValues } from '../../form'\nimport TextInput from '../inputs/TextInput'\nimport Button from '../inputs/Button'\nimport type { FieldSize } from '../inputs/_field'\nimport {\n type CardBrand,\n detectBrand,\n formatCardNumber,\n formatExpiry,\n onlyDigits,\n cardNumberError,\n expiryError,\n cvvError,\n} from './creditCard'\n\n/** The normalised value emitted on change / submit. */\nexport interface CreditCardValue {\n /** Digits only (no spaces). */\n number: string\n /** Cardholder name. */\n name: string\n /** `MM/YY`. */\n expiry: string\n /** Digits only. */\n cvv: string\n /** Detected brand id (`'visa'`, `'amex'`…) or `null`. */\n brand: string | null\n}\n\nexport interface CreditCardFormProps {\n /** Called with the validated card once every field passes on submit. */\n onSubmit?: (card: CreditCardValue) => void | Promise<void>\n /** Called on every keystroke with the current (possibly invalid) card. */\n onChange?: (card: CreditCardValue) => void\n /** Seed the fields (uncontrolled). Number/expiry are auto-formatted. */\n defaultValue?: Partial<CreditCardValue>\n /** Size preset for the inner fields. Default `'md'`. */\n size?: FieldSize\n /** Disable every field + the submit button. */\n disabled?: boolean\n /** Require the cardholder name. Default `true`. */\n requireName?: boolean\n /** Hide the built-in submit button (when embedding in a larger form). */\n hideSubmit?: boolean\n /** Submit button label. Default `'Pay'`. */\n submitLabel?: React.ReactNode\n /** Extra classes on the root `<form>`. */\n className?: string\n /** Inline style on the root `<form>`. */\n style?: React.CSSProperties\n}\n\nconst toCard = (vals: FormValues): CreditCardValue => {\n const number = String(vals.number ?? '')\n return {\n number: onlyDigits(number),\n name: String(vals.name ?? ''),\n expiry: String(vals.expiry ?? ''),\n cvv: onlyDigits(String(vals.cvv ?? '')),\n brand: detectBrand(number)?.id ?? null,\n }\n}\n\n/** Small brand badge: a card glyph tinted to the brand + its short code. */\nfunction BrandMark({ brand }: { brand: CardBrand | null }) {\n return (\n <span className=\"flex items-center gap-1.5\" aria-live=\"polite\">\n <svg width=\"28\" height=\"18\" viewBox=\"0 0 28 18\" fill=\"none\" aria-hidden=\"true\">\n <rect x=\"0.5\" y=\"0.5\" width=\"27\" height=\"17\" rx=\"3\" fill=\"var(--color-surface-raised)\" stroke=\"var(--color-border)\" />\n <rect x=\"0.5\" y=\"3.75\" width=\"27\" height=\"3.5\" fill={brand ? brand.color : 'var(--color-border-strong)'} />\n </svg>\n {brand && (\n <span className=\"text-[10px] font-bold uppercase tracking-wide\" style={{ color: brand.color }}>\n {brand.short}\n </span>\n )}\n <span className=\"sr-only\">{brand ? brand.label : 'Unknown card type'}</span>\n </span>\n )\n}\n\n/**\n * Unified credit-card form built on the oxygen-ui {@link useForm} Form API.\n *\n * One component owns all four fields and their cross-field rules — card number\n * (brand detection + grouping + Luhn), expiry (`MM/YY`, real month, not past),\n * CVV (brand-aware length), and cardholder name. It is deliberately NOT shipped\n * as separate inputs: a CVV or expiry field has no meaning outside a card form.\n *\n * Self-contained: render it and handle `onSubmit(card)`; the card is only\n * delivered once everything validates. Use `onChange` for live updates (e.g. a\n * card preview) and `hideSubmit` to embed it inside a larger form.\n *\n * @example\n * <CreditCardForm onSubmit={(card) => pay(card)} submitLabel=\"Pay $49\" />\n */\nexport default function CreditCardForm({\n onSubmit,\n onChange,\n defaultValue,\n size = 'md',\n disabled,\n requireName = true,\n hideSubmit = false,\n submitLabel = 'Pay',\n className = '',\n style,\n}: CreditCardFormProps) {\n // Initial values are read once by useForm; seed (and format) from defaultValue.\n const initial = useRef<FormValues>({\n number: formatCardNumber(defaultValue?.number ?? ''),\n name: defaultValue?.name ?? '',\n expiry: formatExpiry(defaultValue?.expiry ?? ''),\n cvv: onlyDigits(defaultValue?.cvv ?? ''),\n }).current\n\n const form = useForm({ initialValues: initial })\n\n const numberStr = String(form.values.number ?? '')\n const brand = detectBrand(numberStr)\n\n // Live change callback.\n useEffect(() => {\n onChange?.(toCard(form.values))\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [form.values.number, form.values.name, form.values.expiry, form.values.cvv])\n\n // Base bindings (errorMessage + name + id) — value/onChange are overridden\n // below so we can format keystrokes brand-by-brand.\n const numberBind = form.fieldNative('number', {\n required: 'Card number is required',\n validate: (v) => cardNumberError(String(v)),\n })\n const nameBind = form.fieldNative('name', requireName ? { required: 'Cardholder name is required' } : undefined)\n const expiryBind = form.fieldNative('expiry', {\n required: 'Expiry is required',\n validate: (v) => expiryError(String(v)),\n })\n const cvvBind = form.fieldNative('cvv', {\n required: 'CVV is required',\n validate: (v) => cvvError(String(v), numberStr),\n })\n\n const cvvLen = brand?.cvv ?? 3\n\n return (\n <Form\n form={form}\n onFinish={(vals) => onSubmit?.(toCard(vals))}\n className={`flex flex-col gap-4 ${className}`.trim()}\n style={style}\n >\n <TextInput\n {...numberBind}\n label=\"Card number\"\n placeholder=\"1234 5678 9012 3456\"\n size={size}\n disabled={disabled}\n value={numberStr}\n onChange={(e) => form.setValue('number', formatCardNumber(e.target.value), { touch: true })}\n suffix={<BrandMark brand={brand} />}\n />\n\n <TextInput\n {...nameBind}\n label=\"Cardholder name\"\n placeholder=\"Jane Appleseed\"\n size={size}\n disabled={disabled}\n value={String(form.values.name ?? '')}\n onChange={(e) => form.setValue('name', e.target.value, { touch: true })}\n />\n\n <div className=\"flex items-start gap-3\">\n <div className=\"flex-1\">\n <TextInput\n {...expiryBind}\n label=\"Expiry\"\n placeholder=\"MM/YY\"\n size={size}\n disabled={disabled}\n value={String(form.values.expiry ?? '')}\n onChange={(e) => form.setValue('expiry', formatExpiry(e.target.value), { touch: true })}\n />\n </div>\n <div className=\"flex-1\">\n <TextInput\n {...cvvBind}\n label=\"CVV\"\n placeholder={cvvLen === 4 ? '1234' : '123'}\n size={size}\n disabled={disabled}\n value={String(form.values.cvv ?? '')}\n onChange={(e) => form.setValue('cvv', onlyDigits(e.target.value).slice(0, cvvLen), { touch: true })}\n />\n </div>\n </div>\n\n {!hideSubmit && (\n <Button content={submitLabel} buttonType=\"submit\" variant=\"primary\" disabled={disabled} />\n )}\n </Form>\n )\n}\n"]}