@fabio.caffarello/react-design-system 3.12.0 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/granular/index.js +393 -389
- package/dist/granular/index.js.map +1 -1
- package/dist/granular/ui/components/Autocomplete/Autocomplete.js +103 -86
- package/dist/granular/ui/components/Autocomplete/Autocomplete.js.map +1 -1
- package/dist/granular/ui/components/Autocomplete/AutocompleteList.js +57 -47
- package/dist/granular/ui/components/Autocomplete/AutocompleteList.js.map +1 -1
- package/dist/granular/ui/components/Autocomplete/AutocompleteOption.js +21 -20
- package/dist/granular/ui/components/Autocomplete/AutocompleteOption.js.map +1 -1
- package/dist/granular/ui/components/Breadcrumb/Breadcrumb.js.map +1 -1
- package/dist/granular/ui/components/ButtonGroup/ButtonGroup.js +68 -0
- package/dist/granular/ui/components/ButtonGroup/ButtonGroup.js.map +1 -0
- package/dist/granular/ui/components/ColorPicker/ColorPicker.js.map +1 -1
- package/dist/granular/ui/components/CommandPalette/CommandPalette.js +187 -149
- package/dist/granular/ui/components/CommandPalette/CommandPalette.js.map +1 -1
- package/dist/granular/ui/components/DataGrid/DataGrid.js +92 -92
- package/dist/granular/ui/components/DataGrid/DataGrid.js.map +1 -1
- package/dist/granular/ui/components/DatePicker/DatePickerCalendar.js +154 -139
- package/dist/granular/ui/components/DatePicker/DatePickerCalendar.js.map +1 -1
- package/dist/granular/ui/components/Dialog/AlertDialog.js +73 -40
- package/dist/granular/ui/components/Dialog/AlertDialog.js.map +1 -1
- package/dist/granular/ui/components/Dialog/DialogContent.js +54 -48
- package/dist/granular/ui/components/Dialog/DialogContent.js.map +1 -1
- package/dist/granular/ui/components/Dialog/DialogDescription.js +31 -31
- package/dist/granular/ui/components/Dialog/DialogDescription.js.map +1 -1
- package/dist/granular/ui/components/Dialog/DialogTitle.js +30 -30
- package/dist/granular/ui/components/Dialog/DialogTitle.js.map +1 -1
- package/dist/granular/ui/components/Drawer/Drawer.js.map +1 -1
- package/dist/granular/ui/components/Dropdown/Dropdown.js.map +1 -1
- package/dist/granular/ui/components/EmptyState/EmptyState.js.map +1 -1
- package/dist/granular/ui/components/FileUpload/FileUpload.js.map +1 -1
- package/dist/granular/ui/components/Form/Form.js +38 -37
- package/dist/granular/ui/components/Form/Form.js.map +1 -1
- package/dist/granular/ui/components/Form/FormField.js +28 -26
- package/dist/granular/ui/components/Form/FormField.js.map +1 -1
- package/dist/granular/ui/components/Header/Header.js.map +1 -1
- package/dist/granular/ui/components/Header/components/HeaderActions.js.map +1 -1
- package/dist/granular/ui/components/Header/components/HeaderHamburger.js.map +1 -1
- package/dist/granular/ui/components/Header/components/HeaderLogo.js.map +1 -1
- package/dist/granular/ui/components/Header/components/HeaderMobileMenu.js.map +1 -1
- package/dist/granular/ui/components/Header/components/HeaderNavigation.js.map +1 -1
- package/dist/granular/ui/components/Header/contexts/HeaderContext.js.map +1 -1
- package/dist/granular/ui/components/Menu/Menu.js.map +1 -1
- package/dist/granular/ui/components/Modal/Modal.js +98 -86
- package/dist/granular/ui/components/Modal/Modal.js.map +1 -1
- package/dist/granular/ui/components/MultiSelect/MultiSelect.js +122 -106
- package/dist/granular/ui/components/MultiSelect/MultiSelect.js.map +1 -1
- package/dist/granular/ui/components/Navigation/Navigation.js.map +1 -1
- package/dist/granular/ui/components/PageHeader/PageHeader.js.map +1 -1
- package/dist/granular/ui/components/Pagination/Pagination.js.map +1 -1
- package/dist/granular/ui/components/Popover/Popover.js.map +1 -1
- package/dist/granular/ui/components/Rating/Rating.js.map +1 -1
- package/dist/granular/ui/components/SearchInput/SearchInput.js.map +1 -1
- package/dist/granular/ui/components/SideNavbar/components/Navbar/NavbarGroup.js +82 -64
- package/dist/granular/ui/components/SideNavbar/components/Navbar/NavbarGroup.js.map +1 -1
- package/dist/granular/ui/components/SideNavbar/components/Navbar/NavbarItem.js +30 -29
- package/dist/granular/ui/components/SideNavbar/components/Navbar/NavbarItem.js.map +1 -1
- package/dist/granular/ui/components/SideNavbar/components/SideNavbarResizeHandle.js +37 -35
- package/dist/granular/ui/components/SideNavbar/components/SideNavbarResizeHandle.js.map +1 -1
- package/dist/granular/ui/components/SideNavbar/providers/SideNavbarStateProvider.js +57 -57
- package/dist/granular/ui/components/SideNavbar/providers/SideNavbarStateProvider.js.map +1 -1
- package/dist/granular/ui/components/Stepper/Stepper.js +102 -94
- package/dist/granular/ui/components/Stepper/Stepper.js.map +1 -1
- package/dist/granular/ui/components/Table/Table.js +41 -35
- package/dist/granular/ui/components/Table/Table.js.map +1 -1
- package/dist/granular/ui/components/Table/TableActions/TableActions.js.map +1 -1
- package/dist/granular/ui/components/Table/TableFilters/TableFilters.js +49 -46
- package/dist/granular/ui/components/Table/TableFilters/TableFilters.js.map +1 -1
- package/dist/granular/ui/components/Table/TablePagination/TablePagination.js.map +1 -1
- package/dist/granular/ui/components/Table/TableProvider.js +82 -80
- package/dist/granular/ui/components/Table/TableProvider.js.map +1 -1
- package/dist/granular/ui/components/Table/TableRow.js +57 -53
- package/dist/granular/ui/components/Table/TableRow.js.map +1 -1
- package/dist/granular/ui/components/Table/useColumnResizing.js +53 -53
- package/dist/granular/ui/components/Table/useColumnResizing.js.map +1 -1
- package/dist/granular/ui/components/TimePicker/TimePicker.js +149 -103
- package/dist/granular/ui/components/TimePicker/TimePicker.js.map +1 -1
- package/dist/granular/ui/components/Timeline/Timeline.js.map +1 -1
- package/dist/granular/ui/hooks/useFocusRestore.js +14 -15
- package/dist/granular/ui/hooks/useFocusRestore.js.map +1 -1
- package/dist/granular/ui/primitives/Badge/Badge.js.map +1 -1
- package/dist/granular/ui/primitives/Checkbox/Checkbox.js.map +1 -1
- package/dist/granular/ui/primitives/Chip/Chip.js +91 -71
- package/dist/granular/ui/primitives/Chip/Chip.js.map +1 -1
- package/dist/granular/ui/primitives/Dot/Dot.js +99 -0
- package/dist/granular/ui/primitives/Dot/Dot.js.map +1 -0
- package/dist/granular/ui/primitives/ErrorMessage/ErrorMessage.js.map +1 -1
- package/dist/granular/ui/primitives/Input/Input.js.map +1 -1
- package/dist/granular/ui/primitives/Label/Label.js.map +1 -1
- package/dist/granular/ui/primitives/NavLink/NavLink.js.map +1 -1
- package/dist/granular/ui/primitives/Radio/Radio.js.map +1 -1
- package/dist/granular/ui/primitives/Select/Select.js.map +1 -1
- package/dist/granular/ui/primitives/Separator/Separator.js.map +1 -1
- package/dist/granular/ui/primitives/Skeleton/Skeleton.js.map +1 -1
- package/dist/granular/ui/primitives/Slider/Slider.js.map +1 -1
- package/dist/granular/ui/primitives/Spinner/Spinner.js.map +1 -1
- package/dist/granular/ui/primitives/Switch/Switch.js.map +1 -1
- package/dist/granular/ui/primitives/Tooltip/Tooltip.js.map +1 -1
- package/dist/granular/ui/providers/DialogContext.js.map +1 -1
- package/dist/granular/ui/providers/DialogProvider.js +24 -20
- package/dist/granular/ui/providers/DialogProvider.js.map +1 -1
- package/dist/index.cjs +134 -134
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +5945 -5542
- package/dist/index.js.map +1 -1
- package/dist/react-design-system.css +1 -1
- package/dist/server/index.cjs +7 -7
- package/dist/server/index.cjs.map +1 -1
- package/dist/server/index.js +404 -384
- package/dist/server/index.js.map +1 -1
- package/dist/ui/components/Autocomplete/AutocompleteList.d.ts +4 -0
- package/dist/ui/components/Autocomplete/AutocompleteOption.d.ts +8 -0
- package/dist/ui/components/Breadcrumb/Breadcrumb.d.ts +0 -1
- package/dist/ui/components/ButtonGroup/ButtonGroup.d.ts +2 -2
- package/dist/ui/components/ColorPicker/ColorPicker.d.ts +0 -1
- package/dist/ui/components/CommandPalette/CommandPalette.d.ts +0 -1
- package/dist/ui/components/DataGrid/DataGrid.d.ts +0 -1
- package/dist/ui/components/Dialog/DialogContent.d.ts +20 -1
- package/dist/ui/components/Drawer/Drawer.d.ts +0 -1
- package/dist/ui/components/Dropdown/Dropdown.d.ts +0 -1
- package/dist/ui/components/EmptyState/EmptyState.d.ts +0 -1
- package/dist/ui/components/FileUpload/FileUpload.d.ts +0 -1
- package/dist/ui/components/Form/FormField.d.ts +7 -0
- package/dist/ui/components/Header/Header.d.ts +1 -1
- package/dist/ui/components/Header/components/HeaderActions.d.ts +1 -1
- package/dist/ui/components/Header/components/HeaderHamburger.d.ts +1 -1
- package/dist/ui/components/Header/components/HeaderLogo.d.ts +1 -1
- package/dist/ui/components/Header/components/HeaderMobileMenu.d.ts +1 -1
- package/dist/ui/components/Header/components/HeaderNavigation.d.ts +1 -1
- package/dist/ui/components/Header/contexts/HeaderContext.d.ts +1 -1
- package/dist/ui/components/Menu/Menu.d.ts +0 -1
- package/dist/ui/components/Modal/Modal.d.ts +1 -2
- package/dist/ui/components/Navigation/Navigation.d.ts +1 -1
- package/dist/ui/components/PageHeader/PageHeader.d.ts +1 -1
- package/dist/ui/components/Pagination/Pagination.d.ts +0 -1
- package/dist/ui/components/Popover/Popover.d.ts +0 -1
- package/dist/ui/components/Rating/Rating.d.ts +0 -1
- package/dist/ui/components/SearchInput/SearchInput.d.ts +0 -1
- package/dist/ui/components/Stepper/Stepper.d.ts +0 -1
- package/dist/ui/components/Table/TableActions/TableActions.d.ts +0 -1
- package/dist/ui/components/Table/TableFilters/TableFilters.d.ts +0 -1
- package/dist/ui/components/Table/TablePagination/TablePagination.d.ts +0 -1
- package/dist/ui/components/TimePicker/TimePicker.d.ts +0 -1
- package/dist/ui/components/Timeline/Timeline.d.ts +0 -1
- package/dist/ui/components/index.d.ts +2 -0
- package/dist/ui/primitives/Checkbox/Checkbox.d.ts +0 -1
- package/dist/ui/primitives/Chip/Chip.d.ts +21 -0
- package/dist/ui/primitives/ErrorMessage/ErrorMessage.d.ts +0 -1
- package/dist/ui/primitives/Input/Input.d.ts +0 -1
- package/dist/ui/primitives/Label/Label.d.ts +0 -1
- package/dist/ui/primitives/NavLink/NavLink.d.ts +1 -1
- package/dist/ui/primitives/Radio/Radio.d.ts +0 -1
- package/dist/ui/primitives/Select/Select.d.ts +0 -1
- package/dist/ui/primitives/Skeleton/Skeleton.d.ts +0 -1
- package/dist/ui/primitives/Slider/Slider.d.ts +0 -1
- package/dist/ui/primitives/Switch/Switch.d.ts +0 -1
- package/dist/ui/primitives/Tooltip/Tooltip.d.ts +0 -1
- package/dist/ui/primitives/index.d.ts +2 -0
- package/dist/ui/providers/DialogContext.d.ts +8 -0
- package/package.json +7 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HeaderHamburger.js","sources":["../../../../../../src/ui/components/Header/components/HeaderHamburger.tsx"],"sourcesContent":["/**\n * HeaderHamburger Component\n *\n * Hamburger button for toggling mobile menu.\n *\n * @see EPIC-002: Header Component
|
|
1
|
+
{"version":3,"file":"HeaderHamburger.js","sources":["../../../../../../src/ui/components/Header/components/HeaderHamburger.tsx"],"sourcesContent":["/**\n * HeaderHamburger Component\n *\n * Hamburger button for toggling mobile menu.\n *\n * @see EPIC-002: Header Component\n * @see TASK-027: Hamburger Button\n */\n\n\"use client\";\n\nimport React from \"react\";\nimport { Menu, X } from \"lucide-react\";\nimport { Button } from \"../../../primitives/Button/Button\";\nimport { useHeaderContext } from \"../contexts/HeaderContext\";\nimport { cn } from \"../../../utils\";\n\nexport interface HeaderHamburgerProps {\n /**\n * Additional CSS classes\n */\n className?: string;\n\n /**\n * Custom icon component\n */\n icon?: React.ReactNode;\n\n /**\n * Custom close icon component\n */\n closeIcon?: React.ReactNode;\n\n /**\n * Button variant\n * @default 'ghost'\n */\n variant?: \"ghost\" | \"outline\";\n\n /**\n * Button size\n * @default 'md'\n */\n size?: \"sm\" | \"md\" | \"lg\";\n}\n\n/**\n * HeaderHamburger Component\n *\n * Hamburger button that toggles the mobile menu.\n * Only visible on mobile devices.\n *\n * @example\n * ```tsx\n * <Header>\n * <Header.Hamburger />\n * <Header.Logo href=\"/\">MyApp</Header.Logo>\n * </Header>\n * ```\n */\nexport function HeaderHamburger({\n className,\n icon,\n closeIcon,\n variant = \"ghost\",\n size = \"md\",\n}: HeaderHamburgerProps) {\n const { isMobileMenuOpen, toggleMobileMenu } = useHeaderContext();\n\n const MenuIcon = icon || <Menu className=\"h-5 w-5\" />;\n const CloseIcon = closeIcon || <X className=\"h-5 w-5\" />;\n\n return (\n <Button\n variant={variant}\n size={size}\n onClick={toggleMobileMenu}\n className={cn(\"md:hidden\", className)}\n aria-label={isMobileMenuOpen ? \"Close menu\" : \"Open menu\"}\n aria-expanded={isMobileMenuOpen}\n >\n {isMobileMenuOpen ? CloseIcon : MenuIcon}\n </Button>\n );\n}\n"],"names":["HeaderHamburger","className","icon","closeIcon","variant","size","isMobileMenuOpen","toggleMobileMenu","useHeaderContext","MenuIcon","jsx","Menu","CloseIcon","X","Button","cn"],"mappings":";;;;;;AA4DO,SAASA,EAAgB;AAAA,EAC9B,WAAAC;AAAA,EACA,MAAAC;AAAA,EACA,WAAAC;AAAA,EACA,SAAAC,IAAU;AAAA,EACV,MAAAC,IAAO;AACT,GAAyB;AACvB,QAAM,EAAE,kBAAAC,GAAkB,kBAAAC,EAAA,IAAqBC,EAAA,GAEzCC,IAAWP,KAAQ,gBAAAQ,EAACC,GAAA,EAAK,WAAU,WAAU,GAC7CC,IAAYT,KAAa,gBAAAO,EAACG,GAAA,EAAE,WAAU,WAAU;AAEtD,SACE,gBAAAH;AAAA,IAACI;AAAA,IAAA;AAAA,MACC,SAAAV;AAAA,MACA,MAAAC;AAAA,MACA,SAASE;AAAA,MACT,WAAWQ,EAAG,aAAad,CAAS;AAAA,MACpC,cAAYK,IAAmB,eAAe;AAAA,MAC9C,iBAAeA;AAAA,MAEd,cAAmBM,IAAYH;AAAA,IAAA;AAAA,EAAA;AAGtC;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HeaderLogo.js","sources":["../../../../../../src/ui/components/Header/components/HeaderLogo.tsx"],"sourcesContent":["/**\n * HeaderLogo Component\n *\n * Logo slot component for Header.\n *\n * @see EPIC-002: Header Component
|
|
1
|
+
{"version":3,"file":"HeaderLogo.js","sources":["../../../../../../src/ui/components/Header/components/HeaderLogo.tsx"],"sourcesContent":["/**\n * HeaderLogo Component\n *\n * Logo slot component for Header.\n *\n * @see EPIC-002: Header Component\n * @see RFC-003: Header Composition Pattern (APPROVED)\n */\n\n\"use client\";\n\nimport { type ReactNode } from \"react\";\nimport { cn } from \"../../../utils\";\nimport type { NavLinkProps } from \"../../../primitives/NavLink\";\nimport { NavLink } from \"../../../primitives/NavLink\";\n\nexport interface HeaderLogoProps extends Omit<NavLinkProps, \"children\"> {\n /**\n * Logo content (text, image, or component)\n */\n children: ReactNode;\n\n /**\n * Additional CSS classes\n */\n className?: string;\n}\n\n/**\n * HeaderLogo Component\n *\n * Logo slot for Header. Renders as a NavLink by default.\n *\n * @example\n * ```tsx\n * <Header.Logo href=\"/\">MyApp</Header.Logo>\n * <Header.Logo href=\"/\">\n * <img src=\"/logo.png\" alt=\"Logo\" />\n * </Header.Logo>\n * ```\n */\nexport function HeaderLogo({\n children,\n className,\n href,\n ...props\n}: HeaderLogoProps) {\n return (\n <div className=\"flex-shrink-0\">\n <NavLink\n href={href || \"/\"}\n variant=\"default\"\n className={cn(\"flex items-center font-semibold text-lg\", className)}\n {...props}\n >\n {children}\n </NavLink>\n </div>\n );\n}\n"],"names":["HeaderLogo","_a","_b","children","className","href","props","__objRest","jsx","NavLink","__spreadProps","__spreadValues","cn"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAyCO,SAASA,EAAWC,GAKP;AALO,MAAAC,IAAAD,GACzB;AAAA,cAAAE;AAAA,IACA,WAAAC;AAAA,IACA,MAAAC;AAAA,MAHyBH,GAItBI,IAAAC,EAJsBL,GAItB;AAAA,IAHH;AAAA,IACA;AAAA,IACA;AAAA;AAGA,SACE,gBAAAM,EAAC,OAAA,EAAI,WAAU,iBACb,UAAA,gBAAAA;AAAA,IAACC;AAAA,IAAAC,EAAAC,EAAA;AAAA,MACC,MAAMN,KAAQ;AAAA,MACd,SAAQ;AAAA,MACR,WAAWO,EAAG,2CAA2CR,CAAS;AAAA,OAC9DE,IAJL;AAAA,MAME,UAAAH;AAAA,IAAA;AAAA,EAAA,GAEL;AAEJ;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HeaderMobileMenu.js","sources":["../../../../../../src/ui/components/Header/components/HeaderMobileMenu.tsx"],"sourcesContent":["/**\n * HeaderMobileMenu Component\n *\n * Mobile menu drawer for Header navigation.\n *\n * @see EPIC-002: Header Component
|
|
1
|
+
{"version":3,"file":"HeaderMobileMenu.js","sources":["../../../../../../src/ui/components/Header/components/HeaderMobileMenu.tsx"],"sourcesContent":["/**\n * HeaderMobileMenu Component\n *\n * Mobile menu drawer for Header navigation.\n *\n * @see EPIC-002: Header Component\n * @see TASK-028: Mobile Menu (Drawer)\n */\n\n\"use client\";\n\nimport React from \"react\";\nimport { Drawer, DrawerContent } from \"../../Drawer\";\nimport { useHeaderContext } from \"../contexts/HeaderContext\";\nimport { cn } from \"../../../utils\";\nimport { getSpacingClass } from \"../../../tokens/spacing\";\n\nexport interface HeaderMobileMenuProps {\n /**\n * Menu content (typically navigation links)\n */\n children: React.ReactNode;\n\n /**\n * Additional CSS classes\n */\n className?: string;\n}\n\n/**\n * HeaderMobileMenu Component\n *\n * Mobile menu drawer that slides in from the side.\n * Uses Drawer component from design system.\n *\n * @example\n * ```tsx\n * <Header>\n * <Header.MobileMenu>\n * <NavLink href=\"/home\">Home</NavLink>\n * <NavLink href=\"/about\">About</NavLink>\n * </Header.MobileMenu>\n * </Header>\n * ```\n */\nexport function HeaderMobileMenu({\n children,\n className,\n}: HeaderMobileMenuProps) {\n const { isMobileMenuOpen, closeMobileMenu } = useHeaderContext();\n\n return (\n <Drawer\n open={isMobileMenuOpen}\n onOpenChange={(open) => {\n if (!open) {\n closeMobileMenu();\n }\n }}\n position=\"left\"\n size=\"sm\"\n closeOnOverlayClick\n closeOnEscape\n >\n <DrawerContent className={cn(getSpacingClass(\"base\", \"p\"), className)}>\n <nav\n className={`flex flex-col ${getSpacingClass(\"sm\", \"gap\")}`}\n aria-label=\"Mobile navigation\"\n >\n {children}\n </nav>\n </DrawerContent>\n </Drawer>\n );\n}\n"],"names":["HeaderMobileMenu","children","className","isMobileMenuOpen","closeMobileMenu","useHeaderContext","jsx","Drawer","open","DrawerContent","cn","getSpacingClass"],"mappings":";;;;;;;AA6CO,SAASA,EAAiB;AAAA,EAC/B,UAAAC;AAAA,EACA,WAAAC;AACF,GAA0B;AACxB,QAAM,EAAE,kBAAAC,GAAkB,iBAAAC,EAAA,IAAoBC,EAAA;AAE9C,SACE,gBAAAC;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,MAAMJ;AAAA,MACN,cAAc,CAACK,MAAS;AACtB,QAAKA,KACHJ,EAAA;AAAA,MAEJ;AAAA,MACA,UAAS;AAAA,MACT,MAAK;AAAA,MACL,qBAAmB;AAAA,MACnB,eAAa;AAAA,MAEb,UAAA,gBAAAE,EAACG,KAAc,WAAWC,EAAGC,EAAgB,QAAQ,GAAG,GAAGT,CAAS,GAClE,UAAA,gBAAAI;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAW,iBAAiBK,EAAgB,MAAM,KAAK,CAAC;AAAA,UACxD,cAAW;AAAA,UAEV,UAAAV;AAAA,QAAA;AAAA,MAAA,EACH,CACF;AAAA,IAAA;AAAA,EAAA;AAGN;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HeaderNavigation.js","sources":["../../../../../../src/ui/components/Header/components/HeaderNavigation.tsx"],"sourcesContent":["/**\n * HeaderNavigation Component\n *\n * Navigation slot component for Header.\n *\n * @see EPIC-002: Header Component
|
|
1
|
+
{"version":3,"file":"HeaderNavigation.js","sources":["../../../../../../src/ui/components/Header/components/HeaderNavigation.tsx"],"sourcesContent":["/**\n * HeaderNavigation Component\n *\n * Navigation slot component for Header.\n *\n * @see EPIC-002: Header Component\n * @see RFC-003: Header Composition Pattern (APPROVED)\n */\n\n\"use client\";\n\nimport { type ReactNode } from \"react\";\nimport { cn } from \"../../../utils\";\nimport { getSpacingClass } from \"../../../tokens/spacing\";\n\nexport interface HeaderNavigationProps {\n /**\n * Navigation content (typically NavLink components)\n */\n children: ReactNode;\n\n /**\n * Additional CSS classes\n */\n className?: string;\n}\n\n/**\n * HeaderNavigation Component\n *\n * Navigation slot for Header. Typically contains NavLink components.\n *\n * @example\n * ```tsx\n * <Header.Navigation>\n * <NavLink href=\"/home\">Home</NavLink>\n * <NavLink href=\"/about\">About</NavLink>\n * </Header.Navigation>\n * ```\n */\nexport function HeaderNavigation({\n children,\n className,\n}: HeaderNavigationProps) {\n return (\n <nav\n className={cn(\n \"flex-1 flex items-center justify-center\",\n getSpacingClass(\"base\", \"gap\"),\n \"hidden md:flex\", // Hidden on mobile, visible on desktop\n className,\n )}\n aria-label=\"Main navigation\"\n >\n {children}\n </nav>\n );\n}\n"],"names":["HeaderNavigation","children","className","jsx","cn","getSpacingClass"],"mappings":";;;;AAwCO,SAASA,EAAiB;AAAA,EAC/B,UAAAC;AAAA,EACA,WAAAC;AACF,GAA0B;AACxB,SACE,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWC;AAAA,QACT;AAAA,QACAC,EAAgB,QAAQ,KAAK;AAAA,QAC7B;AAAA;AAAA,QACAH;AAAA,MAAA;AAAA,MAEF,cAAW;AAAA,MAEV,UAAAD;AAAA,IAAA;AAAA,EAAA;AAGP;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HeaderContext.js","sources":["../../../../../../src/ui/components/Header/contexts/HeaderContext.tsx"],"sourcesContent":["/**\n * Header Context\n *\n * Context for managing Header component state, particularly mobile menu state.\n *\n * @see ADR-002: Header + SideNavbar Compatibility (ACCEPTED)\n * @see EPIC-002: Header Component
|
|
1
|
+
{"version":3,"file":"HeaderContext.js","sources":["../../../../../../src/ui/components/Header/contexts/HeaderContext.tsx"],"sourcesContent":["/**\n * Header Context\n *\n * Context for managing Header component state, particularly mobile menu state.\n *\n * @see ADR-002: Header + SideNavbar Compatibility (ACCEPTED)\n * @see EPIC-002: Header Component\n * @see TASK-014: Implementar HeaderContext Completo\n */\n\n\"use client\";\n\n/* eslint-disable react-refresh/only-export-components */\nimport {\n createContext,\n useContext,\n useState,\n useCallback,\n type ReactNode,\n} from \"react\";\n\n/**\n * Header Context Value\n */\nexport interface HeaderContextValue {\n /**\n * Whether the mobile menu is open\n */\n isMobileMenuOpen: boolean;\n\n /**\n * Toggle mobile menu state\n */\n toggleMobileMenu: () => void;\n\n /**\n * Set mobile menu state explicitly\n */\n setMobileMenuOpen: (open: boolean) => void;\n\n /**\n * Open mobile menu\n */\n openMobileMenu: () => void;\n\n /**\n * Close mobile menu\n */\n closeMobileMenu: () => void;\n}\n\n/**\n * Header Context\n *\n * Independent context for Header component state.\n * Does not interfere with SideNavbar contexts (ADR-002).\n */\nconst HeaderContext = createContext<HeaderContextValue | undefined>(undefined);\n\n/**\n * Header Provider Props\n */\nexport interface HeaderProviderProps {\n /**\n * Children components\n */\n children: ReactNode;\n\n /**\n * Controlled mode: mobile menu open state\n */\n mobileMenuOpen?: boolean;\n\n /**\n * Callback when mobile menu state changes\n */\n onMobileMenuChange?: (open: boolean) => void;\n\n /**\n * Default mobile menu open state (uncontrolled mode)\n * @default false\n */\n defaultMobileMenuOpen?: boolean;\n}\n\n/**\n * HeaderProvider\n *\n * Provides Header context for mobile menu state management.\n * Independent from SideNavbarContexts (ADR-002).\n *\n * Supports both controlled and uncontrolled modes.\n *\n * @example\n * ```tsx\n * // Uncontrolled mode\n * <HeaderProvider>\n * <Header>...</Header>\n * </HeaderProvider>\n *\n * // Controlled mode\n * <HeaderProvider\n * mobileMenuOpen={isOpen}\n * onMobileMenuChange={setIsOpen}\n * >\n * <Header>...</Header>\n * </HeaderProvider>\n * ```\n */\nexport function HeaderProvider({\n children,\n mobileMenuOpen: controlledMobileMenuOpen,\n onMobileMenuChange,\n defaultMobileMenuOpen = false,\n}: HeaderProviderProps) {\n const [internalMobileMenuOpen, setInternalMobileMenuOpen] = useState(\n defaultMobileMenuOpen,\n );\n\n const isControlled = controlledMobileMenuOpen !== undefined;\n const isMobileMenuOpen = isControlled\n ? controlledMobileMenuOpen\n : internalMobileMenuOpen;\n\n const setMobileMenuOpen = useCallback(\n (open: boolean) => {\n if (!isControlled) {\n setInternalMobileMenuOpen(open);\n }\n onMobileMenuChange?.(open);\n },\n [isControlled, onMobileMenuChange],\n );\n\n const toggleMobileMenu = useCallback(() => {\n setMobileMenuOpen(!isMobileMenuOpen);\n }, [isMobileMenuOpen, setMobileMenuOpen]);\n\n const openMobileMenu = useCallback(() => {\n setMobileMenuOpen(true);\n }, [setMobileMenuOpen]);\n\n const closeMobileMenu = useCallback(() => {\n setMobileMenuOpen(false);\n }, [setMobileMenuOpen]);\n\n return (\n <HeaderContext.Provider\n value={{\n isMobileMenuOpen,\n toggleMobileMenu,\n setMobileMenuOpen,\n openMobileMenu,\n closeMobileMenu,\n }}\n >\n {children}\n </HeaderContext.Provider>\n );\n}\n\n/**\n * useHeaderContext Hook\n *\n * Hook to access Header context.\n * Must be used within HeaderProvider.\n *\n * @throws Error if used outside HeaderProvider\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { isMobileMenuOpen, toggleMobileMenu } = useHeaderContext();\n * return <button onClick={toggleMobileMenu}>Toggle</button>;\n * }\n * ```\n */\nexport function useHeaderContext(): HeaderContextValue {\n const context = useContext(HeaderContext);\n if (!context) {\n throw new Error(\"useHeaderContext must be used within HeaderProvider\");\n }\n return context;\n}\n"],"names":["HeaderContext","createContext","HeaderProvider","children","controlledMobileMenuOpen","onMobileMenuChange","defaultMobileMenuOpen","internalMobileMenuOpen","setInternalMobileMenuOpen","useState","isControlled","isMobileMenuOpen","setMobileMenuOpen","useCallback","open","toggleMobileMenu","openMobileMenu","closeMobileMenu","jsx","useHeaderContext","context","useContext"],"mappings":";;;AAyDA,MAAMA,IAAgBC,EAA8C,MAAS;AAoDtE,SAASC,EAAe;AAAA,EAC7B,UAAAC;AAAA,EACA,gBAAgBC;AAAA,EAChB,oBAAAC;AAAA,EACA,uBAAAC,IAAwB;AAC1B,GAAwB;AACtB,QAAM,CAACC,GAAwBC,CAAyB,IAAIC;AAAA,IAC1DH;AAAA,EAAA,GAGII,IAAeN,MAA6B,QAC5CO,IAAmBD,IACrBN,IACAG,GAEEK,IAAoBC;AAAA,IACxB,CAACC,MAAkB;AACjB,MAAKJ,KACHF,EAA0BM,CAAI,GAEhCT,KAAA,QAAAA,EAAqBS;AAAA,IACvB;AAAA,IACA,CAACJ,GAAcL,CAAkB;AAAA,EAAA,GAG7BU,IAAmBF,EAAY,MAAM;AACzC,IAAAD,EAAkB,CAACD,CAAgB;AAAA,EACrC,GAAG,CAACA,GAAkBC,CAAiB,CAAC,GAElCI,IAAiBH,EAAY,MAAM;AACvC,IAAAD,EAAkB,EAAI;AAAA,EACxB,GAAG,CAACA,CAAiB,CAAC,GAEhBK,IAAkBJ,EAAY,MAAM;AACxC,IAAAD,EAAkB,EAAK;AAAA,EACzB,GAAG,CAACA,CAAiB,CAAC;AAEtB,SACE,gBAAAM;AAAA,IAAClB,EAAc;AAAA,IAAd;AAAA,MACC,OAAO;AAAA,QACL,kBAAAW;AAAA,QACA,kBAAAI;AAAA,QACA,mBAAAH;AAAA,QACA,gBAAAI;AAAA,QACA,iBAAAC;AAAA,MAAA;AAAA,MAGD,UAAAd;AAAA,IAAA;AAAA,EAAA;AAGP;AAkBO,SAASgB,IAAuC;AACrD,QAAMC,IAAUC,EAAWrB,CAAa;AACxC,MAAI,CAACoB;AACH,UAAM,IAAI,MAAM,qDAAqD;AAEvE,SAAOA;AACT;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Menu.js","sources":["../../../../../src/ui/components/Menu/Menu.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState, type ReactNode } from \"react\";\nimport { MenuProvider } from \"./MenuContext\";\nimport MenuTrigger from \"./MenuTrigger\";\nimport MenuContent from \"./MenuContent\";\nimport MenuItem from \"./MenuItem\";\nimport MenuSeparator from \"./MenuSeparator\";\n\nexport type MenuPlacement = \"top\" | \"bottom\" | \"left\" | \"right\";\n\nexport interface MenuProps {\n children: ReactNode;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n placement?: MenuPlacement;\n}\n\n/**\n * Menu Component\n *\n * A dropdown menu component with keyboard navigation and portal rendering.\n *
|
|
1
|
+
{"version":3,"file":"Menu.js","sources":["../../../../../src/ui/components/Menu/Menu.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState, type ReactNode } from \"react\";\nimport { MenuProvider } from \"./MenuContext\";\nimport MenuTrigger from \"./MenuTrigger\";\nimport MenuContent from \"./MenuContent\";\nimport MenuItem from \"./MenuItem\";\nimport MenuSeparator from \"./MenuSeparator\";\n\nexport type MenuPlacement = \"top\" | \"bottom\" | \"left\" | \"right\";\n\nexport interface MenuProps {\n children: ReactNode;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n placement?: MenuPlacement;\n}\n\n/**\n * Menu Component\n *\n * A dropdown menu component with keyboard navigation and portal rendering.\n * Uses Compound Component pattern.\n *\n * @example\n * ```tsx\n * <Menu>\n * <MenuTrigger>\n * <Button>Open Menu</Button>\n * </MenuTrigger>\n * <MenuContent>\n * <MenuItem onClick={handleClick}>Item 1</MenuItem>\n * <MenuItem onClick={handleClick}>Item 2</MenuItem>\n * <MenuSeparator />\n * <MenuItem onClick={handleClick}>Item 3</MenuItem>\n * </MenuContent>\n * </Menu>\n * ```\n */\nexport default function Menu({\n children,\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n placement = \"bottom\",\n}: MenuProps) {\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n\n const isControlled = controlledOpen !== undefined;\n const isOpen = isControlled ? controlledOpen : internalOpen;\n\n const setIsOpen = (newOpen: boolean) => {\n if (!isControlled) {\n setInternalOpen(newOpen);\n }\n onOpenChange?.(newOpen);\n };\n\n const closeMenu = () => {\n setIsOpen(false);\n };\n\n return (\n <MenuProvider\n value={{\n isOpen,\n setIsOpen,\n closeMenu,\n placement,\n }}\n >\n {children}\n </MenuProvider>\n );\n}\n\n// Export sub-components for compound pattern\nMenu.Trigger = MenuTrigger;\nMenu.Content = MenuContent;\nMenu.Item = MenuItem;\nMenu.Separator = MenuSeparator;\n\n// Also export as named exports for easier imports\nexport { MenuTrigger, MenuContent, MenuItem, MenuSeparator };\n"],"names":["Menu","children","controlledOpen","defaultOpen","onOpenChange","placement","internalOpen","setInternalOpen","useState","isControlled","isOpen","setIsOpen","newOpen","jsx","MenuProvider","MenuTrigger","MenuContent","MenuItem","MenuSeparator"],"mappings":";;;;;;;;AAwCA,SAAwBA,EAAK;AAAA,EAC3B,UAAAC;AAAA,EACA,MAAMC;AAAA,EACN,aAAAC,IAAc;AAAA,EACd,cAAAC;AAAA,EACA,WAAAC,IAAY;AACd,GAAc;AACZ,QAAM,CAACC,GAAcC,CAAe,IAAIC,EAASL,CAAW,GAEtDM,IAAeP,MAAmB,QAClCQ,IAASD,IAAeP,IAAiBI,GAEzCK,IAAY,CAACC,MAAqB;AACtC,IAAKH,KACHF,EAAgBK,CAAO,GAEzBR,KAAA,QAAAA,EAAeQ;AAAA,EACjB;AAMA,SACE,gBAAAC;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,OAAO;AAAA,QACL,QAAAJ;AAAA,QACA,WAAAC;AAAA,QACA,WATY,MAAM;AACtB,UAAAA,EAAU,EAAK;AAAA,QACjB;AAAA,QAQM,WAAAN;AAAA,MAAA;AAAA,MAGD,UAAAJ;AAAA,IAAA;AAAA,EAAA;AAGP;AAGAD,EAAK,UAAUe;AACff,EAAK,UAAUgB;AACfhB,EAAK,OAAOiB;AACZjB,EAAK,YAAYkB;"}
|
|
@@ -1,47 +1,49 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
var
|
|
3
|
-
var
|
|
4
|
-
var
|
|
5
|
-
var
|
|
6
|
-
var
|
|
7
|
-
for (var
|
|
8
|
-
|
|
9
|
-
if (
|
|
10
|
-
for (var
|
|
11
|
-
|
|
2
|
+
var M = Object.defineProperty, X = Object.defineProperties;
|
|
3
|
+
var Z = Object.getOwnPropertyDescriptors;
|
|
4
|
+
var n = Object.getOwnPropertySymbols;
|
|
5
|
+
var h = Object.prototype.hasOwnProperty, p = Object.prototype.propertyIsEnumerable;
|
|
6
|
+
var g = (e, t, a) => t in e ? M(e, t, { enumerable: !0, configurable: !0, writable: !0, value: a }) : e[t] = a, w = (e, t) => {
|
|
7
|
+
for (var a in t || (t = {}))
|
|
8
|
+
h.call(t, a) && g(e, a, t[a]);
|
|
9
|
+
if (n)
|
|
10
|
+
for (var a of n(t))
|
|
11
|
+
p.call(t, a) && g(e, a, t[a]);
|
|
12
12
|
return e;
|
|
13
|
-
},
|
|
14
|
-
var
|
|
15
|
-
var
|
|
13
|
+
}, N = (e, t) => X(e, Z(t));
|
|
14
|
+
var C = (e, t) => {
|
|
15
|
+
var a = {};
|
|
16
16
|
for (var o in e)
|
|
17
|
-
|
|
18
|
-
if (e != null &&
|
|
19
|
-
for (var o of
|
|
20
|
-
|
|
21
|
-
return
|
|
17
|
+
h.call(e, o) && t.indexOf(o) < 0 && (a[o] = e[o]);
|
|
18
|
+
if (e != null && n)
|
|
19
|
+
for (var o of n(e))
|
|
20
|
+
t.indexOf(o) < 0 && p.call(e, o) && (a[o] = e[o]);
|
|
21
|
+
return a;
|
|
22
22
|
};
|
|
23
|
-
import { jsxs as
|
|
24
|
-
import { useRef as
|
|
25
|
-
import { createPortal as
|
|
26
|
-
import { X as
|
|
27
|
-
import { getRadiusClass as
|
|
28
|
-
import { getShadowClass as
|
|
29
|
-
import { getSpacingClass as
|
|
30
|
-
import { getZIndexClass as
|
|
31
|
-
import { useFocusRestore as
|
|
32
|
-
import { useFocusTrap as
|
|
33
|
-
import { useAutoFocus as
|
|
34
|
-
function
|
|
35
|
-
var
|
|
23
|
+
import { jsxs as m, jsx as l } from "react/jsx-runtime";
|
|
24
|
+
import { useRef as j, useId as q, useEffect as k } from "react";
|
|
25
|
+
import { createPortal as D } from "react-dom";
|
|
26
|
+
import { X as E } from "lucide-react";
|
|
27
|
+
import { getRadiusClass as G } from "../../tokens/radius.js";
|
|
28
|
+
import { getShadowClass as H } from "../../tokens/shadows.js";
|
|
29
|
+
import { getSpacingClass as s } from "../../tokens/spacing.js";
|
|
30
|
+
import { getZIndexClass as J } from "../../tokens/z-index.js";
|
|
31
|
+
import { useFocusRestore as K } from "../../hooks/useFocusRestore.js";
|
|
32
|
+
import { useFocusTrap as Q } from "../../hooks/useFocusTrap.js";
|
|
33
|
+
import { useAutoFocus as U } from "../../hooks/useAutoFocus.js";
|
|
34
|
+
function se(V) {
|
|
35
|
+
var u = V, {
|
|
36
36
|
isOpen: e,
|
|
37
|
-
onClose:
|
|
38
|
-
title:
|
|
37
|
+
onClose: t,
|
|
38
|
+
title: a,
|
|
39
39
|
children: o,
|
|
40
|
-
variant:
|
|
41
|
-
showCloseButton:
|
|
42
|
-
footer:
|
|
43
|
-
className:
|
|
44
|
-
|
|
40
|
+
variant: R = "default",
|
|
41
|
+
showCloseButton: c = !0,
|
|
42
|
+
footer: f,
|
|
43
|
+
className: $ = "",
|
|
44
|
+
"aria-label": I,
|
|
45
|
+
"aria-labelledby": i
|
|
46
|
+
} = u, F = C(u, [
|
|
45
47
|
"isOpen",
|
|
46
48
|
"onClose",
|
|
47
49
|
"title",
|
|
@@ -49,110 +51,120 @@ function ee(B) {
|
|
|
49
51
|
"variant",
|
|
50
52
|
"showCloseButton",
|
|
51
53
|
"footer",
|
|
52
|
-
"className"
|
|
54
|
+
"className",
|
|
55
|
+
"aria-label",
|
|
56
|
+
"aria-labelledby"
|
|
53
57
|
]);
|
|
54
|
-
const
|
|
55
|
-
if (
|
|
58
|
+
const d = j(null), b = j(null), x = q(), y = i != null ? i : a ? x : void 0;
|
|
59
|
+
if (K(e), Q(d, e), U(d, e), k(() => {
|
|
56
60
|
if (!e) return;
|
|
57
|
-
const
|
|
58
|
-
|
|
61
|
+
const r = (A) => {
|
|
62
|
+
A.key === "Escape" && t();
|
|
59
63
|
};
|
|
60
|
-
return document.addEventListener("keydown",
|
|
61
|
-
document.removeEventListener("keydown",
|
|
64
|
+
return document.addEventListener("keydown", r), () => {
|
|
65
|
+
document.removeEventListener("keydown", r);
|
|
62
66
|
};
|
|
63
|
-
}, [e,
|
|
67
|
+
}, [e, t]), k(() => (e ? document.body.style.overflow = "hidden" : document.body.style.overflow = "", () => {
|
|
64
68
|
document.body.style.overflow = "";
|
|
65
69
|
}), [e]), !e) return null;
|
|
66
|
-
const
|
|
70
|
+
const S = [
|
|
67
71
|
"fixed",
|
|
68
72
|
"inset-0",
|
|
69
|
-
|
|
73
|
+
J("modal"),
|
|
70
74
|
"overflow-y-auto"
|
|
71
|
-
],
|
|
75
|
+
], P = ["fixed", "inset-0", "bg-scrim", "transition-opacity"], T = {
|
|
72
76
|
default: "max-w-md",
|
|
73
77
|
large: "max-w-2xl",
|
|
74
78
|
fullscreen: "max-w-full h-full"
|
|
75
|
-
},
|
|
79
|
+
}, z = [
|
|
76
80
|
"relative",
|
|
77
81
|
"bg-surface-overlay",
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
82
|
+
G("lg"),
|
|
83
|
+
H("xl"),
|
|
84
|
+
s("xl", "my"),
|
|
81
85
|
"mx-auto",
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
].filter(Boolean).join(" "),
|
|
86
|
+
T[R],
|
|
87
|
+
s("lg", "p"),
|
|
88
|
+
$
|
|
89
|
+
].filter(Boolean).join(" "), v = /* @__PURE__ */ m(
|
|
86
90
|
"div",
|
|
87
91
|
{
|
|
88
|
-
className:
|
|
92
|
+
className: S.join(" "),
|
|
89
93
|
role: "dialog",
|
|
90
94
|
"aria-modal": "true",
|
|
91
|
-
"aria-labelledby":
|
|
92
|
-
|
|
93
|
-
|
|
95
|
+
"aria-labelledby": y,
|
|
96
|
+
"aria-label": y ? void 0 : I,
|
|
97
|
+
onClick: (r) => {
|
|
98
|
+
(r.target === r.currentTarget || r.target === b.current) && t();
|
|
94
99
|
},
|
|
95
100
|
children: [
|
|
96
|
-
/* @__PURE__ */ l("div", { className: E.join(" "), "aria-hidden": "true" }),
|
|
97
101
|
/* @__PURE__ */ l(
|
|
98
102
|
"div",
|
|
99
103
|
{
|
|
100
|
-
|
|
101
|
-
|
|
104
|
+
ref: b,
|
|
105
|
+
className: P.join(" "),
|
|
106
|
+
"aria-hidden": "true"
|
|
107
|
+
}
|
|
108
|
+
),
|
|
109
|
+
/* @__PURE__ */ l(
|
|
110
|
+
"div",
|
|
111
|
+
{
|
|
112
|
+
className: `flex min-h-full items-center justify-center ${s("base", "p")}`,
|
|
113
|
+
children: /* @__PURE__ */ m(
|
|
102
114
|
"div",
|
|
103
|
-
|
|
104
|
-
ref:
|
|
115
|
+
N(w({
|
|
116
|
+
ref: d,
|
|
105
117
|
tabIndex: -1,
|
|
106
|
-
className:
|
|
107
|
-
onClick: (
|
|
108
|
-
},
|
|
118
|
+
className: z,
|
|
119
|
+
onClick: (r) => r.stopPropagation()
|
|
120
|
+
}, F), {
|
|
109
121
|
children: [
|
|
110
|
-
|
|
122
|
+
a && /* @__PURE__ */ m(
|
|
111
123
|
"div",
|
|
112
124
|
{
|
|
113
|
-
className: `flex justify-between items-center ${
|
|
125
|
+
className: `flex justify-between items-center ${s("base", "mb")}`,
|
|
114
126
|
children: [
|
|
115
127
|
/* @__PURE__ */ l(
|
|
116
128
|
"h2",
|
|
117
129
|
{
|
|
118
|
-
id:
|
|
130
|
+
id: x,
|
|
119
131
|
className: "text-xl font-semibold text-fg-primary",
|
|
120
|
-
children:
|
|
132
|
+
children: a
|
|
121
133
|
}
|
|
122
134
|
),
|
|
123
|
-
|
|
135
|
+
c && /* @__PURE__ */ l(
|
|
124
136
|
"button",
|
|
125
137
|
{
|
|
126
|
-
onClick:
|
|
138
|
+
onClick: t,
|
|
127
139
|
className: "text-fg-tertiary hover:text-fg-secondary focus:outline-none",
|
|
128
140
|
"aria-label": "Close modal",
|
|
129
|
-
children: /* @__PURE__ */ l(
|
|
141
|
+
children: /* @__PURE__ */ l(E, { className: "h-6 w-6" })
|
|
130
142
|
}
|
|
131
143
|
)
|
|
132
144
|
]
|
|
133
145
|
}
|
|
134
146
|
),
|
|
135
|
-
!
|
|
147
|
+
!a && c && /* @__PURE__ */ l(
|
|
136
148
|
"div",
|
|
137
149
|
{
|
|
138
|
-
className: `flex justify-end ${
|
|
150
|
+
className: `flex justify-end ${s("base", "mb")}`,
|
|
139
151
|
children: /* @__PURE__ */ l(
|
|
140
152
|
"button",
|
|
141
153
|
{
|
|
142
|
-
onClick:
|
|
154
|
+
onClick: t,
|
|
143
155
|
className: "text-fg-tertiary hover:text-fg-secondary focus:outline-none",
|
|
144
156
|
"aria-label": "Close modal",
|
|
145
|
-
children: /* @__PURE__ */ l(
|
|
157
|
+
children: /* @__PURE__ */ l(E, { className: "h-6 w-6" })
|
|
146
158
|
}
|
|
147
159
|
)
|
|
148
160
|
}
|
|
149
161
|
),
|
|
150
|
-
/* @__PURE__ */ l("div", { className:
|
|
151
|
-
|
|
162
|
+
/* @__PURE__ */ l("div", { className: s("base", "mb"), children: o }),
|
|
163
|
+
f && /* @__PURE__ */ l(
|
|
152
164
|
"div",
|
|
153
165
|
{
|
|
154
|
-
className: `flex justify-end ${
|
|
155
|
-
children:
|
|
166
|
+
className: `flex justify-end ${s("sm", "gap")} ${s("base", "mt")}`,
|
|
167
|
+
children: f
|
|
156
168
|
}
|
|
157
169
|
)
|
|
158
170
|
]
|
|
@@ -163,9 +175,9 @@ function ee(B) {
|
|
|
163
175
|
]
|
|
164
176
|
}
|
|
165
177
|
);
|
|
166
|
-
return typeof window != "undefined" ?
|
|
178
|
+
return typeof window != "undefined" ? D(v, document.body) : v;
|
|
167
179
|
}
|
|
168
180
|
export {
|
|
169
|
-
|
|
181
|
+
se as default
|
|
170
182
|
};
|
|
171
183
|
//# sourceMappingURL=Modal.js.map
|
|
@@ -1 +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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"}
|
|
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, useId, 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 *\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 \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n ...props\n}: Props) {\n const modalRef = useRef<HTMLDivElement>(null);\n const overlayRef = useRef<HTMLDivElement>(null);\n const titleId = useId();\n // Accessible-name precedence: explicit aria-labelledby > the title\n // heading > consumer aria-label. Mirrors DrawerContent so a titleless\n // Modal can still be named from the outside (axe aria-dialog-name).\n const resolvedLabelledBy = ariaLabelledBy ?? (title ? titleId : undefined);\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={resolvedLabelledBy}\n aria-label={resolvedLabelledBy ? undefined : ariaLabel}\n onClick={(e) => {\n // The panel calls stopPropagation, so any click reaching this\n // handler is on the backdrop. The visible dim layer is the\n // overlay div (painted above the centering div), so a real\n // pointer hits overlayRef — not currentTarget. Accept both.\n if (e.target === e.currentTarget || e.target === overlayRef.current) {\n onClose();\n }\n }}\n >\n <div\n ref={overlayRef}\n className={overlayClasses.join(\" \")}\n aria-hidden=\"true\"\n />\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={titleId}\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","ariaLabel","ariaLabelledBy","props","__objRest","modalRef","useRef","overlayRef","titleId","useId","resolvedLabelledBy","useFocusRestore","useFocusTrap","useAutoFocus","useEffect","handleEscape","e","baseClasses","getZIndexClass","overlayClasses","modalSizeClasses","modalClasses","getRadiusClass","getShadowClass","getSpacingClass","modalContent","jsxs","jsx","__spreadProps","__spreadValues","X","createPortal"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA,SAAwBA,GAAMC,GAYpB;AAZoB,MAAAC,IAAAD,GAC5B;AAAA,YAAAE;AAAA,IACA,SAAAC;AAAA,IACA,OAAAC;AAAA,IACA,UAAAC;AAAA,IACA,SAAAC,IAAU;AAAA,IACV,iBAAAC,IAAkB;AAAA,IAClB,QAAAC;AAAA,IACA,WAAAC,IAAY;AAAA,IACZ,cAAcC;AAAA,IACd,mBAAmBC;AAAA,MAVSV,GAWzBW,IAAAC,EAXyBZ,GAWzB;AAAA,IAVH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAGA,QAAMa,IAAWC,EAAuB,IAAI,GACtCC,IAAaD,EAAuB,IAAI,GACxCE,IAAUC,EAAA,GAIVC,IAAqBR,KAAA,OAAAA,IAAmBP,IAAQa,IAAU;AA+ChE,MAlCAG,EAAgBlB,CAAM,GACtBmB,EAAaP,GAAUZ,CAAM,GAC7BoB,EAAaR,GAAUZ,CAAM,GAK7BqB,EAAU,MAAM;AACd,QAAI,CAACrB,EAAQ;AAEb,UAAMsB,IAAe,CAACC,MAAqB;AACzC,MAAIA,EAAE,QAAQ,YACZtB,EAAA;AAAA,IAEJ;AAEA,oBAAS,iBAAiB,WAAWqB,CAAY,GAC1C,MAAM;AACX,eAAS,oBAAoB,WAAWA,CAAY;AAAA,IACtD;AAAA,EACF,GAAG,CAACtB,GAAQC,CAAO,CAAC,GAGpBoB,EAAU,OACJrB,IACF,SAAS,KAAK,MAAM,WAAW,WAE/B,SAAS,KAAK,MAAM,WAAW,IAE1B,MAAM;AACX,aAAS,KAAK,MAAM,WAAW;AAAA,EACjC,IACC,CAACA,CAAM,CAAC,GAEP,CAACA,EAAQ,QAAO;AAEpB,QAAMwB,IAAc;AAAA,IAClB;AAAA,IACA;AAAA,IACAC,EAAe,OAAO;AAAA,IACtB;AAAA,EAAA,GAGIC,IAAiB,CAAC,SAAS,WAAW,YAAY,oBAAoB,GAEtEC,IAAkE;AAAA,IACtE,SAAS;AAAA,IACT,OAAO;AAAA,IACP,YAAY;AAAA,EAAA,GAGRC,IAAe;AAAA,IACnB;AAAA,IACA;AAAA,IACAC,EAAe,IAAI;AAAA,IACnBC,EAAe,IAAI;AAAA,IACnBC,EAAgB,MAAM,IAAI;AAAA,IAC1B;AAAA,IACAJ,EAAiBvB,CAAO;AAAA,IACxB2B,EAAgB,MAAM,GAAG;AAAA,IACzBxB;AAAA,EAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG,GAELyB,IACJ,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWT,EAAY,KAAK,GAAG;AAAA,MAC/B,MAAK;AAAA,MACL,cAAW;AAAA,MACX,mBAAiBP;AAAA,MACjB,cAAYA,IAAqB,SAAYT;AAAA,MAC7C,SAAS,CAACe,MAAM;AAKd,SAAIA,EAAE,WAAWA,EAAE,iBAAiBA,EAAE,WAAWT,EAAW,YAC1Db,EAAA;AAAA,MAEJ;AAAA,MAEA,UAAA;AAAA,QAAA,gBAAAiC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,KAAKpB;AAAA,YACL,WAAWY,EAAe,KAAK,GAAG;AAAA,YAClC,eAAY;AAAA,UAAA;AAAA,QAAA;AAAA,QAEd,gBAAAQ;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAW,+CAA+CH,EAAgB,QAAQ,GAAG,CAAC;AAAA,YAEtF,UAAA,gBAAAE;AAAA,cAAC;AAAA,cAAAE,EAAAC,EAAA;AAAA,gBACC,KAAKxB;AAAA,gBACL,UAAU;AAAA,gBACV,WAAWgB;AAAA,gBACX,SAAS,CAACL,MAAMA,EAAE,gBAAA;AAAA,iBACdb,IALL;AAAA,gBAOE,UAAA;AAAA,kBAAAR,KACC,gBAAA+B;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,WAAW,qCAAqCF,EAAgB,QAAQ,IAAI,CAAC;AAAA,sBAE7E,UAAA;AAAA,wBAAA,gBAAAG;AAAA,0BAAC;AAAA,0BAAA;AAAA,4BACC,IAAInB;AAAA,4BACJ,WAAU;AAAA,4BAET,UAAAb;AAAA,0BAAA;AAAA,wBAAA;AAAA,wBAEFG,KACC,gBAAA6B;AAAA,0BAAC;AAAA,0BAAA;AAAA,4BACC,SAASjC;AAAA,4BACT,WAAU;AAAA,4BACV,cAAW;AAAA,4BAEX,UAAA,gBAAAiC,EAACG,GAAA,EAAE,WAAU,UAAA,CAAU;AAAA,0BAAA;AAAA,wBAAA;AAAA,sBACzB;AAAA,oBAAA;AAAA,kBAAA;AAAA,kBAIL,CAACnC,KAASG,KACT,gBAAA6B;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,WAAW,oBAAoBH,EAAgB,QAAQ,IAAI,CAAC;AAAA,sBAE5D,UAAA,gBAAAG;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,SAASjC;AAAA,0BACT,WAAU;AAAA,0BACV,cAAW;AAAA,0BAEX,UAAA,gBAAAiC,EAACG,GAAA,EAAE,WAAU,UAAA,CAAU;AAAA,wBAAA;AAAA,sBAAA;AAAA,oBACzB;AAAA,kBAAA;AAAA,oCAGH,OAAA,EAAI,WAAWN,EAAgB,QAAQ,IAAI,GAAI,UAAA5B,GAAS;AAAA,kBACxDG,KACC,gBAAA4B;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,WAAW,oBAAoBH,EAAgB,MAAM,KAAK,CAAC,IAAIA,EAAgB,QAAQ,IAAI,CAAC;AAAA,sBAE3F,UAAAzB;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBACH;AAAA,cAAA;AAAA,YAAA;AAAA,UAEJ;AAAA,QAAA;AAAA,MACF;AAAA,IAAA;AAAA,EAAA;AAKJ,SAAI,OAAO,UAAW,cACbgC,EAAaN,GAAc,SAAS,IAAI,IAG1CA;AACT;"}
|