@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,133 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsxs as Y, jsx as h } from "react/jsx-runtime";
|
|
3
|
+
import { forwardRef as Z, useId as _, useState as w, useRef as p, useEffect as v } from "react";
|
|
4
|
+
import M from "../../primitives/Input/Input.js";
|
|
5
|
+
import { Loader2 as C, ChevronDown as B } from "lucide-react";
|
|
6
|
+
import P from "./AutocompleteList.js";
|
|
7
|
+
const ee = Z(
|
|
8
|
+
function({
|
|
9
|
+
options: u,
|
|
10
|
+
value: O,
|
|
11
|
+
defaultValue: R,
|
|
12
|
+
onChange: s,
|
|
13
|
+
onSelect: b,
|
|
14
|
+
placeholder: K = "Type to search...",
|
|
15
|
+
loading: I = !1,
|
|
16
|
+
disabled: L = !1,
|
|
17
|
+
emptyMessage: V = "No options found",
|
|
18
|
+
debounceMs: S = 300,
|
|
19
|
+
filterOptions: g,
|
|
20
|
+
className: $ = "",
|
|
21
|
+
inputClassName: q = "",
|
|
22
|
+
size: H = "md",
|
|
23
|
+
label: k,
|
|
24
|
+
"aria-label": y,
|
|
25
|
+
"aria-labelledby": i,
|
|
26
|
+
id: D
|
|
27
|
+
}, U) {
|
|
28
|
+
const z = _(), x = D != null ? D : z, [G, T] = w(
|
|
29
|
+
typeof R == "string" ? R : ""
|
|
30
|
+
), [c, l] = w(!1), [r, o] = w(-1), [f, a] = w(""), d = p(null), F = p(null), A = p(null), E = p(null), N = O !== void 0, m = N ? O : G, n = f.trim() ? g ? g(u, f) : u.filter(
|
|
31
|
+
(e) => e.label.toLowerCase().includes(f.toLowerCase())
|
|
32
|
+
) : u, J = n.length > 0, Q = (e) => {
|
|
33
|
+
const t = e.target.value;
|
|
34
|
+
a(t), N || T(t), s == null || s(t), E.current && clearTimeout(E.current), E.current = setTimeout(() => {
|
|
35
|
+
l(!0), o(-1);
|
|
36
|
+
}, S);
|
|
37
|
+
}, j = (e) => {
|
|
38
|
+
var t;
|
|
39
|
+
e.disabled || (N || T(e.value), a(e.label), l(!1), o(-1), s == null || s(e.value), b == null || b(e), (t = F.current) == null || t.focus());
|
|
40
|
+
}, W = (e) => {
|
|
41
|
+
if (!c || n.length === 0) {
|
|
42
|
+
(e.key === "ArrowDown" || e.key === "Enter") && l(!0);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
switch (e.key) {
|
|
46
|
+
case "ArrowDown":
|
|
47
|
+
e.preventDefault(), o(
|
|
48
|
+
(t) => t < n.length - 1 ? t + 1 : 0
|
|
49
|
+
);
|
|
50
|
+
break;
|
|
51
|
+
case "ArrowUp":
|
|
52
|
+
e.preventDefault(), o(
|
|
53
|
+
(t) => t > 0 ? t - 1 : n.length - 1
|
|
54
|
+
);
|
|
55
|
+
break;
|
|
56
|
+
case "Enter":
|
|
57
|
+
e.preventDefault(), r >= 0 && r < n.length && j(n[r]);
|
|
58
|
+
break;
|
|
59
|
+
case "Escape":
|
|
60
|
+
e.preventDefault(), l(!1), o(-1);
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
v(() => {
|
|
65
|
+
if (!c) return;
|
|
66
|
+
const e = (t) => {
|
|
67
|
+
d.current && !d.current.contains(t.target) && (l(!1), o(-1));
|
|
68
|
+
};
|
|
69
|
+
return document.addEventListener("mousedown", e), () => document.removeEventListener("mousedown", e);
|
|
70
|
+
}, [c]), v(() => {
|
|
71
|
+
if (r >= 0 && A.current) {
|
|
72
|
+
const e = A.current.querySelectorAll('[role="option"]');
|
|
73
|
+
e[r] && typeof e[r].scrollIntoView == "function" && e[r].scrollIntoView({
|
|
74
|
+
block: "nearest",
|
|
75
|
+
behavior: "smooth"
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
}, [r]), v(() => {
|
|
79
|
+
if (m) {
|
|
80
|
+
const e = u.find((t) => t.value === m);
|
|
81
|
+
a(e ? e.label : m);
|
|
82
|
+
} else
|
|
83
|
+
a("");
|
|
84
|
+
}, [m, u]), v(() => {
|
|
85
|
+
}, [k, y, i, x]);
|
|
86
|
+
const X = c && (J || I || V);
|
|
87
|
+
return /* @__PURE__ */ Y("div", { ref: d, className: `relative ${$}`, children: [
|
|
88
|
+
/* @__PURE__ */ h(
|
|
89
|
+
M,
|
|
90
|
+
{
|
|
91
|
+
ref: F || U,
|
|
92
|
+
id: x,
|
|
93
|
+
label: k,
|
|
94
|
+
"aria-label": y,
|
|
95
|
+
"aria-labelledby": i,
|
|
96
|
+
value: f,
|
|
97
|
+
onChange: Q,
|
|
98
|
+
onKeyDown: W,
|
|
99
|
+
onFocus: () => l(!0),
|
|
100
|
+
placeholder: K,
|
|
101
|
+
disabled: L,
|
|
102
|
+
size: H,
|
|
103
|
+
rightIcon: I ? /* @__PURE__ */ h(C, { className: "h-4 w-4 animate-spin" }) : /* @__PURE__ */ h(
|
|
104
|
+
B,
|
|
105
|
+
{
|
|
106
|
+
className: `h-4 w-4 transition-transform ${c ? "rotate-180" : ""}`
|
|
107
|
+
}
|
|
108
|
+
),
|
|
109
|
+
className: q
|
|
110
|
+
}
|
|
111
|
+
),
|
|
112
|
+
X && /* @__PURE__ */ h(
|
|
113
|
+
P,
|
|
114
|
+
{
|
|
115
|
+
ref: A,
|
|
116
|
+
options: n,
|
|
117
|
+
highlightedIndex: r,
|
|
118
|
+
onSelect: j,
|
|
119
|
+
loading: I,
|
|
120
|
+
emptyMessage: V,
|
|
121
|
+
containerRef: d,
|
|
122
|
+
"aria-labelledby": i,
|
|
123
|
+
"aria-label": i ? void 0 : y || k
|
|
124
|
+
}
|
|
125
|
+
)
|
|
126
|
+
] });
|
|
127
|
+
}
|
|
128
|
+
);
|
|
129
|
+
ee.displayName = "Autocomplete";
|
|
130
|
+
export {
|
|
131
|
+
ee as default
|
|
132
|
+
};
|
|
133
|
+
//# sourceMappingURL=Autocomplete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Autocomplete.js","sources":["../../../../../src/ui/components/Autocomplete/Autocomplete.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState, useRef, useEffect, useId, forwardRef } from \"react\";\nimport Input from \"../../primitives/Input/Input\";\nimport { ChevronDown, Loader2 } from \"lucide-react\";\nimport AutocompleteList from \"./AutocompleteList\";\nimport type { AutocompleteOptionType } from \"./AutocompleteOption\";\n\nexport interface AutocompleteProps {\n options: AutocompleteOptionType[];\n value?: string;\n defaultValue?: string;\n onChange?: (value: string) => void;\n onSelect?: (option: AutocompleteOptionType) => void;\n placeholder?: string;\n loading?: boolean;\n disabled?: boolean;\n emptyMessage?: string;\n debounceMs?: number;\n filterOptions?: (\n options: AutocompleteOptionType[],\n searchValue: string,\n ) => AutocompleteOptionType[];\n className?: string;\n inputClassName?: string;\n size?: \"sm\" | \"md\" | \"lg\";\n /**\n * Visible label rendered above the input via the `Input` primitive's\n * `label` API, which wires `<label htmlFor>` to the inner `<input>`.\n * Provides the accessible name axe `aria-input-field-name` requires.\n */\n label?: string;\n /**\n * Invisible accessible name. Use when the input has no visible label\n * (e.g. a tightly-packed toolbar combobox). One of `label`,\n * `aria-label`, or `aria-labelledby` MUST be present — without any,\n * the input has no programmatic name and axe `aria-input-field-name`\n * (serious) flags it. A dev-only warning fires when all are missing.\n */\n \"aria-label\"?: string;\n /**\n * Override path: point at an id the consumer manages externally.\n */\n \"aria-labelledby\"?: string;\n id?: string;\n}\n\n/**\n * Autocomplete Component\n *\n * An input component with autocomplete suggestions.\n * Supports keyboard navigation, loading states, and custom filtering.\n *\n * @example\n * ```tsx\n * <Autocomplete\n * options={[\n * { value: '1', label: 'Option 1' },\n * { value: '2', label: 'Option 2' },\n * ]}\n * onSelect={(option) => console.log(option)}\n * />\n * ```\n */\nconst Autocomplete = forwardRef<HTMLInputElement, AutocompleteProps>(\n function Autocomplete(\n {\n options,\n value: controlledValue,\n defaultValue,\n onChange,\n onSelect,\n placeholder = \"Type to search...\",\n loading = false,\n disabled = false,\n emptyMessage = \"No options found\",\n debounceMs = 300,\n filterOptions,\n className = \"\",\n inputClassName = \"\",\n size = \"md\",\n label,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n id: idProp,\n },\n ref,\n ) {\n const autoId = useId();\n const inputId = idProp ?? autoId;\n const [internalValue, setInternalValue] = useState<string>(\n typeof defaultValue === \"string\" ? defaultValue : \"\",\n );\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 const debounceTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const isControlled = controlledValue !== undefined;\n const currentValue = isControlled ? controlledValue : internalValue;\n\n // Filter options\n const getFilteredOptions = (): AutocompleteOptionType[] => {\n if (!searchValue.trim()) {\n return options;\n }\n\n if (filterOptions) {\n return filterOptions(options, searchValue);\n }\n\n // Default filter: case-insensitive search in label\n return options.filter((option) =>\n option.label.toLowerCase().includes(searchValue.toLowerCase()),\n );\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\n if (!isControlled) {\n setInternalValue(newValue);\n }\n\n onChange?.(newValue);\n\n // Debounce search\n if (debounceTimerRef.current) {\n clearTimeout(debounceTimerRef.current);\n }\n\n debounceTimerRef.current = setTimeout(() => {\n setIsOpen(true);\n setHighlightedIndex(-1);\n }, debounceMs);\n };\n\n // Handle option select\n const handleSelect = (option: AutocompleteOptionType) => {\n if (option.disabled) return;\n\n if (!isControlled) {\n setInternalValue(option.value);\n }\n\n setSearchValue(option.label);\n setIsOpen(false);\n setHighlightedIndex(-1);\n onChange?.(option.value);\n onSelect?.(option);\n inputRef.current?.focus();\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 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 handleSelect(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 }\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () =>\n document.removeEventListener(\"mousedown\", handleClickOutside);\n }, [isOpen]);\n\n // Scroll highlighted item into view\n useEffect(() => {\n if (highlightedIndex >= 0 && listRef.current) {\n const items = listRef.current.querySelectorAll('[role=\"option\"]');\n if (\n items[highlightedIndex] &&\n typeof items[highlightedIndex].scrollIntoView === \"function\"\n ) {\n items[highlightedIndex].scrollIntoView({\n block: \"nearest\",\n behavior: \"smooth\",\n });\n }\n }\n }, [highlightedIndex]);\n\n // Sync search value with current value\n useEffect(() => {\n if (currentValue) {\n const option = options.find((opt) => opt.value === currentValue);\n if (option) {\n setSearchValue(option.label);\n } else {\n setSearchValue(currentValue);\n }\n } else {\n setSearchValue(\"\");\n }\n }, [currentValue, options]);\n\n // Dev-only accessible-name warning. Same four-path shape as the\n // Textarea 6c guard: label / aria-label / aria-labelledby / external\n // `<label htmlFor={id}>`. Without any source, axe\n // `aria-input-field-name` (serious) flags the input. Silent in\n // production.\n useEffect(() => {\n if (!import.meta.env.DEV) return;\n if (label || ariaLabel || ariaLabelledBy) return;\n const externalLabel =\n typeof document !== \"undefined\"\n ? document.querySelector(`label[for=\"${CSS.escape(inputId)}\"]`)\n : null;\n if (externalLabel) return;\n console.warn(\n \"[Autocomplete] Missing accessible name. Provide a `label` prop, `aria-label`, `aria-labelledby`, or pair an external `<label htmlFor={id}>` with the same `id`.\",\n );\n }, [label, ariaLabel, ariaLabelledBy, inputId]);\n\n const shouldShowList = isOpen && (hasOptions || loading || emptyMessage);\n\n return (\n <div ref={containerRef} className={`relative ${className}`}>\n <Input\n ref={inputRef || ref}\n id={inputId}\n label={label}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n value={searchValue}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n onFocus={() => setIsOpen(true)}\n placeholder={placeholder}\n disabled={disabled}\n size={size}\n rightIcon={\n loading ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <ChevronDown\n className={`h-4 w-4 transition-transform ${\n isOpen ? \"rotate-180\" : \"\"\n }`}\n />\n )\n }\n className={inputClassName}\n />\n\n {shouldShowList && (\n <AutocompleteList\n ref={listRef}\n options={filteredOptions}\n highlightedIndex={highlightedIndex}\n onSelect={handleSelect}\n loading={loading}\n emptyMessage={emptyMessage}\n containerRef={containerRef}\n // Cascade the same accessible-name source the consumer\n // provided for the input to the listbox portal — keeps\n // axe `aria-input-field-name` satisfied on the listbox\n // without making the consumer re-state the name.\n aria-labelledby={ariaLabelledBy}\n aria-label={ariaLabelledBy ? undefined : ariaLabel || label}\n />\n )}\n </div>\n );\n },\n);\n\nAutocomplete.displayName = \"Autocomplete\";\n\nexport default Autocomplete;\n"],"names":["Autocomplete","forwardRef","options","controlledValue","defaultValue","onChange","onSelect","placeholder","loading","disabled","emptyMessage","debounceMs","filterOptions","className","inputClassName","size","label","ariaLabel","ariaLabelledBy","idProp","ref","autoId","useId","inputId","internalValue","setInternalValue","useState","isOpen","setIsOpen","highlightedIndex","setHighlightedIndex","searchValue","setSearchValue","containerRef","useRef","inputRef","listRef","debounceTimerRef","isControlled","currentValue","filteredOptions","option","hasOptions","handleInputChange","newValue","handleSelect","_a","handleKeyDown","prev","useEffect","handleClickOutside","e","items","opt","shouldShowList","jsx","Input","Loader2","ChevronDown","AutocompleteList"],"mappings":"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"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as e, jsxs as v, Fragment as y } from "react/jsx-runtime";
|
|
3
|
+
import { forwardRef as $, useState as C, useEffect as A } from "react";
|
|
4
|
+
import { createPortal as N } from "react-dom";
|
|
5
|
+
import { getRadiusClass as L } from "../../tokens/radius.js";
|
|
6
|
+
import { getShadowClass as S } from "../../tokens/shadows.js";
|
|
7
|
+
import { getZIndexClass as j } from "../../tokens/z-index.js";
|
|
8
|
+
import { getSpacingClass as o } from "../../tokens/spacing.js";
|
|
9
|
+
import P from "./AutocompleteOption.js";
|
|
10
|
+
const k = $(
|
|
11
|
+
function({
|
|
12
|
+
options: i,
|
|
13
|
+
highlightedIndex: d,
|
|
14
|
+
onSelect: m,
|
|
15
|
+
loading: n = !1,
|
|
16
|
+
emptyMessage: c = "No options found",
|
|
17
|
+
containerRef: l,
|
|
18
|
+
showSelectAll: p = !1,
|
|
19
|
+
allSelected: s = !1,
|
|
20
|
+
onSelectAll: f,
|
|
21
|
+
onDeselectAll: u,
|
|
22
|
+
"aria-label": x,
|
|
23
|
+
"aria-labelledby": a
|
|
24
|
+
}, g) {
|
|
25
|
+
const [r, h] = C({ top: 0, left: 0, width: 0 });
|
|
26
|
+
A(() => {
|
|
27
|
+
if (l.current) {
|
|
28
|
+
const t = l.current.getBoundingClientRect();
|
|
29
|
+
h({
|
|
30
|
+
top: t.bottom + window.scrollY + 4,
|
|
31
|
+
left: t.left + window.scrollX,
|
|
32
|
+
width: t.width
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
}, [l]);
|
|
36
|
+
const b = /* @__PURE__ */ e(
|
|
37
|
+
"div",
|
|
38
|
+
{
|
|
39
|
+
ref: g,
|
|
40
|
+
role: "listbox",
|
|
41
|
+
"aria-label": a ? void 0 : x,
|
|
42
|
+
"aria-labelledby": a,
|
|
43
|
+
className: `
|
|
44
|
+
absolute
|
|
45
|
+
${j("popover")}
|
|
46
|
+
bg-surface-overlay
|
|
47
|
+
${L("md")}
|
|
48
|
+
${S("lg")}
|
|
49
|
+
border
|
|
50
|
+
border-line-default
|
|
51
|
+
max-h-60
|
|
52
|
+
overflow-y-auto
|
|
53
|
+
${o("xs", "py")}
|
|
54
|
+
`,
|
|
55
|
+
style: {
|
|
56
|
+
top: `${r.top}px`,
|
|
57
|
+
left: `${r.left}px`,
|
|
58
|
+
width: `${r.width}px`
|
|
59
|
+
},
|
|
60
|
+
children: n ? /* @__PURE__ */ e(
|
|
61
|
+
"div",
|
|
62
|
+
{
|
|
63
|
+
className: `
|
|
64
|
+
${o("md", "p")}
|
|
65
|
+
text-sm
|
|
66
|
+
text-fg-tertiary
|
|
67
|
+
text-center
|
|
68
|
+
`,
|
|
69
|
+
children: "Loading..."
|
|
70
|
+
}
|
|
71
|
+
) : i.length === 0 ? /* @__PURE__ */ e(
|
|
72
|
+
"div",
|
|
73
|
+
{
|
|
74
|
+
className: `
|
|
75
|
+
${o("md", "p")}
|
|
76
|
+
text-sm
|
|
77
|
+
text-fg-tertiary
|
|
78
|
+
text-center
|
|
79
|
+
`,
|
|
80
|
+
children: c
|
|
81
|
+
}
|
|
82
|
+
) : /* @__PURE__ */ v(y, { children: [
|
|
83
|
+
p && /* @__PURE__ */ e(
|
|
84
|
+
"div",
|
|
85
|
+
{
|
|
86
|
+
className: `
|
|
87
|
+
${o("sm", "px")}
|
|
88
|
+
${o("sm", "py")}
|
|
89
|
+
text-sm
|
|
90
|
+
font-medium
|
|
91
|
+
cursor-pointer
|
|
92
|
+
hover:bg-surface-hover
|
|
93
|
+
border-b
|
|
94
|
+
border-line-default
|
|
95
|
+
`,
|
|
96
|
+
onClick: s ? u : f,
|
|
97
|
+
children: s ? "Deselect All" : "Select All"
|
|
98
|
+
}
|
|
99
|
+
),
|
|
100
|
+
i.map((t, w) => /* @__PURE__ */ e(
|
|
101
|
+
P,
|
|
102
|
+
{
|
|
103
|
+
option: t,
|
|
104
|
+
isHighlighted: w === d,
|
|
105
|
+
onSelect: m
|
|
106
|
+
},
|
|
107
|
+
t.value
|
|
108
|
+
))
|
|
109
|
+
] })
|
|
110
|
+
}
|
|
111
|
+
);
|
|
112
|
+
return typeof window != "undefined" ? N(b, document.body) : null;
|
|
113
|
+
}
|
|
114
|
+
);
|
|
115
|
+
k.displayName = "AutocompleteList";
|
|
116
|
+
export {
|
|
117
|
+
k as default
|
|
118
|
+
};
|
|
119
|
+
//# sourceMappingURL=AutocompleteList.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AutocompleteList.js","sources":["../../../../../src/ui/components/Autocomplete/AutocompleteList.tsx"],"sourcesContent":["\"use client\";\n\nimport { forwardRef, useEffect, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { getRadiusClass } from \"../../tokens/radius\";\nimport { getShadowClass } from \"../../tokens/shadows\";\nimport { getZIndexClass } from \"../../tokens/z-index\";\nimport { getSpacingClass } from \"../../tokens/spacing\";\nimport AutocompleteOption from \"./AutocompleteOption\";\nimport type { AutocompleteOptionType } from \"./AutocompleteOption\";\n\nexport interface AutocompleteListProps {\n options: AutocompleteOptionType[];\n highlightedIndex: number;\n onSelect: (option: AutocompleteOptionType) => void;\n loading?: boolean;\n emptyMessage?: string;\n containerRef: React.RefObject<HTMLDivElement | null>;\n showSelectAll?: boolean;\n allSelected?: boolean;\n onSelectAll?: () => void;\n onDeselectAll?: () => void;\n /**\n * Accessible name for the listbox. axe `aria-input-field-name`\n * (serious) flags a `role=\"listbox\"` portal without `aria-label` /\n * `aria-labelledby` / `title`. The Autocomplete / MultiSelect parent\n * cascades whatever accessible-name source the consumer provided\n * (label string, aria-label, or external id) so the listbox inherits\n * the same name as the input it dropdowns from.\n */\n \"aria-label\"?: string;\n \"aria-labelledby\"?: string;\n}\n\n/**\n * AutocompleteList Component\n *\n * The list container for autocomplete options.\n * Renders in a portal and positions itself below the input.\n */\nconst AutocompleteList = forwardRef<HTMLDivElement, AutocompleteListProps>(\n function AutocompleteList(\n {\n options,\n highlightedIndex,\n onSelect,\n loading = false,\n emptyMessage = \"No options found\",\n containerRef,\n showSelectAll = false,\n allSelected = false,\n onSelectAll,\n onDeselectAll,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n },\n ref,\n ) {\n const [position, setPosition] = useState({ top: 0, left: 0, width: 0 });\n\n // Calculate position\n useEffect(() => {\n if (containerRef.current) {\n const rect = containerRef.current.getBoundingClientRect();\n setPosition({\n top: rect.bottom + window.scrollY + 4,\n left: rect.left + window.scrollX,\n width: rect.width,\n });\n }\n }, [containerRef]);\n\n const listContent = (\n <div\n ref={ref}\n role=\"listbox\"\n aria-label={ariaLabelledBy ? undefined : ariaLabel}\n aria-labelledby={ariaLabelledBy}\n className={`\n absolute\n ${getZIndexClass(\"popover\")}\n bg-surface-overlay\n ${getRadiusClass(\"md\")}\n ${getShadowClass(\"lg\")}\n border\n border-line-default\n max-h-60\n overflow-y-auto\n ${getSpacingClass(\"xs\", \"py\")}\n `}\n style={{\n top: `${position.top}px`,\n left: `${position.left}px`,\n width: `${position.width}px`,\n }}\n >\n {loading ? (\n <div\n className={`\n ${getSpacingClass(\"md\", \"p\")}\n text-sm\n text-fg-tertiary\n text-center\n `}\n >\n Loading...\n </div>\n ) : options.length === 0 ? (\n <div\n className={`\n ${getSpacingClass(\"md\", \"p\")}\n text-sm\n text-fg-tertiary\n text-center\n `}\n >\n {emptyMessage}\n </div>\n ) : (\n <>\n {showSelectAll && (\n <div\n className={`\n ${getSpacingClass(\"sm\", \"px\")}\n ${getSpacingClass(\"sm\", \"py\")}\n text-sm\n font-medium\n cursor-pointer\n hover:bg-surface-hover\n border-b\n border-line-default\n `}\n onClick={allSelected ? onDeselectAll : onSelectAll}\n >\n {allSelected ? \"Deselect All\" : \"Select All\"}\n </div>\n )}\n {options.map((option, index) => (\n <AutocompleteOption\n key={option.value}\n option={option}\n isHighlighted={index === highlightedIndex}\n onSelect={onSelect}\n />\n ))}\n </>\n )}\n </div>\n );\n\n return typeof window !== \"undefined\"\n ? createPortal(listContent, document.body)\n : null;\n },\n);\n\nAutocompleteList.displayName = \"AutocompleteList\";\n\nexport default AutocompleteList;\n"],"names":["AutocompleteList","forwardRef","options","highlightedIndex","onSelect","loading","emptyMessage","containerRef","showSelectAll","allSelected","onSelectAll","onDeselectAll","ariaLabel","ariaLabelledBy","ref","position","setPosition","useState","useEffect","rect","listContent","jsx","getZIndexClass","getRadiusClass","getShadowClass","getSpacingClass","jsxs","Fragment","option","index","AutocompleteOption","createPortal"],"mappings":";;;;;;;;;AAwCA,MAAMA,IAAmBC;AAAA,EACvB,SACE;AAAA,IACE,SAAAC;AAAA,IACA,kBAAAC;AAAA,IACA,UAAAC;AAAA,IACA,SAAAC,IAAU;AAAA,IACV,cAAAC,IAAe;AAAA,IACf,cAAAC;AAAA,IACA,eAAAC,IAAgB;AAAA,IAChB,aAAAC,IAAc;AAAA,IACd,aAAAC;AAAA,IACA,eAAAC;AAAA,IACA,cAAcC;AAAA,IACd,mBAAmBC;AAAA,EAAA,GAErBC,GACA;AACA,UAAM,CAACC,GAAUC,CAAW,IAAIC,EAAS,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,EAAA,CAAG;AAGtE,IAAAC,EAAU,MAAM;AACd,UAAIX,EAAa,SAAS;AACxB,cAAMY,IAAOZ,EAAa,QAAQ,sBAAA;AAClC,QAAAS,EAAY;AAAA,UACV,KAAKG,EAAK,SAAS,OAAO,UAAU;AAAA,UACpC,MAAMA,EAAK,OAAO,OAAO;AAAA,UACzB,OAAOA,EAAK;AAAA,QAAA,CACb;AAAA,MACH;AAAA,IACF,GAAG,CAACZ,CAAY,CAAC;AAEjB,UAAMa,IACJ,gBAAAC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAAP;AAAA,QACA,MAAK;AAAA,QACL,cAAYD,IAAiB,SAAYD;AAAA,QACzC,mBAAiBC;AAAA,QACjB,WAAW;AAAA;AAAA,YAEPS,EAAe,SAAS,CAAC;AAAA;AAAA,YAEzBC,EAAe,IAAI,CAAC;AAAA,YACpBC,EAAe,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,YAKpBC,EAAgB,MAAM,IAAI,CAAC;AAAA;AAAA,QAE/B,OAAO;AAAA,UACL,KAAK,GAAGV,EAAS,GAAG;AAAA,UACpB,MAAM,GAAGA,EAAS,IAAI;AAAA,UACtB,OAAO,GAAGA,EAAS,KAAK;AAAA,QAAA;AAAA,QAGzB,UAAAV,IACC,gBAAAgB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAW;AAAA,gBACPI,EAAgB,MAAM,GAAG,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,YAK/B,UAAA;AAAA,UAAA;AAAA,QAAA,IAGCvB,EAAQ,WAAW,IACrB,gBAAAmB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAW;AAAA,gBACPI,EAAgB,MAAM,GAAG,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,YAM7B,UAAAnB;AAAA,UAAA;AAAA,QAAA,IAGH,gBAAAoB,EAAAC,GAAA,EACG,UAAA;AAAA,UAAAnB,KACC,gBAAAa;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAW;AAAA,oBACPI,EAAgB,MAAM,IAAI,CAAC;AAAA,oBAC3BA,EAAgB,MAAM,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAQ/B,SAAShB,IAAcE,IAAgBD;AAAA,cAEtC,cAAc,iBAAiB;AAAA,YAAA;AAAA,UAAA;AAAA,UAGnCR,EAAQ,IAAI,CAAC0B,GAAQC,MACpB,gBAAAR;AAAA,YAACS;AAAA,YAAA;AAAA,cAEC,QAAAF;AAAA,cACA,eAAeC,MAAU1B;AAAA,cACzB,UAAAC;AAAA,YAAA;AAAA,YAHKwB,EAAO;AAAA,UAAA,CAKf;AAAA,QAAA,EAAA,CACH;AAAA,MAAA;AAAA,IAAA;AAKN,WAAO,OAAO,UAAW,cACrBG,EAAaX,GAAa,SAAS,IAAI,IACvC;AAAA,EACN;AACF;AAEApB,EAAiB,cAAc;"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsxs as t, jsx as r } from "react/jsx-runtime";
|
|
3
|
+
import { forwardRef as i } from "react";
|
|
4
|
+
import { getSpacingClass as s } from "../../tokens/spacing.js";
|
|
5
|
+
const n = i(
|
|
6
|
+
function({ option: e, isHighlighted: a, onSelect: l }, c) {
|
|
7
|
+
const o = () => {
|
|
8
|
+
e.disabled || l(e);
|
|
9
|
+
};
|
|
10
|
+
return /* @__PURE__ */ t(
|
|
11
|
+
"div",
|
|
12
|
+
{
|
|
13
|
+
ref: c,
|
|
14
|
+
role: "option",
|
|
15
|
+
"aria-selected": a,
|
|
16
|
+
"aria-disabled": e.disabled,
|
|
17
|
+
onClick: o,
|
|
18
|
+
className: `
|
|
19
|
+
flex
|
|
20
|
+
items-center
|
|
21
|
+
${s("sm", "gap")}
|
|
22
|
+
${s("sm", "px")}
|
|
23
|
+
${s("sm", "py")}
|
|
24
|
+
text-sm
|
|
25
|
+
cursor-pointer
|
|
26
|
+
transition-colors
|
|
27
|
+
${a ? "bg-surface-active" : ""}
|
|
28
|
+
${e.disabled ? "opacity-50 cursor-not-allowed" : "hover:bg-surface-hover"}
|
|
29
|
+
`,
|
|
30
|
+
children: [
|
|
31
|
+
e.icon && /* @__PURE__ */ r("span", { className: "flex-shrink-0", children: e.icon }),
|
|
32
|
+
/* @__PURE__ */ r("span", { className: "flex-1", children: e.label })
|
|
33
|
+
]
|
|
34
|
+
}
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
);
|
|
38
|
+
n.displayName = "AutocompleteOption";
|
|
39
|
+
export {
|
|
40
|
+
n as default
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=AutocompleteOption.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AutocompleteOption.js","sources":["../../../../../src/ui/components/Autocomplete/AutocompleteOption.tsx"],"sourcesContent":["\"use client\";\n\nimport { forwardRef, type ReactNode } from \"react\";\nimport { getSpacingClass } from \"../../tokens/spacing\";\n\nexport interface AutocompleteOptionType {\n value: string;\n label: string;\n disabled?: boolean;\n icon?: ReactNode;\n group?: string;\n}\n\nexport interface AutocompleteOptionProps {\n option: AutocompleteOptionType;\n isHighlighted: boolean;\n onSelect: (option: AutocompleteOptionType) => void;\n}\n\n/**\n * AutocompleteOption Component\n *\n * A single option in the autocomplete list.\n */\nconst AutocompleteOption = forwardRef<HTMLDivElement, AutocompleteOptionProps>(\n function AutocompleteOption({ option, isHighlighted, onSelect }, ref) {\n const handleClick = () => {\n if (!option.disabled) {\n onSelect(option);\n }\n };\n\n return (\n <div\n ref={ref}\n role=\"option\"\n aria-selected={isHighlighted}\n aria-disabled={option.disabled}\n onClick={handleClick}\n className={`\n flex\n items-center\n ${getSpacingClass(\"sm\", \"gap\")}\n ${getSpacingClass(\"sm\", \"px\")}\n ${getSpacingClass(\"sm\", \"py\")}\n text-sm\n cursor-pointer\n transition-colors\n ${isHighlighted ? \"bg-surface-active\" : \"\"}\n ${option.disabled ? \"opacity-50 cursor-not-allowed\" : \"hover:bg-surface-hover\"}\n `}\n >\n {option.icon && <span className=\"flex-shrink-0\">{option.icon}</span>}\n <span className=\"flex-1\">{option.label}</span>\n </div>\n );\n },\n);\n\nAutocompleteOption.displayName = \"AutocompleteOption\";\n\nexport default AutocompleteOption;\n"],"names":["AutocompleteOption","forwardRef","option","isHighlighted","onSelect","ref","handleClick","jsxs","getSpacingClass","jsx"],"mappings":";;;;AAwBA,MAAMA,IAAqBC;AAAA,EACzB,SAA4B,EAAE,QAAAC,GAAQ,eAAAC,GAAe,UAAAC,EAAA,GAAYC,GAAK;AACpE,UAAMC,IAAc,MAAM;AACxB,MAAKJ,EAAO,YACVE,EAASF,CAAM;AAAA,IAEnB;AAEA,WACE,gBAAAK;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAAF;AAAA,QACA,MAAK;AAAA,QACL,iBAAeF;AAAA,QACf,iBAAeD,EAAO;AAAA,QACtB,SAASI;AAAA,QACT,WAAW;AAAA;AAAA;AAAA,YAGPE,EAAgB,MAAM,KAAK,CAAC;AAAA,YAC5BA,EAAgB,MAAM,IAAI,CAAC;AAAA,YAC3BA,EAAgB,MAAM,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA,YAI3BL,IAAgB,sBAAsB,EAAE;AAAA,YACxCD,EAAO,WAAW,kCAAkC,wBAAwB;AAAA;AAAA,QAG/E,UAAA;AAAA,UAAAA,EAAO,QAAQ,gBAAAO,EAAC,QAAA,EAAK,WAAU,iBAAiB,YAAO,MAAK;AAAA,UAC7D,gBAAAA,EAAC,QAAA,EAAK,WAAU,UAAU,YAAO,MAAA,CAAM;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAG7C;AACF;AAEAT,EAAmB,cAAc;"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
var v = Object.defineProperty, j = Object.defineProperties;
|
|
3
|
+
var B = Object.getOwnPropertyDescriptors;
|
|
4
|
+
var i = Object.getOwnPropertySymbols;
|
|
5
|
+
var f = Object.prototype.hasOwnProperty, h = Object.prototype.propertyIsEnumerable;
|
|
6
|
+
var p = (e, r, a) => r in e ? v(e, r, { enumerable: !0, configurable: !0, writable: !0, value: a }) : e[r] = a, d = (e, r) => {
|
|
7
|
+
for (var a in r || (r = {}))
|
|
8
|
+
f.call(r, a) && p(e, a, r[a]);
|
|
9
|
+
if (i)
|
|
10
|
+
for (var a of i(r))
|
|
11
|
+
h.call(r, a) && p(e, a, r[a]);
|
|
12
|
+
return e;
|
|
13
|
+
}, x = (e, r) => j(e, B(r));
|
|
14
|
+
var b = (e, r) => {
|
|
15
|
+
var a = {};
|
|
16
|
+
for (var s in e)
|
|
17
|
+
f.call(e, s) && r.indexOf(s) < 0 && (a[s] = e[s]);
|
|
18
|
+
if (e != null && i)
|
|
19
|
+
for (var s of i(e))
|
|
20
|
+
r.indexOf(s) < 0 && h.call(e, s) && (a[s] = e[s]);
|
|
21
|
+
return a;
|
|
22
|
+
};
|
|
23
|
+
import { jsx as l, jsxs as C } from "react/jsx-runtime";
|
|
24
|
+
import { getSpacingClass as n } from "../../tokens/spacing.js";
|
|
25
|
+
import { getTypographySize as g, getTypographyWeight as y } from "../../tokens/typography.js";
|
|
26
|
+
import { cn as c } from "../../utils/cn.js";
|
|
27
|
+
function w(T) {
|
|
28
|
+
var m = T, {
|
|
29
|
+
items: e,
|
|
30
|
+
separator: r = "/",
|
|
31
|
+
className: a = ""
|
|
32
|
+
} = m, s = b(m, [
|
|
33
|
+
"items",
|
|
34
|
+
"separator",
|
|
35
|
+
"className"
|
|
36
|
+
]);
|
|
37
|
+
const u = [
|
|
38
|
+
"flex",
|
|
39
|
+
"items-center",
|
|
40
|
+
n("sm", "space-x"),
|
|
41
|
+
g("bodySmall")
|
|
42
|
+
], N = c(...u, a);
|
|
43
|
+
return /* @__PURE__ */ l("nav", x(d({ "aria-label": "Breadcrumb", className: N }, s), { children: /* @__PURE__ */ l(
|
|
44
|
+
"ol",
|
|
45
|
+
{
|
|
46
|
+
className: c("flex", "items-center", n("sm", "space-x")),
|
|
47
|
+
children: e.map((t, o) => {
|
|
48
|
+
const S = o === e.length - 1;
|
|
49
|
+
return /* @__PURE__ */ C("li", { className: "flex items-center", children: [
|
|
50
|
+
o > 0 && /* @__PURE__ */ l(
|
|
51
|
+
"span",
|
|
52
|
+
{
|
|
53
|
+
className: c(
|
|
54
|
+
n("sm", "mx"),
|
|
55
|
+
"text-fg-tertiary"
|
|
56
|
+
),
|
|
57
|
+
"aria-hidden": "true",
|
|
58
|
+
children: r
|
|
59
|
+
}
|
|
60
|
+
),
|
|
61
|
+
S ? /* @__PURE__ */ l(
|
|
62
|
+
"span",
|
|
63
|
+
{
|
|
64
|
+
className: c(
|
|
65
|
+
"text-fg-primary",
|
|
66
|
+
y("label")
|
|
67
|
+
),
|
|
68
|
+
"aria-current": "page",
|
|
69
|
+
children: t.label
|
|
70
|
+
}
|
|
71
|
+
) : t.href ? /* @__PURE__ */ l(
|
|
72
|
+
"a",
|
|
73
|
+
{
|
|
74
|
+
href: t.href,
|
|
75
|
+
className: c(
|
|
76
|
+
"inline-flex",
|
|
77
|
+
"items-center",
|
|
78
|
+
n("xs", "px"),
|
|
79
|
+
n("xs", "pt"),
|
|
80
|
+
"border-b-2",
|
|
81
|
+
"border-transparent",
|
|
82
|
+
g("bodySmall"),
|
|
83
|
+
y("label"),
|
|
84
|
+
"transition-colors",
|
|
85
|
+
"text-fg-secondary",
|
|
86
|
+
"hover:border-line-emphasis",
|
|
87
|
+
"hover:text-fg-primary"
|
|
88
|
+
),
|
|
89
|
+
children: t.label
|
|
90
|
+
}
|
|
91
|
+
) : /* @__PURE__ */ l("span", { className: "text-fg-secondary", children: t.label })
|
|
92
|
+
] }, o);
|
|
93
|
+
})
|
|
94
|
+
}
|
|
95
|
+
) }));
|
|
96
|
+
}
|
|
97
|
+
export {
|
|
98
|
+
w as default
|
|
99
|
+
};
|
|
100
|
+
//# sourceMappingURL=Breadcrumb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Breadcrumb.js","sources":["../../../../../src/ui/components/Breadcrumb/Breadcrumb.tsx"],"sourcesContent":["\"use client\";\n\nimport type { HTMLAttributes } from \"react\";\nimport { cn } from \"../../utils\";\nimport {\n getSpacingClass,\n getTypographySize,\n getTypographyWeight,\n} from \"../../tokens\";\n\nexport interface BreadcrumbItem {\n label: string;\n href?: string;\n}\n\ninterface Props extends HTMLAttributes<HTMLElement> {\n items: BreadcrumbItem[];\n separator?: string;\n}\n\n/**\n * Breadcrumb Component\n *\n * A breadcrumb navigation component for hierarchical navigation.\n * Follows Atomic Design principles as a Molecule component.\n *\n * @example\n * ```tsx\n * <Breadcrumb\n * items={[\n * { label: \"Home\", href: \"/\" },\n * { label: \"Epics\", href: \"/epics\" },\n * { label: \"Epic Details\" }\n * ]}\n * />\n * ```\n */\nexport default function Breadcrumb({\n items,\n separator = \"/\",\n className = \"\",\n ...props\n}: Props) {\n const baseClasses = [\n \"flex\",\n \"items-center\",\n getSpacingClass(\"sm\", \"space-x\"),\n getTypographySize(\"bodySmall\"),\n ];\n\n const classes = cn(...baseClasses, className);\n\n return (\n <nav aria-label=\"Breadcrumb\" className={classes} {...props}>\n <ol\n className={cn(\"flex\", \"items-center\", getSpacingClass(\"sm\", \"space-x\"))}\n >\n {items.map((item, index) => {\n const isLast = index === items.length - 1;\n\n return (\n <li key={index} className=\"flex items-center\">\n {index > 0 && (\n <span\n className={cn(\n getSpacingClass(\"sm\", \"mx\"),\n \"text-fg-tertiary\",\n )}\n aria-hidden=\"true\"\n >\n {separator}\n </span>\n )}\n {isLast ? (\n <span\n className={cn(\n \"text-fg-primary\",\n getTypographyWeight(\"label\"),\n )}\n aria-current=\"page\"\n >\n {item.label}\n </span>\n ) : item.href ? (\n <a\n href={item.href}\n className={cn(\n \"inline-flex\",\n \"items-center\",\n getSpacingClass(\"xs\", \"px\"),\n getSpacingClass(\"xs\", \"pt\"),\n \"border-b-2\",\n \"border-transparent\",\n getTypographySize(\"bodySmall\"),\n getTypographyWeight(\"label\"),\n \"transition-colors\",\n \"text-fg-secondary\",\n \"hover:border-line-emphasis\",\n \"hover:text-fg-primary\",\n )}\n >\n {item.label}\n </a>\n ) : (\n <span className=\"text-fg-secondary\">{item.label}</span>\n )}\n </li>\n );\n })}\n </ol>\n </nav>\n );\n}\n"],"names":["Breadcrumb","_a","_b","items","separator","className","props","__objRest","baseClasses","getSpacingClass","getTypographySize","classes","cn","__spreadProps","__spreadValues","jsx","item","index","isLast","jsxs","getTypographyWeight"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAqCA,SAAwBA,EAAWC,GAKzB;AALyB,MAAAC,IAAAD,GACjC;AAAA,WAAAE;AAAA,IACA,WAAAC,IAAY;AAAA,IACZ,WAAAC,IAAY;AAAA,MAHqBH,GAI9BI,IAAAC,EAJ8BL,GAI9B;AAAA,IAHH;AAAA,IACA;AAAA,IACA;AAAA;AAGA,QAAMM,IAAc;AAAA,IAClB;AAAA,IACA;AAAA,IACAC,EAAgB,MAAM,SAAS;AAAA,IAC/BC,EAAkB,WAAW;AAAA,EAAA,GAGzBC,IAAUC,EAAG,GAAGJ,GAAaH,CAAS;AAE5C,2BACG,OAAAQ,EAAAC,EAAA,EAAI,cAAW,cAAa,WAAWH,KAAaL,IAApD,EACC,UAAA,gBAAAS;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWH,EAAG,QAAQ,gBAAgBH,EAAgB,MAAM,SAAS,CAAC;AAAA,MAErE,UAAAN,EAAM,IAAI,CAACa,GAAMC,MAAU;AAC1B,cAAMC,IAASD,MAAUd,EAAM,SAAS;AAExC,eACE,gBAAAgB,EAAC,MAAA,EAAe,WAAU,qBACvB,UAAA;AAAA,UAAAF,IAAQ,KACP,gBAAAF;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAWH;AAAA,gBACTH,EAAgB,MAAM,IAAI;AAAA,gBAC1B;AAAA,cAAA;AAAA,cAEF,eAAY;AAAA,cAEX,UAAAL;AAAA,YAAA;AAAA,UAAA;AAAA,UAGJc,IACC,gBAAAH;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAWH;AAAA,gBACT;AAAA,gBACAQ,EAAoB,OAAO;AAAA,cAAA;AAAA,cAE7B,gBAAa;AAAA,cAEZ,UAAAJ,EAAK;AAAA,YAAA;AAAA,UAAA,IAENA,EAAK,OACP,gBAAAD;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAMC,EAAK;AAAA,cACX,WAAWJ;AAAA,gBACT;AAAA,gBACA;AAAA,gBACAH,EAAgB,MAAM,IAAI;AAAA,gBAC1BA,EAAgB,MAAM,IAAI;AAAA,gBAC1B;AAAA,gBACA;AAAA,gBACAC,EAAkB,WAAW;AAAA,gBAC7BU,EAAoB,OAAO;AAAA,gBAC3B;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,cAAA;AAAA,cAGD,UAAAJ,EAAK;AAAA,YAAA;AAAA,UAAA,IAGR,gBAAAD,EAAC,QAAA,EAAK,WAAU,qBAAqB,YAAK,MAAA,CAAM;AAAA,QAAA,EAAA,GA3C3CE,CA6CT;AAAA,MAEJ,CAAC;AAAA,IAAA;AAAA,EAAA,IAEL;AAEJ;"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
var V = Object.defineProperty, H = Object.defineProperties;
|
|
3
|
+
var I = Object.getOwnPropertyDescriptors;
|
|
4
|
+
var i = Object.getOwnPropertySymbols;
|
|
5
|
+
var h = Object.prototype.hasOwnProperty, w = Object.prototype.propertyIsEnumerable;
|
|
6
|
+
var C = (e, a, r) => a in e ? V(e, a, { enumerable: !0, configurable: !0, writable: !0, value: r }) : e[a] = r, s = (e, a) => {
|
|
7
|
+
for (var r in a || (a = {}))
|
|
8
|
+
h.call(a, r) && C(e, r, a[r]);
|
|
9
|
+
if (i)
|
|
10
|
+
for (var r of i(a))
|
|
11
|
+
w.call(a, r) && C(e, r, a[r]);
|
|
12
|
+
return e;
|
|
13
|
+
}, l = (e, a) => H(e, I(a));
|
|
14
|
+
var D = (e, a) => {
|
|
15
|
+
var r = {};
|
|
16
|
+
for (var o in e)
|
|
17
|
+
h.call(e, o) && a.indexOf(o) < 0 && (r[o] = e[o]);
|
|
18
|
+
if (e != null && i)
|
|
19
|
+
for (var o of i(e))
|
|
20
|
+
a.indexOf(o) < 0 && w.call(e, o) && (r[o] = e[o]);
|
|
21
|
+
return r;
|
|
22
|
+
};
|
|
23
|
+
import { jsx as x } from "react/jsx-runtime";
|
|
24
|
+
import { memo as P } from "react";
|
|
25
|
+
import { CardHeader as j } from "./CardHeader.js";
|
|
26
|
+
import { CardTitle as q } from "./CardTitle.js";
|
|
27
|
+
import { CardSubtitle as B } from "./CardSubtitle.js";
|
|
28
|
+
import { CardActions as M } from "./CardActions.js";
|
|
29
|
+
import { CardBody as O } from "./CardBody.js";
|
|
30
|
+
import { cva as R } from "../../utils/cva.js";
|
|
31
|
+
import { getSpacingClass as p } from "../../tokens/spacing.js";
|
|
32
|
+
import { cn as d } from "../../utils/cn.js";
|
|
33
|
+
import { getShadowClass as u } from "../../tokens/shadows.js";
|
|
34
|
+
import { getRadiusClass as _ } from "../../tokens/radius.js";
|
|
35
|
+
function $(z) {
|
|
36
|
+
var y = z, {
|
|
37
|
+
variant: e = "default",
|
|
38
|
+
padding: a = "medium",
|
|
39
|
+
className: r = "",
|
|
40
|
+
onClick: o,
|
|
41
|
+
"aria-label": f,
|
|
42
|
+
"aria-labelledby": c,
|
|
43
|
+
asSection: b = !1,
|
|
44
|
+
children: v
|
|
45
|
+
} = y, S = D(y, [
|
|
46
|
+
"variant",
|
|
47
|
+
"padding",
|
|
48
|
+
"className",
|
|
49
|
+
"onClick",
|
|
50
|
+
"aria-label",
|
|
51
|
+
"aria-labelledby",
|
|
52
|
+
"asSection",
|
|
53
|
+
"children"
|
|
54
|
+
]);
|
|
55
|
+
typeof process != "undefined" && process.env.NODE_ENV !== "production" && b && !f && !c && console.warn(
|
|
56
|
+
"[Card] `asSection={true}` requires an accessible name. Pass `aria-labelledby` pointing to your Card.Title `id`, or `aria-label`. A <section> without a name is an anonymous landmark that hurts screen-reader navigation."
|
|
57
|
+
);
|
|
58
|
+
const A = R(
|
|
59
|
+
d(
|
|
60
|
+
"bg-surface-base",
|
|
61
|
+
_("lg"),
|
|
62
|
+
"border",
|
|
63
|
+
"border-line-default",
|
|
64
|
+
u("sm")
|
|
65
|
+
),
|
|
66
|
+
{
|
|
67
|
+
variants: {
|
|
68
|
+
variant: {
|
|
69
|
+
default: "",
|
|
70
|
+
hover: d(
|
|
71
|
+
`hover:${u("md")}`,
|
|
72
|
+
"transition-shadow",
|
|
73
|
+
"cursor-pointer"
|
|
74
|
+
),
|
|
75
|
+
selected: d("border-line-brand", u("md"))
|
|
76
|
+
},
|
|
77
|
+
padding: {
|
|
78
|
+
none: "",
|
|
79
|
+
small: p("xs", "p"),
|
|
80
|
+
medium: p("base", "p"),
|
|
81
|
+
large: p("lg", "p")
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
defaultVariants: {
|
|
85
|
+
variant: "default",
|
|
86
|
+
padding: "medium"
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
), n = o !== void 0, E = n ? "button" : void 0, K = n ? 0 : void 0, T = d(A({ variant: e, padding: a }), r), g = s({
|
|
90
|
+
className: T,
|
|
91
|
+
role: E,
|
|
92
|
+
tabIndex: K,
|
|
93
|
+
onClick: o,
|
|
94
|
+
onKeyDown: n ? (m) => {
|
|
95
|
+
n && (m.key === "Enter" || m.key === " ") && (m.preventDefault(), o == null || o());
|
|
96
|
+
} : void 0,
|
|
97
|
+
"aria-label": f,
|
|
98
|
+
"aria-labelledby": c
|
|
99
|
+
}, S);
|
|
100
|
+
return b ? /* @__PURE__ */ x("section", l(s({}, g), { children: v })) : /* @__PURE__ */ x("div", l(s({}, g), { children: v }));
|
|
101
|
+
}
|
|
102
|
+
const N = P($);
|
|
103
|
+
N.displayName = "Card";
|
|
104
|
+
const t = N;
|
|
105
|
+
t.Header = j;
|
|
106
|
+
t.Title = q;
|
|
107
|
+
t.Subtitle = B;
|
|
108
|
+
t.Actions = M;
|
|
109
|
+
t.Body = O;
|
|
110
|
+
export {
|
|
111
|
+
t as default
|
|
112
|
+
};
|
|
113
|
+
//# sourceMappingURL=Card.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Card.js","sources":["../../../../../src/ui/components/Card/Card.tsx"],"sourcesContent":["import { memo, type FC, type HTMLAttributes } from \"react\";\nimport { cn, cva } from \"../../utils\";\nimport { getRadiusClass, getShadowClass, getSpacingClass } from \"../../tokens\";\nimport { CardHeader } from \"./CardHeader\";\nimport { CardTitle } from \"./CardTitle\";\nimport { CardSubtitle } from \"./CardSubtitle\";\nimport { CardActions } from \"./CardActions\";\nimport { CardBody } from \"./CardBody\";\n\n// Ambient declaration so the dev-only warn typechecks without pulling\n// @types/node into the app tsconfig. At runtime the consumer's bundler\n// replaces `process.env.NODE_ENV` with a literal; the `typeof process`\n// guard keeps the branch safe in browser/edge runtimes where `process`\n// doesn't exist. Mirrors the precedent in Button.tsx.\ndeclare const process: { env: { NODE_ENV?: string } };\n\nexport interface CardProps extends HTMLAttributes<HTMLDivElement> {\n variant?: \"default\" | \"hover\" | \"selected\";\n padding?: \"none\" | \"small\" | \"medium\" | \"large\";\n onClick?: () => void;\n \"aria-label\"?: string;\n \"aria-labelledby\"?: string;\n /**\n * Render the root as a semantic `<section>` instead of `<div>`.\n * When `true`, the Card becomes a landmark — a screen-reader-visible\n * region in the document outline — so it MUST carry an accessible\n * name (either `aria-labelledby` pointing to a `Card.Title` `id` or\n * `aria-label`). A dev-only warning is emitted when this contract\n * isn't met; an anonymous landmark hurts navigation by announcing\n * \"region\" without a name.\n * @default false\n */\n asSection?: boolean;\n}\n\n/**\n * Card — versatile container.\n *\n * Supports the compound pattern via dot-notation:\n *\n * ```tsx\n * <Card asSection aria-labelledby=\"parlamentares-title\">\n * <Card.Header>\n * <Card.Title id=\"parlamentares-title\" icon={<Users />} badge={<Badge>Beta</Badge>}>\n * Parlamentares\n * </Card.Title>\n * <Card.Subtitle>Câmara e Senado</Card.Subtitle>\n * <Card.Actions>\n * <Button variant=\"ghost\">Editar</Button>\n * </Card.Actions>\n * </Card.Header>\n * <Card.Body>{children}</Card.Body>\n * </Card>\n * ```\n *\n * Backward compat: the flat form (`<Card>{children}</Card>`) and the\n * interactive form (`<Card onClick={...}>`) are unchanged.\n *\n * Server/client boundary: every subcomponent (Card, Card.Header,\n * Card.Title, Card.Subtitle, Card.Actions, Card.Body) is presentational\n * and ships in `./server`. Interactive children (Button with onClick,\n * Link, etc.) supplied via `<Card.Actions>` cross the RSC boundary\n * naturally — the wrapper stays server-safe.\n */\nfunction CardComponent({\n variant = \"default\",\n padding = \"medium\",\n className = \"\",\n onClick,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n asSection = false,\n children,\n ...props\n}: CardProps) {\n if (\n typeof process !== \"undefined\" &&\n process.env.NODE_ENV !== \"production\" &&\n asSection &&\n !ariaLabel &&\n !ariaLabelledBy\n ) {\n console.warn(\n \"[Card] `asSection={true}` requires an accessible name. Pass `aria-labelledby` pointing to your Card.Title `id`, or `aria-label`. A <section> without a name is an anonymous landmark that hurts screen-reader navigation.\",\n );\n }\n\n const cardVariants = cva(\n cn(\n \"bg-surface-base\",\n getRadiusClass(\"lg\"),\n \"border\",\n \"border-line-default\",\n getShadowClass(\"sm\"),\n ),\n {\n variants: {\n variant: {\n default: \"\",\n hover: cn(\n `hover:${getShadowClass(\"md\")}`,\n \"transition-shadow\",\n \"cursor-pointer\",\n ),\n selected: cn(\"border-line-brand\", getShadowClass(\"md\")),\n },\n padding: {\n none: \"\",\n small: getSpacingClass(\"xs\", \"p\"),\n medium: getSpacingClass(\"base\", \"p\"),\n large: getSpacingClass(\"lg\", \"p\"),\n },\n },\n defaultVariants: {\n variant: \"default\",\n padding: \"medium\",\n },\n },\n );\n\n // ARIA interactivity is driven by `onClick` ONLY. `variant=\"hover\"` is\n // a visual style (hover shadow + cursor hint via cardVariants) — not a\n // declaration that the card is clickable. The previous coupling made\n // any `variant=\"hover\"` Card a `role=\"button\" tabindex=0` outer, which\n // triggered axe `nested-interactive` whenever the consumer composed\n // Buttons inside. Decoupling fixes that without changing the visual\n // behavior. Stories that want a clickable card already pass `onClick`.\n const isInteractive = onClick !== undefined;\n const role = isInteractive ? \"button\" : undefined;\n const tabIndex = isInteractive ? 0 : undefined;\n\n const classes = cn(cardVariants({ variant, padding }), className);\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLElement>) => {\n if (isInteractive && (e.key === \"Enter\" || e.key === \" \")) {\n e.preventDefault();\n onClick?.();\n }\n };\n\n // Polymorphic root: <section> when asSection, <div> otherwise. Both\n // accept the same HTMLAttributes via `...props` (HTMLDivElement and\n // HTMLElement attribute sets overlap on the props we use).\n const commonProps = {\n className: classes,\n role,\n tabIndex,\n onClick,\n onKeyDown: isInteractive ? handleKeyDown : undefined,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n ...props,\n } as const;\n\n if (asSection) {\n return <section {...commonProps}>{children}</section>;\n }\n return <div {...commonProps}>{children}</div>;\n}\n\nconst MemoCard = memo(CardComponent);\nMemoCard.displayName = \"Card\";\n\n// Compound components (dot-notation). Pattern follows Tabs.tsx — define\n// the function, attach subcomponents, cast to a type that exposes them.\ntype CardCompound = FC<CardProps> & {\n Header: typeof CardHeader;\n Title: typeof CardTitle;\n Subtitle: typeof CardSubtitle;\n Actions: typeof CardActions;\n Body: typeof CardBody;\n};\n\nconst Card = MemoCard as unknown as CardCompound;\nCard.Header = CardHeader;\nCard.Title = CardTitle;\nCard.Subtitle = CardSubtitle;\nCard.Actions = CardActions;\nCard.Body = CardBody;\n\nexport default Card;\n"],"names":["CardComponent","_a","_b","variant","padding","className","onClick","ariaLabel","ariaLabelledBy","asSection","children","props","__objRest","cardVariants","cva","cn","getRadiusClass","getShadowClass","getSpacingClass","isInteractive","role","tabIndex","classes","commonProps","__spreadValues","e","jsx","__spreadProps","MemoCard","memo","Card","CardHeader","CardTitle","CardSubtitle","CardActions","CardBody"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgEA,SAASA,EAAcC,GAUT;AAVS,MAAAC,IAAAD,GACrB;AAAA,aAAAE,IAAU;AAAA,IACV,SAAAC,IAAU;AAAA,IACV,WAAAC,IAAY;AAAA,IACZ,SAAAC;AAAA,IACA,cAAcC;AAAA,IACd,mBAAmBC;AAAA,IACnB,WAAAC,IAAY;AAAA,IACZ,UAAAC;AAAA,MARqBR,GASlBS,IAAAC,EATkBV,GASlB;AAAA,IARH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAGA,EACE,OAAO,WAAY,eACnB,QAAQ,IAAI,aAAa,gBACzBO,KACA,CAACF,KACD,CAACC,KAED,QAAQ;AAAA,IACN;AAAA,EAAA;AAIJ,QAAMK,IAAeC;AAAA,IACnBC;AAAA,MACE;AAAA,MACAC,EAAe,IAAI;AAAA,MACnB;AAAA,MACA;AAAA,MACAC,EAAe,IAAI;AAAA,IAAA;AAAA,IAErB;AAAA,MACE,UAAU;AAAA,QACR,SAAS;AAAA,UACP,SAAS;AAAA,UACT,OAAOF;AAAA,YACL,SAASE,EAAe,IAAI,CAAC;AAAA,YAC7B;AAAA,YACA;AAAA,UAAA;AAAA,UAEF,UAAUF,EAAG,qBAAqBE,EAAe,IAAI,CAAC;AAAA,QAAA;AAAA,QAExD,SAAS;AAAA,UACP,MAAM;AAAA,UACN,OAAOC,EAAgB,MAAM,GAAG;AAAA,UAChC,QAAQA,EAAgB,QAAQ,GAAG;AAAA,UACnC,OAAOA,EAAgB,MAAM,GAAG;AAAA,QAAA;AAAA,MAClC;AAAA,MAEF,iBAAiB;AAAA,QACf,SAAS;AAAA,QACT,SAAS;AAAA,MAAA;AAAA,IACX;AAAA,EACF,GAUIC,IAAgBb,MAAY,QAC5Bc,IAAOD,IAAgB,WAAW,QAClCE,IAAWF,IAAgB,IAAI,QAE/BG,IAAUP,EAAGF,EAAa,EAAE,SAAAV,GAAS,SAAAC,EAAA,CAAS,GAAGC,CAAS,GAY1DkB,IAAcC,EAAA;AAAA,IAClB,WAAWF;AAAA,IACX,MAAAF;AAAA,IACA,UAAAC;AAAA,IACA,SAAAf;AAAA,IACA,WAAWa,IAfS,CAACM,MAAwC;AAC7D,MAAIN,MAAkBM,EAAE,QAAQ,WAAWA,EAAE,QAAQ,SACnDA,EAAE,eAAA,GACFnB,KAAA,QAAAA;AAAA,IAEJ,IAU6C;AAAA,IAC3C,cAAcC;AAAA,IACd,mBAAmBC;AAAA,KAChBG;AAGL,SAAIF,IACK,gBAAAiB,EAAC,WAAAC,EAAAH,EAAA,IAAYD,IAAZ,EAA0B,UAAAb,EAAA,EAAS,IAEtC,gBAAAgB,EAAC,OAAAC,EAAAH,EAAA,IAAQD,IAAR,EAAsB,UAAAb,EAAA,EAAS;AACzC;AAEA,MAAMkB,IAAWC,EAAK7B,CAAa;AACnC4B,EAAS,cAAc;AAYvB,MAAME,IAAOF;AACbE,EAAK,SAASC;AACdD,EAAK,QAAQE;AACbF,EAAK,WAAWG;AAChBH,EAAK,UAAUI;AACfJ,EAAK,OAAOK;"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
var l = Object.defineProperty, d = Object.defineProperties;
|
|
3
|
+
var g = Object.getOwnPropertyDescriptors;
|
|
4
|
+
var e = Object.getOwnPropertySymbols;
|
|
5
|
+
var c = Object.prototype.hasOwnProperty, m = Object.prototype.propertyIsEnumerable;
|
|
6
|
+
var o = (t, r, s) => r in t ? l(t, r, { enumerable: !0, configurable: !0, writable: !0, value: s }) : t[r] = s, n = (t, r) => {
|
|
7
|
+
for (var s in r || (r = {}))
|
|
8
|
+
c.call(r, s) && o(t, s, r[s]);
|
|
9
|
+
if (e)
|
|
10
|
+
for (var s of e(r))
|
|
11
|
+
m.call(r, s) && o(t, s, r[s]);
|
|
12
|
+
return t;
|
|
13
|
+
}, f = (t, r) => d(t, g(r));
|
|
14
|
+
var p = (t, r) => {
|
|
15
|
+
var s = {};
|
|
16
|
+
for (var a in t)
|
|
17
|
+
c.call(t, a) && r.indexOf(a) < 0 && (s[a] = t[a]);
|
|
18
|
+
if (t != null && e)
|
|
19
|
+
for (var a of e(t))
|
|
20
|
+
r.indexOf(a) < 0 && m.call(t, a) && (s[a] = t[a]);
|
|
21
|
+
return s;
|
|
22
|
+
};
|
|
23
|
+
import { jsx as u } from "react/jsx-runtime";
|
|
24
|
+
import { getSpacingClass as x } from "../../tokens/spacing.js";
|
|
25
|
+
import { cn as C } from "../../utils/cn.js";
|
|
26
|
+
function S(a) {
|
|
27
|
+
var i = a, {
|
|
28
|
+
children: t,
|
|
29
|
+
className: r
|
|
30
|
+
} = i, s = p(i, [
|
|
31
|
+
"children",
|
|
32
|
+
"className"
|
|
33
|
+
]);
|
|
34
|
+
return /* @__PURE__ */ u(
|
|
35
|
+
"div",
|
|
36
|
+
f(n({
|
|
37
|
+
"data-card-actions": "",
|
|
38
|
+
className: C(
|
|
39
|
+
"flex items-center self-start",
|
|
40
|
+
x("sm", "gap"),
|
|
41
|
+
r
|
|
42
|
+
)
|
|
43
|
+
}, s), {
|
|
44
|
+
children: t
|
|
45
|
+
})
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
export {
|
|
49
|
+
S as CardActions
|
|
50
|
+
};
|
|
51
|
+
//# sourceMappingURL=CardActions.js.map
|