themelia-react-ui 2.0.2 → 2.0.3
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/CHANGELOG.md +17 -7
- package/README.md +9 -13
- package/THIRD_PARTY_NOTICES.md +6 -12
- package/dist/{auth-ax2BqjrI.js → auth-BGua8ouh.js} +2 -2
- package/dist/{auth-ax2BqjrI.js.map → auth-BGua8ouh.js.map} +1 -1
- package/dist/base/cascader.js +1 -1
- package/dist/base/combobox.js +2 -2
- package/dist/base/date-pickers.js +2 -2
- package/dist/base/popover-menu.js +1 -1
- package/dist/base/popover.js +1 -1
- package/dist/base/sheet.js +1 -1
- package/dist/base/sidebar.js +1 -1
- package/dist/base/value-inputs.js +1 -1
- package/dist/blocks/commerce.js +1 -1
- package/dist/{combobox-xCQ2RMNE.js → combobox-DaHESuiL.js} +154 -108
- package/dist/combobox-DaHESuiL.js.map +1 -0
- package/dist/{combobox-C0EQW6dr.js → combobox-Dxo2fAYQ.js} +342 -340
- package/dist/combobox-Dxo2fAYQ.js.map +1 -0
- package/dist/{comments-BYYlTA8E.js → comments-DD0DUPwJ.js} +4 -4
- package/dist/{comments-BYYlTA8E.js.map → comments-DD0DUPwJ.js.map} +1 -1
- package/dist/components/base/combobox/combobox-field.d.ts +16 -0
- package/dist/components/ui/combobox-dismiss.d.ts +16 -0
- package/dist/components/ui/combobox.d.ts +11 -6
- package/dist/components/ui/dialog.d.ts +1 -1
- package/dist/components/ui/popover.d.ts +1 -1
- package/dist/components/ui/sheet.d.ts +1 -1
- package/dist/{date-picker-ay0Pha_a.js → date-picker-B2K3ucWn.js} +2 -2
- package/dist/{date-picker-ay0Pha_a.js.map → date-picker-B2K3ucWn.js.map} +1 -1
- package/dist/{date-pickers-Ccw8DL2b.js → date-pickers-Ds8gLaoP.js} +3 -3
- package/dist/{date-pickers-Ccw8DL2b.js.map → date-pickers-Ds8gLaoP.js.map} +1 -1
- package/dist/features/activities.js +2 -2
- package/dist/features/async-preview.js +1 -1
- package/dist/features/combobox.js +1 -1
- package/dist/features/comments.js +1 -1
- package/dist/features/data-view.js +2 -2
- package/dist/features/email-composer.js +2 -2
- package/dist/features/event-calendar.js +1 -1
- package/dist/features/filters.js +1 -1
- package/dist/features/global-search.js +1 -1
- package/dist/features/map.js +1 -1
- package/dist/features/media-library.js +1 -1
- package/dist/features/mentions.js +1 -1
- package/dist/features/overlays.js +1 -1
- package/dist/features/products.js +1 -1
- package/dist/features/resource-assignment.js +1 -1
- package/dist/features/schema-form.js +1 -1
- package/dist/features/suggestions.js +1 -1
- package/dist/features/theme-tweaker.js +2 -2
- package/dist/{filters-BGfvjP4d.js → filters-DJVAveHA.js} +4 -4
- package/dist/{filters-BGfvjP4d.js.map → filters-DJVAveHA.js.map} +1 -1
- package/dist/{header-CGXuhcRm.js → header-BSfIEWbI.js} +4 -4
- package/dist/{header-CGXuhcRm.js.map → header-BSfIEWbI.js.map} +1 -1
- package/dist/{hooks-Dkz0K2WT.js → hooks-ClH9thn4.js} +2 -2
- package/dist/{hooks-Dkz0K2WT.js.map → hooks-ClH9thn4.js.map} +1 -1
- package/dist/layout/auth.js +1 -1
- package/dist/layout/header.js +1 -1
- package/dist/layout/hooks.js +1 -1
- package/dist/layout/page.js +1 -1
- package/dist/layout/sidebar.js +2 -2
- package/dist/layout/workspace.js +1 -1
- package/dist/layout.js +6 -6
- package/dist/lib/use-popup-focus-recovery.d.ts +8 -0
- package/dist/{mentions-utuUvH1K.js → mentions-CGlEJ15c.js} +2 -2
- package/dist/{mentions-utuUvH1K.js.map → mentions-CGlEJ15c.js.map} +1 -1
- package/dist/{overlays-DNWmZrJ4.js → overlays-tMkF-VAN.js} +270 -268
- package/dist/overlays-tMkF-VAN.js.map +1 -0
- package/dist/{page-Bgl1F560.js → page-CL9YeH_V.js} +2 -2
- package/dist/{page-Bgl1F560.js.map → page-CL9YeH_V.js.map} +1 -1
- package/dist/{popover-7_m66eYW.js → popover-gnTOhbFM.js} +62 -60
- package/dist/popover-gnTOhbFM.js.map +1 -0
- package/dist/{popover-menu-B9WWygpa.js → popover-menu-Cn9rUkdc.js} +2 -2
- package/dist/{popover-menu-B9WWygpa.js.map → popover-menu-Cn9rUkdc.js.map} +1 -1
- package/dist/services/actions.js +1 -1
- package/dist/{sheet-CGpB3omz.js → sheet-ijlsjq-n.js} +70 -68
- package/dist/sheet-ijlsjq-n.js.map +1 -0
- package/dist/{sidebar-CPx_7YBa.js → sidebar-Db6gkh3U.js} +2 -2
- package/dist/{sidebar-CPx_7YBa.js.map → sidebar-Db6gkh3U.js.map} +1 -1
- package/dist/{sidebar-A0ElHINE.js → sidebar-DkTO4VTO.js} +3 -3
- package/dist/{sidebar-A0ElHINE.js.map → sidebar-DkTO4VTO.js.map} +1 -1
- package/dist/use-popup-focus-recovery-C0QPvgOR.js +36 -0
- package/dist/use-popup-focus-recovery-C0QPvgOR.js.map +1 -0
- package/dist/{value-inputs-DXPDjvBU.js → value-inputs-TaX4OjNk.js} +3 -3
- package/dist/{value-inputs-DXPDjvBU.js.map → value-inputs-TaX4OjNk.js.map} +1 -1
- package/dist/{workspace-Cdrg7k9f.js → workspace-B-OEm3Kf.js} +2 -2
- package/dist/{workspace-Cdrg7k9f.js.map → workspace-B-OEm3Kf.js.map} +1 -1
- package/docs/consumer-skill/SKILL.md +1 -1
- package/docs/consumer-skill/references/agents-md.md +1 -1
- package/docs/consumer-skill/references/installation.md +6 -0
- package/docs/consumer-skill/references/public-api.json +2 -2
- package/docs/consumer-skill/references/tokens.json +1 -1
- package/docs/consumer-skill/references/workflows.md +5 -4
- package/package.json +3 -3
- package/dist/combobox-C0EQW6dr.js.map +0 -1
- package/dist/combobox-xCQ2RMNE.js.map +0 -1
- package/dist/overlays-DNWmZrJ4.js.map +0 -1
- package/dist/popover-7_m66eYW.js.map +0 -1
- package/dist/sheet-CGpB3omz.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-Cdrg7k9f.js","names":["Icon","React","_Fragment","Text","DisplayLabel","Heading","focusRecipes","Stack","toneRecipes","Progress","interactionRecipes","Value","SecondaryValue","Badge","ItemMedia","ItemDescription","ItemActions","ItemGroup","ItemContent","Item","ItemTitle","hasPageHeaderCommands","PageHeaderCommands","useLayoutLinkRenderer","React$1","Fragment$1","defaultWorkspaceRecordHeaderStrings","defaultWorkspaceNavStrings","value","defaultWorkspaceLocaleStripStrings","CONTENT_WIDTH_CLASS","STATUS_ICON","Check","Circle","CircleAlert","STATUS_CLASS","clampPercent","DynamicWorkspaceIcon","icon","getStatus","item","active","WorkspaceLayout","props","hasSidebar","sidebar","hasRail","rail","ariaLabel","cn","contentWidth","className","header","headerClassName","bodyClassName","sidebarClassName","mainClassName","contentClassName","railClassName","isCommandList","WorkspaceRecordHeader","stringsProp","strings","useStrings","resolvedRenderLink","hasMetadata","metadata","secondaryCommands","secondaryActions","secondaryNodes","hasCommands","primaryAction","textGap","media","titleSlot","title","badges","status","description","index","actions","headerEnd","WorkspaceNav","groups","group","activeId","StatusIcon","completion","handleSelect","context","renderItem","rowContent","itemClassName","linkNode","footerSlot","WorkspaceLocaleStrip","handleLocaleClick","locale","onLocaleChange","locales","activeLocale","Button"],"sources":["../src/components/layout/workspace/workspace.strings.ts","../src/components/layout/workspace/workspace.tsx"],"sourcesContent":["export interface WorkspaceRecordHeaderStrings {\n\tmetadataLabel: string;\n\tactionsLabel: string;\n\tsecondaryActionsLabel: string;\n}\n\nexport const defaultWorkspaceRecordHeaderStrings: WorkspaceRecordHeaderStrings = {\n\tmetadataLabel: 'Record metadata',\n\tactionsLabel: 'Record actions',\n\tsecondaryActionsLabel: 'Secondary actions',\n};\n\nexport interface WorkspaceNavStrings {\n\tariaLabel: string;\n\tcompletionLabel: (value: number) => string;\n\tcurrentLabel: string;\n}\n\nexport const defaultWorkspaceNavStrings: WorkspaceNavStrings = {\n\tariaLabel: 'Workspace navigation',\n\tcompletionLabel: (value) => `${value}% complete`,\n\tcurrentLabel: 'Current',\n};\n\nexport interface WorkspaceLocaleStripStrings {\n\tariaLabel: string;\n\tactiveLabel: string;\n\tcompletionLabel: (value: number) => string;\n}\n\nexport const defaultWorkspaceLocaleStripStrings: WorkspaceLocaleStripStrings = {\n\tariaLabel: 'Workspace locales',\n\tactiveLabel: 'Active',\n\tcompletionLabel: (value) => `${value}% complete`,\n};\n","import * as React from 'react';\nimport {\n\tCheck,\n\tCircle,\n\tCircleAlert,\n\ttype LucideIcon,\n\t} from 'lucide-react';\n\nimport { Badge } from '../../base/badge';\nimport { Button } from '../../base/buttons';\nimport { Progress } from '../../base/feedback';\nimport {\n\tItem,\n\tItemActions,\n\tItemContent,\n\tItemDescription,\n\tItemGroup,\n\tItemMedia,\n\tItemTitle,\n} from '../../base/item';\nimport { Stack } from '../../base/structure';\nimport { SecondaryValue, Value } from '../../primitives';\nimport { DisplayLabel, Heading, Text } from '../../typography';\nimport { useStrings } from '../../../lib/strings';\nimport { cn } from '../../../lib/utils';\n\nimport { hasPageHeaderCommands, PageHeaderCommands, type PageHeaderAction } from '../../base/navigation/page-header/page-header-commands';\nimport { useLayoutLinkRenderer } from '../hooks';\nimport type { LayoutIconComponent } from '../layout.types';\nimport {\n\tdefaultWorkspaceLocaleStripStrings,\n\tdefaultWorkspaceNavStrings,\n\tdefaultWorkspaceRecordHeaderStrings,\n} from './workspace.strings';\nimport type {\n\tWorkspaceContentWidth,\n\tWorkspaceLayoutProps,\n\tWorkspaceLocaleItem,\n\tWorkspaceLocaleStripProps,\n\tWorkspaceNavItem,\n\tWorkspaceNavItemStatus,\n\tWorkspaceNavProps,\n\tWorkspaceRecordHeaderProps,\n} from './workspace.types';\nimport { focusRecipes } from '../../../lib/focus-recipes';\nimport { interactionRecipes } from '../../../lib/interaction-recipes';\nimport { toneRecipes } from '../../../lib/tone-recipes';\n\nconst CONTENT_WIDTH_CLASS: Record<WorkspaceContentWidth, string> = {\n\tdefault: '[--workspace-content-max-width:58rem]',\n\twide: '[--workspace-content-max-width:86rem]',\n\tfull: '[--workspace-content-max-width:none]',\n};\n\nconst STATUS_ICON: Record<WorkspaceNavItemStatus, LucideIcon> = {\n\tcomplete: Check,\n\tcurrent: Circle,\n\tattention: CircleAlert,\n\tdisabled: Circle,\n\tidle: Circle,\n};\n\nconst STATUS_CLASS: Record<WorkspaceNavItemStatus, string> = {\n\tcomplete: 'text-success',\n\tcurrent: 'text-primary-accent',\n\tattention: 'text-warning-accent',\n\t// Disabled dims like every disabled control rather than adding a fainter text tier.\n\tdisabled: 'text-muted-foreground opacity-50',\n\tidle: 'text-muted-foreground',\n};\n\nfunction clampPercent(value: number): number {\n\tif (!Number.isFinite(value)) return 0;\n\treturn Math.min(100, Math.max(0, Math.round(value)));\n}\n\nfunction DynamicWorkspaceIcon({\n\ticon,\n\tclassName,\n}: {\n\t/** Leading glyph. */\n\ticon?: LayoutIconComponent;\n\tclassName?: string;\n}) {\n\tif (!icon) return null;\n\tconst Icon = icon;\n\treturn <Icon className={className} aria-hidden=\"true\" />;\n}\n\nfunction getStatus(item: WorkspaceNavItem, active: boolean): WorkspaceNavItemStatus {\n\tif (item.disabled) return 'disabled';\n\tif (item.status) return item.status;\n\tif (item.warning) return 'attention';\n\tif (active) return 'current';\n\tif (item.completion !== undefined && clampPercent(item.completion) >= 100) return 'complete';\n\treturn 'idle';\n}\n\nexport const WorkspaceLayout = React.forwardRef<HTMLDivElement, WorkspaceLayoutProps>(function WorkspaceLayout({\n\theader,\n\tsidebar,\n\trail,\n\tchildren,\n\tcontentWidth = 'wide',\n\tclassName,\n\theaderClassName,\n\tbodyClassName,\n\tsidebarClassName,\n\tmainClassName,\n\tcontentClassName,\n\trailClassName,\n\tariaLabel,\n\tstyle,\n\t...props\n}, ref) {\n\tconst hasSidebar = !!sidebar;\n\tconst hasRail = !!rail;\n\n\treturn (\n\t\t<div\n\t\t\tref={ref}\n\t\t\taria-label={ariaLabel}\n\t\t\tclassName={cn(\n\t\t\t\t'workspace-layout--component @container/workspace-layout box-border flex h-full min-h-0 w-full flex-col overflow-y-auto overscroll-contain rounded-radius border border-border bg-background text-foreground',\n\t\t\t\t'[--workspace-sidebar-width:var(--shell-sidebar-width)] [--workspace-rail-width:20rem]',\n\t\t\t\tCONTENT_WIDTH_CLASS[contentWidth],\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\tstyle={style}\n\t\t\t{...props}\n\t\t>\n\t\t\t{!!header && (\n\t\t\t\t<header className={cn('workspace-layout--header shrink-0 border-b border-border bg-background', headerClassName)}>\n\t\t\t\t\t{header}\n\t\t\t\t</header>\n\t\t\t)}\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'workspace-layout--body grid min-h-0 flex-none grid-cols-1 bg-muted/30 @min-[80rem]/workspace-layout:flex-1',\n\t\t\t\t\thasSidebar && !hasRail && '@min-[80rem]/workspace-layout:grid-cols-[var(--workspace-sidebar-width)_minmax(0,1fr)]',\n\t\t\t\t\thasSidebar && hasRail && '@min-[80rem]/workspace-layout:grid-cols-[var(--workspace-sidebar-width)_minmax(0,1fr)] @min-[96rem]/workspace-layout:grid-cols-[var(--workspace-sidebar-width)_minmax(0,1fr)_var(--workspace-rail-width)]',\n\t\t\t\t\t!hasSidebar && hasRail && '@min-[96rem]/workspace-layout:grid-cols-[minmax(0,1fr)_var(--workspace-rail-width)]',\n\t\t\t\t\tbodyClassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{!!hasSidebar && (\n\t\t\t\t\t<aside\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'workspace-layout--sidebar hidden min-h-0 border-r border-border bg-background @min-[80rem]/workspace-layout:block',\n\t\t\t\t\t\t\tsidebarClassName,\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div className=\"h-full overflow-y-auto overscroll-contain p-space-lg\">\n\t\t\t\t\t\t\t{sidebar}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</aside>\n\t\t\t\t)}\n\t\t\t\t<main\n\t\t\t\t\ttabIndex={0}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t`workspace-layout--main min-h-0 min-w-0 overflow-visible @min-[80rem]/workspace-layout:overflow-y-auto overscroll-contain focus-visible:outline-none ${focusRecipes.inset}`,\n\t\t\t\t\t\tmainClassName,\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'workspace-layout--content box-border mx-auto flex min-h-full w-full max-w-[var(--workspace-content-max-width)] flex-col gap-space-xl p-surface-lg',\n\t\t\t\t\t\t\tcontentWidth === 'full' && 'max-w-none',\n\t\t\t\t\t\t\tcontentClassName,\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</div>\n\t\t\t\t</main>\n\t\t\t\t{!!hasRail && (\n\t\t\t\t\t<aside\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'workspace-layout--rail hidden min-h-0 border-l border-border bg-background @min-[96rem]/workspace-layout:block',\n\t\t\t\t\t\t\trailClassName,\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div className=\"h-full overflow-y-auto overscroll-contain p-space-lg\">\n\t\t\t\t\t\t\t{rail}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</aside>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t);\n});\n\nWorkspaceLayout.displayName = 'WorkspaceLayout';\n\n/** Role-based command objects rather than rendered elements. */\nfunction isCommandList(value: unknown): value is readonly PageHeaderAction[] {\n\treturn Array.isArray(value) && value.every((item) =>\n\t\titem !== null && typeof item === 'object' && !React.isValidElement(item) && 'label' in item);\n}\n\nexport const WorkspaceRecordHeader = React.forwardRef<HTMLDivElement, WorkspaceRecordHeaderProps>(function WorkspaceRecordHeader({\n\ttitle,\n\tdescription,\n\ttextGap = 'dense',\n\tbadges,\n\tmetadata,\n\tactions,\n\tprimaryAction,\n\tsecondaryActions,\n\tmoreActionsLabel = 'More actions',\n\trenderLink,\n\tstatus,\n\tmedia,\n\theaderEnd,\n\ttitleSlot,\n\tclassName,\n\tstrings: stringsProp,\n\t...props\n}, ref) {\n\tconst strings = useStrings(defaultWorkspaceRecordHeaderStrings, stringsProp);\n\tconst resolvedRenderLink = useLayoutLinkRenderer({ renderLink });\n\tconst hasMetadata = !!metadata?.length;\n\t// Command objects take the shared role-based row; elements keep the\n\t// previous free-form cluster.\n\tconst secondaryCommands = isCommandList(secondaryActions) ? secondaryActions : undefined;\n\tconst secondaryNodes = secondaryCommands ? undefined : (secondaryActions as React.ReactNode);\n\tconst hasCommands = hasPageHeaderCommands(primaryAction, secondaryCommands);\n\n\treturn (\n\t\t<Stack\n\t\t\tref={ref}\n\t\t\tdirection=\"horizontal\"\n\t\t\tgap=\"xl\"\n\t\t\talign=\"start\"\n\t\t\tjustify=\"between\"\n\t\t\twrap\n\t\t\tclassName={cn(\n\t\t\t\t'workspace-record-header--component p-surface-lg',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t\t<Stack gap={textGap} className=\"workspace-record-header--identity min-w-0 max-w-full flex-1 basis-64\">\n\t\t\t\t\t<Stack direction=\"horizontal\" gap=\"lg\" align=\"center\" wrap={false}>\n\t\t\t\t{!!media && (\n\t\t\t\t\t<div className=\"workspace-record-header--media flex size-12 shrink-0 items-center justify-center overflow-hidden rounded-inner border border-border bg-muted/30\">\n\t\t\t\t\t\t{media}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t\t\t\t<Stack direction=\"horizontal\" gap=\"md\" className=\"workspace-record-header--title-row min-w-0 flex-1\">\n\t\t\t\t\t\t{titleSlot ?? (\n\t\t\t\t\t\t\t<Heading tag=\"h4\" className=\"[overflow-wrap:anywhere]\">\n\t\t\t\t\t\t\t\t{title}\n\t\t\t\t\t\t\t</Heading>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{!!badges && <Stack direction=\"horizontal\" wrap align=\"center\" gap=\"sm\" className=\"workspace-record-header--badges\">{badges}</Stack>}\n\t\t\t\t\t\t\t{!!status && <div className=\"workspace-record-header--status\">{status}</div>}\n\t\t\t\t\t\t</Stack>\n\t\t\t\t\t</Stack>\n\t\t\t\t\t{!!description && (\n\t\t\t\t\t\t<Text type=\"secondary\" lineHeight=\"relaxed\" className=\"workspace-record-header--description max-w-4xl\">\n\t\t\t\t\t\t\t{description}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t)}\n\t\t\t\t\t{!!hasMetadata && (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\taria-label={strings.metadataLabel}\n\t\t\t\t\t\t\tclassName=\"workspace-record-header--metadata flex flex-wrap items-center gap-x-space-xl gap-y-space-xs\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{metadata.map((item, index) => (\n\t\t\t\t\t\t\t\t<div key={item.id ?? index} className=\"flex items-baseline gap-space-sm\">\n\t\t\t\t\t\t\t\t\t<DisplayLabel>\n\t\t\t\t\t\t\t\t\t\t{item.label}\n\t\t\t\t\t\t\t\t\t</DisplayLabel>\n\t\t\t\t\t\t\t\t\t<Value className=\"tabular-nums\">\n\t\t\t\t\t\t\t\t\t\t{item.value}\n\t\t\t\t\t\t\t\t\t</Value>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</Stack>\n\t\t\t{!!(actions || secondaryNodes || hasCommands || headerEnd) && (\n\t\t\t\t<div className=\"workspace-record-header--actions flex max-w-full shrink-0 flex-wrap items-center gap-space-md justify-end\">\n\t\t\t\t\t{!!secondaryNodes && (\n\t\t\t\t\t\t<Stack direction=\"horizontal\" wrap align=\"center\" gap=\"sm\" aria-label={strings.secondaryActionsLabel}>\n\t\t\t\t\t\t\t{secondaryNodes}\n\t\t\t\t\t\t</Stack>\n\t\t\t\t\t)}\n\t\t\t\t\t{!!actions && (\n\t\t\t\t\t\t<Stack direction=\"horizontal\" wrap align=\"center\" gap=\"sm\" aria-label={strings.actionsLabel}>\n\t\t\t\t\t\t\t{actions}\n\t\t\t\t\t\t</Stack>\n\t\t\t\t\t)}\n\t\t\t\t\t{hasCommands && (\n\t\t\t\t\t\t<PageHeaderCommands\n\t\t\t\t\t\t\tprimaryAction={primaryAction}\n\t\t\t\t\t\t\tsecondaryActions={secondaryCommands}\n\t\t\t\t\t\t\tmoreActionsLabel={moreActionsLabel}\n\t\t\t\t\t\t\trenderLink={resolvedRenderLink}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t\t{!!headerEnd && <div className=\"workspace-record-header--end\">{headerEnd}</div>}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</Stack>\n\t);\n});\n\nWorkspaceRecordHeader.displayName = 'WorkspaceRecordHeader';\n\nexport const WorkspaceNav = React.forwardRef<HTMLElement, WorkspaceNavProps>(function WorkspaceNav({\n\tgroups,\n\tactiveId,\n\tonSelect,\n\trenderItem,\n\tfooterSlot,\n\trenderLink,\n\tclassName,\n\tstrings: stringsProp,\n\t...props\n}, ref) {\n\tconst strings = useStrings(defaultWorkspaceNavStrings, stringsProp);\n\tconst resolvedRenderLink = useLayoutLinkRenderer({ renderLink });\n\n\treturn (\n\t\t<Stack\n\t\t\trender={(\n\t\t\t\t<nav\n\t\t\t\t\tref={ref}\n\t\t\t\t\taria-label={props['aria-label'] ?? strings.ariaLabel}\n\t\t\t\t\t{...props}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\tgap=\"xl\"\n\t\t\tclassName={cn('workspace-nav--component h-full', className)}\n\t\t>\n\t\t\t<Stack gap=\"xl\" className=\"workspace-nav--groups min-h-0 flex-1\">\n\t\t\t\t{groups.map((group) => (\n\t\t\t\t\t<Stack key={group.id} gap=\"md\" className=\"workspace-nav--group\">\n\t\t\t\t\t\t{!!group.label && (\n\t\t\t\t\t\t\t<Stack gap=\"dense\" className=\"workspace-nav--group-header px-space-xs\">\n\t\t\t\t\t\t\t\t<DisplayLabel>\n\t\t\t\t\t\t\t\t\t{group.label}\n\t\t\t\t\t\t\t\t</DisplayLabel>\n\t\t\t\t\t\t\t\t{!!group.description && (\n\t\t\t\t\t\t\t\t\t<Text size=\"xs\" type=\"secondary\">\n\t\t\t\t\t\t\t\t\t\t{group.description}\n\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</Stack>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<ItemGroup className=\"workspace-nav--items gap-space-xs\">\n\t\t\t\t\t\t\t{group.items.map((item, index) => {\n\t\t\t\t\t\t\t\tconst active = item.id === activeId;\n\t\t\t\t\t\t\t\tconst status = getStatus(item, active);\n\t\t\t\t\t\t\t\tconst StatusIcon = STATUS_ICON[status];\n\t\t\t\t\t\t\t\tconst completion = item.completion === undefined ? undefined : clampPercent(item.completion);\n\t\t\t\t\t\t\t\tconst handleSelect = (event: React.MouseEvent<HTMLElement>) => {\n\t\t\t\t\t\t\t\t\tif (item.disabled) {\n\t\t\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tonSelect?.(item);\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\tconst context = { active, group, index, onSelect: handleSelect };\n\n\t\t\t\t\t\t\t\tif (renderItem) {\n\t\t\t\t\t\t\t\t\treturn <React.Fragment key={item.id}>{renderItem(item, context)}</React.Fragment>;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tconst rowContent = (\n\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t<ItemMedia variant=\"icon\" className={cn(active && 'text-accent-foreground')}>\n\t\t\t\t\t\t\t\t\t\t\t{item.icon ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<DynamicWorkspaceIcon icon={item.icon} className=\"size-icon\" />\n\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\t<StatusIcon className={cn('size-icon-md', STATUS_CLASS[status])} aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</ItemMedia>\n\t\t\t\t\t\t\t\t\t\t<ItemContent>\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-space-sm\">\n\t\t\t\t\t\t\t\t\t\t\t\t<ItemTitle>{item.label}</ItemTitle>\n\t\t\t\t\t\t\t\t\t\t\t\t{active && (\n\t\t\t\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"inherit\" className=\"sr-only\">{strings.currentLabel}</Text>\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t{!!item.description && <ItemDescription clamp={2}>{item.description}</ItemDescription>}\n\t\t\t\t\t\t\t\t\t\t\t{completion !== undefined && (\n\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"mt-1.5 flex items-center gap-space-md\">\n\t\t\t\t\t\t\t\t\t\t\t<Progress\n\t\t\t\t\t\t\t\t\t\t\t\tvalue={completion}\n\t\t\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t\t\taria-label={strings.completionLabel(completion)}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"flex-1\"\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<SecondaryValue size=\"xs\" className=\"tabular-nums\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{strings.completionLabel(completion)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</SecondaryValue>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</ItemContent>\n\t\t\t\t\t\t\t\t\t\t{!!item.badge && <ItemActions>{item.badge}</ItemActions>}\n\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\tconst itemClassName = cn(\n\t\t\t\t\t\t\t\t\t'workspace-nav--item w-full border border-transparent px-row-x py-row-y text-left transition-colors',\n\t\t\t\t\t\t\t\t\tactive && interactionRecipes.rowCurrent,\n\t\t\t\t\t\t\t\t\titem.warning && !active && cn(toneRecipes.warning.edge, toneRecipes.warning.wash),\n\t\t\t\t\t\t\t\t\titem.disabled && 'pointer-events-none opacity-50',\n\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\tif (item.href) {\n\t\t\t\t\t\t\t\t\tconst linkNode = resolvedRenderLink({\n\t\t\t\t\t\t\t\t\t\thref: item.href,\n\t\t\t\t\t\t\t\t\t\tchildren: rowContent,\n\t\t\t\t\t\t\t\t\t\tclassName: 'block',\n\t\t\t\t\t\t\t\t\t\tactive,\n\t\t\t\t\t\t\t\t\t\tdisabled: item.disabled,\n\t\t\t\t\t\t\t\t\t\texternal: item.external,\n\t\t\t\t\t\t\t\t\t\ttarget: item.target,\n\t\t\t\t\t\t\t\t\t\trel: item.rel,\n\t\t\t\t\t\t\t\t\t\tonClick: handleSelect as React.MouseEventHandler<HTMLAnchorElement>,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<Item key={item.id} size=\"md\" render={linkNode as React.ReactElement} className={itemClassName}>\n\t\t\t\t\t\t\t\t\t\t\t{rowContent}\n\t\t\t\t\t\t\t\t\t\t</Item>\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<Item\n\t\t\t\t\t\t\t\t\t\tkey={item.id}\n\t\t\t\t\t\t\t\t\t\tsize=\"md\"\n\t\t\t\t\t\t\t\t\t\trender={<button type=\"button\" onClick={handleSelect} disabled={item.disabled} />}\n\t\t\t\t\t\t\t\t\t\tclassName={itemClassName}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{rowContent}\n\t\t\t\t\t\t\t\t\t</Item>\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t</ItemGroup>\n\t\t\t\t\t</Stack>\n\t\t\t\t))}\n\t\t\t</Stack>\n\t\t\t{!!footerSlot && <div className=\"workspace-nav--footer shrink-0 border-t border-border pt-space-lg\">{footerSlot}</div>}\n\t\t</Stack>\n\t);\n});\n\nWorkspaceNav.displayName = 'WorkspaceNav';\n\nexport const WorkspaceLocaleStrip = React.forwardRef<HTMLDivElement, WorkspaceLocaleStripProps>(function WorkspaceLocaleStrip({\n\tlocales,\n\tactiveLocale,\n\tonLocaleChange,\n\tactions,\n\tstatus,\n\tclassName,\n\tstrings: stringsProp,\n\t...props\n}, ref) {\n\tconst strings = useStrings(defaultWorkspaceLocaleStripStrings, stringsProp);\n\n\tconst handleLocaleClick = (locale: WorkspaceLocaleItem) => {\n\t\tif (locale.disabled) return;\n\t\tonLocaleChange?.(locale);\n\t};\n\n\treturn (\n\t\t<div\n\t\t\tref={ref}\n\t\t\tclassName={cn('workspace-locale-strip--component flex flex-col gap-space-lg border-t border-border bg-muted/50 px-surface-lg py-surface min-[64rem]:flex-row min-[64rem]:items-center min-[64rem]:justify-between', className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<Stack direction=\"horizontal\" wrap align=\"center\" gap=\"md\" className=\"workspace-locale-strip--locales min-w-0\" role=\"group\" aria-label={strings.ariaLabel}>\n\t\t\t\t{locales.map((locale) => {\n\t\t\t\t\tconst active = locale.id === activeLocale;\n\t\t\t\t\tconst completion = locale.completion === undefined ? undefined : clampPercent(locale.completion);\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tkey={locale.id}\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\ttone={active ? 'primary' : 'secondary'}\n\t\t\t\t\t\t\tbuttonStyle={active ? 'solid' : 'ghost'}\n\t\t\t\t\t\t\tonClick={() => handleLocaleClick(locale)}\n\t\t\t\t\t\t\tdisabled={locale.disabled}\n\t\t\t\t\t\t\taria-pressed={active}\n\t\t\t\t\t\t\tclassName={cn('workspace-locale-strip--item justify-start')}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Stack direction=\"horizontal\" align=\"center\" gap=\"md\" render={<span />} className=\"min-w-0\">\n\t\t\t\t\t\t\t<Text tag=\"span\" size=\"inherit\" className=\"truncate text-inherit\">{locale.label}</Text>\n\t\t\t\t\t\t\t{active && <Text tag=\"span\" size=\"inherit\" className=\"sr-only\">{strings.activeLabel}</Text>}\n\t\t\t\t\t\t\t\t{completion !== undefined && (\n\t\t\t\t\t\t\t\t\t/* On an active pill the button surface is solid, so the tonal\n\t\t\t\t\t\t\t\t\t badge variants land coloured-on-coloured. Derive the nested\n\t\t\t\t\t\t\t\t\t badge from the primary foreground pair so it remains legible\n\t\t\t\t\t\t\t\t\t when dark themes intentionally lighten `--primary`. */\n\t\t\t\t\t\t\t\t\t<Badge\n\t\t\t\t\t\t\t\t\t\ttone={completion >= 100 ? 'success' : 'secondary'}\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t'shrink-0',\n\t\t\t\t\t\t\t\t\t\t\tactive && 'border-primary-foreground/20 bg-primary-foreground/10 text-primary-foreground',\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{strings.completionLabel(completion)}\n\t\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{!!locale.status && <span className=\"shrink-0\">{locale.status}</span>}\n\t\t\t\t\t\t\t</Stack>\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</Stack>\n\t\t\t{!!(status || actions) && (\n\t\t\t\t<Stack direction=\"horizontal\" wrap align=\"center\" gap=\"md\" className=\"workspace-locale-strip--actions shrink-0\">\n\t\t\t\t\t{!!status && <div className=\"workspace-locale-strip--status\">{status}</div>}\n\t\t\t\t\t{!!actions && <Stack direction=\"horizontal\" wrap align=\"center\" gap=\"sm\" className=\"\">{actions}</Stack>}\n\t\t\t\t</Stack>\n\t\t\t)}\n\t\t</div>\n\t);\n});\n\nWorkspaceLocaleStrip.displayName = 'WorkspaceLocaleStrip';\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"workspace-B-OEm3Kf.js","names":["Icon","React","_Fragment","Text","DisplayLabel","Heading","focusRecipes","Stack","toneRecipes","Progress","interactionRecipes","Value","SecondaryValue","Badge","ItemMedia","ItemDescription","ItemActions","ItemGroup","ItemContent","Item","ItemTitle","hasPageHeaderCommands","PageHeaderCommands","useLayoutLinkRenderer","React$1","Fragment$1","defaultWorkspaceRecordHeaderStrings","defaultWorkspaceNavStrings","value","defaultWorkspaceLocaleStripStrings","CONTENT_WIDTH_CLASS","STATUS_ICON","Check","Circle","CircleAlert","STATUS_CLASS","clampPercent","DynamicWorkspaceIcon","icon","getStatus","item","active","WorkspaceLayout","props","hasSidebar","sidebar","hasRail","rail","ariaLabel","cn","contentWidth","className","header","headerClassName","bodyClassName","sidebarClassName","mainClassName","contentClassName","railClassName","isCommandList","WorkspaceRecordHeader","stringsProp","strings","useStrings","resolvedRenderLink","hasMetadata","metadata","secondaryCommands","secondaryActions","secondaryNodes","hasCommands","primaryAction","textGap","media","titleSlot","title","badges","status","description","index","actions","headerEnd","WorkspaceNav","groups","group","activeId","StatusIcon","completion","handleSelect","context","renderItem","rowContent","itemClassName","linkNode","footerSlot","WorkspaceLocaleStrip","handleLocaleClick","locale","onLocaleChange","locales","activeLocale","Button"],"sources":["../src/components/layout/workspace/workspace.strings.ts","../src/components/layout/workspace/workspace.tsx"],"sourcesContent":["export interface WorkspaceRecordHeaderStrings {\n\tmetadataLabel: string;\n\tactionsLabel: string;\n\tsecondaryActionsLabel: string;\n}\n\nexport const defaultWorkspaceRecordHeaderStrings: WorkspaceRecordHeaderStrings = {\n\tmetadataLabel: 'Record metadata',\n\tactionsLabel: 'Record actions',\n\tsecondaryActionsLabel: 'Secondary actions',\n};\n\nexport interface WorkspaceNavStrings {\n\tariaLabel: string;\n\tcompletionLabel: (value: number) => string;\n\tcurrentLabel: string;\n}\n\nexport const defaultWorkspaceNavStrings: WorkspaceNavStrings = {\n\tariaLabel: 'Workspace navigation',\n\tcompletionLabel: (value) => `${value}% complete`,\n\tcurrentLabel: 'Current',\n};\n\nexport interface WorkspaceLocaleStripStrings {\n\tariaLabel: string;\n\tactiveLabel: string;\n\tcompletionLabel: (value: number) => string;\n}\n\nexport const defaultWorkspaceLocaleStripStrings: WorkspaceLocaleStripStrings = {\n\tariaLabel: 'Workspace locales',\n\tactiveLabel: 'Active',\n\tcompletionLabel: (value) => `${value}% complete`,\n};\n","import * as React from 'react';\nimport {\n\tCheck,\n\tCircle,\n\tCircleAlert,\n\ttype LucideIcon,\n\t} from 'lucide-react';\n\nimport { Badge } from '../../base/badge';\nimport { Button } from '../../base/buttons';\nimport { Progress } from '../../base/feedback';\nimport {\n\tItem,\n\tItemActions,\n\tItemContent,\n\tItemDescription,\n\tItemGroup,\n\tItemMedia,\n\tItemTitle,\n} from '../../base/item';\nimport { Stack } from '../../base/structure';\nimport { SecondaryValue, Value } from '../../primitives';\nimport { DisplayLabel, Heading, Text } from '../../typography';\nimport { useStrings } from '../../../lib/strings';\nimport { cn } from '../../../lib/utils';\n\nimport { hasPageHeaderCommands, PageHeaderCommands, type PageHeaderAction } from '../../base/navigation/page-header/page-header-commands';\nimport { useLayoutLinkRenderer } from '../hooks';\nimport type { LayoutIconComponent } from '../layout.types';\nimport {\n\tdefaultWorkspaceLocaleStripStrings,\n\tdefaultWorkspaceNavStrings,\n\tdefaultWorkspaceRecordHeaderStrings,\n} from './workspace.strings';\nimport type {\n\tWorkspaceContentWidth,\n\tWorkspaceLayoutProps,\n\tWorkspaceLocaleItem,\n\tWorkspaceLocaleStripProps,\n\tWorkspaceNavItem,\n\tWorkspaceNavItemStatus,\n\tWorkspaceNavProps,\n\tWorkspaceRecordHeaderProps,\n} from './workspace.types';\nimport { focusRecipes } from '../../../lib/focus-recipes';\nimport { interactionRecipes } from '../../../lib/interaction-recipes';\nimport { toneRecipes } from '../../../lib/tone-recipes';\n\nconst CONTENT_WIDTH_CLASS: Record<WorkspaceContentWidth, string> = {\n\tdefault: '[--workspace-content-max-width:58rem]',\n\twide: '[--workspace-content-max-width:86rem]',\n\tfull: '[--workspace-content-max-width:none]',\n};\n\nconst STATUS_ICON: Record<WorkspaceNavItemStatus, LucideIcon> = {\n\tcomplete: Check,\n\tcurrent: Circle,\n\tattention: CircleAlert,\n\tdisabled: Circle,\n\tidle: Circle,\n};\n\nconst STATUS_CLASS: Record<WorkspaceNavItemStatus, string> = {\n\tcomplete: 'text-success',\n\tcurrent: 'text-primary-accent',\n\tattention: 'text-warning-accent',\n\t// Disabled dims like every disabled control rather than adding a fainter text tier.\n\tdisabled: 'text-muted-foreground opacity-50',\n\tidle: 'text-muted-foreground',\n};\n\nfunction clampPercent(value: number): number {\n\tif (!Number.isFinite(value)) return 0;\n\treturn Math.min(100, Math.max(0, Math.round(value)));\n}\n\nfunction DynamicWorkspaceIcon({\n\ticon,\n\tclassName,\n}: {\n\t/** Leading glyph. */\n\ticon?: LayoutIconComponent;\n\tclassName?: string;\n}) {\n\tif (!icon) return null;\n\tconst Icon = icon;\n\treturn <Icon className={className} aria-hidden=\"true\" />;\n}\n\nfunction getStatus(item: WorkspaceNavItem, active: boolean): WorkspaceNavItemStatus {\n\tif (item.disabled) return 'disabled';\n\tif (item.status) return item.status;\n\tif (item.warning) return 'attention';\n\tif (active) return 'current';\n\tif (item.completion !== undefined && clampPercent(item.completion) >= 100) return 'complete';\n\treturn 'idle';\n}\n\nexport const WorkspaceLayout = React.forwardRef<HTMLDivElement, WorkspaceLayoutProps>(function WorkspaceLayout({\n\theader,\n\tsidebar,\n\trail,\n\tchildren,\n\tcontentWidth = 'wide',\n\tclassName,\n\theaderClassName,\n\tbodyClassName,\n\tsidebarClassName,\n\tmainClassName,\n\tcontentClassName,\n\trailClassName,\n\tariaLabel,\n\tstyle,\n\t...props\n}, ref) {\n\tconst hasSidebar = !!sidebar;\n\tconst hasRail = !!rail;\n\n\treturn (\n\t\t<div\n\t\t\tref={ref}\n\t\t\taria-label={ariaLabel}\n\t\t\tclassName={cn(\n\t\t\t\t'workspace-layout--component @container/workspace-layout box-border flex h-full min-h-0 w-full flex-col overflow-y-auto overscroll-contain rounded-radius border border-border bg-background text-foreground',\n\t\t\t\t'[--workspace-sidebar-width:var(--shell-sidebar-width)] [--workspace-rail-width:20rem]',\n\t\t\t\tCONTENT_WIDTH_CLASS[contentWidth],\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\tstyle={style}\n\t\t\t{...props}\n\t\t>\n\t\t\t{!!header && (\n\t\t\t\t<header className={cn('workspace-layout--header shrink-0 border-b border-border bg-background', headerClassName)}>\n\t\t\t\t\t{header}\n\t\t\t\t</header>\n\t\t\t)}\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'workspace-layout--body grid min-h-0 flex-none grid-cols-1 bg-muted/30 @min-[80rem]/workspace-layout:flex-1',\n\t\t\t\t\thasSidebar && !hasRail && '@min-[80rem]/workspace-layout:grid-cols-[var(--workspace-sidebar-width)_minmax(0,1fr)]',\n\t\t\t\t\thasSidebar && hasRail && '@min-[80rem]/workspace-layout:grid-cols-[var(--workspace-sidebar-width)_minmax(0,1fr)] @min-[96rem]/workspace-layout:grid-cols-[var(--workspace-sidebar-width)_minmax(0,1fr)_var(--workspace-rail-width)]',\n\t\t\t\t\t!hasSidebar && hasRail && '@min-[96rem]/workspace-layout:grid-cols-[minmax(0,1fr)_var(--workspace-rail-width)]',\n\t\t\t\t\tbodyClassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{!!hasSidebar && (\n\t\t\t\t\t<aside\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'workspace-layout--sidebar hidden min-h-0 border-r border-border bg-background @min-[80rem]/workspace-layout:block',\n\t\t\t\t\t\t\tsidebarClassName,\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div className=\"h-full overflow-y-auto overscroll-contain p-space-lg\">\n\t\t\t\t\t\t\t{sidebar}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</aside>\n\t\t\t\t)}\n\t\t\t\t<main\n\t\t\t\t\ttabIndex={0}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t`workspace-layout--main min-h-0 min-w-0 overflow-visible @min-[80rem]/workspace-layout:overflow-y-auto overscroll-contain focus-visible:outline-none ${focusRecipes.inset}`,\n\t\t\t\t\t\tmainClassName,\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'workspace-layout--content box-border mx-auto flex min-h-full w-full max-w-[var(--workspace-content-max-width)] flex-col gap-space-xl p-surface-lg',\n\t\t\t\t\t\t\tcontentWidth === 'full' && 'max-w-none',\n\t\t\t\t\t\t\tcontentClassName,\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</div>\n\t\t\t\t</main>\n\t\t\t\t{!!hasRail && (\n\t\t\t\t\t<aside\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'workspace-layout--rail hidden min-h-0 border-l border-border bg-background @min-[96rem]/workspace-layout:block',\n\t\t\t\t\t\t\trailClassName,\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div className=\"h-full overflow-y-auto overscroll-contain p-space-lg\">\n\t\t\t\t\t\t\t{rail}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</aside>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t);\n});\n\nWorkspaceLayout.displayName = 'WorkspaceLayout';\n\n/** Role-based command objects rather than rendered elements. */\nfunction isCommandList(value: unknown): value is readonly PageHeaderAction[] {\n\treturn Array.isArray(value) && value.every((item) =>\n\t\titem !== null && typeof item === 'object' && !React.isValidElement(item) && 'label' in item);\n}\n\nexport const WorkspaceRecordHeader = React.forwardRef<HTMLDivElement, WorkspaceRecordHeaderProps>(function WorkspaceRecordHeader({\n\ttitle,\n\tdescription,\n\ttextGap = 'dense',\n\tbadges,\n\tmetadata,\n\tactions,\n\tprimaryAction,\n\tsecondaryActions,\n\tmoreActionsLabel = 'More actions',\n\trenderLink,\n\tstatus,\n\tmedia,\n\theaderEnd,\n\ttitleSlot,\n\tclassName,\n\tstrings: stringsProp,\n\t...props\n}, ref) {\n\tconst strings = useStrings(defaultWorkspaceRecordHeaderStrings, stringsProp);\n\tconst resolvedRenderLink = useLayoutLinkRenderer({ renderLink });\n\tconst hasMetadata = !!metadata?.length;\n\t// Command objects take the shared role-based row; elements keep the\n\t// previous free-form cluster.\n\tconst secondaryCommands = isCommandList(secondaryActions) ? secondaryActions : undefined;\n\tconst secondaryNodes = secondaryCommands ? undefined : (secondaryActions as React.ReactNode);\n\tconst hasCommands = hasPageHeaderCommands(primaryAction, secondaryCommands);\n\n\treturn (\n\t\t<Stack\n\t\t\tref={ref}\n\t\t\tdirection=\"horizontal\"\n\t\t\tgap=\"xl\"\n\t\t\talign=\"start\"\n\t\t\tjustify=\"between\"\n\t\t\twrap\n\t\t\tclassName={cn(\n\t\t\t\t'workspace-record-header--component p-surface-lg',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t\t<Stack gap={textGap} className=\"workspace-record-header--identity min-w-0 max-w-full flex-1 basis-64\">\n\t\t\t\t\t<Stack direction=\"horizontal\" gap=\"lg\" align=\"center\" wrap={false}>\n\t\t\t\t{!!media && (\n\t\t\t\t\t<div className=\"workspace-record-header--media flex size-12 shrink-0 items-center justify-center overflow-hidden rounded-inner border border-border bg-muted/30\">\n\t\t\t\t\t\t{media}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t\t\t\t<Stack direction=\"horizontal\" gap=\"md\" className=\"workspace-record-header--title-row min-w-0 flex-1\">\n\t\t\t\t\t\t{titleSlot ?? (\n\t\t\t\t\t\t\t<Heading tag=\"h4\" className=\"[overflow-wrap:anywhere]\">\n\t\t\t\t\t\t\t\t{title}\n\t\t\t\t\t\t\t</Heading>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{!!badges && <Stack direction=\"horizontal\" wrap align=\"center\" gap=\"sm\" className=\"workspace-record-header--badges\">{badges}</Stack>}\n\t\t\t\t\t\t\t{!!status && <div className=\"workspace-record-header--status\">{status}</div>}\n\t\t\t\t\t\t</Stack>\n\t\t\t\t\t</Stack>\n\t\t\t\t\t{!!description && (\n\t\t\t\t\t\t<Text type=\"secondary\" lineHeight=\"relaxed\" className=\"workspace-record-header--description max-w-4xl\">\n\t\t\t\t\t\t\t{description}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t)}\n\t\t\t\t\t{!!hasMetadata && (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\taria-label={strings.metadataLabel}\n\t\t\t\t\t\t\tclassName=\"workspace-record-header--metadata flex flex-wrap items-center gap-x-space-xl gap-y-space-xs\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{metadata.map((item, index) => (\n\t\t\t\t\t\t\t\t<div key={item.id ?? index} className=\"flex items-baseline gap-space-sm\">\n\t\t\t\t\t\t\t\t\t<DisplayLabel>\n\t\t\t\t\t\t\t\t\t\t{item.label}\n\t\t\t\t\t\t\t\t\t</DisplayLabel>\n\t\t\t\t\t\t\t\t\t<Value className=\"tabular-nums\">\n\t\t\t\t\t\t\t\t\t\t{item.value}\n\t\t\t\t\t\t\t\t\t</Value>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</Stack>\n\t\t\t{!!(actions || secondaryNodes || hasCommands || headerEnd) && (\n\t\t\t\t<div className=\"workspace-record-header--actions flex max-w-full shrink-0 flex-wrap items-center gap-space-md justify-end\">\n\t\t\t\t\t{!!secondaryNodes && (\n\t\t\t\t\t\t<Stack direction=\"horizontal\" wrap align=\"center\" gap=\"sm\" aria-label={strings.secondaryActionsLabel}>\n\t\t\t\t\t\t\t{secondaryNodes}\n\t\t\t\t\t\t</Stack>\n\t\t\t\t\t)}\n\t\t\t\t\t{!!actions && (\n\t\t\t\t\t\t<Stack direction=\"horizontal\" wrap align=\"center\" gap=\"sm\" aria-label={strings.actionsLabel}>\n\t\t\t\t\t\t\t{actions}\n\t\t\t\t\t\t</Stack>\n\t\t\t\t\t)}\n\t\t\t\t\t{hasCommands && (\n\t\t\t\t\t\t<PageHeaderCommands\n\t\t\t\t\t\t\tprimaryAction={primaryAction}\n\t\t\t\t\t\t\tsecondaryActions={secondaryCommands}\n\t\t\t\t\t\t\tmoreActionsLabel={moreActionsLabel}\n\t\t\t\t\t\t\trenderLink={resolvedRenderLink}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t\t{!!headerEnd && <div className=\"workspace-record-header--end\">{headerEnd}</div>}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</Stack>\n\t);\n});\n\nWorkspaceRecordHeader.displayName = 'WorkspaceRecordHeader';\n\nexport const WorkspaceNav = React.forwardRef<HTMLElement, WorkspaceNavProps>(function WorkspaceNav({\n\tgroups,\n\tactiveId,\n\tonSelect,\n\trenderItem,\n\tfooterSlot,\n\trenderLink,\n\tclassName,\n\tstrings: stringsProp,\n\t...props\n}, ref) {\n\tconst strings = useStrings(defaultWorkspaceNavStrings, stringsProp);\n\tconst resolvedRenderLink = useLayoutLinkRenderer({ renderLink });\n\n\treturn (\n\t\t<Stack\n\t\t\trender={(\n\t\t\t\t<nav\n\t\t\t\t\tref={ref}\n\t\t\t\t\taria-label={props['aria-label'] ?? strings.ariaLabel}\n\t\t\t\t\t{...props}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\tgap=\"xl\"\n\t\t\tclassName={cn('workspace-nav--component h-full', className)}\n\t\t>\n\t\t\t<Stack gap=\"xl\" className=\"workspace-nav--groups min-h-0 flex-1\">\n\t\t\t\t{groups.map((group) => (\n\t\t\t\t\t<Stack key={group.id} gap=\"md\" className=\"workspace-nav--group\">\n\t\t\t\t\t\t{!!group.label && (\n\t\t\t\t\t\t\t<Stack gap=\"dense\" className=\"workspace-nav--group-header px-space-xs\">\n\t\t\t\t\t\t\t\t<DisplayLabel>\n\t\t\t\t\t\t\t\t\t{group.label}\n\t\t\t\t\t\t\t\t</DisplayLabel>\n\t\t\t\t\t\t\t\t{!!group.description && (\n\t\t\t\t\t\t\t\t\t<Text size=\"xs\" type=\"secondary\">\n\t\t\t\t\t\t\t\t\t\t{group.description}\n\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</Stack>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<ItemGroup className=\"workspace-nav--items gap-space-xs\">\n\t\t\t\t\t\t\t{group.items.map((item, index) => {\n\t\t\t\t\t\t\t\tconst active = item.id === activeId;\n\t\t\t\t\t\t\t\tconst status = getStatus(item, active);\n\t\t\t\t\t\t\t\tconst StatusIcon = STATUS_ICON[status];\n\t\t\t\t\t\t\t\tconst completion = item.completion === undefined ? undefined : clampPercent(item.completion);\n\t\t\t\t\t\t\t\tconst handleSelect = (event: React.MouseEvent<HTMLElement>) => {\n\t\t\t\t\t\t\t\t\tif (item.disabled) {\n\t\t\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tonSelect?.(item);\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\tconst context = { active, group, index, onSelect: handleSelect };\n\n\t\t\t\t\t\t\t\tif (renderItem) {\n\t\t\t\t\t\t\t\t\treturn <React.Fragment key={item.id}>{renderItem(item, context)}</React.Fragment>;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tconst rowContent = (\n\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t<ItemMedia variant=\"icon\" className={cn(active && 'text-accent-foreground')}>\n\t\t\t\t\t\t\t\t\t\t\t{item.icon ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<DynamicWorkspaceIcon icon={item.icon} className=\"size-icon\" />\n\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\t<StatusIcon className={cn('size-icon-md', STATUS_CLASS[status])} aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</ItemMedia>\n\t\t\t\t\t\t\t\t\t\t<ItemContent>\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-space-sm\">\n\t\t\t\t\t\t\t\t\t\t\t\t<ItemTitle>{item.label}</ItemTitle>\n\t\t\t\t\t\t\t\t\t\t\t\t{active && (\n\t\t\t\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"inherit\" className=\"sr-only\">{strings.currentLabel}</Text>\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t{!!item.description && <ItemDescription clamp={2}>{item.description}</ItemDescription>}\n\t\t\t\t\t\t\t\t\t\t\t{completion !== undefined && (\n\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"mt-1.5 flex items-center gap-space-md\">\n\t\t\t\t\t\t\t\t\t\t\t<Progress\n\t\t\t\t\t\t\t\t\t\t\t\tvalue={completion}\n\t\t\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t\t\taria-label={strings.completionLabel(completion)}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"flex-1\"\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<SecondaryValue size=\"xs\" className=\"tabular-nums\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{strings.completionLabel(completion)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</SecondaryValue>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</ItemContent>\n\t\t\t\t\t\t\t\t\t\t{!!item.badge && <ItemActions>{item.badge}</ItemActions>}\n\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\tconst itemClassName = cn(\n\t\t\t\t\t\t\t\t\t'workspace-nav--item w-full border border-transparent px-row-x py-row-y text-left transition-colors',\n\t\t\t\t\t\t\t\t\tactive && interactionRecipes.rowCurrent,\n\t\t\t\t\t\t\t\t\titem.warning && !active && cn(toneRecipes.warning.edge, toneRecipes.warning.wash),\n\t\t\t\t\t\t\t\t\titem.disabled && 'pointer-events-none opacity-50',\n\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\tif (item.href) {\n\t\t\t\t\t\t\t\t\tconst linkNode = resolvedRenderLink({\n\t\t\t\t\t\t\t\t\t\thref: item.href,\n\t\t\t\t\t\t\t\t\t\tchildren: rowContent,\n\t\t\t\t\t\t\t\t\t\tclassName: 'block',\n\t\t\t\t\t\t\t\t\t\tactive,\n\t\t\t\t\t\t\t\t\t\tdisabled: item.disabled,\n\t\t\t\t\t\t\t\t\t\texternal: item.external,\n\t\t\t\t\t\t\t\t\t\ttarget: item.target,\n\t\t\t\t\t\t\t\t\t\trel: item.rel,\n\t\t\t\t\t\t\t\t\t\tonClick: handleSelect as React.MouseEventHandler<HTMLAnchorElement>,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<Item key={item.id} size=\"md\" render={linkNode as React.ReactElement} className={itemClassName}>\n\t\t\t\t\t\t\t\t\t\t\t{rowContent}\n\t\t\t\t\t\t\t\t\t\t</Item>\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<Item\n\t\t\t\t\t\t\t\t\t\tkey={item.id}\n\t\t\t\t\t\t\t\t\t\tsize=\"md\"\n\t\t\t\t\t\t\t\t\t\trender={<button type=\"button\" onClick={handleSelect} disabled={item.disabled} />}\n\t\t\t\t\t\t\t\t\t\tclassName={itemClassName}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{rowContent}\n\t\t\t\t\t\t\t\t\t</Item>\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t</ItemGroup>\n\t\t\t\t\t</Stack>\n\t\t\t\t))}\n\t\t\t</Stack>\n\t\t\t{!!footerSlot && <div className=\"workspace-nav--footer shrink-0 border-t border-border pt-space-lg\">{footerSlot}</div>}\n\t\t</Stack>\n\t);\n});\n\nWorkspaceNav.displayName = 'WorkspaceNav';\n\nexport const WorkspaceLocaleStrip = React.forwardRef<HTMLDivElement, WorkspaceLocaleStripProps>(function WorkspaceLocaleStrip({\n\tlocales,\n\tactiveLocale,\n\tonLocaleChange,\n\tactions,\n\tstatus,\n\tclassName,\n\tstrings: stringsProp,\n\t...props\n}, ref) {\n\tconst strings = useStrings(defaultWorkspaceLocaleStripStrings, stringsProp);\n\n\tconst handleLocaleClick = (locale: WorkspaceLocaleItem) => {\n\t\tif (locale.disabled) return;\n\t\tonLocaleChange?.(locale);\n\t};\n\n\treturn (\n\t\t<div\n\t\t\tref={ref}\n\t\t\tclassName={cn('workspace-locale-strip--component flex flex-col gap-space-lg border-t border-border bg-muted/50 px-surface-lg py-surface min-[64rem]:flex-row min-[64rem]:items-center min-[64rem]:justify-between', className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<Stack direction=\"horizontal\" wrap align=\"center\" gap=\"md\" className=\"workspace-locale-strip--locales min-w-0\" role=\"group\" aria-label={strings.ariaLabel}>\n\t\t\t\t{locales.map((locale) => {\n\t\t\t\t\tconst active = locale.id === activeLocale;\n\t\t\t\t\tconst completion = locale.completion === undefined ? undefined : clampPercent(locale.completion);\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tkey={locale.id}\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\ttone={active ? 'primary' : 'secondary'}\n\t\t\t\t\t\t\tbuttonStyle={active ? 'solid' : 'ghost'}\n\t\t\t\t\t\t\tonClick={() => handleLocaleClick(locale)}\n\t\t\t\t\t\t\tdisabled={locale.disabled}\n\t\t\t\t\t\t\taria-pressed={active}\n\t\t\t\t\t\t\tclassName={cn('workspace-locale-strip--item justify-start')}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Stack direction=\"horizontal\" align=\"center\" gap=\"md\" render={<span />} className=\"min-w-0\">\n\t\t\t\t\t\t\t<Text tag=\"span\" size=\"inherit\" className=\"truncate text-inherit\">{locale.label}</Text>\n\t\t\t\t\t\t\t{active && <Text tag=\"span\" size=\"inherit\" className=\"sr-only\">{strings.activeLabel}</Text>}\n\t\t\t\t\t\t\t\t{completion !== undefined && (\n\t\t\t\t\t\t\t\t\t/* On an active pill the button surface is solid, so the tonal\n\t\t\t\t\t\t\t\t\t badge variants land coloured-on-coloured. Derive the nested\n\t\t\t\t\t\t\t\t\t badge from the primary foreground pair so it remains legible\n\t\t\t\t\t\t\t\t\t when dark themes intentionally lighten `--primary`. */\n\t\t\t\t\t\t\t\t\t<Badge\n\t\t\t\t\t\t\t\t\t\ttone={completion >= 100 ? 'success' : 'secondary'}\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t'shrink-0',\n\t\t\t\t\t\t\t\t\t\t\tactive && 'border-primary-foreground/20 bg-primary-foreground/10 text-primary-foreground',\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{strings.completionLabel(completion)}\n\t\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{!!locale.status && <span className=\"shrink-0\">{locale.status}</span>}\n\t\t\t\t\t\t\t</Stack>\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</Stack>\n\t\t\t{!!(status || actions) && (\n\t\t\t\t<Stack direction=\"horizontal\" wrap align=\"center\" gap=\"md\" className=\"workspace-locale-strip--actions shrink-0\">\n\t\t\t\t\t{!!status && <div className=\"workspace-locale-strip--status\">{status}</div>}\n\t\t\t\t\t{!!actions && <Stack direction=\"horizontal\" wrap align=\"center\" gap=\"sm\" className=\"\">{actions}</Stack>}\n\t\t\t\t</Stack>\n\t\t\t)}\n\t\t</div>\n\t);\n});\n\nWorkspaceLocaleStrip.displayName = 'WorkspaceLocaleStrip';\n"],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@ description: Use when building, integrating, theming or migrating React apps and
|
|
|
7
7
|
|
|
8
8
|
Build from the public owner that fits the task: resolve the installed contract,
|
|
9
9
|
pick the exact family import in the table or finder, read its declaration and
|
|
10
|
-
recipe, then adapt the app's data and callbacks. Never infer props from names.
|
|
10
|
+
recipe, then adapt the app's data and callbacks. Never infer props from names. Use official `@base-ui/react ^1.9.0`; see the [installed setup](references/installation.md) for dependency upgrades.
|
|
11
11
|
|
|
12
12
|
## House rules
|
|
13
13
|
|
|
@@ -6,7 +6,7 @@ Claude Code read; in a project that has only `CLAUDE.md`, paste it there. It
|
|
|
6
6
|
points agents at this installed skill and states when UI work is done.
|
|
7
7
|
|
|
8
8
|
```md
|
|
9
|
-
<!-- themelia-react-ui:start 2.0.
|
|
9
|
+
<!-- themelia-react-ui:start 2.0.3 -->
|
|
10
10
|
## UI built with themelia-react-ui
|
|
11
11
|
Before writing UI, read node_modules/themelia-react-ui/docs/consumer-skill/SKILL.md and the
|
|
12
12
|
installed declarations; prefer them over memory. Find the owner for a task with:
|
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# Installed package and skill setup
|
|
2
2
|
|
|
3
|
+
Themelia 2.0.3 requires the official `@base-ui/react ^1.9.0` npm peer alongside
|
|
4
|
+
React, React DOM and Lucide. An app already using `^1.9.0` can retain that range.
|
|
5
|
+
Remove any older private Base UI archive pin or override before refreshing the
|
|
6
|
+
lockfile; dismissal translations and nested popup focus belong to Themelia's
|
|
7
|
+
wrappers and work with the official package.
|
|
8
|
+
|
|
3
9
|
Run from the consuming app or one of its subdirectories. Resolve a public
|
|
4
10
|
entrypoint rather than guessing a hoisted node_modules path or importing
|
|
5
11
|
`themelia-react-ui/package.json`, which is not an exported entrypoint. The following
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"schemaVersion": 1,
|
|
3
3
|
"discoveryVersion": 1,
|
|
4
4
|
"package": "themelia-react-ui",
|
|
5
|
-
"version": "2.0.
|
|
5
|
+
"version": "2.0.3",
|
|
6
6
|
"stylesheets": [
|
|
7
7
|
"themelia-react-ui/style.css",
|
|
8
8
|
"themelia-react-ui/theme.css",
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
"peers": [
|
|
13
13
|
{
|
|
14
14
|
"name": "@base-ui/react",
|
|
15
|
-
"range": "1.
|
|
15
|
+
"range": "^1.9.0",
|
|
16
16
|
"optional": false
|
|
17
17
|
},
|
|
18
18
|
{
|
|
@@ -92,10 +92,11 @@ dismissal controls. `MultiCombobox` uses `strings.removeSelection(itemLabel)` fo
|
|
|
92
92
|
each removal button.
|
|
93
93
|
Custom base anatomy exposes `ComboboxInputTrigger` strings `{ clear, toggle }`,
|
|
94
94
|
`ComboboxClear` strings `{ clear }` and `ComboboxChip` strings `{ remove }`.
|
|
95
|
-
`ComboboxRoot`
|
|
96
|
-
|
|
97
|
-
and
|
|
98
|
-
popup dismissal.
|
|
95
|
+
`ComboboxRoot.dismissLabel` is a Themelia wrapper prop, independent of upstream
|
|
96
|
+
Root props. Install official `@base-ui/react ^1.9.0` from npm. The wrappers
|
|
97
|
+
localize both dismissal controls and preserve an existing focus target inside a
|
|
98
|
+
parent popup during deferred recovery after nested dismissal. Use the public
|
|
99
|
+
anatomy so these behaviors remain attached to their owners.
|
|
99
100
|
|
|
100
101
|
Strict imported declarations require the manifest's optional peers. DataTable
|
|
101
102
|
sorting is disabled because the app's server owns query order. Loading/error
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "themelia-react-ui",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.3",
|
|
4
4
|
"description": "A composable React UI library for modern admin applications, built on Base UI and Tailwind with shadcn-compatible themes, shared design tokens, reusable layouts, blocks and workflows.",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public",
|
|
@@ -481,7 +481,7 @@
|
|
|
481
481
|
"check:release": "npm run check:all && npm run check:agent && npm run build:docs && npm run check:static-docs"
|
|
482
482
|
},
|
|
483
483
|
"peerDependencies": {
|
|
484
|
-
"@base-ui/react": "1.
|
|
484
|
+
"@base-ui/react": "^1.9.0",
|
|
485
485
|
"@dnd-kit/core": "^6.0.0",
|
|
486
486
|
"@dnd-kit/sortable": "^10.0.0",
|
|
487
487
|
"@dnd-kit/utilities": "^3.0.0",
|
|
@@ -523,7 +523,7 @@
|
|
|
523
523
|
"zustand": "^5.0.12"
|
|
524
524
|
},
|
|
525
525
|
"devDependencies": {
|
|
526
|
-
"@base-ui/react": "
|
|
526
|
+
"@base-ui/react": "^1.9.0",
|
|
527
527
|
"@dnd-kit/core": "^6.3.1",
|
|
528
528
|
"@dnd-kit/sortable": "^10.0.0",
|
|
529
529
|
"@dnd-kit/utilities": "^3.2.2",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"combobox-C0EQW6dr.js","names":["_Fragment","_Fragment","React","ComboboxPrimitive","Combobox","BaseCombobox","Combobox","useDensityConfig","resolveComponentScale","cn","Button","Text","Stack","markRecipes","ErrorState","layerRecipes","fieldAffordanceRecipes","selectToggleRecipes","ComboboxStatus","ComboboxPositioner","ComboboxGroup","ComboboxItem","ComboboxList","ComboboxEmpty","ComboboxCollection","ComboboxChipsInput","ComboboxPopup","ComboboxChips","ComboboxChip","Combobox$2","ComboboxGroupLabel","ComboboxPortal","formControlMinHeightClasses","formControlPaddingClasses","Input","ScrollArea","useDebouncedCallback","React$1","Fragment$1","defaultComboboxStrings","itemLabel","CREATE_OPTION_SYMBOL","isCreateOption","item","getCreateOptionValue","createCreateOption","inputValue","LoadingMore","loading","className","Loader2","text","StatusText","StatusContent","trimmed","searchValue","strings","minSearchLength","remaining","primitiveSizeByComboboxSize","emptyClassByComboboxSize","ComboboxDropdown","positionerClassName","portalContainer","primitiveSize","size","showStatus","showEmpty","items","loadingMore","applyFooter","content","listRef","groupedItems","group","groupItems","groupLabel","renderGroupLabel","DisplayLabel","getItemDisabled","renderItemContent","getItemReactKey","createOptionItem","ErrorMessage","_size","error","escapeRegExp","str","HighlightedText","highlight","regex","parts","cursor","isMatch","index","key","part","highlightClassName","useDebouncedSearch","emitSearch","value","debounceMs","useGroupedItems","useMemo","getItemGroup","groups","groupKey","existing","useLoadMore","isLoadingRef","useRef","cooldownRef","requestLoadMore","onLoadMore","useEffect","useCallback","hasMore","event","scrollTop","clientHeight","scrollHeight","useComboboxStrings","useStrings","custom","hasExactMatch","normalizedSearch","getItemLabel","useComboboxCore","stringsProp","getKey","getItemKey","trimmedSearch","showListContent","listEl","handleScroll","baseItems","ensuredItems","merged","itemKey","ensured","showCreateOption","creatable","onCreate","PlusIcon","renderItem","label","highlightMatch","resolveComboboxSize","sizeProp","defaultScale","primitiveComboboxSizeBySize","getComboboxFormSize","ComboboxInputField","Combobox","clearable","required","clearLabel","XIcon","toggleLabel","ChevronDownIcon","Combobox$1","formSize","hasError","invalid","core","selectedValue","isOpen","setIsOpen","useState","handleOpenChange","nextOpen","clearSearchOnClose","onSearchValueChange","onOpenChange","displayInputValue","handleValueChange","onSelectedValueChange","details","reason","MultiCombobox","primitiveComboboxSize","containerRef","draftValues","setDraftValues","selectedValues","internalOpen","setInternalOpen","isOpenControlled","open","resolvedOpen","applyButton","setOpen","next","regularValues","createValue","values","onSelectedValuesChange","closeOnSelect","handleApply","onApply","handleCancel","onCancel","visibleValues","chipsPlaceholder","defaultAsyncResourceComboboxStrings","isSimpleText","AsyncResourceCombobox","props","isControlled","internalValue","setInternalValue","defaultValue","setSearchValue","setItems","isLoading","setIsLoading","fetchError","setFetchError","retryCount","setRetryCount","requestIdRef","nextValue","onValueChange","runFetch","fetcher","context","requestId","nextItems","onAfterFetch","nextError","onError","disabled","preload","controller","limit","retry","count","renderOption","description","getDescription","meta","getMeta","getLabel","resolvedError","errorMessage","hasFetchError","errorNode","renderError"],"sources":["../src/components/features/combobox/combobox.strings.ts","../src/components/features/combobox/constants.ts","../src/components/features/combobox/components/loading-more.tsx","../src/components/features/combobox/components/status-content.tsx","../src/components/features/combobox/components/combobox-dropdown.tsx","../src/components/features/combobox/components/error-message.tsx","../src/components/features/combobox/components/highlighted-text.tsx","../src/components/features/combobox/hooks/use-debounced-search.ts","../src/components/features/combobox/hooks/use-grouped-items.ts","../src/components/features/combobox/hooks/use-load-more.ts","../src/components/features/combobox/hooks/use-combobox-core.tsx","../src/components/features/combobox/combobox.tsx","../src/components/features/combobox/async-resource-combobox.tsx"],"sourcesContent":["/**\n * Default user-facing strings for `<Combobox>`.\n *\n * Consumers wire backend i18n at the call site:\n *\n * <Combobox strings={{ noResults: t('search.empty') }} … />\n *\n * Templates use `{placeholder}` tokens — the component substitutes them at\n * render time. Function-valued strings would also work; we keep templates\n * here for the constants file.\n */\nimport type { ComboboxStrings } from './types';\n\nexport const defaultComboboxStrings = {\n\tplaceholder: 'Search...',\n\tclear: 'Clear selection',\n\ttoggle: 'Open options',\n\tdismiss: 'Dismiss',\n\tremoveSelection: (itemLabel: string) => `Remove ${itemLabel}`,\n\tsearching: 'Loading...',\n\tnoResults: 'No results found.',\n\ttypeToSearch: 'Type at least {min} characters to search...',\n\ttypeMore: 'Type {remaining} more character{s} to search...',\n\tcreateNew: 'Create {value}',\n\tloadingMore: 'Loading...',\n\tapply: 'Apply',\n\tcancel: 'Cancel',\n} satisfies ComboboxStrings;\n\nexport type { ComboboxStrings };\n","/**\n * Constants and default values for the Combobox component.\n *\n * Default strings live in `./combobox.strings.ts` per rule 19.\n */\n\nexport { defaultComboboxStrings } from './combobox.strings';\n\n// ============================================================================\n// Default Values\n// ============================================================================\n\nexport const DEFAULT_MIN_SEARCH_LENGTH = 3;\n/** Re-exported so the combobox shares the library-wide debounce window. */\nexport { DEFAULT_DEBOUNCE_MS } from '../../../hooks/use-debounced-callback';\nexport const DEFAULT_SIZE = 'md';\nexport const LOAD_MORE_THRESHOLD = 0.8;\nexport const LOAD_MORE_DEBOUNCE_MS = 100;\nexport const LOAD_MORE_COOLDOWN_MS = 500;\n\n// ============================================================================\n// Symbols\n// ============================================================================\n\nexport const CREATE_OPTION_SYMBOL = Symbol('combobox-create-option');\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\nexport function isCreateOption<T>(item: T): item is T & { [CREATE_OPTION_SYMBOL]: string } {\n\treturn (\n\t\ttypeof item === 'object' &&\n\t\titem !== null &&\n\t\tCREATE_OPTION_SYMBOL in (item as object)\n\t);\n}\n\nexport function getCreateOptionValue<T>(item: T): string {\n\tif (!isCreateOption(item)) {\n\t\tthrow new Error('Item is not a create option');\n\t}\n\treturn (item as { [CREATE_OPTION_SYMBOL]: string })[CREATE_OPTION_SYMBOL];\n}\n\nexport function createCreateOption<T>(inputValue: string): T {\n\treturn { [CREATE_OPTION_SYMBOL]: inputValue } as unknown as T;\n}\n","/**\n * LoadingMore Component\n */\n\nimport { Loader2 } from 'lucide-react';\nimport * as React from 'react';\nimport { Stack } from '../../../base/structure';\nimport { Text } from '../../../typography';\nimport { cn } from '../../../../lib/utils';\n\nexport interface LoadingMoreProps {\n\t/** Shows the pending indicator. */\n\tloading: boolean;\n\t/** Visible label. */\n\ttext: string;\n\tclassName?: string;\n}\n\nexport function LoadingMore({\n\tloading,\n\ttext,\n\tclassName,\n}: LoadingMoreProps): React.ReactElement | null {\n\tif (!loading) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<Stack\n\t\t\tdirection=\"horizontal\"\n\t\t\tgap=\"sm\"\n\t\t\tjustify=\"center\"\n\t\t\twrap={false}\n\t\t\tclassName={cn('loading-more--component', \n\t\t\t\t'px-control py-space-xs text-xs text-muted-foreground',\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\trole=\"status\"\n\t\t\taria-live=\"polite\"\n\t\t>\n\t\t\t<Loader2 className=\"size-icon-sm animate-spin\" aria-hidden=\"true\" />\n\t\t\t<Text tag=\"span\" size=\"xs\" type=\"secondary\" className=\"text-inherit\">\n\t\t\t\t{text}\n\t\t\t</Text>\n\t\t</Stack>\n\t);\n}\n\nLoadingMore.displayName = 'LoadingMore';\n","/**\n * StatusContent Component\n */\n\nimport { Loader2 } from 'lucide-react';\nimport * as React from 'react';\nimport { Text } from '../../../typography';\nimport type { ComboboxStrings } from '../types';\n\nfunction StatusText({ children }: { children: string }) {\n\treturn (\n\t\t<Text tag=\"span\" size=\"inherit\" type=\"secondary\" className=\"text-inherit\">\n\t\t\t{children}\n\t\t</Text>\n\t);\n}\n\nexport interface StatusContentProps {\n\t/** Whether results are being fetched. */\n\tloading?: boolean;\n\t/** Current search text. */\n\tsearchValue: string;\n\t/** Characters required before the list becomes active. */\n\tminSearchLength: number;\n\t/** How many options matched, deciding between the empty and results copy. */\n\titemCount: number;\n\t/** Resolved copy for the status rows. */\n\tstrings: ComboboxStrings;\n}\n\nexport function StatusContent({\n\tloading,\n\tsearchValue,\n\tminSearchLength,\n\titemCount,\n\tstrings,\n}: StatusContentProps): React.ReactNode {\n\tconst trimmed = searchValue.trim();\n\n\tif (loading) {\n\t\treturn (\n\t\t\t<>\n\t\t\t\t<Loader2 className=\"size-icon-sm animate-spin\" />\n\t\t\t\t<StatusText>{strings.searching}</StatusText>\n\t\t\t</>\n\t\t);\n\t}\n\n\tif (trimmed === '') {\n\t\tif (strings.typeToSearch.includes('{min}')) {\n\t\t\treturn (\n\t\t\t\t<StatusText>\n\t\t\t\t\t{strings.typeToSearch.replace('{min}', String(minSearchLength))}\n\t\t\t\t</StatusText>\n\t\t\t);\n\t\t}\n\t\treturn <StatusText>{strings.typeToSearch}</StatusText>;\n\t}\n\n\tif (trimmed.length < minSearchLength) {\n\t\tconst remaining = minSearchLength - trimmed.length;\n\t\tif (strings.typeMore.includes('{remaining}') || strings.typeMore.includes('{s}')) {\n\t\t\treturn (\n\t\t\t\t<StatusText>\n\t\t\t\t\t{strings.typeMore\n\t\t\t\t\t\t.replace('{remaining}', String(remaining))\n\t\t\t\t\t\t.replace('{s}', remaining !== 1 ? 's' : '')}\n\t\t\t\t</StatusText>\n\t\t\t);\n\t\t}\n\t\treturn <StatusText>{strings.typeMore}</StatusText>;\n\t}\n\n\tif (itemCount === 0) {\n\t\treturn null;\n\t}\n\n\treturn null;\n}\n\nStatusContent.displayName = 'StatusContent';\n","/**\n * Shared ComboboxDropdown Component\n *\n * Renders the dropdown content for both single and multiple selection variants.\n * Extracts shared rendering logic to reduce duplication.\n */\n\nimport * as React from 'react';\n\nimport {\n\tComboboxPortal,\n\tComboboxPositioner,\n\tComboboxPopup,\n\tComboboxEmpty,\n\tComboboxList,\n\tComboboxItem,\n\tComboboxStatus,\n\tComboboxGroup,\n\tComboboxGroupLabel,\n\tComboboxCollection,\n} from '../../../base/combobox';\nimport { Button } from '../../../base/buttons';\nimport { ScrollArea } from '../../../base/display/scroll-area';\nimport { Stack } from '../../../base/structure';\nimport { DisplayLabel, Text } from '../../../typography';\nimport { cn } from '../../../../lib/utils';\n\nimport { DEFAULT_SIZE } from '../constants';\nimport type { ComboboxStrings, ComboboxSize } from '../types';\nimport { LoadingMore } from './loading-more';\nimport { StatusContent } from './status-content';\nimport { layerRecipes } from '../../../../lib/layer-recipes';\n\nconst primitiveSizeByComboboxSize: Record<ComboboxSize, 'sm' | 'md' | 'lg'> = {\n\tsm: 'sm',\n\tmd: 'md',\n\tlg: 'lg',\n};\n\nconst emptyClassByComboboxSize: Record<ComboboxSize, string> = {\n\tsm: 'flex min-h-control-sm items-center justify-center px-row-x py-row-y text-center text-pxs leading-tight text-muted-foreground',\n\tmd: 'flex min-h-control items-center justify-center px-row-x py-row-y text-center text-sm leading-tight text-muted-foreground',\n\tlg: 'flex min-h-control-lg items-center justify-center px-row-x py-row-y-lg text-center text-sm leading-tight text-muted-foreground',\n};\n\nexport interface ComboboxDropdownProps<T> {\n\t// Display state\n\t/** Whether results are being fetched. */\n\tloading: boolean;\n\t/** Whether the status row replaces the list — while loading, or below `minSearchLength`. */\n\tshowStatus: boolean;\n\t/** Whether the no-results row shows. */\n\tshowEmpty: boolean;\n\n\t// Search\n\t/** Current search text, used to highlight matches. */\n\tsearchValue: string;\n\t/** Characters required before the list becomes active. */\n\tminSearchLength: number;\n\n\t// Items\n\t/** Options to render, including the create row when offered. */\n\titems: T[];\n\t/** Options bucketed by group name, or `null` when grouping is off. */\n\tgroupedItems: Map<string, T[]> | null;\n\t/** The synthetic create row, or `null` when it is not offered. */\n\tcreateOptionItem: T | null;\n\n\t// Rendering\n\t/** Renders one option's content. */\n\trenderItemContent: (item: T) => React.ReactNode;\n\t/** Returns the React key for an option. */\n\tgetItemReactKey: (item: T) => string;\n\t/** Marks individual options unselectable while still rendering them. */\n\tgetItemDisabled?: (item: T) => boolean;\n\t/** Renders a group heading. */\n\trenderGroupLabel?: (group: string) => React.ReactNode;\n\n\t// Load more\n\t/** Whether the next page is being fetched. */\n\tloadingMore?: boolean;\n\n\t// Strings\n\t/** Resolved copy for the status, empty, and create rows. */\n\tstrings: ComboboxStrings;\n\n\t// Size\n\t/** Row density, matching the trigger's size. */\n\tsize?: ComboboxSize;\n\n\t// Portal\n\t/** Mounts the dropdown inside this element instead of the default portal root. */\n\tportalContainer?: React.RefObject<HTMLElement | null>;\n\n\t// Refs\n\t/** Ref to the scrollable list, used for scroll-triggered pagination. */\n\tlistRef: React.RefObject<HTMLDivElement | null>;\n\n\t// Multiple selection anchor\n\t/** Element the dropdown positions against. */\n\tanchor?: React.RefObject<HTMLElement | null>;\n\n\t/** Optional apply / cancel footer for the apply-button workflow. */\n\tapplyFooter?: {\n\t\tapplyLabel: string;\n\t\tcancelLabel: string;\n\t\tonApply: () => void;\n\t\tonCancel: () => void;\n\t};\n}\n\nexport function ComboboxDropdown<T>({\n\tloading,\n\tshowStatus,\n\tshowEmpty,\n\tsearchValue,\n\tminSearchLength,\n\titems,\n\tgroupedItems,\n\tcreateOptionItem,\n\trenderItemContent,\n\tgetItemReactKey,\n\tgetItemDisabled,\n\trenderGroupLabel,\n\tloadingMore,\n\tstrings,\n\tsize = DEFAULT_SIZE,\n\tportalContainer,\n\tlistRef,\n\tanchor,\n\tapplyFooter,\n}: ComboboxDropdownProps<T>): React.ReactElement | null {\n\tconst positionerClassName = portalContainer != null ? layerRecipes.nestedOverlay : undefined;\n\tconst primitiveSize = primitiveSizeByComboboxSize[size];\n\tconst hasPopupContent =\n\t\tshowStatus ||\n\t\tshowEmpty ||\n\t\titems.length > 0 ||\n\t\tBoolean(loadingMore) ||\n\t\tBoolean(applyFooter);\n\t// An exclusive inline error has no dropdown rows. Mounting a zero-height\n\t// popup still starts Base UI focus management and hides its Retry sibling.\n\tif (!hasPopupContent) return null;\n\n\tconst content = (\n\t\t<ComboboxPositioner\n\t\t\tanchor={anchor}\n\t\t\tclassName={positionerClassName}\n\t\t>\n\t\t\t<ComboboxPopup\n\t\t\t\taria-busy={loading || undefined}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'combobox-dropdown--popup',\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{/* Status message */}\n\t\t\t\t{!!showStatus && (\n\t\t\t\t\t<ComboboxStatus className=\"gap-space-sm px-control py-space-xs text-xs text-muted-foreground\">\n\t\t\t\t\t\t<StatusContent\n\t\t\t\t\t\t\tloading={loading}\n\t\t\t\t\t\t\tsearchValue={searchValue}\n\t\t\t\t\t\t\tminSearchLength={minSearchLength}\n\t\t\t\t\t\t\titemCount={items.length}\n\t\t\t\t\t\t\tstrings={strings}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</ComboboxStatus>\n\t\t\t\t)}\n\n\t\t\t\t{/* Empty state */}\n\t\t\t\t{!!showEmpty && (\n\t\t\t\t\t<ComboboxEmpty className={emptyClassByComboboxSize[size]}>\n\t\t\t\t\t\t<Text tag=\"span\" size=\"inherit\" type=\"secondary\" className=\"text-inherit\">\n\t\t\t\t\t\t\t{strings.noResults}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t</ComboboxEmpty>\n\t\t\t\t)}\n\n\t\t\t\t{/* Items list */}\n\t\t\t\t<ScrollArea\n\t\t\t\t\tviewportRef={listRef}\n\t\t\t\t\tclassName=\"max-h-[min(20rem,var(--available-height))]\"\n\t\t\t\t>\n\t\t\t\t\t<ComboboxList className=\"combobox-dropdown--list max-h-none overflow-visible\">\n\t\t\t\t\t\t{groupedItems ? (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t{Array.from(groupedItems.entries()).map(([group, groupItems]) => {\n\t\t\t\t\t\t\t\t\tconst groupLabel =\n\t\t\t\t\t\t\t\t\t\ttypeof renderGroupLabel === 'function'\n\t\t\t\t\t\t\t\t\t\t\t? renderGroupLabel(group)\n\t\t\t\t\t\t\t\t\t\t\t: group;\n\t\t\t\t\t\t\t\t\tconst groupLabelContent =\n\t\t\t\t\t\t\t\t\t\ttypeof groupLabel === 'string' || typeof groupLabel === 'number' || typeof groupLabel === 'bigint'\n\t\t\t\t\t\t\t\t\t\t\t? <DisplayLabel>{groupLabel}</DisplayLabel>\n\t\t\t\t\t\t\t\t\t\t\t: groupLabel;\n\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<ComboboxGroup className=\"combobox-dropdown--group p-0\" key={group} items={groupItems}>\n\t\t\t\t\t\t\t\t\t\t\t<ComboboxGroupLabel>{groupLabelContent}</ComboboxGroupLabel>\n\t\t\t\t\t\t\t\t\t\t\t<ComboboxCollection>\n\t\t\t\t\t\t\t\t\t\t\t\t{(item: T) => (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<ComboboxItem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={getItemReactKey(item)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvalue={item}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsize={primitiveSize}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={getItemDisabled?.(item)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{renderItemContent(item)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</ComboboxItem>\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t</ComboboxCollection>\n\t\t\t\t\t\t\t\t\t\t</ComboboxGroup>\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t})}\n\n\t\t\t\t\t\t\t\t{createOptionItem != null && (\n\t\t\t\t\t\t\t\t\t<ComboboxItem\n\t\t\t\t\t\t\t\t\t\tkey={getItemReactKey(createOptionItem)}\n\t\t\t\t\t\t\t\t\t\tvalue={createOptionItem}\n\t\t\t\t\t\t\t\t\t\tsize={primitiveSize}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{renderItemContent(createOptionItem)}\n\t\t\t\t\t\t\t\t\t</ComboboxItem>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<ComboboxCollection>\n\t\t\t\t\t\t\t\t{(item: T) => (\n\t\t\t\t\t\t\t\t\t<ComboboxItem\n\t\t\t\t\t\t\t\t\t\tkey={getItemReactKey(item)}\n\t\t\t\t\t\t\t\t\t\tvalue={item}\n\t\t\t\t\t\t\t\t\t\tsize={primitiveSize}\n\t\t\t\t\t\t\t\t\t\tdisabled={getItemDisabled?.(item)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{renderItemContent(item)}\n\t\t\t\t\t\t\t\t\t</ComboboxItem>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</ComboboxCollection>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</ComboboxList>\n\t\t\t\t</ScrollArea>\n\n\t\t\t\t{/* Loading more indicator */}\n\t\t\t\t<LoadingMore\n\t\t\t\t\tloading={!!loadingMore}\n\t\t\t\t\ttext={strings.loadingMore}\n\t\t\t\t/>\n\n\t\t\t\t{/* Apply / cancel footer (multi-select with applyButton). */}\n\t\t\t\t{!!applyFooter && (\n\t\t\t\t\t<Stack direction=\"horizontal\" gap=\"md\" justify=\"end\" wrap={false} className=\"border-t border-border/60 px-control py-space-xs\">\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\tonClick={(e) => {\n\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\t\tapplyFooter.onCancel();\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{applyFooter.cancelLabel}\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\ttone=\"primary\"\n\t\t\t\t\t\t\tonClick={(e) => {\n\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\t\tapplyFooter.onApply();\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{applyFooter.applyLabel}\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</Stack>\n\t\t\t\t)}\n\t\t\t</ComboboxPopup>\n\t\t</ComboboxPositioner>\n\t);\n\n\tif (portalContainer) {\n\t\treturn <ComboboxPortal container={portalContainer}>{content}</ComboboxPortal>;\n\t}\n\n\treturn <ComboboxPortal>{content}</ComboboxPortal>;\n}\n\nComboboxDropdown.displayName = 'ComboboxDropdown';\n","/**\n * ErrorMessage Component\n */\n\nimport * as React from 'react';\nimport { Text } from '../../../typography';\nimport { cn } from '../../../../lib/utils';\nimport type { ComboboxSize } from '../types';\n\nexport interface ErrorMessageProps {\n\terror?: string;\n\t/** Size preset. */\n\tsize: ComboboxSize;\n\tclassName?: string;\n}\n\nexport function ErrorMessage({\n\terror,\n\tsize: _size,\n\tclassName,\n}: ErrorMessageProps): React.ReactElement | null {\n\tif (!error) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t// `xs` at every control size, matching `FormField` and the date pickers.\n\t\t// Leaving the default size unpinned resolved to `sm`, which made the\n\t\t// combobox the one control whose error text grew as the control grew.\n\t\t<Text\n\t\t\ttag=\"p\"\n\t\t\tsize=\"xs\"\n\t\t\ttype=\"error\"\n\t\t\tclassName={cn('error-message--component', className)}\n\t\t\trole=\"alert\"\n\t\t\taria-live=\"polite\"\n\t\t>\n\t\t\t{error}\n\t\t</Text>\n\t);\n}\n\nErrorMessage.displayName = 'ErrorMessage';\n","/**\n * HighlightedText Component\n */\n\nimport * as React from 'react';\nimport { Text } from '../../../typography';\nimport { markRecipes } from '../../../../lib/tone-recipes';\n\nexport interface HighlightedTextProps {\n\t/** Visible label. */\n\ttext: string;\n\thighlight: string;\n\thighlightClassName?: string;\n}\n\nfunction escapeRegExp(str: string): string {\n\treturn str.replace(/[$()*+.?[\\\\\\]^{|}]/g, '\\\\$&');\n}\n\nexport function HighlightedText({\n\ttext,\n\thighlight,\n\thighlightClassName = markRecipes.match,\n}: HighlightedTextProps): React.ReactNode {\n\tif (!highlight.trim()) {\n\t\treturn (\n\t\t\t<Text tag=\"span\" size=\"inherit\" lineHeight=\"tight\" className=\"text-inherit\">\n\t\t\t\t{text}\n\t\t\t</Text>\n\t\t);\n\t}\n\n\tconst regex = new RegExp(`(${escapeRegExp(highlight)})`, 'gi');\n\tconst parts = text.split(regex);\n\tlet cursor = 0;\n\n\treturn (\n\t\t<Text tag=\"span\" size=\"inherit\" lineHeight=\"tight\" className=\"text-inherit\">\n\t\t\t{parts.map((part, index) => {\n\t\t\t\tconst isMatch = index % 2 === 1;\n\t\t\t\tconst key = String(cursor);\n\t\t\t\tcursor += part.length;\n\n\t\t\t\tif (isMatch) {\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<mark key={key} className={highlightClassName}>\n\t\t\t\t\t\t\t{part}\n\t\t\t\t\t\t</mark>\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn <React.Fragment key={key}>{part}</React.Fragment>;\n\t\t\t})}\n\t\t</Text>\n\t);\n}\n\nHighlightedText.displayName = 'HighlightedText';\n","/**\n * Hook for debounced search functionality\n */\n\nimport { useEffect } from 'react';\nimport { useDebouncedCallback } from '../../../../hooks/use-debounced-callback';\nimport { DEFAULT_DEBOUNCE_MS, DEFAULT_MIN_SEARCH_LENGTH } from '../constants';\n\nexport interface UseDebouncedSearchOptions {\n\tsearchValue: string;\n\tonSearch: ((value: string) => void) | undefined;\n\tdebounceMs?: number;\n\tminSearchLength?: number;\n}\n\nexport function useDebouncedSearch({\n\tsearchValue,\n\tonSearch,\n\tdebounceMs = DEFAULT_DEBOUNCE_MS,\n\tminSearchLength = DEFAULT_MIN_SEARCH_LENGTH,\n}: UseDebouncedSearchOptions): void {\n\t// `useDebouncedCallback` holds `onSearch` in a ref, so `emitSearch` keeps a\n\t// stable identity even though consumers pass a new inline callback every\n\t// render. Depending on the raw `onSearch` here re-ran the effect on every\n\t// render and — when it triggered a state update — caused an infinite fetch\n\t// loop.\n\tconst emitSearch = useDebouncedCallback((value: string) => {\n\t\tonSearch?.(value);\n\t}, debounceMs);\n\n\tuseEffect(() => {\n\t\tconst trimmed = searchValue.trim();\n\t\tif (trimmed.length < minSearchLength) return;\n\n\t\temitSearch(trimmed);\n\t\treturn emitSearch.cancel;\n\t}, [searchValue, minSearchLength, emitSearch]);\n}\n","/**\n * Hook for grouping items by category\n */\n\nimport { useMemo } from 'react';\n\nexport interface UseGroupedItemsOptions<T> {\n\titems: T[];\n\tgetItemGroup: ((item: T) => string) | undefined;\n}\n\nexport type GroupedItemsResult<T> = Map<string, T[]> | null;\n\nexport function useGroupedItems<T>({\n\titems,\n\tgetItemGroup,\n}: UseGroupedItemsOptions<T>): GroupedItemsResult<T> {\n\treturn useMemo(() => {\n\t\tif (!getItemGroup) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst groups = new Map<string, T[]>();\n\n\t\tfor (const item of items) {\n\t\t\tconst groupKey = getItemGroup(item);\n\t\t\tconst existing = groups.get(groupKey);\n\n\t\t\tif (existing) {\n\t\t\t\texisting.push(item);\n\t\t\t} else {\n\t\t\t\tgroups.set(groupKey, [item]);\n\t\t\t}\n\t\t}\n\n\t\treturn groups;\n\t}, [items, getItemGroup]);\n}\n","/**\n * Hook for infinite scroll / load more functionality\n */\n\nimport { useCallback, useEffect, useRef } from 'react';\nimport { useDebouncedCallback } from '../../../../hooks/use-debounced-callback';\nimport {\n\tLOAD_MORE_THRESHOLD,\n\tLOAD_MORE_DEBOUNCE_MS,\n\tLOAD_MORE_COOLDOWN_MS,\n} from '../constants';\n\nexport interface UseLoadMoreOptions {\n\thasMore: boolean | undefined;\n\tonLoadMore: (() => void) | undefined;\n\tloadingMore: boolean | undefined;\n}\n\nexport interface UseLoadMoreReturn {\n\thandleScroll: (event: Event) => void;\n}\n\nexport function useLoadMore({\n\thasMore,\n\tonLoadMore,\n\tloadingMore,\n}: UseLoadMoreOptions): UseLoadMoreReturn {\n\tconst isLoadingRef = useRef(false);\n\tconst cooldownRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n\tconst requestLoadMore = useDebouncedCallback(() => {\n\t\tisLoadingRef.current = true;\n\t\tonLoadMore?.();\n\n\t\t// Cooldown, not a debounce: it keeps a second page from being requested\n\t\t// while the first is still in flight.\n\t\tif (cooldownRef.current) clearTimeout(cooldownRef.current);\n\t\tcooldownRef.current = setTimeout(() => {\n\t\t\tisLoadingRef.current = false;\n\t\t\tcooldownRef.current = null;\n\t\t}, LOAD_MORE_COOLDOWN_MS);\n\t}, LOAD_MORE_DEBOUNCE_MS);\n\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tif (cooldownRef.current) clearTimeout(cooldownRef.current);\n\t\t};\n\t}, []);\n\n\tconst handleScroll = useCallback(\n\t\t(event: Event) => {\n\t\t\tif (!hasMore || !onLoadMore || loadingMore || isLoadingRef.current) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst target = event.target as HTMLElement;\n\t\t\tconst { scrollHeight, scrollTop, clientHeight } = target;\n\t\t\tconst scrollPercentage = (scrollTop + clientHeight) / scrollHeight;\n\n\t\t\tif (scrollPercentage >= LOAD_MORE_THRESHOLD) {\n\t\t\t\trequestLoadMore();\n\t\t\t}\n\t\t},\n\t\t[hasMore, onLoadMore, loadingMore, requestLoadMore]\n\t);\n\n\treturn { handleScroll };\n}\n","/**\n * Headless state and rendering contract shared by the canonical comboboxes.\n *\n * Extracts shared logic between single and multiple selection variants\n * to reduce duplication and ensure consistent behavior.\n */\n\nimport { PlusIcon } from 'lucide-react';\nimport * as React from 'react';\nimport { useRef, useMemo, useEffect, useCallback } from 'react';\nimport { Text } from '../../../typography';\nimport { useStrings, type StringsProp } from '../../../../lib/strings';\n\nimport { HighlightedText } from '../components/highlighted-text';\nimport { defaultComboboxStrings } from '../combobox.strings';\nimport {\n\tDEFAULT_MIN_SEARCH_LENGTH,\n\tDEFAULT_DEBOUNCE_MS,\n\tisCreateOption,\n\tgetCreateOptionValue,\n\tcreateCreateOption,\n} from '../constants';\nimport type { ComboboxStrings, ComboboxSharedProps } from '../types';\nimport { useDebouncedSearch } from './use-debounced-search';\nimport { useGroupedItems } from './use-grouped-items';\nimport { useLoadMore } from './use-load-more';\n\nimport { cn } from '../../../../lib/utils';\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface UseComboboxCoreOptions<T> extends ComboboxSharedProps<T> {\n\t/** Items that should always be included (selected items) */\n\tensuredItems?: T[];\n}\n\nexport interface UseComboboxCoreReturn<T> {\n\t// Resolved values\n\tstrings: ComboboxStrings;\n\tgetKey: (item: T) => string;\n\ttrimmedSearch: string;\n\n\t// Refs\n\tlistRef: React.RefObject<HTMLDivElement | null>;\n\n\t// Items\n\tbaseItems: T[];\n\tallItems: T[];\n\tgroupedItems: Map<string, T[]> | null;\n\tcreateOptionItem: T | null;\n\n\t// Display state\n\tshowStatus: boolean;\n\tshowEmpty: boolean;\n\tshowCreateOption: boolean;\n\n\t// Handlers\n\trenderItemContent: (item: T) => React.ReactNode;\n\titemToStringLabel: (item: T) => string;\n\tgetItemReactKey: (item: T) => string;\n\n\t// Scroll handling\n\thandleScroll: (event: Event) => void;\n}\n\n// ============================================================================\n// Hook Implementation\n// ============================================================================\n\nfunction useComboboxStrings(custom?: StringsProp<ComboboxStrings>): ComboboxStrings {\n\treturn useStrings(defaultComboboxStrings, custom);\n}\n\nfunction hasExactMatch<T>(\n\titems: T[],\n\tsearchValue: string,\n\tgetItemLabel: (item: T) => string\n): boolean {\n\tconst normalizedSearch = searchValue.toLowerCase();\n\treturn items.some(\n\t\t(item) => getItemLabel(item).toLowerCase() === normalizedSearch\n\t);\n}\n\nexport function useComboboxCore<T>({\n\t// Core props\n\titems,\n\tsearchValue,\n\tgetItemLabel,\n\tgetItemKey,\n\tloading = false,\n\tshowListContent = true,\n\tminSearchLength = DEFAULT_MIN_SEARCH_LENGTH,\n\tstrings: stringsProp,\n\trenderItem,\n\n\t// Debounced Search\n\tonSearch,\n\tdebounceMs = DEFAULT_DEBOUNCE_MS,\n\n\t// Creatable\n\tcreatable,\n\tonCreate,\n\n\t// Grouped Items\n\tgetItemGroup,\n\n\t// Load More\n\thasMore,\n\tonLoadMore,\n\tloadingMore,\n\n\t// Highlight Match\n\thighlightMatch,\n\n\t\t// Ensured items (selected items that should always be included)\n\tensuredItems = [],\n}: UseComboboxCoreOptions<T>): UseComboboxCoreReturn<T> {\n\t// -------------------------------------------------------------------------\n\t// Setup\n\t// -------------------------------------------------------------------------\n\n\tconst strings = useComboboxStrings(stringsProp);\n\tconst getKey = getItemKey ?? getItemLabel;\n\tconst listRef = useRef<HTMLDivElement | null>(null);\n\tconst trimmedSearch = searchValue.trim();\n\tconst showStatus = showListContent && (loading || trimmedSearch.length < minSearchLength);\n\n\t// -------------------------------------------------------------------------\n\t// Hooks\n\t// -------------------------------------------------------------------------\n\n\tuseDebouncedSearch({\n\t\tsearchValue,\n\t\tonSearch,\n\t\tdebounceMs,\n\t\tminSearchLength,\n\t});\n\n\tconst { handleScroll } = useLoadMore({\n\t\thasMore: showListContent && !showStatus ? hasMore : false,\n\t\tonLoadMore,\n\t\tloadingMore,\n\t});\n\n\t// Attach scroll listener\n\tuseEffect(() => {\n\t\tconst listEl = listRef.current;\n\t\tif (!showListContent || showStatus || !listEl || !hasMore || !onLoadMore) return;\n\n\t\tlistEl.addEventListener('scroll', handleScroll);\n\t\treturn () => listEl.removeEventListener('scroll', handleScroll);\n\t}, [handleScroll, hasMore, onLoadMore, showListContent, showStatus]);\n\n\t// -------------------------------------------------------------------------\n\t// Computed Values\n\t// -------------------------------------------------------------------------\n\n\t// Merge ensured items with fetched items\n\tconst baseItems = useMemo(() => {\n\t\tif (!showListContent || showStatus) return [];\n\t\tif (ensuredItems.length === 0) return items;\n\n\t\tconst merged = [...ensuredItems];\n\t\titems.forEach((item) => {\n\t\t\tconst itemKey = getKey(item);\n\t\t\tif (!ensuredItems.some((ensured) => getKey(ensured) === itemKey)) {\n\t\t\t\tmerged.push(item);\n\t\t\t}\n\t\t});\n\t\treturn merged;\n\t}, [items, ensuredItems, getKey, showListContent, showStatus]);\n\n\t// Group items if grouping is enabled\n\tconst groupedItems = useGroupedItems({\n\t\titems: baseItems,\n\t\tgetItemGroup,\n\t});\n\n\t// Determine if create option should be shown\n\tconst showCreateOption = useMemo(() => {\n\t\tif (!showListContent || showStatus) return false;\n\t\tif (!creatable || !onCreate) return false;\n\t\tif (trimmedSearch.length < minSearchLength) return false;\n\t\treturn !hasExactMatch(baseItems, trimmedSearch, getItemLabel);\n\t}, [creatable, onCreate, trimmedSearch, minSearchLength, baseItems, getItemLabel, showListContent, showStatus]);\n\n\tconst createOptionItem = useMemo(() => {\n\t\tif (!showCreateOption) return null;\n\t\treturn createCreateOption<T>(trimmedSearch);\n\t}, [showCreateOption, trimmedSearch]);\n\n\t// Build final items array with create option\n\tconst allItems = useMemo(() => {\n\t\tif (createOptionItem) return [...baseItems, createOptionItem];\n\t\treturn baseItems;\n\t}, [baseItems, createOptionItem]);\n\n\t// Status display conditions\n\tconst showEmpty =\n\t\tshowListContent &&\n\t\t!loading &&\n\t\ttrimmedSearch.length >= minSearchLength &&\n\t\titems.length === 0 &&\n\t\t!showCreateOption;\n\n\t// -------------------------------------------------------------------------\n\t// Handlers\n\t// -------------------------------------------------------------------------\n\n\tconst renderItemContent = useCallback(\n\t\t(item: T): React.ReactNode => {\n\t\t\t// Handle create option\n\t\t\tif (isCreateOption(item)) {\n\t\t\t\tconst value = getCreateOptionValue(item);\n\t\t\t\treturn (\n\t\t\t\t\t<span className={cn('combobox-core--component', 'flex items-center gap-space-sm')}>\n\t\t\t\t\t\t<PlusIcon className=\"size-icon-sm\" />\n\t\t\t\t\t\t{strings.createNew.includes('{value}') ? (\n\t\t\t\t\t\t\t<Text tag=\"span\" size=\"inherit\" weight=\"medium\" lineHeight=\"tight\" className=\"text-inherit\">\n\t\t\t\t\t\t\t\t{strings.createNew.replace('{value}', value)}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<span className=\"inline-flex items-center gap-space-sm\">\n\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"inherit\" weight=\"medium\" lineHeight=\"tight\" className=\"text-inherit\">\n\t\t\t\t\t\t\t\t\t{strings.createNew}\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"inherit\" weight=\"medium\" lineHeight=\"tight\" className=\"text-inherit\">\n\t\t\t\t\t\t\t\t\t{value}\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</span>\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Custom renderer takes precedence\n\t\t\tif (renderItem) {\n\t\t\t\treturn renderItem(item);\n\t\t\t}\n\n\t\t\t// Default rendering with optional highlighting\n\t\t\tconst label = getItemLabel(item);\n\t\t\tif (highlightMatch && trimmedSearch) {\n\t\t\t\treturn <HighlightedText text={label} highlight={trimmedSearch} />;\n\t\t\t}\n\t\t\treturn (\n\t\t\t\t<Text tag=\"span\" size=\"inherit\" weight=\"medium\" lineHeight=\"tight\" className=\"text-inherit\">\n\t\t\t\t\t{label}\n\t\t\t\t</Text>\n\t\t\t);\n\t\t},\n\t\t[strings.createNew, renderItem, getItemLabel, highlightMatch, trimmedSearch]\n\t);\n\n\tconst itemToStringLabel = useCallback(\n\t\t(item: T): string => {\n\t\t\tif (isCreateOption(item)) {\n\t\t\t\treturn getCreateOptionValue(item);\n\t\t\t}\n\t\t\treturn getItemLabel(item);\n\t\t},\n\t\t[getItemLabel]\n\t);\n\n\tconst getItemReactKey = useCallback(\n\t\t(item: T): string => {\n\t\t\tif (isCreateOption(item)) return `__create__:${getCreateOptionValue(item)}`;\n\t\t\treturn String(getKey(item));\n\t\t},\n\t\t[getKey]\n\t);\n\n\treturn {\n\t\tstrings,\n\t\tgetKey,\n\t\ttrimmedSearch,\n\t\tlistRef,\n\t\tbaseItems,\n\t\tallItems,\n\t\tgroupedItems,\n\t\tcreateOptionItem,\n\t\tshowStatus,\n\t\tshowEmpty,\n\t\tshowCreateOption,\n\t\trenderItemContent,\n\t\titemToStringLabel,\n\t\tgetItemReactKey,\n\t\thandleScroll,\n\t};\n}\n","import { Stack } from '../../base/structure';\n/**\n * Combobox Components\n *\n * A feature-rich, API-driven combobox built on Base UI with shadcn styling.\n * Supports single and multiple selection, form integration, debounced search,\n * grouping, pagination, and more.\n *\n * This version uses shared hooks and components to eliminate duplication\n * between single and multiple selection variants.\n */\n\nimport * as React from 'react';\nimport { useRef, useCallback, useEffect, useState } from 'react';\nimport { ChevronDownIcon, XIcon } from 'lucide-react';\nimport { Combobox as ComboboxPrimitive } from '@base-ui/react/combobox';\n\nimport {\n\tComboboxRoot as BaseCombobox,\n\tComboboxChips,\n\tComboboxChip,\n\tComboboxChipsInput,\n} from '../../base/combobox';\nimport { Button } from '../../base/buttons';\nimport { Input } from '../../base/text-inputs';\nimport { Text } from '../../typography';\nimport { useDensityConfig, type FormControlSize } from '../../../lib/ui-provider';\nimport { resolveComponentScale } from '../../../lib/ui-provider/scale';\nimport { cn } from '../../../lib/utils';\nimport { fieldAffordanceRecipes, selectToggleRecipes } from '../../../lib/field-affordance-recipes';\n\nimport { ComboboxDropdown } from './components/combobox-dropdown';\nimport { ErrorMessage } from './components/error-message';\nimport {\n\tformControlMinHeightClasses,\n\tformControlPaddingClasses,\n} from '../../base/forms/form-sizing';\nimport {\n\tDEFAULT_MIN_SEARCH_LENGTH,\n\tDEFAULT_SIZE,\n\tisCreateOption,\n\tgetCreateOptionValue,\n} from './constants';\n\nimport { useComboboxCore } from './hooks/use-combobox-core';\nimport { defaultComboboxStrings } from './combobox.strings';\nimport type {\n\tComboboxProps,\n\tMultiComboboxProps,\n\tComboboxSize,\n} from './types';\n\nfunction resolveComboboxSize(\n\tsizeProp: ComboboxSize | undefined,\n\tdefaultScale: FormControlSize | undefined,\n): ComboboxSize {\n\treturn resolveComponentScale(sizeProp, defaultScale, DEFAULT_SIZE);\n};\n\n\nconst primitiveComboboxSizeBySize: Record<ComboboxSize, 'sm' | 'md' | 'lg'> = {\n\tsm: 'sm',\n\tmd: 'md',\n\tlg: 'lg',\n};\n\nfunction getComboboxFormSize(size: ComboboxSize): FormControlSize {\n\treturn size;\n}\n\ninterface ComboboxInputFieldProps {\n\tplaceholder: string;\n\tclearLabel: string;\n\ttoggleLabel: string;\n\tsize: FormControlSize;\n\terror?: boolean;\n\trequired?: boolean;\n\tdisabled?: boolean;\n\tclearable?: boolean;\n\tclassName?: string;\n\tonBlur?: () => void;\n}\n\nfunction ComboboxInputField({\n\tplaceholder,\n\tclearLabel,\n\ttoggleLabel,\n\tsize,\n\terror,\n\trequired,\n\tdisabled,\n\tclearable = true,\n\tclassName,\n\tonBlur,\n}: ComboboxInputFieldProps): React.ReactElement {\n\treturn (\n\t\t<div className=\"relative\">\n\t\t\t<ComboboxPrimitive.Input\n\t\t\t\trender={\n\t\t\t\t\t<Input\n\t\t\t\t\t\tsize={size}\n\t\t\t\t\t\tinvalid={error}\n\t\t\t\t\t\tclassName={cn(clearable ? selectToggleRecipes.clearPadding[size] : selectToggleRecipes.padding[size], className)}\n\t\t\t\t\t/>\n\t\t\t\t}\n\t\t\t\tplaceholder={placeholder}\n\t\t\t\taria-invalid={error || undefined}\n\t\t\t\taria-required={required}\n\t\t\t\tdisabled={disabled}\n\t\t\t\tonBlur={onBlur}\n\t\t\t/>\n\t\t\t<div className={cn('absolute inset-y-0 flex items-center gap-space-xs text-muted-foreground', selectToggleRecipes.track[size])}>\n\t\t\t\t{clearable ? (\n\t\t\t\t\t<ComboboxPrimitive.Clear\n\t\t\t\t\t\trender={\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\t\tsize=\"sm\" iconOnly\n\t\t\t\t\t\t\t\tclassName={cn(fieldAffordanceRecipes.target,fieldAffordanceRecipes.focus,fieldAffordanceRecipes.clear)}\n\t\t\t\t\t\t\t\taria-label={clearLabel}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<XIcon className={fieldAffordanceRecipes.icon} aria-hidden=\"true\" />\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t) : null}\n\t\t\t\t<ComboboxPrimitive.Trigger\n\t\t\t\t\trender={\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\tsize=\"sm\" iconOnly\n\t\t\t\t\t\t\t\tclassName={cn(fieldAffordanceRecipes.target,fieldAffordanceRecipes.focus,fieldAffordanceRecipes.toggle)}\n\t\t\t\t\t\t\taria-label={toggleLabel}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t<ChevronDownIcon className={cn('shrink-0', selectToggleRecipes.icon[size])} aria-hidden=\"true\" />\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\n// ============================================================================\n// Single Selection Component\n// ============================================================================\n\nexport function Combobox<T>({\n\t// Core props\n\titems,\n\tselectedValue,\n\tonSelectedValueChange,\n\tclearSearchOnClose = true,\n\tsearchValue,\n\tonSearchValueChange,\n\tgetItemLabel,\n\tgetItemKey,\n\tloading = false,\n\tshowListContent = true,\n\tminSearchLength = DEFAULT_MIN_SEARCH_LENGTH,\n\tstrings: stringsProp,\n\tdisabled = false,\n\tclassName,\n\tclearable = true,\n\trenderItem,\n\tportalContainer,\n\n\t// Form Integration\n\tname,\n\tinvalid,\n\terror,\n\trequired,\n\tonBlur,\n\n\t// Debounced Search\n\tonSearch,\n\tdebounceMs,\n\n\t// Creatable\n\tcreatable,\n\tonCreate,\n\n\t// Grouped Items\n\tgetItemGroup,\n\trenderGroupLabel,\n\n\t// Load More\n\thasMore,\n\tonLoadMore,\n\tloadingMore,\n\n\t// Disable individual items\n\tgetItemDisabled,\n\n\t// Highlight Match\n\thighlightMatch,\n\n\t// Size\n\tsize: sizeProp,\n\n\t// Controlled Open\n\topen,\n\tonOpenChange,\n}: ComboboxProps<T>): React.ReactElement {\n\tconst { defaultScale } = useDensityConfig();\n\tconst size = resolveComboboxSize(sizeProp, defaultScale);\n\tconst formSize = getComboboxFormSize(size);\n\tconst hasError = invalid || Boolean(error);\n\n\t// Use shared core hook\n\tconst core = useComboboxCore({\n\t\titems,\n\t\tsearchValue,\n\t\tonSearchValueChange,\n\t\tgetItemLabel,\n\t\tgetItemKey,\n\t\tloading,\n\t\tshowListContent,\n\t\tminSearchLength,\n\t\tstrings: stringsProp,\n\t\trenderItem,\n\t\tonSearch,\n\t\tdebounceMs,\n\t\tcreatable,\n\t\tonCreate,\n\t\tgetItemGroup,\n\t\thasMore,\n\t\tonLoadMore,\n\t\tloadingMore,\n\t\thighlightMatch,\n\t\tsize,\n\t\t// Include selected value in items list\n\t\tensuredItems: selectedValue ? [selectedValue] : [],\n\t});\n\n\t// Track open state so we can show the selected label when closed\n\tconst [isOpen, setIsOpen] = useState(false);\n\tconst handleOpenChange = useCallback(\n\t\t(nextOpen: boolean) => {\n\t\t\tsetIsOpen(nextOpen);\n\t\t\tif (!nextOpen && clearSearchOnClose) {\n\t\t\t\t// Clear search when closing so next open starts fresh\n\t\t\t\tonSearchValueChange('');\n\t\t\t}\n\t\t\tonOpenChange?.(nextOpen);\n\t\t},\n\t\t[clearSearchOnClose, onOpenChange, onSearchValueChange],\n\t);\n\n\t// When closed with a selected value, show the label; when open, show search text\n\tconst displayInputValue = isOpen\n\t\t? searchValue\n\t\t: (selectedValue ? core.itemToStringLabel(selectedValue) : '');\n\n\t// Handle value change, including create option\n\tconst handleValueChange = useCallback(\n\t\t(value: T | null): void => {\n\t\t\tif (value && isCreateOption(value)) {\n\t\t\t\tconst inputValue = getCreateOptionValue(value);\n\t\t\t\tonCreate?.(inputValue);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tonSelectedValueChange(value);\n\t\t},\n\t\t[onSelectedValueChange, onCreate]\n\t);\n\n\treturn (\n\t\t<Stack gap=\"dense\" className=\"combobox--component\">\n\t\t\t<BaseCombobox\n\t\t\t\tdismissLabel={core.strings.dismiss}\n\t\t\t\titems={core.allItems}\n\t\t\t\tvalue={selectedValue}\n\t\t\t\tonValueChange={(value, details) => {\n\t\t\t\t\t// Escape on a closed field must not erase the chosen value; let the\n\t\t\t\t\t// surrounding dialog or drawer handle the key instead.\n\t\t\t\t\tif (details.reason === 'escape-key') { details.allowPropagation(); return; }\n\t\t\t\t\thandleValueChange(value);\n\t\t\t\t}}\n\t\t\t\tinputValue={displayInputValue}\n\t\t\t\tonInputValueChange={(value, details) => {\n\t\t\t\t\tconst { reason } = details;\n\t\t\t\t\tif (reason === 'escape-key') { details.allowPropagation(); return; }\n\t\t\t\t\tif (reason === 'item-press') {\n\t\t\t\t\t\tonSearchValueChange('');\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tonSearchValueChange(value);\n\t\t\t\t}}\n\t\t\t\titemToStringLabel={core.itemToStringLabel}\n\t\t\t\tdisabled={disabled}\n\t\t\t\tfilter={null}\n\t\t\t\tname={name}\n\t\t\t\trequired={required}\n\t\t\t\topen={open}\n\t\t\t\tonOpenChange={handleOpenChange}\n\t\t\t>\n\t\t\t\t<ComboboxInputField\n\t\t\t\t\tplaceholder={core.strings.placeholder}\n\t\t\t\t\tclearLabel={core.strings.clear}\n\t\t\t\t\ttoggleLabel={core.strings.toggle}\n\t\t\t\t\tclassName={className}\n\t\t\t\t\tsize={formSize}\n\t\t\t\t\terror={hasError}\n\t\t\t\t\trequired={required}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tclearable={clearable}\n\t\t\t\t\tonBlur={onBlur}\n\t\t\t\t/>\n\n\t\t\t\t<ComboboxDropdown\n\t\t\t\t\tloading={loading}\n\t\t\t\t\tshowStatus={core.showStatus}\n\t\t\t\t\tshowEmpty={core.showEmpty}\n\t\t\t\t\tsearchValue={searchValue}\n\t\t\t\t\tminSearchLength={minSearchLength}\n\t\t\t\t\titems={core.allItems}\n\t\t\t\t\tgroupedItems={core.groupedItems}\n\t\t\t\t\tcreateOptionItem={core.createOptionItem}\n\t\t\t\t\trenderItemContent={core.renderItemContent}\n\t\t\t\t\tgetItemReactKey={core.getItemReactKey}\n\t\t\t\t\tgetItemDisabled={getItemDisabled}\n\t\t\t\t\trenderGroupLabel={renderGroupLabel}\n\t\t\t\t\tloadingMore={showListContent && !core.showStatus ? loadingMore : false}\n\t\t\t\t\tstrings={core.strings}\n\t\t\t\t\tsize={size}\n\t\t\t\t\tportalContainer={portalContainer}\n\t\t\t\t\tlistRef={core.listRef}\n\t\t\t\t/>\n\t\t\t</BaseCombobox>\n\n\t\t\t<ErrorMessage error={error} size={size} />\n\t\t</Stack>\n\t);\n}\n\n// ============================================================================\n// Multiple Selection Component\n// ============================================================================\n\nexport function MultiCombobox<T>({\n\t// Core props\n\titems,\n\tselectedValues,\n\tonSelectedValuesChange,\n\tsearchValue,\n\tonSearchValueChange,\n\tgetItemLabel,\n\tgetItemKey,\n\tloading = false,\n\tshowListContent = true,\n\tminSearchLength = DEFAULT_MIN_SEARCH_LENGTH,\n\tstrings: stringsProp,\n\tdisabled = false,\n\tclassName,\n\trenderItem,\n\tportalContainer,\n\n\t// Form Integration\n\tname,\n\tinvalid,\n\terror,\n\trequired,\n\tonBlur,\n\n\t// Debounced Search\n\tonSearch,\n\tdebounceMs,\n\n\t// Creatable\n\tcreatable,\n\tonCreate,\n\n\t// Grouped Items\n\tgetItemGroup,\n\trenderGroupLabel,\n\n\t// Load More\n\thasMore,\n\tonLoadMore,\n\tloadingMore,\n\n\t// Disable individual items\n\tgetItemDisabled,\n\n\t// Highlight Match\n\thighlightMatch,\n\n\t// Size\n\tsize: sizeProp,\n\n\t// Controlled Open\n\topen,\n\tonOpenChange,\n\n\t// Behaviour\n\tcloseOnSelect = false,\n\tapplyButton = false,\n\tonApply,\n\tonCancel,\n}: MultiComboboxProps<T>): React.ReactElement {\n\tconst { defaultScale } = useDensityConfig();\n\tconst size = resolveComboboxSize(sizeProp, defaultScale);\n\tconst formSize = getComboboxFormSize(size);\n\tconst primitiveComboboxSize = primitiveComboboxSizeBySize[size];\n\tconst hasError = invalid || Boolean(error);\n\tconst containerRef = useRef<HTMLDivElement | null>(null);\n\tconst getKey = getItemKey ?? getItemLabel;\n\n\t// Draft state — only used in `applyButton` mode. Tracks the user's\n\t// in-progress selection so we can commit it on Apply or revert on\n\t// Cancel. When apply mode is OFF, we pass selections through immediately.\n\tconst [draftValues, setDraftValues] = useState<T[]>(selectedValues);\n\tconst [internalOpen, setInternalOpen] = useState(false);\n\tconst isOpenControlled = open !== undefined;\n\tconst resolvedOpen = isOpenControlled ? open : internalOpen;\n\n\tuseEffect(() => {\n\t\tif (applyButton) setDraftValues(selectedValues);\n\t}, [applyButton, selectedValues]);\n\n\tconst setOpen = useCallback(\n\t\t(next: boolean) => {\n\t\t\tif (!isOpenControlled) setInternalOpen(next);\n\t\t\tonOpenChange?.(next);\n\t\t},\n\t\t[isOpenControlled, onOpenChange],\n\t);\n\n\t// Use shared core hook\n\tconst core = useComboboxCore({\n\t\titems,\n\t\tsearchValue,\n\t\tonSearchValueChange,\n\t\tgetItemLabel,\n\t\tgetItemKey,\n\t\tloading,\n\t\tshowListContent,\n\t\tminSearchLength,\n\t\tstrings: stringsProp,\n\t\trenderItem,\n\t\tonSearch,\n\t\tdebounceMs,\n\t\tcreatable,\n\t\tonCreate,\n\t\tgetItemGroup,\n\t\thasMore,\n\t\tonLoadMore,\n\t\tloadingMore,\n\t\thighlightMatch,\n\t\tsize,\n\t\t// Include selected values in items list\n\t\tensuredItems: selectedValues,\n\t});\n\n\t// Handle value change, filtering out create options\n\tconst handleValueChange = useCallback(\n\t\t(values: T[]): void => {\n\t\t\tconst regularValues: T[] = [];\n\t\t\tlet createValue: string | null = null;\n\n\t\t\tfor (const value of values) {\n\t\t\t\tif (isCreateOption(value)) {\n\t\t\t\t\tcreateValue = getCreateOptionValue(value);\n\t\t\t\t} else {\n\t\t\t\t\tregularValues.push(value);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (createValue) {\n\t\t\t\tonCreate?.(createValue);\n\t\t\t}\n\n\t\t\tconst next = (regularValues.length !== values.length || !createValue) ? regularValues : null;\n\t\t\tif (next) {\n\t\t\t\tif (applyButton) {\n\t\t\t\t\tsetDraftValues(next);\n\t\t\t\t} else {\n\t\t\t\t\tonSelectedValuesChange(next);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (closeOnSelect) {\n\t\t\t\tsetOpen(false);\n\t\t\t}\n\t\t},\n\t\t[onSelectedValuesChange, onCreate, applyButton, closeOnSelect, setOpen],\n\t);\n\n\tconst handleApply = useCallback(() => {\n\t\tif (applyButton) onSelectedValuesChange(draftValues);\n\t\tonApply?.();\n\t\tsetOpen(false);\n\t}, [applyButton, draftValues, onApply, onSelectedValuesChange, setOpen]);\n\n\tconst handleCancel = useCallback(() => {\n\t\tif (applyButton) setDraftValues(selectedValues);\n\t\tonCancel?.();\n\t\tsetOpen(false);\n\t}, [applyButton, selectedValues, onCancel, setOpen]);\n\n\tconst visibleValues = applyButton ? draftValues : selectedValues;\n\tconst chipsPlaceholder = visibleValues.length > 0 ? undefined : core.strings.placeholder;\n\n\treturn (\n\t\t<Stack gap=\"dense\" className=\"combobox--component\">\n\t\t\t<BaseCombobox\n\t\t\t\tdismissLabel={core.strings.dismiss}\n\t\t\t\titems={core.allItems}\n\t\t\t\tmultiple\n\t\t\t\tvalue={visibleValues}\n\t\t\t\tonValueChange={(value, details) => {\n\t\t\t\t\t// Escape on a closed field must not erase the chosen value; let the\n\t\t\t\t\t// surrounding dialog or drawer handle the key instead.\n\t\t\t\t\tif (details.reason === 'escape-key') { details.allowPropagation(); return; }\n\t\t\t\t\thandleValueChange(value);\n\t\t\t\t}}\n\t\t\t\tinputValue={searchValue}\n\t\t\t\tonInputValueChange={(value, details) => {\n\t\t\t\t\tconst { reason } = details;\n\t\t\t\t\tif (reason === 'escape-key') { details.allowPropagation(); return; }\n\t\t\t\t\tif (reason === 'item-press') {\n\t\t\t\t\t\tonSearchValueChange('');\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tonSearchValueChange(value);\n\t\t\t\t}}\n\t\t\t\titemToStringLabel={core.itemToStringLabel}\n\t\t\t\tdisabled={disabled}\n\t\t\t\tfilter={null}\n\t\t\t\tname={name}\n\t\t\t\trequired={required}\n\t\t\t\topen={resolvedOpen}\n\t\t\t\tonOpenChange={(next) => {\n\t\t\t\t\t// In apply-button mode, closing without committing should\n\t\t\t\t\t// revert the draft so the next open starts clean.\n\t\t\t\t\tif (!next && applyButton) setDraftValues(selectedValues);\n\t\t\t\t\tsetOpen(next);\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<ComboboxChips\n\t\t\t\t\tref={containerRef}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\tformControlMinHeightClasses[formSize],\n\t\t\t\t\t\tformControlPaddingClasses[formSize],\n\t\t\t\t\t\tformSize === 'sm' ? 'text-pxs' : 'text-sm',\n\t\t\t\t\t\t'bg-transparent !shadow-none',\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t\tsize={primitiveComboboxSize}\n\t\t\t\t\terror={hasError}\n\t\t\t\t>\n\t\t\t\t\t{visibleValues.map((item) => (\n\t\t\t\t\t\t<ComboboxChip key={getKey(item)} strings={{ remove: (core.strings.removeSelection ?? defaultComboboxStrings.removeSelection)(getItemLabel(item)) }}>\n\t\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t\t\t\tsize=\"inherit\"\n\t\t\t\t\t\t\t\tweight=\"medium\"\n\t\t\t\t\t\t\t\tlineHeight=\"tight\"\n\t\t\t\t\t\t\t\tclassName=\"combobox--chip-label text-inherit\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{getItemLabel(item)}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t</ComboboxChip>\n\t\t\t\t\t))}\n\t\t\t\t\t<ComboboxChipsInput\n\t\t\t\t\t\tplaceholder={chipsPlaceholder}\n\t\t\t\t\t\taria-invalid={hasError || undefined}\n\t\t\t\t\t\taria-required={required}\n\t\t\t\t\t\tonBlur={onBlur}\n\t\t\t\t\t/>\n\t\t\t\t</ComboboxChips>\n\n\t\t\t\t<ComboboxDropdown\n\t\t\t\t\tloading={loading}\n\t\t\t\t\tshowStatus={core.showStatus}\n\t\t\t\t\tshowEmpty={core.showEmpty}\n\t\t\t\t\tsearchValue={searchValue}\n\t\t\t\t\tminSearchLength={minSearchLength}\n\t\t\t\t\titems={core.allItems}\n\t\t\t\t\tgroupedItems={core.groupedItems}\n\t\t\t\t\tcreateOptionItem={core.createOptionItem}\n\t\t\t\t\trenderItemContent={core.renderItemContent}\n\t\t\t\t\tgetItemReactKey={core.getItemReactKey}\n\t\t\t\t\tgetItemDisabled={getItemDisabled}\n\t\t\t\t\trenderGroupLabel={renderGroupLabel}\n\t\t\t\t\tloadingMore={showListContent && !core.showStatus ? loadingMore : false}\n\t\t\t\t\tstrings={core.strings}\n\t\t\t\t\tsize={size}\n\t\t\t\t\tportalContainer={portalContainer}\n\t\t\t\t\tlistRef={core.listRef}\n\t\t\t\t\tanchor={containerRef}\n\t\t\t\t\tapplyFooter={showListContent && applyButton ? {\n\t\t\t\t\t\tapplyLabel: core.strings.apply,\n\t\t\t\t\t\tcancelLabel: core.strings.cancel,\n\t\t\t\t\t\tonApply: handleApply,\n\t\t\t\t\t\tonCancel: handleCancel,\n\t\t\t\t\t} : undefined}\n\t\t\t\t/>\n\t\t\t</BaseCombobox>\n\n\t\t\t<ErrorMessage error={error} size={size} />\n\t\t</Stack>\n\t);\n}\n\nCombobox.displayName = 'Combobox';\nMultiCombobox.displayName = 'MultiCombobox';\n","import { useCallback, useEffect, useMemo, useRef, useState, type ReactNode } from 'react';\n\nimport { ErrorState } from '../../base/feedback';\nimport { Stack } from '../../base/structure';\nimport { Text } from '../../typography';\nimport { useDebouncedCallback } from '../../../hooks/use-debounced-callback';\nimport { useStrings, type StringsProp } from '../../../lib/strings';\nimport { cn } from '../../../lib/utils';\n\nimport { Combobox } from './combobox';\nimport { defaultComboboxStrings } from './combobox.strings';\nimport { DEFAULT_DEBOUNCE_MS } from './constants';\nimport type { ComboboxSize, ComboboxStrings, ComboboxProps } from './types';\n\nexport interface AsyncResourceComboboxFetcherArgs {\n\tquery: string;\n\tlimit: number;\n\tsignal?: AbortSignal;\n}\n\nexport type AsyncResourceComboboxFetcher<T> = (\n\targs: AsyncResourceComboboxFetcherArgs,\n) => Promise<T[]>;\n\nexport interface AsyncResourceComboboxStrings extends ComboboxStrings {\n\terror: string;\n\tretry: string;\n}\n\nexport const defaultAsyncResourceComboboxStrings: AsyncResourceComboboxStrings = {\n\t...defaultComboboxStrings,\n\terror: 'Unable to load options.',\n\tretry: 'Retry',\n};\n\nexport interface AsyncResourceComboboxRenderOptionContext {\n\tquery: string;\n\tisSelected: boolean;\n}\n\nexport interface AsyncResourceComboboxRenderErrorContext {\n\terror: unknown;\n\tquery: string;\n\tretry: () => void;\n}\n\nexport interface AsyncResourceComboboxProps<T>\n\textends Omit<\n\t\tComboboxProps<T>,\n\t\t| 'items'\n\t\t| 'selectedValue'\n\t\t| 'onSelectedValueChange'\n\t\t| 'clearSearchOnClose'\n\t\t| 'searchValue'\n\t\t| 'onSearchValueChange'\n\t\t| 'getItemLabel'\n\t\t| 'getItemKey'\n\t\t| 'loading'\n\t\t| 'showListContent'\n\t\t| 'renderItem'\n\t\t| 'strings'\n\t\t| 'error'\n\t\t| 'debounceMs'\n\t> {\n\t/**\n\t * Loads options for the current query. This component owns the request\n\t * lifecycle: calls are debounced by `debounceMs`, the previous request is\n\t * aborted through `args.signal`, and out-of-order responses are discarded, so\n\t * the fetcher only needs to resolve or reject.\n\t *\n\t * A rejection clears the fetched list and presents the localized error as an\n\t * exclusive state, suppressing the ordinary no-results row. Honour\n\t * `args.signal` so aborts do not surface as errors.\n\t */\n\tfetcher: AsyncResourceComboboxFetcher<T>;\n\t/** Selected item, for controlled use. Omit entirely to let the component own selection. */\n\tvalue?: T | null;\n\t/** Initial selection for uncontrolled use. Ignored once `value` is passed. */\n\tdefaultValue?: T | null;\n\t/** Fired with the new selection in both controlled and uncontrolled modes. */\n\tonValueChange?: (value: T | null) => void;\n\t/** Fired after a successful fetch with the items received and the request that produced them. */\n\tonAfterFetch?: (items: T[], context: AsyncResourceComboboxFetcherArgs) => void;\n\t/** Fired when the fetcher rejects. Aborted and superseded requests never reach this. */\n\tonError?: (error: unknown, context: AsyncResourceComboboxFetcherArgs) => void;\n\t/** Stable identity for an item. Also decides which option reads as selected. */\n\tgetKey: (item: T) => string;\n\t/** Primary display label for an item. */\n\tgetLabel: (item: T) => string;\n\t/** Secondary text beside the label in the default option row. */\n\tgetDescription?: (item: T) => ReactNode;\n\t/** Tertiary, dimmed text after the description in the default option row. */\n\tgetMeta?: (item: T) => ReactNode;\n\t/**\n\t * Replaces the entire default option row, including the label. When set,\n\t * `getLabel`, `getDescription`, and `getMeta` no longer affect rendering\n\t * (`getLabel` is still used for the input's text value).\n\t */\n\trenderOption?: (item: T, context: AsyncResourceComboboxRenderOptionContext) => ReactNode;\n\t/**\n\t * Page size passed to the fetcher as `args.limit`. Default: `10`.\n\t *\n\t * Advisory only — the component does not truncate the returned array, so the\n\t * fetcher is responsible for honouring it.\n\t */\n\tlimit?: number;\n\t/** Quiet period before a query is issued, in milliseconds. Default: `300`. */\n\tdebounceMs?: number;\n\t/**\n\t * Characters required before a query is issued. Default: `0` here, rather\n\t * than the `3` used by the synchronous comboboxes — resource lookup is\n\t * expected to be browsable from the first keystroke alongside `preload`.\n\t *\n\t * An empty input is governed by `preload`, not by this threshold.\n\t */\n\tminSearchLength?: number;\n\t/**\n\t * Fetches with an empty query so options are available before typing.\n\t * Default: `true`. Set `false` to require a query first.\n\t */\n\tpreload?: boolean;\n\t/** Replaces the default error copy shown when the fetcher rejects. */\n\terrorMessage?: ReactNode;\n\t/** Replaces the package error state while retaining the failed query and retry action. */\n\trenderError?: (context: AsyncResourceComboboxRenderErrorContext) => ReactNode;\n\t/** Overrides the combobox copy, including the async-only `error` message. */\n\tstrings?: StringsProp<AsyncResourceComboboxStrings>;\n\t/** Trigger density. Falls back to `UIProvider.density.defaultScale`, then `md`. */\n\tsize?: ComboboxSize;\n}\n\nfunction isSimpleText(value: ReactNode): value is string | number | bigint {\n\treturn typeof value === 'string' || typeof value === 'number' || typeof value === 'bigint';\n}\n\nexport function AsyncResourceCombobox<T>({\n\tfetcher,\n\tvalue,\n\tdefaultValue = null,\n\tonValueChange,\n\tonAfterFetch,\n\tonError,\n\tgetKey,\n\tgetLabel,\n\tgetDescription,\n\tgetMeta,\n\trenderOption,\n\tlimit = 10,\n\tdebounceMs = DEFAULT_DEBOUNCE_MS,\n\tpreload = true,\n\tminSearchLength = 0,\n\terrorMessage,\n\trenderError,\n\tstrings: stringsProp,\n\tdisabled,\n\tsize,\n\t...props\n}: AsyncResourceComboboxProps<T>) {\n\tconst strings = useStrings(defaultAsyncResourceComboboxStrings, stringsProp);\n\tconst isControlled = value !== undefined;\n\tconst [internalValue, setInternalValue] = useState<T | null>(defaultValue);\n\tconst selectedValue = isControlled ? value : internalValue;\n\tconst [searchValue, setSearchValue] = useState('');\n\tconst [items, setItems] = useState<T[]>([]);\n\tconst [isLoading, setIsLoading] = useState(false);\n\tconst [fetchError, setFetchError] = useState<{ error: unknown; query: string } | null>(null);\n\tconst [retryCount, setRetryCount] = useState(0);\n\tconst requestIdRef = useRef(0);\n\tconst trimmedSearch = searchValue.trim();\n\n\tconst handleValueChange = useCallback(\n\t\t(nextValue: T | null) => {\n\t\t\tif (!isControlled) {\n\t\t\t\tsetInternalValue(nextValue);\n\t\t\t}\n\t\t\tonValueChange?.(nextValue);\n\t\t},\n\t\t[isControlled, onValueChange],\n\t);\n\n\t// `fetcher`, `onAfterFetch` and `onError` are almost always inline, so their\n\t// identities change on every render. Listing them in the effect below re-ran\n\t// it every render, and because the fetch sets state that re-render was\n\t// self-sustaining — an unbounded request loop. `useDebouncedCallback` holds\n\t// them in a ref and returns a stable function, so the effect only re-runs on\n\t// a real query change.\n\tconst runFetch = useDebouncedCallback(\n\t\t(requestId: number, context: AsyncResourceComboboxFetcherArgs) => {\n\t\t\tsetIsLoading(true);\n\t\t\tsetFetchError(null);\n\n\t\t\tfetcher(context)\n\t\t\t\t.then((nextItems) => {\n\t\t\t\t\tif (context.signal?.aborted || requestIdRef.current !== requestId) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tsetItems(nextItems);\n\t\t\t\t\tonAfterFetch?.(nextItems, context);\n\t\t\t\t})\n\t\t\t\t.catch((nextError: unknown) => {\n\t\t\t\t\tif (context.signal?.aborted || requestIdRef.current !== requestId) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tsetItems([]);\n\t\t\t\t\tsetFetchError({ error: nextError, query: context.query });\n\t\t\t\t\tonError?.(nextError, context);\n\t\t\t\t})\n\t\t\t\t.finally(() => {\n\t\t\t\t\tif (!context.signal?.aborted && requestIdRef.current === requestId) {\n\t\t\t\t\t\tsetIsLoading(false);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t},\n\t\tdebounceMs,\n\t);\n\n\tuseEffect(() => {\n\t\tif (disabled) return;\n\n\t\tconst shouldFetch =\n\t\t\ttrimmedSearch.length > 0\n\t\t\t\t? trimmedSearch.length >= minSearchLength\n\t\t\t\t: preload;\n\n\t\tif (!shouldFetch) {\n\t\t\tsetItems([]);\n\t\t\tsetIsLoading(false);\n\t\t\tsetFetchError(null);\n\t\t\treturn;\n\t\t}\n\n\t\tconst requestId = requestIdRef.current + 1;\n\t\trequestIdRef.current = requestId;\n\t\tconst controller = new AbortController();\n\n\t\trunFetch(requestId, {\n\t\t\tquery: trimmedSearch,\n\t\t\tlimit,\n\t\t\tsignal: controller.signal,\n\t\t});\n\n\t\treturn () => {\n\t\t\trunFetch.cancel();\n\t\t\tcontroller.abort();\n\t\t};\n\t}, [\n\t\tdisabled,\n\t\tlimit,\n\t\tminSearchLength,\n\t\tpreload,\n\t\tretryCount,\n\t\trunFetch,\n\t\ttrimmedSearch,\n\t]);\n\n\tconst retry = useCallback(() => {\n\t\tif (!fetchError) return;\n\t\tsetSearchValue(fetchError.query);\n\t\tsetRetryCount((count) => count + 1);\n\t}, [fetchError]);\n\n\tconst renderItem = useCallback(\n\t\t(item: T) => {\n\t\t\tif (renderOption) {\n\t\t\t\treturn renderOption(item, {\n\t\t\t\t\tquery: trimmedSearch,\n\t\t\t\t\tisSelected: selectedValue ? getKey(selectedValue) === getKey(item) : false,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst description = getDescription?.(item);\n\t\t\tconst meta = getMeta?.(item);\n\n\t\t\treturn (\n\t\t\t\t<Stack\n\t\t\t\t\trender={<span />}\n\t\t\t\t\tdirection=\"horizontal\"\n\t\t\t\t\tgap=\"md\"\n\t\t\t\t\twrap={false}\n\t\t\t\t\tclassName=\"async-resource-combobox--option leading-tight\"\n\t\t\t\t>\n\t\t\t\t\t<Text type=\"inherit\"\n\t\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t\tsize={size === 'sm' ? 'pxs' : undefined}\n\t\t\t\t\t\tweight=\"medium\"\n\t\t\t\t\t\tclassName=\"min-w-0 shrink truncate\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{getLabel(item)}\n\t\t\t\t\t</Text>\n\t\t\t\t\t{(!!description || !!meta) && (\n\t\t\t\t\t\t<span className=\"inline-flex min-w-0 flex-1 items-center gap-space-sm overflow-hidden text-muted-foreground\">\n\t\t\t\t\t\t\t{!!description && (isSimpleText(description) ? (\n\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"xs\" type=\"secondary\" className=\"min-w-0 truncate\">\n\t\t\t\t\t\t\t\t\t{description}\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t) : description)}\n\t\t\t\t\t\t\t{!!meta && (isSimpleText(meta) ? (\n\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"xs\" type=\"secondary\" className=\"min-w-0 truncate\">\n\t\t\t\t\t\t\t\t\t{meta}\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t) : meta)}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)}\n\t\t\t\t</Stack>\n\t\t\t);\n\t\t},\n\t\t[getDescription, getKey, getLabel, getMeta, renderOption, selectedValue, size, trimmedSearch],\n\t);\n\n\tconst resolvedError = useMemo(() => {\n\t\tif (!fetchError) return undefined;\n\t\treturn errorMessage ?? strings.error;\n\t}, [errorMessage, fetchError, strings.error]);\n\tconst hasFetchError = fetchError !== null;\n\tconst errorNode = fetchError\n\t\t? renderError?.({ error: fetchError.error, query: fetchError.query, retry }) ?? (\n\t\t\t<ErrorState\n\t\t\t\tvariant=\"inline\"\n\t\t\t\ttitle={resolvedError}\n\t\t\t\tonRetry={retry}\n\t\t\t\tretryLabel={strings.retry}\n\t\t\t\tclassName=\"async-resource-combobox--error mt-space-sm\"\n\t\t\t/>\n\t\t)\n\t\t: null;\n\n\treturn (\n\t\t<div\n\t\t\tdata-component=\"async-resource-combobox\"\n\t\t\tdata-slot=\"async-resource-combobox\"\n\t\t\tclassName={cn('async-resource-combobox--component', props.className)}\n\t\t>\n\t\t\t<Combobox\n\t\t\t\t{...props}\n\t\t\t\tclassName={undefined}\n\t\t\t\tdisabled={disabled}\n\t\t\t\tsize={size}\n\t\t\t\titems={items}\n\t\t\t\tselectedValue={selectedValue ?? null}\n\t\t\t\tonSelectedValueChange={handleValueChange}\n\t\t\t\tclearSearchOnClose={false}\n\t\t\t\tsearchValue={searchValue}\n\t\t\t\tonSearchValueChange={setSearchValue}\n\t\t\t\tgetItemLabel={getLabel}\n\t\t\t\tgetItemKey={getKey}\n\t\t\t\tloading={!hasFetchError && isLoading}\n\t\t\t\tshowListContent={!hasFetchError}\n\t\t\t\tminSearchLength={minSearchLength}\n\t\t\t\tstrings={strings}\n\t\t\t\trenderItem={renderItem}\n\t\t\t/>\n\t\t\t{errorNode}\n\t\t</div>\n\t);\n}\n\nAsyncResourceCombobox.displayName = 'AsyncResourceCombobox';\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"combobox-xCQ2RMNE.js","names":["Combobox","ComboboxPrimitive","ComboboxInput","ComboboxTrigger","ComboboxClear","ComboboxInputTrigger","ComboboxPopup","ComboboxItem","ComboboxSeparator","ComboboxChip","InputTrigger","Clear","Chip","Popup","Input","Trigger","Item","Separator","useTypographyConfig","useThemePortalContainer","cn","affordanceGeometry","anchoredPositionMethod","motionRecipes","surfaceDividerRecipes","surfaceInsetClasses","collectionRowClasses","popoverRecipes","collectionRecipes","CollectionLabel","modalBackdropRecipe","fieldStateRecipes","fieldAffordanceRecipes","selectToggleRecipes","FieldClearGlyph","editableTextSizeClasses","Combobox$1","Combobox","ComboboxInput$1","props","className","ComboboxTrigger$1","children","ChevronDownIcon","ComboboxValue","placeholder","ComboboxClear$1","inputSizeClasses","ComboboxInputTrigger$1","size","showClear","error","clearLabel","toggleLabel","ComboboxPortal","resolvedContainer","container","ComboboxPositioner","ComboboxPopup$1","ComboboxList","itemIndicatorSizeClasses","ComboboxItem$1","CheckIcon","ComboboxItemIndicator","ComboboxEmpty","ComboboxStatus","ComboboxGroup","ComboboxGroupLabel","ComboboxCollection","ComboboxSeparator$1","chipsSizeClasses","ComboboxChips","ComboboxChip$1","removeLabel","ComboboxChipsInput","ComboboxBackdrop","ComboboxArrow","useComboboxFilter","defaultComboboxControlStrings","ComboboxInputTrigger","stringsProp","strings","useStrings","createElement","ComboboxClear","ComboboxChip","ComboboxPopup","ComboboxInput","ComboboxTrigger","densityBySize","ComboboxItem","content","density","textSizes","defaultTextSize","ComboboxSeparator"],"sources":["../src/components/ui/combobox.tsx","../src/components/base/combobox/combobox.strings.ts","../src/components/base/combobox/index.ts"],"sourcesContent":["import { anchoredPositionMethod } from '../../lib/anchored-positioning';\nimport { fieldStateRecipes } from '../../lib/field-state-recipes';\nimport { FieldClearGlyph, fieldAffordanceRecipes, selectToggleRecipes } from '../../lib/field-affordance-recipes';\nimport { editableTextSizeClasses } from '../../lib/editable-text-recipe';\nimport { affordanceGeometry } from '../../lib/affordance-geometry.generated';\nimport { motionRecipes } from '../../lib/motion-recipes';\nimport { surfaceDividerRecipes } from '../../lib/surface-recipes';\nimport { modalBackdropRecipe } from './overlay.recipes';\nimport { useThemePortalContainer } from '../../lib/theme-scope';\nimport { Combobox as ComboboxPrimitive } from '@base-ui/react/combobox';\nimport { CheckIcon, ChevronDownIcon } from 'lucide-react';\nimport * as React from 'react';\nimport { cn } from '../../lib/utils';\n\nconst Combobox = ComboboxPrimitive.Root;\n\nfunction ComboboxInput({\n\tclassName,\n\t...props\n}: ComboboxPrimitive.Input.Props) {\n\treturn (\n\t\t<ComboboxPrimitive.Input\n\t\t\tdata-slot=\"combobox-input\"\n\t\t\tclassName={cn(\n\t\t\t\t'font-sans text-foreground',\n\t\t\t\t'box-border border-input file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground flex h-control w-full min-w-0 rounded-inner border bg-background px-control shadow-none transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50',\n\t\t\t\taffordanceGeometry.controlTextMinHeight,\n\t\t\t\taffordanceGeometry.controlBlockPadding.md,\n\t\t\t\teditableTextSizeClasses.md,\n\t\t\t\tfieldStateRecipes.focus,\n\t\t\t\tfieldStateRecipes.invalid,\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction ComboboxTrigger({\n\tclassName,\n\tchildren,\n\t...props\n}: ComboboxPrimitive.Trigger.Props) {\n\treturn (\n\t\t<ComboboxPrimitive.Trigger\n\t\t\tdata-slot=\"combobox-trigger\"\n\t\t\tclassName={cn(\n\t\t\t\t'font-sans text-foreground',\n\t\t\t\t'box-border border-input file:text-foreground placeholder:text-muted-foreground flex h-control w-full items-center justify-between rounded-inner border bg-background px-control shadow-none transition-[color,box-shadow] outline-none disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50',\n\t\t\t\t'text-sm',\n\t\t\t\taffordanceGeometry.controlTextMinHeight,\n\t\t\t\taffordanceGeometry.controlBlockPadding.md,\n\t\t\t\tfieldStateRecipes.focus,\n\t\t\t\tfieldStateRecipes.invalid,\n\t\t\t\t'[&>span]:line-clamp-1',\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t\t<ComboboxPrimitive.Icon className=\"flex\">\n\t\t\t\t<ChevronDownIcon className={cn(selectToggleRecipes.icon.md, 'text-muted-foreground')} />\n\t\t\t</ComboboxPrimitive.Icon>\n\t\t</ComboboxPrimitive.Trigger>\n\t);\n}\n\nfunction ComboboxValue({\n\tplaceholder,\n\t...props\n}: ComboboxPrimitive.Value.Props & { placeholder?: React.ReactNode }) {\n\treturn (\n\t\t<ComboboxPrimitive.Value\n\t\t\tdata-slot=\"combobox-value\"\n\t\t\tplaceholder={\n\t\t\t\t!!placeholder && <span className=\"text-muted-foreground\">{placeholder}</span>\n\t\t\t}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction ComboboxClear({\n\tclassName,\n\t...props\n}: ComboboxPrimitive.Clear.Props) {\n\treturn (\n\t\t<ComboboxPrimitive.Clear\n\t\t\tdata-slot=\"combobox-clear\"\n\t\t\tclassName={cn(\n\t\t\t\tfieldAffordanceRecipes.target,\n\t\t\t\tfieldAffordanceRecipes.focus,\n\t\t\t\tfieldAffordanceRecipes.clear,\n\t\t\t\tfieldAffordanceRecipes.centered,\n\t\t\t\t'end-control-icon',\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t\t<FieldClearGlyph aria-hidden=\"true\" className={fieldAffordanceRecipes.icon} />\n\t\t</ComboboxPrimitive.Clear>\n\t);\n}\n\nexport type ComboboxSize = 'sm' | 'md' | 'lg';\n\nconst inputSizeClasses: Record<ComboboxSize, string> = {\n\tsm: 'h-control-sm ps-control-sm',\n\tmd: 'h-control ps-control',\n\tlg: 'h-control-lg ps-control',\n};\n\n\n// Toggle-only text clearance, track offset and chevron scale come from the\n// shared select-toggle recipe, so this input, the Select trigger and the\n// feature Combobox centre their chevrons in the same place.\n\ntype ComboboxInputTriggerProps = Omit<ComboboxPrimitive.Input.Props, 'size'> & {\n\tshowClear?: boolean;\n\tclearLabel?: string;\n\ttoggleLabel?: string;\n\tsize?: ComboboxSize;\n\terror?: boolean;\n};\n\nfunction ComboboxInputTrigger({\n\tclassName,\n\tshowClear = false,\n\tclearLabel,\n\ttoggleLabel,\n\tsize = 'md',\n\terror,\n\t...props\n}: ComboboxInputTriggerProps) {\n\treturn (\n\t\t<div className=\"relative h-fit\">\n\t\t\t<ComboboxPrimitive.Input\n\t\t\t\tdata-slot=\"combobox-input\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'font-sans text-foreground',\n\t\t\t\t\t'box-border border-input file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground w-full min-w-0 rounded-inner border bg-background shadow-none transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50',\n\t\t\t\t\tfieldStateRecipes.focus,\n\t\t\t\t\tfieldStateRecipes.invalid,\n\t\t\t\t\tinputSizeClasses[size],\n\t\t\t\t\taffordanceGeometry.controlTextMinHeight,\n\t\t\t\t\taffordanceGeometry.controlBlockPadding[size],\n\t\t\t\t\teditableTextSizeClasses[size],\n\t\t\t\t\tshowClear ? selectToggleRecipes.clearPadding[size] : selectToggleRecipes.padding[size],\n\t\t\t\t\tclassName\n\t\t\t\t)}\n\t\t\t\taria-invalid={error || undefined}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'absolute top-1/2 -translate-y-1/2 flex items-center gap-space-xs text-muted-foreground',\n\t\t\t\t\tselectToggleRecipes.track[size]\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{!!showClear && (\n <ComboboxPrimitive.Clear\n\t\t\t\t\t\taria-label={clearLabel}\n\t\t\t\t\t\tdata-slot=\"combobox-clear\"\n\t\t\t\t\t\tclassName={cn(fieldAffordanceRecipes.target,fieldAffordanceRecipes.focus,fieldAffordanceRecipes.clear)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<FieldClearGlyph aria-hidden=\"true\" className={fieldAffordanceRecipes.icon} />\n\t\t\t\t\t</ComboboxPrimitive.Clear>\n )}\n\t\t\t\t<ComboboxPrimitive.Trigger aria-label={toggleLabel} className={cn(fieldAffordanceRecipes.target,fieldAffordanceRecipes.focus,fieldAffordanceRecipes.toggle)}>\n\t\t\t\t\t<ChevronDownIcon aria-hidden=\"true\" className={cn('shrink-0', selectToggleRecipes.icon[size])} />\n\t\t\t\t</ComboboxPrimitive.Trigger>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\n// Portal\nfunction ComboboxPortal({ container, ...props }: ComboboxPrimitive.Portal.Props) {\n\tconst resolvedContainer = useThemePortalContainer(container);\n\treturn <ComboboxPrimitive.Portal container={resolvedContainer} {...props} />;\n}\n\n// Positioner\nfunction ComboboxPositioner({\n\tclassName,\n\tpositionMethod = anchoredPositionMethod,\n\tsideOffset = 4,\n\t...props\n}: ComboboxPrimitive.Positioner.Props) {\n\treturn (\n\t\t<ComboboxPrimitive.Positioner\n\t\t\tpositionMethod={positionMethod}\n\t\t\tdata-slot=\"combobox-positioner\"\n\t\t\tsideOffset={sideOffset}\n\t\t\tclassName={cn('z-50 outline-none', className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\n// Popup (content)\nfunction ComboboxPopup({\n\tclassName,\n\t...props\n}: ComboboxPrimitive.Popup.Props) {\n\treturn (\n\t\t<ComboboxPrimitive.Popup\n\t\t\tdata-slot=\"combobox-popup\"\n\t\t\tclassName={cn(\n\t\t\t\t'w-[var(--anchor-width)] min-w-[8rem] max-w-[var(--available-width)] max-h-[min(var(--available-height),24rem)]',\n\t\t\t\t'overflow-hidden rounded-radius bg-popover text-popover-foreground shadow-md',\n\t\t\t\tsurfaceDividerRecipes.anchored.shell,\n\t\t\t\t'origin-[var(--transform-origin)]',\n\t\t\t\tmotionRecipes.popup,\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\n// List\nfunction ComboboxList({\n\tclassName,\n\t...props\n}: ComboboxPrimitive.List.Props) {\n\treturn (\n\t\t<ComboboxPrimitive.List\n\t\t\tdata-slot=\"combobox-list\"\n\t\t\tclassName={cn(\n\t\t\t\t'max-h-[min(24rem,var(--available-height))] overflow-y-auto overscroll-contain p-surface-xs',\n\t\t\t\t'outline-none empty:hidden',\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\n// Item\n//\n// Layout: `[content][indicator]` with the selection check pinned to the\n// right (`justify-between`). Consumers render leading icons naturally inside\n// `renderItem` — the `gap` between icon and label is set by the consumer.\nconst itemIndicatorSizeClasses: Record<ComboboxSize, string> = {\n\tsm: 'size-icon-sm',\n\tmd: 'size-icon',\n\tlg: 'size-icon-lg',\n};\n\nfunction ComboboxItem({\n\tclassName,\n\tchildren,\n\tsize = 'md',\n\t...props\n}: ComboboxPrimitive.Item.Props & { size?: ComboboxSize }) {\n\treturn (\n\t\t<ComboboxPrimitive.Item\n\t\t\tdata-slot=\"combobox-item\"\n\t\t\tclassName={cn(\n\t\t\t\t'flex w-full cursor-default select-none items-center justify-between outline-none',\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<span className=\"flex min-w-0 flex-1 items-center gap-space-sm truncate\">\n\t\t\t\t{children}\n\t\t\t</span>\n\t\t\t<ComboboxPrimitive.ItemIndicator\n\t\t\t\tclassName={cn(\n\t\t\t\t\t// The selection check uses the row's own ink, as Select options do.\n\t\t\t\t\t'flex shrink-0 items-center justify-center',\n\t\t\t\t\titemIndicatorSizeClasses[size]\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<CheckIcon className={itemIndicatorSizeClasses[size]} />\n\t\t\t</ComboboxPrimitive.ItemIndicator>\n\t\t</ComboboxPrimitive.Item>\n\t);\n}\n\n// Item Indicator (standalone)\nfunction ComboboxItemIndicator({\n\tclassName,\n\tchildren,\n\t...props\n}: ComboboxPrimitive.ItemIndicator.Props) {\n\treturn (\n\t\t<ComboboxPrimitive.ItemIndicator\n\t\t\tdata-slot=\"combobox-item-indicator\"\n\t\t\tclassName={cn(className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children ?? <CheckIcon className=\"size-icon\" />}\n\t\t</ComboboxPrimitive.ItemIndicator>\n\t);\n}\n\n// Empty\nfunction ComboboxEmpty({\n\tclassName,\n\tchildren,\n\t...props\n}: ComboboxPrimitive.Empty.Props) {\n\treturn (\n\t\t<ComboboxPrimitive.Empty\n\t\t\tdata-slot=\"combobox-empty\"\n\t\t\tclassName={cn(\n\t\t\t\t'px-row-x py-space-xl text-center text-sm text-muted-foreground empty:hidden',\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t</ComboboxPrimitive.Empty>\n\t);\n}\n\n// Status (for async loading states)\nfunction ComboboxStatus({\n\tclassName,\n\t...props\n}: ComboboxPrimitive.Status.Props) {\n\treturn (\n\t\t<ComboboxPrimitive.Status\n\t\t\tdata-slot=\"combobox-status\"\n\t\t\tclassName={cn(\n\t\t\t\t'flex items-center gap-space-sm px-row-x py-row-y text-sm text-muted-foreground empty:hidden',\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\n// Group\nfunction ComboboxGroup({\n\tclassName,\n\t...props\n}: ComboboxPrimitive.Group.Props) {\n\treturn (\n\t\t<ComboboxPrimitive.Group\n\t\t\tdata-slot=\"combobox-group\"\n\t\t\tclassName={cn('overflow-hidden p-0', className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\n// Group Label\nfunction ComboboxGroupLabel({\n\tclassName,\n\t...props\n}: ComboboxPrimitive.GroupLabel.Props) {\n\treturn (\n\t\t<ComboboxPrimitive.GroupLabel\n\t\t\tdata-slot=\"combobox-group-label\"\n\t\t\tclassName={cn('px-row-x py-row-y-sm text-xs font-medium text-muted-foreground', className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\n// Collection (for rendering items)\nconst ComboboxCollection = ComboboxPrimitive.Collection;\n\n// Separator\nfunction ComboboxSeparator({\n\tclassName,\n\t...props\n}: ComboboxPrimitive.Separator.Props) {\n\treturn (\n\t\t<ComboboxPrimitive.Separator\n\t\t\tdata-slot=\"combobox-separator\"\n\t\t\tclassName={cn('my-space-xs h-px', surfaceDividerRecipes.anchored.separator, className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\n// Chips container (for multiple selection)\nconst chipsSizeClasses: Record<ComboboxSize, string> = {\n\tsm: 'min-h-control-sm gap-space-xs px-control-sm py-space-xs text-sm',\n\tmd: 'min-h-control gap-space-xs px-control py-space-xs text-sm',\n\tlg: 'min-h-control-lg gap-space-sm px-control py-space-xs text-sm',\n};\n\nfunction ComboboxChips({\n\tclassName,\n\tsize = 'md',\n\terror,\n\t...props\n}: React.ComponentPropsWithRef<typeof ComboboxPrimitive.Chips> & {\n\tsize?: ComboboxSize;\n\terror?: boolean;\n}) {\n\treturn (\n\t\t<ComboboxPrimitive.Chips\n\t\t\tdata-slot=\"combobox-chips\"\n\t\t\tclassName={cn(\n\t\t\t\t'font-sans text-foreground',\n\t\t\t\t'box-border flex flex-wrap items-center rounded-inner border border-input bg-background shadow-none transition-[color,box-shadow] outline-none',\n\t\t\t\t'has-[:focus-visible]:border-ring has-[:focus-visible]:ring-3 has-[:focus-visible]:ring-ring/50',\n\t\t\t\tfieldStateRecipes.invalid,\n\t\t\t\t'aria-invalid:has-[:focus-visible]:border-destructive aria-invalid:has-[:focus-visible]:ring-destructive/30 dark:aria-invalid:has-[:focus-visible]:ring-destructive/50',\n\t\t\t\tchipsSizeClasses[size],\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\taria-invalid={error || undefined}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\n// Chip\nfunction ComboboxChip({\n\tclassName,\n\tchildren,\n\tremoveLabel,\n\t...props\n}: ComboboxPrimitive.Chip.Props & { removeLabel?: string }) {\n\treturn (\n\t\t<ComboboxPrimitive.Chip\n\t\t\tdata-slot=\"combobox-chip\"\n\t\t\tclassName={cn(\n\t\t\t\t'inline-flex items-center gap-space-xs rounded-inner bg-secondary px-control-xs py-space-xs text-xs font-medium text-secondary-foreground',\n\t\t\t\t'data-[highlighted]:bg-primary data-[highlighted]:text-primary-foreground',\n\t\t\t\t'focus-within:bg-primary focus-within:text-primary-foreground',\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t\t<ComboboxPrimitive.ChipRemove aria-label={removeLabel} className={cn(fieldAffordanceRecipes.inline, fieldAffordanceRecipes.focus, 'text-inherit opacity-70 hover:opacity-100')}>\n\t\t\t\t<FieldClearGlyph aria-hidden=\"true\" className={fieldAffordanceRecipes.icon} />\n\t\t\t</ComboboxPrimitive.ChipRemove>\n\t\t</ComboboxPrimitive.Chip>\n\t);\n}\n\n// Chips Input\nfunction ComboboxChipsInput({\n\tclassName,\n\t...props\n}: ComboboxPrimitive.Input.Props) {\n\treturn (\n\t\t<ComboboxPrimitive.Input\n\t\t\tdata-slot=\"combobox-chips-input\"\n\t\t\tclassName={cn(\n\t\t\t\t'box-border min-h-lh min-w-[80px] flex-1 border-0 bg-transparent p-0 font-sans text-foreground outline-none placeholder:text-muted-foreground',\n\t\t\t\teditableTextSizeClasses.md,\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\n// Backdrop (for modal)\nfunction ComboboxBackdrop({\n\tclassName,\n\t...props\n}: ComboboxPrimitive.Backdrop.Props) {\n\treturn (\n\t\t<ComboboxPrimitive.Backdrop\n\t\t\tdata-slot=\"combobox-backdrop\"\n\t\t\tclassName={cn(modalBackdropRecipe, \n\t\t\t\tmotionRecipes.backdrop,\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\n// Arrow\nfunction ComboboxArrow({\n\tclassName,\n\t...props\n}: ComboboxPrimitive.Arrow.Props) {\n\treturn (\n\t\t<ComboboxPrimitive.Arrow\n\t\t\tdata-slot=\"combobox-arrow\"\n\t\t\tclassName={cn('fill-popover', className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\n// useFilter hook re-export\nconst useComboboxFilter = ComboboxPrimitive.useFilter;\n\nexport {\n\tCombobox,\n\tComboboxInput,\n\tComboboxInputTrigger,\n\tComboboxTrigger,\n\tComboboxValue,\n\tComboboxClear,\n\tComboboxPortal,\n\tComboboxPositioner,\n\tComboboxPopup,\n\tComboboxList,\n\tComboboxItem,\n\tComboboxItemIndicator,\n\tComboboxEmpty,\n\tComboboxStatus,\n\tComboboxGroup,\n\tComboboxGroupLabel,\n\tComboboxCollection,\n\tComboboxSeparator,\n\tComboboxChips,\n\tComboboxChip,\n\tComboboxChipsInput,\n\tComboboxBackdrop,\n\tComboboxArrow,\n\tuseComboboxFilter,\n};\n","/** Accessible labels owned by the base combobox's generated controls. */\nexport interface ComboboxControlStrings {\n\tclear: string;\n\ttoggle: string;\n\tremove: string;\n}\n\nexport const defaultComboboxControlStrings: ComboboxControlStrings = {\n\tclear: 'Clear selection',\n\ttoggle: 'Open options',\n\tremove: 'Remove selection',\n};\n","import { CollectionLabel } from '../popover/collection-content';\n/**\n * Base wrapper for `ui/combobox`.\n *\n * This family is the sole importer of `@/components/ui/combobox`: it re-exports\n * the Base UI combobox anatomy with shared recipes and accessible control labels\n * so every other layer composes the parts without reaching into `ui/`. The searchable recipe built on top of this\n * anatomy — `Combobox`, `MultiCombobox`, `AsyncResourceCombobox`, and the\n * headless hooks — lives in `features/combobox`.\n *\n * The compound root is exported as `ComboboxRoot` so the canonical `Combobox`\n * name stays with the opinionated feature component.\n */\nexport {\n\tCombobox as ComboboxRoot,\n\tComboboxValue,\n\tComboboxPortal,\n\tComboboxPositioner,\n\tComboboxList,\n\tComboboxItemIndicator,\n\tComboboxEmpty,\n\tComboboxStatus,\n\tComboboxGroup,\n\tComboboxGroupLabel,\n\tComboboxCollection,\n\tComboboxChips,\n\tComboboxChipsInput,\n\tComboboxBackdrop,\n\tComboboxArrow,\n\tuseComboboxFilter,\n} from '../../ui/combobox';\n\n\nimport { createElement, type ComponentProps } from 'react';\nimport { ComboboxItem as Item, ComboboxPopup as Popup, ComboboxInput as Input, ComboboxInputTrigger as InputTrigger, ComboboxClear as Clear, ComboboxChip as Chip, ComboboxTrigger as Trigger, ComboboxSeparator as Separator } from '../../ui/combobox';\nimport { cn } from '../../../lib/utils';\nimport { collectionRecipes, collectionRowClasses, popoverRecipes, surfaceInsetClasses, type CollectionDensity } from '../popover/popover.recipes';\nimport { useTypographyConfig } from '../../../lib/ui-provider';\nimport { textSizes } from '../../typography/text.styles';\nimport { useStrings, type StringsProp } from '../../../lib/strings';\nimport { defaultComboboxControlStrings, type ComboboxControlStrings } from './combobox.strings';\n\nexport { defaultComboboxControlStrings, type ComboboxControlStrings } from './combobox.strings';\n\nexport type ComboboxInputTriggerProps = Omit<ComponentProps<typeof InputTrigger>, 'clearLabel' | 'toggleLabel'> & {\n /** Accessible labels for the generated clear and toggle buttons. */\n strings?: StringsProp<Pick<ComboboxControlStrings, 'clear' | 'toggle'>>;\n};\n\nexport function ComboboxInputTrigger({ strings: stringsProp, ...props }: ComboboxInputTriggerProps) {\n const strings = useStrings(defaultComboboxControlStrings, stringsProp);\n return createElement(InputTrigger, { ...props, clearLabel: strings.clear, toggleLabel: strings.toggle });\n}\n\nexport type ComboboxClearProps = ComponentProps<typeof Clear> & {\n /** Accessible label; an explicit aria-label takes precedence. */\n strings?: StringsProp<Pick<ComboboxControlStrings, 'clear'>>;\n};\n\nexport function ComboboxClear({ strings: stringsProp, ...props }: ComboboxClearProps) {\n const strings = useStrings(defaultComboboxControlStrings, stringsProp);\n return createElement(Clear, { 'aria-label': strings.clear, ...props });\n}\n\nexport type ComboboxChipProps = Omit<ComponentProps<typeof Chip>, 'removeLabel'> & {\n /** Accessible label for the generated removal button. */\n strings?: StringsProp<Pick<ComboboxControlStrings, 'remove'>>;\n};\n\nexport function ComboboxChip({ strings: stringsProp, ...props }: ComboboxChipProps) {\n const strings = useStrings(defaultComboboxControlStrings, stringsProp);\n return createElement(Chip, { ...props, removeLabel: strings.remove });\n}\n\nexport function ComboboxPopup({ className, ...props }: ComponentProps<typeof Popup>) {\n // The list owns the collection inset so mixed search/status/footer regions stay flush.\n return createElement(Popup, { ...props, className: cn(popoverRecipes.surface, surfaceInsetClasses.flush, className) });\n}\nexport function ComboboxInput({ className, ...props }: ComponentProps<typeof Input>) {\n return createElement(Input, { ...props, className: cn('rounded-inner', className) });\n}\nexport function ComboboxTrigger({ className, ...props }: ComponentProps<typeof Trigger>) {\n return createElement(Trigger, { ...props, className: cn('rounded-inner', className) });\n}\n\nconst densityBySize = { sm: 'compact', md: 'default', lg: 'comfortable' } as const;\n\nexport function ComboboxItem({ className, size = 'md', density = densityBySize[size], children, ...props }: ComponentProps<typeof Item> & {\n /** Vertical option rhythm. Defaults to the owning control size's rhythm. */\n density?: CollectionDensity;\n}) {\n const { defaultTextSize } = useTypographyConfig();\n const content = typeof children === 'string' || typeof children === 'number' || typeof children === 'bigint' ? createElement(CollectionLabel, { children }) : children;\n return createElement(Item, { ...props, children: content, size, className: cn(collectionRowClasses(density), collectionRecipes.highlighted, collectionRecipes.disabled, textSizes[defaultTextSize ?? 'sm'], className) });\n}\n\n/** Shared collection divider, preserving Base UI separator semantics. */\nexport function ComboboxSeparator({ className, ...props }: ComponentProps<typeof Separator>) {\n return createElement(Separator, { ...props, className: cn(popoverRecipes.separator, className) });\n}\n"],"mappings":"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"}
|