@fabio.caffarello/react-design-system 3.8.0 → 3.9.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/README.md +2 -1
- package/dist/granular/index.js +445 -0
- package/dist/granular/index.js.map +1 -0
- package/dist/granular/ui/components/Accordion/Accordion.js +105 -0
- package/dist/granular/ui/components/Accordion/Accordion.js.map +1 -0
- package/dist/granular/ui/components/Autocomplete/Autocomplete.js +133 -0
- package/dist/granular/ui/components/Autocomplete/Autocomplete.js.map +1 -0
- package/dist/granular/ui/components/Autocomplete/AutocompleteList.js +119 -0
- package/dist/granular/ui/components/Autocomplete/AutocompleteList.js.map +1 -0
- package/dist/granular/ui/components/Autocomplete/AutocompleteOption.js +42 -0
- package/dist/granular/ui/components/Autocomplete/AutocompleteOption.js.map +1 -0
- package/dist/granular/ui/components/Breadcrumb/Breadcrumb.js +100 -0
- package/dist/granular/ui/components/Breadcrumb/Breadcrumb.js.map +1 -0
- package/dist/granular/ui/components/Card/Card.js +113 -0
- package/dist/granular/ui/components/Card/Card.js.map +1 -0
- package/dist/granular/ui/components/Card/CardActions.js +51 -0
- package/dist/granular/ui/components/Card/CardActions.js.map +1 -0
- package/dist/granular/ui/components/Card/CardBody.js +32 -0
- package/dist/granular/ui/components/Card/CardBody.js.map +1 -0
- package/dist/granular/ui/components/Card/CardHeader.js +47 -0
- package/dist/granular/ui/components/Card/CardHeader.js.map +1 -0
- package/dist/granular/ui/components/Card/CardSubtitle.js +38 -0
- package/dist/granular/ui/components/Card/CardSubtitle.js.map +1 -0
- package/dist/granular/ui/components/Card/CardTitle.js +61 -0
- package/dist/granular/ui/components/Card/CardTitle.js.map +1 -0
- package/dist/granular/ui/components/ColorPicker/ColorPicker.js +250 -0
- package/dist/granular/ui/components/ColorPicker/ColorPicker.js.map +1 -0
- package/dist/granular/ui/components/CommandPalette/CommandPalette.js +274 -0
- package/dist/granular/ui/components/CommandPalette/CommandPalette.js.map +1 -0
- package/dist/granular/ui/components/DashboardLayout/DashboardLayout.js +37 -0
- package/dist/granular/ui/components/DashboardLayout/DashboardLayout.js.map +1 -0
- package/dist/granular/ui/components/DataGrid/DataGrid.js +155 -0
- package/dist/granular/ui/components/DataGrid/DataGrid.js.map +1 -0
- package/dist/granular/ui/components/DataTablePattern/DataTablePattern.js +113 -0
- package/dist/granular/ui/components/DataTablePattern/DataTablePattern.js.map +1 -0
- package/dist/granular/ui/components/DatePicker/DatePicker.js +126 -0
- package/dist/granular/ui/components/DatePicker/DatePicker.js.map +1 -0
- package/dist/granular/ui/components/DatePicker/DatePickerCalendar.js +294 -0
- package/dist/granular/ui/components/DatePicker/DatePickerCalendar.js.map +1 -0
- package/dist/granular/ui/components/DatePicker/DatePickerContext.js +16 -0
- package/dist/granular/ui/components/DatePicker/DatePickerContext.js.map +1 -0
- package/dist/granular/ui/components/DatePicker/DatePickerInput.js +119 -0
- package/dist/granular/ui/components/DatePicker/DatePickerInput.js.map +1 -0
- package/dist/granular/ui/components/DatePicker/DatePickerProvider.js +47 -0
- package/dist/granular/ui/components/DatePicker/DatePickerProvider.js.map +1 -0
- package/dist/granular/ui/components/Dialog/AlertDialog.js +48 -0
- package/dist/granular/ui/components/Dialog/AlertDialog.js.map +1 -0
- package/dist/granular/ui/components/Dialog/Dialog.js +36 -0
- package/dist/granular/ui/components/Dialog/Dialog.js.map +1 -0
- package/dist/granular/ui/components/Dialog/DialogClose.js +34 -0
- package/dist/granular/ui/components/Dialog/DialogClose.js.map +1 -0
- package/dist/granular/ui/components/Dialog/DialogContent.js +114 -0
- package/dist/granular/ui/components/Dialog/DialogContent.js.map +1 -0
- package/dist/granular/ui/components/Dialog/DialogDescription.js +51 -0
- package/dist/granular/ui/components/Dialog/DialogDescription.js.map +1 -0
- package/dist/granular/ui/components/Dialog/DialogFooter.js +45 -0
- package/dist/granular/ui/components/Dialog/DialogFooter.js.map +1 -0
- package/dist/granular/ui/components/Dialog/DialogHeader.js +45 -0
- package/dist/granular/ui/components/Dialog/DialogHeader.js.map +1 -0
- package/dist/granular/ui/components/Dialog/DialogTitle.js +53 -0
- package/dist/granular/ui/components/Dialog/DialogTitle.js.map +1 -0
- package/dist/granular/ui/components/Dialog/DialogTrigger.js +28 -0
- package/dist/granular/ui/components/Dialog/DialogTrigger.js.map +1 -0
- package/dist/granular/ui/components/Drawer/Drawer.js +47 -0
- package/dist/granular/ui/components/Drawer/Drawer.js.map +1 -0
- package/dist/granular/ui/components/Drawer/DrawerContent.js +140 -0
- package/dist/granular/ui/components/Drawer/DrawerContent.js.map +1 -0
- package/dist/granular/ui/components/Drawer/DrawerContext.js +21 -0
- package/dist/granular/ui/components/Drawer/DrawerContext.js.map +1 -0
- package/dist/granular/ui/components/Drawer/DrawerFooter.js +53 -0
- package/dist/granular/ui/components/Drawer/DrawerFooter.js.map +1 -0
- package/dist/granular/ui/components/Drawer/DrawerHeader.js +50 -0
- package/dist/granular/ui/components/Drawer/DrawerHeader.js.map +1 -0
- package/dist/granular/ui/components/Dropdown/Dropdown.js +243 -0
- package/dist/granular/ui/components/Dropdown/Dropdown.js.map +1 -0
- package/dist/granular/ui/components/EmptyState/EmptyState.js +102 -0
- package/dist/granular/ui/components/EmptyState/EmptyState.js.map +1 -0
- package/dist/granular/ui/components/FileUpload/FileUpload.js +342 -0
- package/dist/granular/ui/components/FileUpload/FileUpload.js.map +1 -0
- package/dist/granular/ui/components/Form/Form.js +184 -0
- package/dist/granular/ui/components/Form/Form.js.map +1 -0
- package/dist/granular/ui/components/Form/FormContext.js +19 -0
- package/dist/granular/ui/components/Form/FormContext.js.map +1 -0
- package/dist/granular/ui/components/Form/FormField.js +66 -0
- package/dist/granular/ui/components/Form/FormField.js.map +1 -0
- package/dist/granular/ui/components/Form/FormProvider.js +17 -0
- package/dist/granular/ui/components/Form/FormProvider.js.map +1 -0
- package/dist/granular/ui/components/Form/useFormFieldArray.js +29 -0
- package/dist/granular/ui/components/Form/useFormFieldArray.js.map +1 -0
- package/dist/granular/ui/components/FormWizardPattern/FormWizardPattern.js +121 -0
- package/dist/granular/ui/components/FormWizardPattern/FormWizardPattern.js.map +1 -0
- package/dist/granular/ui/components/Header/Header.js +98 -0
- package/dist/granular/ui/components/Header/Header.js.map +1 -0
- package/dist/granular/ui/components/Header/components/HeaderActions.js +21 -0
- package/dist/granular/ui/components/Header/components/HeaderActions.js.map +1 -0
- package/dist/granular/ui/components/Header/components/HeaderHamburger.js +31 -0
- package/dist/granular/ui/components/Header/components/HeaderHamburger.js.map +1 -0
- package/dist/granular/ui/components/Header/components/HeaderLogo.js +50 -0
- package/dist/granular/ui/components/Header/components/HeaderLogo.js.map +1 -0
- package/dist/granular/ui/components/Header/components/HeaderMobileMenu.js +38 -0
- package/dist/granular/ui/components/Header/components/HeaderMobileMenu.js.map +1 -0
- package/dist/granular/ui/components/Header/components/HeaderNavigation.js +27 -0
- package/dist/granular/ui/components/Header/components/HeaderNavigation.js.map +1 -0
- package/dist/granular/ui/components/Header/contexts/HeaderContext.js +49 -0
- package/dist/granular/ui/components/Header/contexts/HeaderContext.js.map +1 -0
- package/dist/granular/ui/components/LoginBox/LoginBox.js +84 -0
- package/dist/granular/ui/components/LoginBox/LoginBox.js.map +1 -0
- package/dist/granular/ui/components/Menu/Menu.js +45 -0
- package/dist/granular/ui/components/Menu/Menu.js.map +1 -0
- package/dist/granular/ui/components/Menu/MenuContent.js +94 -0
- package/dist/granular/ui/components/Menu/MenuContent.js.map +1 -0
- package/dist/granular/ui/components/Menu/MenuContext.js +21 -0
- package/dist/granular/ui/components/Menu/MenuContext.js.map +1 -0
- package/dist/granular/ui/components/Menu/MenuItem.js +93 -0
- package/dist/granular/ui/components/Menu/MenuItem.js.map +1 -0
- package/dist/granular/ui/components/Menu/MenuSeparator.js +46 -0
- package/dist/granular/ui/components/Menu/MenuSeparator.js.map +1 -0
- package/dist/granular/ui/components/Menu/MenuTrigger.js +71 -0
- package/dist/granular/ui/components/Menu/MenuTrigger.js.map +1 -0
- package/dist/granular/ui/components/Modal/Modal.js +171 -0
- package/dist/granular/ui/components/Modal/Modal.js.map +1 -0
- package/dist/granular/ui/components/MultiSelect/MultiSelect.js +193 -0
- package/dist/granular/ui/components/MultiSelect/MultiSelect.js.map +1 -0
- package/dist/granular/ui/components/Navigation/Navigation.js +141 -0
- package/dist/granular/ui/components/Navigation/Navigation.js.map +1 -0
- package/dist/granular/ui/components/PageHeader/PageHeader.js +95 -0
- package/dist/granular/ui/components/PageHeader/PageHeader.js.map +1 -0
- package/dist/granular/ui/components/Pagination/Pagination.js +156 -0
- package/dist/granular/ui/components/Pagination/Pagination.js.map +1 -0
- package/dist/granular/ui/components/Popover/Popover.js +171 -0
- package/dist/granular/ui/components/Popover/Popover.js.map +1 -0
- package/dist/granular/ui/components/Rating/Rating.js +110 -0
- package/dist/granular/ui/components/Rating/Rating.js.map +1 -0
- package/dist/granular/ui/components/SearchAndFilterPattern/SearchAndFilterPattern.js +120 -0
- package/dist/granular/ui/components/SearchAndFilterPattern/SearchAndFilterPattern.js.map +1 -0
- package/dist/granular/ui/components/SearchInput/SearchInput.js +103 -0
- package/dist/granular/ui/components/SearchInput/SearchInput.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/SideNavbar.js +143 -0
- package/dist/granular/ui/components/SideNavbar/SideNavbar.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/components/Navbar/Navbar.js +173 -0
- package/dist/granular/ui/components/SideNavbar/components/Navbar/Navbar.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/components/Navbar/NavbarGroup.js +87 -0
- package/dist/granular/ui/components/SideNavbar/components/Navbar/NavbarGroup.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/components/Navbar/NavbarItem.js +242 -0
- package/dist/granular/ui/components/SideNavbar/components/Navbar/NavbarItem.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/components/Navbar/NavbarSeparator.js +66 -0
- package/dist/granular/ui/components/SideNavbar/components/Navbar/NavbarSeparator.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/components/Navbar/NavbarToggle.js +108 -0
- package/dist/granular/ui/components/SideNavbar/components/Navbar/NavbarToggle.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/components/SideNavbarBackdrop.js +63 -0
- package/dist/granular/ui/components/SideNavbar/components/SideNavbarBackdrop.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/components/SideNavbarResizeHandle.js +113 -0
- package/dist/granular/ui/components/SideNavbar/components/SideNavbarResizeHandle.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/components/SideNavbarRoot.js +150 -0
- package/dist/granular/ui/components/SideNavbar/components/SideNavbarRoot.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/components/SideNavbarToggle.js +197 -0
- package/dist/granular/ui/components/SideNavbar/components/SideNavbarToggle.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/components/Sidebar/Sidebar.js +108 -0
- package/dist/granular/ui/components/SideNavbar/components/Sidebar/Sidebar.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/components/Sidebar/SidebarContent.js +71 -0
- package/dist/granular/ui/components/SideNavbar/components/Sidebar/SidebarContent.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/components/Sidebar/SidebarFooter.js +64 -0
- package/dist/granular/ui/components/SideNavbar/components/Sidebar/SidebarFooter.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/components/Sidebar/SidebarGroup.js +141 -0
- package/dist/granular/ui/components/SideNavbar/components/Sidebar/SidebarGroup.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/components/Sidebar/SidebarHeader.js +90 -0
- package/dist/granular/ui/components/SideNavbar/components/Sidebar/SidebarHeader.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/components/Sidebar/SidebarSlot.js +12 -0
- package/dist/granular/ui/components/SideNavbar/components/Sidebar/SidebarSlot.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/components/Sidebar/SidebarSlotContent.js +13 -0
- package/dist/granular/ui/components/SideNavbar/components/Sidebar/SidebarSlotContent.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/contexts/NavbarContext.js +20 -0
- package/dist/granular/ui/components/SideNavbar/contexts/NavbarContext.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/contexts/SideNavbarConfigContext.js +37 -0
- package/dist/granular/ui/components/SideNavbar/contexts/SideNavbarConfigContext.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/contexts/SideNavbarStateContext.js +20 -0
- package/dist/granular/ui/components/SideNavbar/contexts/SideNavbarStateContext.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/contexts/SideNavbarThemeContext.js +28 -0
- package/dist/granular/ui/components/SideNavbar/contexts/SideNavbarThemeContext.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/contexts/SideNavbarToggleContext.js +19 -0
- package/dist/granular/ui/components/SideNavbar/contexts/SideNavbarToggleContext.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/contexts/SidebarContext.js +20 -0
- package/dist/granular/ui/components/SideNavbar/contexts/SidebarContext.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/contexts/SidebarSlotContext.js +22 -0
- package/dist/granular/ui/components/SideNavbar/contexts/SidebarSlotContext.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/hooks/useFocusManagement.js +43 -0
- package/dist/granular/ui/components/SideNavbar/hooks/useFocusManagement.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/hooks/useGroupState.js +59 -0
- package/dist/granular/ui/components/SideNavbar/hooks/useGroupState.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/hooks/useKeyboardShortcut.js +34 -0
- package/dist/granular/ui/components/SideNavbar/hooks/useKeyboardShortcut.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/hooks/useResize.js +58 -0
- package/dist/granular/ui/components/SideNavbar/hooks/useResize.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/hooks/useResponsiveSidebar.js +35 -0
- package/dist/granular/ui/components/SideNavbar/hooks/useResponsiveSidebar.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/hooks/useSideNavbar.js +21 -0
- package/dist/granular/ui/components/SideNavbar/hooks/useSideNavbar.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/hooks/useSideNavbarContent.js +19 -0
- package/dist/granular/ui/components/SideNavbar/hooks/useSideNavbarContent.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/hooks/useSideNavbarNavigation.js +21 -0
- package/dist/granular/ui/components/SideNavbar/hooks/useSideNavbarNavigation.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/providers/SideNavbarConfigProvider.js +61 -0
- package/dist/granular/ui/components/SideNavbar/providers/SideNavbarConfigProvider.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/providers/SideNavbarProvider.js +82 -0
- package/dist/granular/ui/components/SideNavbar/providers/SideNavbarProvider.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/providers/SideNavbarStateProvider.js +165 -0
- package/dist/granular/ui/components/SideNavbar/providers/SideNavbarStateProvider.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/providers/SideNavbarThemeProvider.js +34 -0
- package/dist/granular/ui/components/SideNavbar/providers/SideNavbarThemeProvider.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/providers/SidebarSlotProvider.js +28 -0
- package/dist/granular/ui/components/SideNavbar/providers/SidebarSlotProvider.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/utils/parseKeyboardShortcut.js +60 -0
- package/dist/granular/ui/components/SideNavbar/utils/parseKeyboardShortcut.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/utils/parseWidth.js +19 -0
- package/dist/granular/ui/components/SideNavbar/utils/parseWidth.js.map +1 -0
- package/dist/granular/ui/components/Stat/Stat.js +84 -0
- package/dist/granular/ui/components/Stat/Stat.js.map +1 -0
- package/dist/granular/ui/components/Stat/StatGroup.js +61 -0
- package/dist/granular/ui/components/Stat/StatGroup.js.map +1 -0
- package/dist/granular/ui/components/Stepper/Stepper.js +248 -0
- package/dist/granular/ui/components/Stepper/Stepper.js.map +1 -0
- package/dist/granular/ui/components/Table/Table.js +162 -0
- package/dist/granular/ui/components/Table/Table.js.map +1 -0
- package/dist/granular/ui/components/Table/TableActions/TableActions.js +67 -0
- package/dist/granular/ui/components/Table/TableActions/TableActions.js.map +1 -0
- package/dist/granular/ui/components/Table/TableActions.js +44 -0
- package/dist/granular/ui/components/Table/TableActions.js.map +1 -0
- package/dist/granular/ui/components/Table/TableBody.js +134 -0
- package/dist/granular/ui/components/Table/TableBody.js.map +1 -0
- package/dist/granular/ui/components/Table/TableCell.js +40 -0
- package/dist/granular/ui/components/Table/TableCell.js.map +1 -0
- package/dist/granular/ui/components/Table/TableContext.js +19 -0
- package/dist/granular/ui/components/Table/TableContext.js.map +1 -0
- package/dist/granular/ui/components/Table/TableEmptyState.js +62 -0
- package/dist/granular/ui/components/Table/TableEmptyState.js.map +1 -0
- package/dist/granular/ui/components/Table/TableFilters/TableFilters.js +189 -0
- package/dist/granular/ui/components/Table/TableFilters/TableFilters.js.map +1 -0
- package/dist/granular/ui/components/Table/TableFilters.js +48 -0
- package/dist/granular/ui/components/Table/TableFilters.js.map +1 -0
- package/dist/granular/ui/components/Table/TableHeader.js +45 -0
- package/dist/granular/ui/components/Table/TableHeader.js.map +1 -0
- package/dist/granular/ui/components/Table/TableHeaderCell.js +117 -0
- package/dist/granular/ui/components/Table/TableHeaderCell.js.map +1 -0
- package/dist/granular/ui/components/Table/TableHeaderRow.js +89 -0
- package/dist/granular/ui/components/Table/TableHeaderRow.js.map +1 -0
- package/dist/granular/ui/components/Table/TablePagination/TablePagination.js +216 -0
- package/dist/granular/ui/components/Table/TablePagination/TablePagination.js.map +1 -0
- package/dist/granular/ui/components/Table/TablePagination.js +56 -0
- package/dist/granular/ui/components/Table/TablePagination.js.map +1 -0
- package/dist/granular/ui/components/Table/TableProvider.js +244 -0
- package/dist/granular/ui/components/Table/TableProvider.js.map +1 -0
- package/dist/granular/ui/components/Table/TableRow.js +95 -0
- package/dist/granular/ui/components/Table/TableRow.js.map +1 -0
- package/dist/granular/ui/components/Table/useColumnResizing.js +71 -0
- package/dist/granular/ui/components/Table/useColumnResizing.js.map +1 -0
- package/dist/granular/ui/components/Table/useVirtualScrolling.js +50 -0
- package/dist/granular/ui/components/Table/useVirtualScrolling.js.map +1 -0
- package/dist/granular/ui/components/Tabs/Tabs.js +39 -0
- package/dist/granular/ui/components/Tabs/Tabs.js.map +1 -0
- package/dist/granular/ui/components/Tabs/TabsContent.js +59 -0
- package/dist/granular/ui/components/Tabs/TabsContent.js.map +1 -0
- package/dist/granular/ui/components/Tabs/TabsContext.js +18 -0
- package/dist/granular/ui/components/Tabs/TabsContext.js.map +1 -0
- package/dist/granular/ui/components/Tabs/TabsList.js +84 -0
- package/dist/granular/ui/components/Tabs/TabsList.js.map +1 -0
- package/dist/granular/ui/components/Tabs/TabsProvider.js +31 -0
- package/dist/granular/ui/components/Tabs/TabsProvider.js.map +1 -0
- package/dist/granular/ui/components/Tabs/TabsTrigger.js +103 -0
- package/dist/granular/ui/components/Tabs/TabsTrigger.js.map +1 -0
- package/dist/granular/ui/components/TimePicker/TimePicker.js +216 -0
- package/dist/granular/ui/components/TimePicker/TimePicker.js.map +1 -0
- package/dist/granular/ui/components/Timeline/Timeline.js +152 -0
- package/dist/granular/ui/components/Timeline/Timeline.js.map +1 -0
- package/dist/granular/ui/components/Toast/Toast.js +159 -0
- package/dist/granular/ui/components/Toast/Toast.js.map +1 -0
- package/dist/granular/ui/components/Toast/ToastContainer.js +41 -0
- package/dist/granular/ui/components/Toast/ToastContainer.js.map +1 -0
- package/dist/granular/ui/components/Toast/useToast.js +64 -0
- package/dist/granular/ui/components/Toast/useToast.js.map +1 -0
- package/dist/granular/ui/hooks/createGenericContext.js +27 -0
- package/dist/granular/ui/hooks/createGenericContext.js.map +1 -0
- package/dist/granular/ui/hooks/focusable.js +14 -0
- package/dist/granular/ui/hooks/focusable.js.map +1 -0
- package/dist/granular/ui/hooks/useAutoFocus.js +23 -0
- package/dist/granular/ui/hooks/useAutoFocus.js.map +1 -0
- package/dist/granular/ui/hooks/useCollapsible.js +37 -0
- package/dist/granular/ui/hooks/useCollapsible.js.map +1 -0
- package/dist/granular/ui/hooks/useFocusRestore.js +20 -0
- package/dist/granular/ui/hooks/useFocusRestore.js.map +1 -0
- package/dist/granular/ui/hooks/useFocusTrap.js +31 -0
- package/dist/granular/ui/hooks/useFocusTrap.js.map +1 -0
- package/dist/granular/ui/hooks/useScrollSpy.js +23 -0
- package/dist/granular/ui/hooks/useScrollSpy.js.map +1 -0
- package/dist/granular/ui/layouts/Container/Container.js +73 -0
- package/dist/granular/ui/layouts/Container/Container.js.map +1 -0
- package/dist/granular/ui/layouts/Stack/Stack.js +79 -0
- package/dist/granular/ui/layouts/Stack/Stack.js.map +1 -0
- package/dist/granular/ui/primitives/Avatar/Avatar.js +122 -0
- package/dist/granular/ui/primitives/Avatar/Avatar.js.map +1 -0
- package/dist/granular/ui/primitives/Avatar/AvatarGroup.js +97 -0
- package/dist/granular/ui/primitives/Avatar/AvatarGroup.js.map +1 -0
- package/dist/granular/ui/primitives/Badge/Badge.js +212 -0
- package/dist/granular/ui/primitives/Badge/Badge.js.map +1 -0
- package/dist/granular/ui/primitives/Button/Button.js +288 -0
- package/dist/granular/ui/primitives/Button/Button.js.map +1 -0
- package/dist/granular/ui/primitives/Checkbox/Checkbox.js +129 -0
- package/dist/granular/ui/primitives/Checkbox/Checkbox.js.map +1 -0
- package/dist/granular/ui/primitives/Chip/Chip.js +206 -0
- package/dist/granular/ui/primitives/Chip/Chip.js.map +1 -0
- package/dist/granular/ui/primitives/Collapsible/Collapsible.js +115 -0
- package/dist/granular/ui/primitives/Collapsible/Collapsible.js.map +1 -0
- package/dist/granular/ui/primitives/ErrorMessage/ErrorMessage.js +54 -0
- package/dist/granular/ui/primitives/ErrorMessage/ErrorMessage.js.map +1 -0
- package/dist/granular/ui/primitives/Info/Info.js +57 -0
- package/dist/granular/ui/primitives/Info/Info.js.map +1 -0
- package/dist/granular/ui/primitives/Input/Input.js +351 -0
- package/dist/granular/ui/primitives/Input/Input.js.map +1 -0
- package/dist/granular/ui/primitives/Label/Label.js +61 -0
- package/dist/granular/ui/primitives/Label/Label.js.map +1 -0
- package/dist/granular/ui/primitives/NavLink/NavLink.js +229 -0
- package/dist/granular/ui/primitives/NavLink/NavLink.js.map +1 -0
- package/dist/granular/ui/primitives/NavLink/hooks/useNavLink.js +15 -0
- package/dist/granular/ui/primitives/NavLink/hooks/useNavLink.js.map +1 -0
- package/dist/granular/ui/primitives/Progress/Progress.js +182 -0
- package/dist/granular/ui/primitives/Progress/Progress.js.map +1 -0
- package/dist/granular/ui/primitives/Radio/Radio.js +118 -0
- package/dist/granular/ui/primitives/Radio/Radio.js.map +1 -0
- package/dist/granular/ui/primitives/Select/Select.js +210 -0
- package/dist/granular/ui/primitives/Select/Select.js.map +1 -0
- package/dist/granular/ui/primitives/Separator/Separator.js +69 -0
- package/dist/granular/ui/primitives/Separator/Separator.js.map +1 -0
- package/dist/granular/ui/primitives/Skeleton/Skeleton.js +87 -0
- package/dist/granular/ui/primitives/Skeleton/Skeleton.js.map +1 -0
- package/dist/granular/ui/primitives/Slider/Slider.js +291 -0
- package/dist/granular/ui/primitives/Slider/Slider.js.map +1 -0
- package/dist/granular/ui/primitives/Spinner/Spinner.js +95 -0
- package/dist/granular/ui/primitives/Spinner/Spinner.js.map +1 -0
- package/dist/granular/ui/primitives/Switch/Switch.js +212 -0
- package/dist/granular/ui/primitives/Switch/Switch.js.map +1 -0
- package/dist/granular/ui/primitives/Text/Text.js +118 -0
- package/dist/granular/ui/primitives/Text/Text.js.map +1 -0
- package/dist/granular/ui/primitives/Textarea/Textarea.js +129 -0
- package/dist/granular/ui/primitives/Textarea/Textarea.js.map +1 -0
- package/dist/granular/ui/primitives/Tooltip/Tooltip.js +227 -0
- package/dist/granular/ui/primitives/Tooltip/Tooltip.js.map +1 -0
- package/dist/granular/ui/providers/AppProvider.js +50 -0
- package/dist/granular/ui/providers/AppProvider.js.map +1 -0
- package/dist/granular/ui/providers/ConfigProvider.js +95 -0
- package/dist/granular/ui/providers/ConfigProvider.js.map +1 -0
- package/dist/granular/ui/providers/DialogContext.js +20 -0
- package/dist/granular/ui/providers/DialogContext.js.map +1 -0
- package/dist/granular/ui/providers/DialogProvider.js +32 -0
- package/dist/granular/ui/providers/DialogProvider.js.map +1 -0
- package/dist/granular/ui/providers/ThemeProvider.js +56 -0
- package/dist/granular/ui/providers/ThemeProvider.js.map +1 -0
- package/dist/granular/ui/providers/ToastContext.js +20 -0
- package/dist/granular/ui/providers/ToastContext.js.map +1 -0
- package/dist/granular/ui/providers/ToastProvider.js +47 -0
- package/dist/granular/ui/providers/ToastProvider.js.map +1 -0
- package/dist/granular/ui/providers/providers-bundle.js +23 -0
- package/dist/granular/ui/providers/providers-bundle.js.map +1 -0
- package/dist/granular/ui/tokens/animations.js +106 -0
- package/dist/granular/ui/tokens/animations.js.map +1 -0
- package/dist/granular/ui/tokens/borders.js +54 -0
- package/dist/granular/ui/tokens/borders.js.map +1 -0
- package/dist/granular/ui/tokens/breakpoints.js +43 -0
- package/dist/granular/ui/tokens/breakpoints.js.map +1 -0
- package/dist/granular/ui/tokens/colors/brand.js +67 -0
- package/dist/granular/ui/tokens/colors/brand.js.map +1 -0
- package/dist/granular/ui/tokens/colors/index.js +25 -0
- package/dist/granular/ui/tokens/colors/index.js.map +1 -0
- package/dist/granular/ui/tokens/colors/primitives.js +320 -0
- package/dist/granular/ui/tokens/colors/primitives.js.map +1 -0
- package/dist/granular/ui/tokens/colors/semantic.js +212 -0
- package/dist/granular/ui/tokens/colors/semantic.js.map +1 -0
- package/dist/granular/ui/tokens/colors/types.js +18 -0
- package/dist/granular/ui/tokens/colors/types.js.map +1 -0
- package/dist/granular/ui/tokens/colors/utils.js +131 -0
- package/dist/granular/ui/tokens/colors/utils.js.map +1 -0
- package/dist/granular/ui/tokens/opacity.js +59 -0
- package/dist/granular/ui/tokens/opacity.js.map +1 -0
- package/dist/granular/ui/tokens/radius.js +76 -0
- package/dist/granular/ui/tokens/radius.js.map +1 -0
- package/dist/granular/ui/tokens/shadows.js +63 -0
- package/dist/granular/ui/tokens/shadows.js.map +1 -0
- package/dist/granular/ui/tokens/sidebar.js +92 -0
- package/dist/granular/ui/tokens/sidebar.js.map +1 -0
- package/dist/granular/ui/tokens/spacing.js +143 -0
- package/dist/granular/ui/tokens/spacing.js.map +1 -0
- package/dist/granular/ui/tokens/switch.js +51 -0
- package/dist/granular/ui/tokens/switch.js.map +1 -0
- package/dist/granular/ui/tokens/typography.js +146 -0
- package/dist/granular/ui/tokens/typography.js.map +1 -0
- package/dist/granular/ui/tokens/z-index.js +79 -0
- package/dist/granular/ui/tokens/z-index.js.map +1 -0
- package/dist/granular/ui/utils/cn.js +10 -0
- package/dist/granular/ui/utils/cn.js.map +1 -0
- package/dist/granular/ui/utils/cva.js +14 -0
- package/dist/granular/ui/utils/cva.js.map +1 -0
- package/dist/granular/ui/utils/mergeRefs.js +11 -0
- package/dist/granular/ui/utils/mergeRefs.js.map +1 -0
- package/dist/granular/vite.svg +1 -0
- package/dist/index.cjs +37 -37
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1052 -1053
- package/dist/index.js.map +1 -1
- package/dist/server/index.cjs +23 -23
- package/dist/server/index.cjs.map +1 -1
- package/dist/server/index.js +858 -1193
- package/dist/server/index.js.map +1 -1
- package/package.json +9 -2
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
var S = Object.defineProperty, I = Object.defineProperties;
|
|
3
|
+
var L = Object.getOwnPropertyDescriptors;
|
|
4
|
+
var i = Object.getOwnPropertySymbols;
|
|
5
|
+
var x = Object.prototype.hasOwnProperty, b = Object.prototype.propertyIsEnumerable;
|
|
6
|
+
var y = (e, a, t) => a in e ? S(e, a, { enumerable: !0, configurable: !0, writable: !0, value: t }) : e[a] = t, v = (e, a) => {
|
|
7
|
+
for (var t in a || (a = {}))
|
|
8
|
+
x.call(a, t) && y(e, t, a[t]);
|
|
9
|
+
if (i)
|
|
10
|
+
for (var t of i(a))
|
|
11
|
+
b.call(a, t) && y(e, t, a[t]);
|
|
12
|
+
return e;
|
|
13
|
+
}, g = (e, a) => I(e, L(a));
|
|
14
|
+
var h = (e, a) => {
|
|
15
|
+
var t = {};
|
|
16
|
+
for (var o in e)
|
|
17
|
+
x.call(e, o) && a.indexOf(o) < 0 && (t[o] = e[o]);
|
|
18
|
+
if (e != null && i)
|
|
19
|
+
for (var o of i(e))
|
|
20
|
+
a.indexOf(o) < 0 && b.call(e, o) && (t[o] = e[o]);
|
|
21
|
+
return t;
|
|
22
|
+
};
|
|
23
|
+
import { jsxs as d, jsx as l } from "react/jsx-runtime";
|
|
24
|
+
import { useRef as P, useEffect as p } from "react";
|
|
25
|
+
import { createPortal as T } from "react-dom";
|
|
26
|
+
import { X as w } from "lucide-react";
|
|
27
|
+
import { getRadiusClass as z } from "../../tokens/radius.js";
|
|
28
|
+
import { getShadowClass as A } from "../../tokens/shadows.js";
|
|
29
|
+
import { getSpacingClass as r } from "../../tokens/spacing.js";
|
|
30
|
+
import { getZIndexClass as M } from "../../tokens/z-index.js";
|
|
31
|
+
import { useFocusRestore as X } from "../../hooks/useFocusRestore.js";
|
|
32
|
+
import { useFocusTrap as Z } from "../../hooks/useFocusTrap.js";
|
|
33
|
+
import { useAutoFocus as q } from "../../hooks/useAutoFocus.js";
|
|
34
|
+
function ee(B) {
|
|
35
|
+
var f = B, {
|
|
36
|
+
isOpen: e,
|
|
37
|
+
onClose: a,
|
|
38
|
+
title: t,
|
|
39
|
+
children: o,
|
|
40
|
+
variant: N = "default",
|
|
41
|
+
showCloseButton: m = !0,
|
|
42
|
+
footer: c,
|
|
43
|
+
className: C = ""
|
|
44
|
+
} = f, j = h(f, [
|
|
45
|
+
"isOpen",
|
|
46
|
+
"onClose",
|
|
47
|
+
"title",
|
|
48
|
+
"children",
|
|
49
|
+
"variant",
|
|
50
|
+
"showCloseButton",
|
|
51
|
+
"footer",
|
|
52
|
+
"className"
|
|
53
|
+
]);
|
|
54
|
+
const n = P(null);
|
|
55
|
+
if (X(e), Z(n, e), q(n, e), p(() => {
|
|
56
|
+
if (!e) return;
|
|
57
|
+
const s = (F) => {
|
|
58
|
+
F.key === "Escape" && a();
|
|
59
|
+
};
|
|
60
|
+
return document.addEventListener("keydown", s), () => {
|
|
61
|
+
document.removeEventListener("keydown", s);
|
|
62
|
+
};
|
|
63
|
+
}, [e, a]), p(() => (e ? document.body.style.overflow = "hidden" : document.body.style.overflow = "", () => {
|
|
64
|
+
document.body.style.overflow = "";
|
|
65
|
+
}), [e]), !e) return null;
|
|
66
|
+
const k = [
|
|
67
|
+
"fixed",
|
|
68
|
+
"inset-0",
|
|
69
|
+
M("modal"),
|
|
70
|
+
"overflow-y-auto"
|
|
71
|
+
], E = ["fixed", "inset-0", "bg-scrim", "transition-opacity"], $ = {
|
|
72
|
+
default: "max-w-md",
|
|
73
|
+
large: "max-w-2xl",
|
|
74
|
+
fullscreen: "max-w-full h-full"
|
|
75
|
+
}, R = [
|
|
76
|
+
"relative",
|
|
77
|
+
"bg-surface-overlay",
|
|
78
|
+
z("lg"),
|
|
79
|
+
A("xl"),
|
|
80
|
+
r("xl", "my"),
|
|
81
|
+
"mx-auto",
|
|
82
|
+
$[N],
|
|
83
|
+
r("lg", "p"),
|
|
84
|
+
C
|
|
85
|
+
].filter(Boolean).join(" "), u = /* @__PURE__ */ d(
|
|
86
|
+
"div",
|
|
87
|
+
{
|
|
88
|
+
className: k.join(" "),
|
|
89
|
+
role: "dialog",
|
|
90
|
+
"aria-modal": "true",
|
|
91
|
+
"aria-labelledby": t ? "modal-title" : void 0,
|
|
92
|
+
onClick: (s) => {
|
|
93
|
+
s.target === s.currentTarget && a();
|
|
94
|
+
},
|
|
95
|
+
children: [
|
|
96
|
+
/* @__PURE__ */ l("div", { className: E.join(" "), "aria-hidden": "true" }),
|
|
97
|
+
/* @__PURE__ */ l(
|
|
98
|
+
"div",
|
|
99
|
+
{
|
|
100
|
+
className: `flex min-h-full items-center justify-center ${r("base", "p")}`,
|
|
101
|
+
children: /* @__PURE__ */ d(
|
|
102
|
+
"div",
|
|
103
|
+
g(v({
|
|
104
|
+
ref: n,
|
|
105
|
+
tabIndex: -1,
|
|
106
|
+
className: R,
|
|
107
|
+
onClick: (s) => s.stopPropagation()
|
|
108
|
+
}, j), {
|
|
109
|
+
children: [
|
|
110
|
+
t && /* @__PURE__ */ d(
|
|
111
|
+
"div",
|
|
112
|
+
{
|
|
113
|
+
className: `flex justify-between items-center ${r("base", "mb")}`,
|
|
114
|
+
children: [
|
|
115
|
+
/* @__PURE__ */ l(
|
|
116
|
+
"h2",
|
|
117
|
+
{
|
|
118
|
+
id: "modal-title",
|
|
119
|
+
className: "text-xl font-semibold text-fg-primary",
|
|
120
|
+
children: t
|
|
121
|
+
}
|
|
122
|
+
),
|
|
123
|
+
m && /* @__PURE__ */ l(
|
|
124
|
+
"button",
|
|
125
|
+
{
|
|
126
|
+
onClick: a,
|
|
127
|
+
className: "text-fg-tertiary hover:text-fg-secondary focus:outline-none",
|
|
128
|
+
"aria-label": "Close modal",
|
|
129
|
+
children: /* @__PURE__ */ l(w, { className: "h-6 w-6" })
|
|
130
|
+
}
|
|
131
|
+
)
|
|
132
|
+
]
|
|
133
|
+
}
|
|
134
|
+
),
|
|
135
|
+
!t && m && /* @__PURE__ */ l(
|
|
136
|
+
"div",
|
|
137
|
+
{
|
|
138
|
+
className: `flex justify-end ${r("base", "mb")}`,
|
|
139
|
+
children: /* @__PURE__ */ l(
|
|
140
|
+
"button",
|
|
141
|
+
{
|
|
142
|
+
onClick: a,
|
|
143
|
+
className: "text-fg-tertiary hover:text-fg-secondary focus:outline-none",
|
|
144
|
+
"aria-label": "Close modal",
|
|
145
|
+
children: /* @__PURE__ */ l(w, { className: "h-6 w-6" })
|
|
146
|
+
}
|
|
147
|
+
)
|
|
148
|
+
}
|
|
149
|
+
),
|
|
150
|
+
/* @__PURE__ */ l("div", { className: r("base", "mb"), children: o }),
|
|
151
|
+
c && /* @__PURE__ */ l(
|
|
152
|
+
"div",
|
|
153
|
+
{
|
|
154
|
+
className: `flex justify-end ${r("sm", "gap")} ${r("base", "mt")}`,
|
|
155
|
+
children: c
|
|
156
|
+
}
|
|
157
|
+
)
|
|
158
|
+
]
|
|
159
|
+
})
|
|
160
|
+
)
|
|
161
|
+
}
|
|
162
|
+
)
|
|
163
|
+
]
|
|
164
|
+
}
|
|
165
|
+
);
|
|
166
|
+
return typeof window != "undefined" ? T(u, document.body) : u;
|
|
167
|
+
}
|
|
168
|
+
export {
|
|
169
|
+
ee as default
|
|
170
|
+
};
|
|
171
|
+
//# sourceMappingURL=Modal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Modal.js","sources":["../../../../../src/ui/components/Modal/Modal.tsx"],"sourcesContent":["\"use client\";\n\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { useEffect, useRef } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { X } from \"lucide-react\";\nimport { getRadiusClass } from \"../../tokens/radius\";\nimport { getShadowClass } from \"../../tokens/shadows\";\nimport { getSpacingClass } from \"../../tokens/spacing\";\nimport { getZIndexClass } from \"../../tokens/z-index\";\nimport { useFocusRestore } from \"../../hooks/useFocusRestore\";\nimport { useFocusTrap } from \"../../hooks/useFocusTrap\";\nimport { useAutoFocus } from \"../../hooks/useAutoFocus\";\n\ninterface Props extends HTMLAttributes<HTMLDivElement> {\n isOpen: boolean;\n onClose: () => void;\n title?: string;\n children: ReactNode;\n variant?: \"default\" | \"large\" | \"fullscreen\";\n showCloseButton?: boolean;\n footer?: ReactNode;\n}\n\n/**\n * Modal Component\n *\n * A modal/dialog component with overlay, portal rendering, and accessibility.\n * Follows Atomic Design principles as an Organism component.\n *\n * @example\n * ```tsx\n * <Modal isOpen={isOpen} onClose={handleClose} title=\"Confirm Action\">\n * <p>Are you sure?</p>\n * </Modal>\n * ```\n */\nexport default function Modal({\n isOpen,\n onClose,\n title,\n children,\n variant = \"default\",\n showCloseButton = true,\n footer,\n className = \"\",\n ...props\n}: Props) {\n const modalRef = useRef<HTMLDivElement>(null);\n\n // Modal focus contract: trap + restore + auto-focus from the shared\n // Phase 3 hooks. Replaces an inline implementation that snapshotted\n // document.activeElement, focused the modal CONTAINER (not its first\n // focusable child), and restored on cleanup. The hook variant of\n // auto-focus targets the first focusable inside the modal — matching\n // Dialog/Drawer post-PR-#138/#140 — and falls back to focusing the\n // container with tabindex=-1 when no focusable child exists, so the\n // existing tabIndex={-1} on the inner div still has a job to do in\n // that fallback path. The trap was MISSING pre-PR-#141: Modal\n // declared aria-modal=true without any Tab interception, identical\n // shape to the Drawer gap closed in #138. WCAG 2.4.3.\n useFocusRestore(isOpen);\n useFocusTrap(modalRef, isOpen);\n useAutoFocus(modalRef, isOpen);\n\n // ESC handling stays inline. Same shape as the Dialog/Drawer parallel\n // handlers — the shared hooks intentionally don't know about\n // close-callback semantics.\n useEffect(() => {\n if (!isOpen) return;\n\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n onClose();\n }\n };\n\n document.addEventListener(\"keydown\", handleEscape);\n return () => {\n document.removeEventListener(\"keydown\", handleEscape);\n };\n }, [isOpen, onClose]);\n\n // Prevent body scroll when modal is open\n useEffect(() => {\n if (isOpen) {\n document.body.style.overflow = \"hidden\";\n } else {\n document.body.style.overflow = \"\";\n }\n return () => {\n document.body.style.overflow = \"\";\n };\n }, [isOpen]);\n\n if (!isOpen) return null;\n\n const baseClasses = [\n \"fixed\",\n \"inset-0\",\n getZIndexClass(\"modal\"),\n \"overflow-y-auto\",\n ];\n\n const overlayClasses = [\"fixed\", \"inset-0\", \"bg-scrim\", \"transition-opacity\"];\n\n const modalSizeClasses: Record<NonNullable<Props[\"variant\"]>, string> = {\n default: \"max-w-md\",\n large: \"max-w-2xl\",\n fullscreen: \"max-w-full h-full\",\n };\n\n const modalClasses = [\n \"relative\",\n \"bg-surface-overlay\",\n getRadiusClass(\"lg\"),\n getShadowClass(\"xl\"),\n getSpacingClass(\"xl\", \"my\"),\n \"mx-auto\",\n modalSizeClasses[variant],\n getSpacingClass(\"lg\", \"p\"),\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n const modalContent = (\n <div\n className={baseClasses.join(\" \")}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={title ? \"modal-title\" : undefined}\n onClick={(e) => {\n if (e.target === e.currentTarget) {\n onClose();\n }\n }}\n >\n <div className={overlayClasses.join(\" \")} aria-hidden=\"true\" />\n <div\n className={`flex min-h-full items-center justify-center ${getSpacingClass(\"base\", \"p\")}`}\n >\n <div\n ref={modalRef}\n tabIndex={-1}\n className={modalClasses}\n onClick={(e) => e.stopPropagation()}\n {...props}\n >\n {title && (\n <div\n className={`flex justify-between items-center ${getSpacingClass(\"base\", \"mb\")}`}\n >\n <h2\n id=\"modal-title\"\n className=\"text-xl font-semibold text-fg-primary\"\n >\n {title}\n </h2>\n {showCloseButton && (\n <button\n onClick={onClose}\n className=\"text-fg-tertiary hover:text-fg-secondary focus:outline-none\"\n aria-label=\"Close modal\"\n >\n <X className=\"h-6 w-6\" />\n </button>\n )}\n </div>\n )}\n {!title && showCloseButton && (\n <div\n className={`flex justify-end ${getSpacingClass(\"base\", \"mb\")}`}\n >\n <button\n onClick={onClose}\n className=\"text-fg-tertiary hover:text-fg-secondary focus:outline-none\"\n aria-label=\"Close modal\"\n >\n <X className=\"h-6 w-6\" />\n </button>\n </div>\n )}\n <div className={getSpacingClass(\"base\", \"mb\")}>{children}</div>\n {footer && (\n <div\n className={`flex justify-end ${getSpacingClass(\"sm\", \"gap\")} ${getSpacingClass(\"base\", \"mt\")}`}\n >\n {footer}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n\n // Portal rendering to avoid z-index issues\n if (typeof window !== \"undefined\") {\n return createPortal(modalContent, document.body);\n }\n\n return modalContent;\n}\n"],"names":["Modal","_a","_b","isOpen","onClose","title","children","variant","showCloseButton","footer","className","props","__objRest","modalRef","useRef","useFocusRestore","useFocusTrap","useAutoFocus","useEffect","handleEscape","e","baseClasses","getZIndexClass","overlayClasses","modalSizeClasses","modalClasses","getRadiusClass","getShadowClass","getSpacingClass","modalContent","jsxs","jsx","__spreadProps","__spreadValues","X","createPortal"],"mappings":"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"}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
var te = Object.defineProperty, le = Object.defineProperties;
|
|
3
|
+
var se = Object.getOwnPropertyDescriptors;
|
|
4
|
+
var j = Object.getOwnPropertySymbols;
|
|
5
|
+
var ie = Object.prototype.hasOwnProperty, re = Object.prototype.propertyIsEnumerable;
|
|
6
|
+
var K = (c, l, r) => l in c ? te(c, l, { enumerable: !0, configurable: !0, writable: !0, value: r }) : c[l] = r, M = (c, l) => {
|
|
7
|
+
for (var r in l || (l = {}))
|
|
8
|
+
ie.call(l, r) && K(c, r, l[r]);
|
|
9
|
+
if (j)
|
|
10
|
+
for (var r of j(l))
|
|
11
|
+
re.call(l, r) && K(c, r, l[r]);
|
|
12
|
+
return c;
|
|
13
|
+
}, B = (c, l) => le(c, se(l));
|
|
14
|
+
import { jsxs as H, jsx as m } from "react/jsx-runtime";
|
|
15
|
+
import { forwardRef as ne, useId as ue, useState as x, useRef as y, useEffect as ae } from "react";
|
|
16
|
+
import ce from "../../primitives/Chip/Chip.js";
|
|
17
|
+
import { Check as fe } from "lucide-react";
|
|
18
|
+
import de from "../Autocomplete/AutocompleteList.js";
|
|
19
|
+
import { cn as p } from "../../utils/cn.js";
|
|
20
|
+
import { getSpacingClass as D } from "../../tokens/spacing.js";
|
|
21
|
+
import { getRadiusClass as oe } from "../../tokens/radius.js";
|
|
22
|
+
const me = ne(
|
|
23
|
+
function({
|
|
24
|
+
options: l,
|
|
25
|
+
value: r,
|
|
26
|
+
defaultValue: T = [],
|
|
27
|
+
onChange: n,
|
|
28
|
+
onSelect: u,
|
|
29
|
+
placeholder: U = "Select options...",
|
|
30
|
+
loading: A = !1,
|
|
31
|
+
disabled: q = !1,
|
|
32
|
+
emptyMessage: O = "No options found",
|
|
33
|
+
maxSelected: R,
|
|
34
|
+
showSelectAll: z = !1,
|
|
35
|
+
className: G = "",
|
|
36
|
+
inputClassName: J = "",
|
|
37
|
+
size: I = "md",
|
|
38
|
+
label: N
|
|
39
|
+
}, v) {
|
|
40
|
+
const E = ue(), [P, w] = x(T), [h, f] = x(!1), [b, d] = x(-1), [g, V] = x(""), k = y(null), Q = y(null), W = y(null), o = r !== void 0, i = o ? r : P, X = l.filter(
|
|
41
|
+
(e) => i.includes(e.value)
|
|
42
|
+
), a = (() => {
|
|
43
|
+
let e = l;
|
|
44
|
+
return g.trim() && (e = l.filter(
|
|
45
|
+
(t) => t.label.toLowerCase().includes(g.toLowerCase())
|
|
46
|
+
)), e;
|
|
47
|
+
})(), Y = a.length > 0, Z = (e) => {
|
|
48
|
+
const t = e.target.value;
|
|
49
|
+
V(t), f(!0), d(-1);
|
|
50
|
+
}, L = (e) => {
|
|
51
|
+
if (e.disabled || R && i.length >= R && !i.includes(e.value))
|
|
52
|
+
return;
|
|
53
|
+
const t = i.includes(e.value) ? i.filter((s) => s !== e.value) : [...i, e.value];
|
|
54
|
+
o || w(t), n == null || n(t), u == null || u(l.filter((s) => t.includes(s.value))), V("");
|
|
55
|
+
}, _ = () => {
|
|
56
|
+
const e = a.filter((s) => !s.disabled).map((s) => s.value), t = [.../* @__PURE__ */ new Set([...i, ...e])];
|
|
57
|
+
o || w(t), n == null || n(t), u == null || u(l.filter((s) => t.includes(s.value)));
|
|
58
|
+
}, $ = () => {
|
|
59
|
+
const e = a.map((s) => s.value), t = i.filter(
|
|
60
|
+
(s) => !e.includes(s)
|
|
61
|
+
);
|
|
62
|
+
o || w(t), n == null || n(t), u == null || u(l.filter((s) => t.includes(s.value)));
|
|
63
|
+
}, F = (e) => {
|
|
64
|
+
const t = i.filter((s) => s !== e);
|
|
65
|
+
o || w(t), n == null || n(t), u == null || u(l.filter((s) => t.includes(s.value)));
|
|
66
|
+
}, S = (e) => {
|
|
67
|
+
if (!h || a.length === 0) {
|
|
68
|
+
(e.key === "ArrowDown" || e.key === "Enter") && f(!0), e.key === "Backspace" && g === "" && i.length > 0 && F(i[i.length - 1]);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
switch (e.key) {
|
|
72
|
+
case "ArrowDown":
|
|
73
|
+
e.preventDefault(), d(
|
|
74
|
+
(t) => t < a.length - 1 ? t + 1 : 0
|
|
75
|
+
);
|
|
76
|
+
break;
|
|
77
|
+
case "ArrowUp":
|
|
78
|
+
e.preventDefault(), d(
|
|
79
|
+
(t) => t > 0 ? t - 1 : a.length - 1
|
|
80
|
+
);
|
|
81
|
+
break;
|
|
82
|
+
case "Enter":
|
|
83
|
+
e.preventDefault(), b >= 0 && b < a.length && L(a[b]);
|
|
84
|
+
break;
|
|
85
|
+
case "Escape":
|
|
86
|
+
e.preventDefault(), f(!1), d(-1);
|
|
87
|
+
break;
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
ae(() => {
|
|
91
|
+
if (!h) return;
|
|
92
|
+
const e = (t) => {
|
|
93
|
+
k.current && !k.current.contains(t.target) && (f(!1), d(-1), V(""));
|
|
94
|
+
};
|
|
95
|
+
return document.addEventListener("mousedown", e), () => document.removeEventListener("mousedown", e);
|
|
96
|
+
}, [h]);
|
|
97
|
+
const C = a.filter((e) => !e.disabled).every((e) => i.includes(e.value)), ee = h && (Y || A || O);
|
|
98
|
+
return /* @__PURE__ */ H("div", { ref: k, className: p("relative", G), children: [
|
|
99
|
+
/* @__PURE__ */ m(
|
|
100
|
+
"label",
|
|
101
|
+
{
|
|
102
|
+
htmlFor: E,
|
|
103
|
+
className: p(
|
|
104
|
+
"block",
|
|
105
|
+
D("sm", "mb"),
|
|
106
|
+
"text-sm",
|
|
107
|
+
"font-medium",
|
|
108
|
+
"text-fg-primary"
|
|
109
|
+
),
|
|
110
|
+
children: N
|
|
111
|
+
}
|
|
112
|
+
),
|
|
113
|
+
/* @__PURE__ */ H(
|
|
114
|
+
"div",
|
|
115
|
+
{
|
|
116
|
+
className: p(
|
|
117
|
+
"flex",
|
|
118
|
+
"flex-wrap",
|
|
119
|
+
D("sm", "gap"),
|
|
120
|
+
D("sm", "p"),
|
|
121
|
+
"border",
|
|
122
|
+
"border-line-default",
|
|
123
|
+
oe("md"),
|
|
124
|
+
"min-h-10",
|
|
125
|
+
"focus-within:outline-none",
|
|
126
|
+
"focus-within:ring-2",
|
|
127
|
+
"focus-within:ring-offset-2",
|
|
128
|
+
"focus-within:border-line-brand",
|
|
129
|
+
"focus-within:ring-line-brand"
|
|
130
|
+
),
|
|
131
|
+
children: [
|
|
132
|
+
X.map((e) => /* @__PURE__ */ m(
|
|
133
|
+
ce,
|
|
134
|
+
{
|
|
135
|
+
onRemove: () => F(e.value),
|
|
136
|
+
size: I === "sm" ? "sm" : I === "lg" ? "lg" : "md",
|
|
137
|
+
children: e.label
|
|
138
|
+
},
|
|
139
|
+
e.value
|
|
140
|
+
)),
|
|
141
|
+
/* @__PURE__ */ m(
|
|
142
|
+
"input",
|
|
143
|
+
{
|
|
144
|
+
id: E,
|
|
145
|
+
ref: (e) => {
|
|
146
|
+
typeof v == "function" ? v(e) : v && (v.current = e), Q.current = e;
|
|
147
|
+
},
|
|
148
|
+
type: "text",
|
|
149
|
+
value: g,
|
|
150
|
+
onChange: Z,
|
|
151
|
+
onKeyDown: S,
|
|
152
|
+
onFocus: () => f(!0),
|
|
153
|
+
placeholder: i.length === 0 ? U : "",
|
|
154
|
+
disabled: q,
|
|
155
|
+
className: p(
|
|
156
|
+
"flex-1",
|
|
157
|
+
"min-w-32",
|
|
158
|
+
"outline-none",
|
|
159
|
+
"bg-transparent",
|
|
160
|
+
J
|
|
161
|
+
)
|
|
162
|
+
}
|
|
163
|
+
)
|
|
164
|
+
]
|
|
165
|
+
}
|
|
166
|
+
),
|
|
167
|
+
ee && /* @__PURE__ */ m(
|
|
168
|
+
de,
|
|
169
|
+
{
|
|
170
|
+
ref: W,
|
|
171
|
+
"aria-label": N,
|
|
172
|
+
options: a.map((e) => B(M({}, e), {
|
|
173
|
+
icon: i.includes(e.value) ? /* @__PURE__ */ m(fe, { className: p("h-4", "w-4", "text-fg-brand") }) : e.icon
|
|
174
|
+
})),
|
|
175
|
+
highlightedIndex: b,
|
|
176
|
+
onSelect: L,
|
|
177
|
+
loading: A,
|
|
178
|
+
emptyMessage: O,
|
|
179
|
+
containerRef: k,
|
|
180
|
+
showSelectAll: z && a.length > 0,
|
|
181
|
+
allSelected: C,
|
|
182
|
+
onSelectAll: _,
|
|
183
|
+
onDeselectAll: $
|
|
184
|
+
}
|
|
185
|
+
)
|
|
186
|
+
] });
|
|
187
|
+
}
|
|
188
|
+
);
|
|
189
|
+
me.displayName = "MultiSelect";
|
|
190
|
+
export {
|
|
191
|
+
me as default
|
|
192
|
+
};
|
|
193
|
+
//# sourceMappingURL=MultiSelect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MultiSelect.js","sources":["../../../../../src/ui/components/MultiSelect/MultiSelect.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState, useRef, useEffect, useId, forwardRef } from \"react\";\nimport Chip from \"../../primitives/Chip/Chip\";\nimport { Check } from \"lucide-react\";\nimport AutocompleteList from \"../Autocomplete/AutocompleteList\";\nimport type { AutocompleteOptionType } from \"../Autocomplete/AutocompleteOption\";\nimport { cn } from \"../../utils\";\nimport { getSpacingClass } from \"../../tokens\";\nimport { getRadiusClass } from \"../../tokens\";\n\nexport interface MultiSelectProps {\n options: AutocompleteOptionType[];\n value?: string[];\n defaultValue?: string[];\n onChange?: (values: string[]) => void;\n onSelect?: (options: AutocompleteOptionType[]) => void;\n placeholder?: string;\n loading?: boolean;\n disabled?: boolean;\n emptyMessage?: string;\n maxSelected?: number;\n showSelectAll?: boolean;\n className?: string;\n inputClassName?: string;\n size?: \"sm\" | \"md\" | \"lg\";\n /**\n * Required label for the multi-select input. Becomes the accessible\n * name via <label htmlFor>. Make this a real domain term (\"Tags\",\n * \"Select fruits\"), not the element type (\"multi-select\" / \"input\").\n */\n label: string;\n}\n\n/**\n * MultiSelect Component\n *\n * A multi-select component with chips for selected items.\n * Supports keyboard navigation, loading states, and custom filtering.\n *\n * @example\n * ```tsx\n * <MultiSelect\n * options={[\n * { value: '1', label: 'Option 1' },\n * { value: '2', label: 'Option 2' },\n * ]}\n * onSelect={(options) => console.log(options)}\n * />\n * ```\n */\nconst MultiSelect = forwardRef<HTMLInputElement, MultiSelectProps>(\n function MultiSelect(\n {\n options,\n value: controlledValue,\n defaultValue = [],\n onChange,\n onSelect,\n placeholder = \"Select options...\",\n loading = false,\n disabled = false,\n emptyMessage = \"No options found\",\n maxSelected,\n showSelectAll = false,\n className = \"\",\n inputClassName = \"\",\n size = \"md\",\n label,\n },\n ref,\n ) {\n const inputId = useId();\n const [internalValue, setInternalValue] = useState<string[]>(defaultValue);\n const [isOpen, setIsOpen] = useState(false);\n const [highlightedIndex, setHighlightedIndex] = useState(-1);\n const [searchValue, setSearchValue] = useState(\"\");\n const containerRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const listRef = useRef<HTMLDivElement>(null);\n\n const isControlled = controlledValue !== undefined;\n const selectedValues = isControlled ? controlledValue : internalValue;\n\n // Get selected options\n const selectedOptions = options.filter((opt) =>\n selectedValues.includes(opt.value),\n );\n\n // Filter options (exclude already selected if needed, or show all)\n const getFilteredOptions = (): AutocompleteOptionType[] => {\n let filtered = options;\n\n if (searchValue.trim()) {\n filtered = options.filter((option) =>\n option.label.toLowerCase().includes(searchValue.toLowerCase()),\n );\n }\n\n return filtered;\n };\n\n const filteredOptions = getFilteredOptions();\n const hasOptions = filteredOptions.length > 0;\n\n // Handle input change\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value;\n setSearchValue(newValue);\n setIsOpen(true);\n setHighlightedIndex(-1);\n };\n\n // Handle option toggle\n const handleToggleOption = (option: AutocompleteOptionType) => {\n if (option.disabled) return;\n if (\n maxSelected &&\n selectedValues.length >= maxSelected &&\n !selectedValues.includes(option.value)\n ) {\n return;\n }\n\n const newValues = selectedValues.includes(option.value)\n ? selectedValues.filter((v) => v !== option.value)\n : [...selectedValues, option.value];\n\n if (!isControlled) {\n setInternalValue(newValues);\n }\n\n onChange?.(newValues);\n onSelect?.(options.filter((opt) => newValues.includes(opt.value)));\n setSearchValue(\"\");\n };\n\n // Handle select all\n const handleSelectAll = () => {\n const allValues = filteredOptions\n .filter((opt) => !opt.disabled)\n .map((opt) => opt.value);\n const newValues = [...new Set([...selectedValues, ...allValues])];\n\n if (!isControlled) {\n setInternalValue(newValues);\n }\n\n onChange?.(newValues);\n onSelect?.(options.filter((opt) => newValues.includes(opt.value)));\n };\n\n // Handle deselect all\n const handleDeselectAll = () => {\n const filteredValues = filteredOptions.map((opt) => opt.value);\n const newValues = selectedValues.filter(\n (v) => !filteredValues.includes(v),\n );\n\n if (!isControlled) {\n setInternalValue(newValues);\n }\n\n onChange?.(newValues);\n onSelect?.(options.filter((opt) => newValues.includes(opt.value)));\n };\n\n // Handle remove chip\n const handleRemoveChip = (value: string) => {\n const newValues = selectedValues.filter((v) => v !== value);\n\n if (!isControlled) {\n setInternalValue(newValues);\n }\n\n onChange?.(newValues);\n onSelect?.(options.filter((opt) => newValues.includes(opt.value)));\n };\n\n // Handle keyboard navigation\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (!isOpen || filteredOptions.length === 0) {\n if (e.key === \"ArrowDown\" || e.key === \"Enter\") {\n setIsOpen(true);\n }\n // Remove last chip on backspace\n if (\n e.key === \"Backspace\" &&\n searchValue === \"\" &&\n selectedValues.length > 0\n ) {\n handleRemoveChip(selectedValues[selectedValues.length - 1]);\n }\n return;\n }\n\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault();\n setHighlightedIndex((prev) =>\n prev < filteredOptions.length - 1 ? prev + 1 : 0,\n );\n break;\n case \"ArrowUp\":\n e.preventDefault();\n setHighlightedIndex((prev) =>\n prev > 0 ? prev - 1 : filteredOptions.length - 1,\n );\n break;\n case \"Enter\":\n e.preventDefault();\n if (\n highlightedIndex >= 0 &&\n highlightedIndex < filteredOptions.length\n ) {\n handleToggleOption(filteredOptions[highlightedIndex]);\n }\n break;\n case \"Escape\":\n e.preventDefault();\n setIsOpen(false);\n setHighlightedIndex(-1);\n break;\n }\n };\n\n // Close on click outside\n useEffect(() => {\n if (!isOpen) return;\n\n const handleClickOutside = (e: MouseEvent) => {\n if (\n containerRef.current &&\n !containerRef.current.contains(e.target as Node)\n ) {\n setIsOpen(false);\n setHighlightedIndex(-1);\n setSearchValue(\"\");\n }\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () =>\n document.removeEventListener(\"mousedown\", handleClickOutside);\n }, [isOpen]);\n\n // Check if all filtered options are selected\n const allSelected = filteredOptions\n .filter((opt) => !opt.disabled)\n .every((opt) => selectedValues.includes(opt.value));\n\n const shouldShowList = isOpen && (hasOptions || loading || emptyMessage);\n\n return (\n <div ref={containerRef} className={cn(\"relative\", className)}>\n <label\n htmlFor={inputId}\n className={cn(\n \"block\",\n getSpacingClass(\"sm\", \"mb\"),\n \"text-sm\",\n \"font-medium\",\n \"text-fg-primary\",\n )}\n >\n {label}\n </label>\n <div\n className={cn(\n \"flex\",\n \"flex-wrap\",\n getSpacingClass(\"sm\", \"gap\"),\n getSpacingClass(\"sm\", \"p\"),\n \"border\",\n \"border-line-default\",\n getRadiusClass(\"md\"),\n \"min-h-10\",\n \"focus-within:outline-none\",\n \"focus-within:ring-2\",\n \"focus-within:ring-offset-2\",\n \"focus-within:border-line-brand\",\n \"focus-within:ring-line-brand\",\n )}\n >\n {selectedOptions.map((option) => (\n <Chip\n key={option.value}\n onRemove={() => handleRemoveChip(option.value)}\n size={size === \"sm\" ? \"sm\" : size === \"lg\" ? \"lg\" : \"md\"}\n >\n {option.label}\n </Chip>\n ))}\n <input\n id={inputId}\n ref={(node) => {\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref) {\n (\n ref as React.MutableRefObject<HTMLInputElement | null>\n ).current = node;\n }\n inputRef.current = node;\n }}\n type=\"text\"\n value={searchValue}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n onFocus={() => setIsOpen(true)}\n placeholder={selectedValues.length === 0 ? placeholder : \"\"}\n disabled={disabled}\n className={cn(\n \"flex-1\",\n \"min-w-32\",\n \"outline-none\",\n \"bg-transparent\",\n inputClassName,\n )}\n />\n </div>\n\n {shouldShowList && (\n <AutocompleteList\n ref={listRef}\n // Cascade the input's accessible-name source to the\n // listbox portal — axe `aria-input-field-name` flags a\n // role=\"listbox\" without aria-label / aria-labelledby.\n // MultiSelect's `label` is TS-required, so the listbox\n // always inherits a name.\n aria-label={label}\n options={filteredOptions.map((opt) => ({\n ...opt,\n icon: selectedValues.includes(opt.value) ? (\n <Check className={cn(\"h-4\", \"w-4\", \"text-fg-brand\")} />\n ) : (\n opt.icon\n ),\n }))}\n highlightedIndex={highlightedIndex}\n onSelect={handleToggleOption}\n loading={loading}\n emptyMessage={emptyMessage}\n containerRef={containerRef}\n showSelectAll={showSelectAll && filteredOptions.length > 0}\n allSelected={allSelected}\n onSelectAll={handleSelectAll}\n onDeselectAll={handleDeselectAll}\n />\n )}\n </div>\n );\n },\n);\n\nMultiSelect.displayName = \"MultiSelect\";\n\nexport default MultiSelect;\n"],"names":["MultiSelect","forwardRef","options","controlledValue","defaultValue","onChange","onSelect","placeholder","loading","disabled","emptyMessage","maxSelected","showSelectAll","className","inputClassName","size","label","ref","inputId","useId","internalValue","setInternalValue","useState","isOpen","setIsOpen","highlightedIndex","setHighlightedIndex","searchValue","setSearchValue","containerRef","useRef","inputRef","listRef","isControlled","selectedValues","selectedOptions","opt","filteredOptions","filtered","option","hasOptions","handleInputChange","newValue","handleToggleOption","newValues","v","handleSelectAll","allValues","handleDeselectAll","filteredValues","handleRemoveChip","value","handleKeyDown","prev","useEffect","handleClickOutside","e","allSelected","shouldShowList","jsxs","cn","jsx","getSpacingClass","getRadiusClass","Chip","node","AutocompleteList","__spreadProps","__spreadValues","Check"],"mappings":"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"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
var W = Object.defineProperty, y = Object.defineProperties;
|
|
3
|
+
var A = Object.getOwnPropertyDescriptors;
|
|
4
|
+
var o = Object.getOwnPropertySymbols;
|
|
5
|
+
var g = Object.prototype.hasOwnProperty, b = Object.prototype.propertyIsEnumerable;
|
|
6
|
+
var p = (a, t, n) => t in a ? W(a, t, { enumerable: !0, configurable: !0, writable: !0, value: n }) : a[t] = n, s = (a, t) => {
|
|
7
|
+
for (var n in t || (t = {}))
|
|
8
|
+
g.call(t, n) && p(a, n, t[n]);
|
|
9
|
+
if (o)
|
|
10
|
+
for (var n of o(t))
|
|
11
|
+
b.call(t, n) && p(a, n, t[n]);
|
|
12
|
+
return a;
|
|
13
|
+
}, l = (a, t) => y(a, A(t));
|
|
14
|
+
var x = (a, t) => {
|
|
15
|
+
var n = {};
|
|
16
|
+
for (var r in a)
|
|
17
|
+
g.call(a, r) && t.indexOf(r) < 0 && (n[r] = a[r]);
|
|
18
|
+
if (a != null && o)
|
|
19
|
+
for (var r of o(a))
|
|
20
|
+
t.indexOf(r) < 0 && b.call(a, r) && (n[r] = a[r]);
|
|
21
|
+
return n;
|
|
22
|
+
};
|
|
23
|
+
import { jsx as i, Fragment as L, jsxs as M } from "react/jsx-runtime";
|
|
24
|
+
import { useMemo as C } from "react";
|
|
25
|
+
import { getSpacingClass as w } from "../../tokens/spacing.js";
|
|
26
|
+
import { NavLink as F } from "../../primitives/NavLink/NavLink.js";
|
|
27
|
+
import { cn as f } from "../../utils/cn.js";
|
|
28
|
+
import { cva as S } from "../../utils/cva.js";
|
|
29
|
+
const N = S(
|
|
30
|
+
// Base classes
|
|
31
|
+
f("flex", "items-center", w("sm", "gap")),
|
|
32
|
+
{
|
|
33
|
+
variants: {
|
|
34
|
+
orientation: {
|
|
35
|
+
horizontal: "flex-row",
|
|
36
|
+
vertical: "flex-col"
|
|
37
|
+
},
|
|
38
|
+
variant: {
|
|
39
|
+
default: "",
|
|
40
|
+
pills: "",
|
|
41
|
+
tabs: ""
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
defaultVariants: {
|
|
45
|
+
orientation: "horizontal",
|
|
46
|
+
variant: "default"
|
|
47
|
+
},
|
|
48
|
+
compoundVariants: [
|
|
49
|
+
{
|
|
50
|
+
orientation: "vertical",
|
|
51
|
+
variant: "default",
|
|
52
|
+
class: "items-stretch"
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
orientation: "vertical",
|
|
56
|
+
variant: "pills",
|
|
57
|
+
class: "items-stretch"
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
orientation: "vertical",
|
|
61
|
+
variant: "tabs",
|
|
62
|
+
class: "items-stretch"
|
|
63
|
+
}
|
|
64
|
+
]
|
|
65
|
+
}
|
|
66
|
+
);
|
|
67
|
+
function $(q) {
|
|
68
|
+
var v = q, {
|
|
69
|
+
items: a,
|
|
70
|
+
orientation: t = "horizontal",
|
|
71
|
+
variant: n = "default",
|
|
72
|
+
className: r,
|
|
73
|
+
"aria-label": k = "Main navigation",
|
|
74
|
+
bare: V = !1,
|
|
75
|
+
pathname: u
|
|
76
|
+
} = v, d = x(v, [
|
|
77
|
+
"items",
|
|
78
|
+
"orientation",
|
|
79
|
+
"variant",
|
|
80
|
+
"className",
|
|
81
|
+
"aria-label",
|
|
82
|
+
"bare",
|
|
83
|
+
"pathname"
|
|
84
|
+
]);
|
|
85
|
+
const c = u != null ? u : typeof window != "undefined" ? window.location.pathname : void 0, j = C(() => a.map((e) => {
|
|
86
|
+
if (e.active !== void 0)
|
|
87
|
+
return e;
|
|
88
|
+
if (c) {
|
|
89
|
+
const h = c === e.href || e.href !== "/" && c.startsWith(`${e.href}/`);
|
|
90
|
+
return l(s({}, e), { active: h });
|
|
91
|
+
}
|
|
92
|
+
return l(s({}, e), { active: !1 });
|
|
93
|
+
}), [a, c]), m = /* @__PURE__ */ i(L, { children: j.map((e, h) => {
|
|
94
|
+
const z = n === "pills" ? "background" : n === "tabs" ? "underline" : "default";
|
|
95
|
+
return /* @__PURE__ */ M(
|
|
96
|
+
F,
|
|
97
|
+
{
|
|
98
|
+
href: e.href,
|
|
99
|
+
active: e.active,
|
|
100
|
+
disabled: e.disabled,
|
|
101
|
+
variant: z,
|
|
102
|
+
className: f(
|
|
103
|
+
"flex items-center",
|
|
104
|
+
w("sm", "gap"),
|
|
105
|
+
t === "vertical" && "w-full justify-start",
|
|
106
|
+
e.className
|
|
107
|
+
),
|
|
108
|
+
children: [
|
|
109
|
+
e.icon && /* @__PURE__ */ i("span", { className: "flex-shrink-0", "aria-hidden": "true", children: e.icon }),
|
|
110
|
+
/* @__PURE__ */ i("span", { children: e.label }),
|
|
111
|
+
e.badge && /* @__PURE__ */ i("span", { className: "ml-auto", children: e.badge })
|
|
112
|
+
]
|
|
113
|
+
},
|
|
114
|
+
e.href || h
|
|
115
|
+
);
|
|
116
|
+
}) });
|
|
117
|
+
return V ? /* @__PURE__ */ i(
|
|
118
|
+
"div",
|
|
119
|
+
l(s({
|
|
120
|
+
className: f(N({ orientation: t, variant: n }), r)
|
|
121
|
+
}, d), {
|
|
122
|
+
children: m
|
|
123
|
+
})
|
|
124
|
+
) : /* @__PURE__ */ i(
|
|
125
|
+
"nav",
|
|
126
|
+
l(s({
|
|
127
|
+
className: f(N({ orientation: t, variant: n }), r),
|
|
128
|
+
"aria-label": k
|
|
129
|
+
}, d), {
|
|
130
|
+
children: m
|
|
131
|
+
})
|
|
132
|
+
);
|
|
133
|
+
}
|
|
134
|
+
function K(a) {
|
|
135
|
+
return /* @__PURE__ */ i($, l(s({}, a), { pathname: a.pathname }));
|
|
136
|
+
}
|
|
137
|
+
export {
|
|
138
|
+
K as Navigation,
|
|
139
|
+
K as default
|
|
140
|
+
};
|
|
141
|
+
//# sourceMappingURL=Navigation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Navigation.js","sources":["../../../../../src/ui/components/Navigation/Navigation.tsx"],"sourcesContent":["/**\n * Navigation Component\n *\n * Horizontal or vertical navigation component using NavLink internally.\n *\n * @see EPIC-003: Navigation Component (Molecule)\n * @see RFC-005: Navigation Composition Pattern (APPROVED)\n */\n\n\"use client\";\n\nimport { useMemo } from \"react\";\nimport { NavLink } from \"../../primitives/NavLink\";\nimport type { NavigationProps } from \"./types\";\nimport { cn, cva } from \"../../utils\";\nimport { getSpacingClass } from \"../../tokens/spacing\";\n\n/**\n * Navigation Variants using CVA\n * Type-safe variant system for Navigation component\n */\nconst navigationVariants = cva(\n // Base classes\n cn(\"flex\", \"items-center\", getSpacingClass(\"sm\", \"gap\")),\n {\n variants: {\n orientation: {\n horizontal: \"flex-row\",\n vertical: \"flex-col\",\n },\n variant: {\n default: \"\",\n pills: \"\",\n tabs: \"\",\n },\n },\n defaultVariants: {\n orientation: \"horizontal\",\n variant: \"default\",\n },\n compoundVariants: [\n {\n orientation: \"vertical\",\n variant: \"default\",\n class: \"items-stretch\",\n },\n {\n orientation: \"vertical\",\n variant: \"pills\",\n class: \"items-stretch\",\n },\n {\n orientation: \"vertical\",\n variant: \"tabs\",\n class: \"items-stretch\",\n },\n ],\n },\n);\n\n/**\n * Navigation Component\n *\n * Navigation component that uses NavLink internally.\n * Supports horizontal and vertical orientations, variants, and icons.\n *\n * @example\n * ```tsx\n * <Navigation\n * items={[\n * { href: '/home', label: 'Home', active: true },\n * { href: '/about', label: 'About' },\n * ]}\n * orientation=\"horizontal\"\n * variant=\"default\"\n * />\n * ```\n */\n/**\n * Navigation Component (Internal with pathname detection)\n *\n * Internal component that can use Next.js usePathname hook.\n */\nfunction NavigationWithPathname({\n items,\n orientation = \"horizontal\",\n variant = \"default\",\n className,\n \"aria-label\": ariaLabel = \"Main navigation\",\n bare = false,\n pathname: providedPathname,\n ...props\n}: NavigationProps & { pathname?: string }) {\n // Pathname channel: explicit prop wins. Falls back to\n // window.location.pathname so a non-Next.js app still gets initial\n // active-state highlighting. Note: window.location does not re-render\n // on client-side navigation — Next.js apps should pass\n // `pathname={usePathname()}` explicitly for reactive updates.\n const currentPathname: string | undefined =\n providedPathname ??\n (typeof window !== \"undefined\" ? window.location.pathname : undefined);\n\n // Calculate active state for items\n const itemsWithActive = useMemo(() => {\n return items.map((item) => {\n // Manual active prop has priority\n if (item.active !== undefined) {\n return item;\n }\n\n // Auto-detect if pathname is available\n if (currentPathname) {\n const isActive =\n currentPathname === item.href ||\n (item.href !== \"/\" && currentPathname.startsWith(`${item.href}/`));\n return { ...item, active: isActive };\n }\n\n // Default to false\n return { ...item, active: false };\n });\n }, [items, currentPathname]);\n\n const content = (\n <>\n {itemsWithActive.map((item, index) => {\n // Map Navigation variants to NavLink variants\n const navLinkVariant =\n variant === \"pills\"\n ? \"background\"\n : variant === \"tabs\"\n ? \"underline\"\n : \"default\";\n\n return (\n <NavLink\n key={item.href || index}\n href={item.href}\n active={item.active}\n disabled={item.disabled}\n variant={navLinkVariant}\n className={cn(\n \"flex items-center\",\n getSpacingClass(\"sm\", \"gap\"),\n orientation === \"vertical\" && \"w-full justify-start\",\n item.className,\n )}\n >\n {item.icon && (\n <span className=\"flex-shrink-0\" aria-hidden=\"true\">\n {item.icon}\n </span>\n )}\n <span>{item.label}</span>\n {item.badge && <span className=\"ml-auto\">{item.badge}</span>}\n </NavLink>\n );\n })}\n </>\n );\n\n // Bare mode: Just render content without nav wrapper\n // Useful when used inside Header.Navigation which provides the nav wrapper\n if (bare) {\n return (\n <div\n className={cn(navigationVariants({ orientation, variant }), className)}\n {...props}\n >\n {content}\n </div>\n );\n }\n\n // Normal mode: Create nav element\n return (\n <nav\n className={cn(navigationVariants({ orientation, variant }), className)}\n aria-label={ariaLabel}\n {...props}\n >\n {content}\n </nav>\n );\n}\n\n/**\n * Navigation Component (Public API)\n *\n * Wrapper that handles Next.js integration safely.\n * Always uses NavigationWithPathname which will try to auto-detect pathname.\n */\nexport function Navigation(props: NavigationProps) {\n return <NavigationWithPathname {...props} pathname={props.pathname} />;\n}\n\nexport default Navigation;\n"],"names":["navigationVariants","cva","cn","getSpacingClass","NavigationWithPathname","_a","_b","items","orientation","variant","className","ariaLabel","bare","providedPathname","props","__objRest","currentPathname","itemsWithActive","useMemo","item","isActive","__spreadProps","__spreadValues","content","jsx","Fragment","index","navLinkVariant","jsxs","NavLink","Navigation"],"mappings":"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"}
|