@kushagradhawan/kookie-ui 0.1.32 → 0.1.34

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.
Files changed (120) hide show
  1. package/components.css +937 -458
  2. package/dist/cjs/components/_internal/base-button.d.ts.map +1 -1
  3. package/dist/cjs/components/_internal/base-button.js +1 -1
  4. package/dist/cjs/components/_internal/base-button.js.map +3 -3
  5. package/dist/cjs/components/chatbar.d.ts +202 -0
  6. package/dist/cjs/components/chatbar.d.ts.map +1 -0
  7. package/dist/cjs/components/chatbar.js +2 -0
  8. package/dist/cjs/components/chatbar.js.map +7 -0
  9. package/dist/cjs/components/icon-button.d.ts.map +1 -1
  10. package/dist/cjs/components/icon-button.js +2 -2
  11. package/dist/cjs/components/icon-button.js.map +3 -3
  12. package/dist/cjs/components/icons.d.ts +6 -1
  13. package/dist/cjs/components/icons.d.ts.map +1 -1
  14. package/dist/cjs/components/icons.js +1 -1
  15. package/dist/cjs/components/icons.js.map +3 -3
  16. package/dist/cjs/components/index.d.ts +3 -0
  17. package/dist/cjs/components/index.d.ts.map +1 -1
  18. package/dist/cjs/components/index.js +1 -1
  19. package/dist/cjs/components/index.js.map +3 -3
  20. package/dist/cjs/components/popover.d.ts +13 -1
  21. package/dist/cjs/components/popover.d.ts.map +1 -1
  22. package/dist/cjs/components/popover.js +1 -1
  23. package/dist/cjs/components/popover.js.map +3 -3
  24. package/dist/cjs/components/sheet.d.ts +82 -0
  25. package/dist/cjs/components/sheet.d.ts.map +1 -0
  26. package/dist/cjs/components/sheet.js +2 -0
  27. package/dist/cjs/components/sheet.js.map +7 -0
  28. package/dist/cjs/components/shell.d.ts +180 -0
  29. package/dist/cjs/components/shell.d.ts.map +1 -0
  30. package/dist/cjs/components/shell.js +2 -0
  31. package/dist/cjs/components/shell.js.map +7 -0
  32. package/dist/cjs/components/sidebar.d.ts +4 -33
  33. package/dist/cjs/components/sidebar.d.ts.map +1 -1
  34. package/dist/cjs/components/sidebar.js +1 -1
  35. package/dist/cjs/components/sidebar.js.map +3 -3
  36. package/dist/cjs/components/skeleton.d.ts.map +1 -1
  37. package/dist/cjs/components/skeleton.js +1 -1
  38. package/dist/cjs/components/skeleton.js.map +2 -2
  39. package/dist/cjs/helpers/inert.d.ts +1 -1
  40. package/dist/cjs/helpers/inert.d.ts.map +1 -1
  41. package/dist/cjs/helpers/inert.js +1 -1
  42. package/dist/cjs/helpers/inert.js.map +2 -2
  43. package/dist/esm/components/_internal/base-button.d.ts.map +1 -1
  44. package/dist/esm/components/_internal/base-button.js +1 -1
  45. package/dist/esm/components/_internal/base-button.js.map +3 -3
  46. package/dist/esm/components/chatbar.d.ts +202 -0
  47. package/dist/esm/components/chatbar.d.ts.map +1 -0
  48. package/dist/esm/components/chatbar.js +2 -0
  49. package/dist/esm/components/chatbar.js.map +7 -0
  50. package/dist/esm/components/icon-button.d.ts.map +1 -1
  51. package/dist/esm/components/icon-button.js +2 -2
  52. package/dist/esm/components/icon-button.js.map +3 -3
  53. package/dist/esm/components/icons.d.ts +6 -1
  54. package/dist/esm/components/icons.d.ts.map +1 -1
  55. package/dist/esm/components/icons.js +1 -1
  56. package/dist/esm/components/icons.js.map +3 -3
  57. package/dist/esm/components/index.d.ts +3 -0
  58. package/dist/esm/components/index.d.ts.map +1 -1
  59. package/dist/esm/components/index.js +1 -1
  60. package/dist/esm/components/index.js.map +3 -3
  61. package/dist/esm/components/popover.d.ts +13 -1
  62. package/dist/esm/components/popover.d.ts.map +1 -1
  63. package/dist/esm/components/popover.js +1 -1
  64. package/dist/esm/components/popover.js.map +3 -3
  65. package/dist/esm/components/sheet.d.ts +82 -0
  66. package/dist/esm/components/sheet.d.ts.map +1 -0
  67. package/dist/esm/components/sheet.js +2 -0
  68. package/dist/esm/components/sheet.js.map +7 -0
  69. package/dist/esm/components/shell.d.ts +180 -0
  70. package/dist/esm/components/shell.d.ts.map +1 -0
  71. package/dist/esm/components/shell.js +2 -0
  72. package/dist/esm/components/shell.js.map +7 -0
  73. package/dist/esm/components/sidebar.d.ts +4 -33
  74. package/dist/esm/components/sidebar.d.ts.map +1 -1
  75. package/dist/esm/components/sidebar.js +1 -1
  76. package/dist/esm/components/sidebar.js.map +3 -3
  77. package/dist/esm/components/skeleton.d.ts.map +1 -1
  78. package/dist/esm/components/skeleton.js.map +2 -2
  79. package/dist/esm/helpers/inert.d.ts +1 -1
  80. package/dist/esm/helpers/inert.d.ts.map +1 -1
  81. package/dist/esm/helpers/inert.js +1 -1
  82. package/dist/esm/helpers/inert.js.map +2 -2
  83. package/package.json +2 -1
  84. package/src/components/_internal/base-button.tsx +8 -0
  85. package/src/components/_internal/base-card.css +18 -18
  86. package/src/components/_internal/base-dialog.css +11 -49
  87. package/src/components/_internal/base-menu.css +2 -2
  88. package/src/components/_internal/base-sidebar-menu.css +3 -3
  89. package/src/components/accordion.css +6 -6
  90. package/src/components/animations.css +65 -81
  91. package/src/components/callout.css +3 -3
  92. package/src/components/chatbar.css +214 -0
  93. package/src/components/chatbar.tsx +1181 -0
  94. package/src/components/icon-button.tsx +11 -0
  95. package/src/components/icons.tsx +97 -2
  96. package/src/components/image.css +3 -3
  97. package/src/components/index.css +3 -0
  98. package/src/components/index.tsx +3 -0
  99. package/src/components/popover.css +53 -8
  100. package/src/components/popover.tsx +180 -2
  101. package/src/components/scroll-area.css +3 -3
  102. package/src/components/segmented-control.css +3 -3
  103. package/src/components/sheet.css +90 -0
  104. package/src/components/sheet.tsx +247 -0
  105. package/src/components/shell.css +137 -0
  106. package/src/components/shell.tsx +1032 -0
  107. package/src/components/sidebar.css +55 -268
  108. package/src/components/sidebar.tsx +40 -262
  109. package/src/components/skeleton.tsx +1 -2
  110. package/src/components/text-area.css +6 -5
  111. package/src/components/tooltip.css +2 -2
  112. package/src/helpers/inert.ts +3 -3
  113. package/src/styles/tokens/constants.css +6 -3
  114. package/src/styles/tokens/index.css +1 -0
  115. package/src/styles/tokens/radius.css +7 -2
  116. package/src/styles/tokens/space.css +6 -0
  117. package/src/styles/tokens/transition.css +91 -46
  118. package/styles.css +998 -496
  119. package/tokens/base.css +57 -35
  120. package/tokens.css +61 -38
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/components/sidebar.tsx"],
4
- "sourcesContent": ["'use client';\n\nimport * as React from 'react';\nimport classNames from 'classnames';\nimport { Slot } from './slot.js';\nimport { Accordion } from 'radix-ui';\n\nimport { sidebarPropDefs } from './sidebar.props.js';\nimport { Theme, useThemeContext } from './theme.js';\nimport { IconButton } from './icon-button.js';\nimport { ScrollArea } from './scroll-area.js';\nimport { Separator } from './separator.js';\nimport { ChevronDownIcon, ThickChevronRightIcon } from './icons.js';\nimport { extractProps } from '../helpers/extract-props.js';\nimport { Kbd } from './kbd.js';\nimport { Badge } from './badge.js';\n\nimport type { ComponentPropsWithout, RemovedProps } from '../helpers/component-props.js';\nimport type { GetPropDefTypes } from '../props/prop-def.js';\nimport type { BadgeProps } from './badge.js';\n\n// Badge configuration type for sidebar menu buttons\ntype BadgeConfig = {\n content: React.ReactNode;\n variant?: BadgeProps['variant'];\n size?: BadgeProps['size'];\n color?: BadgeProps['color'];\n highContrast?: BadgeProps['highContrast'];\n radius?: BadgeProps['radius'];\n};\n\n// Sidebar context for state management\ntype SidebarContextProps = {\n state: 'expanded' | 'collapsed';\n open: boolean;\n setOpen: (open: boolean) => void;\n openMobile: boolean;\n setOpenMobile: (open: boolean) => void;\n isMobile: boolean;\n toggleSidebar: () => void;\n side: 'left' | 'right';\n type: 'sidebar' | 'floating';\n variant: 'soft' | 'outline' | 'surface' | 'ghost';\n menuVariant: 'solid' | 'soft';\n collapsible: 'offcanvas' | 'icon' | 'none';\n size: '1' | '2';\n};\n\nconst SidebarContext = React.createContext<SidebarContextProps | null>(null);\n\nfunction useSidebar() {\n const context = React.useContext(SidebarContext);\n if (!context) {\n throw new Error('useSidebar must be used within a SidebarProvider.');\n }\n return context;\n}\n\n// Hook to detect mobile (simplified version)\nfunction useIsMobile() {\n const [isMobile, setIsMobile] = React.useState(false);\n\n React.useEffect(() => {\n const checkIsMobile = () => {\n setIsMobile(window.innerWidth < 768);\n };\n\n checkIsMobile();\n window.addEventListener('resize', checkIsMobile);\n return () => window.removeEventListener('resize', checkIsMobile);\n }, []);\n\n return isMobile;\n}\n\n// Provider component\ninterface SidebarProviderProps extends React.ComponentPropsWithoutRef<'div'> {\n defaultOpen?: boolean;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n side?: 'left' | 'right';\n}\n\nconst SidebarProvider = React.forwardRef<HTMLDivElement, SidebarProviderProps>(\n (\n {\n defaultOpen = true,\n open: openProp,\n onOpenChange: setOpenProp,\n side = 'left',\n className,\n children,\n ...props\n },\n forwardedRef,\n ) => {\n const isMobile = useIsMobile();\n const [openMobile, setOpenMobile] = React.useState(false);\n\n // Internal state for uncontrolled mode\n const [internalOpen, setInternalOpen] = React.useState(defaultOpen);\n\n // Use controlled state if provided, otherwise internal state\n const open = openProp ?? internalOpen;\n\n const setOpen = React.useCallback(\n (value: boolean | ((value: boolean) => boolean)) => {\n const openState = typeof value === 'function' ? value(open) : value;\n if (setOpenProp) {\n setOpenProp(openState);\n } else {\n setInternalOpen(openState);\n }\n },\n [setOpenProp, open],\n );\n\n // Helper to toggle the sidebar\n const toggleSidebar = React.useCallback(() => {\n return isMobile ? setOpenMobile((open) => !open) : setOpen((open) => !open);\n }, [isMobile, setOpen, setOpenMobile]);\n\n // State for data attributes\n const state = open ? 'expanded' : 'collapsed';\n\n const contextValue = React.useMemo<Partial<SidebarContextProps>>(\n () => ({\n state,\n open,\n setOpen,\n isMobile,\n openMobile,\n setOpenMobile,\n toggleSidebar,\n side,\n }),\n [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar, side],\n );\n\n return (\n <div\n {...props}\n ref={forwardedRef}\n className={classNames('rt-SidebarProvider', className)}\n data-state={state}\n data-side={side}\n >\n <SidebarContext.Provider value={contextValue as SidebarContextProps}>\n {children}\n </SidebarContext.Provider>\n </div>\n );\n },\n);\nSidebarProvider.displayName = 'Sidebar.Provider';\n\n// Main Sidebar component\ntype SidebarOwnProps = GetPropDefTypes<typeof sidebarPropDefs>;\ninterface SidebarProps extends ComponentPropsWithout<'div', RemovedProps>, SidebarOwnProps {}\n\nconst Sidebar = React.forwardRef<HTMLDivElement, SidebarProps>((props, forwardedRef) => {\n const themeContext = useThemeContext();\n const { isMobile, state, openMobile } = useSidebar();\n\n const {\n size = sidebarPropDefs.size.default,\n variant = sidebarPropDefs.variant.default,\n menuVariant = sidebarPropDefs.menuVariant.default,\n type = sidebarPropDefs.type.default,\n side = sidebarPropDefs.side.default,\n collapsible = sidebarPropDefs.collapsible.default,\n panelBackground,\n color,\n highContrast = sidebarPropDefs.highContrast.default,\n\n } = props;\n\n const { className, children, ...rootProps } = extractProps(props, sidebarPropDefs);\n const { asChild: _, panelBackground: __, ...safeRootProps } = rootProps; // Remove asChild and panelBackground from DOM props\n const resolvedColor = color || themeContext.accentColor;\n\n // Update context with current props - we'll pass the resolved values\n const resolvedSize = typeof size === 'object' ? size.initial || '2' : size;\n const context = React.useContext(SidebarContext);\n if (context) {\n context.side = side;\n context.type = type;\n context.variant = variant;\n context.menuVariant = menuVariant;\n context.collapsible = collapsible;\n context.size = resolvedSize;\n }\n\n if (collapsible === 'none') {\n return (\n <div\n {...safeRootProps}\n ref={forwardedRef}\n data-accent-color={resolvedColor}\n data-state={state}\n data-side={side}\n data-type={type}\n data-collapsible={collapsible}\n className={classNames('rt-SidebarRoot', `rt-r-size-${size}`, className)}\n >\n <Theme>\n <div\n className={classNames('rt-SidebarContainer', `rt-variant-${variant}`)}\n data-accent-color={resolvedColor}\n data-high-contrast={highContrast || undefined}\n data-side={side}\n data-panel-background={panelBackground}\n >\n {children}\n </div>\n </Theme>\n </div>\n );\n }\n\n if (isMobile) {\n return (\n <div\n {...safeRootProps}\n ref={forwardedRef}\n data-accent-color={resolvedColor}\n data-state={openMobile ? 'open' : 'closed'}\n data-side={side}\n data-type={type}\n data-collapsible={collapsible}\n className={classNames('rt-SidebarRoot', 'rt-SidebarRoot--mobile', className)}\n >\n <Theme>\n <div\n className={classNames(\n 'rt-SidebarContainer',\n `rt-variant-${variant}`,\n `rt-r-size-${size}`,\n )}\n data-accent-color={resolvedColor}\n data-high-contrast={highContrast || undefined}\n data-side={side}\n data-type={type}\n data-collapsible={collapsible}\n data-panel-background={panelBackground}\n >\n {children}\n </div>\n </Theme>\n </div>\n );\n }\n\n return (\n <div\n {...safeRootProps}\n ref={forwardedRef}\n data-accent-color={resolvedColor}\n data-state={state}\n data-side={side}\n data-type={type}\n data-collapsible={collapsible}\n className={classNames('rt-SidebarRoot', className)}\n >\n <Theme>\n <div\n className={classNames(\n 'rt-SidebarContainer',\n `rt-variant-${variant}`,\n `rt-r-size-${size}`,\n )}\n data-accent-color={resolvedColor}\n data-high-contrast={highContrast || undefined}\n data-side={side}\n data-type={type}\n data-collapsible={collapsible}\n data-panel-background={panelBackground}\n >\n {children}\n </div>\n </Theme>\n </div>\n );\n});\nSidebar.displayName = 'Sidebar.Root';\n\n// Sidebar content area\ninterface SidebarContentProps extends React.ComponentPropsWithoutRef<'div'> {\n /**\n * Accessible label for the navigation region.\n * @default \"Main navigation\"\n */\n 'aria-label'?: string;\n}\n\nconst SidebarContent = React.forwardRef<HTMLDivElement, SidebarContentProps>(\n (\n { className, children, 'aria-label': ariaLabel = 'Main navigation', ...props },\n forwardedRef,\n ) => {\n const context = React.useContext(SidebarContext);\n const {\n size = '2',\n menuVariant = 'soft',\n type = 'sidebar',\n collapsible = 'none',\n } = context || {};\n\n return (\n <ScrollArea type=\"hover\">\n <div\n {...props}\n ref={forwardedRef}\n id=\"sidebar-navigation\"\n role=\"navigation\"\n aria-label={ariaLabel}\n className={classNames(\n 'rt-BaseMenuContent',\n 'rt-SidebarContent',\n `rt-r-size-${size}`,\n `rt-menu-variant-${menuVariant}`,\n className,\n )}\n data-type={type}\n data-collapsible={collapsible}\n >\n {children}\n </div>\n </ScrollArea>\n );\n },\n);\nSidebarContent.displayName = 'Sidebar.Content';\n\n// Sidebar header\ninterface SidebarHeaderProps extends React.ComponentPropsWithoutRef<'div'> {\n /**\n * Whether to use the default flex container layout.\n * @default true\n */\n asContainer?: boolean;\n}\n\nconst SidebarHeader = React.forwardRef<HTMLDivElement, SidebarHeaderProps>(\n ({ className, asContainer = true, ...props }, forwardedRef) => {\n const context = React.useContext(SidebarContext);\n const { size = '2', menuVariant = 'soft' } = context || {};\n\n return (\n <div\n {...props}\n ref={forwardedRef}\n className={classNames(\n 'rt-SidebarHeader',\n `rt-r-size-${size}`,\n `rt-menu-variant-${menuVariant}`,\n {\n 'rt-SidebarHeader--container': asContainer,\n },\n className,\n )}\n />\n );\n },\n);\nSidebarHeader.displayName = 'Sidebar.Header';\n\n// Sidebar footer\ninterface SidebarFooterProps extends React.ComponentPropsWithoutRef<'div'> {\n /**\n * Whether to use the default flex container layout.\n * @default true\n */\n asContainer?: boolean;\n}\n\nconst SidebarFooter = React.forwardRef<HTMLDivElement, SidebarFooterProps>(\n ({ className, asContainer = true, ...props }, forwardedRef) => {\n const context = React.useContext(SidebarContext);\n const { size = '2', menuVariant = 'soft' } = context || {};\n\n return (\n <div\n {...props}\n ref={forwardedRef}\n className={classNames(\n 'rt-SidebarFooter',\n `rt-r-size-${size}`,\n `rt-menu-variant-${menuVariant}`,\n {\n 'rt-SidebarFooter--container': asContainer,\n },\n className,\n )}\n />\n );\n },\n);\nSidebarFooter.displayName = 'Sidebar.Footer';\n\n// Sidebar trigger button\ninterface SidebarTriggerProps extends ComponentPropsWithout<typeof IconButton, RemovedProps> {}\n\nconst SidebarTrigger = React.forwardRef<React.ElementRef<typeof IconButton>, SidebarTriggerProps>(\n ({ onClick, children, ...props }, forwardedRef) => {\n const { toggleSidebar, state } = useSidebar();\n\n return (\n <IconButton\n {...props}\n ref={forwardedRef}\n variant=\"ghost\"\n aria-label={state === 'expanded' ? 'Collapse sidebar' : 'Expand sidebar'}\n aria-expanded={state === 'expanded'}\n aria-controls=\"sidebar-navigation\"\n onClick={(event) => {\n onClick?.(event);\n toggleSidebar();\n }}\n >\n {children || <ChevronDownIcon />}\n </IconButton>\n );\n },\n);\nSidebarTrigger.displayName = 'Sidebar.Trigger';\n\n// Removed SidebarInset - not needed\n\n// Sidebar separator\ninterface SidebarSeparatorProps extends ComponentPropsWithout<typeof Separator, RemovedProps> {}\n\nconst SidebarSeparator = React.forwardRef<\n React.ComponentRef<typeof Separator>,\n SidebarSeparatorProps\n>(({ className, ...props }, forwardedRef) => (\n <Separator\n {...props}\n ref={forwardedRef}\n className={classNames('rt-SidebarSeparator', className)}\n />\n));\nSidebarSeparator.displayName = 'Sidebar.Separator';\n\n// Menu components - reusing dropdown menu structure\ninterface SidebarMenuProps extends React.ComponentPropsWithoutRef<'ul'> {}\n\nconst SidebarMenu = React.forwardRef<HTMLUListElement, SidebarMenuProps>(\n ({ className, ...props }, forwardedRef) => (\n <ul\n {...props}\n ref={forwardedRef}\n role=\"menu\"\n className={classNames('rt-BaseMenuViewport', 'rt-SidebarMenu', className)}\n />\n ),\n);\nSidebarMenu.displayName = 'Sidebar.Menu';\n\ninterface SidebarMenuItemProps extends React.ComponentPropsWithoutRef<'li'> {}\n\nconst SidebarMenuItem = React.forwardRef<HTMLLIElement, SidebarMenuItemProps>(\n ({ className, ...props }, forwardedRef) => (\n <li {...props} ref={forwardedRef} className={classNames('rt-SidebarMenuItem', className)} />\n ),\n);\nSidebarMenuItem.displayName = 'Sidebar.MenuItem';\n\ninterface SidebarMenuButtonProps extends React.ComponentPropsWithoutRef<'button'> {\n asChild?: boolean;\n isActive?: boolean;\n shortcut?: React.ReactNode;\n badge?: string | BadgeConfig;\n}\n\nconst SidebarMenuButton = React.forwardRef<HTMLButtonElement, SidebarMenuButtonProps>(\n (\n {\n asChild = false,\n isActive = false,\n shortcut,\n badge,\n className,\n children,\n onMouseEnter,\n onMouseLeave,\n onKeyDown,\n ...props\n },\n forwardedRef,\n ) => {\n const [isHighlighted, setIsHighlighted] = React.useState(false);\n const context = React.useContext(SidebarContext);\n const { size: sidebarSize = '2' } = context || {};\n\n const Comp = asChild ? Slot : 'button';\n\n const { onClick } = props;\n const handleKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLButtonElement>) => {\n switch (event.key) {\n case 'Enter':\n case ' ':\n event.preventDefault();\n if (onClick) onClick(event as any);\n break;\n case 'ArrowDown': {\n event.preventDefault();\n // Focus next menu item\n const nextItem = (event.currentTarget as HTMLElement).nextElementSibling?.querySelector(\n '[role=\"menuitem\"]',\n ) as HTMLElement;\n if (nextItem) nextItem.focus();\n break;\n }\n case 'ArrowUp': {\n event.preventDefault();\n // Focus previous menu item\n const prevItem = (\n event.currentTarget as HTMLElement\n ).previousElementSibling?.querySelector('[role=\"menuitem\"]') as HTMLElement;\n if (prevItem) prevItem.focus();\n break;\n }\n }\n onKeyDown?.(event);\n },\n [onClick, onKeyDown],\n );\n\n return (\n <Comp\n {...props}\n ref={forwardedRef}\n role=\"menuitem\"\n aria-current={isActive ? 'page' : undefined}\n className={classNames('rt-reset', 'rt-BaseMenuItem', 'rt-SidebarMenuButton', className)}\n data-active={isActive || undefined}\n data-highlighted={isHighlighted || undefined}\n onKeyDown={handleKeyDown}\n onMouseEnter={(event) => {\n setIsHighlighted(true);\n onMouseEnter?.(event);\n }}\n onMouseLeave={(event) => {\n setIsHighlighted(false);\n onMouseLeave?.(event);\n }}\n >\n {asChild ? (\n children\n ) : (\n <>\n {children}\n {/* Badge with soft variant default and size mapping to sidebar size */}\n {badge && (\n <div className=\"rt-SidebarMenuBadge\">\n {typeof badge === 'string' ? (\n <Badge size={sidebarSize} variant=\"soft\">\n {badge}\n </Badge>\n ) : (\n <Badge\n size={badge.size || sidebarSize}\n variant={badge.variant || 'soft'}\n color={badge.color}\n highContrast={badge.highContrast}\n radius={badge.radius}\n >\n {badge.content}\n </Badge>\n )}\n </div>\n )}\n {shortcut && (\n <div className=\"rt-BaseMenuShortcut rt-SidebarMenuShortcut\">\n <Kbd size={sidebarSize}>{shortcut}</Kbd>\n </div>\n )}\n </>\n )}\n </Comp>\n );\n },\n);\nSidebarMenuButton.displayName = 'Sidebar.MenuButton';\n\n// Sub-menu components using Radix Accordion\ninterface SidebarMenuSubProps extends React.ComponentPropsWithoutRef<'div'> {\n defaultOpen?: boolean;\n}\n\nconst SidebarMenuSub = React.forwardRef<HTMLDivElement, SidebarMenuSubProps>(\n ({ defaultOpen = false, children, ...props }, forwardedRef) => {\n return (\n <div {...props} ref={forwardedRef}>\n <Accordion.Root type=\"single\" collapsible defaultValue={defaultOpen ? 'item' : undefined}>\n <Accordion.Item value=\"item\">{children}</Accordion.Item>\n </Accordion.Root>\n </div>\n );\n },\n);\nSidebarMenuSub.displayName = 'Sidebar.MenuSub';\n\ninterface SidebarMenuSubTriggerProps\n extends React.ComponentPropsWithoutRef<typeof Accordion.Trigger> {\n asChild?: boolean;\n}\n\nconst SidebarMenuSubTrigger = React.forwardRef<\n React.ElementRef<typeof Accordion.Trigger>,\n SidebarMenuSubTriggerProps\n>(\n (\n { asChild = false, className, children, onMouseEnter, onMouseLeave, ...props },\n forwardedRef,\n ) => {\n const [isHighlighted, setIsHighlighted] = React.useState(false);\n\n return (\n <Accordion.Header asChild>\n <div>\n <Accordion.Trigger\n {...props}\n ref={forwardedRef}\n asChild={asChild}\n role=\"menuitem\"\n aria-haspopup=\"true\"\n className={classNames(\n 'rt-reset',\n 'rt-BaseMenuItem',\n 'rt-SidebarMenuButton',\n 'rt-SidebarMenuSubTrigger',\n className,\n )}\n data-highlighted={isHighlighted || undefined}\n onMouseEnter={(event) => {\n setIsHighlighted(true);\n onMouseEnter?.(event);\n }}\n onMouseLeave={(event) => {\n setIsHighlighted(false);\n onMouseLeave?.(event);\n }}\n >\n {asChild ? (\n children\n ) : (\n <>\n {children}\n <ThickChevronRightIcon\n className={classNames(\n 'rt-BaseMenuSubTriggerIcon',\n 'rt-SidebarMenuSubTriggerIcon',\n )}\n />\n </>\n )}\n </Accordion.Trigger>\n </div>\n </Accordion.Header>\n );\n },\n);\nSidebarMenuSubTrigger.displayName = 'Sidebar.MenuSubTrigger';\n\ninterface SidebarMenuSubContentProps\n extends React.ComponentPropsWithoutRef<typeof Accordion.Content> {}\n\nconst SidebarMenuSubContent = React.forwardRef<\n React.ElementRef<typeof Accordion.Content>,\n SidebarMenuSubContentProps\n>(({ className, children, ...props }, forwardedRef) => {\n return (\n <Accordion.Content\n {...props}\n ref={forwardedRef}\n className={classNames('rt-SidebarMenuSubContent', className)}\n >\n <div className=\"rt-SidebarMenuSubList\">{children}</div>\n </Accordion.Content>\n );\n});\nSidebarMenuSubContent.displayName = 'Sidebar.MenuSubContent';\n\n// Group components\ninterface SidebarGroupProps extends React.ComponentPropsWithoutRef<'div'> {}\n\nconst SidebarGroup = React.forwardRef<HTMLDivElement, SidebarGroupProps>(\n ({ className, ...props }, forwardedRef) => (\n <div\n {...props}\n ref={forwardedRef}\n className={classNames('rt-BaseMenuGroup', 'rt-SidebarGroup', className)}\n />\n ),\n);\nSidebarGroup.displayName = 'Sidebar.Group';\n\ninterface SidebarGroupLabelProps extends React.ComponentPropsWithoutRef<'div'> {\n asChild?: boolean;\n}\n\nconst SidebarGroupLabel = React.forwardRef<HTMLDivElement, SidebarGroupLabelProps>(\n ({ asChild = false, className, ...props }, forwardedRef) => {\n const Comp = asChild ? Slot : 'div';\n\n return (\n <Comp\n {...props}\n ref={forwardedRef}\n role=\"group\"\n className={classNames('rt-BaseMenuLabel', 'rt-SidebarGroupLabel', className)}\n />\n );\n },\n);\nSidebarGroupLabel.displayName = 'Sidebar.GroupLabel';\n\ninterface SidebarGroupContentProps extends React.ComponentPropsWithoutRef<'div'> {}\n\nconst SidebarGroupContent = React.forwardRef<HTMLDivElement, SidebarGroupContentProps>(\n ({ className, ...props }, forwardedRef) => (\n <div\n {...props}\n ref={forwardedRef}\n className={classNames('rt-SidebarGroupContent', className)}\n />\n ),\n);\nSidebarGroupContent.displayName = 'Sidebar.GroupContent';\n\n// Export all components following shadcn's pattern\nexport {\n SidebarProvider as Provider,\n Sidebar as Root,\n SidebarContent as Content,\n SidebarHeader as Header,\n SidebarFooter as Footer,\n SidebarTrigger as Trigger,\n SidebarSeparator as Separator,\n SidebarMenu as Menu,\n SidebarMenuItem as MenuItem,\n SidebarMenuButton as MenuButton,\n SidebarMenuSub as MenuSub,\n SidebarMenuSubTrigger as MenuSubTrigger,\n SidebarMenuSubContent as MenuSubContent,\n SidebarGroup as Group,\n SidebarGroupLabel as GroupLabel,\n SidebarGroupContent as GroupContent,\n // Export hook\n useSidebar,\n};\n\n/**\n * Enhanced Sidebar Header and Footer Usage Examples:\n *\n * 1. Simple default container (backwards compatible):\n * <Sidebar.Header>\n * <Logo />\n * <span>App Name</span>\n * </Sidebar.Header>\n *\n * 2. Custom flex layout:\n * <Sidebar.Header className=\"rt-justify-between rt-gap-3\">\n * <Logo />\n * <Sidebar.MenuButton>\n * <SettingsIcon />\n * </Sidebar.MenuButton>\n * </Sidebar.Header>\n *\n * 3. Column layout for multiple rows:\n * <Sidebar.Header className=\"rt-flex-col rt-gap-2\" asContainer={false}>\n * <div className=\"rt-flex rt-items-center rt-gap-2\">\n * <Logo />\n * <span>App Name</span>\n * </div>\n * <Sidebar.MenuButton>\n * <UserAvatar />\n * <span>John Doe</span>\n * </Sidebar.MenuButton>\n * </Sidebar.Header>\n *\n * 4. Interactive footer with menu button:\n * <Sidebar.Footer>\n * <Sidebar.MenuButton>\n * <UserIcon />\n * <span>Settings</span>\n * <ChevronUpIcon />\n * </Sidebar.MenuButton>\n * </Sidebar.Footer>\n *\n * 5. Custom footer layout:\n * <Sidebar.Footer className=\"rt-justify-between\">\n * <span>v1.0.0</span>\n * <Sidebar.MenuButton>\n * <HelpIcon />\n * </Sidebar.MenuButton>\n * </Sidebar.Footer>\n *\n * Available utility classes:\n * - Layout: rt-flex-row, rt-flex-col\n * - Alignment: rt-items-center, rt-items-start, rt-items-end\n * - Justification: rt-justify-between, rt-justify-center, rt-justify-start, rt-justify-end\n * - Gap: rt-gap-1, rt-gap-2, rt-gap-3, rt-gap-4\n */\n\nexport type {\n SidebarProviderProps as ProviderProps,\n SidebarProps as RootProps,\n SidebarContentProps as ContentProps,\n SidebarHeaderProps as HeaderProps,\n SidebarFooterProps as FooterProps,\n SidebarTriggerProps as TriggerProps,\n BadgeConfig,\n};\n"],
5
- "mappings": "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",
6
- "names": ["sidebar_exports", "__export", "SidebarContent", "SidebarFooter", "SidebarGroup", "SidebarGroupContent", "SidebarGroupLabel", "SidebarHeader", "SidebarMenu", "SidebarMenuButton", "SidebarMenuItem", "SidebarMenuSub", "SidebarMenuSubContent", "SidebarMenuSubTrigger", "SidebarProvider", "Sidebar", "SidebarSeparator", "SidebarTrigger", "useSidebar", "__toCommonJS", "React", "import_classnames", "import_slot", "import_radix_ui", "import_sidebar_props", "import_theme", "import_icon_button", "import_scroll_area", "import_separator", "import_icons", "import_extract_props", "import_kbd", "import_badge", "SidebarContext", "context", "useIsMobile", "isMobile", "setIsMobile", "checkIsMobile", "defaultOpen", "openProp", "setOpenProp", "side", "className", "children", "props", "forwardedRef", "openMobile", "setOpenMobile", "internalOpen", "setInternalOpen", "open", "setOpen", "value", "openState", "toggleSidebar", "state", "contextValue", "classNames", "themeContext", "size", "variant", "menuVariant", "type", "collapsible", "panelBackground", "color", "highContrast", "rootProps", "_", "__", "safeRootProps", "resolvedColor", "resolvedSize", "ariaLabel", "asContainer", "onClick", "event", "asChild", "isActive", "shortcut", "badge", "onMouseEnter", "onMouseLeave", "onKeyDown", "isHighlighted", "setIsHighlighted", "sidebarSize", "Comp", "handleKeyDown", "nextItem", "prevItem"]
4
+ "sourcesContent": ["'use client';\n\nimport * as React from 'react';\nimport classNames from 'classnames';\nimport { Slot } from './slot.js';\nimport { Accordion } from 'radix-ui';\n\nimport { sidebarPropDefs } from './sidebar.props.js';\nimport { useThemeContext } from './theme.js';\n// import { IconButton } from './icon-button.js';\nimport { ScrollArea } from './scroll-area.js';\nimport { Separator } from './separator.js';\nimport { ThickChevronRightIcon } from './icons.js';\nimport { extractProps } from '../helpers/extract-props.js';\nimport { Kbd } from './kbd.js';\nimport { Badge } from './badge.js';\n\nimport type { ComponentPropsWithout, RemovedProps } from '../helpers/component-props.js';\nimport type { GetPropDefTypes } from '../props/prop-def.js';\nimport type { BadgeProps } from './badge.js';\n\n// Badge configuration type for sidebar menu buttons\ntype BadgeConfig = {\n content: React.ReactNode;\n variant?: BadgeProps['variant'];\n size?: BadgeProps['size'];\n color?: BadgeProps['color'];\n highContrast?: BadgeProps['highContrast'];\n radius?: BadgeProps['radius'];\n};\n\n// Internal presentational context (not exported) for size/menu variant\ntype SidebarVisualContextValue = {\n size: '1' | '2';\n menuVariant: 'solid' | 'soft';\n};\nconst SidebarVisualContext = React.createContext<SidebarVisualContextValue | null>(null);\nfunction useSidebarVisual() {\n return React.useContext(SidebarVisualContext);\n}\n\n// Main Sidebar component\ntype SidebarOwnProps = GetPropDefTypes<typeof sidebarPropDefs>;\ninterface SidebarProps extends ComponentPropsWithout<'div', RemovedProps>, SidebarOwnProps {}\n\nconst Sidebar = React.forwardRef<HTMLDivElement, SidebarProps>((props, forwardedRef) => {\n const themeContext = useThemeContext();\n\n const {\n size = sidebarPropDefs.size.default,\n variant = sidebarPropDefs.variant.default,\n menuVariant = sidebarPropDefs.menuVariant.default,\n // type = sidebarPropDefs.type.default,\n // side = sidebarPropDefs.side.default,\n // collapsible = sidebarPropDefs.collapsible.default,\n panelBackground,\n color,\n highContrast = sidebarPropDefs.highContrast.default,\n } = props;\n\n const { className, children, ...rootProps } = extractProps(props, sidebarPropDefs);\n const { asChild: _, panelBackground: __, ...safeRootProps } = rootProps; // Remove asChild and panelBackground from DOM props\n const resolvedColor = color || themeContext.accentColor;\n\n // Update context with current props - we'll pass the resolved values\n const resolvedSize = typeof size === 'object' ? size.initial || '2' : size;\n return (\n <div\n {...safeRootProps}\n ref={forwardedRef}\n data-accent-color={resolvedColor}\n className={classNames('rt-SidebarRoot', className)}\n >\n <SidebarVisualContext.Provider value={{ size: resolvedSize, menuVariant }}>\n <div\n className={classNames(\n 'rt-SidebarContainer',\n `rt-variant-${variant}`,\n `rt-r-size-${resolvedSize}`,\n `rt-menu-variant-${menuVariant}`,\n )}\n data-accent-color={resolvedColor}\n data-high-contrast={highContrast || undefined}\n data-panel-background={panelBackground}\n >\n {children}\n </div>\n </SidebarVisualContext.Provider>\n </div>\n );\n});\nSidebar.displayName = 'Sidebar.Root';\n\n// Sidebar content area\ninterface SidebarContentProps extends React.ComponentPropsWithoutRef<'div'> {\n id?: string;\n role?: 'navigation' | 'none';\n 'aria-label'?: string;\n}\n\nconst SidebarContent = React.forwardRef<HTMLDivElement, SidebarContentProps>(\n (\n {\n className,\n children,\n role = 'navigation',\n 'aria-label': ariaLabel = 'Main navigation',\n id,\n ...props\n },\n forwardedRef,\n ) => {\n const visual = useSidebarVisual();\n const size = visual?.size ?? '2';\n const menuVariant = visual?.menuVariant ?? 'soft';\n\n return (\n <ScrollArea type=\"hover\">\n <div\n {...props}\n ref={forwardedRef}\n id={id}\n role={role}\n aria-label={ariaLabel}\n className={classNames(\n 'rt-BaseMenuContent',\n 'rt-SidebarContent',\n `rt-r-size-${size}`,\n `rt-menu-variant-${menuVariant}`,\n className,\n )}\n >\n {children}\n </div>\n </ScrollArea>\n );\n },\n);\nSidebarContent.displayName = 'Sidebar.Content';\n\n// Sidebar header\ninterface SidebarHeaderProps extends React.ComponentPropsWithoutRef<'div'> {\n /**\n * Whether to use the default flex container layout.\n * @default true\n */\n asContainer?: boolean;\n}\n\nconst SidebarHeader = React.forwardRef<HTMLDivElement, SidebarHeaderProps>(\n ({ className, asContainer = true, ...props }, forwardedRef) => {\n const visual = useSidebarVisual();\n const size = visual?.size ?? '2';\n const menuVariant = visual?.menuVariant ?? 'soft';\n\n return (\n <div\n {...props}\n ref={forwardedRef}\n className={classNames(\n 'rt-SidebarHeader',\n `rt-r-size-${size}`,\n `rt-menu-variant-${menuVariant}`,\n {\n 'rt-SidebarHeader--container': asContainer,\n },\n className,\n )}\n />\n );\n },\n);\nSidebarHeader.displayName = 'Sidebar.Header';\n\n// Sidebar footer\ninterface SidebarFooterProps extends React.ComponentPropsWithoutRef<'div'> {\n /**\n * Whether to use the default flex container layout.\n * @default true\n */\n asContainer?: boolean;\n}\n\nconst SidebarFooter = React.forwardRef<HTMLDivElement, SidebarFooterProps>(\n ({ className, asContainer = true, ...props }, forwardedRef) => {\n const visual = useSidebarVisual();\n const size = visual?.size ?? '2';\n const menuVariant = visual?.menuVariant ?? 'soft';\n\n return (\n <div\n {...props}\n ref={forwardedRef}\n className={classNames(\n 'rt-SidebarFooter',\n `rt-r-size-${size}`,\n `rt-menu-variant-${menuVariant}`,\n {\n 'rt-SidebarFooter--container': asContainer,\n },\n className,\n )}\n />\n );\n },\n);\nSidebarFooter.displayName = 'Sidebar.Footer';\n\n// Sidebar trigger button\n// removed Trigger in presentational-only Sidebar\n\n// Removed SidebarInset - not needed\n\n// Sidebar separator\ninterface SidebarSeparatorProps extends ComponentPropsWithout<typeof Separator, RemovedProps> {}\n\nconst SidebarSeparator = React.forwardRef<\n React.ComponentRef<typeof Separator>,\n SidebarSeparatorProps\n>(({ className, ...props }, forwardedRef) => (\n <Separator\n {...props}\n ref={forwardedRef}\n className={classNames('rt-SidebarSeparator', className)}\n />\n));\nSidebarSeparator.displayName = 'Sidebar.Separator';\n\n// Menu components - reusing dropdown menu structure\ninterface SidebarMenuProps extends React.ComponentPropsWithoutRef<'ul'> {}\n\nconst SidebarMenu = React.forwardRef<HTMLUListElement, SidebarMenuProps>(\n ({ className, ...props }, forwardedRef) => (\n <ul\n {...props}\n ref={forwardedRef}\n role=\"menu\"\n className={classNames('rt-BaseMenuViewport', 'rt-SidebarMenu', className)}\n />\n ),\n);\nSidebarMenu.displayName = 'Sidebar.Menu';\n\ninterface SidebarMenuItemProps extends React.ComponentPropsWithoutRef<'li'> {}\n\nconst SidebarMenuItem = React.forwardRef<HTMLLIElement, SidebarMenuItemProps>(\n ({ className, ...props }, forwardedRef) => (\n <li {...props} ref={forwardedRef} className={classNames('rt-SidebarMenuItem', className)} />\n ),\n);\nSidebarMenuItem.displayName = 'Sidebar.MenuItem';\n\ninterface SidebarMenuButtonProps extends React.ComponentPropsWithoutRef<'button'> {\n asChild?: boolean;\n isActive?: boolean;\n shortcut?: React.ReactNode;\n badge?: string | BadgeConfig;\n}\n\nconst SidebarMenuButton = React.forwardRef<HTMLButtonElement, SidebarMenuButtonProps>(\n (\n {\n asChild = false,\n isActive = false,\n shortcut,\n badge,\n className,\n children,\n onMouseEnter,\n onMouseLeave,\n onKeyDown,\n ...props\n },\n forwardedRef,\n ) => {\n const [isHighlighted, setIsHighlighted] = React.useState(false);\n const visual = useSidebarVisual();\n const sidebarSize = visual?.size ?? '2';\n\n const Comp = asChild ? Slot : 'button';\n\n const { onClick } = props;\n const handleKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLButtonElement>) => {\n switch (event.key) {\n case 'Enter':\n case ' ':\n event.preventDefault();\n if (onClick) onClick(event as any);\n break;\n case 'ArrowDown': {\n event.preventDefault();\n // Focus next menu item\n const nextItem = (event.currentTarget as HTMLElement).nextElementSibling?.querySelector(\n '[role=\"menuitem\"]',\n ) as HTMLElement;\n if (nextItem) nextItem.focus();\n break;\n }\n case 'ArrowUp': {\n event.preventDefault();\n // Focus previous menu item\n const prevItem = (\n event.currentTarget as HTMLElement\n ).previousElementSibling?.querySelector('[role=\"menuitem\"]') as HTMLElement;\n if (prevItem) prevItem.focus();\n break;\n }\n }\n onKeyDown?.(event);\n },\n [onClick, onKeyDown],\n );\n\n return (\n <Comp\n {...props}\n ref={forwardedRef}\n role=\"menuitem\"\n aria-current={isActive ? 'page' : undefined}\n className={classNames('rt-reset', 'rt-BaseMenuItem', 'rt-SidebarMenuButton', className)}\n data-active={isActive || undefined}\n data-highlighted={isHighlighted || undefined}\n onKeyDown={handleKeyDown}\n onMouseEnter={(event) => {\n setIsHighlighted(true);\n onMouseEnter?.(event);\n }}\n onMouseLeave={(event) => {\n setIsHighlighted(false);\n onMouseLeave?.(event);\n }}\n >\n {asChild ? (\n children\n ) : (\n <>\n {children}\n {/* Badge with soft variant default and size mapping to sidebar size */}\n {badge && (\n <div className=\"rt-SidebarMenuBadge\">\n {typeof badge === 'string' ? (\n <Badge size={sidebarSize} variant=\"soft\">\n {badge}\n </Badge>\n ) : (\n <Badge\n size={badge.size || sidebarSize}\n variant={badge.variant || 'soft'}\n color={badge.color}\n highContrast={badge.highContrast}\n radius={badge.radius}\n >\n {badge.content}\n </Badge>\n )}\n </div>\n )}\n {shortcut && (\n <div className=\"rt-BaseMenuShortcut rt-SidebarMenuShortcut\">\n <Kbd size={sidebarSize}>{shortcut}</Kbd>\n </div>\n )}\n </>\n )}\n </Comp>\n );\n },\n);\nSidebarMenuButton.displayName = 'Sidebar.MenuButton';\n\n// Sub-menu components using Radix Accordion\ninterface SidebarMenuSubProps extends React.ComponentPropsWithoutRef<'div'> {\n defaultOpen?: boolean;\n}\n\nconst SidebarMenuSub = React.forwardRef<HTMLDivElement, SidebarMenuSubProps>(\n ({ defaultOpen = false, children, ...props }, forwardedRef) => {\n return (\n <div {...props} ref={forwardedRef}>\n <Accordion.Root type=\"single\" collapsible defaultValue={defaultOpen ? 'item' : undefined}>\n <Accordion.Item value=\"item\">{children}</Accordion.Item>\n </Accordion.Root>\n </div>\n );\n },\n);\nSidebarMenuSub.displayName = 'Sidebar.MenuSub';\n\ninterface SidebarMenuSubTriggerProps\n extends React.ComponentPropsWithoutRef<typeof Accordion.Trigger> {\n asChild?: boolean;\n}\n\nconst SidebarMenuSubTrigger = React.forwardRef<\n React.ElementRef<typeof Accordion.Trigger>,\n SidebarMenuSubTriggerProps\n>(\n (\n { asChild = false, className, children, onMouseEnter, onMouseLeave, ...props },\n forwardedRef,\n ) => {\n const [isHighlighted, setIsHighlighted] = React.useState(false);\n\n return (\n <Accordion.Header asChild>\n <div>\n <Accordion.Trigger\n {...props}\n ref={forwardedRef}\n asChild={asChild}\n role=\"menuitem\"\n aria-haspopup=\"true\"\n className={classNames(\n 'rt-reset',\n 'rt-BaseMenuItem',\n 'rt-SidebarMenuButton',\n 'rt-SidebarMenuSubTrigger',\n className,\n )}\n data-highlighted={isHighlighted || undefined}\n onMouseEnter={(event) => {\n setIsHighlighted(true);\n onMouseEnter?.(event);\n }}\n onMouseLeave={(event) => {\n setIsHighlighted(false);\n onMouseLeave?.(event);\n }}\n >\n {asChild ? (\n children\n ) : (\n <>\n {children}\n <ThickChevronRightIcon\n className={classNames(\n 'rt-BaseMenuSubTriggerIcon',\n 'rt-SidebarMenuSubTriggerIcon',\n )}\n />\n </>\n )}\n </Accordion.Trigger>\n </div>\n </Accordion.Header>\n );\n },\n);\nSidebarMenuSubTrigger.displayName = 'Sidebar.MenuSubTrigger';\n\ninterface SidebarMenuSubContentProps\n extends React.ComponentPropsWithoutRef<typeof Accordion.Content> {}\n\nconst SidebarMenuSubContent = React.forwardRef<\n React.ElementRef<typeof Accordion.Content>,\n SidebarMenuSubContentProps\n>(({ className, children, ...props }, forwardedRef) => {\n return (\n <Accordion.Content\n {...props}\n ref={forwardedRef}\n className={classNames('rt-SidebarMenuSubContent', className)}\n >\n <div className=\"rt-SidebarMenuSubList\">{children}</div>\n </Accordion.Content>\n );\n});\nSidebarMenuSubContent.displayName = 'Sidebar.MenuSubContent';\n\n// Group components\ninterface SidebarGroupProps extends React.ComponentPropsWithoutRef<'div'> {}\n\nconst SidebarGroup = React.forwardRef<HTMLDivElement, SidebarGroupProps>(\n ({ className, ...props }, forwardedRef) => (\n <div\n {...props}\n ref={forwardedRef}\n className={classNames('rt-BaseMenuGroup', 'rt-SidebarGroup', className)}\n />\n ),\n);\nSidebarGroup.displayName = 'Sidebar.Group';\n\ninterface SidebarGroupLabelProps extends React.ComponentPropsWithoutRef<'div'> {\n asChild?: boolean;\n}\n\nconst SidebarGroupLabel = React.forwardRef<HTMLDivElement, SidebarGroupLabelProps>(\n ({ asChild = false, className, ...props }, forwardedRef) => {\n const Comp = asChild ? Slot : 'div';\n\n return (\n <Comp\n {...props}\n ref={forwardedRef}\n role=\"group\"\n className={classNames('rt-BaseMenuLabel', 'rt-SidebarGroupLabel', className)}\n />\n );\n },\n);\nSidebarGroupLabel.displayName = 'Sidebar.GroupLabel';\n\ninterface SidebarGroupContentProps extends React.ComponentPropsWithoutRef<'div'> {}\n\nconst SidebarGroupContent = React.forwardRef<HTMLDivElement, SidebarGroupContentProps>(\n ({ className, ...props }, forwardedRef) => (\n <div\n {...props}\n ref={forwardedRef}\n className={classNames('rt-SidebarGroupContent', className)}\n />\n ),\n);\nSidebarGroupContent.displayName = 'Sidebar.GroupContent';\n\n// Export all components following shadcn's pattern\nexport {\n Sidebar as Root,\n SidebarContent as Content,\n SidebarHeader as Header,\n SidebarFooter as Footer,\n SidebarSeparator as Separator,\n SidebarMenu as Menu,\n SidebarMenuItem as MenuItem,\n SidebarMenuButton as MenuButton,\n SidebarMenuSub as MenuSub,\n SidebarMenuSubTrigger as MenuSubTrigger,\n SidebarMenuSubContent as MenuSubContent,\n SidebarGroup as Group,\n SidebarGroupLabel as GroupLabel,\n SidebarGroupContent as GroupContent,\n};\n\n/**\n * Enhanced Sidebar Header and Footer Usage Examples:\n *\n * 1. Simple default container (backwards compatible):\n * <Sidebar.Header>\n * <Logo />\n * <span>App Name</span>\n * </Sidebar.Header>\n *\n * 2. Custom flex layout:\n * <Sidebar.Header className=\"rt-justify-between rt-gap-3\">\n * <Logo />\n * <Sidebar.MenuButton>\n * <SettingsIcon />\n * </Sidebar.MenuButton>\n * </Sidebar.Header>\n *\n * 3. Column layout for multiple rows:\n * <Sidebar.Header className=\"rt-flex-col rt-gap-2\" asContainer={false}>\n * <div className=\"rt-flex rt-items-center rt-gap-2\">\n * <Logo />\n * <span>App Name</span>\n * </div>\n * <Sidebar.MenuButton>\n * <UserAvatar />\n * <span>John Doe</span>\n * </Sidebar.MenuButton>\n * </Sidebar.Header>\n *\n * 4. Interactive footer with menu button:\n * <Sidebar.Footer>\n * <Sidebar.MenuButton>\n * <UserIcon />\n * <span>Settings</span>\n * <ChevronUpIcon />\n * </Sidebar.MenuButton>\n * </Sidebar.Footer>\n *\n * 5. Custom footer layout:\n * <Sidebar.Footer className=\"rt-justify-between\">\n * <span>v1.0.0</span>\n * <Sidebar.MenuButton>\n * <HelpIcon />\n * </Sidebar.MenuButton>\n * </Sidebar.Footer>\n *\n * Available utility classes:\n * - Layout: rt-flex-row, rt-flex-col\n * - Alignment: rt-items-center, rt-items-start, rt-items-end\n * - Justification: rt-justify-between, rt-justify-center, rt-justify-start, rt-justify-end\n * - Gap: rt-gap-1, rt-gap-2, rt-gap-3, rt-gap-4\n */\n\nexport type {\n SidebarProps as RootProps,\n SidebarContentProps as ContentProps,\n SidebarHeaderProps as HeaderProps,\n SidebarFooterProps as FooterProps,\n BadgeConfig,\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["sidebar_exports", "__export", "SidebarContent", "SidebarFooter", "SidebarGroup", "SidebarGroupContent", "SidebarGroupLabel", "SidebarHeader", "SidebarMenu", "SidebarMenuButton", "SidebarMenuItem", "SidebarMenuSub", "SidebarMenuSubContent", "SidebarMenuSubTrigger", "Sidebar", "SidebarSeparator", "__toCommonJS", "React", "import_classnames", "import_slot", "import_radix_ui", "import_sidebar_props", "import_theme", "import_scroll_area", "import_separator", "import_icons", "import_extract_props", "import_kbd", "import_badge", "SidebarVisualContext", "useSidebarVisual", "props", "forwardedRef", "themeContext", "size", "variant", "menuVariant", "panelBackground", "color", "highContrast", "className", "children", "rootProps", "_", "__", "safeRootProps", "resolvedColor", "resolvedSize", "classNames", "role", "ariaLabel", "id", "visual", "asContainer", "asChild", "isActive", "shortcut", "badge", "onMouseEnter", "onMouseLeave", "onKeyDown", "isHighlighted", "setIsHighlighted", "sidebarSize", "Comp", "onClick", "handleKeyDown", "event", "nextItem", "prevItem", "defaultOpen"]
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"skeleton.d.ts","sourceRoot":"","sources":["../../../src/components/skeleton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAO/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAGzF,KAAK,gBAAgB,GAAG,eAAe,CAAC,OAAO,gBAAgB,CAAC,CAAC;AACjE,UAAU,aACR,SAAQ,qBAAqB,CAAC,MAAM,EAAE,YAAY,CAAC,EACjD,WAAW,EACX,gBAAgB;CAAG;AACvB,QAAA,MAAM,QAAQ,uFAyBZ,CAAC;AAGH,OAAO,EAAE,QAAQ,EAAE,CAAC;AACpB,YAAY,EAAE,aAAa,EAAE,CAAC"}
1
+ {"version":3,"file":"skeleton.d.ts","sourceRoot":"","sources":["../../../src/components/skeleton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAO/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAGzF,KAAK,gBAAgB,GAAG,eAAe,CAAC,OAAO,gBAAgB,CAAC,CAAC;AACjE,UAAU,aACR,SAAQ,qBAAqB,CAAC,MAAM,EAAE,YAAY,CAAC,EACjD,WAAW,EACX,gBAAgB;CAAG;AACvB,QAAA,MAAM,QAAQ,uFAwBZ,CAAC;AAGH,OAAO,EAAE,QAAQ,EAAE,CAAC;AACpB,YAAY,EAAE,aAAa,EAAE,CAAC"}
@@ -1,2 +1,2 @@
1
- "use strict";var g=Object.create;var n=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var x=Object.getOwnPropertyNames;var R=Object.getPrototypeOf,h=Object.prototype.hasOwnProperty;var D=(e,o)=>{for(var r in o)n(e,r,{get:o[r],enumerable:!0})},i=(e,o,r,p)=>{if(o&&typeof o=="object"||typeof o=="function")for(let t of x(o))!h.call(e,t)&&t!==r&&n(e,t,{get:()=>o[t],enumerable:!(p=u(o,t))||p.enumerable});return e};var a=(e,o,r)=>(r=e!=null?g(R(e)):{},i(o||!e||!e.__esModule?n(r,"default",{value:e,enumerable:!0}):r,e)),E=e=>i(n({},"__esModule",{value:!0}),e);var N={};D(N,{Skeleton:()=>m});module.exports=E(N);var s=a(require("react")),l=a(require("classnames")),f=require("radix-ui"),P=require("../helpers/inert.js"),d=require("../helpers/extract-props.js"),k=require("../props/margin.props.js"),c=require("./skeleton.props.js");const m=s.forwardRef((e,o)=>{const{children:r,className:p,loading:t,...S}=(0,d.extractProps)(e,c.skeletonPropDefs,k.marginPropDefs);if(!t)return r;const y=s.isValidElement(r)?f.Slot.Root:"span";return s.createElement(y,{ref:o,"aria-hidden":!0,className:(0,l.default)("rt-Skeleton",p),"data-inline-skeleton":s.isValidElement(r)?void 0:!0,tabIndex:-1,inert:P.inert,...S},r)});m.displayName="Skeleton";
1
+ "use strict";var g=Object.create;var n=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var R=Object.getOwnPropertyNames;var h=Object.getPrototypeOf,x=Object.prototype.hasOwnProperty;var D=(e,o)=>{for(var r in o)n(e,r,{get:o[r],enumerable:!0})},i=(e,o,r,p)=>{if(o&&typeof o=="object"||typeof o=="function")for(let t of R(o))!x.call(e,t)&&t!==r&&n(e,t,{get:()=>o[t],enumerable:!(p=u(o,t))||p.enumerable});return e};var a=(e,o,r)=>(r=e!=null?g(h(e)):{},i(o||!e||!e.__esModule?n(r,"default",{value:e,enumerable:!0}):r,e)),E=e=>i(n({},"__esModule",{value:!0}),e);var N={};D(N,{Skeleton:()=>m});module.exports=E(N);var s=a(require("react")),l=a(require("classnames")),f=require("radix-ui"),P=require("../helpers/inert.js"),d=require("../helpers/extract-props.js"),k=require("../props/margin.props.js"),c=require("./skeleton.props.js");const m=s.forwardRef((e,o)=>{const{children:r,className:p,loading:t,...S}=(0,d.extractProps)(e,c.skeletonPropDefs,k.marginPropDefs);if(!t)return r;const y=s.isValidElement(r)?f.Slot.Root:"span";return s.createElement(y,{ref:o,"aria-hidden":!0,className:(0,l.default)("rt-Skeleton",p),"data-inline-skeleton":s.isValidElement(r)?void 0:!0,tabIndex:-1,inert:P.inert,...S},r)});m.displayName="Skeleton";
2
2
  //# sourceMappingURL=skeleton.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/components/skeleton.tsx"],
4
- "sourcesContent": ["import * as React from 'react';\nimport classNames from 'classnames';\nimport { Slot } from 'radix-ui';\n\nimport { inert } from '../helpers/inert.js';\nimport { extractProps } from '../helpers/extract-props.js';\nimport { marginPropDefs } from '../props/margin.props.js';\nimport { skeletonPropDefs } from './skeleton.props.js';\n\nimport type { MarginProps } from '../props/margin.props.js';\nimport type { GetPropDefTypes } from '../props/prop-def.js';\nimport type { ComponentPropsWithout, RemovedProps } from '../helpers/component-props.js';\n\ntype SkeletonElement = React.ElementRef<'span'>;\ntype SkeletonOwnProps = GetPropDefTypes<typeof skeletonPropDefs>;\ninterface SkeletonProps\n extends ComponentPropsWithout<'span', RemovedProps>,\n MarginProps,\n SkeletonOwnProps {}\nconst Skeleton = React.forwardRef<SkeletonElement, SkeletonProps>((props, forwardedRef) => {\n const { children, className, loading, ...skeletonProps } = extractProps(\n props,\n skeletonPropDefs,\n marginPropDefs\n );\n\n if (!loading) return children;\n\n const Tag = React.isValidElement(children) ? Slot.Root : 'span';\n\n return (\n <Tag\n ref={forwardedRef}\n aria-hidden\n className={classNames('rt-Skeleton', className)}\n data-inline-skeleton={React.isValidElement(children) ? undefined : true}\n tabIndex={-1}\n // @ts-expect-error\n inert={inert}\n {...skeletonProps}\n >\n {children}\n </Tag>\n );\n});\nSkeleton.displayName = 'Skeleton';\n\nexport { Skeleton };\nexport type { SkeletonProps };\n"],
5
- "mappings": "0jBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,cAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAuB,oBACvBC,EAAuB,yBACvBC,EAAqB,oBAErBC,EAAsB,+BACtBC,EAA6B,uCAC7BC,EAA+B,oCAC/BC,EAAiC,+BAYjC,MAAMR,EAAWE,EAAM,WAA2C,CAACO,EAAOC,IAAiB,CACzF,KAAM,CAAE,SAAAC,EAAU,UAAAC,EAAW,QAAAC,EAAS,GAAGC,CAAc,KAAI,gBACzDL,EACA,mBACA,gBACF,EAEA,GAAI,CAACI,EAAS,OAAOF,EAErB,MAAMI,EAAMb,EAAM,eAAeS,CAAQ,EAAI,OAAK,KAAO,OAEzD,OACET,EAAA,cAACa,EAAA,CACC,IAAKL,EACL,cAAW,GACX,aAAW,EAAAM,SAAW,cAAeJ,CAAS,EAC9C,uBAAsBV,EAAM,eAAeS,CAAQ,EAAI,OAAY,GACnE,SAAU,GAEV,MAAO,QACN,GAAGG,GAEHH,CACH,CAEJ,CAAC,EACDX,EAAS,YAAc",
4
+ "sourcesContent": ["import * as React from 'react';\nimport classNames from 'classnames';\nimport { Slot } from 'radix-ui';\n\nimport { inert } from '../helpers/inert.js';\nimport { extractProps } from '../helpers/extract-props.js';\nimport { marginPropDefs } from '../props/margin.props.js';\nimport { skeletonPropDefs } from './skeleton.props.js';\n\nimport type { MarginProps } from '../props/margin.props.js';\nimport type { GetPropDefTypes } from '../props/prop-def.js';\nimport type { ComponentPropsWithout, RemovedProps } from '../helpers/component-props.js';\n\ntype SkeletonElement = React.ElementRef<'span'>;\ntype SkeletonOwnProps = GetPropDefTypes<typeof skeletonPropDefs>;\ninterface SkeletonProps\n extends ComponentPropsWithout<'span', RemovedProps>,\n MarginProps,\n SkeletonOwnProps {}\nconst Skeleton = React.forwardRef<SkeletonElement, SkeletonProps>((props, forwardedRef) => {\n const { children, className, loading, ...skeletonProps } = extractProps(\n props,\n skeletonPropDefs,\n marginPropDefs,\n );\n\n if (!loading) return children;\n\n const Tag = React.isValidElement(children) ? Slot.Root : 'span';\n\n return (\n <Tag\n ref={forwardedRef}\n aria-hidden\n className={classNames('rt-Skeleton', className)}\n data-inline-skeleton={React.isValidElement(children) ? undefined : true}\n tabIndex={-1}\n inert={inert}\n {...skeletonProps}\n >\n {children}\n </Tag>\n );\n});\nSkeleton.displayName = 'Skeleton';\n\nexport { Skeleton };\nexport type { SkeletonProps };\n"],
5
+ "mappings": "0jBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,cAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAuB,oBACvBC,EAAuB,yBACvBC,EAAqB,oBAErBC,EAAsB,+BACtBC,EAA6B,uCAC7BC,EAA+B,oCAC/BC,EAAiC,+BAYjC,MAAMR,EAAWE,EAAM,WAA2C,CAACO,EAAOC,IAAiB,CACzF,KAAM,CAAE,SAAAC,EAAU,UAAAC,EAAW,QAAAC,EAAS,GAAGC,CAAc,KAAI,gBACzDL,EACA,mBACA,gBACF,EAEA,GAAI,CAACI,EAAS,OAAOF,EAErB,MAAMI,EAAMb,EAAM,eAAeS,CAAQ,EAAI,OAAK,KAAO,OAEzD,OACET,EAAA,cAACa,EAAA,CACC,IAAKL,EACL,cAAW,GACX,aAAW,EAAAM,SAAW,cAAeJ,CAAS,EAC9C,uBAAsBV,EAAM,eAAeS,CAAQ,EAAI,OAAY,GACnE,SAAU,GACV,MAAO,QACN,GAAGG,GAEHH,CACH,CAEJ,CAAC,EACDX,EAAS,YAAc",
6
6
  "names": ["skeleton_exports", "__export", "Skeleton", "__toCommonJS", "React", "import_classnames", "import_radix_ui", "import_inert", "import_extract_props", "import_margin_props", "import_skeleton_props", "props", "forwardedRef", "children", "className", "loading", "skeletonProps", "Tag", "classNames"]
7
7
  }
@@ -1,2 +1,2 @@
1
- export declare const inert: string | true;
1
+ export declare const inert: boolean | undefined;
2
2
  //# sourceMappingURL=inert.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"inert.d.ts","sourceRoot":"","sources":["../../../src/helpers/inert.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,KAAK,eAAwC,CAAC"}
1
+ {"version":3,"file":"inert.d.ts","sourceRoot":"","sources":["../../../src/helpers/inert.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,KAAK,EAAE,OAAO,GAAG,SAA8D,CAAC"}
@@ -1,2 +1,2 @@
1
- "use strict";var n=Object.create;var a=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var m=Object.getPrototypeOf,f=Object.prototype.hasOwnProperty;var l=(o,r)=>{for(var t in r)a(o,t,{get:r[t],enumerable:!0})},i=(o,r,t,s)=>{if(r&&typeof r=="object"||typeof r=="function")for(let e of c(r))!f.call(o,e)&&e!==t&&a(o,e,{get:()=>r[e],enumerable:!(s=p(r,e))||s.enumerable});return o};var v=(o,r,t)=>(t=o!=null?n(m(o)):{},i(r||!o||!o.__esModule?a(t,"default",{value:o,enumerable:!0}):t,o)),x=o=>i(a({},"__esModule",{value:!0}),o);var b={};l(b,{inert:()=>R});module.exports=x(b);var F=v(require("react"));const R=parseFloat(F.version)>=19||"";
1
+ "use strict";var d=Object.create;var t=Object.defineProperty;var s=Object.getOwnPropertyDescriptor;var f=Object.getOwnPropertyNames;var p=Object.getPrototypeOf,u=Object.prototype.hasOwnProperty;var c=(e,n)=>{for(var o in n)t(e,o,{get:n[o],enumerable:!0})},i=(e,n,o,a)=>{if(n&&typeof n=="object"||typeof n=="function")for(let r of f(n))!u.call(e,r)&&r!==o&&t(e,r,{get:()=>n[r],enumerable:!(a=s(n,r))||a.enumerable});return e};var l=(e,n,o)=>(o=e!=null?d(p(e)):{},i(n||!e||!e.__esModule?t(o,"default",{value:e,enumerable:!0}):o,e)),m=e=>i(t({},"__esModule",{value:!0}),e);var x={};c(x,{inert:()=>v});module.exports=m(x);var b=l(require("react"));const v=parseFloat(b.version)>=19?!0:void 0;
2
2
  //# sourceMappingURL=inert.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/helpers/inert.ts"],
4
- "sourcesContent": ["import * as React from 'react';\n\n// \"inert\" works differently between React versions\n// https://github.com/facebook/react/pull/24730\nexport const inert = parseFloat(React.version) >= 19 || '';\n"],
5
- "mappings": "0jBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,WAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAuB,oBAIhB,MAAMF,EAAQ,WAAWE,EAAM,OAAO,GAAK,IAAM",
4
+ "sourcesContent": ["import * as React from 'react';\n\n// In React 19+, boolean attributes like inert are preserved; in earlier versions we omit it.\n// Use: {...(hidden ? { inert } : {})}\nexport const inert: boolean | undefined = parseFloat(React.version) >= 19 ? true : undefined;\n"],
5
+ "mappings": "0jBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,WAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAuB,oBAIhB,MAAMF,EAA6B,WAAWE,EAAM,OAAO,GAAK,GAAK,GAAO",
6
6
  "names": ["inert_exports", "__export", "inert", "__toCommonJS", "React"]
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"base-button.d.ts","sourceRoot":"","sources":["../../../../src/components/_internal/base-button.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAQ5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,KAAK,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAC5F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAG/D,KAAK,kBAAkB,GAAG,eAAe,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAErE;;;;GAIG;AACH,KAAK,0BAA0B,CAAC,CAAC,SAAS,KAAK,CAAC,WAAW,GAAG,QAAQ,IAAI;IACxE,0DAA0D;IAC1D,EAAE,CAAC,EAAE,CAAC,CAAC;CACR,GAAG,kBAAkB,GACpB,WAAW,GACX,qBAAqB,CAAC,CAAC,EAAE,YAAY,GAAG,MAAM,kBAAkB,GAAG,MAAM,WAAW,GAAG,IAAI,CAAC,CAAC;AAE/F;;GAEG;AACH,UAAU,eAAgB,SAAQ,0BAA0B;CAAG;AAE/D;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,QAAA,MAAM,UAAU,2FAoKd,CAAC;AAGH,OAAO,EAAE,UAAU,EAAE,CAAC;AACtB,YAAY,EAAE,eAAe,EAAE,CAAC"}
1
+ {"version":3,"file":"base-button.d.ts","sourceRoot":"","sources":["../../../../src/components/_internal/base-button.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAQ5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,KAAK,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAC5F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAG/D,KAAK,kBAAkB,GAAG,eAAe,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAErE;;;;GAIG;AACH,KAAK,0BAA0B,CAAC,CAAC,SAAS,KAAK,CAAC,WAAW,GAAG,QAAQ,IAAI;IACxE,0DAA0D;IAC1D,EAAE,CAAC,EAAE,CAAC,CAAC;CACR,GAAG,kBAAkB,GACpB,WAAW,GACX,qBAAqB,CAAC,CAAC,EAAE,YAAY,GAAG,MAAM,kBAAkB,GAAG,MAAM,WAAW,GAAG,IAAI,CAAC,CAAC;AAE/F;;GAEG;AACH,UAAU,eAAgB,SAAQ,0BAA0B;CAAG;AAE/D;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,QAAA,MAAM,UAAU,2FA4Kd,CAAC;AAGH,OAAO,EAAE,UAAU,EAAE,CAAC;AACtB,YAAY,EAAE,eAAe,EAAE,CAAC"}
@@ -1,2 +1,2 @@
1
- import*as e from"react";import S from"classnames";import{Slot as z}from"radix-ui";import{baseButtonPropDefs as m}from"./base-button.props.js";import{Flex as j}from"../flex.js";import{Spinner as I}from"../spinner.js";import{VisuallyHidden as N}from"../visually-hidden.js";import{extractProps as O}from"../../helpers/extract-props.js";import{mapResponsiveProp as V,mapButtonSizeToSpinnerSize as F}from"../../helpers/map-prop-values.js";import{marginPropDefs as H}from"../../props/margin.props.js";const f=e.forwardRef((n,r)=>{const{size:y=m.size.default}=n,{className:B,children:o,asChild:p,as:a,color:b,radius:P,material:g,panelBackground:h,flush:C,disabled:u=n.loading,...T}=O(n,m,H);e.useEffect(()=>{n.panelBackground!==void 0&&console.warn("Warning: The `panelBackground` prop is deprecated and will be removed in a future version. Use `material` prop instead.")},[n.panelBackground]);const s=g??h,d=e.useRef(null);e.useEffect(()=>{const t=d.current;if(!t)return;if(s==="translucent"){t.style.setProperty("will-change","backdrop-filter");const k=()=>{const E=getComputedStyle(t).getPropertyValue("--duration-2")||"75ms",D=parseInt(E)||75;setTimeout(()=>{t&&s!=="translucent"&&t.style.setProperty("will-change","auto")},D)},c=new MutationObserver(k);return c.observe(t,{attributes:!0,attributeFilter:["data-material"]}),()=>{c.disconnect(),t.style.setProperty("will-change","auto")}}else t.style.setProperty("will-change","auto")},[s]);const v=p?z.Root:a||"button",w=p||!a||["button","input","textarea","select"].includes(a),M=e.useId(),i=n.loading?`${M}-loading`:void 0,l=e.useMemo(()=>typeof o=="string"?o:e.isValidElement(o)&&typeof o.props?.children=="string"?o.props.children:"button",[o]),x=e.useMemo(()=>n.loading?{"aria-busy":!0,"aria-disabled":!0,"aria-describedby":i,"aria-label":`${l} (loading)`}:{},[n.loading,i,l]);return e.createElement(v,{"data-disabled":u||void 0,"data-accent-color":b,"data-radius":P,"data-material":s,"data-panel-background":s,"data-flush":C?"true":void 0,...T,...x,ref:t=>{typeof r=="function"?r(t):r&&(r.current=t),d.current=t},className:S("rt-reset","rt-BaseButton",B),...w&&{disabled:u}},n.loading?e.createElement(e.Fragment,null,e.createElement("span",{style:{display:"contents",visibility:"hidden"},"aria-hidden":!0},o),e.createElement(N,null,e.createElement("span",{id:i},l," is loading, please wait..."),o),e.createElement(j,{asChild:!0,align:"center",justify:"center",position:"absolute",inset:"0"},e.createElement("span",null,e.createElement(I,{size:V(y,F),"aria-hidden":"true"})))):o)});f.displayName="BaseButton";export{f as BaseButton};
1
+ import*as t from"react";import N from"classnames";import{Slot as j}from"radix-ui";import{baseButtonPropDefs as f}from"./base-button.props.js";import{Flex as I}from"../flex.js";import{Spinner as O}from"../spinner.js";import{VisuallyHidden as V}from"../visually-hidden.js";import{extractProps as F}from"../../helpers/extract-props.js";import{mapResponsiveProp as H,mapButtonSizeToSpinnerSize as W}from"../../helpers/map-prop-values.js";import{marginPropDefs as G}from"../../props/margin.props.js";const y=t.forwardRef((n,a)=>{const{size:b=f.size.default}=n,{className:B,children:o,asChild:i,as:s,color:P,radius:g,material:h,panelBackground:T,flush:v,disabled:p=n.loading,...d}=F(n,f,G);t.useEffect(()=>{n.panelBackground!==void 0&&console.warn("Warning: The `panelBackground` prop is deprecated and will be removed in a future version. Use `material` prop instead.")},[n.panelBackground]);const r=h??T,c=t.useRef(null);t.useEffect(()=>{const e=c.current;if(!e)return;if(r==="translucent"){e.style.setProperty("will-change","backdrop-filter");const D=()=>{const S=getComputedStyle(e).getPropertyValue("--duration-2")||"75ms",z=parseInt(S)||75;setTimeout(()=>{e&&r!=="translucent"&&e.style.setProperty("will-change","auto")},z)},m=new MutationObserver(D);return m.observe(e,{attributes:!0,attributeFilter:["data-material"]}),()=>{m.disconnect(),e.style.setProperty("will-change","auto")}}else e.style.setProperty("will-change","auto")},[r]);const w=i?j.Root:s||"button",C=i||!s||["button","input","textarea","select"].includes(s),x=!i&&(!s||s==="button"),E="type"in d,M=t.useId(),l=n.loading?`${M}-loading`:void 0,u=t.useMemo(()=>typeof o=="string"?o:t.isValidElement(o)&&typeof o.props?.children=="string"?o.props.children:"button",[o]),k=t.useMemo(()=>n.loading?{"aria-busy":!0,"aria-disabled":!0,"aria-describedby":l,"aria-label":`${u} (loading)`}:{},[n.loading,l,u]);return t.createElement(w,{"data-disabled":p||void 0,"data-accent-color":P,"data-radius":g,"data-material":r,"data-panel-background":r,"data-flush":v?"true":void 0,...d,...k,ref:e=>{typeof a=="function"?a(e):a&&(a.current=e),c.current=e},className:N("rt-reset","rt-BaseButton",B),...C&&{disabled:p},...x&&!E?{type:"button"}:{}},n.loading?t.createElement(t.Fragment,null,t.createElement("span",{style:{display:"contents",visibility:"hidden"},"aria-hidden":!0},o),t.createElement(V,null,t.createElement("span",{id:l},u," is loading, please wait..."),o),t.createElement(I,{asChild:!0,align:"center",justify:"center",position:"absolute",inset:"0"},t.createElement("span",null,t.createElement(O,{size:H(b,W),"aria-hidden":"true"})))):o)});y.displayName="BaseButton";export{y as BaseButton};
2
2
  //# sourceMappingURL=base-button.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/components/_internal/base-button.tsx"],
4
- "sourcesContent": ["import * as React from 'react';\nimport classNames from 'classnames';\nimport { Slot } from 'radix-ui';\n\nimport { baseButtonPropDefs } from './base-button.props.js';\nimport { Flex } from '../flex.js';\nimport { Spinner } from '../spinner.js';\nimport { VisuallyHidden } from '../visually-hidden.js';\nimport { extractProps } from '../../helpers/extract-props.js';\nimport { mapResponsiveProp, mapButtonSizeToSpinnerSize } from '../../helpers/map-prop-values.js';\nimport { marginPropDefs } from '../../props/margin.props.js';\n\nimport type { MarginProps } from '../../props/margin.props.js';\nimport type { ComponentPropsWithout, RemovedProps } from '../../helpers/component-props.js';\nimport type { GetPropDefTypes } from '../../props/prop-def.js';\n\ntype BaseButtonElement = React.ElementRef<'button'>;\ntype BaseButtonOwnProps = GetPropDefTypes<typeof baseButtonPropDefs>;\n\n/**\n * Polymorphic BaseButton props that support rendering as different HTML elements\n * Uses the proper ComponentPropsWithout pattern for type safety\n * @template C - The element type to render as (defaults to 'button')\n */\ntype PolymorphicBaseButtonProps<C extends React.ElementType = 'button'> = {\n /** Element type to render as (e.g., 'a', 'span', etc.) */\n as?: C;\n} & BaseButtonOwnProps &\n MarginProps &\n ComponentPropsWithout<C, RemovedProps | keyof BaseButtonOwnProps | keyof MarginProps | 'as'>;\n\n/**\n * BaseButton props interface that combines all available props\n */\ninterface BaseButtonProps extends PolymorphicBaseButtonProps {}\n\n/**\n * BaseButton component that provides the core button functionality\n *\n * This is the foundational button component that handles all the complex logic\n * including loading states, accessibility, performance optimizations, and\n * polymorphic rendering. It's used by Button, IconButton, and other button\n * variants to ensure consistent behavior across the design system.\n *\n * Key features:\n * - Loading state with spinner and accessibility announcements\n * - Performance optimizations for backdrop-filter effects\n * - Comprehensive accessibility support\n * - Polymorphic rendering support\n * - Material/panel background handling\n *\n * @example\n * ```tsx\n * // Basic usage\n * <BaseButton>Click me</BaseButton>\n *\n * // With loading state\n * <BaseButton loading>Processing...</BaseButton>\n *\n * // Polymorphic rendering\n * <BaseButton as=\"a\" href=\"/link\">Link Button</BaseButton>\n * ```\n */\nconst BaseButton = React.forwardRef<BaseButtonElement, BaseButtonProps>((props, forwardedRef) => {\n const { size = baseButtonPropDefs.size.default } = props;\n\n // Extract button-specific props from the combined props object\n const {\n className,\n children,\n asChild,\n as,\n color,\n radius,\n material,\n panelBackground,\n flush,\n disabled = props.loading, // Loading state automatically disables the button\n ...baseButtonProps\n } = extractProps(props, baseButtonPropDefs, marginPropDefs);\n\n // Show deprecation warning for panelBackground when used\n // This helps developers migrate to the new material prop\n React.useEffect(() => {\n if (props.panelBackground !== undefined) {\n console.warn(\n 'Warning: The `panelBackground` prop is deprecated and will be removed in a future version. Use `material` prop instead.',\n );\n }\n }, [props.panelBackground]);\n\n // Material takes precedence over panelBackground for backward compatibility\n const effectiveMaterial = material ?? panelBackground;\n\n // Will-change cleanup for backdrop-filter performance optimization\n // This prevents layout thrashing when using translucent materials\n const buttonRef = React.useRef<HTMLElement>(null);\n\n React.useEffect(() => {\n const button = buttonRef.current;\n if (!button) return;\n\n const hasTranslucentMaterial = effectiveMaterial === 'translucent';\n\n if (hasTranslucentMaterial) {\n // Add will-change when material is translucent to optimize rendering\n button.style.setProperty('will-change', 'backdrop-filter');\n\n // Clean up will-change after transition completes to prevent memory leaks\n const cleanup = () => {\n const transitionDuration =\n getComputedStyle(button).getPropertyValue('--duration-2') || '75ms';\n const duration = parseInt(transitionDuration) || 75;\n\n setTimeout(() => {\n if (button && effectiveMaterial !== 'translucent') {\n button.style.setProperty('will-change', 'auto');\n }\n }, duration);\n };\n\n // Listen for material changes to clean up will-change property\n const observer = new MutationObserver(cleanup);\n observer.observe(button, { attributes: true, attributeFilter: ['data-material'] });\n\n return () => {\n observer.disconnect();\n button.style.setProperty('will-change', 'auto');\n };\n } else {\n // Remove will-change when material is not translucent\n button.style.setProperty('will-change', 'auto');\n }\n }, [effectiveMaterial]);\n\n // asChild takes precedence over as prop for Radix Slot integration\n const Comp = asChild ? Slot.Root : as || 'button';\n\n // Only pass disabled for elements that support it\n // This prevents invalid HTML attributes on unsupported elements\n const shouldPassDisabled =\n asChild || !as || ['button', 'input', 'textarea', 'select'].includes(as);\n\n // Generate unique ID for loading announcements\n const loadingId = React.useId();\n const describedById = props.loading ? `${loadingId}-loading` : undefined;\n\n // Extract button text for accessibility announcements\n const buttonText = React.useMemo(() => {\n if (typeof children === 'string') return children;\n if (React.isValidElement(children) && typeof (children.props as any)?.children === 'string') {\n return (children.props as any).children;\n }\n return 'button';\n }, [children]);\n\n // Enhanced accessibility props for loading state\n // These ensure screen readers announce the loading state properly\n const accessibilityProps = React.useMemo(() => {\n if (props.loading) {\n return {\n 'aria-busy': true,\n 'aria-disabled': true,\n 'aria-describedby': describedById,\n 'aria-label': `${buttonText} (loading)`,\n };\n }\n return {};\n }, [props.loading, describedById, buttonText]);\n\n return (\n <Comp\n // The `data-disabled` attribute enables correct styles when doing `<Button asChild disabled>`\n data-disabled={disabled || undefined}\n data-accent-color={color}\n data-radius={radius}\n data-material={effectiveMaterial}\n data-panel-background={effectiveMaterial}\n data-flush={flush ? 'true' : undefined}\n {...baseButtonProps}\n {...accessibilityProps}\n ref={(node) => {\n // Handle both forwarded ref and internal ref for performance optimization\n if (typeof forwardedRef === 'function') {\n forwardedRef(node);\n } else if (forwardedRef) {\n forwardedRef.current = node;\n }\n buttonRef.current = node;\n }}\n className={classNames('rt-reset', 'rt-BaseButton', className)}\n {...(shouldPassDisabled && { disabled })}\n >\n {props.loading ? (\n <>\n {/**\n * We need a wrapper to set `visibility: hidden` to hide the button content whilst we show the `Spinner`.\n * The button is a flex container with a `gap`, so we use `display: contents` to ensure the correct flex layout.\n *\n * However, `display: contents` removes the content from the accessibility tree in some browsers,\n * so we force remove it with `aria-hidden` and re-add it in the tree with `VisuallyHidden`\n */}\n <span style={{ display: 'contents', visibility: 'hidden' }} aria-hidden>\n {children}\n </span>\n\n {/* Enhanced accessibility for loading state */}\n <VisuallyHidden>\n <span id={describedById}>{buttonText} is loading, please wait...</span>\n {children}\n </VisuallyHidden>\n\n {/* Centered spinner overlay during loading state */}\n <Flex asChild align=\"center\" justify=\"center\" position=\"absolute\" inset=\"0\">\n <span>\n <Spinner\n size={mapResponsiveProp(size, mapButtonSizeToSpinnerSize)}\n aria-hidden=\"true\"\n />\n </span>\n </Flex>\n </>\n ) : (\n children\n )}\n </Comp>\n );\n});\nBaseButton.displayName = 'BaseButton';\n\nexport { BaseButton };\nexport type { BaseButtonProps };\n"],
5
- "mappings": "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",
6
- "names": ["React", "classNames", "Slot", "baseButtonPropDefs", "Flex", "Spinner", "VisuallyHidden", "extractProps", "mapResponsiveProp", "mapButtonSizeToSpinnerSize", "marginPropDefs", "BaseButton", "props", "forwardedRef", "size", "className", "children", "asChild", "as", "color", "radius", "material", "panelBackground", "flush", "disabled", "baseButtonProps", "effectiveMaterial", "buttonRef", "button", "cleanup", "transitionDuration", "duration", "observer", "Comp", "shouldPassDisabled", "loadingId", "describedById", "buttonText", "accessibilityProps", "node"]
4
+ "sourcesContent": ["import * as React from 'react';\nimport classNames from 'classnames';\nimport { Slot } from 'radix-ui';\n\nimport { baseButtonPropDefs } from './base-button.props.js';\nimport { Flex } from '../flex.js';\nimport { Spinner } from '../spinner.js';\nimport { VisuallyHidden } from '../visually-hidden.js';\nimport { extractProps } from '../../helpers/extract-props.js';\nimport { mapResponsiveProp, mapButtonSizeToSpinnerSize } from '../../helpers/map-prop-values.js';\nimport { marginPropDefs } from '../../props/margin.props.js';\n\nimport type { MarginProps } from '../../props/margin.props.js';\nimport type { ComponentPropsWithout, RemovedProps } from '../../helpers/component-props.js';\nimport type { GetPropDefTypes } from '../../props/prop-def.js';\n\ntype BaseButtonElement = React.ElementRef<'button'>;\ntype BaseButtonOwnProps = GetPropDefTypes<typeof baseButtonPropDefs>;\n\n/**\n * Polymorphic BaseButton props that support rendering as different HTML elements\n * Uses the proper ComponentPropsWithout pattern for type safety\n * @template C - The element type to render as (defaults to 'button')\n */\ntype PolymorphicBaseButtonProps<C extends React.ElementType = 'button'> = {\n /** Element type to render as (e.g., 'a', 'span', etc.) */\n as?: C;\n} & BaseButtonOwnProps &\n MarginProps &\n ComponentPropsWithout<C, RemovedProps | keyof BaseButtonOwnProps | keyof MarginProps | 'as'>;\n\n/**\n * BaseButton props interface that combines all available props\n */\ninterface BaseButtonProps extends PolymorphicBaseButtonProps {}\n\n/**\n * BaseButton component that provides the core button functionality\n *\n * This is the foundational button component that handles all the complex logic\n * including loading states, accessibility, performance optimizations, and\n * polymorphic rendering. It's used by Button, IconButton, and other button\n * variants to ensure consistent behavior across the design system.\n *\n * Key features:\n * - Loading state with spinner and accessibility announcements\n * - Performance optimizations for backdrop-filter effects\n * - Comprehensive accessibility support\n * - Polymorphic rendering support\n * - Material/panel background handling\n *\n * @example\n * ```tsx\n * // Basic usage\n * <BaseButton>Click me</BaseButton>\n *\n * // With loading state\n * <BaseButton loading>Processing...</BaseButton>\n *\n * // Polymorphic rendering\n * <BaseButton as=\"a\" href=\"/link\">Link Button</BaseButton>\n * ```\n */\nconst BaseButton = React.forwardRef<BaseButtonElement, BaseButtonProps>((props, forwardedRef) => {\n const { size = baseButtonPropDefs.size.default } = props;\n\n // Extract button-specific props from the combined props object\n const {\n className,\n children,\n asChild,\n as,\n color,\n radius,\n material,\n panelBackground,\n flush,\n disabled = props.loading, // Loading state automatically disables the button\n ...baseButtonProps\n } = extractProps(props, baseButtonPropDefs, marginPropDefs);\n\n // Show deprecation warning for panelBackground when used\n // This helps developers migrate to the new material prop\n React.useEffect(() => {\n if (props.panelBackground !== undefined) {\n console.warn(\n 'Warning: The `panelBackground` prop is deprecated and will be removed in a future version. Use `material` prop instead.',\n );\n }\n }, [props.panelBackground]);\n\n // Material takes precedence over panelBackground for backward compatibility\n const effectiveMaterial = material ?? panelBackground;\n\n // Will-change cleanup for backdrop-filter performance optimization\n // This prevents layout thrashing when using translucent materials\n const buttonRef = React.useRef<HTMLElement>(null);\n\n React.useEffect(() => {\n const button = buttonRef.current;\n if (!button) return;\n\n const hasTranslucentMaterial = effectiveMaterial === 'translucent';\n\n if (hasTranslucentMaterial) {\n // Add will-change when material is translucent to optimize rendering\n button.style.setProperty('will-change', 'backdrop-filter');\n\n // Clean up will-change after transition completes to prevent memory leaks\n const cleanup = () => {\n const transitionDuration =\n getComputedStyle(button).getPropertyValue('--duration-2') || '75ms';\n const duration = parseInt(transitionDuration) || 75;\n\n setTimeout(() => {\n if (button && effectiveMaterial !== 'translucent') {\n button.style.setProperty('will-change', 'auto');\n }\n }, duration);\n };\n\n // Listen for material changes to clean up will-change property\n const observer = new MutationObserver(cleanup);\n observer.observe(button, { attributes: true, attributeFilter: ['data-material'] });\n\n return () => {\n observer.disconnect();\n button.style.setProperty('will-change', 'auto');\n };\n } else {\n // Remove will-change when material is not translucent\n button.style.setProperty('will-change', 'auto');\n }\n }, [effectiveMaterial]);\n\n // asChild takes precedence over as prop for Radix Slot integration\n const Comp = asChild ? Slot.Root : as || 'button';\n\n // Only pass disabled for elements that support it\n // This prevents invalid HTML attributes on unsupported elements\n const shouldPassDisabled =\n asChild || !as || ['button', 'input', 'textarea', 'select'].includes(as);\n\n // Determine if we are rendering a real <button> element so we can set a safe\n // default type. Native <button> defaults to type=\"submit\" which can cause\n // accidental form submissions. We default to type=\"button\" unless the user\n // explicitly provided a type or we're using asChild (unknown underlying node).\n const isNativeButtonElement = !asChild && (!as || as === 'button');\n const hasExplicitTypeAttribute = 'type' in (baseButtonProps as Record<string, unknown>);\n\n // Generate unique ID for loading announcements\n const loadingId = React.useId();\n const describedById = props.loading ? `${loadingId}-loading` : undefined;\n\n // Extract button text for accessibility announcements\n const buttonText = React.useMemo(() => {\n if (typeof children === 'string') return children;\n if (React.isValidElement(children) && typeof (children.props as any)?.children === 'string') {\n return (children.props as any).children;\n }\n return 'button';\n }, [children]);\n\n // Enhanced accessibility props for loading state\n // These ensure screen readers announce the loading state properly\n const accessibilityProps = React.useMemo(() => {\n if (props.loading) {\n return {\n 'aria-busy': true,\n 'aria-disabled': true,\n 'aria-describedby': describedById,\n 'aria-label': `${buttonText} (loading)`,\n };\n }\n return {};\n }, [props.loading, describedById, buttonText]);\n\n return (\n <Comp\n // The `data-disabled` attribute enables correct styles when doing `<Button asChild disabled>`\n data-disabled={disabled || undefined}\n data-accent-color={color}\n data-radius={radius}\n data-material={effectiveMaterial}\n data-panel-background={effectiveMaterial}\n data-flush={flush ? 'true' : undefined}\n {...baseButtonProps}\n {...accessibilityProps}\n ref={(node) => {\n // Handle both forwarded ref and internal ref for performance optimization\n if (typeof forwardedRef === 'function') {\n forwardedRef(node);\n } else if (forwardedRef) {\n forwardedRef.current = node;\n }\n buttonRef.current = node;\n }}\n className={classNames('rt-reset', 'rt-BaseButton', className)}\n {...(shouldPassDisabled && { disabled })}\n {...(isNativeButtonElement && !hasExplicitTypeAttribute ? { type: 'button' } : {})}\n >\n {props.loading ? (\n <>\n {/**\n * We need a wrapper to set `visibility: hidden` to hide the button content whilst we show the `Spinner`.\n * The button is a flex container with a `gap`, so we use `display: contents` to ensure the correct flex layout.\n *\n * However, `display: contents` removes the content from the accessibility tree in some browsers,\n * so we force remove it with `aria-hidden` and re-add it in the tree with `VisuallyHidden`\n */}\n <span style={{ display: 'contents', visibility: 'hidden' }} aria-hidden>\n {children}\n </span>\n\n {/* Enhanced accessibility for loading state */}\n <VisuallyHidden>\n <span id={describedById}>{buttonText} is loading, please wait...</span>\n {children}\n </VisuallyHidden>\n\n {/* Centered spinner overlay during loading state */}\n <Flex asChild align=\"center\" justify=\"center\" position=\"absolute\" inset=\"0\">\n <span>\n <Spinner\n size={mapResponsiveProp(size, mapButtonSizeToSpinnerSize)}\n aria-hidden=\"true\"\n />\n </span>\n </Flex>\n </>\n ) : (\n children\n )}\n </Comp>\n );\n});\nBaseButton.displayName = 'BaseButton';\n\nexport { BaseButton };\nexport type { BaseButtonProps };\n"],
5
+ "mappings": "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",
6
+ "names": ["React", "classNames", "Slot", "baseButtonPropDefs", "Flex", "Spinner", "VisuallyHidden", "extractProps", "mapResponsiveProp", "mapButtonSizeToSpinnerSize", "marginPropDefs", "BaseButton", "props", "forwardedRef", "size", "className", "children", "asChild", "as", "color", "radius", "material", "panelBackground", "flush", "disabled", "baseButtonProps", "effectiveMaterial", "buttonRef", "button", "cleanup", "transitionDuration", "duration", "observer", "Comp", "shouldPassDisabled", "isNativeButtonElement", "hasExplicitTypeAttribute", "loadingId", "describedById", "buttonText", "accessibilityProps", "node"]
7
7
  }
@@ -0,0 +1,202 @@
1
+ import * as React from 'react';
2
+ import { type IconButtonProps } from './icon-button.js';
3
+ import type { ComponentPropsWithout, RemovedProps } from '../helpers/component-props.js';
4
+ type ExpandOn = 'none' | 'focus' | 'overflow' | 'both';
5
+ type SendMode = 'always' | 'whenDirty' | 'never';
6
+ /** Status flag for attachment lifecycle. */
7
+ type AttachmentStatus = 'idle' | 'uploading' | 'error' | 'done';
8
+ /**
9
+ * Attachment data model used by Chatbar.
10
+ * - `url` is an object URL used for image previews and is revoked on removal.
11
+ */
12
+ interface ChatbarAttachment {
13
+ id: string;
14
+ name: string;
15
+ size: number;
16
+ type: string;
17
+ url?: string;
18
+ status?: AttachmentStatus;
19
+ progress?: number;
20
+ meta?: Record<string, unknown>;
21
+ }
22
+ /**
23
+ * Chatbar container and state provider.
24
+ *
25
+ * Value & Open
26
+ * - Supports controlled/uncontrolled `value` and `open`.
27
+ *
28
+ * Attachments
29
+ * - Controlled/uncontrolled attachments with client-side filtering.
30
+ * - Filters by `accept`/`pasteAccept`, `maxAttachments`, and `maxFileSize`.
31
+ * - Rejections are reported via `onAttachmentReject`.
32
+ *
33
+ * Submit
34
+ * - `onSubmit({ value, attachments })` emits both message and attachments.
35
+ * - `clearOnSubmit` clears message and attachments by default.
36
+ */
37
+ interface ChatbarRootBaseProps {
38
+ value?: string;
39
+ defaultValue?: string;
40
+ onValueChange?: (value: string) => void;
41
+ open?: boolean;
42
+ defaultOpen?: boolean;
43
+ onOpenChange?: (open: boolean) => void;
44
+ expandOn?: ExpandOn;
45
+ /** Minimum number of lines in compact state (default: 1) */
46
+ minLines?: number;
47
+ /** Maximum number of lines before scrolling (default: 6) */
48
+ maxLines?: number;
49
+ sendMode?: SendMode;
50
+ disabled?: boolean;
51
+ readOnly?: boolean;
52
+ /** Combined submit payload */
53
+ onSubmit?: (payload: {
54
+ value: string;
55
+ attachments: ChatbarAttachment[];
56
+ }) => void;
57
+ size?: '1' | '2' | '3';
58
+ variant?: 'surface' | 'outline' | 'classic' | 'ghost' | 'soft';
59
+ width?: React.CSSProperties['width'];
60
+ maxWidth?: React.CSSProperties['maxWidth'];
61
+ asChild?: boolean;
62
+ attachments?: ChatbarAttachment[];
63
+ defaultAttachments?: ChatbarAttachment[];
64
+ onAttachmentsChange?: (attachments: ChatbarAttachment[]) => void;
65
+ accept?: string | string[];
66
+ multiple?: boolean;
67
+ maxAttachments?: number;
68
+ maxFileSize?: number;
69
+ paste?: boolean;
70
+ pasteAccept?: string | string[];
71
+ clearOnSubmit?: boolean;
72
+ onAttachmentReject?: (rejections: {
73
+ file: File;
74
+ reason: 'type' | 'size' | 'count';
75
+ }[]) => void;
76
+ /**
77
+ * Enables drag-and-drop file uploads when true.
78
+ *
79
+ * When enabled:
80
+ * - Files can be dropped anywhere on the chatbar
81
+ * - Same validation rules apply (accept, maxFileSize, maxAttachments)
82
+ * - Visual feedback shows during drag operations
83
+ * - Rejected files trigger onAttachmentReject
84
+ *
85
+ * @default true
86
+ */
87
+ dropzone?: boolean;
88
+ }
89
+ /**
90
+ * Chatbar container and state provider.
91
+ *
92
+ * Behavior
93
+ * - Supports controlled and uncontrolled `value` and `open` states via props.
94
+ * - Provides context to subcomponents like `Textarea`, `Row`, and `Send`.
95
+ * - Exposes `data-state`, `data-disabled`, and `data-readonly` attributes for styling.
96
+ * - Sets `aria-expanded` to reflect open/closed state for assistive technologies.
97
+ *
98
+ * Attachments
99
+ * - Controlled/uncontrolled attachments with client-side filtering.
100
+ * - Filters by `accept`/`pasteAccept`, `maxAttachments`, and `maxFileSize`.
101
+ * - Rejections are reported via `onAttachmentReject`.
102
+ * - Paste-to-attach: when `paste` is enabled, pasting files adds attachments.
103
+ *
104
+ * Dropzone
105
+ * - When `dropzone` is true, enables drag-and-drop file uploads.
106
+ * - Files are validated using the same rules as paste and file picker.
107
+ * - Visual feedback via `data-drop-active` attribute during drag operations.
108
+ * - Rejected files trigger `onAttachmentReject` with appropriate reasons.
109
+ *
110
+ * Submit
111
+ * - `onSubmit` receives both message text and attachments array.
112
+ * - `clearOnSubmit` controls whether attachments are cleared after submission.
113
+ *
114
+ * Accessibility
115
+ * - Consumers should label the `Textarea` via `aria-label`/`aria-labelledby`.
116
+ * - `aria-expanded` on the root reflects the disclosure state of the input area.
117
+ * - Dropzone provides proper ARIA attributes for drag and drop operations.
118
+ */
119
+ interface RootProps extends ComponentPropsWithout<'div', RemovedProps | 'onSubmit'>, ChatbarRootBaseProps {
120
+ }
121
+ declare const Root: React.ForwardRefExoticComponent<RootProps & React.RefAttributes<HTMLDivElement>>;
122
+ /**
123
+ * Multi-line text input for Chatbar.
124
+ * - Uses onChange to control value and avoid duplicate updates.
125
+ * - Auto-resizes between minLines and maxLines.
126
+ * - Expands on focus/overflow per `expandOn`.
127
+ * - Paste-to-attach: when `paste` is enabled on Root, pasting files adds attachments.
128
+ * - Provide `aria-label` or `aria-labelledby` for an accessible name.
129
+ */
130
+ interface TextareaProps extends Omit<React.ComponentPropsWithoutRef<'textarea'>, 'size'> {
131
+ asChild?: boolean;
132
+ /**
133
+ * Handler for paste events. This is forwarded to the underlying <textarea>.
134
+ */
135
+ onPaste?: React.ClipboardEventHandler<HTMLTextAreaElement>;
136
+ /**
137
+ * When true, pressing Enter submits via onSend (Shift+Enter inserts newline).
138
+ * Defaults to false.
139
+ */
140
+ submitOnEnter?: boolean;
141
+ }
142
+ /**
143
+ * Chatbar multi-line text input.
144
+ *
145
+ * Behavior
146
+ * - Controls the Chatbar value via React onChange. We intentionally do not
147
+ * update state in onInput to avoid duplicate updates per keystroke.
148
+ * - Auto-resizes between minLines and maxLines using layout measurements.
149
+ * - When expandOn is `overflow` or `both`, the Chatbar opens as soon as the
150
+ * content exceeds the compact height.
151
+ * - Height recalculations occur on change, paste, and whenever `value` or `open`
152
+ * changes via an isomorphic layout effect to avoid SSR warnings.
153
+ *
154
+ * Accessibility
155
+ * - Consumers should provide labeling via aria-label or aria-labelledby
156
+ * on this component, as no implicit label is rendered.
157
+ */
158
+ declare const Textarea: React.ForwardRefExoticComponent<TextareaProps & React.RefAttributes<HTMLTextAreaElement>>;
159
+ interface InlineSlotProps extends Omit<React.ComponentPropsWithoutRef<'div'>, 'children'> {
160
+ asChild?: boolean;
161
+ children?: React.ReactNode;
162
+ }
163
+ declare const InlineStart: React.ForwardRefExoticComponent<InlineSlotProps & React.RefAttributes<HTMLDivElement>>;
164
+ declare const InlineEnd: React.ForwardRefExoticComponent<InlineSlotProps & React.RefAttributes<HTMLDivElement>>;
165
+ /**
166
+ * Renders a horizontally scrollable list of attachments above the inline row.
167
+ * Hidden when empty unless `forceMount`. Override per-item with `renderAttachment`.
168
+ */
169
+ interface AttachmentsRowProps extends Omit<React.ComponentPropsWithoutRef<'div'>, 'children'> {
170
+ asChild?: boolean;
171
+ forceMount?: boolean;
172
+ /** If provided, custom-render a tile; otherwise default tile is used */
173
+ renderAttachment?: (attachment: ChatbarAttachment) => React.ReactNode;
174
+ }
175
+ declare const AttachmentsRow: React.ForwardRefExoticComponent<AttachmentsRowProps & React.RefAttributes<HTMLDivElement>>;
176
+ /** Default tile renderer for a single attachment. */
177
+ interface AttachmentProps extends React.ComponentPropsWithoutRef<'div'> {
178
+ attachment: ChatbarAttachment;
179
+ asChild?: boolean;
180
+ }
181
+ declare const Attachment: React.ForwardRefExoticComponent<AttachmentProps & React.RefAttributes<HTMLDivElement>>;
182
+ interface AttachTriggerProps extends React.ComponentPropsWithoutRef<'button'> {
183
+ asChild?: boolean;
184
+ accept?: string | string[];
185
+ multiple?: boolean;
186
+ }
187
+ declare const AttachTrigger: React.ForwardRefExoticComponent<AttachTriggerProps & React.RefAttributes<HTMLButtonElement>>;
188
+ interface RowProps extends Omit<React.ComponentPropsWithoutRef<'div'>, 'children'> {
189
+ asChild?: boolean;
190
+ children?: React.ReactNode;
191
+ }
192
+ declare const Row: React.ForwardRefExoticComponent<RowProps & React.RefAttributes<HTMLDivElement>>;
193
+ declare const RowStart: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
194
+ declare const RowEnd: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
195
+ interface SendProps extends Omit<IconButtonProps, 'size'> {
196
+ asChild?: boolean;
197
+ clearOnSend?: boolean;
198
+ }
199
+ declare const Send: React.ForwardRefExoticComponent<SendProps & React.RefAttributes<HTMLButtonElement>>;
200
+ export { Root, Textarea, InlineStart, InlineEnd, AttachmentsRow, Attachment, AttachTrigger, Row, RowStart, RowEnd, Send, };
201
+ export type { RootProps as ChatbarRootProps, TextareaProps as ChatbarTextareaProps, RowProps as ChatbarRowProps, SendProps as ChatbarSendProps, };
202
+ //# sourceMappingURL=chatbar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chatbar.d.ts","sourceRoot":"","sources":["../../../src/components/chatbar.tsx"],"names":[],"mappings":"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"}