@keboola/design 11.6.1 → 11.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +16 -1
- package/CHANGELOG.md +86 -0
- package/COMPONENT-API.md +47 -46
- package/README.md +1 -1
- package/dist/{AIKit-CQxVwyAk.js → AIKit-ELIsegJz.js} +550 -103
- package/dist/AIKit-ELIsegJz.js.map +1 -0
- package/dist/{Alert-C4Y9IwMI.js → Alert-BsIM_oFK.js} +2 -2
- package/dist/{Alert-C4Y9IwMI.js.map → Alert-BsIM_oFK.js.map} +1 -1
- package/dist/{BrandEditor-CS9P4r2p.js → BrandEditor-BsTBM3s6.js} +4 -4
- package/dist/{BrandEditor-CS9P4r2p.js.map → BrandEditor-BsTBM3s6.js.map} +1 -1
- package/dist/{Breadcrumb-D1id7YXd.js → Breadcrumb-xqEUxfwn.js} +2 -2
- package/dist/{Breadcrumb-D1id7YXd.js.map → Breadcrumb-xqEUxfwn.js.map} +1 -1
- package/dist/{Checkbox-Bqr6zXcW.js → Checkbox-Dq5fPNrO.js} +2 -2
- package/dist/{Checkbox-Bqr6zXcW.js.map → Checkbox-Dq5fPNrO.js.map} +1 -1
- package/dist/{Clipboard-C2YBRfD8.js → Clipboard-BZitKiSA.js} +2 -2
- package/dist/{Clipboard-C2YBRfD8.js.map → Clipboard-BZitKiSA.js.map} +1 -1
- package/dist/{ClipboardButton-CrljClL1.js → ClipboardButton-KHQnPEh_.js} +2 -2
- package/dist/{ClipboardButton-CrljClL1.js.map → ClipboardButton-KHQnPEh_.js.map} +1 -1
- package/dist/{CodeEditor-C9AS8Ch0.js → CodeEditor-BJKJXA0c.js} +4 -4
- package/dist/{CodeEditor-C9AS8Ch0.js.map → CodeEditor-BJKJXA0c.js.map} +1 -1
- package/dist/{ColorInput-Dg87lKcR.js → ColorInput-Bj3dfPFA.js} +3 -3
- package/dist/{ColorInput-Dg87lKcR.js.map → ColorInput-Bj3dfPFA.js.map} +1 -1
- package/dist/{ColorModeSwitch-CsWLiTBX.js → ColorModeSwitch-CWt-DZGC.js} +2 -2
- package/dist/{ColorModeSwitch-CsWLiTBX.js.map → ColorModeSwitch-CWt-DZGC.js.map} +1 -1
- package/dist/{Combobox-BfanUAqY.js → Combobox-D8PrEqTG.js} +3 -3
- package/dist/{Combobox-BfanUAqY.js.map → Combobox-D8PrEqTG.js.map} +1 -1
- package/dist/{Command-CqxoI_De.js → Command-BDU3C1gg.js} +2 -2
- package/dist/{Command-CqxoI_De.js.map → Command-BDU3C1gg.js.map} +1 -1
- package/dist/{CopyField-Rx9HPTbJ.js → CopyField-BHRQUyuF.js} +2 -2
- package/dist/{CopyField-Rx9HPTbJ.js.map → CopyField-BHRQUyuF.js.map} +1 -1
- package/dist/{DateInput-DpifECUQ.js → DateInput-B6N8g0ra.js} +3 -3
- package/dist/{DateInput-DpifECUQ.js.map → DateInput-B6N8g0ra.js.map} +1 -1
- package/dist/{DateRangeInput-9MIw7P6L.js → DateRangeInput-7M9Z4cVO.js} +3 -3
- package/dist/{DateRangeInput-9MIw7P6L.js.map → DateRangeInput-7M9Z4cVO.js.map} +1 -1
- package/dist/{DropdownMenu-CASr-jgl.js → DropdownMenu-CgVwhDvl.js} +9 -4
- package/dist/DropdownMenu-CgVwhDvl.js.map +1 -0
- package/dist/{FieldItem-DtPTzNef.js → FieldItem-DZGIdiXE.js} +3 -3
- package/dist/{FieldItem-DtPTzNef.js.map → FieldItem-DZGIdiXE.js.map} +1 -1
- package/dist/{Form-DAaatlBk.js → Form-CcK7dRrC.js} +5 -5
- package/dist/{Form-DAaatlBk.js.map → Form-CcK7dRrC.js.map} +1 -1
- package/dist/{FormGroup-Bl8JmnzJ.js → FormGroup-DR_gZ25-.js} +3 -3
- package/dist/{FormGroup-Bl8JmnzJ.js.map → FormGroup-DR_gZ25-.js.map} +1 -1
- package/dist/{InputGroup-DcZRlVnN.js → InputGroup-Do8K2hvD.js} +2 -1
- package/dist/InputGroup-Do8K2hvD.js.map +1 -0
- package/dist/{Kbd-D1Azcc4g.js → Kbd-LCFMumoq.js} +2 -2
- package/dist/{Kbd-D1Azcc4g.js.map → Kbd-LCFMumoq.js.map} +1 -1
- package/dist/{MermaidDiagram-CujFxVzk.js → MermaidDiagram-ZG0iiDV_.js} +2 -2
- package/dist/{MermaidDiagram-CujFxVzk.js.map → MermaidDiagram-ZG0iiDV_.js.map} +1 -1
- package/dist/{Modal-Coj-H02o.js → Modal-I3VWk2oo.js} +2 -2
- package/dist/{Modal-Coj-H02o.js.map → Modal-I3VWk2oo.js.map} +1 -1
- package/dist/{ModalTitle-C76ke2eo.js → ModalTitle-CeLM_mX9.js} +2 -2
- package/dist/ModalTitle-CeLM_mX9.js.map +1 -0
- package/dist/{MultiActionButtonGroup-CNNoBQbv.js → MultiActionButtonGroup-CYZ8IgSf.js} +2 -2
- package/dist/{MultiActionButtonGroup-CNNoBQbv.js.map → MultiActionButtonGroup-CYZ8IgSf.js.map} +1 -1
- package/dist/{RadioGroup-CUBsuP7r.js → RadioGroup-Byc2mym4.js} +2 -2
- package/dist/{RadioGroup-CUBsuP7r.js.map → RadioGroup-Byc2mym4.js.map} +1 -1
- package/dist/{Search-DVpJuzr9.js → Search-Dhig_hPD.js} +2 -2
- package/dist/{Search-DVpJuzr9.js.map → Search-Dhig_hPD.js.map} +1 -1
- package/dist/{SearchInput-Q85p8Ews.js → SearchInput-92r2bkA7.js} +3 -3
- package/dist/{SearchInput-Q85p8Ews.js.map → SearchInput-92r2bkA7.js.map} +1 -1
- package/dist/{SectionNav-mpmSM3OC.js → SectionNav-CNLJsiVG.js} +3 -3
- package/dist/{SectionNav-mpmSM3OC.js.map → SectionNav-CNLJsiVG.js.map} +1 -1
- package/dist/{Sheet-Chf0kX1E.js → Sheet-OparjIi-.js} +2 -2
- package/dist/{Sheet-Chf0kX1E.js.map → Sheet-OparjIi-.js.map} +1 -1
- package/dist/{Sidebar-CTWsHZhF.js → Sidebar-CLEbBtNY.js} +190 -25
- package/dist/Sidebar-CLEbBtNY.js.map +1 -0
- package/dist/{Slider-Bv0B6lI0.js → Slider-DLclvRws.js} +2 -2
- package/dist/{Slider-Bv0B6lI0.js.map → Slider-DLclvRws.js.map} +1 -1
- package/dist/{TextInput-DiEMxVF6.js → TextInput-CFTf4Cz1.js} +5 -4
- package/dist/TextInput-CFTf4Cz1.js.map +1 -0
- package/dist/{ThemeProvider-BI6JWBdJ.js → ThemeProvider-DAmNn9Sd.js} +2 -2
- package/dist/{ThemeProvider-BI6JWBdJ.js.map → ThemeProvider-DAmNn9Sd.js.map} +1 -1
- package/dist/{Timeline-BG5Xogxh.js → Timeline-C8-wnRRr.js} +2 -2
- package/dist/{Timeline-BG5Xogxh.js.map → Timeline-C8-wnRRr.js.map} +1 -1
- package/dist/{ZoomableSvg-U_VH3QRO.js → ZoomableSvg-BZlk3PFJ.js} +3 -3
- package/dist/{ZoomableSvg-U_VH3QRO.js.map → ZoomableSvg-BZlk3PFJ.js.map} +1 -1
- package/dist/editors.js +2 -2
- package/dist/flint.js +1 -1
- package/dist/index.d.ts +900 -561
- package/dist/index.js +36 -34
- package/dist/internal/blocks/AIKit.js +2 -2
- package/dist/internal/blocks/BrandEditor.js +1 -1
- package/dist/internal/blocks/ChipEditor.js +137 -0
- package/dist/internal/blocks/ChipEditor.js.map +1 -0
- package/dist/internal/blocks/ClipboardButton.js +1 -1
- package/dist/internal/blocks/ColorInput.js +1 -1
- package/dist/internal/blocks/ColorModeSwitch.js +1 -1
- package/dist/internal/blocks/Command.js +1 -1
- package/dist/internal/blocks/CopyField.js +1 -1
- package/dist/internal/blocks/DateInput.js +1 -1
- package/dist/internal/blocks/DateRangeInput.js +1 -1
- package/dist/internal/blocks/ExportMenu.js +2 -2
- package/dist/internal/blocks/Form/connectors/MultiComboboxField.js +1 -1
- package/dist/internal/blocks/Form.js +1 -1
- package/dist/internal/blocks/FormGroup.js +1 -1
- package/dist/internal/blocks/MultiActionButtonGroup.js +1 -1
- package/dist/internal/blocks/MultiCombobox.js +18 -28
- package/dist/internal/blocks/MultiCombobox.js.map +1 -1
- package/dist/internal/blocks/NumberInput.js +1 -1
- package/dist/internal/blocks/PasswordInput.js +2 -2
- package/dist/internal/blocks/SearchInput.js +1 -1
- package/dist/internal/blocks/SearchInputWithNavigation.js +2 -2
- package/dist/internal/blocks/SectionNav.js +1 -1
- package/dist/internal/blocks/SplitButton.js +1 -1
- package/dist/internal/blocks/TextInput.js +1 -1
- package/dist/internal/blocks/Textarea.js +1 -1
- package/dist/internal/blocks/TimeInput.js +2 -2
- package/dist/internal/components/Alert.js +1 -1
- package/dist/internal/components/Avatar.js +1 -1
- package/dist/internal/components/Breadcrumb.js +1 -1
- package/dist/internal/components/Checkbox.js +1 -1
- package/dist/internal/components/Clipboard.js +1 -1
- package/dist/internal/components/CollapsiblePanel.js +1 -1
- package/dist/internal/components/Combobox.js +1 -1
- package/dist/internal/components/DropdownMenu.js +1 -1
- package/dist/internal/components/InputGroup.js +1 -1
- package/dist/internal/components/Kbd.js +1 -1
- package/dist/internal/components/Modal.js +1 -1
- package/dist/internal/components/RadioGroup.js +1 -1
- package/dist/internal/components/Search.js +1 -1
- package/dist/internal/components/Sheet.js +1 -1
- package/dist/internal/components/Sidebar.js +1 -1
- package/dist/internal/components/Slider.js +1 -1
- package/dist/internal/components/StatusDot.js +67 -0
- package/dist/internal/components/StatusDot.js.map +1 -0
- package/dist/internal/components/ThemeProvider.js +1 -1
- package/dist/internal/components/Timeline.js +1 -1
- package/dist/internal/components/Tooltip.js +2 -2
- package/dist/internal/components/Truncated.js +1 -1
- package/dist/internal/components/ZoomableSvg.js +1 -1
- package/dist/internal/hooks/useScrollbarPosition.js +1 -1
- package/dist/internal/utils/mergeRefs.js +27 -9
- package/dist/internal/utils/mergeRefs.js.map +1 -1
- package/dist/internal/utils.js +2 -2
- package/dist/markdown-editor.js +5 -5
- package/dist/mermaid.js +1 -1
- package/dist/rjsf.js +9 -9
- package/dist/styles.css +1 -1
- package/dist/testing.js +1 -1
- package/dist/useElement-BK3AAiIf.js +24 -0
- package/dist/useElement-BK3AAiIf.js.map +1 -0
- package/dist/{utils-DnkrFYqY.js → utils-BW4AE8VP.js} +31 -3
- package/dist/utils-BW4AE8VP.js.map +1 -0
- package/package.json +2 -1
- package/dist/AIKit-CQxVwyAk.js.map +0 -1
- package/dist/DropdownMenu-CASr-jgl.js.map +0 -1
- package/dist/InputGroup-DcZRlVnN.js.map +0 -1
- package/dist/ModalTitle-C76ke2eo.js.map +0 -1
- package/dist/Sidebar-CTWsHZhF.js.map +0 -1
- package/dist/TextInput-DiEMxVF6.js.map +0 -1
- package/dist/useElement-DkF6esWL.js +0 -15
- package/dist/useElement-DkF6esWL.js.map +0 -1
- package/dist/utils-DnkrFYqY.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DropdownMenu-CASr-jgl.js","names":["Root"],"sources":["../src/components/DropdownMenu/DropdownMenuItemIndicator.tsx","../src/components/DropdownMenu/ItemIcon.tsx","../src/components/DropdownMenu/styles.ts","../src/components/DropdownMenu/DropdownMenuCheckboxItem.tsx","../src/components/DropdownMenu/DropdownMenuContext.tsx","../src/components/DropdownMenu/DropdownMenuContent.tsx","../src/components/DropdownMenu/DropdownMenuItem.tsx","../src/components/DropdownMenu/DropdownMenuItemDescription.tsx","../src/components/DropdownMenu/DropdownMenuLabel.tsx","../src/components/DropdownMenu/DropdownMenuRadioGroup/DropdownMenuRadioGroup.tsx","../src/components/DropdownMenu/DropdownMenuRadioGroup/DropdownMenuRadioItem.tsx","../src/components/DropdownMenu/DropdownMenuSeparator.tsx","../src/components/DropdownMenu/DropdownMenuSub/DropdownMenuSub.tsx","../src/components/DropdownMenu/DropdownMenuSub/DropdownMenuSubContent.tsx","../src/components/DropdownMenu/DropdownMenuSub/DropdownMenuSubTrigger.tsx","../src/components/DropdownMenu/DropdownMenuTrigger.tsx","../src/components/DropdownMenu/DropdownMenu.tsx"],"sourcesContent":["import type { ComponentProps } from 'react';\nimport * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';\nimport type { VariantProps } from 'class-variance-authority';\nimport { cva } from 'class-variance-authority';\n\nimport { Check, Circle, ToggleRight } from '../../icons';\n\nconst variants = cva(\n [\n 'tailwindcss-preflight',\n 'tw:pointer-events-none',\n\n // sizing\n 'tw:size-4',\n 'tw:aspect-square',\n 'tw:shrink-0',\n\n // layout\n 'tw:flex',\n 'tw:items-center',\n 'tw:justify-center',\n ],\n {\n variants: {\n variant: {\n none: [],\n radio: [\n 'tw:border',\n 'tw:border-solid',\n 'tw:border-border',\n 'tw:rounded-full',\n 'tw:group-data-[variant=default]/dropdown-menu-content:bg-input-background',\n 'tw:group-data-[variant=argo]/dropdown-menu-content:bg-background',\n\n 'tw:[&_svg:not([class*=\"tw:size-\"])]:size-2',\n 'tw:data-[state=unchecked]:[&_svg]:hidden',\n // Lucide Circle is stroke-only — force fill to match the stroke\n // (currentColor) so the indicator reads as a solid dot.\n 'tw:[&_svg]:fill-current',\n 'tw:group-data-[variant=argo]/dropdown-menu-content:[&_svg]:text-primary',\n 'tw:group-data-[variant=default]/dropdown-menu-content:[&_svg]:text-primary',\n ],\n check: ['tw:[&_svg:not([class*=\"tw:size-\"])]:size-3.5', 'tw:[&_svg]:text-primary'],\n checkbox: [\n 'tw:[&_svg]:text-primary-foreground',\n 'tw:border',\n 'tw:border-solid',\n 'tw:rounded',\n 'tw:group-data-[variant=default]/dropdown-menu-content:border-input',\n 'tw:group-data-[variant=argo]/dropdown-menu-content:border-input',\n\n 'tw:[&_svg:not([class*=\"tw:size-\"])]:size-3',\n 'tw:data-[state=unchecked]:[&_svg]:hidden',\n 'tw:group-data-[variant=argo]/dropdown-menu-content:data-[state=checked]:border-primary',\n 'tw:group-data-[variant=argo]/dropdown-menu-content:data-[state=checked]:bg-primary',\n 'tw:group-data-[variant=default]/dropdown-menu-content:data-[state=checked]:border-primary',\n 'tw:group-data-[variant=default]/dropdown-menu-content:data-[state=checked]:bg-primary',\n ],\n switch: [\n 'tw:size-5',\n // Lucide SVGs default to 24×24 — constrain the rendered ToggleRight\n // to the indicator slot so it doesn't overflow.\n 'tw:[&_svg:not([class*=\"tw:size-\"])]:size-5',\n 'tw:text-muted-foreground',\n 'tw:data-[state=unchecked]:rotate-180',\n 'tw:group-data-[variant=default]/dropdown-menu-content:data-[state=checked]:text-primary',\n 'tw:group-data-[variant=argo]/dropdown-menu-content:data-[state=checked]:text-primary',\n ],\n },\n },\n },\n);\n\ntype Props = ComponentProps<typeof DropdownMenuPrimitive.ItemIndicator> &\n VariantProps<typeof variants>;\n\nexport const DropdownMenuItemIndicator = ({\n variant,\n className,\n forceMount: forceMountProp,\n ...rest\n}: Props) => {\n const IconComp = (() => {\n if (variant === 'switch') return ToggleRight;\n if (variant === 'radio') return Circle;\n return Check;\n })();\n\n const forceMount = (() => {\n if (forceMountProp) return true;\n // All variants, except for check, require rendering at all times.\n return variant === 'check' ? undefined : true;\n })();\n\n if (variant === 'none') return null;\n\n return (\n <DropdownMenuPrimitive.ItemIndicator\n {...rest}\n forceMount={forceMount}\n className={variants({ variant, className })}\n >\n <IconComp />\n </DropdownMenuPrimitive.ItemIndicator>\n );\n};\n","import type { ComponentProps, ReactNode } from 'react';\n\nimport { cn } from '../../utils';\n\ntype Props = ComponentProps<'span'> & {\n children: ReactNode;\n};\n\nexport const ItemIcon = ({ className, children, ...props }: Props) => (\n <span\n {...props}\n className={cn(\n 'tw:inline-flex',\n 'tw:items-center',\n 'tw:justify-center',\n 'tw:aspect-square',\n // 20px container fits the 16px Lucide glyph plus 2px breathing room\n // each side — the previous tw:size-4 + tw:p-0.5 clipped the 16px child.\n 'tw:size-5',\n 'tw:[&_svg:not([class*=\"tw:size-\"])]:size-4',\n 'tw:group-data-[variant=default]/dropdown-menu-content:text-muted-foreground',\n 'tw:group-data-[variant=argo]/dropdown-menu-content:text-primary',\n 'tw:group-data-[variant=argo]/dropdown-menu-content:group-aria-disabled:text-muted-foreground',\n 'tw:group-data-[variant=default]/dropdown-menu-content:group-hover:text-primary',\n className,\n )}\n >\n {children}\n </span>\n);\n","import { cn } from '../../utils';\n\nexport const itemVariants = cn(\n // reset\n 'tailwindcss-preflight',\n 'tw:outline-hidden',\n 'tw:group',\n 'tw:peer',\n 'tw:relative',\n\n // positioning\n 'tw:flex',\n 'tw:flex-1',\n 'tw:items-center',\n 'tw:gap-2',\n\n // An icon passed as `children` rather than via the `icon` prop misses `ItemIcon`,\n // so without this it falls back to Lucide's 24px default and towers over the\n // siblings this row is laid out for. The `:not()` keeps a call-site size winning.\n 'tw:[&_svg:not([class*=\"tw:size-\"])]:size-4',\n\n 'tw:cursor-pointer',\n 'tw:select-none',\n 'tw:transition-colors',\n\n // spacing\n 'tw:p-2',\n\n // typography\n 'tw:font-sans',\n 'tw:text-sm',\n\n 'tw:aria-disabled:pointer-events-none',\n 'tw:aria-disabled:opacity-50',\n\n 'tw:focus-visible:outline-hidden',\n\n 'tw:group-data-[variant=default]/dropdown-menu-content:rounded',\n 'tw:group-data-[variant=default]/dropdown-menu-content:focus:bg-muted',\n 'tw:group-data-[variant=default]/dropdown-menu-content:focus:text-foreground',\n 'tw:group-data-[variant=default]/dropdown-menu-content:hover:bg-muted',\n 'tw:group-data-[variant=default]/dropdown-menu-content:hover:text-foreground',\n\n 'tw:group-data-[variant=argo]/dropdown-menu-content:rounded-md',\n 'tw:group-data-[variant=argo]/dropdown-menu-content:text-popover-foreground',\n 'tw:group-data-[variant=argo]/dropdown-menu-content:focus:text-primary',\n 'tw:group-data-[variant=argo]/dropdown-menu-content:focus:bg-primary/10',\n 'tw:group-data-[variant=argo]/dropdown-menu-content:hover:text-primary',\n 'tw:group-data-[variant=argo]/dropdown-menu-content:hover:bg-primary/10',\n);\n\nexport const contentVariants = cn(\n 'tailwindcss-preflight',\n 'tw:group/dropdown-menu-content',\n // Sit above Modal/Sheet (z-1051), matching the other floating overlays (Popover/Select z-1055)\n 'tw:z-[1055]',\n\n // positioning\n 'tw:flex',\n 'tw:flex-col',\n 'tw:origin-(--radix-dropdown-menu-content-transform-origin)',\n\n // sizing\n 'tw:max-h-[var(--radix-dropdown-menu-content-available-height)]',\n 'tw:min-w-32',\n\n // border\n 'tw:border',\n 'tw:border-border',\n 'tw:shadow-md',\n\n // surface — semantic tokens, so a portalled menu follows the brand and the scheme\n 'tw:bg-popover',\n 'tw:text-popover-foreground',\n\n // Radius is the only thing the surface variants differ in.\n 'tw:data-[variant=default]:rounded-md',\n 'tw:data-[variant=argo]:rounded-2xl',\n\n // animations\n 'tw:data-[state=open]:animate-in',\n 'tw:data-[state=open]:fade-in-0',\n 'tw:data-[state=open]:zoom-in-95',\n\n 'tw:data-[state=closed]:animate-out',\n 'tw:data-[state=closed]:fade-out-0',\n 'tw:data-[state=closed]:zoom-out-95',\n\n 'tw:data-[side=bottom]:slide-in-from-top-2',\n 'tw:data-[side=left]:slide-in-from-right-2',\n 'tw:data-[side=right]:slide-in-from-left-2',\n 'tw:data-[side=top]:slide-in-from-bottom-2',\n);\n","import type { ComponentProps } from 'react';\nimport * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';\n\nimport { Loader2 } from '../../icons';\nimport { cn } from '../../utils';\n\nimport { DropdownMenuItemIndicator } from './DropdownMenuItemIndicator';\nimport { ItemIcon } from './ItemIcon';\nimport { itemVariants } from './styles';\n\ntype Props = ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem> & {\n closeOnSelect?: boolean;\n indicator?: 'switch' | 'checkbox' | 'check';\n indicatorAlign?: 'start' | 'end';\n isLoading?: boolean;\n};\n\nexport const DropdownMenuCheckboxItem = ({\n className,\n children,\n checked,\n closeOnSelect = false,\n onSelect,\n indicatorAlign = 'start',\n indicator = 'checkbox',\n isLoading = false,\n ...props\n}: Props) => {\n const isAtStart = indicatorAlign === 'start';\n const indicatorEle = isLoading ? (\n <ItemIcon className={isAtStart ? '' : 'tw:ml-auto'}>\n <Loader2 className=\"tw:animate-spin\" />\n </ItemIcon>\n ) : (\n <DropdownMenuItemIndicator variant={indicator} className={isAtStart ? '' : 'tw:ml-auto'} />\n );\n\n const handleSelect = (event: Event) => {\n if (!closeOnSelect) event.preventDefault();\n onSelect?.(event);\n };\n\n return (\n <DropdownMenuPrimitive.CheckboxItem\n className={cn(itemVariants, className)}\n checked={checked}\n onSelect={handleSelect}\n {...props}\n >\n {isAtStart && indicatorEle}\n {children}\n {!isAtStart && indicatorEle}\n </DropdownMenuPrimitive.CheckboxItem>\n );\n};\n","import { createContext, use } from 'react';\n\nexport type DropdownMenuVariant = 'default' | 'argo';\n\ntype DropdownMenuContextType = {\n variant: DropdownMenuVariant;\n};\n\nexport const DropdownMenuContext = createContext<DropdownMenuContextType>({\n variant: 'default',\n});\n\nexport const useDropdownMenuContext = () => use(DropdownMenuContext);\n","import type { ComponentProps } from 'react';\nimport * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';\n\nimport { cn } from '../../utils';\nimport { ScrollArea } from '../ScrollArea';\n\nimport { useDropdownMenuContext } from './DropdownMenuContext';\nimport { contentVariants } from './styles';\n\ntype Props = Omit<\n ComponentProps<typeof DropdownMenuPrimitive.Content>,\n 'forceMount' | 'asChild'\n> & {\n forceMount?: boolean;\n viewPortClassName?: string;\n container?: HTMLElement | null;\n};\n\nexport const DropdownMenuContent = ({\n className,\n sideOffset = 4,\n forceMount,\n children,\n viewPortClassName,\n container,\n ...props\n}: Props) => {\n const { variant } = useDropdownMenuContext();\n\n return (\n <DropdownMenuPrimitive.Portal forceMount={forceMount || undefined} container={container}>\n <DropdownMenuPrimitive.Content\n {...props}\n data-variant={variant}\n sideOffset={sideOffset}\n className={contentVariants}\n >\n <ScrollArea\n className={className}\n viewPortClassName={cn(\n 'tw:p-2',\n 'tw:max-h-[var(--radix-dropdown-menu-content-available-height)]',\n viewPortClassName,\n )}\n scrollBarClassName=\"tw:w-1.5\"\n >\n {children}\n </ScrollArea>\n </DropdownMenuPrimitive.Content>\n </DropdownMenuPrimitive.Portal>\n );\n};\n","import type { ComponentProps, PointerEventHandler, ReactNode } from 'react';\nimport * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';\nimport { Root, Slottable } from '@radix-ui/react-slot';\n\nimport { Loader2 } from '../../icons';\nimport { cn } from '../../utils';\n\nimport { ItemIcon } from './ItemIcon';\nimport { itemVariants } from './styles';\n\ntype Props = ComponentProps<typeof DropdownMenuPrimitive.Item> & {\n /**\n * Fix for `autoFocus` on inputs not working correctly in modals.\n * While the DropdownMenuItem was animating out and the modal was animating in, the dying DropdownMenuItem was constantly trying to steal focus while the Dialog was trying to correctly set the new focus.\n * https://github.com/radix-ui/primitives/issues/2193#issuecomment-2758461323\n */\n asModalTrigger?: boolean;\n /** Pass a Lucide icon node as a leading adornment. */\n icon?: ReactNode;\n isLoading?: boolean;\n iconClassName?: string;\n};\n\nexport const DropdownMenuItem = ({\n ref,\n className,\n asModalTrigger = false,\n onSelect,\n onPointerLeave,\n onPointerMove,\n children,\n asChild,\n icon,\n iconClassName,\n isLoading = false,\n ...props\n}: Props) => {\n const Comp = asChild ? Root : 'div';\n const adornment = isLoading ? <Loader2 className=\"tw:animate-spin\" /> : icon;\n\n const handleOnSelect = (event: Event) => {\n // prevents dropdown menu from closing to prevent modal unmounting from dom\n if (asModalTrigger) event.preventDefault();\n onSelect?.(event);\n };\n\n const handlePointerLeave: PointerEventHandler<HTMLDivElement> = (event) => {\n // prevents focus stealing from modal\n if (asModalTrigger) event.preventDefault();\n onPointerLeave?.(event);\n };\n\n const handlePointerMove: PointerEventHandler<HTMLDivElement> = (event) => {\n // prevents focus stealing from modal\n if (asModalTrigger) event.preventDefault();\n onPointerMove?.(event);\n };\n\n return (\n <DropdownMenuPrimitive.Item\n {...props}\n ref={ref}\n onSelect={handleOnSelect}\n onPointerLeave={handlePointerLeave}\n onPointerMove={handlePointerMove}\n className={cn(itemVariants, asChild && 'tw:text-inherit', className)}\n asChild\n >\n <Comp>\n {adornment && <ItemIcon className={iconClassName}>{adornment}</ItemIcon>}\n <Slottable>{children}</Slottable>\n </Comp>\n </DropdownMenuPrimitive.Item>\n );\n};\n","import type { ComponentProps } from 'react';\nimport { cva } from 'class-variance-authority';\n\nimport { cn } from '../../utils';\n\nconst descriptionVariants = cva(\n [\n 'tw:box-border',\n 'tw:ml-auto',\n 'tw:font-sans',\n 'tw:tracking-normal',\n 'tw:font-normal',\n 'tw:text-xs',\n 'tw:text-muted-foreground',\n ],\n {\n variants: {\n hideOnHover: {\n true: ['tw:group-focus-within:hidden', 'tw:group-hover:hidden'],\n false: [],\n },\n },\n defaultVariants: {},\n },\n);\n\ntype Props = ComponentProps<'span'> & {\n hideOnHover?: boolean;\n};\n\nexport const DropdownMenuItemDescription = ({\n className,\n children,\n hideOnHover = false,\n ...props\n}: Props) => {\n return (\n <span {...props} className={cn(descriptionVariants({ hideOnHover }), className)}>\n {children}\n </span>\n );\n};\n","import type { ComponentProps } from 'react';\nimport * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';\n\nimport { cn } from '../../utils';\n\ntype Props = ComponentProps<typeof DropdownMenuPrimitive.Label>;\n\nexport const DropdownMenuLabel = ({ className, ...props }: Props) => {\n return (\n <DropdownMenuPrimitive.Label\n className={cn(\n 'tw:p-2',\n 'tw:font-medium',\n 'tw:text-xs',\n 'tw:text-muted-foreground',\n className,\n )}\n {...props}\n />\n );\n};\n","import type { ComponentProps } from 'react';\nimport * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';\n\ntype Props<Value> = Omit<\n ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>,\n 'value' | 'onValueChange' | 'defaultValue'\n> & {\n value?: Value;\n defaultValue?: Value;\n onValueChange?: (value: Value) => void;\n};\n\nexport const DropdownMenuRadioGroup = <Value extends string = string>({\n value,\n defaultValue,\n onValueChange,\n ...props\n}: Props<Value>) => {\n const handleChange = (value: string) => {\n onValueChange?.(value as Value);\n };\n\n return (\n <DropdownMenuPrimitive.RadioGroup\n {...props}\n value={value}\n defaultValue={defaultValue}\n onValueChange={handleChange}\n />\n );\n};\n","import type { ComponentProps, ReactNode } from 'react';\nimport * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';\n\nimport { Loader2 } from '../../../icons';\nimport { cn } from '../../../utils';\nimport { DropdownMenuItemIndicator } from '../DropdownMenuItemIndicator';\nimport { ItemIcon } from '../ItemIcon';\nimport { itemVariants } from '../styles';\n\ntype Props = ComponentProps<typeof DropdownMenuPrimitive.RadioItem> & {\n closeOnSelect?: boolean;\n indicatorAlign?: 'start' | 'end';\n indicator?: 'radio' | 'check' | 'none';\n icon?: ReactNode;\n iconClassName?: string;\n isLoading?: boolean;\n};\n\nexport const DropdownMenuRadioItem = ({\n className,\n children,\n closeOnSelect,\n onSelect,\n indicatorAlign = 'start',\n indicator = 'radio',\n icon,\n iconClassName,\n isLoading = false,\n ...props\n}: Props) => {\n const isAtStart = indicatorAlign === 'start';\n const indicatorEle = isLoading ? (\n <ItemIcon className={iconClassName}>\n <Loader2 className=\"tw:animate-spin\" />\n </ItemIcon>\n ) : (\n <DropdownMenuItemIndicator variant={indicator} />\n );\n\n const handleSelect = (event: Event) => {\n if (!closeOnSelect) event.preventDefault();\n onSelect?.(event);\n };\n\n return (\n <DropdownMenuPrimitive.RadioItem\n className={cn(\n itemVariants,\n 'tw:data-[state=checked]:cursor-default',\n {\n 'tw:data-[state=checked]:bg-neutral-100': indicator === 'none',\n // Semantic brand tint (flips under `[data-theme='dark']`) instead of a\n // hardcoded `tw:bg-sky-100`, which stayed light in dark mode and left the\n // checked item's text near-invisible.\n 'tw:group-data-[variant=argo]/dropdown-menu-content:data-[state=checked]:bg-primary/10':\n indicator === 'check',\n },\n className,\n )}\n onSelect={handleSelect}\n {...props}\n >\n {isAtStart && indicatorEle}\n {icon && <ItemIcon className={iconClassName}>{icon}</ItemIcon>}\n <span className=\"tw:flex tw:min-w-0 tw:flex-1 tw:items-center tw:gap-2\">{children}</span>\n {!isAtStart && indicatorEle}\n </DropdownMenuPrimitive.RadioItem>\n );\n};\n","import type { ComponentProps } from 'react';\nimport * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';\n\nimport { cn } from '../../utils';\n\ntype Props = ComponentProps<typeof DropdownMenuPrimitive.Separator>;\n\nexport const DropdownMenuSeparator = ({ className, ...props }: Props) => (\n <DropdownMenuPrimitive.Separator\n className={cn(\n 'tw:relative',\n 'tw:z-10',\n\n // layout\n 'tw:flex',\n 'tw:items-center',\n 'tw:justify-center',\n 'tw:w-full',\n\n // separator line\n 'tw:before:content-[\"\"]',\n 'tw:before:w-full',\n 'tw:before:h-px',\n\n 'tw:group-data-[variant=default]/dropdown-menu-content:py-2',\n 'tw:group-data-[variant=default]/dropdown-menu-content:before:bg-border',\n\n 'tw:group-data-[variant=argo]/dropdown-menu-content:py-1',\n 'tw:group-data-[variant=argo]/dropdown-menu-content:before:bg-border',\n\n className,\n )}\n {...props}\n />\n);\n","import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';\n\nexport const DropdownMenuSub = DropdownMenuPrimitive.Sub;\n","import type { ComponentProps } from 'react';\nimport * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';\n\nimport { cn } from '../../../utils';\nimport { useDropdownMenuContext } from '../DropdownMenuContext';\nimport { contentVariants } from '../styles';\n\ntype Props = ComponentProps<typeof DropdownMenuPrimitive.SubContent>;\n\nexport const DropdownMenuSubContent = ({ className, ...props }: Props) => {\n const { variant } = useDropdownMenuContext();\n return (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.SubContent\n data-variant={variant}\n className={cn(contentVariants, 'tw:z-[1041]', 'tw:p-2', className)}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n );\n};\n","import type { ComponentProps } from 'react';\nimport * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';\n\nimport { ChevronRight } from '../../../icons';\nimport { cn } from '../../../utils';\nimport { itemVariants } from '../styles';\n\ntype Props = ComponentProps<typeof DropdownMenuPrimitive.SubTrigger>;\n\nexport const DropdownMenuSubTrigger = ({ className, children, ...props }: Props) => {\n return (\n <DropdownMenuPrimitive.SubTrigger className={cn(itemVariants, className)} {...props}>\n {children}\n <ChevronRight className=\"tw:ml-auto tw:size-5\" />\n </DropdownMenuPrimitive.SubTrigger>\n );\n};\n","import type { ComponentProps } from 'react';\nimport { Trigger } from '@radix-ui/react-dropdown-menu';\n\nimport { cn } from '../../utils';\n\ntype Props = ComponentProps<typeof Trigger>;\n\nexport const DropdownMenuTrigger = ({ ref, className, ...props }: Props) => (\n <Trigger\n {...props}\n ref={ref}\n data-slot=\"dropdown-menu-trigger\"\n className={cn('tw:group/dropdown-menu-trigger', className)}\n />\n);\n","import { useMemo } from 'react';\nimport type { ComponentProps } from 'react';\nimport { Group, Root } from '@radix-ui/react-dropdown-menu';\n\nimport { useArgoDesign } from '../ThemeProvider/context';\n\nimport { DropdownMenuCheckboxItem } from './DropdownMenuCheckboxItem';\nimport { DropdownMenuContent } from './DropdownMenuContent';\nimport type { DropdownMenuVariant } from './DropdownMenuContext';\nimport { DropdownMenuContext } from './DropdownMenuContext';\nimport { DropdownMenuItem } from './DropdownMenuItem';\nimport { DropdownMenuItemDescription } from './DropdownMenuItemDescription';\nimport { DropdownMenuLabel } from './DropdownMenuLabel';\nimport { DropdownMenuRadioGroup, DropdownMenuRadioItem } from './DropdownMenuRadioGroup';\nimport { DropdownMenuSeparator } from './DropdownMenuSeparator';\nimport { DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger } from './DropdownMenuSub';\nimport { DropdownMenuTrigger } from './DropdownMenuTrigger';\n\ntype Props = ComponentProps<typeof Root>;\n\nexport const DropdownMenu = ({\n // change a default value to false, for modal property, as it is not used in most cases\n modal = false,\n ...props\n}: Props) => {\n const effectiveVariant: DropdownMenuVariant = useArgoDesign() ? 'argo' : 'default';\n const contextValue = useMemo(() => ({ variant: effectiveVariant }), [effectiveVariant]);\n\n return (\n <DropdownMenuContext value={contextValue}>\n <Root {...props} modal={modal} />\n </DropdownMenuContext>\n );\n};\n\n/**\n * Main Layout\n */\nDropdownMenu.Trigger = DropdownMenuTrigger;\nDropdownMenu.Content = DropdownMenuContent;\nDropdownMenu.Group = Group;\n\n/**\n * Sub Layout\n */\nDropdownMenu.Sub = DropdownMenuSub;\nDropdownMenu.SubContent = DropdownMenuSubContent;\nDropdownMenu.SubTrigger = DropdownMenuSubTrigger;\n\n/**\n * Items can be used either Sub ar Main Layout\n */\nDropdownMenu.Separator = DropdownMenuSeparator;\nDropdownMenu.Label = DropdownMenuLabel;\nDropdownMenu.Item = DropdownMenuItem;\nDropdownMenu.CheckboxItem = DropdownMenuCheckboxItem;\nDropdownMenu.RadioGroup = DropdownMenuRadioGroup;\nDropdownMenu.RadioItem = DropdownMenuRadioItem;\n\n// item content\nDropdownMenu.ItemDescription = DropdownMenuItemDescription;\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"InputGroup-DcZRlVnN.js","names":[],"sources":["../src/components/InputGroup/InputGroupAddon.tsx","../src/components/InputGroup/InputGroupButton.tsx","../src/components/InputGroup/InputGroupInput.tsx","../src/components/InputGroup/InputGroupText.tsx","../src/components/InputGroup/InputGroupTextArea.tsx","../src/components/InputGroup/InputGroup.tsx"],"sourcesContent":["import type { ComponentProps } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\nimport { cn } from '../../utils';\n\n// Padding only fires when the addon actually has content — keeps an empty\n// `<Addon>{maybeNull}</Addon>` from carving 16px out of the input row.\nconst addonVariants = cva(\n [\n 'tw:flex',\n 'tw:items-center',\n 'tw:gap-1',\n\n // Default size for nested Lucide icons in prefix/suffix slots; callers can override on the icon.\n \"tw:[&_svg.lucide:not([class*='tw:size-'])]:size-4\",\n 'tw:[&_svg]:shrink-0',\n ],\n {\n defaultVariants: {\n align: 'inline-start',\n },\n variants: {\n align: {\n 'inline-start': ['tw:order-first', 'tw:shrink-0', 'tw:[&:not(:empty)]:pl-4'],\n 'inline-end': ['tw:order-last', 'tw:shrink-0', 'tw:[&:not(:empty)]:pr-4'],\n 'block-start': [\n 'tw:order-first',\n // `tw:w-full` needs to be empty-conditional too — when the addon\n // has no content the root stays in flex-row, and a 100%-wide\n // empty addon would claim half of the input row beside the input.\n 'tw:[&:not(:empty)]:w-full',\n 'tw:[&:not(:empty)]:px-4',\n 'tw:[&:not(:empty)]:py-1.5',\n ],\n 'block-end': [\n 'tw:order-last',\n 'tw:[&:not(:empty)]:w-full',\n 'tw:[&:not(:empty)]:px-4',\n 'tw:[&:not(:empty)]:py-1.5',\n ],\n },\n },\n },\n);\n\ntype Props = ComponentProps<'div'> & VariantProps<typeof addonVariants>;\n\nexport const InputGroupAddon = ({\n children,\n align = 'inline-start',\n className,\n ...props\n}: Props) => (\n <div {...props} data-align={align} className={cn(addonVariants({ align, className }))}>\n {children}\n </div>\n);\n","import type { ComponentProps } from 'react';\n\nimport { cn } from '../../utils';\nimport { Button } from '../Button';\n\ntype ButtonProps = ComponentProps<typeof Button>;\n\ntype Props = Omit<ButtonProps, 'size' | 'block' | 'variant'>;\n\nexport const InputGroupButton = ({ ref, className, tabIndex = -1, ...props }: Props) => (\n <Button\n {...props}\n tabIndex={tabIndex}\n ref={ref}\n variant=\"invisible\"\n size=\"icon-sm\"\n className={cn('tw:size-5', 'tw:[&_svg]:text-muted-foreground', className)}\n />\n);\n","import type { ComponentProps } from 'react';\n\nimport { cn } from '../../utils';\n\ntype Props = ComponentProps<'input'>;\n\nexport const InputGroupInput = ({ ref, className, ...inputProps }: Props) => (\n <input\n {...inputProps}\n ref={ref}\n className={cn(\n 'tw:flex-1',\n 'tw:min-w-0',\n 'tw:bg-transparent',\n 'tw:outline-hidden',\n\n // font\n 'tw:font-sans',\n 'tw:text-sm',\n\n // placeholder\n 'tw:placeholder:text-neutral-400',\n 'tw:placeholder:font-normal',\n\n // disabled\n 'tw:disabled:cursor-not-allowed',\n\n className,\n )}\n />\n);\n","import type { ComponentProps } from 'react';\n\nimport { cn } from '../../utils';\n\ntype Props = ComponentProps<'span'>;\n\nexport const InputGroupText = ({ className, ...props }: Props) => (\n <span\n className={cn(\n 'tw:flex',\n 'tw:items-center',\n 'tw:gap-2',\n 'tw:text-sm',\n 'tw:text-muted-foreground',\n 'tw:[&_svg]:pointer-events-none',\n 'tw:[&_svg:not([class*=\"tw:size-\"])]:size-4',\n className,\n )}\n {...props}\n />\n);\n","import type { ChangeEventHandler, ComponentProps, FocusEventHandler } from 'react';\nimport TextareaAutosize from 'react-textarea-autosize';\n\nimport { cn } from '../../utils';\n\ntype TextareaNativeProps = Omit<\n ComponentProps<typeof TextareaAutosize>,\n 'value' | 'defaultValue' | 'rows' | 'maxRows'\n>;\n\ntype Props = TextareaNativeProps & {\n value?: string | null;\n defaultValue?: string | null;\n onValueChange?: (value: string) => void;\n onValueBlur?: (value: string) => void;\n maxRows?: number | 'unlimited';\n disableResize?: boolean;\n};\n\nexport const InputGroupTextArea = ({\n ref,\n className,\n onChange,\n onValueChange,\n value,\n defaultValue,\n onBlur,\n onValueBlur,\n disableResize = false,\n minRows = 1,\n maxRows = 4,\n ...props\n}: Props) => {\n const handleChange: ChangeEventHandler<HTMLTextAreaElement> = (event) => {\n onValueChange?.(event.target.value);\n onChange?.(event);\n };\n\n const handleBlur: FocusEventHandler<HTMLTextAreaElement> = (event) => {\n onValueBlur?.(event.target.value);\n onBlur?.(event);\n };\n\n return (\n <TextareaAutosize\n {...props}\n ref={ref}\n value={value ?? undefined}\n defaultValue={defaultValue ?? undefined}\n onChange={handleChange}\n onBlur={handleBlur}\n minRows={minRows}\n maxRows={maxRows === 'unlimited' ? undefined : maxRows}\n className={cn(\n 'tw:w-full',\n 'tw:bg-transparent',\n 'tw:outline-hidden',\n 'tw:px-4',\n\n // font\n 'tw:font-sans',\n 'tw:text-sm',\n\n // placeholder\n 'tw:placeholder:text-neutral-400',\n 'tw:placeholder:font-normal',\n\n // disabled\n 'tw:disabled:cursor-not-allowed',\n {\n 'tw:resize-none': disableResize,\n },\n\n className,\n )}\n />\n );\n};\n","import type { ComponentPropsWithRef } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\nimport { cn } from '../../utils';\nimport { useArgoDesign } from '../ThemeProvider/context';\n\nimport { InputGroupAddon } from './InputGroupAddon';\nimport { InputGroupButton } from './InputGroupButton';\nimport { InputGroupInput } from './InputGroupInput';\nimport { InputGroupText } from './InputGroupText';\nimport { InputGroupTextArea } from './InputGroupTextArea';\n\nconst inputGroupVariants = cva(\n [\n 'tailwindcss-preflight',\n 'tw:group',\n\n 'tw:overflow-hidden',\n 'tw:box-border',\n\n // positioning\n 'tw:flex',\n 'tw:items-center',\n\n // base — legacy (non-argo) chrome uses a fixed radius; argo overrides it with\n // the brand radius token in the `argo` variant below.\n 'tw:rounded',\n 'tw:border',\n 'tw:border-solid',\n // `border-input` rather than the fixed `neutral-200` — same light-scheme\n // grey, but it follows the dark scheme too. The base text stays pinned:\n // `secondary` and the readonly state below both fill with a fixed light\n // grey, so a scheme-following text colour would go light-on-light there.\n // `primary` opts into the token itself (and re-pins its readonly fill).\n 'tw:border-input',\n 'tw:text-neutral-800',\n 'tw:transition',\n\n // focus\n 'tw:has-[:is(input,textarea):focus]:ring-4',\n\n // readonly\n 'tw:has-[:is(input,textarea)[readonly]]:bg-neutral-150',\n 'tw:has-[:is(input,textarea)[readonly]]:focus-within:ring-0',\n 'tw:has-[:is(input,textarea)[readonly]]:border-neutral-150',\n\n // disabled cursor (opacity owned by variant)\n 'tw:has-[:is(input,textarea):disabled]:cursor-not-allowed',\n\n // textarea: top-align addons, allow vertical expansion, own its y-padding\n 'tw:has-[textarea]:items-start',\n\n 'tw:has-[[data-align=block-start]:not(:empty)]:flex-wrap',\n 'tw:has-[[data-align=block-end]:not(:empty)]:flex-wrap',\n 'tw:[&>input]:has-[[data-align=block-start]:not(:empty)]:w-auto',\n 'tw:[&>input]:has-[[data-align=block-start]:not(:empty)]:flex-1',\n 'tw:[&>input]:has-[[data-align=block-end]:not(:empty)]:w-auto',\n 'tw:[&>input]:has-[[data-align=block-end]:not(:empty)]:flex-1',\n\n 'tw:[&_input]:px-4',\n 'tw:[&>input]:has-[[data-align=inline-start]:not(:empty)]:pl-2',\n 'tw:[&>input]:has-[[data-align=inline-end]:not(:empty)]:pr-2',\n ],\n {\n defaultVariants: {\n variant: 'primary',\n state: 'default',\n sizing: 'medium',\n focusVariant: 'default',\n },\n compoundVariants: [\n {\n variant: 'secondary',\n state: 'error',\n className: ['tw:bg-error-100'],\n },\n {\n variant: 'secondary',\n state: 'warning',\n className: ['tw:bg-warning-100'],\n },\n {\n variant: 'primary',\n state: 'default',\n focusVariant: 'off',\n className: ['tw:has-[:is(input,textarea):focus]:border-neutral-200'],\n },\n {\n variant: 'secondary',\n state: 'default',\n focusVariant: 'off',\n className: ['tw:has-[:is(input,textarea):focus]:border-neutral-100'],\n },\n {\n variant: ['primary', 'secondary'],\n state: 'error',\n focusVariant: 'on',\n className: ['tw:!border-error-500', 'tw:!ring-error-200'],\n },\n {\n variant: ['primary', 'secondary'],\n state: 'warning',\n focusVariant: 'on',\n className: ['tw:!border-warning-500', 'tw:!ring-warning-200'],\n },\n // --- argo ---\n {\n variant: 'argo',\n state: 'default',\n className: [\n 'tw:has-[:is(input,textarea):focus]:border-primary',\n 'tw:has-[:is(input,textarea):focus]:ring-ring/50',\n ],\n },\n {\n variant: 'argo',\n state: 'error',\n className: [\n 'tw:border-destructive',\n 'tw:has-[:is(input,textarea):focus]:border-destructive',\n 'tw:has-[:is(input,textarea):focus]:ring-destructive/20',\n ],\n },\n {\n variant: 'argo',\n focusVariant: 'on',\n className: ['tw:!border-primary', 'tw:!ring-ring/50'],\n },\n {\n variant: 'argo',\n state: 'error',\n focusVariant: 'on',\n className: ['tw:!border-destructive', 'tw:!ring-destructive/20'],\n },\n {\n variant: 'argo',\n state: 'default',\n focusVariant: 'off',\n className: ['tw:has-[:is(input,textarea):focus]:border-input'],\n },\n ],\n variants: {\n focusVariant: {\n default: [],\n on: ['tw:!border-ring', 'tw:!ring-ring/30', 'tw:!ring-4'],\n off: ['tw:has-[:is(input,textarea):focus]:!ring-0'],\n },\n variant: {\n primary: [\n // The field-surface token — white in the light scheme, so this is a\n // no-op there; the dark scheme gets a field fill, not a white slab.\n 'tw:bg-input-background',\n 'tw:text-foreground',\n // The base readonly fill is a fixed light grey, which the scheme-following\n // text above would sit on invisibly in dark. Re-pin to the same\n // `muted`/`input` pair argo uses for exactly this reason.\n 'tw:has-[:is(input,textarea)[readonly]]:bg-muted',\n 'tw:has-[:is(input,textarea)[readonly]]:border-input',\n 'tw:has-[:is(input,textarea):disabled]:opacity-40',\n // aria-invalid on the control surfaces the error chrome without a `state` prop — the\n // accessible path (mirrors the `state=\"error\"` legacy tokens). Higher specificity than\n // the default focus selector, so it wins without `!important`.\n 'tw:has-[:is(input,textarea)[aria-invalid=true]]:border-error-500',\n 'tw:has-[:is(input,textarea)[aria-invalid=true]:focus]:border-error-500',\n 'tw:has-[:is(input,textarea)[aria-invalid=true]:focus]:ring-error-200',\n ],\n secondary: [\n 'tw:bg-neutral-100',\n 'tw:border-neutral-100',\n 'tw:has-[:is(input,textarea):disabled]:opacity-40',\n 'tw:has-[:is(input,textarea)[aria-invalid=true]]:border-error-500',\n 'tw:has-[:is(input,textarea)[aria-invalid=true]:focus]:border-error-500',\n 'tw:has-[:is(input,textarea)[aria-invalid=true]:focus]:ring-error-200',\n ],\n argo: [\n // argo follows the brand radius token (overrides the static base)\n 'tw:rounded-[var(--radius-lg,0.25rem)]',\n // muted filled input surface — gray, distinct from white containers; not the app-background token.\n // Deliberately `muted`, not the `input-background` field token legacy uses: argo's field is a\n // grey inset by design. Converging the two is a brand-value decision, not a component one.\n 'tw:bg-muted',\n 'tw:border-input',\n 'tw:text-foreground',\n 'tw:has-[:is(input,textarea):disabled]:opacity-50',\n // readonly: keep the themed input surface/border. The base layer's fixed\n // `neutral-150` (a light grey) is correct for the legacy light chrome but\n // collides with argo's themed `foreground` text — light-on-light, invisible\n // in dark mode. Re-pin to the same `muted`/`input` tokens the editable argo\n // input uses (validated AA), so readonly stays legible in every scheme.\n 'tw:has-[:is(input,textarea)[readonly]]:bg-muted',\n 'tw:has-[:is(input,textarea)[readonly]]:border-input',\n // higher specificity than has-[:is(input,textarea):focus] — prevents focus border on readonly\n 'tw:has-[:is(input,textarea)[readonly]:focus]:border-input',\n // aria-invalid on the control surfaces the error chrome without a `state` prop — the\n // accessible path (uses the themeable `destructive` status token).\n 'tw:has-[:is(input,textarea)[aria-invalid=true]]:border-destructive',\n 'tw:has-[:is(input,textarea)[aria-invalid=true]:focus]:border-destructive',\n 'tw:has-[:is(input,textarea)[aria-invalid=true]:focus]:ring-destructive/20',\n ],\n },\n sizing: {\n default: [\n 'tw:[&_:is(input,textarea)]:py-2.5',\n 'tw:[&_:is(input,textarea)]:leading-[18px]',\n 'tw:[&_textarea]:!min-h-[calc(2.5rem-2px)]',\n ],\n small: [\n 'tw:[&_:is(input,textarea)]:py-2',\n 'tw:[&_:is(input,textarea)]:leading-[16px]',\n 'tw:[&_textarea]:!min-h-[calc(2rem-2px)]',\n ],\n medium: [\n 'tw:[&_:is(input,textarea)]:py-2',\n 'tw:[&_:is(input,textarea)]:leading-[18px]',\n 'tw:[&_textarea]:!min-h-[calc(2.25rem-2px)]',\n ],\n },\n state: {\n default: [\n 'tw:has-[:is(input,textarea):focus]:border-ring',\n 'tw:has-[:is(input,textarea):focus]:ring-ring/30',\n ],\n error: [\n 'tw:border-error-500',\n 'tw:has-[:is(input,textarea):focus]:border-error-500',\n 'tw:has-[:is(input,textarea):focus]:ring-error-200',\n ],\n warning: [\n 'tw:border-warning-500',\n 'tw:has-[:is(input,textarea):focus]:border-warning-500',\n 'tw:has-[:is(input,textarea):focus]:ring-warning-200',\n ],\n },\n },\n },\n);\n\ntype Props = ComponentPropsWithRef<'div'> &\n Omit<VariantProps<typeof inputGroupVariants>, 'variant'> & {\n variant?: Exclude<VariantProps<typeof inputGroupVariants>['variant'], 'argo'>;\n };\n\nconst InputGroupRoot = ({\n ref,\n children,\n state,\n variant,\n sizing,\n focusVariant,\n className,\n ...props\n}: Props) => {\n const isArgo = useArgoDesign();\n const effectiveVariant = isArgo ? 'argo' : variant;\n const effectiveSizing = effectiveVariant === 'argo' ? 'medium' : sizing;\n return (\n <div\n {...props}\n ref={ref}\n className={cn(\n inputGroupVariants({\n state,\n variant: effectiveVariant,\n sizing: effectiveSizing,\n focusVariant,\n className,\n }),\n )}\n >\n {children}\n </div>\n );\n};\n\nexport const InputGroup = InputGroupRoot as typeof InputGroupRoot & {\n Input: typeof InputGroupInput;\n Addon: typeof InputGroupAddon;\n Button: typeof InputGroupButton;\n TextArea: typeof InputGroupTextArea;\n Text: typeof InputGroupText;\n};\n\nInputGroup.Input = InputGroupInput;\nInputGroup.Addon = InputGroupAddon;\nInputGroup.Button = InputGroupButton;\nInputGroup.TextArea = InputGroupTextArea;\nInputGroup.Text = InputGroupText;\n"],"mappings":"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D;EACA,SAAS;GACP,SAAS;IAGP;IACA;IAIA;IACA;IACA;IAIA;IACA;IACA;GACF;GACA,WAAW;IACT;IACA;IACA;IACA;IACA;IACA;GACF;GACA,MAAM;IAEJ;IAIA;IACA;IACA;IACA;IAMA;IACA;IAEA;IAGA;IACA;IACA;GACF;EACF;EACA,QAAQ;GACN,SAAS;IACP;IACA;IACA;GACF;GACA,OAAO;IACL;IACA;IACA;GACF;GACA,QAAQ;IACN;IACA;IACA;GACF;EACF;EACA,OAAO;GACL,SAAS,CACP,kDACA,iDACF;GACA,OAAO;IACL;IACA;IACA;GACF;GACA,SAAS;IACP;IACA;IACA;GACF;EACF;CACF;AACF,CACF;AAOA,MAAM,kBAAkB,EACtB,KACA,UACA,OACA,SACA,QACA,cACA,WACA,GAAG,YACQ;CAEX,MAAM,mBADS,cACe,IAAI,SAAS;CAC3C,MAAM,kBAAkB,qBAAqB,SAAS,WAAW;CACjE,OACE,oBAAC,OAAD;EACE,GAAI;EACC;EACL,WAAW,GACT,mBAAmB;GACjB;GACA,SAAS;GACT,QAAQ;GACR;GACA;EACF,CAAC,CACH;EAEC;CACE,CAAA;AAET;AAEA,MAAa,aAAa;AAQ1B,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,SAAS;AACpB,WAAW,WAAW;AACtB,WAAW,OAAO"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ModalTitle-C76ke2eo.js","names":[],"sources":["../src/components/Modal/ModalOverlay.tsx","../src/components/Modal/ModalDescription.tsx","../src/components/Modal/ModalTitle.tsx"],"sourcesContent":["import type { ComponentProps } from 'react';\nimport { Overlay } from '@radix-ui/react-dialog';\n\nimport { cn } from '../../utils';\n\ntype Props = ComponentProps<typeof Overlay> & {\n disableTransition?: boolean;\n};\n\nexport const ModalOverlay = ({ ref, className, disableTransition = false, ...props }: Props) => (\n <Overlay\n {...props}\n ref={ref}\n className={cn(\n // positioning\n 'tw:fixed',\n 'tw:inset-0',\n 'tw:z-[1051]',\n\n // background\n 'tw:bg-black/50',\n\n // opening animation\n 'tw:data-[state=open]:duration-500',\n 'tw:data-[state=open]:fade-in-0',\n\n // closing animation\n 'tw:data-[state=closed]:duration-500',\n 'tw:data-[state=closed]:fade-out-0',\n {\n 'tw:data-[state=open]:animate-in tw:data-[state=closed]:animate-out': !disableTransition,\n },\n className,\n )}\n onClick={(event) => event.stopPropagation()}\n />\n);\n","import type { ComponentProps } from 'react';\nimport * as DialogPrimitive from '@radix-ui/react-dialog';\n\nimport { cn } from '../../utils';\n\ntype Props = ComponentProps<typeof DialogPrimitive.Description>;\n\nexport const ModalDescription = ({ className, ...props }: Props) => (\n <DialogPrimitive.Description\n className={cn(\n 'tw:text-sm',\n 'tw:font-sans',\n 'tw:tracking-normal',\n 'tw:font-normal',\n 'tw:text-neutral-400',\n className,\n )}\n {...props}\n />\n);\n","import type { ComponentProps } from 'react';\nimport { Title } from '@radix-ui/react-dialog';\n\nimport { cn } from '../../utils';\n\ntype Props = ComponentProps<typeof Title>;\n\nexport const ModalTitle = ({ children, className, ...props }: Props) => (\n <Title\n {...props}\n className={cn('tw:flex-1', 'tw:break-anywhere', 'tw:text-base', 'tw:font-semibold', className)}\n >\n {children}\n </Title>\n);\n"],"mappings":";;;;;AASA,MAAa,gBAAgB,EAAE,KAAK,WAAW,oBAAoB,OAAO,GAAG,YAC3E,oBAAC,SAAD;CACE,GAAI;CACC;CACL,WAAW,GAET,YACA,cACA,eAGA,kBAGA,qCACA,kCAGA,uCACA,qCACA,EACE,sEAAsE,CAAC,kBACzE,GACA,SACF;CACA,UAAU,UAAU,MAAM,gBAAgB;AAC3C,CAAA;;;AC5BH,MAAa,oBAAoB,EAAE,WAAW,GAAG,YAC/C,oBAAC,gBAAgB,aAAjB;CACE,WAAW,GACT,cACA,gBACA,sBACA,kBACA,uBACA,SACF;CACA,GAAI;AACL,CAAA;;;ACXH,MAAa,cAAc,EAAE,UAAU,WAAW,GAAG,YACnD,oBAAC,OAAD;CACE,GAAI;CACJ,WAAW,GAAG,aAAa,qBAAqB,gBAAgB,oBAAoB,SAAS;CAE5F;AACI,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Sidebar-CTWsHZhF.js","names":[],"sources":["../src/components/Sidebar/SidebarProvider/useTransitionPresence.ts","../src/components/Sidebar/SidebarContent.tsx","../src/components/Sidebar/utils.ts","../src/components/Sidebar/SidebarProvider/context.ts","../src/components/Sidebar/SidebarProvider/useHoverTracking.ts","../src/components/Sidebar/SidebarProvider/useSidebarState.ts","../src/components/Sidebar/SidebarProvider/SidebarProvider.tsx","../src/components/Sidebar/SidebarFillTrigger.tsx","../src/components/Sidebar/SidebarFooter.tsx","../src/components/Sidebar/SidebarGroup/SidebarGroup.tsx","../src/components/Sidebar/SidebarGroup/SidebarGroupContent.tsx","../src/components/Sidebar/SidebarGroup/SidebarGroupAction.tsx","../src/components/Sidebar/SidebarGroup/SidebarGroupLabel.tsx","../src/components/Sidebar/SidebarInstanceContext.ts","../src/components/Sidebar/SidebarHeader.tsx","../src/components/Sidebar/SidebarMenu/SidebarMenu.tsx","../src/components/Sidebar/SidebarMenu/SidebarMenuIcon.tsx","../src/components/Sidebar/SidebarMenu/SidebarMenuButton.tsx","../src/components/Sidebar/SidebarMenu/SidebarMenuItem.tsx","../src/components/Sidebar/SidebarMenu/SidebarMenuAction.tsx","../src/components/Sidebar/SidebarMenu/SidebarSearchInput.tsx","../src/components/Sidebar/SidebarMenu/SidebarMenuCard.tsx","../src/components/Sidebar/SidebarMenu/SidebarMenuBadge.tsx","../src/components/Sidebar/SidebarMenu/SidebarMenuSub.tsx","../src/components/Sidebar/SidebarMenu/SidebarMenuSubItem.tsx","../src/components/Sidebar/useResizeSidebar.ts","../src/components/Sidebar/SidebarResizeHandle.tsx","../src/components/Sidebar/SidebarSeparator.tsx","../src/components/Sidebar/SidebarTrigger.tsx","../src/components/Sidebar/Sidebar.tsx"],"sourcesContent":["import { useEffect, useLayoutEffect, useMemo, useReducer } from 'react';\n\ntype MountState = 'mounted' | 'enterSuspended' | 'unmountSuspended' | 'unmounted';\ntype MountEvent = 'MOUNT' | 'ENTER' | 'TRANSITION_OUT' | 'TRANSITION_END';\n\ntype UseTransitionPresenceOptions = {\n mounted: boolean;\n keepMounted?: boolean;\n /** Hold the subtree back until the enter transition ends — a heavy mount in the same commit blocks every frame of it. */\n mountAfterEnter?: boolean;\n};\n\nconst FALLBACK_TIMEOUT_MS = 500;\n\n/** Under reduced motion there is no `transitionend` to wait for, so the mount is not deferred. */\nconst prefersReducedMotion = () =>\n typeof window !== 'undefined' &&\n (window.matchMedia?.('(prefers-reduced-motion: reduce)').matches ?? false);\n\nconst reducer = (state: MountState, event: MountEvent): MountState => {\n switch (event) {\n case 'MOUNT':\n return 'mounted';\n case 'ENTER':\n // Already-mounted content stays put; only a cold open waits.\n return state === 'unmounted' ? 'enterSuspended' : 'mounted';\n case 'TRANSITION_OUT':\n // Closed before the content arrived: nothing to animate out.\n if (state === 'enterSuspended') return 'unmounted';\n return state === 'mounted' ? 'unmountSuspended' : state;\n case 'TRANSITION_END':\n if (state === 'unmountSuspended') return 'unmounted';\n if (state === 'enterSuspended') return 'mounted';\n return state;\n default:\n return state;\n }\n};\n\nexport const useTransitionPresence = ({\n mounted,\n keepMounted = false,\n mountAfterEnter = false,\n}: UseTransitionPresenceOptions) => {\n const [state, send] = useReducer(reducer, mounted ? 'mounted' : 'unmounted');\n\n useLayoutEffect(() => {\n if (keepMounted) return;\n if (!mounted) {\n send('TRANSITION_OUT');\n return;\n }\n send(mountAfterEnter && !prefersReducedMotion() ? 'ENTER' : 'MOUNT');\n }, [mounted, keepMounted, mountAfterEnter]);\n\n // Fallback for both suspensions when `onTransitionEnd` never fires.\n useEffect(() => {\n if (state !== 'unmountSuspended' && state !== 'enterSuspended') return;\n\n const id = setTimeout(() => send('TRANSITION_END'), FALLBACK_TIMEOUT_MS);\n return () => clearTimeout(id);\n }, [state]);\n\n return useMemo(\n () => ({\n isMounted: keepMounted || state === 'mounted' || state === 'unmountSuspended',\n /** Resolves whichever transition the subtree is waiting on. */\n completeUnmount: () => send('TRANSITION_END'),\n }),\n [state, keepMounted],\n );\n};\n","import type { ComponentProps, ReactNode } from 'react';\n\nimport { useScrollbarPosition } from '../../hooks/useScrollbarPosition';\nimport { cn, mergeRefs } from '../../utils';\nimport { ScrollArea } from '../ScrollArea';\n\ntype Props = {\n className?: string;\n children?: ReactNode;\n contentRef?: ComponentProps<'div'>['ref'];\n ref?: ComponentProps<'div'>['ref'];\n};\n\nexport const SidebarContent = ({ ref, className, children, contentRef }: Props) => {\n const { setElement, isBottom, isTop, isMiddle } = useScrollbarPosition();\n const mergedRefs = mergeRefs(ref ?? null, (ref) => setElement(ref));\n\n return (\n <ScrollArea\n ref={mergedRefs}\n type=\"scroll\"\n className=\"tw:group/sidebar-content tw:flex-1\"\n data-slot=\"sidebar-content\"\n scrollBarClassName=\"tw:w-1.5\"\n viewPortClassName={cn(\n 'tw:overflow-x-hidden',\n 'tw:overscroll-contain',\n 'tw:[&>div]:!flex', // overflow fix for scrollbar\n // Hide scroll-position-based borders (top/bottom) if SidebarHeader or SidebarFooter is omitted.\n 'tw:group-first/sidebar-content:before:hidden',\n 'tw:group-last/sidebar-content:after:hidden',\n 'tw:!box-border',\n {\n 'tw:before:absolute tw:before:top-0 tw:before:left-0 tw:before:right-0 tw:before:h-px tw:before:bg-sidebar-border tw:before:z-10 tw:before:content-[\"\"]':\n isBottom || isMiddle,\n 'tw:after:absolute tw:after:bottom-0 tw:after:left-0 tw:after:right-0 tw:after:h-px tw:after:bg-sidebar-border tw:after:z-10 tw:after:content-[\"\"]':\n isTop || isMiddle,\n },\n )}\n >\n <div\n ref={contentRef}\n className={cn(\n 'tw:flex',\n 'tw:flex-1',\n 'tw:flex-col',\n 'tw:gap-1',\n 'tw:overflow-x-hidden',\n 'tw:p-2',\n className,\n )}\n >\n {children}\n </div>\n </ScrollArea>\n );\n};\n","import type { SidebarCollapsible, SidebarMode, SidebarState, SidebarVariant } from './types';\n\nexport const SidebarWidthInPx = {\n MIN_DEFAULT: 256,\n\n // 8 px / 36 px / 8 px = 52 px\n // left padding / icon width / right padding\n COLLAPSED_ICON: 52,\n\n // padding from every side for floating variant (see --sidebar-floating-padding)\n FLOATING_VARIANT_PADDING: 8,\n} as const;\n\nconst floatingSideCount: Record<SidebarVariant, number> = {\n 'sided-floating': 1,\n floating: 2,\n inset: 0,\n none: 0,\n};\n\ntype Input = {\n variant: SidebarVariant;\n width?: number;\n collapsible: SidebarCollapsible;\n mode: SidebarMode;\n state: SidebarState;\n};\n\ntype EffectiveWidths = {\n sidebar: number;\n gap: number;\n fill: number;\n};\n\nexport const calcEffectiveWidths = ({\n variant,\n width: customWidth,\n collapsible,\n state,\n mode,\n}: Input) => {\n if (variant === 'none') return { sidebar: 0, gap: 0, fill: 0 };\n\n const padding = floatingSideCount[variant] * SidebarWidthInPx.FLOATING_VARIANT_PADDING;\n const width = Math.max(customWidth ?? 0, SidebarWidthInPx.MIN_DEFAULT) + padding;\n const iconWidth = SidebarWidthInPx.COLLAPSED_ICON + padding;\n const isExpanded = state === 'expanded';\n\n // Only compensate for floating padding when this sidebar itself has padding,\n // so the opposite filled sidebar doesn't double-count the gap.\n const reduction = variant === 'inset' ? 0 : SidebarWidthInPx.FLOATING_VARIANT_PADDING;\n\n const iconWidths = ((): EffectiveWidths => {\n const sidebar = isExpanded ? width : iconWidth;\n const gap = mode === 'expand-on-hover' ? iconWidth : sidebar;\n // Use gap (not sidebar) so the opposite filled sidebar stays stable\n // during expand-on-hover — gap stays at iconWidth while sidebar grows\n const fill = gap - reduction;\n return { sidebar, gap, fill };\n })();\n\n const offCanvasWidths = ((): EffectiveWidths => {\n const sidebar = width; //We use CSS translate to hide elements because it allows for transitions without shrinking the width.\n const gap = isExpanded ? width : SidebarWidthInPx.FLOATING_VARIANT_PADDING; // The gap is invisible and needs to be shrunk to move the content to its place.\n const fill = gap - reduction;\n return { sidebar, gap, fill };\n })();\n\n return collapsible === 'icon' ? iconWidths : offCanvasWidths;\n};\n","import { createContext, use } from 'react';\n\nimport type { SidebarCollapsible, SidebarSide, SidebarVariant } from '../types';\nimport type { calcEffectiveWidths } from '../utils';\n\nimport type { useSidebarState } from './useSidebarState';\n\ntype SidebarWidths = ReturnType<typeof calcEffectiveWidths>;\ntype SidebarState = ReturnType<typeof useSidebarState>;\n\ntype SidebarSideValue = SidebarState & {\n isFill: boolean;\n toggleFill: () => void;\n /** Idempotent counterpart to `toggleFill` — safe to call twice, or when already in that state. */\n setFill: (fill: boolean) => void;\n widths: SidebarWidths;\n collapsible: SidebarCollapsible;\n variant: SidebarVariant;\n baseWidth: number | undefined;\n onWidthChange: ((width: number) => void) | undefined;\n setDragWidth: (width: number | null) => void;\n isDragging: boolean;\n setIsDragging: (dragging: boolean) => void;\n};\n\nexport type SidebarContextValue = {\n left: SidebarSideValue;\n right: SidebarSideValue;\n};\n\nexport const SidebarContext = createContext<SidebarContextValue | null>(null);\n\n/**\n * The sidebar if there is one, `null` otherwise — for code that ENHANCES a page when the app shell is\n * around it (borrowing width, collapsing a panel) and must still render without one, in a test, a\n * story, or an embedded surface. Anything that genuinely requires a sidebar keeps `useSidebar`.\n */\nexport const useOptionalSidebar = (side: SidebarSide = 'left'): SidebarSideValue | null =>\n use(SidebarContext)?.[side] ?? null;\n\nexport const useSidebar = (side: SidebarSide = 'left'): SidebarSideValue => {\n const context = use(SidebarContext);\n if (context === null) throw new Error('useSidebar must be used within a SidebarProvider.');\n return context[side];\n};\n","import { useEffect, useRef, useState } from 'react';\n\n/**\n * CSS selectors matching portal-based overlay triggers in their open state.\n *\n * The sidebar's hover tracking ignores `mouseleave` while any of these selectors\n * match inside the sidebar DOM — preventing the sidebar from collapsing while the\n * user interacts with portal content rendered outside the sidebar tree.\n *\n * Update this list when changing or adding new components:\n */\nconst PORTAL_OPEN_SELECTORS = [\n '[aria-haspopup=\"menu\"][aria-expanded=true]', // DropdownMenu\n '[aria-haspopup=\"dialog\"][aria-expanded=true]', // Popover, Dialogs (Modal, Sheet)\n];\n\nconst PORTAL_OPEN_SELECTORS_STRING = PORTAL_OPEN_SELECTORS.join(',');\n\nexport const useHoverTracking = (sidebarElement: HTMLElement | null) => {\n const [isHovered, setIsHovered] = useState(false);\n const isLockedRef = useRef(false);\n\n useEffect(() => {\n if (!sidebarElement) return;\n\n const handleMouseEnter = () => setIsHovered(true);\n const handleMouseLeave = () => {\n if (isLockedRef.current) return;\n setIsHovered(false);\n };\n\n sidebarElement.addEventListener('mouseenter', handleMouseEnter);\n sidebarElement.addEventListener('mouseleave', handleMouseLeave);\n\n return () => {\n sidebarElement.removeEventListener('mouseenter', handleMouseEnter);\n sidebarElement.removeEventListener('mouseleave', handleMouseLeave);\n };\n }, [sidebarElement]);\n\n useEffect(() => {\n if (!sidebarElement) return;\n let animationFrameId: number;\n\n const observer = new MutationObserver(() => {\n const hasOpenPortal = sidebarElement.querySelector(PORTAL_OPEN_SELECTORS_STRING) !== null;\n isLockedRef.current = hasOpenPortal;\n\n if (hasOpenPortal) return;\n\n animationFrameId = requestAnimationFrame(() => {\n setIsHovered(sidebarElement.matches(':hover'));\n });\n });\n\n // Sync lock state immediately in case a portal trigger is already open on mount.\n isLockedRef.current = sidebarElement.querySelector(PORTAL_OPEN_SELECTORS_STRING) !== null;\n\n observer.observe(sidebarElement, {\n attributes: true,\n attributeFilter: ['aria-expanded'],\n subtree: true,\n });\n\n return () => {\n cancelAnimationFrame(animationFrameId);\n observer.disconnect();\n };\n }, [sidebarElement]);\n\n return isHovered;\n};\n","import { useCallback, useMemo, useState } from 'react';\n\nimport { useElement } from '../../../hooks/useElement';\nimport type { SidebarMode, SidebarState } from '../types';\n\nimport { useHoverTracking } from './useHoverTracking';\n\ntype Props = {\n defaultMode?: SidebarMode;\n mode?: SidebarMode;\n onModeChange?: (state: SidebarMode) => void;\n};\n\nexport const useSidebarState = ({ defaultMode, mode: modeProp, onModeChange }: Props) => {\n const [sidebarElement, setSidebarElement] = useElement();\n const isHovered = useHoverTracking(sidebarElement);\n const [_mode, _setMode] = useState(defaultMode ?? 'expanded');\n const mode = modeProp ?? _mode;\n\n const setMode = useCallback(\n (dispatch: Parameters<typeof _setMode>[0]) => {\n const newState = typeof dispatch === 'function' ? dispatch(mode) : dispatch;\n const set = onModeChange ?? _setMode;\n set(newState);\n },\n [onModeChange, mode],\n );\n\n const toggle = useCallback(() => {\n setMode((currState) => (currState === 'expanded' ? 'collapsed' : 'expanded'));\n }, [setMode]);\n\n const state: SidebarState = (() => {\n if (mode === 'expand-on-hover') return isHovered ? 'expanded' : 'collapsed';\n return mode;\n })();\n\n return useMemo(\n () => ({\n isHovered,\n toggle,\n setMode,\n mode,\n state,\n sidebarElement,\n setSidebarElement,\n }),\n [isHovered, toggle, setMode, mode, state, sidebarElement, setSidebarElement],\n );\n};\n","import { type ReactNode, useCallback, useMemo, useState } from 'react';\n\nimport type { SidebarCollapsible, SidebarMode, SidebarSide, SidebarVariant } from '../types';\nimport { calcEffectiveWidths } from '../utils';\n\nimport type { SidebarContextValue } from './context';\nimport { SidebarContext } from './context';\nimport { useSidebarState } from './useSidebarState';\n\nconst DEFAULT_SIDEBAR_VARIANT: SidebarVariant = 'none';\nconst DEFAULT_SIDEBAR_MODE: SidebarMode = 'expanded';\nconst DEFAULT_SIDEBAR_COLLAPSIBLE: SidebarCollapsible = 'off-canvas';\n\ntype Props = {\n children?: ReactNode;\n // left state\n defaultLeftMode?: SidebarMode;\n leftMode?: SidebarMode;\n onLeftModeChange?: (mode: SidebarMode) => void;\n\n // right state\n defaultRightMode?: SidebarMode;\n rightMode?: SidebarMode;\n onRightModeChange?: (mode: SidebarMode) => void;\n\n // left\n leftVariant?: SidebarVariant;\n leftWidth?: number;\n leftCollapsible?: SidebarCollapsible;\n\n // right\n rightVariant?: SidebarVariant;\n rightWidth?: number;\n rightCollapsible?: SidebarCollapsible;\n\n // width change callbacks\n onLeftWidthChange?: (width: number) => void;\n onRightWidthChange?: (width: number) => void;\n\n // fill\n defaultFilledSide?: SidebarSide | null;\n};\n\nexport const SidebarProvider = ({\n children,\n // left state\n defaultLeftMode = DEFAULT_SIDEBAR_MODE,\n leftMode,\n onLeftModeChange,\n\n // right state\n defaultRightMode = DEFAULT_SIDEBAR_MODE,\n rightMode,\n onRightModeChange,\n\n // left\n leftCollapsible = DEFAULT_SIDEBAR_COLLAPSIBLE,\n leftVariant = DEFAULT_SIDEBAR_VARIANT,\n leftWidth,\n\n // right\n rightCollapsible = DEFAULT_SIDEBAR_COLLAPSIBLE,\n rightVariant = DEFAULT_SIDEBAR_VARIANT,\n rightWidth,\n\n // width change callbacks\n onLeftWidthChange,\n onRightWidthChange,\n\n // fill\n defaultFilledSide = null,\n}: Props) => {\n const [filledSide, setFilledSide] = useState<SidebarSide | null>(defaultFilledSide);\n const [isLeftDragging, setIsLeftDragging] = useState(false);\n const [isRightDragging, setIsRightDragging] = useState(false);\n const [leftDragWidth, setLeftDragWidth] = useState<number | null>(null);\n const [rightDragWidth, setRightDragWidth] = useState<number | null>(null);\n\n // Clear the local drag override the moment it matches the controlled width, so a\n // later width prop change isn't masked by a stale override (`baseWidth` is\n // `dragWidth ?? width`). Done during render rather than in an effect: it\n // converges (the override becomes null, so it can't loop) and triggers on a\n // change to either the prop or the drag width — matching the original effect,\n // whose dependency array also watched the drag width.\n if (leftDragWidth !== null && leftWidth === leftDragWidth) setLeftDragWidth(null);\n if (rightDragWidth !== null && rightWidth === rightDragWidth) setRightDragWidth(null);\n\n const leftState = useSidebarState({\n defaultMode: defaultLeftMode,\n mode: leftMode,\n onModeChange: onLeftModeChange,\n });\n\n const rightState = useSidebarState({\n defaultMode: defaultRightMode,\n mode: rightMode,\n onModeChange: onRightModeChange,\n });\n\n const toggleLeftFill = useCallback(\n () => setFilledSide((prev) => (prev === 'left' ? null : 'left')),\n [],\n );\n const toggleRightFill = useCallback(\n () => setFilledSide((prev) => (prev === 'right' ? null : 'right')),\n [],\n );\n\n // Idempotent per side: unlike `toggleFill`, these need no knowledge of the current value, so\n // repeated calls for one side land on the value they ask for. Fill is a single slot, so two\n // sides asking at once still race — the last write wins.\n const setLeftFill = useCallback(\n (fill: boolean) => setFilledSide((prev) => (fill ? 'left' : prev === 'left' ? null : prev)),\n [],\n );\n const setRightFill = useCallback(\n (fill: boolean) => setFilledSide((prev) => (fill ? 'right' : prev === 'right' ? null : prev)),\n [],\n );\n\n const value = useMemo<SidebarContextValue>(\n () => ({\n left: {\n ...leftState,\n isFill: filledSide === 'left',\n toggleFill: toggleLeftFill,\n setFill: setLeftFill,\n widths: calcEffectiveWidths({\n variant: leftVariant,\n width: leftDragWidth ?? leftWidth,\n collapsible: leftCollapsible,\n state: leftState.state,\n mode: leftState.mode,\n }),\n collapsible: leftCollapsible,\n variant: leftVariant,\n baseWidth: leftDragWidth ?? leftWidth,\n onWidthChange: onLeftWidthChange,\n setDragWidth: setLeftDragWidth,\n isDragging: isLeftDragging,\n setIsDragging: setIsLeftDragging,\n },\n right: {\n ...rightState,\n isFill: filledSide === 'right',\n toggleFill: toggleRightFill,\n setFill: setRightFill,\n widths: calcEffectiveWidths({\n variant: rightVariant,\n width: rightDragWidth ?? rightWidth,\n collapsible: rightCollapsible,\n state: rightState.state,\n mode: rightState.mode,\n }),\n collapsible: rightCollapsible,\n variant: rightVariant,\n baseWidth: rightDragWidth ?? rightWidth,\n onWidthChange: onRightWidthChange,\n setDragWidth: setRightDragWidth,\n isDragging: isRightDragging,\n setIsDragging: setIsRightDragging,\n },\n }),\n [\n leftState,\n filledSide,\n toggleLeftFill,\n setLeftFill,\n leftVariant,\n leftWidth,\n leftDragWidth,\n leftCollapsible,\n onLeftWidthChange,\n isLeftDragging,\n rightState,\n toggleRightFill,\n setRightFill,\n rightVariant,\n rightWidth,\n rightDragWidth,\n rightCollapsible,\n onRightWidthChange,\n isRightDragging,\n ],\n );\n\n return <SidebarContext value={value}>{children}</SidebarContext>;\n};\n","import type { ComponentProps, MouseEventHandler } from 'react';\nimport { Slot } from '@radix-ui/react-slot';\n\nimport { useSidebar } from './SidebarProvider';\nimport type { SidebarSide } from './types';\n\ntype Props = ComponentProps<typeof Slot> & {\n side?: SidebarSide;\n};\n\nexport const SidebarFillTrigger = ({ ref, side = 'left', onClick, ...rest }: Props) => {\n const { toggleFill, isFill } = useSidebar(side);\n\n const handleOnClick: MouseEventHandler<HTMLElement> = (event) => {\n toggleFill();\n onClick?.(event);\n };\n\n return <Slot {...rest} ref={ref} onClick={handleOnClick} aria-selected={isFill} />;\n};\n","import type { ComponentProps } from 'react';\n\nimport { cn } from '../../utils';\n\ntype Props = ComponentProps<'div'>;\n\nexport const SidebarFooter = ({ className, ...props }: Props) => (\n <div\n data-slot=\"sidebar-footer\"\n className={cn('tw:flex', 'tw:flex-col', 'tw:gap-2', 'tw:p-2', className)}\n {...props}\n />\n);\n","import type { ComponentProps } from 'react';\n\nimport { cn } from '../../../utils';\n\ntype Props = ComponentProps<'div'>;\n\nexport const SidebarGroup = ({ className, ...props }: Props) => (\n <div\n className={cn(\n 'tw:group/sidebar-group',\n 'tw:relative',\n 'tw:w-full',\n\n // positioning\n 'tw:flex',\n 'tw:flex-col',\n 'tw:min-w-0',\n 'tw:rounded-lg',\n className,\n )}\n {...props}\n />\n);\n","import type { ComponentProps } from 'react';\n\nimport { cn } from '../../../utils';\n\ntype Props = ComponentProps<'div'>;\n\nexport const SidebarGroupContent = ({ className, ...props }: Props) => (\n <div\n className={cn(\n // positioning\n 'tw:flex',\n 'tw:flex-col',\n 'tw:gap-2',\n\n 'tw:w-full',\n className,\n )}\n {...props}\n />\n);\n","import type { ComponentProps } from 'react';\n\nimport { cn } from '../../../utils';\n\ntype Props = ComponentProps<'button'>;\n\nexport const SidebarGroupAction = ({\n ref,\n className,\n type = 'button',\n children,\n ...props\n}: Props) => (\n <button\n {...props}\n type={type}\n ref={ref}\n className={cn(\n 'tw:group-data-[state=collapsed]/sidebar:hidden',\n\n // positioning\n 'tw:absolute',\n 'tw:right-1.5',\n 'tw:top-2',\n 'tw:flex',\n 'tw:items-center',\n 'tw:justify-center',\n\n // sizing\n 'tw:size-5',\n\n // styles\n 'tw:text-neutral-800',\n 'tw:rounded-full',\n\n // svg defaults: size + colour\n 'tw:[&_svg:not([class*=\"tw:size-\"])]:size-3',\n 'tw:[&_svg]:text-neutral-400',\n 'tw:hover:[&_svg]:text-secondary-600',\n\n 'tw:hover:bg-neutral-100',\n\n 'tw:focus-visible:ring-4',\n 'tw:focus-visible:ring-ring/30',\n 'tw:focus-visible:outline',\n 'tw:focus-visible:outline-1',\n 'tw:focus-visible:outline-ring',\n className,\n )}\n >\n {children}\n </button>\n);\n","import type { ComponentProps, Ref } from 'react';\n\nimport { cn } from '../../../utils';\nimport { Separator } from '../../Separator';\n\ntype Props = ComponentProps<'div'>;\n\nexport const SidebarGroupLabel = ({\n ref,\n className,\n children,\n ...props\n}: Props & { ref?: Ref<HTMLDivElement> }) => (\n <div\n ref={ref}\n className={cn(\n 'tw:relative',\n // positioning\n 'tw:flex',\n 'tw:flex-col',\n 'tw:shrink-0',\n\n // styling\n 'tw:h-8',\n 'tw:px-2',\n 'tw:-mb-1',\n 'tw:rounded-lg',\n\n // text\n 'tw:uppercase',\n 'tw:font-sans',\n 'tw:text-xs',\n 'tw:tracking-[1px]',\n className,\n )}\n {...props}\n >\n <Separator\n orientation=\"horizontal\"\n size=\"3/4\"\n className={cn(\n 'tw:opacity-0',\n 'tw:group-data-[state=collapsed]/sidebar:opacity-100',\n\n // positioning\n 'tw:absolute',\n 'tw:w-full',\n 'tw:left-0',\n 'tw:top-1/2 tw:-translate-y-1/2',\n\n 'tw:transition-opacity',\n 'tw:duration-(--sidebar-motion-duration)',\n 'tw:ease-(--sidebar-motion-easing)',\n 'tw:motion-reduce:transition-none',\n )}\n />\n\n <span\n className={cn(\n 'tw:flex',\n 'tw:group-data-[state=collapsed]/sidebar:opacity-0',\n\n 'tw:items-center',\n 'tw:flex-1',\n 'tw:text-muted-foreground',\n 'tw:whitespace-nowrap',\n\n // transition\n 'tw:transition-opacity',\n 'tw:duration-(--sidebar-motion-duration)',\n 'tw:ease-(--sidebar-motion-easing)',\n 'tw:motion-reduce:transition-none',\n )}\n >\n {children}\n </span>\n </div>\n);\n","import { createContext, use } from 'react';\n\nimport type { SidebarMode, SidebarSide, SidebarState } from './types';\n\ntype SidebarInstanceContextValue = {\n state: SidebarState;\n mode: SidebarMode;\n side: SidebarSide;\n};\n\nexport const SidebarInstanceContext = createContext<SidebarInstanceContextValue | null>(null);\n\nexport const useSidebarInstance = () => {\n const context = use(SidebarInstanceContext);\n if (context === null)\n throw new Error('useSidebarInstance must be used within a SidebarInstanceContext.');\n return context;\n};\n","import { type ComponentProps, use } from 'react';\n\nimport { cn } from '../../utils';\nimport { BrandLogo } from '../BrandLogo';\n\nimport { SidebarInstanceContext } from './SidebarInstanceContext';\n\ntype Props = ComponentProps<'div'>;\n\nexport const SidebarHeader = ({ className, children, ...props }: Props) => {\n const instance = use(SidebarInstanceContext);\n // BrandLogo reads the nearest ThemeProvider (or the default context) and renders\n // null when the active brand ships no logo, so no provider gate is needed.\n const variant = instance?.state === 'collapsed' ? 'mark' : 'wordmark';\n const fallback = <BrandLogo variant={variant} className=\"tw:h-7\" />;\n\n return (\n <div\n data-slot=\"sidebar-header\"\n className={cn(\n 'tw:peer/sidebar-header',\n 'tw:flex',\n 'tw:flex-col',\n 'tw:gap-2',\n 'tw:p-2',\n className,\n )}\n {...props}\n >\n {children ?? fallback}\n </div>\n );\n};\n","import type { ComponentProps } from 'react';\n\nimport { cn } from '../../../utils';\n\ntype Props = ComponentProps<'ul'>;\n\nexport const SidebarMenu = ({ className, ...props }: Props) => (\n <ul\n data-sidebar=\"menu\"\n className={cn(\n 'tw:flex',\n 'tw:w-full',\n 'tw:min-w-0',\n 'tw:flex-col',\n 'tw:gap-1',\n\n // transition\n 'tw:transition-[margin,opacity]',\n 'tw:duration-(--sidebar-motion-duration)',\n 'tw:ease-(--sidebar-motion-easing)',\n 'tw:motion-reduce:transition-none',\n\n // TODO: remove when boostrap is gone\n 'tw:pl-0',\n className,\n )}\n {...props}\n />\n);\n","import type { ComponentProps } from 'react';\n\nimport { cn } from '../../../utils';\n\ntype Props = ComponentProps<'span'>;\n\nexport const SidebarMenuIcon = ({ ref, className, children, ...rest }: Props) => (\n <span\n {...rest}\n ref={ref}\n className={cn(\n 'tw:inline-flex',\n 'tw:items-center',\n 'tw:justify-center',\n 'tw:aspect-square',\n 'tw:shrink-0',\n 'tw:p-0.5',\n 'tw:text-sidebar-primary',\n 'tw:[&_svg:not([class*=\"tw:size-\"])]:size-4',\n className,\n )}\n >\n {children}\n </span>\n);\n","import type { ComponentProps, ReactNode, Ref } from 'react';\nimport { Root, Slottable } from '@radix-ui/react-slot';\n\nimport { cn } from '../../../utils';\nimport { Tooltip } from '../../Tooltip';\nimport { useSidebarInstance } from '../SidebarInstanceContext';\n\nimport { SidebarMenuIcon } from './SidebarMenuIcon';\n\ntype Props = ComponentProps<'button'> & {\n asChild?: boolean;\n tooltip?: ReactNode;\n icon?: ReactNode;\n};\n\nexport const SidebarMenuButton = ({\n ref,\n 'aria-selected': selected,\n className,\n children,\n asChild = false,\n icon,\n tooltip,\n ...props\n}: Props & { ref?: Ref<HTMLButtonElement> }) => {\n const Component = asChild ? Root : 'button';\n const { state, mode, side } = useSidebarInstance();\n\n const button = (\n <Component\n {...props}\n ref={ref}\n data-slot=\"sidebar-menu-button\"\n // `type` and `aria-selected` belong to a real <button>. With `asChild` the slot is\n // usually an <a> (the canonical nav item), where both are invalid — axe flags\n // `aria-selected` on a link as a critical violation. Mark the active link with\n // `aria-current=\"page\"` instead; it is styled identically below. `aria-selected`\n // is still forwarded when a caller passes it explicitly.\n {...(asChild ? {} : { type: 'button' as const })}\n {...(selected === undefined ? {} : { 'aria-selected': selected })}\n className={cn(\n 'tw:peer/sidebar-menu-button',\n 'tw:group/sidebar-menu-button',\n\n // if <SidebarMenuAction /> visible, prevent the text from being under the action button.\n 'tw:group-data-[state=expanded]/sidebar:group-has-[[data-slot=sidebar-menu-action][data-hover-only=false]]/sidebar-menu-item:pr-8',\n 'tw:group-data-[state=expanded]/sidebar:[&:has(+[data-slot=\"sidebar-menu-action\"])]:group-hover/sidebar-menu-item:pr-8',\n 'tw:group-data-[state=expanded]/sidebar:[&:has(+[data-slot=\"sidebar-menu-action\"])]:group-focus-within/sidebar-menu-item:pr-8',\n 'tw:group-data-[state=expanded]/sidebar:[&:has(+[data-slot=\"sidebar-menu-action\"][data-hover-only=true][data-state=open])]:pr-8',\n\n 'tw:flex',\n 'tw:w-full',\n 'tw:gap-2',\n 'tw:items-center',\n 'tw:z-10',\n 'tw:font-normal',\n 'tw:text-sidebar-foreground',\n 'tw:p-2',\n 'tw:whitespace-nowrap',\n 'tw:overflow-hidden',\n 'tw:rounded-lg',\n 'tw:text-start',\n 'tw:no-underline',\n 'tw:select-none',\n\n // hover\n 'tw:hover:not-disabled:bg-sidebar-accent',\n 'tw:hover:text-sidebar-accent-foreground',\n 'tw:focus:text-sidebar-accent-foreground', // anchor override\n 'tw:data-[slot=dropdown-menu-trigger]:data-[state=open]:bg-sidebar-accent',\n\n // disabled\n 'tw:disabled:opacity-50',\n 'tw:disabled:cursor-not-allowed',\n\n // active\n 'tw:aria-selected:font-medium',\n 'tw:aria-selected:bg-sidebar-accent',\n 'tw:aria-selected:cursor-default',\n // active for links https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Attributes/aria-current\n 'tw:aria-[current=page]:bg-sidebar-accent',\n 'tw:aria-[current=page]:font-medium',\n 'tw:aria-[current=page]:focus:text-sidebar-accent-foreground',\n\n // focus-visible\n 'tw:focus-visible:outline-hidden',\n 'tw:focus-visible:z-10',\n 'tw:focus-visible:ring-2',\n 'tw:focus-visible:ring-sidebar-ring/50',\n 'tw:focus-visible:text-sidebar-foreground', // anchor override\n className,\n )}\n // Explicitly set the tabIndex to 0 to ensure the button is focusable; in Safari, anchors are not focusable by default.\n tabIndex={0}\n >\n {icon && <SidebarMenuIcon>{icon}</SidebarMenuIcon>}\n <Slottable>{children}</Slottable>\n </Component>\n );\n\n const shouldShowTooltip = state === 'collapsed' && mode !== 'expand-on-hover' && tooltip;\n\n if (shouldShowTooltip) {\n const tooltipPlacement = side === 'right' ? 'left' : 'right';\n\n return (\n <Tooltip tooltip={tooltip} placement={tooltipPlacement} triggerAsChild>\n {button}\n </Tooltip>\n );\n }\n\n return button;\n};\n","import type { ComponentProps } from 'react';\n\nimport { cn } from '../../../utils';\n\ntype Props = ComponentProps<'li'>;\n\nexport const SidebarMenuItem = ({ className, ...props }: Props) => (\n <li className={cn('tw:group/sidebar-menu-item', 'tw:relative', className)} {...props} />\n);\n","import type { ComponentProps } from 'react';\nimport { Slot } from '@radix-ui/react-slot';\n\nimport { cn } from '../../../utils';\n\ntype Props = ComponentProps<'button'> & {\n asChild?: boolean;\n showOnHover?: boolean;\n};\n\nexport const SidebarMenuAction = ({\n ref,\n className,\n asChild = false,\n showOnHover = false,\n children,\n ...props\n}: Props) => {\n const Comp = asChild ? Slot : 'button';\n return (\n <Comp\n {...props}\n data-slot=\"sidebar-menu-action\"\n data-hover-only={showOnHover}\n ref={ref}\n className={cn(\n 'tw:absolute',\n 'tw:top-1/2',\n 'tw:-translate-y-1/2',\n 'tw:right-3',\n 'tw:z-10',\n 'tw:p-0.5',\n\n // display\n 'tw:flex',\n 'tw:items-center',\n 'tw:justify-center',\n 'tw:aspect-square',\n\n // hiding\n 'tw:data-[hover-only=true]:opacity-0',\n 'tw:group-data-[state=collapsed]/sidebar:hidden',\n\n 'tw:group-data-[state=expanded]/sidebar:group-hover/sidebar-menu-item:opacity-100',\n 'tw:group-data-[state=expanded]/sidebar:group-focus-within/sidebar-menu-item:opacity-100', // keyboard navigation\n\n 'tw:group-data-[state=expanded]/sidebar:data-[hover-only=true]:data-[state=open]:opacity-100', // for triggers (dropdown, tooltip, popover)\n\n 'tw:size-4',\n 'tw:rounded',\n\n // icon styling\n 'tw:[&_svg]:shrink-0',\n 'tw:[&_svg:not([class*=\"tw:size-\"])]:size-3.5',\n 'tw:[&_svg]:text-sidebar-accent-foreground',\n\n // focus visible\n 'tw:focus-visible:outline-hidden',\n 'tw:focus-visible:z-10',\n 'tw:focus-visible:ring-2',\n 'tw:focus-visible:ring-sidebar-ring/50',\n 'tw:focus-visible:text-sidebar-foreground',\n className,\n )}\n >\n {children}\n </Comp>\n );\n};\n","import { useRef } from 'react';\nimport type { ComponentProps } from 'react';\n\nimport { Search } from '../../../icons';\nimport { cn, mergeRefs } from '../../../utils';\nimport { useSidebarInstance } from '../SidebarInstanceContext';\nimport { useSidebar } from '../SidebarProvider';\n\nconst wrapperClassnames = cn(\n 'tw:group/search-input',\n 'tw:relative',\n 'tw:flex',\n 'tw:items-center',\n 'tw:min-h-9',\n 'tw:rounded-lg',\n 'tw:border',\n 'tw:transition-all',\n\n // collapsed state - transparent border/bg, hover like search button\n 'tw:group-data-[state=collapsed]/sidebar:cursor-pointer',\n 'tw:group-data-[state=collapsed]/sidebar:border-transparent',\n 'tw:group-data-[state=collapsed]/sidebar:hover:bg-sidebar-accent',\n\n // expanded state - visible border/bg, padding for input, text cursor\n 'tw:group-data-[state=expanded]/sidebar:cursor-text',\n 'tw:group-data-[state=expanded]/sidebar:px-2',\n 'tw:group-data-[state=expanded]/sidebar:border-neutral-200',\n\n // focus styles (only relevant when expanded)\n 'tw:focus-within:ring-2',\n 'tw:focus-within:ring-sidebar-ring/50',\n 'tw:focus-within:text-sidebar-foreground',\n);\n\ntype Props = Omit<ComponentProps<'input'>, 'prefix'>;\n\nexport const SidebarSearchInput = ({ ref: forwardedRef, className, ...inputProps }: Props) => {\n const { side } = useSidebarInstance();\n const { setMode } = useSidebar(side);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const handleFocus = () => {\n setMode('expanded');\n };\n\n return (\n <div className={cn(wrapperClassnames, className)}>\n <Search\n className={cn(\n 'tw:pointer-events-none',\n 'tw:absolute',\n 'tw:left-2',\n 'tw:size-4',\n\n 'tw:text-sidebar-primary',\n 'tw:group-data-[state=expanded]/sidebar:text-neutral-400',\n )}\n />\n <input\n ref={mergeRefs(forwardedRef ?? null, inputRef)}\n {...inputProps}\n onFocus={(e) => {\n handleFocus();\n inputProps.onFocus?.(e);\n }}\n className={cn(\n 'tw:w-full',\n 'tw:bg-transparent',\n 'tw:text-sm',\n 'tw:font-sans',\n 'tw:outline-hidden',\n 'tw:placeholder:text-neutral-400',\n\n // collapsed state - visually hidden but still focusable for a11y\n 'tw:group-data-[state=collapsed]/sidebar:opacity-0',\n 'tw:group-data-[state=collapsed]/sidebar:cursor-pointer',\n\n // expanded state\n 'tw:group-data-[state=expanded]/sidebar:pl-6',\n )}\n />\n </div>\n );\n};\n","import { useCallback, useState } from 'react';\nimport type { ComponentProps, HTMLAttributes, ReactNode } from 'react';\n\nimport { cn } from '../../../utils';\nimport { HoverCard } from '../../HoverCard';\nimport { useSidebarInstance } from '../SidebarInstanceContext';\nimport { useSidebar } from '../SidebarProvider';\n\nimport { SidebarMenuIcon } from './SidebarMenuIcon';\n\nconst Title = ({ children }: { children: ReactNode }) => (\n <div className=\"tw:flex tw:select-none tw:gap-2 tw:text-sm tw:font-semibold\">{children}</div>\n);\n\nconst Content = ({ children, className }: { children: ReactNode; className?: string }) => (\n <div\n className={cn(\n 'tw:whitespace-pre-line',\n 'tw:group-data-[fill=false]/sidebar:group-data-[state=collapsed]/sidebar:group-data-[collapsible=icon]/sidebar:invisible',\n className,\n )}\n >\n {children}\n </div>\n);\n\ntype Props = HTMLAttributes<HTMLDivElement> & {\n icon: ReactNode;\n title: ReactNode;\n};\n\nexport const SidebarMenuCard = ({ children, className, icon, title, ...rest }: Props) => {\n const [isOpen, setIsOpen] = useState(false);\n const { side = 'left' } = useSidebarInstance();\n const { state, isFill } = useSidebar(side);\n const isExpanded = state === 'expanded' || isFill;\n\n const handleOnOpenChange: ComponentProps<typeof HoverCard>['onOpenChange'] = useCallback(\n (open: boolean) => {\n setIsOpen(isExpanded || document.hidden ? false : open);\n },\n [isExpanded],\n );\n\n return (\n <HoverCard open={isOpen} onOpenChange={handleOnOpenChange}>\n <HoverCard.Trigger asChild>\n <div\n {...rest}\n data-slot=\"sidebar-menu-card\"\n tabIndex={isExpanded ? -1 : 0}\n className={cn(\n 'tw:group/sidebar-menu-card',\n 'tw:peer/sidebar-menu-card',\n\n 'tw:overflow-hidden',\n\n 'tw:border',\n 'tw:border-sidebar-border',\n 'tw:rounded-2xl',\n\n // layout\n 'tw:grid',\n 'tw:grid-rows-[1fr]',\n 'tw:flex-1',\n 'tw:p-4',\n\n // icon collapsed\n 'tw:group-data-[fill=false]/sidebar:group-data-[state=collapsed]/sidebar:group-data-[collapsible=icon]/sidebar:p-2',\n 'tw:group-data-[fill=false]/sidebar:group-data-[state=collapsed]/sidebar:group-data-[collapsible=icon]/sidebar:border-transparent',\n 'tw:group-data-[fill=false]/sidebar:group-data-[state=collapsed]/sidebar:group-data-[collapsible=icon]/sidebar:grid-rows-[18px]',\n 'tw:group-data-[fill=false]/sidebar:group-data-[state=collapsed]/sidebar:group-data-[collapsible=icon]/sidebar:rounded-md',\n\n // focus-visible\n 'tw:outline-hidden',\n 'tw:group-data-[fill=false]/sidebar:group-data-[state=collapsed]/sidebar:group-data-[collapsible=icon]/sidebar:hover:bg-sidebar-accent',\n 'tw:group-data-[fill=false]/sidebar:group-data-[state=collapsed]/sidebar:group-data-[collapsible=icon]/sidebar:focus-visible:ring-2',\n 'tw:group-data-[fill=false]/sidebar:group-data-[state=collapsed]/sidebar:group-data-[collapsible=icon]/sidebar:focus-visible:ring-sidebar-ring/50',\n\n // transition\n 'tw:transition-[padding,border]',\n 'tw:duration-(--sidebar-motion-duration)',\n 'tw:ease-(--sidebar-motion-easing)',\n 'tw:motion-reduce:transition-none',\n )}\n >\n <div className=\"tw:flex tw:flex-col tw:gap-2\">\n <Title>\n <SidebarMenuIcon className=\"tw:p-px\">{icon}</SidebarMenuIcon>\n {title}\n </Title>\n <Content className={className}>{children}</Content>\n </div>\n </div>\n </HoverCard.Trigger>\n\n <HoverCard.Content\n sideOffset={10}\n align=\"center\"\n side={side === 'left' ? 'right' : 'left'}\n className=\"tw:flex tw:flex-col tw:gap-2\"\n >\n <Title>{title}</Title>\n <Content className={className}>{children}</Content>\n </HoverCard.Content>\n </HoverCard>\n );\n};\n","import type { ComponentProps } from 'react';\n\nimport { cn } from '../../../utils';\n\ntype Props = ComponentProps<'div'>;\n\nexport const SidebarMenuBadge = ({ ref, className, ...props }: Props) => {\n return (\n <div\n ref={ref}\n data-slot=\"sidebar-menu-badge\"\n data-sidebar=\"menu-badge\"\n className={cn(\n // layout\n 'tw:flex',\n 'tw:items-center',\n 'tw:justify-center',\n 'tw:z-20',\n\n 'tw:absolute',\n\n // menu button position\n 'tw:peer-[]/sidebar-menu-button:right-2',\n // menu card position\n 'tw:peer-[]/sidebar-menu-card:right-4',\n 'tw:peer-[]/sidebar-menu-card:top-4',\n\n // icon collapsed position\n 'tw:group-data-[state=collapsed]/sidebar:group-data-[collapsible=icon]/sidebar:right-0',\n 'tw:group-data-[state=collapsed]/sidebar:group-data-[collapsible=icon]/sidebar:-top-1',\n\n 'tw:text-xs',\n 'tw:text-sidebar-primary-foreground',\n 'tw:bg-sidebar-primary',\n 'tw:px-1',\n 'tw:min-w-5',\n 'tw:h-5',\n 'tw:rounded-full',\n 'tw:pointer-events-none',\n 'tw:font-medium',\n 'tw:tabular-nums',\n 'tw:select-none',\n\n 'tw:transition-[top,right]',\n 'tw:delay-50',\n 'tw:duration-(--sidebar-motion-duration)',\n 'tw:ease-(--sidebar-motion-easing)',\n 'tw:motion-reduce:transition-none',\n className,\n )}\n {...props}\n />\n );\n};\n","import { useState } from 'react';\nimport type { ComponentProps, ReactNode } from 'react';\n\nimport { ChevronDown } from '../../../icons';\nimport { cn } from '../../../utils';\nimport { Collapsible } from '../../Collapsible';\nimport { DropdownMenu } from '../../DropdownMenu';\nimport { Tooltip } from '../../Tooltip';\nimport { useSidebarInstance } from '../SidebarInstanceContext';\n\nimport { SidebarMenuButton } from './SidebarMenuButton';\n\ntype Props = {\n children: ReactNode;\n icon: ReactNode;\n isActive?: boolean;\n label: string;\n} & Pick<ComponentProps<typeof Collapsible>, 'defaultOpen' | 'open' | 'onOpenChange'>;\n\nexport const SidebarMenuSub = ({\n children,\n icon,\n isActive = false,\n label,\n\n // collapsible props\n defaultOpen = false,\n open: openProp,\n onOpenChange,\n}: Props) => {\n const { state, side, mode } = useSidebarInstance();\n const [open, setOpen] = useState<'open-tooltip' | 'open-dropdown-menu' | null>(null);\n const [innerCollapsibleOpen, setInnerCollapsibleOpen] = useState(defaultOpen);\n\n const isCollapsibleOpen = (() => {\n // In the collapsed sidebar state, it is always closed.\n if (state === 'collapsed') return false;\n return openProp ?? innerCollapsibleOpen;\n })();\n\n const isDropdownMenu = mode === 'expand-on-hover' || mode === 'collapsed';\n\n const handleCollapsibleOpenChange = (open: boolean) => {\n if (openProp === undefined) setInnerCollapsibleOpen(open);\n\n onOpenChange?.(open);\n };\n\n const handleDropdownOpenChange = (open: boolean) => {\n setOpen(open ? 'open-dropdown-menu' : null);\n };\n\n const handleTooltipOpenChange = (open: boolean) => {\n setOpen((currentOpen) => {\n // dropdown menu has higher priority than tooltip, if it's open, keep it open\n if (currentOpen === 'open-dropdown-menu') return 'open-dropdown-menu';\n // no need to show tooltip in expanded state, so return null\n if (state === 'expanded') return null;\n return open ? 'open-tooltip' : null;\n });\n };\n\n if (isDropdownMenu) {\n return (\n <DropdownMenu open={open === 'open-dropdown-menu'} onOpenChange={handleDropdownOpenChange}>\n <Tooltip.Root open={open === 'open-tooltip'} onOpenChange={handleTooltipOpenChange}>\n <Tooltip.Trigger asChild>\n <DropdownMenu.Trigger asChild>\n <SidebarMenuButton\n icon={icon}\n data-active={isActive}\n className={cn(\n 'tw:data-[active=true]:bg-sidebar-accent',\n 'tw:data-[active=true]:font-medium',\n )}\n >\n {label}\n </SidebarMenuButton>\n </DropdownMenu.Trigger>\n </Tooltip.Trigger>\n <Tooltip.Content variant=\"action\" placement={side}>\n {label}\n </Tooltip.Content>\n </Tooltip.Root>\n\n <DropdownMenu.Content side={side} align=\"start\">\n <DropdownMenu.Label>{label}</DropdownMenu.Label>\n {children}\n </DropdownMenu.Content>\n </DropdownMenu>\n );\n }\n\n return (\n <Collapsible open={isCollapsibleOpen} onOpenChange={handleCollapsibleOpenChange}>\n <Collapsible.Trigger asChild>\n <SidebarMenuButton\n icon={icon}\n data-active={isActive && !isCollapsibleOpen}\n className={cn(\n 'tw:group',\n 'tw:data-[active=true]:bg-sidebar-accent',\n 'tw:data-[active=true]:font-medium',\n )}\n >\n {label}\n <ChevronDown className=\"tw:ml-auto tw:size-5 tw:transition-transform tw:duration-200 tw:group-data-[state=open]:rotate-180\" />\n </SidebarMenuButton>\n </Collapsible.Trigger>\n <Collapsible.Content>\n <ul\n data-sidebar=\"menu-sub\"\n className={cn(\n 'tw:ml-3.5',\n 'tw:flex',\n 'tw:min-w-0',\n 'tw:translate-x-px',\n 'tw:flex-col',\n 'tw:gap-1',\n 'tw:border-l',\n 'tw:border-sidebar-border',\n 'tw:py-0.5',\n 'tw:pl-2.5',\n 'tw:pr-0',\n\n // TODO: remove when bootstrap is gone\n 'tw:list-none',\n )}\n >\n {children}\n </ul>\n </Collapsible.Content>\n </Collapsible>\n );\n};\n","import type { ComponentProps } from 'react';\nimport { Root, Slottable } from '@radix-ui/react-slot';\n\nimport { cn } from '../../../utils';\nimport { DropdownMenu } from '../../DropdownMenu';\nimport { useSidebarInstance } from '../SidebarInstanceContext';\n\ntype Props = ComponentProps<'button'> & {\n asChild?: boolean;\n};\n\nexport const SidebarMenuSubItem = ({\n ref,\n className,\n asChild = false,\n children,\n disabled,\n 'aria-current': ariaCurrent,\n ...props\n}: Props) => {\n const { mode } = useSidebarInstance();\n const isDropdownMenu = mode === 'collapsed' || mode === 'expand-on-hover';\n\n if (isDropdownMenu) {\n return (\n <DropdownMenu.Item\n aria-current={ariaCurrent}\n asChild={asChild}\n disabled={disabled}\n className={cn(\n // use sidebar colors for active and focus states\n 'tw:focus:!bg-sidebar-accent',\n 'tw:aria-[current=page]:bg-sidebar-accent',\n 'tw:aria-[current=page]:focus:text-sidebar-accent-foreground',\n className,\n )}\n >\n {children}\n </DropdownMenu.Item>\n );\n }\n\n const Component = asChild ? Root : 'button';\n\n return (\n <li className=\"tw:group/sidebar-menu-sub-item tw:relative\">\n <Component\n {...props}\n ref={ref}\n aria-current={ariaCurrent}\n data-slot=\"sidebar-menu-sub-button\"\n type=\"button\"\n disabled={disabled}\n className={cn(\n // layout\n 'tw:flex',\n 'tw:items-center',\n 'tw:gap-2',\n\n // sizing\n 'tw:h-7',\n 'tw:w-full',\n 'tw:min-w-0',\n 'tw:px-2',\n\n //font\n 'tw:text-sidebar-foreground',\n 'tw:text-sm',\n 'tw:font-normal',\n 'tw:text-start',\n 'tw:whitespace-nowrap',\n\n 'tw:overflow-hidden',\n 'tw:rounded-md',\n 'tw:no-underline',\n\n 'tw:select-none',\n 'tw:outline-hidden',\n\n // hover\n 'tw:hover:not-disabled:bg-sidebar-accent',\n 'tw:hover:text-sidebar-accent-foreground',\n 'tw:focus:text-sidebar-accent-foreground',\n\n // active\n 'tw:aria-selected:font-medium',\n 'tw:aria-selected:bg-sidebar-accent',\n 'tw:aria-[current=page]:bg-sidebar-accent',\n 'tw:aria-[current=page]:font-medium',\n\n // disabled\n 'tw:disabled:opacity-50',\n 'tw:disabled:cursor-not-allowed',\n\n // focus-visible\n 'tw:focus-visible:outline-hidden',\n 'tw:focus-visible:ring-2',\n 'tw:focus-visible:ring-sidebar-ring/50',\n className,\n )}\n >\n <Slottable>{children}</Slottable>\n </Component>\n </li>\n );\n};\n","import { type MouseEventHandler, useCallback, useEffect, useRef } from 'react';\n\nimport { useSidebar } from './SidebarProvider';\nimport type { SidebarSide } from './types';\nimport { SidebarWidthInPx } from './utils';\n\nconst DEFAULT_MIN_WIDTH = 384;\nconst DEFAULT_MAX_WIDTH = 800;\n\ntype UseResizeSidebarInput = {\n side: SidebarSide;\n minWidth?: number;\n maxWidth?: number;\n};\n\nexport const useResizeSidebar = ({\n side,\n minWidth = DEFAULT_MIN_WIDTH,\n maxWidth = DEFAULT_MAX_WIDTH,\n}: UseResizeSidebarInput) => {\n const { onWidthChange, baseWidth, isFill, state, isDragging, setIsDragging, setDragWidth } =\n useSidebar(side);\n const isResizable = state === 'expanded' && !isFill && onWidthChange !== undefined;\n const startXRef = useRef(0);\n const startWidthRef = useRef(0);\n const cleanupRef = useRef<(() => void) | null>(null);\n\n useEffect(() => {\n return () => {\n cleanupRef.current?.();\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n };\n }, []);\n\n const clampToRange = useCallback(\n (width: number) => {\n const effectiveMax = Math.max(minWidth, Math.min(maxWidth, window.innerWidth * 0.5));\n return Math.round(Math.min(effectiveMax, Math.max(minWidth, width)));\n },\n [minWidth, maxWidth],\n );\n\n const handleMouseDown: MouseEventHandler = useCallback(\n (e) => {\n if (!isResizable || isDragging) return;\n\n cleanupRef.current?.();\n setIsDragging(true);\n\n startWidthRef.current = baseWidth ?? SidebarWidthInPx.MIN_DEFAULT;\n startXRef.current = e.clientX;\n\n const handleMouseMove = (moveEvent: MouseEvent) => {\n const delta =\n side === 'right'\n ? startXRef.current - moveEvent.clientX\n : moveEvent.clientX - startXRef.current;\n setDragWidth(clampToRange(startWidthRef.current + delta));\n };\n\n const handleMouseUp = (upEvent: MouseEvent) => {\n const delta =\n side === 'right'\n ? startXRef.current - upEvent.clientX\n : upEvent.clientX - startXRef.current;\n onWidthChange?.(clampToRange(startWidthRef.current + delta));\n setIsDragging(false);\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n cleanupRef.current = null;\n };\n\n document.body.style.cursor = 'col-resize';\n document.body.style.userSelect = 'none';\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n\n cleanupRef.current = () => {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n setIsDragging(false);\n setDragWidth(null);\n };\n },\n [\n isResizable,\n isDragging,\n side,\n onWidthChange,\n baseWidth,\n setIsDragging,\n setDragWidth,\n clampToRange,\n ],\n );\n\n const handleDoubleClick = useCallback(() => {\n onWidthChange?.(minWidth);\n }, [onWidthChange, minWidth]);\n\n return {\n handleProps: {\n onMouseDown: handleMouseDown,\n onDoubleClick: handleDoubleClick,\n },\n isDragging,\n isResizable,\n };\n};\n","import { cn } from '../../utils';\n\nimport type { SidebarSide } from './types';\nimport { useResizeSidebar } from './useResizeSidebar';\n\ntype Props = {\n side: SidebarSide;\n minWidth?: number;\n maxWidth?: number;\n};\n\nexport const SidebarResizeHandle = ({ side, minWidth, maxWidth }: Props) => {\n const { handleProps, isResizable } = useResizeSidebar({ side, minWidth, maxWidth });\n\n if (!isResizable) return null;\n\n return (\n <div\n {...handleProps}\n aria-hidden\n className={cn(\n 'tw:absolute tw:inset-y-0 tw:z-10 tw:w-3',\n side === 'right' ? 'tw:left-0' : 'tw:right-0',\n 'tw:cursor-col-resize',\n )}\n />\n );\n};\n","import type { ComponentProps } from 'react';\n\nimport { cn } from '../../utils';\nimport { Separator } from '../Separator';\n\ntype Props = Omit<ComponentProps<typeof Separator>, 'orientation' | 'size'>;\n\nexport const SidebarSeparator = ({ className, ...props }: Props) => (\n <Separator\n {...props}\n orientation=\"horizontal\"\n size=\"full\"\n className={cn('tw:before:bg-sidebar-border tw:p-2', className)}\n />\n);\n","import type { ComponentProps, MouseEventHandler } from 'react';\nimport { Slot } from '@radix-ui/react-slot';\n\nimport { cn } from '../../utils';\n\nimport { useSidebar } from './SidebarProvider';\nimport type { SidebarSide } from './types';\n\ntype Props = ComponentProps<typeof Slot> & {\n side?: SidebarSide;\n hideWhenCollapsed?: boolean;\n};\n\nexport const SidebarTrigger = ({\n side = 'left',\n onClick,\n hideWhenCollapsed = false,\n className,\n ...rest\n}: Props) => {\n const { toggle } = useSidebar(side);\n\n const handleOnClick: MouseEventHandler<HTMLElement> = (event) => {\n toggle();\n onClick?.(event);\n };\n\n return (\n <Slot\n {...rest}\n onClick={handleOnClick}\n className={cn(\n {\n 'tw:group-data-[state=collapsed]/sidebar:hidden': hideWhenCollapsed,\n },\n className,\n )}\n />\n );\n};\n","import { useMemo } from 'react';\nimport type { ComponentProps, CSSProperties, ReactNode, TransitionEventHandler } from 'react';\n\nimport { cn } from '../../utils';\nimport { TooltipProvider } from '../Tooltip';\n\nimport { useTransitionPresence } from './SidebarProvider/useTransitionPresence';\nimport { SidebarContent } from './SidebarContent';\nimport { SidebarFillTrigger } from './SidebarFillTrigger';\nimport { SidebarFooter } from './SidebarFooter';\nimport {\n SidebarGroup,\n SidebarGroupAction,\n SidebarGroupContent,\n SidebarGroupLabel,\n} from './SidebarGroup';\nimport { SidebarHeader } from './SidebarHeader';\nimport { SidebarInstanceContext } from './SidebarInstanceContext';\nimport {\n SidebarMenu,\n SidebarMenuAction,\n SidebarMenuBadge,\n SidebarMenuButton,\n SidebarMenuCard,\n SidebarMenuIcon,\n SidebarMenuItem,\n SidebarMenuSub,\n SidebarMenuSubItem,\n SidebarSearchInput,\n} from './SidebarMenu';\nimport { useSidebar } from './SidebarProvider';\nimport { SidebarResizeHandle } from './SidebarResizeHandle';\nimport { SidebarSeparator } from './SidebarSeparator';\nimport { SidebarTrigger } from './SidebarTrigger';\nimport type { SidebarSide } from './types';\nimport { SidebarWidthInPx } from './utils';\n\n/**\n * `className` and `style` land on the inner wrapper (the rail's own box); everything else\n * (`data-*`, `aria-*`, handlers) lands on the outer element, so a `ThemeScope` around the\n * sidebar reaches it.\n */\ntype Props = Omit<ComponentProps<'div'>, 'children' | 'className' | 'style' | 'id'> & {\n children: ReactNode;\n className?: string;\n id?: string;\n side?: SidebarSide;\n style?: CSSProperties;\n container?: boolean;\n keepMounted?: boolean;\n /** Hold the panel's content back until it has finished sliding in. */\n mountAfterEnter?: boolean;\n resizable?: boolean;\n};\n\nexport const Sidebar = ({\n children,\n className,\n id,\n side = 'left',\n style,\n container = false,\n keepMounted,\n mountAfterEnter,\n resizable = false,\n ...rest\n}: Props) => {\n const oppositeSide = side === 'left' ? 'right' : 'left';\n const { setSidebarElement, state, mode, isFill, widths, collapsible, variant, isDragging } =\n useSidebar(side);\n\n const { isMounted, completeUnmount } = useTransitionPresence({\n mounted: collapsible !== 'off-canvas' || mode !== 'collapsed',\n keepMounted,\n mountAfterEnter,\n });\n const { widths: oppositeWidths } = useSidebar(oppositeSide);\n const sidebarInstanceContextValue = useMemo(() => ({ state, mode, side }), [state, mode, side]);\n\n const handleTransitionEnd: TransitionEventHandler<HTMLDivElement> = (event) => {\n // Ignore bubbled transitions from child elements\n if (event.target !== event.currentTarget) return;\n completeUnmount();\n };\n\n const styles = {\n // The caller's vars ride on this element too (a `ThemeScope`'s tokens must reach the\n // gap and the wrapper alike); the sidebar's own geometry vars are listed after, so they win here.\n ...style,\n '--sidebar-floating-padding': `${SidebarWidthInPx.FLOATING_VARIANT_PADDING}px`,\n '--sidebar-width': `${widths.sidebar}px`,\n '--sidebar-width-gap': `${widths.gap}px`,\n '--opposite-sidebar-width': `${oppositeWidths.fill}px`,\n } as CSSProperties;\n\n if (variant === 'none') return null;\n\n return (\n <TooltipProvider>\n <SidebarInstanceContext value={sidebarInstanceContextValue}>\n <div\n {...rest}\n id={id}\n ref={setSidebarElement}\n data-state={state}\n data-side={side}\n data-mode={mode}\n data-collapsible={collapsible}\n data-variant={variant}\n data-fill={isFill}\n style={styles}\n className={cn(\n 'tailwindcss-preflight',\n 'tw:flex',\n 'tw:relative',\n // expand-on-hover needs a higher z-index so the expanding sidebar\n // overlaps the opposite filled sidebar instead of sliding behind it\n mode === 'expand-on-hover' ? 'tw:z-[51]' : 'tw:z-50',\n {\n // group/peer scoping is only for page-level sidebars — container\n // sidebars are nested inside other components and must not leak\n // group/peer selectors to avoid clashing with the outer sidebar\n 'tw:group/sidebar tw:peer/sidebar': !container,\n },\n\n // ── GAP DIV ──\n 'tw:[&>[data-slot=gap]]:w-(--sidebar-width-gap)',\n 'tw:[&[data-side=right]>[data-slot=gap]]:rotate-180',\n\n // ── SIDEBAR-WRAPPER DIV ──\n 'tw:[&>[data-slot=sidebar-wrapper]]:w-(--sidebar-width)',\n 'tw:[&[data-side=left]>[data-slot=sidebar-wrapper]]:left-0',\n 'tw:[&[data-side=right]>[data-slot=sidebar-wrapper]]:right-0',\n // Off-canvas hiding.\n // - `translate-x-*` sets the standalone `translate` property, not `transform`.\n // - The wrapper's transition list must therefore name `translate`, or the rail\n // teleports instead of sliding.\n 'tw:[&[data-state=collapsed][data-collapsible=off-canvas][data-side=left]>[data-slot=sidebar-wrapper]]:-translate-x-full',\n 'tw:[&[data-state=collapsed][data-collapsible=off-canvas][data-side=right]>[data-slot=sidebar-wrapper]]:translate-x-full',\n\n // floating variants styles\n 'tw:[&[data-variant=sided-floating]>[data-slot=sidebar-wrapper]]:pt-(--sidebar-floating-padding)',\n 'tw:[&[data-variant=sided-floating][data-side=left]>[data-slot=sidebar-wrapper]]:pr-(--sidebar-floating-padding)',\n 'tw:[&[data-variant=sided-floating][data-side=right]>[data-slot=sidebar-wrapper]]:pl-(--sidebar-floating-padding)',\n\n 'tw:[&[data-variant=floating]>[data-slot=sidebar-wrapper]]:p-(--sidebar-floating-padding)',\n\n // fill state\n 'tw:[&[data-fill=true]>[data-slot=sidebar-wrapper]]:!w-[calc(100svw-var(--opposite-sidebar-width))]',\n 'tw:[&[data-fill=true][data-variant=floating]>[data-slot=sidebar-wrapper]]:!p-(--sidebar-floating-padding)',\n 'tw:[&[data-fill=true][data-variant=sided-floating][data-side=left]>[data-slot=sidebar-wrapper]>[data-slot=sidebar]]:!rounded-tr-xl',\n 'tw:[&[data-fill=true][data-variant=sided-floating][data-side=right]>[data-slot=sidebar-wrapper]>[data-slot=sidebar]]:!rounded-tl-xl',\n\n // ── SIDEBAR DIV (INNERMOST) ──\n 'tw:[&[data-variant=inset][data-side=left]>[data-slot=sidebar-wrapper]>[data-slot=sidebar]]:border-r',\n 'tw:[&[data-variant=inset][data-side=right]>[data-slot=sidebar-wrapper]>[data-slot=sidebar]]:border-l',\n 'tw:[&[data-variant=floating]>[data-slot=sidebar-wrapper]>[data-slot=sidebar]]:shadow',\n 'tw:[&[data-variant=floating]>[data-slot=sidebar-wrapper]>[data-slot=sidebar]]:rounded-xl',\n 'tw:[&[data-variant=sided-floating]>[data-slot=sidebar-wrapper]>[data-slot=sidebar]]:shadow',\n 'tw:[&[data-variant=sided-floating][data-side=left]>[data-slot=sidebar-wrapper]>[data-slot=sidebar]]:rounded-tr-xl',\n 'tw:[&[data-variant=sided-floating][data-side=right]>[data-slot=sidebar-wrapper]>[data-slot=sidebar]]:rounded-tl-xl',\n // The rail's inner edge, mirroring `inset`. The shadow above cannot carry\n // this alone: a shadow needs a lighter ground to fall on, and on the dark\n // scheme `--sidebar` is darker than `--background`, so the rail's edge\n // dissolves into the page beside it.\n 'tw:[&[data-variant=sided-floating][data-side=left]>[data-slot=sidebar-wrapper]>[data-slot=sidebar]]:border-r',\n 'tw:[&[data-variant=sided-floating][data-side=right]>[data-slot=sidebar-wrapper]>[data-slot=sidebar]]:border-l',\n\n // Ease-out (linear reads as choppy). The page reflowing beside the rail is layout every frame;\n // `motion-reduce` is the lever for weak machines.\n isDragging\n ? 'tw:transition-none'\n : 'tw:transition-[width,translate,transform] tw:duration-(--sidebar-motion-duration) tw:ease-(--sidebar-motion-easing) tw:motion-reduce:transition-none',\n )}\n >\n <div\n data-slot=\"gap\"\n className={cn(\n 'tw:bg-transparent',\n isDragging\n ? ''\n : 'tw:transition-[width] tw:duration-(--sidebar-motion-duration) tw:ease-(--sidebar-motion-easing) tw:motion-reduce:transition-none',\n )}\n />\n\n <div\n data-slot=\"sidebar-wrapper\"\n onTransitionEnd={handleTransitionEnd}\n className={cn(\n 'tw:fixed',\n 'tw:inset-y-0',\n 'tw:border-border',\n\n // transition\n isDragging\n ? 'tw:transition-none'\n : 'tw:transition-[width,translate,transform] tw:duration-(--sidebar-motion-duration) tw:ease-(--sidebar-motion-easing) tw:motion-reduce:transition-none',\n // Composite the slide.\n 'tw:transform-gpu',\n className,\n )}\n style={style}\n >\n {resizable && <SidebarResizeHandle side={side} />}\n <div\n data-slot=\"sidebar\"\n className={cn(\n 'tw:bg-sidebar',\n 'tw:overflow-hidden',\n 'tw:relative',\n 'tw:flex',\n 'tw:flex-col',\n 'tw:size-full',\n 'tw:border-sidebar-border',\n 'tw:group-[]/sidebar:pt-2',\n )}\n >\n {isMounted ? children : null}\n </div>\n </div>\n </div>\n </SidebarInstanceContext>\n </TooltipProvider>\n );\n};\n\n// main layout\nSidebar.Header = SidebarHeader;\nSidebar.Content = SidebarContent;\nSidebar.Footer = SidebarFooter;\nSidebar.Trigger = SidebarTrigger;\nSidebar.FillTrigger = SidebarFillTrigger;\nSidebar.Separator = SidebarSeparator;\nSidebar.MenuIcon = SidebarMenuIcon;\n\n// group features\nSidebar.Group = SidebarGroup;\nSidebar.GroupLabel = SidebarGroupLabel;\nSidebar.GroupContent = SidebarGroupContent;\nSidebar.GroupAction = SidebarGroupAction;\n\n// menu features\nSidebar.Menu = SidebarMenu;\nSidebar.MenuItem = SidebarMenuItem;\nSidebar.MenuButton = SidebarMenuButton;\nSidebar.MenuAction = SidebarMenuAction;\nSidebar.SearchInput = SidebarSearchInput;\nSidebar.MenuCard = SidebarMenuCard;\nSidebar.MenuBadge = SidebarMenuBadge;\n\n// sub-menu features\nSidebar.SubMenu = SidebarMenuSub;\nSidebar.SubItem = SidebarMenuSubItem;\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TextInput-DiEMxVF6.js","names":[],"sources":["../src/blocks/TextInput/utils.ts","../src/blocks/TextInput/TextInput.tsx"],"sourcesContent":["import { createPrefixedString } from '../../utils';\n\nexport const genInputTestId = (prefix: string = '') => {\n const ps = createPrefixedString(prefix);\n return {\n toString: () => prefix,\n inputWrapper: ps`input-wrapper`,\n input: ps`input`,\n clearButton: ps`clear-button`,\n };\n};\n","import { useRef } from 'react';\nimport type {\n ChangeEventHandler,\n ComponentProps,\n ComponentRef,\n FocusEventHandler,\n MouseEventHandler,\n ReactNode,\n} from 'react';\n\nimport { InputGroup } from '../../components/InputGroup';\nimport { useControllableState } from '../../hooks/useControllableState';\nimport { X } from '../../icons';\nimport { cn, createChangeInputEvent, mergeRefs } from '../../utils';\n\nimport { genInputTestId } from './utils';\n\ntype InputGroupProps = Pick<\n ComponentProps<typeof InputGroup>,\n 'variant' | 'focusVariant' | 'sizing' | 'state'\n>;\n\ntype OwnProps = {\n prefix?: ReactNode;\n rightSuffix?: ReactNode;\n rightSuffixVariant?: 'addon' | 'default';\n leftSuffix?: ReactNode;\n allowClear?: boolean;\n onClear?: () => void;\n testId?: string;\n value?: string | null;\n defaultValue?: string | null;\n /** Called with the unwrapped string value on every change. For the raw event use `onChange`. */\n onValueChange?: (value: string) => void;\n /** Called with the unwrapped string value on blur. For the raw event use `onBlur`. */\n onValueBlur?: (value: string) => void;\n type?: 'text' | 'email' | 'password' | 'datetime-local' | 'date';\n};\n\n/**\n * Props for `TextInput`. Combines `InputGroup` chrome (variant / sizing / state / focusVariant) with\n * input-specific slots (`prefix`, `leftSuffix`, `rightSuffix`, `allowClear`) and a string-typed\n * `value` / `defaultValue` plus convenience `onValueChange` / `onValueBlur` callbacks. `null` /\n * `undefined` are coerced to empty strings.\n */\nexport type Props = InputGroupProps &\n OwnProps &\n Omit<ComponentProps<'input'>, 'prefix' | 'value' | 'defaultValue' | 'type' | 'accept' | 'step'>;\n\nconst sanitizeTextInputValue = (value: string | null | undefined) => {\n if (typeof value === 'string' && value.trim() === '') return '';\n return value;\n};\n\n/**\n * Standard text input with a string-only API, built on `InputGroup` chrome — addons, clear button,\n * sizing, focus variants. The default choice for a bare text input.\n *\n * **When to use:** any plain text / email / password / date-input field outside `useAppForm`. Pair with\n * `onValueChange` instead of unwrapping `event.target.value` from `onChange`.\n * **When NOT to use:** for fields inside a labelled group use `FormGroup.TextInput`; for forms with\n * validation use `useAppForm` + `field.TextField`; for search use `SearchInput`.\n * **Composition:** wrap in a `FormGroup` for shared error / help-text state, or render directly inside\n * page layouts. Chrome resolves from the active brand automatically: a modern brand always renders argo\n * (any `variant` is ignored), while `variant` only tunes the legacy-brand chrome.\n */\nexport const TextInput = ({\n ref: forwardedRef,\n state = 'default',\n sizing = 'default',\n className,\n prefix = null,\n rightSuffix = null,\n rightSuffixVariant = 'default',\n leftSuffix = null,\n allowClear = false,\n onClear,\n disabled = false,\n testId: prefixTestId = '',\n autoFocus = false,\n id,\n name,\n variant,\n readOnly,\n type = 'text',\n focusVariant = 'default',\n onChange,\n onBlur,\n onValueChange,\n onValueBlur,\n value: valueProp,\n defaultValue,\n ...inputProps\n}: Props) => {\n const inputRef = useRef<ComponentRef<'input'>>(null);\n\n const [value, setValue] = useControllableState<string>({\n // `undefined` stays uncontrolled; any provided value (incl. `null`) is controlled and coerced\n // to a string. Whitespace-only input collapses to '' via `sanitizeTextInputValue`.\n prop: valueProp === undefined ? undefined : (sanitizeTextInputValue(valueProp) ?? ''),\n defaultProp: sanitizeTextInputValue(defaultValue) ?? '',\n onChange: onValueChange,\n });\n\n const testId = genInputTestId(prefixTestId);\n const isClearButtonVisible = (!!value && !disabled && !readOnly) || !!onClear;\n\n const handleChange: ChangeEventHandler<HTMLInputElement> = (event) => {\n setValue(event.target.value);\n onChange?.(event);\n };\n\n const handleBlur: FocusEventHandler<HTMLInputElement> = (event) => {\n onValueBlur?.(event.target.value);\n onBlur?.(event);\n };\n\n const handleClear: MouseEventHandler<HTMLButtonElement> = () => {\n if (inputRef.current === null) return;\n inputRef.current.value = ''; // keep the DOM node in sync before firing the synthetic change\n inputRef.current.focus();\n onClear?.();\n handleChange(createChangeInputEvent(inputRef.current));\n };\n\n return (\n <InputGroup\n state={state}\n variant={variant}\n sizing={sizing}\n focusVariant={focusVariant}\n className={className}\n data-testid={testId.inputWrapper}\n >\n {prefix && <InputGroup.Addon align=\"inline-start\">{prefix}</InputGroup.Addon>}\n\n <InputGroup.Input\n {...inputProps}\n value={value}\n autoFocus={autoFocus}\n type={type}\n onChange={handleChange}\n onBlur={handleBlur}\n ref={mergeRefs(forwardedRef ?? null, inputRef)}\n disabled={disabled}\n id={id}\n name={name}\n readOnly={readOnly}\n data-testid={testId.input}\n />\n\n {(leftSuffix || allowClear || rightSuffix) && (\n <InputGroup.Addon align=\"inline-end\">\n {leftSuffix}\n {allowClear && isClearButtonVisible && (\n <InputGroup.Button\n aria-label=\"Clear\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={handleClear}\n data-testid={testId.clearButton}\n >\n <X className=\"tw:size-4\" />\n </InputGroup.Button>\n )}\n {rightSuffix && (\n <div\n className={cn({\n 'tw:whitespace-nowrap tw:bg-muted tw:px-4 tw:-mr-4 tw:py-2.5':\n rightSuffixVariant === 'addon',\n })}\n >\n {rightSuffix}\n </div>\n )}\n </InputGroup.Addon>\n )}\n </InputGroup>\n );\n};\n"],"mappings":";;;;;;;;;AAEA,MAAa,kBAAkB,SAAiB,OAAO;CACrD,MAAM,KAAK,qBAAqB,MAAM;CACtC,OAAO;EACL,gBAAgB;EAChB,cAAc,EAAE;EAChB,OAAO,EAAE;EACT,aAAa,EAAE;CACjB;AACF;;;ACuCA,MAAM,0BAA0B,UAAqC;CACnE,IAAI,OAAO,UAAU,YAAY,MAAM,KAAK,MAAM,IAAI,OAAO;CAC7D,OAAO;AACT;;;;;;;;;;;;;AAcA,MAAa,aAAa,EACxB,KAAK,cACL,QAAQ,WACR,SAAS,WACT,WACA,SAAS,MACT,cAAc,MACd,qBAAqB,WACrB,aAAa,MACb,aAAa,OACb,SACA,WAAW,OACX,QAAQ,eAAe,IACvB,YAAY,OACZ,IACA,MACA,SACA,UACA,OAAO,QACP,eAAe,WACf,UACA,QACA,eACA,aACA,OAAO,WACP,cACA,GAAG,iBACQ;CACX,MAAM,WAAW,OAA8B,IAAI;CAEnD,MAAM,CAAC,OAAO,YAAY,qBAA6B;EAGrD,MAAM,cAAc,KAAA,IAAY,KAAA,IAAa,uBAAuB,SAAS,KAAK;EAClF,aAAa,uBAAuB,YAAY,KAAK;EACrD,UAAU;CACZ,CAAC;CAED,MAAM,SAAS,eAAe,YAAY;CAC1C,MAAM,uBAAwB,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,YAAa,CAAC,CAAC;CAEtE,MAAM,gBAAsD,UAAU;EACpE,SAAS,MAAM,OAAO,KAAK;EAC3B,WAAW,KAAK;CAClB;CAEA,MAAM,cAAmD,UAAU;EACjE,cAAc,MAAM,OAAO,KAAK;EAChC,SAAS,KAAK;CAChB;CAEA,MAAM,oBAA0D;EAC9D,IAAI,SAAS,YAAY,MAAM;EAC/B,SAAS,QAAQ,QAAQ;EACzB,SAAS,QAAQ,MAAM;EACvB,UAAU;EACV,aAAa,uBAAuB,SAAS,OAAO,CAAC;CACvD;CAEA,OACE,qBAAC,YAAD;EACS;EACE;EACD;EACM;EACH;EACX,eAAa,OAAO;EANtB,UAAA;GAQG,UAAU,oBAAC,WAAW,OAAZ;IAAkB,OAAM;IAAgB,UAAA;GAAyB,CAAA;GAE5E,oBAAC,WAAW,OAAZ;IACE,GAAI;IACG;IACI;IACL;IACN,UAAU;IACV,QAAQ;IACR,KAAK,UAAU,gBAAgB,MAAM,QAAQ;IACnC;IACN;IACE;IACI;IACV,eAAa,OAAO;GACrB,CAAA;IAEC,cAAc,cAAc,gBAC5B,qBAAC,WAAW,OAAZ;IAAkB,OAAM;IAAxB,UAAA;KACG;KACA,cAAc,wBACb,oBAAC,WAAW,QAAZ;MACE,cAAW;MACX,cAAc,MAAM,EAAE,eAAe;MACrC,SAAS;MACT,eAAa,OAAO;MAEpB,UAAA,oBAAC,GAAD,EAAG,WAAU,YAAa,CAAA;KACT,CAAA;KAEpB,eACC,oBAAC,OAAD;MACE,WAAW,GAAG,EACZ,+DACE,uBAAuB,QAC3B,CAAC;MAEA,UAAA;KACE,CAAA;IAES;;EAEV;;AAEhB"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { useCallback, useState } from "react";
|
|
2
|
-
//#region src/hooks/useElement.ts
|
|
3
|
-
const useElement = () => {
|
|
4
|
-
const [element, _setElement] = useState(null);
|
|
5
|
-
return [element, useCallback((node) => {
|
|
6
|
-
_setElement((prev) => {
|
|
7
|
-
if (prev !== null) return prev;
|
|
8
|
-
return node;
|
|
9
|
-
});
|
|
10
|
-
}, [])];
|
|
11
|
-
};
|
|
12
|
-
//#endregion
|
|
13
|
-
export { useElement };
|
|
14
|
-
|
|
15
|
-
//# sourceMappingURL=useElement-DkF6esWL.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useElement-DkF6esWL.js","names":[],"sources":["../src/hooks/useElement.ts"],"sourcesContent":["import { useCallback, useState } from 'react';\n\n// This hook is used to set an element reference and ensure that it only updates once, when element is first set.\nexport const useElement = () => {\n const [element, _setElement] = useState<HTMLElement | null>(null);\n\n const setElement = useCallback((node: HTMLElement | null) => {\n _setElement((prev) => {\n // Only update if not already set\n if (prev !== null) return prev;\n return node;\n });\n }, []);\n\n return [element, setElement] as const;\n};\n"],"mappings":";;AAGA,MAAa,mBAAmB;CAC9B,MAAM,CAAC,SAAS,eAAe,SAA6B,IAAI;CAUhE,OAAO,CAAC,SARW,aAAa,SAA6B;EAC3D,aAAa,SAAS;GAEpB,IAAI,SAAS,MAAM,OAAO;GAC1B,OAAO;EACT,CAAC;CACH,GAAG,CAAC,CAEsB,CAAC;AAC7B"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"utils-DnkrFYqY.js","names":["Root"],"sources":["../src/utils/copyToClipboard.ts","../src/utils/createChangeInputEvent.ts","../src/constants/keyCodes.ts","../src/components/Tooltip/TooltipContent.tsx","../src/components/Tooltip/TooltipRoot.tsx","../src/components/Tooltip/TooltipTrigger.tsx","../src/components/Tooltip/Tooltip.tsx","../src/utils/decorators.tsx","../src/utils/createPrefixedString.ts","../src/utils/noop.ts","../src/utils/debounce.ts","../src/utils/isMac.ts","../src/utils/useSHA256.ts"],"sourcesContent":["/**\n * The async Clipboard API requires the document to be focused and rejects with\n * `NotAllowedError: Document is not focused` otherwise — which is the normal state\n * for a page inside an iframe that has not taken focus, such as Storybook's canvas\n * or an embedded preview. `execCommand` has no such requirement because it copies\n * the selection of a node we focus ourselves, so it covers that gap.\n */\nconst copyViaSelection = (text: string) => {\n const node = document.createElement('textarea');\n node.value = text;\n node.setAttribute('readonly', '');\n node.style.cssText = 'position:fixed;top:0;left:0;opacity:0';\n document.body.append(node);\n node.select();\n\n try {\n return document.execCommand('copy');\n } finally {\n node.remove();\n }\n};\n\nexport const copyToClipboard = async (text: string) => {\n try {\n await navigator.clipboard.writeText(text);\n } catch (error) {\n if (!copyViaSelection(text)) throw error;\n }\n};\n","import type { ChangeEvent } from 'react';\n\nexport const createChangeInputEvent = (input: HTMLInputElement) => {\n const changeEvent: ChangeEvent<HTMLInputElement> = {\n target: input,\n currentTarget: input,\n type: 'change',\n nativeEvent: new Event('change', { bubbles: true }),\n bubbles: true,\n cancelable: false,\n defaultPrevented: false,\n eventPhase: 2, // AT_TARGET\n isTrusted: false, // Synthetic events are not trusted\n preventDefault: () => {}, // Provide dummy functions if not needed\n isDefaultPrevented: () => false,\n stopPropagation: () => {},\n isPropagationStopped: () => false,\n persist: () => {},\n timeStamp: Date.now(),\n };\n\n Object.defineProperty(changeEvent, 'target', {\n value: input,\n writable: false,\n });\n\n return changeEvent;\n};\n","export const keyCodes = {\n ENTER: 'Enter',\n ESCAPE: 'Escape',\n SPACE: ' ',\n};\n","import type { ComponentProps } from 'react';\nimport { Content, Portal } from '@radix-ui/react-tooltip';\nimport type { VariantProps } from 'class-variance-authority';\nimport { cva } from 'class-variance-authority';\n\nimport { useArgoDesign } from '../ThemeProvider/context';\n\nconst tooltipVariants = cva(\n [\n 'tailwindcss-preflight',\n 'tw:inline-block',\n 'tw:break-anywhere',\n 'tw:max-h-96',\n 'tw:overflow-y-auto',\n 'tw:z-[1060]',\n\n // legacy (dark) chrome — default\n 'tw:rounded',\n 'tw:bg-neutral-800',\n 'tw:text-white',\n\n // argo chrome overrides — semantic floating-panel tokens\n 'tw:data-[argo=true]:rounded-2xl',\n 'tw:data-[argo=true]:border',\n 'tw:data-[argo=true]:border-solid',\n 'tw:data-[argo=true]:border-border',\n 'tw:data-[argo=true]:bg-popover',\n 'tw:data-[argo=true]:text-popover-foreground',\n 'tw:data-[argo=true]:shadow-md',\n\n // argo open animation\n 'tw:data-[argo=true]:data-[state=delayed-open]:animate-in',\n 'tw:data-[argo=true]:data-[state=instant-open]:animate-in',\n 'tw:data-[argo=true]:data-[state=delayed-open]:fade-in-0',\n 'tw:data-[argo=true]:data-[state=instant-open]:fade-in-0',\n 'tw:data-[argo=true]:data-[state=delayed-open]:zoom-in-95',\n 'tw:data-[argo=true]:data-[state=instant-open]:zoom-in-95',\n\n // argo closed animation\n 'tw:data-[argo=true]:data-[state=closed]:animate-out',\n 'tw:data-[argo=true]:data-[state=closed]:fade-out-0',\n 'tw:data-[argo=true]:data-[state=closed]:zoom-out-95',\n\n // argo position animation\n 'tw:data-[argo=true]:data-[side=bottom]:slide-in-from-top-2',\n 'tw:data-[argo=true]:data-[side=left]:slide-in-from-right-2',\n 'tw:data-[argo=true]:data-[side=right]:slide-in-from-left-2',\n 'tw:data-[argo=true]:data-[side=top]:slide-in-from-bottom-2',\n ],\n {\n defaultVariants: {\n variant: 'action',\n },\n variants: {\n variant: {\n action: [\n 'tw:max-w-fit',\n 'tw:px-3',\n 'tw:py-2',\n\n 'tw:text-center',\n 'tw:text-xs',\n 'tw:font-medium',\n // Casing is the legacy brands' to ask for: `keboola-legacy-*` uppercases the action\n // tooltip, every other brand reads standard case. Same rule, same shape, as `Button`\n // and `Badge`.\n 'tw:[[data-brand^=keboola-legacy]_&]:uppercase',\n 'tw:[[data-brand^=keboola-legacy]_&]:tracking-wider',\n ],\n explanatory: [\n 'tw:max-w-80',\n 'tw:px-4',\n 'tw:py-3',\n 'tw:text-left',\n\n 'tw:text-sm',\n 'tw:font-normal',\n ],\n },\n },\n },\n);\n\ntype Props = {\n keepOpenOnPointerDownOutside?: boolean;\n placement?: ComponentProps<typeof Content>['side'];\n} & Omit<ComponentProps<typeof Content>, 'side'> &\n VariantProps<typeof tooltipVariants>;\n\nexport const TooltipContent = ({\n className,\n variant,\n keepOpenOnPointerDownOutside = false,\n children,\n onPointerDownOutside,\n sideOffset = 8,\n collisionPadding = 8,\n hideWhenDetached = true,\n placement = 'right',\n ...rest\n}: Props) => {\n const renderArgo = useArgoDesign();\n\n const handlePointerDownOutside: ComponentProps<typeof Content>['onPointerDownOutside'] = (\n event,\n ) => {\n if (keepOpenOnPointerDownOutside) event.preventDefault();\n onPointerDownOutside?.(event);\n };\n\n return (\n <Portal>\n <Content\n {...rest}\n // Marks the dark (non-argo) tooltip chrome so styles.css can invert\n // nested `.tw\\:prose` for contrast.\n data-tooltip-content={renderArgo ? undefined : true}\n data-argo={renderArgo}\n sideOffset={sideOffset}\n collisionPadding={collisionPadding}\n onPointerDownOutside={handlePointerDownOutside}\n className={tooltipVariants({ className, variant })}\n hideWhenDetached={hideWhenDetached}\n side={placement}\n >\n {children}\n </Content>\n </Portal>\n );\n};\n","import type { ComponentProps } from 'react';\nimport { Root } from '@radix-ui/react-tooltip';\n\ntype Props = ComponentProps<typeof Root>;\n\nconst DELAY_SHOW_TOOLTIP = 300;\n\nexport const TooltipRoot = ({ children, delayDuration = DELAY_SHOW_TOOLTIP, ...rest }: Props) => (\n <Root {...rest} delayDuration={delayDuration}>\n {children}\n </Root>\n);\n","import type { ComponentProps } from 'react';\nimport { Slot } from '@radix-ui/react-slot';\nimport { Trigger } from '@radix-ui/react-tooltip';\n\nimport { cn } from '../../utils';\n\n/**\n * Radix stamps the tooltip's own open/closed `data-state` onto the trigger. Merged onto an\n * `asChild` child that keeps a `data-state` of its own — `ToggleGroup.Item`, `Switch`, a `Tabs`\n * trigger — it wins, because those primitives spread incoming props *after* their own attribute.\n * The child then silently loses every `data-[state=…]` style it has, which is usually the only\n * thing marking it as selected.\n *\n * The tooltip's trigger state is styled nowhere, so it is dropped before it reaches the child.\n */\nconst WithoutTooltipState = ({\n children,\n ...props\n // `Slot`'s own props, plus the one attribute this exists to remove: React's types declare no\n // `data-*`, so it has to be named to be destructured away.\n}: ComponentProps<typeof Slot> & { 'data-state'?: string }) => {\n const { 'data-state': _tooltipState, ...rest } = props;\n\n return <Slot {...rest}>{children}</Slot>;\n};\n\ntype Props = {\n keepOpenOnClick?: boolean;\n} & ComponentProps<typeof Trigger>;\n\nexport const TooltipTrigger = ({\n ref,\n children,\n className,\n keepOpenOnClick = false,\n onClick,\n onPointerDown,\n asChild,\n ...rest\n}: Props) => {\n const handleClick: ComponentProps<typeof Trigger>['onClick'] = (event) => {\n if (keepOpenOnClick) event.preventDefault();\n onClick?.(event);\n };\n\n const handlePointerDown: ComponentProps<typeof Trigger>['onPointerDown'] = (event) => {\n if (keepOpenOnClick) event.preventDefault();\n onPointerDown?.(event);\n };\n\n return (\n <Trigger\n {...rest}\n asChild\n ref={ref}\n className={cn('tailwindcss-preflight', className)}\n onClick={handleClick}\n onPointerDown={handlePointerDown}\n >\n {asChild ? (\n <WithoutTooltipState>{children}</WithoutTooltipState>\n ) : (\n // Default-mode trigger wraps children in a span so Radix has a\n // single DOM element to attach handlers to. `tailwindcss-preflight`\n // (merged in via Slot) activates Tailwind's preflight inside the\n // span, which sets `svg { display: block }` — without an inline-flex\n // container that would stack any bare Lucide icon onto its own\n // line. `tw:inline-flex tw:items-center` keeps icon + text aligned.\n <span className=\"tw:inline-flex tw:items-center\">{children}</span>\n )}\n </Trigger>\n );\n};\n","import { useState } from 'react';\nimport type { ComponentProps, ReactNode } from 'react';\nimport type { Content, Trigger } from '@radix-ui/react-tooltip';\nimport { Provider } from '@radix-ui/react-tooltip';\n\nimport { keyCodes } from '../../constants/keyCodes';\n\nimport { TooltipContent } from './TooltipContent';\nimport { TooltipRoot } from './TooltipRoot';\nimport { TooltipTrigger } from './TooltipTrigger';\n\nconst ACTION_TOOLTIP_LIMIT = 30;\n\ntype TriggerProps = {\n triggerAsChild?: boolean;\n};\n\n/**\n * Props for `Tooltip`. `tooltip` is the popup content; `children` is the trigger element.\n * `variant` auto-resolves to `\"explanatory\"` for strings >30 chars, else `\"action\"`.\n */\nexport type Props = {\n /** Keep the tooltip visible when the user clicks the trigger (useful for click-to-copy feedback). */\n keepOpenOnTriggerClick?: boolean;\n /** Content rendered inside the tooltip. Plain text only — no interactive elements (use `HoverCard` or `Popover` for that). */\n tooltip: ReactNode;\n children: ReactNode;\n placement?: ComponentProps<typeof Content>['side'];\n /** Forcibly hide the tooltip regardless of hover state. */\n forceHide?: boolean;\n /** Forcibly show the tooltip regardless of hover state. Useful for guided-tour overlays. */\n forceShow?: boolean;\n /** Hover delay before the tooltip opens, in ms. Defaults to the shared 300ms. */\n delayDuration?: number;\n className?: string;\n} & TriggerProps &\n Pick<ComponentProps<typeof TooltipContent>, 'variant' | 'className'>;\n\n/** Re-export of Radix `Tooltip.Provider`. Mount once at the app root so tooltips share delay state. */\nexport const TooltipProvider = Provider;\n\n/**\n * Short plain-text label that appears on hover or focus.\n *\n * **When to use:** describing an icon-only `Button`, explaining a disabled control, or labelling a\n * truncated value. Plain text only — auto-switches to the longer `\"explanatory\"` variant when the string\n * exceeds 30 characters.\n * **When NOT to use:** for rich preview content (multiple lines, formatted text, structured data) use\n * `HoverCard`; for tooltips containing links or buttons use `Popover` (interactive elements break a11y\n * inside a `Tooltip`).\n * **Composition:** wrap any focusable element via `triggerAsChild` so the tooltip targets the underlying\n * native element. Mount `TooltipProvider` once at the app root.\n *\n * @see RECIPES.md#disabled-button-tooltip — for the disabled-button + tooltip pattern\n */\nexport const Tooltip = ({\n tooltip,\n children,\n className,\n keepOpenOnTriggerClick = false,\n variant,\n placement = 'right',\n forceHide = false,\n forceShow = false,\n delayDuration,\n // trigger props\n triggerAsChild = false,\n}: Props) => {\n const [open, setOpen] = useState(false);\n\n const resolvedVariant = (() => {\n if (!!variant) return variant;\n if (typeof tooltip === 'string' && tooltip.length > ACTION_TOOLTIP_LIMIT) return 'explanatory';\n\n return 'action';\n })();\n\n const isActionVariant = resolvedVariant === 'action';\n\n const handleKeyUp: ComponentProps<typeof Trigger>['onKeyUp'] = (event) => {\n if (![keyCodes.ENTER, keyCodes.SPACE].includes(event.key)) return;\n event.stopPropagation();\n };\n\n return (\n <TooltipRoot\n open={!!tooltip && (open || forceShow) && !forceHide}\n onOpenChange={setOpen}\n delayDuration={delayDuration}\n disableHoverableContent={isActionVariant}\n >\n <TooltipTrigger\n asChild={triggerAsChild}\n keepOpenOnClick={keepOpenOnTriggerClick}\n onKeyUp={handleKeyUp}\n >\n {children}\n </TooltipTrigger>\n\n <TooltipContent\n className={className}\n variant={resolvedVariant}\n placement={placement}\n keepOpenOnPointerDownOutside={keepOpenOnTriggerClick}\n >\n {tooltip}\n </TooltipContent>\n </TooltipRoot>\n );\n};\n\nTooltip.Root = TooltipRoot;\nTooltip.Content = TooltipContent;\nTooltip.Trigger = TooltipTrigger;\n","import type { ComponentType } from 'react';\n\nimport { TooltipProvider } from '../components/Tooltip';\n\nexport const withTooltipProvider = (Story: ComponentType) => (\n <TooltipProvider>\n <Story />\n </TooltipProvider>\n);\n\n// Marks a story whose final render arrives asynchronously (lazy chunk, debounced\n// parse). The visual suite waits for every `[data-skeleton]` inside this box to\n// unmount before capturing, so the baseline is the settled content, never the\n// placeholder it briefly shows.\nexport const withVisualSettle = (Story: ComponentType) => (\n <div data-visual-settle>\n <Story />\n </div>\n);\n\n// position:fixed only fills the Storybook iframe, not the browser window.\nexport const withHiddenFullscreen = (Story: ComponentType) => (\n <div className=\"tw:[&_[aria-label=Fullscreen]]:hidden\">\n <Story />\n </div>\n);\n","export const createPrefixedString = (prefix: string) => (literals: TemplateStringsArray) =>\n literals.reduce((acc, literal) => acc + literal, `${prefix}-`);\n","export const noop = () => void 0;\n","type DebouncedFn<T extends (...args: any[]) => void> = {\n (...args: Parameters<T>): void;\n cancel: () => void;\n};\n\nexport const debounce = <T extends (...args: any[]) => void>(\n fn: T,\n delay: number,\n): DebouncedFn<T> => {\n let timeoutId: ReturnType<typeof setTimeout>;\n const debounced = (...args: Parameters<T>) => {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(() => fn(...args), delay);\n };\n debounced.cancel = () => clearTimeout(timeoutId);\n return debounced;\n};\n","// Platform detection\ntype NavigatorUAData = {\n platform: string;\n brands: { brand: string; version: string }[];\n mobile: boolean;\n};\n\nconst getIsMac = (): boolean => {\n // Modern approach using navigator.userAgentData\n if (typeof navigator !== 'undefined' && 'userAgentData' in navigator) {\n const platform = (navigator.userAgentData as NavigatorUAData).platform;\n\n if (typeof platform === 'string') {\n return platform.toLowerCase() === 'macos';\n }\n }\n\n if (typeof navigator !== 'undefined' && typeof navigator.platform === 'string') {\n return navigator.platform.toUpperCase().indexOf('MAC') >= 0;\n }\n\n // Server-side rendering fallback\n return false;\n};\n\nexport const isMac = getIsMac();\n","import { useEffect, useState } from 'react';\n\n// https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/digest#converting_a_digest_to_a_hex_string\nconst sha256 = async (text: string) => {\n const msgUint8 = new TextEncoder().encode(text);\n const hashBuffer = await crypto.subtle.digest('SHA-256', msgUint8);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n return hashArray.map((b) => b.toString(16).padStart(2, '0')).join('');\n};\n\nexport const useSHA256 = (text?: string) => {\n const [hash, setHash] = useState('');\n\n useEffect(() => {\n if (!text) return;\n let cancelled = false;\n sha256(text).then((h) => {\n if (!cancelled) setHash(h);\n });\n return () => {\n cancelled = true;\n };\n }, [text]);\n\n // Empty input has no hash — derive it during render instead of syncing state\n // in the effect (avoids the extra render and a stale-value frame).\n return text ? hash : '';\n};\n"],"mappings":"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"}
|