@octaviaflow/core 0.2.0-beta.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/ActionDrawer/ActionDrawer.d.ts.map +1 -1
- package/dist/components/AgentCard/AgentCard.d.ts +25 -0
- package/dist/components/AgentCard/AgentCard.d.ts.map +1 -0
- package/dist/components/AgentCard/index.d.ts +2 -0
- package/dist/components/AgentCard/index.d.ts.map +1 -0
- package/dist/components/AuthCard/AuthCard.d.ts.map +1 -1
- package/dist/components/AuthCard/index.d.ts +1 -1
- package/dist/components/AuthCard/index.d.ts.map +1 -1
- package/dist/components/Avatar/Avatar.d.ts.map +1 -1
- package/dist/components/Badge/Badge.d.ts.map +1 -1
- package/dist/components/Banner/Banner.d.ts.map +1 -1
- package/dist/components/BarChart/BarChart.d.ts.map +1 -1
- package/dist/components/BlogCard/BlogCard.d.ts +1 -1
- package/dist/components/BlogCard/BlogCard.d.ts.map +1 -1
- package/dist/components/Breadcrumb/Breadcrumb.d.ts.map +1 -1
- package/dist/components/Button/Button.d.ts.map +1 -1
- package/dist/components/Calendar/Calendar.d.ts.map +1 -1
- package/dist/components/Callout/Callout.d.ts +1 -1
- package/dist/components/Callout/Callout.d.ts.map +1 -1
- package/dist/components/Card/Card.d.ts.map +1 -1
- package/dist/components/ChatBubble/ChatBubble.d.ts.map +1 -1
- package/dist/components/Chip/Chip.d.ts.map +1 -1
- package/dist/components/ChoiceCard/ChoiceCard.d.ts +1 -1
- package/dist/components/ChoiceCard/ChoiceCard.d.ts.map +1 -1
- package/dist/components/CodeEditor/CodeEditor.d.ts +42 -0
- package/dist/components/CodeEditor/CodeEditor.d.ts.map +1 -0
- package/dist/components/CodeEditor/index.d.ts +2 -0
- package/dist/components/CodeEditor/index.d.ts.map +1 -0
- package/dist/components/ColorPicker/ColorPicker.d.ts.map +1 -1
- package/dist/components/ConditionBuilder/ConditionBuilder.d.ts.map +1 -1
- package/dist/components/ConfigPanel/ConfigPanel.d.ts.map +1 -1
- package/dist/components/DataMapper/DataMapper.d.ts +50 -3
- package/dist/components/DataMapper/DataMapper.d.ts.map +1 -1
- package/dist/components/DataTable/DataTable.d.ts +111 -0
- package/dist/components/DataTable/DataTable.d.ts.map +1 -0
- package/dist/components/DataTable/index.d.ts +3 -0
- package/dist/components/DataTable/index.d.ts.map +1 -0
- package/dist/components/DatePicker/DatePicker.d.ts.map +1 -1
- package/dist/components/DescriptionList/index.d.ts +1 -1
- package/dist/components/DescriptionList/index.d.ts.map +1 -1
- package/dist/components/Dialog/Dialog.d.ts.map +1 -1
- package/dist/components/Drawer/Drawer.d.ts.map +1 -1
- package/dist/components/DropdownMenu/DropdownMenu.d.ts.map +1 -1
- package/dist/components/ExecutionConsole/ExecutionConsole.d.ts.map +1 -1
- package/dist/components/FeatureCard/FeatureCard.d.ts +1 -1
- package/dist/components/FeatureCard/FeatureCard.d.ts.map +1 -1
- package/dist/components/FileDropzone/FileDropzone.d.ts +48 -0
- package/dist/components/FileDropzone/FileDropzone.d.ts.map +1 -0
- package/dist/components/FileDropzone/index.d.ts +2 -0
- package/dist/components/FileDropzone/index.d.ts.map +1 -0
- package/dist/components/FlowCanvas/FlowCanvas.d.ts +8 -8
- package/dist/components/FlowCanvas/FlowCanvas.d.ts.map +1 -1
- package/dist/components/FlowCanvas/index.d.ts +1 -1
- package/dist/components/FlowEdge/FlowEdge.d.ts +3 -3
- package/dist/components/FlowEdge/FlowEdge.d.ts.map +1 -1
- package/dist/components/FlowEdge/index.d.ts +1 -1
- package/dist/components/FlowNode/FlowNode.d.ts.map +1 -1
- package/dist/components/FlowNode/index.d.ts +1 -1
- package/dist/components/FlowToolbar/FlowToolbar.d.ts.map +1 -1
- package/dist/components/FlowToolbar/index.d.ts +1 -1
- package/dist/components/FlowToolbar/index.d.ts.map +1 -1
- package/dist/components/HoverCard/HoverCard.d.ts.map +1 -1
- package/dist/components/HoverCard/index.d.ts +1 -1
- package/dist/components/HoverCard/index.d.ts.map +1 -1
- package/dist/components/IconCard/IconCard.d.ts.map +1 -1
- package/dist/components/Input/Input.d.ts +12 -1
- package/dist/components/Input/Input.d.ts.map +1 -1
- package/dist/components/JsonViewer/JsonViewer.d.ts +23 -0
- package/dist/components/JsonViewer/JsonViewer.d.ts.map +1 -0
- package/dist/components/JsonViewer/index.d.ts +2 -0
- package/dist/components/JsonViewer/index.d.ts.map +1 -0
- package/dist/components/KanbanCard/KanbanCard.d.ts +1 -1
- package/dist/components/KanbanCard/KanbanCard.d.ts.map +1 -1
- package/dist/components/Kbd/Kbd.d.ts.map +1 -1
- package/dist/components/Kbd/index.d.ts +1 -1
- package/dist/components/Kbd/index.d.ts.map +1 -1
- package/dist/components/LineChart/LineChart.d.ts.map +1 -1
- package/dist/components/LinkButton/LinkButton.d.ts.map +1 -1
- package/dist/components/MonacoEditor/MonacoDiffEditor.d.ts +32 -0
- package/dist/components/MonacoEditor/MonacoDiffEditor.d.ts.map +1 -0
- package/dist/components/MonacoEditor/MonacoEditor.d.ts +65 -0
- package/dist/components/MonacoEditor/MonacoEditor.d.ts.map +1 -0
- package/dist/components/MonacoEditor/index.d.ts +4 -0
- package/dist/components/MonacoEditor/index.d.ts.map +1 -0
- package/dist/components/MonacoEditor/octaviaflowTheme.d.ts +8 -0
- package/dist/components/MonacoEditor/octaviaflowTheme.d.ts.map +1 -0
- package/dist/components/MultiSelect/MultiSelect.d.ts.map +1 -1
- package/dist/components/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/components/OTPInput/OTPInput.d.ts.map +1 -1
- package/dist/components/PageHeader/PageHeader.d.ts.map +1 -1
- package/dist/components/PageHeader/index.d.ts +1 -1
- package/dist/components/PageHeader/index.d.ts.map +1 -1
- package/dist/components/PasswordInput/PasswordInput.d.ts.map +1 -1
- package/dist/components/PhoneInput/PhoneInput.d.ts.map +1 -1
- package/dist/components/PhoneInput/index.d.ts +1 -1
- package/dist/components/PhoneInput/index.d.ts.map +1 -1
- package/dist/components/Popover/Popover.d.ts.map +1 -1
- package/dist/components/Popover/index.d.ts +1 -1
- package/dist/components/Popover/index.d.ts.map +1 -1
- package/dist/components/PricingCard/PricingCard.d.ts.map +1 -1
- package/dist/components/ProductCard/ProductCard.d.ts +1 -1
- package/dist/components/ProductCard/ProductCard.d.ts.map +1 -1
- package/dist/components/ProgressRing/ProgressRing.d.ts.map +1 -1
- package/dist/components/PromptInput/PromptInput.d.ts +71 -0
- package/dist/components/PromptInput/PromptInput.d.ts.map +1 -0
- package/dist/components/PromptInput/index.d.ts +2 -0
- package/dist/components/PromptInput/index.d.ts.map +1 -0
- package/dist/components/Quote/Quote.d.ts.map +1 -1
- package/dist/components/Radio/Radio.d.ts.map +1 -1
- package/dist/components/RangeSlider/RangeSlider.d.ts +1 -1
- package/dist/components/RangeSlider/RangeSlider.d.ts.map +1 -1
- package/dist/components/Rating/Rating.d.ts.map +1 -1
- package/dist/components/Resizable/Resizable.d.ts +50 -0
- package/dist/components/Resizable/Resizable.d.ts.map +1 -0
- package/dist/components/Resizable/index.d.ts +2 -0
- package/dist/components/Resizable/index.d.ts.map +1 -0
- package/dist/components/Ribbon/Ribbon.d.ts.map +1 -1
- package/dist/components/Select/Select.d.ts.map +1 -1
- package/dist/components/SettingsRow/SettingsRow.d.ts.map +1 -1
- package/dist/components/Sheet/Sheet.d.ts.map +1 -1
- package/dist/components/Sidebar/Sidebar.d.ts.map +1 -1
- package/dist/components/Skeleton/Skeleton.d.ts.map +1 -1
- package/dist/components/SlideoutPanel/SlideoutPanel.d.ts.map +1 -1
- package/dist/components/Slider/Slider.d.ts +1 -1
- package/dist/components/Slider/Slider.d.ts.map +1 -1
- package/dist/components/SocialButton/SocialButton.d.ts.map +1 -1
- package/dist/components/Sortable/Sortable.d.ts +45 -0
- package/dist/components/Sortable/Sortable.d.ts.map +1 -0
- package/dist/components/Sortable/index.d.ts +2 -0
- package/dist/components/Sortable/index.d.ts.map +1 -0
- package/dist/components/Sparkline/Sparkline.d.ts.map +1 -1
- package/dist/components/Stat/Stat.d.ts.map +1 -1
- package/dist/components/Switch/Switch.d.ts.map +1 -1
- package/dist/components/Table/Table.d.ts.map +1 -1
- package/dist/components/TagsInput/TagsInput.d.ts.map +1 -1
- package/dist/components/TestimonialCard/TestimonialCard.d.ts +1 -1
- package/dist/components/TestimonialCard/TestimonialCard.d.ts.map +1 -1
- package/dist/components/Textarea/Textarea.d.ts.map +1 -1
- package/dist/components/TimePicker/TimePicker.d.ts.map +1 -1
- package/dist/components/Timeline/Timeline.d.ts.map +1 -1
- package/dist/components/Timeline/index.d.ts +1 -1
- package/dist/components/Timeline/index.d.ts.map +1 -1
- package/dist/components/TimezonePicker/TimezonePicker.d.ts.map +1 -1
- package/dist/components/TimezonePicker/index.d.ts +1 -1
- package/dist/components/TimezonePicker/index.d.ts.map +1 -1
- package/dist/components/Toast/Toast.d.ts.map +1 -1
- package/dist/components/Toggle/Toggle.d.ts.map +1 -1
- package/dist/components/Toggle/index.d.ts +1 -1
- package/dist/components/Toggle/index.d.ts.map +1 -1
- package/dist/components/ToolCard/ToolCard.d.ts +25 -0
- package/dist/components/ToolCard/ToolCard.d.ts.map +1 -0
- package/dist/components/ToolCard/index.d.ts +2 -0
- package/dist/components/ToolCard/index.d.ts.map +1 -0
- package/dist/components/Toolbar/index.d.ts +1 -1
- package/dist/components/Toolbar/index.d.ts.map +1 -1
- package/dist/components/Tooltip/Tooltip.d.ts.map +1 -1
- package/dist/components/TraceStep/TraceStep.d.ts +30 -0
- package/dist/components/TraceStep/TraceStep.d.ts.map +1 -0
- package/dist/components/TraceStep/index.d.ts +2 -0
- package/dist/components/TraceStep/index.d.ts.map +1 -0
- package/dist/components/UserCard/UserCard.d.ts.map +1 -1
- package/dist/components/WorkflowEditor/WorkflowEditor.d.ts +1 -1
- package/dist/components/WorkflowEditor/WorkflowEditor.d.ts.map +1 -1
- package/dist/components/XmlViewer/XmlViewer.d.ts +22 -0
- package/dist/components/XmlViewer/XmlViewer.d.ts.map +1 -0
- package/dist/components/XmlViewer/index.d.ts +2 -0
- package/dist/components/XmlViewer/index.d.ts.map +1 -0
- package/dist/components/YamlViewer/YamlViewer.d.ts +20 -0
- package/dist/components/YamlViewer/YamlViewer.d.ts.map +1 -0
- package/dist/components/YamlViewer/index.d.ts +2 -0
- package/dist/components/YamlViewer/index.d.ts.map +1 -0
- package/dist/hooks/useWorkflow.d.ts.map +1 -1
- package/dist/index.cjs +12808 -6951
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +44 -30
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12990 -7120
- package/dist/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/utils/sanitizeUrl.d.ts +36 -0
- package/dist/utils/sanitizeUrl.d.ts.map +1 -0
- package/dist/workflow/configStatus.d.ts.map +1 -1
- package/dist/workflow/layout.d.ts.map +1 -1
- package/dist/workflow/types.d.ts.map +1 -1
- package/dist/workflow/validator.d.ts.map +1 -1
- package/package.json +27 -14
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/components/ActionDrawer/ActionDrawer.tsx","../src/utils/cn.ts","../src/components/AuthCard/AuthCard.tsx","../src/components/Avatar/Avatar.tsx","../src/components/Badge/Badge.tsx","../src/components/Banner/Banner.tsx","../src/components/BarChart/BarChart.tsx","../src/components/BlogCard/BlogCard.tsx","../src/components/Breadcrumb/Breadcrumb.tsx","../src/components/Button/Button.tsx","../src/components/Callout/Callout.tsx","../src/components/Calendar/Calendar.tsx","../src/components/Card/Card.tsx","../src/components/Checkbox/Checkbox.tsx","../../../node_modules/react-stately/dist/private/utils/packages/react-stately/src/utils/useControlledState.ts","../../../node_modules/react-stately/dist/private/form/packages/react-stately/src/form/useFormValidationState.ts","../../../node_modules/react-stately/dist/private/collections/packages/react-stately/src/collections/getChildNodes.ts","../../../node_modules/react-stately/dist/private/list/packages/react-stately/src/list/ListCollection.ts","../../../node_modules/react-stately/dist/private/selection/packages/react-stately/src/selection/Selection.ts","../../../node_modules/react-stately/dist/private/selection/packages/react-stately/src/selection/useMultipleSelectionState.ts","../../../node_modules/react-stately/dist/private/selection/packages/react-stately/src/selection/SelectionManager.ts","../../../node_modules/react-stately/dist/private/collections/packages/react-stately/src/collections/CollectionBuilder.ts","../../../node_modules/react-stately/dist/private/collections/packages/react-stately/src/collections/useCollection.ts","../../../node_modules/react-stately/dist/private/list/packages/react-stately/src/list/useListState.ts","../../../node_modules/react-stately/dist/private/overlays/packages/react-stately/src/overlays/useOverlayTriggerState.ts","../../../node_modules/react-stately/dist/private/collections/packages/react-stately/src/collections/Item.ts","../../../node_modules/react-stately/dist/private/list/packages/react-stately/src/list/useSingleSelectListState.ts","../../../node_modules/react-stately/dist/private/menu/packages/react-stately/src/menu/useMenuTriggerState.ts","../../../node_modules/react-stately/dist/private/radio/packages/react-stately/src/radio/useRadioGroupState.ts","../../../node_modules/react-stately/dist/private/select/packages/react-stately/src/select/useSelectState.ts","../../../node_modules/react-stately/dist/private/tabs/packages/react-stately/src/tabs/useTabListState.ts","../../../node_modules/react-stately/dist/private/toggle/packages/react-stately/src/toggle/useToggleState.ts","../../../node_modules/react-stately/dist/private/tooltip/packages/react-stately/src/tooltip/useTooltipTriggerState.ts","../../../node_modules/react-stately/dist/private/tree/packages/react-stately/src/tree/TreeCollection.ts","../../../node_modules/react-stately/dist/private/tree/packages/react-stately/src/tree/useTreeState.ts","../src/components/ChatBubble/ChatBubble.tsx","../src/components/HoverCard/HoverCard.tsx","../src/components/Popover/Popover.tsx","../src/components/Sheet/Sheet.tsx","../src/components/Chip/Chip.tsx","../src/components/ChoiceCard/ChoiceCard.tsx","../src/components/ColorPicker/ColorPicker.tsx","../src/components/ConditionBuilder/ConditionBuilder.tsx","../src/components/ConfigPanel/ConfigPanel.tsx","../src/components/DataMapper/DataMapper.tsx","../src/components/DatePicker/DatePicker.tsx","../src/components/DonutChart/DonutChart.tsx","../src/components/DescriptionList/DescriptionList.tsx","../src/components/Dialog/Dialog.tsx","../src/utils/motion.ts","../src/components/Drawer/Drawer.tsx","../src/components/DropdownMenu/DropdownMenu.tsx","../src/components/EmptyState/EmptyState.tsx","../src/components/ExecutionConsole/ExecutionConsole.tsx","../src/components/FeatureCard/FeatureCard.tsx","../src/components/FlowCanvas/FlowCanvas.tsx","../src/components/FlowNode/FlowNode.tsx","../src/components/FlowEdge/FlowEdge.tsx","../src/components/FlowMinimap/FlowMinimap.tsx","../src/components/FlowToolbar/FlowToolbar.tsx","../src/components/WorkflowEditor/WorkflowEditor.tsx","../src/hooks/useWorkflow.ts","../src/workflow/validator.ts","../src/workflow/types.ts","../src/workflow/layout.ts","../src/workflow/configStatus.ts","../src/components/IconCard/IconCard.tsx","../src/components/Input/Input.tsx","../src/components/Kbd/Kbd.tsx","../src/components/LineChart/LineChart.tsx","../src/components/LinkButton/LinkButton.tsx","../src/components/NumberInput/NumberInput.tsx","../src/components/OTPInput/OTPInput.tsx","../src/components/MultiSelect/MultiSelect.tsx","../src/components/PasswordInput/PasswordInput.tsx","../src/components/PhoneInput/PhoneInput.tsx","../src/components/Quote/Quote.tsx","../src/components/Radio/Radio.tsx","../src/components/Radio/RadioGroup.tsx","../src/components/RangeSlider/RangeSlider.tsx","../src/components/Rating/Rating.tsx","../src/components/Ribbon/Ribbon.tsx","../src/components/Select/Select.tsx","../src/components/Sidebar/Sidebar.tsx","../src/components/Skeleton/Skeleton.tsx","../src/components/SlideoutPanel/SlideoutPanel.tsx","../src/components/Slider/Slider.tsx","../src/components/SocialButton/SocialButton.tsx","../src/components/Sparkline/Sparkline.tsx","../src/components/Spinner/Spinner.tsx","../src/components/Stat/Stat.tsx","../src/components/Switch/Switch.tsx","../src/components/Table/Table.tsx","../src/components/Tabs/Tabs.tsx","../src/components/TagsInput/TagsInput.tsx","../src/components/Textarea/Textarea.tsx","../src/components/Timeline/Timeline.tsx","../src/components/TimePicker/TimePicker.tsx","../src/components/TimezonePicker/TimezonePicker.tsx","../src/components/Toggle/Toggle.tsx","../src/components/Toast/Toast.tsx","../src/components/Tooltip/Tooltip.tsx","../src/components/TopBar/TopBar.tsx","../src/provider/OdsProvider.tsx","../src/components/PageHeader/PageHeader.tsx","../src/components/PricingCard/PricingCard.tsx","../src/components/ProductCard/ProductCard.tsx","../src/components/ProgressRing/ProgressRing.tsx","../src/components/SettingsRow/SettingsRow.tsx","../src/components/TestimonialCard/TestimonialCard.tsx","../src/components/UserCard/UserCard.tsx","../src/components/KanbanCard/KanbanCard.tsx","../src/components/FormSection/FormSection.tsx","../src/components/Toolbar/Toolbar.tsx"],"sourcesContent":["// Provider\n\nexport { ActionDrawer, type ActionDrawerProps } from \"./components/ActionDrawer\";\nexport {\n AuthBadge,\n AuthCard,\n AuthDivider,\n AuthSection,\n AuthTabs,\n type AuthBadgeProps,\n type AuthBadgeTone,\n type AuthCardProps,\n type AuthDividerProps,\n type AuthSectionProps,\n type AuthTab,\n type AuthTabsProps,\n} from \"./components/AuthCard\";\nexport { Avatar, type AvatarProps, AvatarStack, type AvatarStackProps } from \"./components/Avatar\";\nexport { Badge, type BadgeProps } from \"./components/Badge\";\nexport { Banner, type BannerProps } from \"./components/Banner\";\nexport { BarChart, type BarChartProps, type BarDatum } from \"./components/BarChart\";\nexport { BlogCard, type BlogCardProps } from \"./components/BlogCard\";\nexport { Breadcrumb, type BreadcrumbProps } from \"./components/Breadcrumb\";\n// ── Phase 1: Foundation ──\nexport { Button, type ButtonProps } from \"./components/Button\";\nexport { Callout, type CalloutProps } from \"./components/Callout\";\n// ── Phase 2: Layout & Navigation ──\nexport { Calendar, type CalendarProps, type DateRange } from \"./components/Calendar\";\nexport { Card, type CardProps } from \"./components/Card\";\nexport { Checkbox, type CheckboxProps } from \"./components/Checkbox\";\nexport { ChatBubble, type ChatBubbleProps } from \"./components/ChatBubble\";\nexport { HoverCard, type HoverCardProps, type HoverCardPlacement } from \"./components/HoverCard\";\nexport { Popover, type PopoverProps, type PopoverPlacement } from \"./components/Popover\";\nexport { Sheet, type SheetProps, type SheetSide } from \"./components/Sheet\";\nexport { Chip, type ChipProps } from \"./components/Chip\";\nexport { ChoiceCard, type ChoiceCardProps } from \"./components/ChoiceCard\";\nexport { ColorPicker, type ColorPickerProps } from \"./components/ColorPicker\";\nexport { ConditionBuilder, type ConditionBuilderProps } from \"./components/ConditionBuilder\";\nexport { ConfigPanel, type ConfigPanelProps } from \"./components/ConfigPanel\";\nexport { DataMapper, type DataMapperProps } from \"./components/DataMapper\";\nexport { DatePicker, type DatePickerProps } from \"./components/DatePicker\";\nexport { DonutChart, type DonutChartProps, type DonutSegment } from \"./components/DonutChart\";\nexport {\n DescriptionList,\n type DescriptionListItem,\n type DescriptionListProps,\n} from \"./components/DescriptionList\";\nexport { Dialog, type DialogProps } from \"./components/Dialog\";\nexport { Drawer, type DrawerProps } from \"./components/Drawer\";\nexport { DropdownMenu, type DropdownMenuProps } from \"./components/DropdownMenu\";\nexport { EmptyState, type EmptyStateProps } from \"./components/EmptyState\";\nexport { ExecutionConsole, type ExecutionConsoleProps } from \"./components/ExecutionConsole\";\nexport { FeatureCard, type FeatureCardProps } from \"./components/FeatureCard\";\n// ── Phase 4: Workflow ──\nexport { FlowCanvas, type FlowCanvasProps } from \"./components/FlowCanvas\";\nexport { FlowEdge, type FlowEdgeProps } from \"./components/FlowEdge\";\nexport { FlowMinimap, type FlowMinimapProps } from \"./components/FlowMinimap\";\nexport { FlowNode, type FlowNodeProps } from \"./components/FlowNode\";\nexport {\n FlowToolbar,\n FlowToolbarButton,\n FlowToolbarDivider,\n FlowToolbarIcons,\n FlowToolbarZoom,\n type FlowToolbarProps,\n type FlowToolbarButtonProps,\n type FlowToolbarDividerProps,\n type FlowToolbarZoomProps,\n} from \"./components/FlowToolbar\";\nexport { WorkflowEditor, type WorkflowEditorProps } from \"./components/WorkflowEditor\";\nexport { useWorkflow, type UseWorkflowOptions, type UseWorkflowReturn } from \"./hooks/useWorkflow\";\nexport * as Workflow from \"./workflow/types\";\nexport {\n validateWorkflow,\n validateNode,\n validateEdge,\n wouldCreateCycle,\n getNodeValidationStatus,\n getEdgeValidationStatus,\n} from \"./workflow/validator\";\nexport {\n applyLayout,\n applyHorizontalLayout,\n applyVerticalLayout,\n type LayoutOptions as WorkflowLayoutOptions,\n type LayoutResult as WorkflowLayoutResult,\n} from \"./workflow/layout\";\nexport {\n getNodeConfigStatus,\n type FieldSchema,\n type FieldConditional,\n type ConfigStatusResult,\n} from \"./workflow/configStatus\";\nexport { IconCard, type IconCardProps } from \"./components/IconCard\";\nexport { Input, type InputProps } from \"./components/Input\";\nexport { Kbd, KbdGroup, type KbdProps, type KbdGroupProps } from \"./components/Kbd\";\nexport { LineChart, type LineChartProps, type LinePoint } from \"./components/LineChart\";\nexport { LinkButton, type LinkButtonProps } from \"./components/LinkButton\";\nexport { NumberInput, type NumberInputProps } from \"./components/NumberInput\";\nexport { OTPInput, type OTPInputProps } from \"./components/OTPInput\";\nexport {\n MultiSelect,\n type MultiSelectOption,\n type MultiSelectProps,\n} from \"./components/MultiSelect\";\nexport { PasswordInput, type PasswordInputProps } from \"./components/PasswordInput\";\nexport { PhoneInput, type PhoneInputProps, type CountryOption } from \"./components/PhoneInput\";\nexport { Quote, type QuoteProps } from \"./components/Quote\";\nexport { Radio, RadioGroup, type RadioProps } from \"./components/Radio\";\nexport { RangeSlider, type RangeSliderProps } from \"./components/RangeSlider\";\nexport { Rating, type RatingProps } from \"./components/Rating\";\nexport { Ribbon, type RibbonProps } from \"./components/Ribbon\";\nexport { Select, type SelectOption, type SelectProps } from \"./components/Select\";\nexport { Sidebar, type SidebarProps } from \"./components/Sidebar\";\nexport { Skeleton, type SkeletonProps } from \"./components/Skeleton\";\nexport { SlideoutPanel, type SlideoutPanelProps } from \"./components/SlideoutPanel\";\nexport { Slider, type SliderProps } from \"./components/Slider\";\nexport { SocialButton, type SocialButtonProps, type SocialProvider } from \"./components/SocialButton\";\nexport { Sparkline, type SparklineProps } from \"./components/Sparkline\";\nexport { Spinner, type SpinnerProps } from \"./components/Spinner\";\nexport { Stat, type StatProps } from \"./components/Stat\";\nexport { Switch, type SwitchProps } from \"./components/Switch\";\n// ── Phase 3: Data ──\nexport { Table, type TableProps } from \"./components/Table\";\nexport { Tabs, type TabsProps } from \"./components/Tabs\";\nexport { TagsInput, type TagsInputProps } from \"./components/TagsInput\";\nexport { Textarea, type TextareaProps } from \"./components/Textarea\";\nexport {\n Timeline,\n type TimelineItem,\n type TimelineProps,\n type TimelineStatus,\n} from \"./components/Timeline\";\nexport { TimePicker, type TimePickerProps, type TimeValue } from \"./components/TimePicker\";\nexport {\n TimezonePicker,\n type TimezonePickerProps,\n type TimezoneOption,\n} from \"./components/TimezonePicker\";\nexport { Toggle, type ToggleProps, type ToggleOption } from \"./components/Toggle\";\nexport { ToastProvider, useToast } from \"./components/Toast\";\nexport { Tooltip, type TooltipProps } from \"./components/Tooltip\";\nexport { TopBar, type TopBarProps } from \"./components/TopBar\";\nexport { OdsProvider, useOds, useOdsMotion } from \"./provider/OdsProvider\";\nexport {\n PageHeader,\n type PageHeaderBreadcrumb,\n type PageHeaderProps,\n} from \"./components/PageHeader\";\nexport { PricingCard, type PricingCardProps } from \"./components/PricingCard\";\nexport { ProductCard, type ProductCardProps } from \"./components/ProductCard\";\nexport { ProgressRing, type ProgressRingProps } from \"./components/ProgressRing\";\nexport { SettingsRow, type SettingsRowProps } from \"./components/SettingsRow\";\nexport { TestimonialCard, type TestimonialCardProps } from \"./components/TestimonialCard\";\nexport { UserCard, type UserCardProps, type UserCardStat } from \"./components/UserCard\";\nexport { KanbanCard, type KanbanCardProps } from \"./components/KanbanCard\";\nexport { FormSection, type FormSectionProps } from \"./components/FormSection\";\nexport {\n Toolbar,\n ToolbarButton,\n ToolbarDivider,\n ToolbarSpacer,\n type ToolbarButtonProps,\n type ToolbarProps,\n} from \"./components/Toolbar\";\n// Utilities\nexport { cn } from \"./utils/cn\";\nexport { odsMotion } from \"./utils/motion\";\n","\"use client\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport { type ReactNode, useMemo, useRef } from \"react\";\nimport { useTextField } from \"react-aria\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface ActionItem {\n type: string;\n label: string;\n description?: string;\n icon?: ReactNode;\n category: string;\n}\n\nexport interface ActionDrawerProps {\n open?: boolean;\n onToggle?: () => void;\n actions?: ActionItem[];\n searchValue?: string;\n onSearchChange?: (value: string) => void;\n onActionDrag?: (type: string) => void;\n className?: string;\n}\n\nexport function ActionDrawer({\n open = true,\n onToggle,\n actions = [],\n searchValue = \"\",\n onSearchChange,\n onActionDrag,\n className,\n}: ActionDrawerProps) {\n const inputRef = useRef<HTMLInputElement>(null);\n const { inputProps } = useTextField(\n {\n label: \"Search actions\",\n value: searchValue,\n onChange: onSearchChange,\n },\n inputRef,\n );\n\n const filteredActions = useMemo(() => {\n if (!searchValue) return actions;\n const q = searchValue.toLowerCase();\n return actions.filter(\n (a) =>\n a.label.toLowerCase().includes(q) ||\n a.category.toLowerCase().includes(q) ||\n a.description?.toLowerCase().includes(q),\n );\n }, [actions, searchValue]);\n\n const groupedActions = useMemo(() => {\n const groups: Record<string, ActionItem[]> = {};\n for (const action of filteredActions) {\n if (!groups[action.category]) groups[action.category] = [];\n groups[action.category].push(action);\n }\n return groups;\n }, [filteredActions]);\n\n return (\n <AnimatePresence>\n {open && (\n <motion.div\n className={cn('ods-action-drawer', className)}\n initial={{ x: -240, opacity: 0 }}\n animate={{ x: 0, opacity: 1 }}\n exit={{ x: -240, opacity: 0 }}\n transition={{ type: \"spring\", stiffness: 300, damping: 30 }}\n data-testid=\"action-drawer\"\n >\n <div className={'ods-action-drawer__header'}>\n <span className={'ods-action-drawer__title'}>Actions</span>\n <button\n className={'ods-action-drawer__toggle'}\n onClick={onToggle}\n aria-label=\"Close action drawer\"\n data-testid=\"action-drawer-toggle\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M11 3L6 8l5 5\" stroke=\"currentColor\" strokeWidth=\"2\" fill=\"none\" />\n </svg>\n </button>\n </div>\n\n <div className={'ods-action-drawer__search'}>\n <input\n {...inputProps}\n ref={inputRef}\n className={'ods-action-drawer__input'}\n placeholder=\"Search actions...\"\n data-testid=\"action-drawer-search\"\n />\n </div>\n\n <div className={'ods-action-drawer__list'} data-testid=\"action-drawer-list\">\n {Object.entries(groupedActions).map(([category, items]) => (\n <div key={category} className={'ods-action-drawer__group'}>\n <div className={'ods-action-drawer__category'}>{category}</div>\n {items.map((action) => (\n <div\n key={action.type}\n className={'ods-action-drawer__item'}\n draggable\n onDragStart={() => onActionDrag?.(action.type)}\n data-testid={`action-item-${action.type}`}\n role=\"button\"\n tabIndex={0}\n >\n {action.icon && (\n <div className={'ods-action-drawer__item-icon'}>{action.icon}</div>\n )}\n <div className={'ods-action-drawer__item-info'}>\n <div className={'ods-action-drawer__item-label'}>{action.label}</div>\n {action.description && (\n <div className={'ods-action-drawer__item-desc'}>\n {action.description}\n </div>\n )}\n </div>\n </div>\n ))}\n </div>\n ))}\n\n {filteredActions.length === 0 && (\n <div className={'ods-action-drawer__empty'} data-testid=\"action-drawer-empty\">\n No actions found\n </div>\n )}\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n );\n}\n","import { type ClassValue, clsx } from \"clsx\";\n\nexport function cn(...inputs: ClassValue[]): string {\n return clsx(inputs);\n}\n","\"use client\";\nimport { type ReactNode, useState } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface AuthCardProps {\n logo?: ReactNode;\n title: ReactNode;\n description?: ReactNode;\n /** Small badge rendered next to the title (e.g. \"Organization\"). */\n scope?: ReactNode;\n children: ReactNode;\n divider?: ReactNode;\n footer?: ReactNode;\n className?: string;\n}\n\nexport function AuthCard({\n logo,\n title,\n description,\n scope,\n children,\n divider,\n footer,\n className,\n}: AuthCardProps) {\n return (\n <div className={cn(\"ods-auth-card\", className)}>\n {logo && <div className=\"ods-auth-card__logo\">{logo}</div>}\n <div className=\"ods-auth-card__head\">\n <div className=\"ods-auth-card__title-row\">\n <h1 className=\"ods-auth-card__title\">{title}</h1>\n {scope && <span className=\"ods-auth-card__scope\">{scope}</span>}\n </div>\n {description && <p className=\"ods-auth-card__desc\">{description}</p>}\n </div>\n <div className=\"ods-auth-card__body\">{children}</div>\n {divider && <div className=\"ods-auth-card__divider\">{divider}</div>}\n {footer && <div className=\"ods-auth-card__footer\">{footer}</div>}\n </div>\n );\n}\n\nexport interface AuthDividerProps {\n children?: ReactNode;\n className?: string;\n}\n\nexport function AuthDivider({ children = \"OR\", className }: AuthDividerProps) {\n return (\n <div className={cn(\"ods-auth-divider\", className)}>\n <span className=\"ods-auth-divider__line\" />\n <span className=\"ods-auth-divider__label\">{children}</span>\n <span className=\"ods-auth-divider__line\" />\n </div>\n );\n}\n\n// ─────────────────────────────────────────────\n// AuthSection — labelled group within the body\n// ─────────────────────────────────────────────\nexport interface AuthSectionProps {\n label?: ReactNode;\n description?: ReactNode;\n children: ReactNode;\n className?: string;\n}\n\nexport function AuthSection({ label, description, children, className }: AuthSectionProps) {\n return (\n <div className={cn(\"ods-auth-section\", className)}>\n {(label || description) && (\n <div className=\"ods-auth-section__head\">\n {label && <div className=\"ods-auth-section__label\">{label}</div>}\n {description && <div className=\"ods-auth-section__desc\">{description}</div>}\n </div>\n )}\n <div className=\"ods-auth-section__body\">{children}</div>\n </div>\n );\n}\n\n// ─────────────────────────────────────────────\n// AuthTabs — scope switcher (org / personal / developer)\n// ─────────────────────────────────────────────\nexport interface AuthTab {\n id: string;\n label: ReactNode;\n icon?: ReactNode;\n description?: ReactNode;\n content: ReactNode;\n}\n\nexport interface AuthTabsProps {\n tabs: AuthTab[];\n defaultTab?: string;\n value?: string;\n onChange?: (id: string) => void;\n className?: string;\n}\n\nexport function AuthTabs({ tabs, defaultTab, value, onChange, className }: AuthTabsProps) {\n const [internal, setInternal] = useState<string>(defaultTab ?? tabs[0]?.id ?? \"\");\n const active = value ?? internal;\n const select = (id: string) => {\n if (value === undefined) setInternal(id);\n onChange?.(id);\n };\n const activeTab = tabs.find((t) => t.id === active) ?? tabs[0];\n\n return (\n <div className={cn(\"ods-auth-tabs\", className)}>\n <div className=\"ods-auth-tabs__list\" role=\"tablist\">\n {tabs.map((t) => (\n <button\n key={t.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={t.id === active}\n className={cn(\n \"ods-auth-tabs__tab\",\n t.id === active && \"ods-auth-tabs__tab--active\",\n )}\n onClick={() => select(t.id)}\n >\n {t.icon && <span className=\"ods-auth-tabs__icon\">{t.icon}</span>}\n <span className=\"ods-auth-tabs__label\">{t.label}</span>\n {t.description && (\n <span className=\"ods-auth-tabs__desc\">{t.description}</span>\n )}\n </button>\n ))}\n </div>\n {activeTab && <div className=\"ods-auth-tabs__panel\">{activeTab.content}</div>}\n </div>\n );\n}\n\n// ─────────────────────────────────────────────\n// AuthBadge — scope pill for the card head\n// ─────────────────────────────────────────────\nexport type AuthBadgeTone = \"neutral\" | \"org\" | \"personal\" | \"developer\";\n\nexport interface AuthBadgeProps {\n tone?: AuthBadgeTone;\n children: ReactNode;\n className?: string;\n}\n\nexport function AuthBadge({ tone = \"neutral\", children, className }: AuthBadgeProps) {\n return (\n <span className={cn(\"ods-auth-badge\", `ods-auth-badge--${tone}`, className)}>\n {children}\n </span>\n );\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface AvatarProps {\n src?: string;\n alt?: string;\n initials?: string;\n /** Seed for deterministic color. Falls back to initials/alt. */\n seed?: string;\n size?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n status?: \"online\" | \"offline\" | \"busy\" | \"away\";\n className?: string;\n}\n\n// 12 accessible gradient pairs — stable across reloads via seeded hash + localStorage.\nconst GRADIENTS: Array<[string, string]> = [\n [\"#6366f1\", \"#8b5cf6\"],\n [\"#ec4899\", \"#f43f5e\"],\n [\"#06b6d4\", \"#3b82f6\"],\n [\"#10b981\", \"#059669\"],\n [\"#f59e0b\", \"#f97316\"],\n [\"#8b5cf6\", \"#d946ef\"],\n [\"#14b8a6\", \"#06b6d4\"],\n [\"#f43f5e\", \"#ec4899\"],\n [\"#3b82f6\", \"#6366f1\"],\n [\"#0ea5e9\", \"#14b8a6\"],\n [\"#a855f7\", \"#7c3aed\"],\n [\"#ef4444\", \"#f59e0b\"],\n];\n\nconst STORAGE_KEY = \"ods:avatar-colors\";\n\nfunction djb2(str: string): number {\n let h = 5381;\n for (let i = 0; i < str.length; i++) h = ((h << 5) + h) + str.charCodeAt(i);\n return h >>> 0;\n}\n\nfunction loadCache(): Record<string, number> {\n if (typeof window === \"undefined\") return {};\n try {\n const raw = window.localStorage.getItem(STORAGE_KEY);\n return raw ? JSON.parse(raw) : {};\n } catch {\n return {};\n }\n}\n\nfunction saveCache(cache: Record<string, number>) {\n if (typeof window === \"undefined\") return;\n try { window.localStorage.setItem(STORAGE_KEY, JSON.stringify(cache)); } catch { /* noop */ }\n}\n\nfunction gradientFor(seed: string): [string, string] {\n const cache = loadCache();\n let idx = cache[seed];\n if (idx === undefined) {\n idx = djb2(seed) % GRADIENTS.length;\n cache[seed] = idx;\n saveCache(cache);\n }\n return GRADIENTS[idx];\n}\n\nexport function Avatar({\n src,\n alt = \"\",\n initials,\n seed,\n size = \"md\",\n status,\n className,\n}: AvatarProps) {\n const resolvedSeed = seed ?? initials ?? alt ?? \"?\";\n const [a, b] = !src ? gradientFor(resolvedSeed) : [\"\", \"\"];\n const bgStyle = !src\n ? { background: `linear-gradient(135deg, ${a} 0%, ${b} 100%)`, color: \"#ffffff\" }\n : undefined;\n\n return (\n <div\n className={cn(\"ods-avatar\", `ods-avatar--${size}`, className)}\n role=\"img\"\n aria-label={alt || initials || \"avatar\"}\n >\n <span className=\"ods-avatar__inner\">\n {src ? (\n <img src={src} alt={alt} className=\"ods-avatar__image\" />\n ) : (\n <span className=\"ods-avatar__initials\" style={bgStyle}>\n {initials || \"?\"}\n </span>\n )}\n </span>\n {status && (\n <span\n className={cn(\"ods-avatar__status\", `ods-avatar__status--${status}`)}\n aria-label={status}\n />\n )}\n </div>\n );\n}\n\nexport interface AvatarStackProps {\n children: ReactNode;\n className?: string;\n /** Max avatars to show; rest collapse into \"+N\". */\n max?: number;\n}\n\nexport function AvatarStack({ children, className, max }: AvatarStackProps) {\n const arr = Array.isArray(children) ? children : [children];\n const items = max && arr.length > max ? arr.slice(0, max) : arr;\n const overflow = max && arr.length > max ? arr.length - max : 0;\n return (\n <div className={cn(\"ods-avatar-stack\", className)}>\n {items}\n {overflow > 0 && (\n <div className=\"ods-avatar ods-avatar--md ods-avatar-stack__overflow\" role=\"img\" aria-label={`+${overflow} more`}>\n <span className=\"ods-avatar__inner\">\n <span className=\"ods-avatar__initials\">+{overflow}</span>\n </span>\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface BadgeProps {\n variant?: \"success\" | \"warning\" | \"error\" | \"info\" | \"neutral\";\n size?: \"sm\" | \"md\";\n dot?: boolean;\n closeable?: boolean;\n onClose?: () => void;\n outlined?: boolean;\n children: ReactNode;\n className?: string;\n}\n\nexport function Badge({\n variant = \"neutral\",\n size = \"md\",\n dot = false,\n closeable = false,\n onClose,\n outlined = false,\n children,\n className,\n}: BadgeProps) {\n return (\n <span\n className={cn(\n 'ods-badge',\n `ods-badge--${variant}`,\n `ods-badge--${size}`,\n outlined && 'ods-badge--outlined',\n className,\n )}\n >\n {dot && <span className={'ods-badge__dot'} aria-hidden=\"true\" />}\n <span className={'ods-badge__text'}>{children}</span>\n {closeable && (\n <button\n type=\"button\"\n className={'ods-badge__close'}\n onClick={onClose}\n aria-label=\"Remove\"\n >\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M4 4L10 10M10 4L4 10\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n )}\n </span>\n );\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface BannerProps {\n variant?: \"info\" | \"success\" | \"warning\" | \"error\" | \"promo\";\n icon?: ReactNode;\n title?: ReactNode;\n description?: ReactNode;\n action?: ReactNode;\n dismissible?: boolean;\n onDismiss?: () => void;\n children?: ReactNode;\n className?: string;\n}\n\nexport function Banner({\n variant = \"info\",\n icon,\n title,\n description,\n action,\n dismissible = false,\n onDismiss,\n children,\n className,\n}: BannerProps) {\n return (\n <div\n role=\"status\"\n className={cn(\"ods-banner\", `ods-banner--${variant}`, className)}\n >\n {icon && <span className=\"ods-banner__icon\" aria-hidden=\"true\">{icon}</span>}\n <div className=\"ods-banner__body\">\n {title && <div className=\"ods-banner__title\">{title}</div>}\n {description && <div className=\"ods-banner__description\">{description}</div>}\n {children}\n </div>\n {action && <div className=\"ods-banner__action\">{action}</div>}\n {dismissible && (\n <button\n type=\"button\"\n className=\"ods-banner__dismiss\"\n onClick={onDismiss}\n aria-label=\"Dismiss\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M4 4L12 12M12 4L4 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n )}\n </div>\n );\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface BarDatum {\n label: ReactNode;\n value: number;\n highlighted?: boolean;\n}\n\nexport interface BarChartProps {\n data: BarDatum[];\n height?: number;\n color?: string;\n highlightColor?: string;\n title?: ReactNode;\n total?: ReactNode;\n className?: string;\n}\n\nexport function BarChart({\n data,\n height = 120,\n color = \"#c4b5fe\",\n highlightColor,\n title,\n total,\n className,\n}: BarChartProps) {\n const max = Math.max(1, ...data.map((d) => d.value));\n const hiColor = highlightColor ?? \"linear-gradient(180deg, #8b5cf6 0%, #5b4bd1 100%)\";\n\n return (\n <div className={cn(\"ods-bar-chart\", className)}>\n {(title || total) && (\n <div className=\"ods-bar-chart__head\">\n {title && <div className=\"ods-bar-chart__title\">{title}</div>}\n {total && <div className=\"ods-bar-chart__total\">{total}</div>}\n </div>\n )}\n <div className=\"ods-bar-chart__bars\" style={{ height }}>\n {data.map((d, i) => {\n const h = (d.value / max) * (height - 8);\n return (\n <div key={i} className={cn(\"ods-bar-chart__col\", d.highlighted && \"ods-bar-chart__col--hi\")}>\n <div\n className=\"ods-bar-chart__bar\"\n style={{\n height: Math.max(4, h),\n background: d.highlighted ? hiColor : color,\n }}\n aria-label={`${d.label}: ${d.value}`}\n />\n </div>\n );\n })}\n </div>\n <div className=\"ods-bar-chart__labels\">\n {data.map((d, i) => (\n <span key={i} className={cn(\"ods-bar-chart__label\", d.highlighted && \"ods-bar-chart__label--hi\")}>\n {d.label}\n </span>\n ))}\n </div>\n </div>\n );\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface BlogCardProps {\n cover?: ReactNode;\n category?: ReactNode;\n meta?: ReactNode;\n title: ReactNode;\n description?: ReactNode;\n href?: string;\n onClick?: () => void;\n className?: string;\n}\n\nexport function BlogCard({ cover, category, meta, title, description, href, onClick, className }: BlogCardProps) {\n const interactive = Boolean(href || onClick);\n const Comp = href ? \"a\" : \"div\";\n return (\n <Comp\n href={href}\n onClick={onClick as any}\n className={cn(\"ods-blog-card\", interactive && \"ods-blog-card--interactive\", className)}\n >\n <div className=\"ods-blog-card__cover\">{cover}</div>\n <div className=\"ods-blog-card__body\">\n <div className=\"ods-blog-card__meta\">\n {category && <span className=\"ods-blog-card__category\">{category}</span>}\n {meta && <span className=\"ods-blog-card__date\">{meta}</span>}\n </div>\n <div className=\"ods-blog-card__title\">{title}</div>\n {description && <div className=\"ods-blog-card__desc\">{description}</div>}\n </div>\n </Comp>\n );\n}\n","\"use client\";\nimport { type ReactNode, useRef } from \"react\";\nimport { useBreadcrumbItem, useBreadcrumbs } from \"react-aria\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface BreadcrumbItemData {\n label: string;\n href?: string;\n icon?: ReactNode;\n}\n\nexport interface BreadcrumbProps {\n items: BreadcrumbItemData[];\n separator?: ReactNode;\n className?: string;\n}\n\nfunction BreadcrumbItem({ item, isCurrent }: { item: BreadcrumbItemData; isCurrent: boolean }) {\n const ref = useRef<HTMLElement>(null);\n const { itemProps } = useBreadcrumbItem(\n { children: item.label, isCurrent, elementType: item.href ? \"a\" : \"span\" },\n ref,\n );\n\n const content = (\n <>\n {item.icon && <span className={'ods-breadcrumb__icon'}>{item.icon}</span>}\n <span>{item.label}</span>\n </>\n );\n\n if (item.href && !isCurrent) {\n return (\n <a\n {...itemProps}\n ref={ref as any}\n href={item.href}\n className={cn(\n 'ods-breadcrumb__link',\n isCurrent && 'ods-breadcrumb__link--current',\n )}\n >\n {content}\n </a>\n );\n }\n\n return (\n <span\n {...itemProps}\n ref={ref as any}\n className={cn(\n 'ods-breadcrumb__link',\n isCurrent && 'ods-breadcrumb__link--current',\n )}\n >\n {content}\n </span>\n );\n}\n\nexport function Breadcrumb({\n items,\n separator = (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path\n fillRule=\"evenodd\"\n d=\"M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z\"\n clipRule=\"evenodd\"\n />\n </svg>\n ),\n className,\n}: BreadcrumbProps) {\n const { navProps } = useBreadcrumbs({});\n\n return (\n <nav {...navProps} className={cn('ods-breadcrumb', className)}>\n <ol className={'ods-breadcrumb__list'}>\n {items.map((item, idx) => {\n const isCurrent = idx === items.length - 1;\n return (\n <li key={idx} className={'ods-breadcrumb__item'}>\n {idx > 0 && (\n <span className={'ods-breadcrumb__separator'} aria-hidden=\"true\">\n {separator}\n </span>\n )}\n <BreadcrumbItem item={item} isCurrent={isCurrent} />\n </li>\n );\n })}\n </ol>\n </nav>\n );\n}\n","\"use client\";\nimport { motion } from \"framer-motion\";\nimport { type ButtonHTMLAttributes, type ReactNode, useRef } from \"react\";\nimport { useButton } from \"react-aria\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface ButtonProps\n extends Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n \"onDrag\" | \"onDragStart\" | \"onDragEnd\" | \"onAnimationStart\"\n > {\n variant?: \"primary\" | \"secondary\" | \"ghost\" | \"danger\" | \"icon\";\n size?: \"sm\" | \"md\" | \"lg\";\n loading?: boolean;\n leftIcon?: ReactNode;\n rightIcon?: ReactNode;\n fullWidth?: boolean;\n children?: ReactNode;\n}\n\nexport function Button({\n variant = \"primary\",\n size = \"md\",\n loading = false,\n disabled = false,\n leftIcon,\n rightIcon,\n fullWidth = false,\n className,\n children,\n ...props\n}: ButtonProps) {\n const ref = useRef<HTMLButtonElement>(null);\n const isDisabled = disabled || loading;\n\n const { buttonProps } = useButton(\n { isDisabled, onPress: props.onClick as any },\n ref,\n );\n\n // Strip Framer-conflicting props from React Aria output\n const { onDrag, onDragStart, onDragEnd, onAnimationStart, ...safeButtonProps } =\n buttonProps as any;\n\n return (\n <motion.button\n {...safeButtonProps}\n ref={ref}\n className={cn(\n \"ods-btn\",\n `ods-btn--${variant}`,\n `ods-btn--${size}`,\n loading && \"ods-btn--loading\",\n fullWidth && \"ods-btn--full\",\n className,\n )}\n data-loading={loading || undefined}\n whileTap={isDisabled ? undefined : { scale: 0.97 }}\n transition={{ duration: 0.1 }}\n >\n {/* Content layer — hidden behind spinner when loading */}\n <span className=\"ods-btn__content\" aria-hidden={loading}>\n {leftIcon && <span className=\"ods-btn__icon ods-btn__icon--left\">{leftIcon}</span>}\n {children && <span className=\"ods-btn__label\">{children}</span>}\n {rightIcon && <span className=\"ods-btn__icon ods-btn__icon--right\">{rightIcon}</span>}\n </span>\n {/* Spinner overlay — absolutely positioned, replaces content when loading */}\n {loading && (\n <span className=\"ods-btn__spinner\" role=\"status\" aria-label=\"Loading\">\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeDasharray=\"32\"\n strokeDashoffset=\"12\"\n />\n </svg>\n </span>\n )}\n </motion.button>\n );\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface CalloutProps {\n variant?: \"tip\" | \"info\" | \"warning\" | \"danger\" | \"success\";\n title?: ReactNode;\n icon?: ReactNode;\n children: ReactNode;\n className?: string;\n}\n\nexport function Callout({\n variant = \"tip\",\n title,\n icon,\n children,\n className,\n}: CalloutProps) {\n return (\n <div className={cn(\"ods-callout\", `ods-callout--${variant}`, className)}>\n {icon && <span className=\"ods-callout__icon\" aria-hidden=\"true\">{icon}</span>}\n <div className=\"ods-callout__body\">\n {title && <div className=\"ods-callout__title\">{title}</div>}\n <div className=\"ods-callout__content\">{children}</div>\n </div>\n </div>\n );\n}\n","\"use client\";\nimport { useMemo, useState } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport type DateRange = { start: Date | null; end: Date | null };\n\nexport interface CalendarProps {\n mode?: \"single\" | \"range\";\n value?: Date | DateRange | null;\n onChange?: (value: Date | DateRange | null) => void;\n month?: Date; // controlled visible month (1st of month)\n onMonthChange?: (month: Date) => void;\n minDate?: Date;\n maxDate?: Date;\n weekStartsOn?: 0 | 1; // 0 = Sun, 1 = Mon\n className?: string;\n}\n\nconst MONTHS = [\n \"January\", \"February\", \"March\", \"April\", \"May\", \"June\",\n \"July\", \"August\", \"September\", \"October\", \"November\", \"December\",\n];\n\nconst sameDay = (a: Date | null, b: Date | null) =>\n !!a && !!b && a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();\n\nconst startOfMonth = (d: Date) => new Date(d.getFullYear(), d.getMonth(), 1);\nconst addMonths = (d: Date, n: number) => new Date(d.getFullYear(), d.getMonth() + n, 1);\nconst isBefore = (a: Date, b: Date) => a.getTime() < b.getTime();\n\nexport function Calendar({\n mode = \"single\",\n value = null,\n onChange,\n month,\n onMonthChange,\n minDate,\n maxDate,\n weekStartsOn = 0,\n className,\n}: CalendarProps) {\n const [internalMonth, setInternalMonth] = useState(() => startOfMonth(month ?? new Date()));\n const visibleMonth = month ?? internalMonth;\n const setMonth = (d: Date) => {\n onMonthChange ? onMonthChange(d) : setInternalMonth(d);\n };\n\n const today = new Date();\n const single = mode === \"single\" ? (value as Date | null) : null;\n const range = mode === \"range\" ? (value as DateRange | null) ?? { start: null, end: null } : { start: null, end: null };\n\n const dayNames = useMemo(() => {\n const all = [\"S\", \"M\", \"T\", \"W\", \"T\", \"F\", \"S\"];\n return weekStartsOn === 1 ? [...all.slice(1), all[0]] : all;\n }, [weekStartsOn]);\n\n // Build 6×7 grid for the visible month\n const cells = useMemo(() => {\n const first = startOfMonth(visibleMonth);\n const startWeekday = first.getDay();\n const offset = (startWeekday - weekStartsOn + 7) % 7;\n const start = new Date(first);\n start.setDate(start.getDate() - offset);\n const out: { date: Date; outside: boolean }[] = [];\n for (let i = 0; i < 42; i++) {\n const d = new Date(start);\n d.setDate(start.getDate() + i);\n out.push({ date: d, outside: d.getMonth() !== visibleMonth.getMonth() });\n }\n return out;\n }, [visibleMonth, weekStartsOn]);\n\n const isDisabled = (d: Date) =>\n (minDate && isBefore(d, new Date(minDate.getFullYear(), minDate.getMonth(), minDate.getDate()))) ||\n (maxDate && isBefore(new Date(maxDate.getFullYear(), maxDate.getMonth(), maxDate.getDate()), d));\n\n const inRange = (d: Date) =>\n range.start && range.end && d >= range.start && d <= range.end;\n\n const handleSelect = (d: Date) => {\n if (isDisabled(d)) return;\n if (mode === \"single\") {\n onChange?.(d);\n return;\n }\n if (!range.start || (range.start && range.end)) {\n onChange?.({ start: d, end: null });\n } else if (isBefore(d, range.start)) {\n onChange?.({ start: d, end: range.start });\n } else {\n onChange?.({ start: range.start, end: d });\n }\n };\n\n return (\n <div className={cn(\"ods-calendar\", className)}>\n <div className=\"ods-calendar__head\">\n <button\n type=\"button\"\n className=\"ods-calendar__nav\"\n onClick={() => setMonth(addMonths(visibleMonth, -1))}\n aria-label=\"Previous month\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M9 3 5 7l4 4\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n <div className=\"ods-calendar__title\" aria-live=\"polite\">\n {MONTHS[visibleMonth.getMonth()]} {visibleMonth.getFullYear()}\n </div>\n <button\n type=\"button\"\n className=\"ods-calendar__nav\"\n onClick={() => setMonth(addMonths(visibleMonth, 1))}\n aria-label=\"Next month\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M5 3l4 4-4 4\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n </div>\n <div className=\"ods-calendar__dow\">\n {dayNames.map((n, i) => (\n <span key={i} className=\"ods-calendar__dow-cell\">{n}</span>\n ))}\n </div>\n <div className=\"ods-calendar__grid\" role=\"grid\">\n {cells.map(({ date, outside }, i) => {\n const isToday = sameDay(date, today);\n const isSelected = mode === \"single\"\n ? sameDay(date, single)\n : sameDay(date, range.start) || sameDay(date, range.end);\n const isStart = sameDay(date, range.start);\n const isEnd = sameDay(date, range.end);\n const inside = inRange(date);\n const disabled = !!isDisabled(date);\n return (\n <button\n key={i}\n type=\"button\"\n role=\"gridcell\"\n disabled={disabled}\n onClick={() => handleSelect(date)}\n className={cn(\n \"ods-calendar__cell\",\n outside && \"ods-calendar__cell--outside\",\n isToday && \"ods-calendar__cell--today\",\n isSelected && \"ods-calendar__cell--selected\",\n inside && !isSelected && \"ods-calendar__cell--inrange\",\n isStart && \"ods-calendar__cell--start\",\n isEnd && \"ods-calendar__cell--end\",\n disabled && \"ods-calendar__cell--disabled\",\n )}\n aria-selected={isSelected}\n aria-current={isToday ? \"date\" : undefined}\n >\n {date.getDate()}\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n","\"use client\";\nimport { motion } from \"framer-motion\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface CardProps\n extends Omit<\n HTMLAttributes<HTMLDivElement>,\n \"onDrag\" | \"onDragStart\" | \"onDragEnd\" | \"onAnimationStart\"\n > {\n variant?: \"default\" | \"glass\" | \"elevated\" | \"selected\" | \"outlined\";\n padding?: \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n radius?: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\";\n hoverable?: boolean;\n children: ReactNode;\n className?: string;\n}\n\nexport function Card({\n variant = \"default\",\n padding = \"md\",\n radius = \"xl\",\n hoverable = false,\n onClick,\n children,\n className,\n ...props\n}: CardProps) {\n const { onDrag, onDragStart, onDragEnd, onAnimationStart, ...safeProps } = props as any;\n const isInteractive = Boolean(onClick);\n\n return (\n <motion.div\n {...safeProps}\n onClick={onClick}\n className={cn(\n \"ods-card\",\n `ods-card--${variant}`,\n `ods-card--pad-${padding}`,\n `ods-card--radius-${radius}`,\n (hoverable || isInteractive) && \"ods-card--hoverable\",\n isInteractive && \"ods-card--clickable\",\n className,\n )}\n whileHover={\n hoverable || isInteractive\n ? { y: -2, transition: { duration: 0.15 } }\n : undefined\n }\n whileTap={isInteractive ? { scale: 0.99 } : undefined}\n role={isInteractive ? \"button\" : undefined}\n tabIndex={isInteractive ? 0 : undefined}\n >\n {children}\n </motion.div>\n );\n}\n","\"use client\";\nimport { type InputHTMLAttributes, type ReactNode, useRef } from \"react\";\nimport { useCheckbox } from \"react-aria\";\nimport { useToggleState } from \"react-stately\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface CheckboxProps\n extends Omit<InputHTMLAttributes<HTMLInputElement>, \"onChange\" | \"size\"> {\n checked?: boolean;\n defaultChecked?: boolean;\n onChange?: (isSelected: boolean) => void;\n indeterminate?: boolean;\n disabled?: boolean;\n label?: string | ReactNode;\n size?: \"sm\" | \"md\";\n className?: string;\n}\n\nexport function Checkbox({\n checked,\n defaultChecked,\n onChange,\n indeterminate = false,\n disabled = false,\n label,\n size = \"md\",\n className,\n ...props\n}: CheckboxProps) {\n const ref = useRef<HTMLInputElement>(null);\n\n const state = useToggleState({\n isSelected: checked,\n defaultSelected: defaultChecked,\n onChange,\n });\n\n const { inputProps } = useCheckbox(\n {\n isSelected: state.isSelected,\n isIndeterminate: indeterminate,\n isDisabled: disabled,\n onChange,\n \"aria-label\": typeof label === \"string\" ? label : undefined,\n },\n state,\n ref,\n );\n\n const isChecked = state.isSelected;\n\n return (\n <label\n className={cn(\n 'ods-checkbox',\n `ods-checkbox--${size}`,\n disabled && 'ods-checkbox--disabled',\n className,\n )}\n >\n <input {...inputProps} ref={ref} className={'ods-checkbox__input'} />\n <div\n className={cn(\n 'ods-checkbox__box',\n isChecked && !indeterminate && 'ods-checkbox__box--checked',\n indeterminate && 'ods-checkbox__box--indeterminate',\n )}\n aria-hidden=\"true\"\n >\n {indeterminate ? (\n <svg\n className={'ods-checkbox__dash'}\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <line\n x1=\"2\"\n y1=\"6\"\n x2=\"10\"\n y2=\"6\"\n stroke=\"white\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n ) : (\n <svg\n className={cn(\n 'ods-checkbox__checkmark',\n isChecked && 'ods-checkbox__checkmark--checked',\n )}\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M2 6L5 9L10 3\"\n stroke=\"white\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </div>\n {label && <span className={'ods-checkbox__label'}>{label}</span>}\n </label>\n );\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport React, {SetStateAction, useCallback, useEffect, useReducer, useRef, useState} from 'react';\n\n// Use the earliest effect possible to reset the ref below.\nconst useEarlyEffect: typeof React.useLayoutEffect = typeof document !== 'undefined'\n ? React['useInsertionEffect'] ?? React.useLayoutEffect\n : () => {};\n\nexport function useControlledState<T, C = T>(value: Exclude<T, undefined>, defaultValue: Exclude<T, undefined> | undefined, onChange?: (v: C, ...args: any[]) => void): [T, (value: SetStateAction<T>, ...args: any[]) => void];\nexport function useControlledState<T, C = T>(value: Exclude<T, undefined> | undefined, defaultValue: Exclude<T, undefined>, onChange?: (v: C, ...args: any[]) => void): [T, (value: SetStateAction<T>, ...args: any[]) => void];\nexport function useControlledState<T, C = T>(value: T, defaultValue: T, onChange?: (v: C, ...args: any[]) => void): [T, (value: SetStateAction<T>, ...args: any[]) => void] {\n // Store the value in both state and a ref. The state value will only be used when uncontrolled.\n // The ref is used to track the most current value, which is passed to the function setState callback.\n let [stateValue, setStateValue] = useState(value || defaultValue);\n let valueRef = useRef(stateValue);\n\n let isControlledRef = useRef(value !== undefined);\n let isControlled = value !== undefined;\n useEffect(() => {\n let wasControlled = isControlledRef.current;\n if (wasControlled !== isControlled && process.env.NODE_ENV !== 'production') {\n console.warn(`WARN: A component changed from ${wasControlled ? 'controlled' : 'uncontrolled'} to ${isControlled ? 'controlled' : 'uncontrolled'}.`);\n }\n isControlledRef.current = isControlled;\n }, [isControlled]);\n\n // After each render, update the ref to the current value.\n // This ensures that the setState callback argument is reset.\n // Note: the effect should not have any dependencies so that controlled values always reset.\n let currentValue = isControlled ? value : stateValue;\n useEarlyEffect(() => {\n valueRef.current = currentValue;\n });\n\n let [, forceUpdate] = useReducer(() => ({}), {});\n let setValue = useCallback((value: SetStateAction<T>, ...args: any[]) => {\n // @ts-ignore - TS doesn't know that T cannot be a function.\n let newValue = typeof value === 'function' ? value(valueRef.current) : value;\n if (!Object.is(valueRef.current, newValue)) {\n // Update the ref so that the next setState callback has the most recent value.\n valueRef.current = newValue;\n\n setStateValue(newValue);\n\n // Always trigger a re-render, even when controlled, so that the layout effect above runs to reset the value.\n forceUpdate();\n\n // Trigger onChange. Note that if setState is called multiple times in a single event,\n // onChange will be called for each one instead of only once.\n onChange?.(newValue, ...args);\n }\n }, [onChange]);\n\n return [currentValue, setValue];\n}\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {Context, createContext, useContext, useEffect, useMemo, useRef, useState} from 'react';\nimport {Validation, ValidationErrors, ValidationFunction, ValidationResult} from '@react-types/shared';\n\nexport const VALID_VALIDITY_STATE: ValidityState = {\n badInput: false,\n customError: false,\n patternMismatch: false,\n rangeOverflow: false,\n rangeUnderflow: false,\n stepMismatch: false,\n tooLong: false,\n tooShort: false,\n typeMismatch: false,\n valueMissing: false,\n valid: true\n};\n\nconst CUSTOM_VALIDITY_STATE: ValidityState = {\n ...VALID_VALIDITY_STATE,\n customError: true,\n valid: false\n};\n\nexport const DEFAULT_VALIDATION_RESULT: ValidationResult = {\n isInvalid: false,\n validationDetails: VALID_VALIDITY_STATE,\n validationErrors: []\n};\n\nexport const FormValidationContext: Context<ValidationErrors> = createContext<ValidationErrors>({});\n\n// Private props that we pass from useFormValidationState to children.\n// Ideally we'd use a Symbol for this, but React doesn't support them: https://github.com/facebook/react/issues/7552\n// This needs to be stable across server and client module evaluation for SSR hydration.\nexport const privateValidationStateProp: string = '__reactAriaFormValidationState';\n\ninterface FormValidationProps<T> extends Validation<T> {\n builtinValidation?: ValidationResult,\n name?: string | string[],\n value: T | null\n}\n\nexport interface FormValidationState {\n /** Realtime validation results, updated as the user edits the value. */\n realtimeValidation: ValidationResult,\n /** Currently displayed validation results, updated when the user commits their changes. */\n displayValidation: ValidationResult,\n /** Updates the current validation result. Not displayed to the user until `commitValidation` is called. */\n updateValidation(result: ValidationResult): void,\n /** Resets the displayed validation state to valid when the user resets the form. */\n resetValidation(): void,\n /** Commits the realtime validation so it is displayed to the user. */\n commitValidation(): void\n}\n\nexport function useFormValidationState<T>(props: FormValidationProps<T>): FormValidationState {\n // Private prop for parent components to pass state to children.\n if (props[privateValidationStateProp]) {\n let {realtimeValidation, displayValidation, updateValidation, resetValidation, commitValidation} = props[privateValidationStateProp] as FormValidationState;\n return {realtimeValidation, displayValidation, updateValidation, resetValidation, commitValidation};\n }\n\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return useFormValidationStateImpl(props);\n}\n\nfunction useFormValidationStateImpl<T>(props: FormValidationProps<T>): FormValidationState {\n let {isInvalid, validationState, name, value, builtinValidation, validate, validationBehavior = 'aria'} = props;\n\n // backward compatibility.\n if (validationState) {\n isInvalid ||= validationState === 'invalid';\n }\n\n // If the isInvalid prop is controlled, update validation result in realtime.\n let controlledError: ValidationResult | null = isInvalid !== undefined ? {\n isInvalid,\n validationErrors: [],\n validationDetails: CUSTOM_VALIDITY_STATE\n } : null;\n\n // Perform custom client side validation.\n let clientError: ValidationResult | null = useMemo(() => {\n if (!validate || value == null) {\n return null;\n }\n let validateErrors = runValidate(validate, value);\n return getValidationResult(validateErrors);\n }, [validate, value]);\n\n if (builtinValidation?.validationDetails.valid) {\n builtinValidation = undefined;\n }\n\n // Get relevant server errors from the form.\n let serverErrors = useContext(FormValidationContext);\n let serverErrorMessages = useMemo(() => {\n if (name) {\n return Array.isArray(name) ? name.flatMap(name => asArray(serverErrors[name])) : asArray(serverErrors[name]);\n }\n return [];\n }, [serverErrors, name]);\n\n // Show server errors when the form gets a new value, and clear when the user changes the value.\n let [lastServerErrors, setLastServerErrors] = useState(serverErrors);\n let [isServerErrorCleared, setServerErrorCleared] = useState(false);\n if (serverErrors !== lastServerErrors) {\n setLastServerErrors(serverErrors);\n setServerErrorCleared(false);\n }\n\n let serverError: ValidationResult | null = useMemo(() =>\n getValidationResult(isServerErrorCleared ? [] : serverErrorMessages),\n [isServerErrorCleared, serverErrorMessages]\n );\n\n // Track the next validation state in a ref until commitValidation is called.\n let nextValidation = useRef(DEFAULT_VALIDATION_RESULT);\n let [currentValidity, setCurrentValidity] = useState(DEFAULT_VALIDATION_RESULT);\n\n let lastError = useRef(DEFAULT_VALIDATION_RESULT);\n let commitValidation = () => {\n if (!commitQueued) {\n return;\n }\n\n setCommitQueued(false);\n let error = clientError || builtinValidation || nextValidation.current;\n if (!isEqualValidation(error, lastError.current)) {\n lastError.current = error;\n setCurrentValidity(error);\n }\n };\n\n let [commitQueued, setCommitQueued] = useState(false);\n useEffect(commitValidation);\n\n // realtimeValidation is used to update the native input element's state based on custom validation logic.\n // displayValidation is the currently displayed validation state that the user sees (e.g. on input change/form submit).\n // With validationBehavior=\"aria\", all errors are displayed in realtime rather than on submit.\n let realtimeValidation = controlledError || serverError || clientError || builtinValidation || DEFAULT_VALIDATION_RESULT;\n let displayValidation = validationBehavior === 'native'\n ? controlledError || serverError || currentValidity\n : controlledError || serverError || clientError || builtinValidation || currentValidity;\n\n return {\n realtimeValidation,\n displayValidation,\n updateValidation(value) {\n // If validationBehavior is 'aria', update in realtime. Otherwise, store in a ref until commit.\n if (validationBehavior === 'aria' && !isEqualValidation(currentValidity, value)) {\n setCurrentValidity(value);\n } else {\n nextValidation.current = value;\n }\n },\n resetValidation() {\n // Update the currently displayed validation state to valid on form reset,\n // even if the native validity says it isn't. It'll show again on the next form submit.\n let error = DEFAULT_VALIDATION_RESULT;\n if (!isEqualValidation(error, lastError.current)) {\n lastError.current = error;\n setCurrentValidity(error);\n }\n\n // Do not commit validation after the next render. This avoids a condition where\n // useSelect calls commitValidation inside an onReset handler.\n if (validationBehavior === 'native') {\n setCommitQueued(false);\n }\n\n setServerErrorCleared(true);\n },\n commitValidation() {\n // Commit validation state so the user sees it on blur/change/submit. Also clear any server errors.\n // Wait until after the next render to commit so that the latest value has been validated.\n if (validationBehavior === 'native') {\n setCommitQueued(true);\n }\n setServerErrorCleared(true);\n }\n };\n}\n\nfunction asArray<T>(v: T | T[]): T[] {\n if (!v) {\n return [];\n }\n\n return Array.isArray(v) ? v : [v];\n}\n\nfunction runValidate<T>(validate: ValidationFunction<T>, value: T): string[] {\n if (typeof validate === 'function') {\n let e = validate(value);\n if (e && typeof e !== 'boolean') {\n return asArray(e);\n }\n }\n\n return [];\n}\n\nfunction getValidationResult(errors: string[]): ValidationResult | null {\n return errors.length ? {\n isInvalid: true,\n validationErrors: errors,\n validationDetails: CUSTOM_VALIDITY_STATE\n } : null;\n}\n\nfunction isEqualValidation(a: ValidationResult | null, b: ValidationResult | null): boolean {\n if (a === b) {\n return true;\n }\n\n return !!a && !!b\n && a.isInvalid === b.isInvalid\n && a.validationErrors.length === b.validationErrors.length\n && a.validationErrors.every((a, i) => a === b.validationErrors[i])\n && Object.entries(a.validationDetails).every(([k, v]) => b.validationDetails[k] === v);\n}\n\nexport function mergeValidation(...results: ValidationResult[]): ValidationResult {\n let errors = new Set<string>();\n let isInvalid = false;\n let validationDetails = {\n ...VALID_VALIDITY_STATE\n };\n\n for (let v of results) {\n for (let e of v.validationErrors) {\n errors.add(e);\n }\n\n // Only these properties apply for checkboxes.\n isInvalid ||= v.isInvalid;\n for (let key in validationDetails) {\n validationDetails[key] ||= v.validationDetails[key];\n }\n }\n\n validationDetails.valid = !isInvalid;\n return {\n isInvalid,\n validationErrors: [...errors],\n validationDetails\n };\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport type {Collection, Node} from '@react-types/shared';\n\nexport function getChildNodes<T>(node: Node<T>, collection: Collection<Node<T>>): Iterable<Node<T>> {\n // New API: call collection.getChildren with the node key.\n if (typeof collection.getChildren === 'function') {\n return collection.getChildren(node.key);\n }\n\n // Old API: access childNodes directly.\n return node.childNodes;\n}\n\nexport function getFirstItem<T>(iterable: Iterable<T>): T | undefined {\n return getNthItem(iterable, 0);\n}\n\nexport function getNthItem<T>(iterable: Iterable<T>, index: number): T | undefined {\n if (index < 0) {\n return undefined;\n }\n\n let i = 0;\n for (let item of iterable) {\n if (i === index) {\n return item;\n }\n\n i++;\n }\n}\n\nexport function getLastItem<T>(iterable: Iterable<T>): T | undefined {\n let lastItem: T | undefined = undefined;\n for (let value of iterable) {\n lastItem = value;\n }\n\n return lastItem;\n}\n\nexport function compareNodeOrder<T>(collection: Collection<Node<T>>, a: Node<T>, b: Node<T>): number {\n // If the two nodes have the same parent, compare their indices.\n if (a.parentKey === b.parentKey) {\n return a.index - b.index;\n }\n\n // Otherwise, collect all of the ancestors from each node, and find the first one that doesn't match starting from the root.\n // Include the base nodes in case we are comparing nodes of different levels so that we can compare the higher node to the lower level node's\n // ancestor of the same level\n let aAncestors = [...getAncestors(collection, a), a];\n let bAncestors = [...getAncestors(collection, b), b];\n let firstNonMatchingAncestor = aAncestors.slice(0, bAncestors.length).findIndex((a, i) => a !== bAncestors[i]);\n if (firstNonMatchingAncestor !== -1) {\n // Compare the indices of two children within the common ancestor.\n a = aAncestors[firstNonMatchingAncestor];\n b = bAncestors[firstNonMatchingAncestor];\n return a.index - b.index;\n }\n\n // If there isn't a non matching ancestor, we might be in a case where one of the nodes is the ancestor of the other.\n if (aAncestors.findIndex(node => node === b) >= 0) {\n return 1;\n } else if (bAncestors.findIndex(node => node === a) >= 0) {\n return -1;\n }\n\n // 🤷\n return -1;\n}\n\nfunction getAncestors<T>(collection: Collection<Node<T>>, node: Node<T>): Node<T>[] {\n let parents: Node<T>[] = [];\n\n let currNode: Node<T> | null = node;\n while (currNode?.parentKey != null) {\n currNode = collection.getItem(currNode.parentKey);\n if (currNode) {\n parents.unshift(currNode);\n }\n }\n\n return parents;\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {Collection, Key, Node} from '@react-types/shared';\n\nexport class ListCollection<T> implements Collection<Node<T>> {\n private keyMap: Map<Key, Node<T>> = new Map();\n private iterable: Iterable<Node<T>>;\n private firstKey: Key | null = null;\n private lastKey: Key | null = null;\n private _size: number;\n\n constructor(nodes: Iterable<Node<T>>) {\n this.iterable = nodes;\n\n let visit = (node: Node<T>) => {\n this.keyMap.set(node.key, node);\n\n if (node.childNodes && node.type === 'section') {\n for (let child of node.childNodes) {\n visit(child);\n }\n }\n };\n\n for (let node of nodes) {\n visit(node);\n }\n\n let last: Node<T> | null = null;\n let index = 0;\n let size = 0;\n for (let [key, node] of this.keyMap) {\n if (last) {\n last.nextKey = key;\n node.prevKey = last.key;\n } else {\n this.firstKey = key;\n node.prevKey = undefined;\n }\n\n if (node.type === 'item') {\n node.index = index++;\n }\n\n // Only count sections and items when determining size so that\n // loaders and separators in RAC/S2 don't influence the emptyState determination\n if (node.type === 'section' || node.type === 'item') {\n size++;\n }\n\n last = node;\n\n // Set nextKey as undefined since this might be the last node\n // If it isn't the last node, last.nextKey will properly set at start of new loop\n last.nextKey = undefined;\n }\n this._size = size;\n this.lastKey = last?.key ?? null;\n }\n\n *[Symbol.iterator](): IterableIterator<Node<T>> {\n yield* this.iterable;\n }\n\n get size(): number {\n return this._size;\n }\n\n getKeys(): IterableIterator<Key> {\n return this.keyMap.keys();\n }\n\n getKeyBefore(key: Key): Key | null {\n let node = this.keyMap.get(key);\n return node ? node.prevKey ?? null : null;\n }\n\n getKeyAfter(key: Key): Key | null {\n let node = this.keyMap.get(key);\n return node ? node.nextKey ?? null : null;\n }\n\n getFirstKey(): Key | null {\n return this.firstKey;\n }\n\n getLastKey(): Key | null {\n return this.lastKey;\n }\n\n getItem(key: Key): Node<T> | null {\n return this.keyMap.get(key) ?? null;\n }\n\n at(idx: number): Node<T> | null {\n const keys = [...this.getKeys()];\n return this.getItem(keys[idx]);\n }\n\n getChildren(key: Key): Iterable<Node<T>> {\n let node = this.keyMap.get(key);\n return node?.childNodes || [];\n }\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {Key} from '@react-types/shared';\n\n/**\n * A Selection is a special Set containing Keys, which also has an anchor\n * and current selected key for use when range selecting.\n */\nexport class Selection extends Set<Key> {\n anchorKey: Key | null;\n currentKey: Key | null;\n\n constructor(keys?: Iterable<Key> | Selection, anchorKey?: Key | null, currentKey?: Key | null) {\n super(keys);\n if (keys instanceof Selection) {\n this.anchorKey = anchorKey ?? keys.anchorKey;\n this.currentKey = currentKey ?? keys.currentKey;\n } else {\n this.anchorKey = anchorKey ?? null;\n this.currentKey = currentKey ?? null;\n }\n }\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {DisabledBehavior, FocusStrategy, Key, MultipleSelection, SelectionBehavior, SelectionMode} from '@react-types/shared';\nimport {MultipleSelectionState} from './types';\nimport {Selection} from './Selection';\nimport {useControlledState} from '../utils/useControlledState';\nimport {useEffect, useMemo, useRef, useState} from 'react';\n\nfunction equalSets(setA, setB) {\n if (setA.size !== setB.size) {\n return false;\n }\n\n for (let item of setA) {\n if (!setB.has(item)) {\n return false;\n }\n }\n\n return true;\n}\n\nexport interface MultipleSelectionStateProps extends MultipleSelection {\n /**\n * How multiple selection should behave in the collection.\n * @default 'toggle'\n */\n selectionBehavior?: SelectionBehavior,\n /** Whether onSelectionChange should fire even if the new set of keys is the same as the last. */\n allowDuplicateSelectionEvents?: boolean,\n /**\n * Whether `disabledKeys` applies to all interactions, or only selection.\n * @default 'all'\n */\n disabledBehavior?: DisabledBehavior\n}\n\n/**\n * Manages state for multiple selection and focus in a collection.\n */\nexport function useMultipleSelectionState(props: MultipleSelectionStateProps): MultipleSelectionState {\n let {\n selectionMode = 'none' as SelectionMode,\n disallowEmptySelection = false,\n allowDuplicateSelectionEvents,\n selectionBehavior: selectionBehaviorProp = 'toggle',\n disabledBehavior = 'all'\n } = props;\n\n // We want synchronous updates to `isFocused` and `focusedKey` after their setters are called.\n // But we also need to trigger a react re-render. So, we have both a ref (sync) and state (async).\n let isFocusedRef = useRef(false);\n let [, setFocused] = useState(false);\n let focusedKeyRef = useRef<Key | null>(null);\n let childFocusStrategyRef = useRef<FocusStrategy | null>(null);\n let [, setFocusedKey] = useState<Key | null>(null);\n let selectedKeysProp = useMemo(() => convertSelection(props.selectedKeys), [props.selectedKeys]);\n let defaultSelectedKeys = useMemo(() => convertSelection(props.defaultSelectedKeys, new Selection()), [props.defaultSelectedKeys]);\n let [selectedKeys, setSelectedKeys] = useControlledState(\n selectedKeysProp,\n defaultSelectedKeys!,\n props.onSelectionChange\n );\n let disabledKeysProp = useMemo(() =>\n props.disabledKeys ? new Set(props.disabledKeys) : new Set<Key>()\n , [props.disabledKeys]);\n let [selectionBehavior, setSelectionBehavior] = useState(selectionBehaviorProp);\n\n // If the selectionBehavior prop is set to replace, but the current state is toggle (e.g. due to long press\n // to enter selection mode on touch), and the selection becomes empty, reset the selection behavior.\n if (selectionBehaviorProp === 'replace' && selectionBehavior === 'toggle' && typeof selectedKeys === 'object' && selectedKeys.size === 0) {\n setSelectionBehavior('replace');\n }\n\n // If the selectionBehavior prop changes, update the state as well.\n let lastSelectionBehavior = useRef(selectionBehaviorProp);\n useEffect(() => {\n if (selectionBehaviorProp !== lastSelectionBehavior.current) {\n setSelectionBehavior(selectionBehaviorProp);\n lastSelectionBehavior.current = selectionBehaviorProp;\n }\n }, [selectionBehaviorProp]);\n\n return {\n selectionMode,\n disallowEmptySelection,\n selectionBehavior,\n setSelectionBehavior,\n get isFocused() {\n return isFocusedRef.current;\n },\n setFocused(f) {\n isFocusedRef.current = f;\n setFocused(f);\n },\n get focusedKey() {\n return focusedKeyRef.current;\n },\n get childFocusStrategy() {\n return childFocusStrategyRef.current;\n },\n setFocusedKey(k, childFocusStrategy = 'first') {\n focusedKeyRef.current = k;\n childFocusStrategyRef.current = childFocusStrategy;\n setFocusedKey(k);\n },\n selectedKeys,\n setSelectedKeys(keys) {\n if (allowDuplicateSelectionEvents || !equalSets(keys, selectedKeys)) {\n setSelectedKeys(keys);\n }\n },\n disabledKeys: disabledKeysProp,\n disabledBehavior\n };\n}\n\nfunction convertSelection(selection: 'all' | Iterable<Key> | null | undefined, defaultValue?: Selection): 'all' | Set<Key> | undefined {\n if (!selection) {\n return defaultValue;\n }\n\n return selection === 'all'\n ? 'all'\n : new Selection(selection);\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {\n Collection, DisabledBehavior,\n FocusStrategy,\n Selection as ISelection,\n Key,\n LayoutDelegate,\n LongPressEvent,\n Node,\n PressEvent,\n SelectionBehavior,\n SelectionMode\n} from '@react-types/shared';\nimport {compareNodeOrder, getChildNodes, getFirstItem} from '../collections/getChildNodes';\nimport {MultipleSelectionManager, MultipleSelectionState} from './types';\nimport {Selection} from './Selection';\n\ninterface SelectionManagerOptions {\n allowsCellSelection?: boolean,\n layoutDelegate?: LayoutDelegate,\n fullCollection?: Collection<Node<unknown>>\n}\n\n/**\n * An interface for reading and updating multiple selection state.\n */\nexport class SelectionManager implements MultipleSelectionManager {\n collection: Collection<Node<unknown>>;\n private state: MultipleSelectionState;\n private allowsCellSelection: boolean;\n private _isSelectAll: boolean | null;\n private layoutDelegate: LayoutDelegate | null;\n private fullCollection: Collection<Node<unknown>> | null;\n\n constructor(collection: Collection<Node<unknown>>, state: MultipleSelectionState, options?: SelectionManagerOptions) {\n this.collection = collection;\n this.state = state;\n this.allowsCellSelection = options?.allowsCellSelection ?? false;\n this._isSelectAll = null;\n this.layoutDelegate = options?.layoutDelegate || null;\n this.fullCollection = options?.fullCollection || null;\n }\n\n /**\n * The type of selection that is allowed in the collection.\n */\n get selectionMode(): SelectionMode {\n return this.state.selectionMode;\n }\n\n /**\n * Whether the collection allows empty selection.\n */\n get disallowEmptySelection(): boolean {\n return this.state.disallowEmptySelection;\n }\n\n /**\n * The selection behavior for the collection.\n */\n get selectionBehavior(): SelectionBehavior {\n return this.state.selectionBehavior;\n }\n\n /**\n * Sets the selection behavior for the collection.\n */\n setSelectionBehavior(selectionBehavior: SelectionBehavior): void {\n this.state.setSelectionBehavior(selectionBehavior);\n }\n\n /**\n * Whether the collection is currently focused.\n */\n get isFocused(): boolean {\n return this.state.isFocused;\n }\n\n /**\n * Sets whether the collection is focused.\n */\n setFocused(isFocused: boolean): void {\n this.state.setFocused(isFocused);\n }\n\n /**\n * The current focused key in the collection.\n */\n get focusedKey(): Key | null {\n return this.state.focusedKey;\n }\n\n /** Whether the first or last child of the focused key should receive focus. */\n get childFocusStrategy(): FocusStrategy | null {\n return this.state.childFocusStrategy;\n }\n\n /**\n * Sets the focused key.\n */\n setFocusedKey(key: Key | null, childFocusStrategy?: FocusStrategy): void {\n if (key == null || this.collection.getItem(key)) {\n this.state.setFocusedKey(key, childFocusStrategy);\n }\n }\n\n /**\n * The currently selected keys in the collection.\n */\n get selectedKeys(): Set<Key> {\n return this.state.selectedKeys === 'all'\n ? new Set(this.getSelectAllKeys())\n : this.state.selectedKeys;\n }\n\n /**\n * The raw selection value for the collection.\n * Either 'all' for select all, or a set of keys.\n */\n get rawSelection(): ISelection {\n return this.state.selectedKeys;\n }\n\n /**\n * Returns whether a key is selected.\n */\n isSelected(key: Key): boolean {\n if (this.state.selectionMode === 'none') {\n return false;\n }\n\n let mappedKey = this.getKey(key);\n if (mappedKey == null) {\n return false;\n }\n return this.state.selectedKeys === 'all'\n ? this.canSelectItem(mappedKey)\n : this.state.selectedKeys.has(mappedKey);\n }\n\n /**\n * Whether the selection is empty.\n */\n get isEmpty(): boolean {\n return this.state.selectedKeys !== 'all' && this.state.selectedKeys.size === 0;\n }\n\n /**\n * Whether all items in the collection are selected.\n */\n get isSelectAll(): boolean {\n if (this.isEmpty) {\n return false;\n }\n\n if (this.state.selectedKeys === 'all') {\n return true;\n }\n\n if (this._isSelectAll != null) {\n return this._isSelectAll;\n }\n\n let allKeys = this.getSelectAllKeys();\n let selectedKeys = this.state.selectedKeys;\n this._isSelectAll = allKeys.every(k => selectedKeys.has(k));\n return this._isSelectAll;\n }\n\n get firstSelectedKey(): Key | null {\n let first: Node<unknown> | null = null;\n for (let key of this.state.selectedKeys) {\n let item = this.collection.getItem(key);\n if (!first || (item && compareNodeOrder(this.collection, item, first) < 0)) {\n first = item;\n }\n }\n\n return first?.key ?? null;\n }\n\n get lastSelectedKey(): Key | null {\n let last: Node<unknown> | null = null;\n for (let key of this.state.selectedKeys) {\n let item = this.collection.getItem(key);\n if (!last || (item && compareNodeOrder(this.collection, item, last) > 0)) {\n last = item;\n }\n }\n\n return last?.key ?? null;\n }\n\n get disabledKeys(): Set<Key> {\n return this.state.disabledKeys;\n }\n\n get disabledBehavior(): DisabledBehavior {\n return this.state.disabledBehavior;\n }\n\n /**\n * Extends the selection to the given key.\n */\n extendSelection(toKey: Key): void {\n if (this.selectionMode === 'none') {\n return;\n }\n\n if (this.selectionMode === 'single') {\n this.replaceSelection(toKey);\n return;\n }\n\n let mappedToKey = this.getKey(toKey);\n if (mappedToKey == null) {\n return;\n }\n\n let selection: Selection;\n\n // Only select the one key if coming from a select all.\n if (this.state.selectedKeys === 'all') {\n selection = new Selection([mappedToKey], mappedToKey, mappedToKey);\n } else {\n let selectedKeys = this.state.selectedKeys as Selection;\n let anchorKey = selectedKeys.anchorKey ?? mappedToKey;\n selection = new Selection(selectedKeys, anchorKey, mappedToKey);\n for (let key of this.getKeyRange(anchorKey, selectedKeys.currentKey ?? mappedToKey)) {\n selection.delete(key);\n }\n\n for (let key of this.getKeyRange(mappedToKey, anchorKey)) {\n if (this.canSelectItem(key)) {\n selection.add(key);\n }\n }\n }\n\n this.state.setSelectedKeys(selection);\n }\n\n private getKeyRange(from: Key, to: Key) {\n let fromItem = this.collection.getItem(from);\n let toItem = this.collection.getItem(to);\n if (fromItem && toItem) {\n if (compareNodeOrder(this.collection, fromItem, toItem) <= 0) {\n return this.getKeyRangeInternal(from, to);\n }\n\n return this.getKeyRangeInternal(to, from);\n }\n\n return [];\n }\n\n private getKeyRangeInternal(from: Key, to: Key) {\n if (this.layoutDelegate?.getKeyRange) {\n return this.layoutDelegate.getKeyRange(from, to);\n }\n\n let keys: Key[] = [];\n let key: Key | null = from;\n while (key != null) {\n let item = this.collection.getItem(key);\n if (item && (item.type === 'item' || (item.type === 'cell' && this.allowsCellSelection))) {\n keys.push(key);\n }\n\n if (key === to) {\n return keys;\n }\n\n key = this.collection.getKeyAfter(key);\n }\n\n return [];\n }\n\n private getKey(key: Key) {\n let item = this.collection.getItem(key);\n if (!item) {\n // ¯\\_(ツ)_/¯\n return key;\n }\n\n // If cell selection is allowed, just return the key.\n if (item.type === 'cell' && this.allowsCellSelection) {\n return key;\n }\n\n // Find a parent item to select\n while (item && item.type !== 'item' && item.parentKey != null) {\n item = this.collection.getItem(item.parentKey);\n }\n\n if (!item || item.type !== 'item') {\n return null;\n }\n\n return item.key;\n }\n\n /**\n * Toggles whether the given key is selected.\n */\n toggleSelection(key: Key): void {\n if (this.selectionMode === 'none') {\n return;\n }\n\n if (this.selectionMode === 'single' && !this.isSelected(key)) {\n this.replaceSelection(key);\n return;\n }\n\n let mappedKey = this.getKey(key);\n if (mappedKey == null) {\n return;\n }\n\n let keys = new Selection(this.state.selectedKeys === 'all' ? this.getSelectAllKeys() : this.state.selectedKeys);\n if (keys.has(mappedKey)) {\n keys.delete(mappedKey);\n // TODO: move anchor to last selected key...\n // Does `current` need to move here too?\n } else if (this.canSelectItem(mappedKey)) {\n keys.add(mappedKey);\n keys.anchorKey = mappedKey;\n keys.currentKey = mappedKey;\n }\n\n if (this.disallowEmptySelection && keys.size === 0) {\n return;\n }\n\n this.state.setSelectedKeys(keys);\n }\n\n /**\n * Replaces the selection with only the given key.\n */\n replaceSelection(key: Key): void {\n if (this.selectionMode === 'none') {\n return;\n }\n\n let mappedKey = this.getKey(key);\n if (mappedKey == null) {\n return;\n }\n\n let selection = this.canSelectItem(mappedKey)\n ? new Selection([mappedKey], mappedKey, mappedKey)\n : new Selection();\n\n this.state.setSelectedKeys(selection);\n }\n\n /**\n * Replaces the selection with the given keys.\n */\n setSelectedKeys(keys: Iterable<Key>): void {\n if (this.selectionMode === 'none') {\n return;\n }\n\n let selection = new Selection();\n for (let key of keys) {\n let mappedKey = this.getKey(key);\n if (mappedKey != null) {\n selection.add(mappedKey);\n if (this.selectionMode === 'single') {\n break;\n }\n }\n }\n\n this.state.setSelectedKeys(selection);\n }\n\n private getSelectAllKeys() {\n // Use the full (unfiltered) collection when available so that materializing\n // the 'all' selection includes items that are currently filtered out (e.g. by Autocomplete).\n let collection = this.fullCollection ?? this.collection;\n let keys: Key[] = [];\n let addKeys = (key: Key | null) => {\n while (key != null) {\n if (this.canSelectItemIn(key, collection)) {\n let item = collection.getItem(key);\n if (item?.type === 'item') {\n keys.push(key);\n }\n\n // Add child keys. If cell selection is allowed, then include item children too.\n if (item?.hasChildNodes && (this.allowsCellSelection || item.type !== 'item')) {\n addKeys(getFirstItem(getChildNodes(item, collection))?.key ?? null);\n }\n }\n\n key = collection.getKeyAfter(key);\n }\n };\n\n addKeys(collection.getFirstKey());\n return keys;\n }\n\n /**\n * Selects all items in the collection.\n */\n selectAll(): void {\n if (!this.isSelectAll && this.selectionMode === 'multiple') {\n this.state.setSelectedKeys('all');\n }\n }\n\n /**\n * Removes all keys from the selection.\n */\n clearSelection(): void {\n if (!this.disallowEmptySelection && (this.state.selectedKeys === 'all' || this.state.selectedKeys.size > 0)) {\n this.state.setSelectedKeys(new Selection());\n }\n }\n\n /**\n * Toggles between select all and an empty selection.\n */\n toggleSelectAll(): void {\n if (this.isSelectAll) {\n this.clearSelection();\n } else {\n this.selectAll();\n }\n }\n\n select(key: Key, e?: PressEvent | LongPressEvent | PointerEvent): void {\n if (this.selectionMode === 'none') {\n return;\n }\n\n if (this.selectionMode === 'single') {\n if (this.isSelected(key) && !this.disallowEmptySelection) {\n this.toggleSelection(key);\n } else {\n this.replaceSelection(key);\n }\n } else if (this.selectionBehavior === 'toggle' || (e && (e.pointerType === 'touch' || e.pointerType === 'virtual'))) {\n // if touch or virtual (VO) then we just want to toggle, otherwise it's impossible to multi select because they don't have modifier keys\n this.toggleSelection(key);\n } else {\n this.replaceSelection(key);\n }\n }\n\n /**\n * Returns whether the current selection is equal to the given selection.\n */\n isSelectionEqual(selection: Set<Key>): boolean {\n if (selection === this.state.selectedKeys) {\n return true;\n }\n\n // Check if the set of keys match.\n let selectedKeys = this.selectedKeys;\n if (selection.size !== selectedKeys.size) {\n return false;\n }\n\n for (let key of selection) {\n if (!selectedKeys.has(key)) {\n return false;\n }\n }\n\n for (let key of selectedKeys) {\n if (!selection.has(key)) {\n return false;\n }\n }\n\n return true;\n }\n\n canSelectItem(key: Key): boolean {\n return this.canSelectItemIn(key, this.collection);\n }\n\n private canSelectItemIn(key: Key, collection: Collection<Node<unknown>>): boolean {\n if (this.state.selectionMode === 'none' || this.state.disabledKeys.has(key)) {\n return false;\n }\n\n let item = collection.getItem(key);\n if (!item || item?.props?.isDisabled || (item.type === 'cell' && !this.allowsCellSelection)) {\n return false;\n }\n\n return true;\n }\n\n isDisabled(key: Key): boolean {\n return this.state.disabledBehavior === 'all' && (this.state.disabledKeys.has(key) || !!this.collection.getItem(key)?.props?.isDisabled);\n }\n\n isLink(key: Key): boolean {\n return !!this.collection.getItem(key)?.props?.href;\n }\n\n getItemProps(key: Key): any {\n return this.collection.getItem(key)?.props;\n }\n\n withCollection(collection: Collection<Node<unknown>>): SelectionManager {\n return new SelectionManager(collection, this.state, {\n allowsCellSelection: this.allowsCellSelection,\n layoutDelegate: this.layoutDelegate || undefined,\n fullCollection: this.fullCollection ?? this.collection\n });\n }\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {CollectionBase, CollectionElement, Key, Node} from '@react-types/shared';\nimport {PartialNode} from './types';\nimport React, {ReactElement} from 'react';\n\ninterface CollectionBuilderState {\n renderer?: (value: any) => ReactElement | null\n}\n\ninterface CollectReactElement<T> extends ReactElement {\n getCollectionNode(props: any, context: any): Generator<PartialNode<T>, void, Node<T>[]>\n}\n\nexport class CollectionBuilder<T extends object> {\n private context?: unknown;\n private cache: WeakMap<T, Node<T>> = new WeakMap();\n\n build(props: Partial<CollectionBase<T>>, context?: unknown): Iterable<Node<T>> {\n this.context = context;\n return iterable(() => this.iterateCollection(props));\n }\n\n private *iterateCollection(props: Partial<CollectionBase<T>>): Generator<Node<T>> {\n let {children, items} = props;\n\n if (React.isValidElement<{children: CollectionElement<T>}>(children) && children.type === React.Fragment) {\n yield* this.iterateCollection({\n children: children.props.children,\n items\n });\n } else if (typeof children === 'function') {\n if (!items) {\n throw new Error('props.children was a function but props.items is missing');\n }\n\n let index = 0;\n for (let item of items) {\n yield* this.getFullNode({\n value: item,\n index\n }, {renderer: children});\n index++;\n }\n } else {\n let items: CollectionElement<T>[] = [];\n React.Children.forEach(children, child => {\n if (child) {\n items.push(child);\n }\n });\n\n let index = 0;\n for (let item of items) {\n let nodes = this.getFullNode({\n element: item,\n index: index\n }, {});\n\n for (let node of nodes) {\n index++;\n yield node;\n }\n }\n }\n }\n\n private getKey(item: NonNullable<CollectionElement<T>>, partialNode: PartialNode<T>, state: CollectionBuilderState, parentKey?: Key | null): Key {\n if (item.key != null) {\n return item.key;\n }\n\n if (partialNode.type === 'cell' && partialNode.key != null) {\n return `${parentKey}${partialNode.key}`;\n }\n\n let v = partialNode.value as any;\n if (v != null) {\n let key = v.key ?? v.id;\n if (key == null) {\n throw new Error('No key found for item');\n }\n\n return key;\n }\n\n return parentKey ? `${parentKey}.${partialNode.index}` : `$.${partialNode.index}`;\n }\n\n private getChildState(state: CollectionBuilderState, partialNode: PartialNode<T>) {\n return {\n renderer: partialNode.renderer || state.renderer\n };\n }\n\n private *getFullNode(partialNode: PartialNode<T> & {index: number}, state: CollectionBuilderState, parentKey?: Key | null, parentNode?: Node<T>): Generator<Node<T>> {\n if (React.isValidElement<{children: CollectionElement<T>}>(partialNode.element) && partialNode.element.type === React.Fragment) {\n let children: CollectionElement<T>[] = [];\n\n React.Children.forEach(partialNode.element.props.children, child => {\n children.push(child);\n });\n\n let index = partialNode.index ?? 0;\n\n for (const child of children) {\n yield* this.getFullNode({\n element: child,\n index: index++\n }, state, parentKey, parentNode);\n }\n\n return;\n }\n\n // If there's a value instead of an element on the node, and a parent renderer function is available,\n // use it to render an element for the value.\n let element = partialNode.element;\n if (!element && partialNode.value && state && state.renderer) {\n let cached = this.cache.get(partialNode.value);\n if (cached && (!cached.shouldInvalidate || !cached.shouldInvalidate(this.context))) {\n cached.index = partialNode.index;\n cached.parentKey = parentNode ? parentNode.key : null;\n yield cached;\n return;\n }\n\n element = state.renderer(partialNode.value);\n }\n\n // If there's an element with a getCollectionNode function on its type, then it's a supported component.\n // Call this function to get a partial node, and recursively build a full node from there.\n if (React.isValidElement(element)) {\n let type = element.type as unknown as CollectReactElement<T>;\n if (typeof type !== 'function' && typeof type.getCollectionNode !== 'function') {\n let name = element.type;\n throw new Error(`Unknown element <${name}> in collection.`);\n }\n\n let childNodes = type.getCollectionNode(element.props, this.context) as Generator<PartialNode<T>, void, Node<T>[]>;\n let index = partialNode.index ?? 0;\n let result = childNodes.next();\n while (!result.done && result.value) {\n let childNode = result.value;\n\n partialNode.index = index;\n\n let nodeKey = childNode.key ?? null;\n if (nodeKey == null) {\n nodeKey = childNode.element ? null : this.getKey(element as NonNullable<CollectionElement<T>>, partialNode, state, parentKey);\n }\n\n let nodes = this.getFullNode({\n ...childNode,\n key: nodeKey,\n index,\n wrapper: compose(partialNode.wrapper, childNode.wrapper)\n }, this.getChildState(state, childNode), parentKey ? `${parentKey}${element.key}` : element.key, parentNode);\n\n let children = [...nodes];\n for (let node of children) {\n // Cache the node based on its value\n node.value = childNode.value ?? partialNode.value ?? null;\n if (node.value) {\n this.cache.set(node.value, node);\n }\n\n // The partial node may have specified a type for the child in order to specify a constraint.\n // Verify that the full node that was built recursively matches this type.\n if (partialNode.type && node.type !== partialNode.type) {\n throw new Error(`Unsupported type <${capitalize(node.type)}> in <${capitalize(parentNode?.type ?? 'unknown parent type')}>. Only <${capitalize(partialNode.type)}> is supported.`);\n }\n\n index++;\n yield node;\n }\n\n result = childNodes.next(children);\n }\n\n return;\n }\n\n // Ignore invalid elements\n if (partialNode.key == null || partialNode.type == null) {\n return;\n }\n\n // Create full node\n let builder = this;\n let node: Node<T> = {\n type: partialNode.type,\n props: partialNode.props,\n key: partialNode.key,\n parentKey: parentNode ? parentNode.key : null,\n value: partialNode.value ?? null,\n level: (parentNode?.level ?? 0) + (parentNode?.type === 'item' ? 1 : 0),\n index: partialNode.index,\n rendered: partialNode.rendered,\n textValue: partialNode.textValue ?? '',\n 'aria-label': partialNode['aria-label'],\n wrapper: partialNode.wrapper,\n shouldInvalidate: partialNode.shouldInvalidate,\n hasChildNodes: partialNode.hasChildNodes || false,\n childNodes: iterable(function *() {\n if (!partialNode.hasChildNodes || !partialNode.childNodes) {\n return;\n }\n\n let index = 0;\n for (let child of partialNode.childNodes()) {\n // Ensure child keys are globally unique by prepending the parent node's key\n if (child.key != null) {\n // TODO: Remove this line entirely and enforce that users always provide unique keys.\n // Currently this line will have issues when a parent has a key `a` and a child with key `bc`\n // but another parent has key `ab` and its child has a key `c`. The combined keys would result in both\n // children having a key of `abc`.\n child.key = `${node.key}${child.key}`;\n }\n\n let nodes = builder.getFullNode({...child, index}, builder.getChildState(state, child), node.key, node);\n for (let node of nodes) {\n index++;\n yield node;\n }\n }\n })\n };\n\n yield node;\n }\n}\n\n// Wraps an iterator function as an iterable object, and caches the results.\nfunction iterable<T>(iterator: () => IterableIterator<Node<T>>): Iterable<Node<T>> {\n let cache: Array<Node<T>> = [];\n let iterable: null | IterableIterator<Node<T>> = null;\n return {\n *[Symbol.iterator]() {\n for (let item of cache) {\n yield item;\n }\n\n if (!iterable) {\n iterable = iterator();\n }\n\n for (let item of iterable) {\n cache.push(item);\n yield item;\n }\n }\n };\n}\n\ntype Wrapper = (element: ReactElement) => ReactElement;\nfunction compose(outer: Wrapper | void, inner: Wrapper | void): Wrapper | undefined {\n if (outer && inner) {\n return (element) => outer(inner(element));\n }\n\n if (outer) {\n return outer;\n }\n\n if (inner) {\n return inner;\n }\n}\n\nfunction capitalize(str: string) {\n return str[0].toUpperCase() + str.slice(1);\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {Collection, CollectionStateBase, Node} from '@react-types/shared';\nimport {CollectionBuilder} from './CollectionBuilder';\nimport {ReactElement, useMemo} from 'react';\n\ninterface CollectionOptions<T, C extends Collection<Node<T>>> extends Omit<CollectionStateBase<T, C>, 'children'> {\n children?: ReactElement<any> | null | (ReactElement<any> | null)[] | ((item: T) => ReactElement<any> | null)\n}\n\ntype CollectionFactory<T, C extends Collection<Node<T>>> = (node: Iterable<Node<T>>) => C;\n\nexport function useCollection<T extends object, C extends Collection<Node<T>> = Collection<Node<T>>>(props: CollectionOptions<T, C>, factory: CollectionFactory<T, C>, context?: unknown): C {\n let builder = useMemo(() => new CollectionBuilder<T>(), []);\n let {children, items, collection} = props;\n let result = useMemo(() => {\n if (collection) {\n return collection;\n }\n let nodes = builder.build({children, items}, context);\n return factory(nodes);\n }, [builder, children, items, collection, context, factory]);\n return result;\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {Collection, CollectionStateBase, Key, LayoutDelegate, Node} from '@react-types/shared';\nimport {ListCollection} from './ListCollection';\nimport {MultipleSelectionStateProps, useMultipleSelectionState} from '../selection/useMultipleSelectionState';\nimport {SelectionManager} from '../selection/SelectionManager';\nimport {useCallback, useEffect, useMemo, useRef} from 'react';\nimport {useCollection} from '../collections/useCollection';\n\nexport interface ListProps<T> extends CollectionStateBase<T>, MultipleSelectionStateProps {\n /** Filter function to generate a filtered list of nodes. */\n filter?: (nodes: Iterable<Node<T>>) => Iterable<Node<T>>,\n /** @private */\n suppressTextValueWarning?: boolean,\n /**\n * A delegate object that provides layout information for items in the collection.\n * This can be used to override the behavior of shift selection.\n */\n layoutDelegate?: LayoutDelegate\n}\n\nexport interface ListState<T> {\n /** A collection of items in the list. */\n collection: Collection<Node<T>>,\n\n /** A set of items that are disabled. */\n disabledKeys: Set<Key>,\n\n /** A selection manager to read and update multiple selection state. */\n selectionManager: SelectionManager\n}\n\n/**\n * Provides state management for list-like components. Handles building a collection\n * of items from props, and manages multiple selection state.\n */\nexport function useListState<T extends object>(props: ListProps<T>): ListState<T> {\n let {filter, layoutDelegate} = props;\n\n let selectionState = useMultipleSelectionState(props);\n let disabledKeys = useMemo(() =>\n props.disabledKeys ? new Set(props.disabledKeys) : new Set<Key>()\n , [props.disabledKeys]);\n\n let factory = useCallback(nodes => filter ? new ListCollection(filter(nodes)) : new ListCollection(nodes as Iterable<Node<T>>), [filter]);\n let context = useMemo(() => ({suppressTextValueWarning: props.suppressTextValueWarning}), [props.suppressTextValueWarning]);\n\n let collection = useCollection(props, factory, context);\n\n let selectionManager = useMemo(() =>\n new SelectionManager(collection, selectionState, {layoutDelegate})\n , [collection, selectionState, layoutDelegate]\n );\n\n useFocusedKeyReset(collection, selectionManager);\n\n return {\n collection,\n disabledKeys,\n selectionManager\n };\n}\n\n/**\n * Filters a collection using the provided filter function and returns a new ListState.\n */\nexport function UNSTABLE_useFilteredListState<T extends object>(state: ListState<T>, filterFn: ((nodeValue: string, node: Node<T>) => boolean) | null | undefined): ListState<T> {\n let collection = useMemo(() => filterFn ? state.collection.filter!(filterFn) : state.collection, [state.collection, filterFn]);\n let selectionManager = state.selectionManager.withCollection(collection);\n useFocusedKeyReset(collection, selectionManager);\n return {\n collection,\n selectionManager,\n disabledKeys: state.disabledKeys\n };\n}\n\nfunction useFocusedKeyReset<T>(collection: Collection<Node<T>>, selectionManager: SelectionManager) {\n // Reset focused key if that item is deleted from the collection.\n const cachedCollection = useRef<Collection<Node<T>> | null>(null);\n useEffect(() => {\n if (selectionManager.focusedKey != null && !collection.getItem(selectionManager.focusedKey) && cachedCollection.current) {\n // Walk forward in the old collection to find the next key that still exists in the new collection.\n let key = cachedCollection.current.getKeyAfter(selectionManager.focusedKey);\n let nextFocusedKey: Key | null = null;\n while (key != null) {\n let node = collection.getItem(key);\n if (node && node.type === 'item' && !selectionManager.isDisabled(key)) {\n nextFocusedKey = key;\n break;\n }\n\n key = cachedCollection.current.getKeyAfter(key);\n }\n\n // If no such key exists, walk backward.\n if (nextFocusedKey == null) {\n key = cachedCollection.current.getKeyBefore(selectionManager.focusedKey);\n while (key != null) {\n let node = collection.getItem(key);\n if (node && node.type === 'item' && !selectionManager.isDisabled(key)) {\n nextFocusedKey = key;\n break;\n }\n\n key = cachedCollection.current.getKeyBefore(key);\n }\n }\n\n selectionManager.setFocusedKey(nextFocusedKey);\n }\n cachedCollection.current = collection;\n }, [collection, selectionManager]);\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {useCallback} from 'react';\nimport {useControlledState} from '../utils/useControlledState';\n\nexport interface OverlayTriggerProps {\n /** Whether the overlay is open by default (controlled). */\n isOpen?: boolean,\n /** Whether the overlay is open by default (uncontrolled). */\n defaultOpen?: boolean,\n /** Handler that is called when the overlay's open state changes. */\n onOpenChange?: (isOpen: boolean) => void\n}\n\nexport interface OverlayTriggerState {\n /** Whether the overlay is currently open. */\n readonly isOpen: boolean,\n /** Sets whether the overlay is open. */\n setOpen(isOpen: boolean): void,\n /** Opens the overlay. */\n open(): void,\n /** Closes the overlay. */\n close(): void,\n /** Toggles the overlay's visibility. */\n toggle(): void\n}\n\n/**\n * Manages state for an overlay trigger. Tracks whether the overlay is open, and provides\n * methods to toggle this state.\n */\nexport function useOverlayTriggerState(props: OverlayTriggerProps): OverlayTriggerState {\n let [isOpen, setOpen] = useControlledState(props.isOpen, props.defaultOpen || false, props.onOpenChange);\n\n const open = useCallback(() => {\n setOpen(true);\n }, [setOpen]);\n\n const close = useCallback(() => {\n setOpen(false);\n }, [setOpen]);\n\n const toggle = useCallback(() => {\n setOpen(!isOpen);\n }, [setOpen, isOpen]);\n\n return {\n isOpen,\n setOpen,\n open,\n close,\n toggle\n };\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {ItemElement, ItemProps} from '@react-types/shared';\nimport {PartialNode} from './types';\nimport React, {JSX, ReactElement} from 'react';\n\nfunction Item<T>(props: ItemProps<T>): ReactElement | null { // eslint-disable-line @typescript-eslint/no-unused-vars\n return null;\n}\n\nItem.getCollectionNode = function* getCollectionNode<T>(props: ItemProps<T>, context: any): Generator<PartialNode<T>> {\n let {childItems, title, children} = props;\n\n let rendered = props.title || props.children;\n let textValue = props.textValue || (typeof rendered === 'string' ? rendered : '') || props['aria-label'] || '';\n\n // suppressTextValueWarning is used in components like Tabs, which don't have type to select support.\n if (!textValue && !context?.suppressTextValueWarning && process.env.NODE_ENV !== 'production') {\n console.warn('<Item> with non-plain text contents is unsupported by type to select for accessibility. Please add a `textValue` prop.');\n }\n\n yield {\n type: 'item',\n props: props,\n rendered,\n textValue,\n 'aria-label': props['aria-label'],\n hasChildNodes: hasChildItems(props),\n *childNodes() {\n if (childItems) {\n for (let child of childItems) {\n yield {\n type: 'item',\n value: child\n };\n }\n } else if (title) {\n let items: PartialNode<T>[] = [];\n React.Children.forEach(children, child => {\n items.push({\n type: 'item',\n element: child as ItemElement<T>\n });\n });\n\n yield* items;\n }\n }\n };\n};\n\nfunction hasChildItems<T>(props: ItemProps<T>) {\n if (props.hasChildItems != null) {\n return props.hasChildItems;\n }\n\n if (props.childItems) {\n return true;\n }\n\n if (props.title && React.Children.count(props.children) > 0) {\n return true;\n }\n\n return false;\n}\n\n// We don't want getCollectionNode to show up in the type definition\nlet _Item = Item as <T>(props: ItemProps<T>) => JSX.Element;\nexport {_Item as Item};\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {CollectionStateBase, Key, Node, Selection, SingleSelection} from '@react-types/shared';\nimport {ListState, useListState} from './useListState';\nimport {useControlledState} from '../utils/useControlledState';\nimport {useMemo} from 'react';\n\nexport interface SingleSelectListProps<T> extends CollectionStateBase<T>, Omit<SingleSelection, 'disallowEmptySelection'> {\n /** Filter function to generate a filtered list of nodes. */\n filter?: (nodes: Iterable<Node<T>>) => Iterable<Node<T>>,\n /** @private */\n suppressTextValueWarning?: boolean\n}\n\nexport interface SingleSelectListState<T> extends ListState<T> {\n /** The key for the currently selected item. */\n readonly selectedKey: Key | null,\n\n /** Sets the selected key. */\n setSelectedKey(key: Key | null): void,\n\n /** The value of the currently selected item. */\n readonly selectedItem: Node<T> | null\n}\n\n/**\n * Provides state management for list-like components with single selection.\n * Handles building a collection of items from props, and manages selection state.\n */\nexport function useSingleSelectListState<T extends object>(props: SingleSelectListProps<T>): SingleSelectListState<T> {\n let [selectedKey, setSelectedKey] = useControlledState(props.selectedKey, props.defaultSelectedKey ?? null, props.onSelectionChange);\n let selectedKeys = useMemo(() => selectedKey != null ? [selectedKey] : [], [selectedKey]);\n let {collection, disabledKeys, selectionManager} = useListState({\n ...props,\n selectionMode: 'single',\n disallowEmptySelection: true,\n allowDuplicateSelectionEvents: true,\n selectedKeys,\n onSelectionChange: (keys: Selection) => {\n // impossible, but TS doesn't know that\n if (keys === 'all') {\n return;\n }\n let key = keys.values().next().value ?? null;\n\n // Always fire onSelectionChange, even if the key is the same\n // as the current key (useControlledState does not).\n if (key === selectedKey && props.onSelectionChange) {\n props.onSelectionChange(key);\n }\n\n setSelectedKey(key);\n }\n });\n\n let selectedItem = selectedKey != null\n ? collection.getItem(selectedKey)\n : null;\n\n return {\n collection,\n disabledKeys,\n selectionManager,\n selectedKey,\n setSelectedKey,\n selectedItem\n };\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {FocusStrategy, Key} from '@react-types/shared';\nimport {OverlayTriggerProps, OverlayTriggerState, useOverlayTriggerState} from '../overlays/useOverlayTriggerState';\nimport {useState} from 'react';\n\nexport type MenuTriggerType = 'press' | 'longPress';\n\nexport interface MenuTriggerProps extends OverlayTriggerProps {\n /**\n * How the menu is triggered.\n * @default 'press'\n */\n trigger?: MenuTriggerType\n}\n\nexport interface MenuTriggerState extends OverlayTriggerState {\n /** Controls which item will be auto focused when the menu opens. */\n readonly focusStrategy: FocusStrategy | null,\n\n /** Opens the menu. */\n open(focusStrategy?: FocusStrategy | null): void,\n\n /** Toggles the menu. */\n toggle(focusStrategy?: FocusStrategy | null): void\n}\n\nexport interface RootMenuTriggerState extends MenuTriggerState {\n /** Opens a specific submenu tied to a specific menu item at a specific level. */\n openSubmenu: (triggerKey: Key, level: number) => void,\n\n /** Closes a specific submenu tied to a specific menu item at a specific level. */\n closeSubmenu: (triggerKey: Key, level: number) => void,\n\n /** An array of open submenu trigger keys within the menu tree.\n * The index of key within array matches the submenu level in the tree.\n */\n expandedKeysStack: Key[],\n\n /** Closes the menu and all submenus in the menu tree. */\n close: () => void\n}\n\n/**\n * Manages state for a menu trigger. Tracks whether the menu is currently open,\n * and controls which item will receive focus when it opens. Also tracks the open submenus within\n * the menu tree via their trigger keys.\n */\nexport function useMenuTriggerState(props: MenuTriggerProps): RootMenuTriggerState {\n let overlayTriggerState = useOverlayTriggerState(props);\n let [focusStrategy, setFocusStrategy] = useState<FocusStrategy | null>(null);\n let [expandedKeysStack, setExpandedKeysStack] = useState<Key[]>([]);\n\n let closeAll = () => {\n setExpandedKeysStack([]);\n overlayTriggerState.close();\n };\n\n let openSubmenu = (triggerKey: Key, level: number) => {\n setExpandedKeysStack(oldStack => {\n if (level > oldStack.length) {\n return oldStack;\n }\n\n return [...oldStack.slice(0, level), triggerKey];\n });\n };\n\n let closeSubmenu = (triggerKey: Key, level: number) => {\n setExpandedKeysStack(oldStack => {\n let key = oldStack[level];\n if (key === triggerKey) {\n return oldStack.slice(0, level);\n } else {\n return oldStack;\n }\n });\n };\n\n return {\n focusStrategy,\n ...overlayTriggerState,\n open(focusStrategy: FocusStrategy | null = null) {\n setFocusStrategy(focusStrategy);\n overlayTriggerState.open();\n },\n toggle(focusStrategy: FocusStrategy | null = null) {\n setFocusStrategy(focusStrategy);\n overlayTriggerState.toggle();\n },\n close() {\n closeAll();\n },\n expandedKeysStack,\n openSubmenu,\n closeSubmenu\n };\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {FocusEvents, HelpTextProps, InputBase, InputDOMProps, LabelableProps, Orientation, Validation, ValidationState, ValueBase} from '@react-types/shared';\nimport {FormValidationState, useFormValidationState} from '../form/useFormValidationState';\nimport {useControlledState} from '../utils/useControlledState';\nimport {useMemo, useState} from 'react';\n\nexport interface RadioGroupProps extends ValueBase<string|null, string>, InputBase, Pick<InputDOMProps, 'name'>, Validation<string>, LabelableProps, HelpTextProps, FocusEvents {\n /**\n * The axis the Radio Button(s) should align with.\n * @default 'vertical'\n */\n orientation?: Orientation\n}\n\nexport interface RadioGroupState extends FormValidationState {\n /**\n * The name for the group, used for native form submission.\n * @deprecated\n * @private\n */\n readonly name: string,\n\n /** Whether the radio group is disabled. */\n readonly isDisabled: boolean,\n\n /** Whether the radio group is read only. */\n readonly isReadOnly: boolean,\n\n /** Whether the radio group is required. */\n readonly isRequired: boolean,\n\n /**\n * Whether the radio group is valid or invalid.\n * @deprecated Use `isInvalid` instead.\n */\n readonly validationState: ValidationState | null,\n\n /** Whether the radio group is invalid. */\n readonly isInvalid: boolean,\n\n /** The currently selected value. */\n readonly selectedValue: string | null,\n\n /** The default selected value. */\n readonly defaultSelectedValue: string | null,\n\n /** Sets the selected value. */\n setSelectedValue(value: string | null): void,\n\n /** The value of the last focused radio. */\n readonly lastFocusedValue: string | null,\n\n /** Sets the last focused value. */\n setLastFocusedValue(value: string | null): void\n}\n\nlet instance = Math.round(Math.random() * 10000000000);\nlet i = 0;\n\n/**\n * Provides state management for a radio group component. Provides a name for the group,\n * and manages selection and focus state.\n */\nexport function useRadioGroupState(props: RadioGroupProps): RadioGroupState {\n // Preserved here for backward compatibility. React Aria now generates the name instead of stately.\n let name = useMemo(() => props.name || `radio-group-${instance}-${++i}`, [props.name]);\n let [selectedValue, setSelected] = useControlledState(props.value, props.defaultValue ?? null, props.onChange);\n let [initialValue] = useState(selectedValue);\n let [lastFocusedValue, setLastFocusedValue] = useState<string | null>(null);\n\n let validation = useFormValidationState({\n ...props,\n value: selectedValue\n });\n\n let setSelectedValue = (value) => {\n if (!props.isReadOnly && !props.isDisabled) {\n setSelected(value);\n validation.commitValidation();\n }\n };\n\n let isInvalid = validation.displayValidation.isInvalid;\n\n return {\n ...validation,\n name,\n selectedValue: selectedValue,\n defaultSelectedValue: props.value !== undefined ? initialValue : props.defaultValue ?? null,\n setSelectedValue,\n lastFocusedValue,\n setLastFocusedValue,\n isDisabled: props.isDisabled || false,\n isReadOnly: props.isReadOnly || false,\n isRequired: props.isRequired || false,\n validationState: props.validationState || (isInvalid ? 'invalid' : null),\n isInvalid\n };\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {CollectionBase, CollectionStateBase, FocusableProps, FocusStrategy, HelpTextProps, InputBase, Key, LabelableProps, Node, Selection, TextInputBase, Validation, ValueBase} from '@react-types/shared';\nimport {FormValidationState, useFormValidationState} from '../form/useFormValidationState';\nimport {ListState, useListState} from '../list/useListState';\nimport {OverlayTriggerState, useOverlayTriggerState} from '../overlays/useOverlayTriggerState';\nimport {useControlledState} from '../utils/useControlledState';\nimport {useMemo, useState} from 'react';\n\nexport type SelectionMode = 'single' | 'multiple';\nexport type ValueType<M extends SelectionMode> = M extends 'single' ? Key | null : readonly Key[];\nexport type ChangeValueType<M extends SelectionMode> = M extends 'single' ? Key | null : Key[];\ntype ValidationType<M extends SelectionMode> = M extends 'single' ? Key : Key[];\n\nexport interface SelectProps<T, M extends SelectionMode = 'single'> extends CollectionBase<T>, Omit<InputBase, 'isReadOnly'>, ValueBase<ValueType<M>, ChangeValueType<M>>, Validation<ValidationType<M>>, HelpTextProps, LabelableProps, TextInputBase, FocusableProps {\n /**\n * Whether single or multiple selection is enabled.\n * @default 'single'\n */\n selectionMode?: M,\n /**\n * The currently selected key in the collection (controlled).\n * @deprecated\n */\n selectedKey?: Key | null,\n /**\n * The initial selected key in the collection (uncontrolled).\n * @deprecated\n */\n defaultSelectedKey?: Key | null,\n /**\n * Handler that is called when the selection changes.\n * @deprecated\n */\n onSelectionChange?: (key: Key | null) => void,\n /** Sets the open state of the menu. */\n isOpen?: boolean,\n /** Sets the default open state of the menu. */\n defaultOpen?: boolean,\n /** Method that is called when the open state of the menu changes. */\n onOpenChange?: (isOpen: boolean) => void,\n /** Whether the Select should close when an item is selected. Defaults to true if selectionMode is single, false otherwise. */\n shouldCloseOnSelect?: boolean,\n /** Whether the select should be allowed to be open when the collection is empty. */\n allowsEmptyCollection?: boolean\n}\n\nexport interface SelectStateOptions<T, M extends SelectionMode = 'single'> extends Omit<SelectProps<T, M>, 'children'>, CollectionStateBase<T> {}\n\nexport interface SelectState<T, M extends SelectionMode = 'single'> extends ListState<T>, OverlayTriggerState, FormValidationState {\n /**\n * The key for the first selected item.\n * @deprecated\n */\n readonly selectedKey: Key | null,\n\n /**\n * The default selected key.\n * @deprecated\n */\n readonly defaultSelectedKey: Key | null,\n\n /**\n * Sets the selected key.\n * @deprecated\n */\n setSelectedKey(key: Key | null): void,\n\n /** The current select value. */\n readonly value: ValueType<M>,\n\n /** The default select value. */\n readonly defaultValue: ValueType<M>,\n\n /** Sets the select value. */\n setValue(value: Key | readonly Key[] | null): void,\n\n /**\n * The value of the first selected item.\n * @deprecated\n */\n readonly selectedItem: Node<T> | null,\n\n /** The value of the selected items. */\n readonly selectedItems: Node<T>[],\n\n /** Whether the select is currently focused. */\n readonly isFocused: boolean,\n\n /** Sets whether the select is focused. */\n setFocused(isFocused: boolean): void,\n\n /** Controls which item will be auto focused when the menu opens. */\n readonly focusStrategy: FocusStrategy | null,\n\n /** Opens the menu. */\n open(focusStrategy?: FocusStrategy | null): void,\n\n /** Toggles the menu. */\n toggle(focusStrategy?: FocusStrategy | null): void\n}\n\n/**\n * Provides state management for a select component. Handles building a collection\n * of items from props, handles the open state for the popup menu, and manages\n * multiple selection state.\n */\nexport function useSelectState<T extends object, M extends SelectionMode = 'single'>(props: SelectStateOptions<T, M>): SelectState<T, M> {\n let {\n selectionMode = 'single' as M,\n shouldCloseOnSelect = selectionMode === 'single'\n } = props;\n let triggerState = useOverlayTriggerState(props);\n let [focusStrategy, setFocusStrategy] = useState<FocusStrategy | null>(null);\n let defaultValue = useMemo(() => {\n return props.defaultValue !== undefined ? props.defaultValue : (selectionMode === 'single' ? props.defaultSelectedKey ?? null : []) as ValueType<M>;\n }, [props.defaultValue, props.defaultSelectedKey, selectionMode]);\n let value = useMemo(() => {\n return props.value !== undefined ? props.value : (selectionMode === 'single' ? props.selectedKey : undefined) as ValueType<M>;\n }, [props.value, props.selectedKey, selectionMode]);\n let [controlledValue, setControlledValue] = useControlledState<Key | readonly Key[] | null>(value, defaultValue, props.onChange as any);\n // Only display the first selected item if in single selection mode but the value is an array.\n let displayValue = selectionMode === 'single' && Array.isArray(controlledValue) ? controlledValue[0] : controlledValue;\n let setValue = (value: Key | Key[] | null) => {\n if (selectionMode === 'single') {\n let key = Array.isArray(value) ? value[0] ?? null : value;\n setControlledValue(key);\n if (key !== displayValue) {\n props.onSelectionChange?.(key);\n }\n } else {\n let keys: Key[] = [];\n if (Array.isArray(value)) {\n keys = value;\n } else if (value != null) {\n keys = [value];\n }\n\n setControlledValue(keys);\n }\n };\n\n let listState = useListState({\n ...props,\n selectionMode,\n disallowEmptySelection: selectionMode === 'single',\n allowDuplicateSelectionEvents: true,\n selectedKeys: useMemo(() => convertValue(displayValue), [displayValue]),\n onSelectionChange: (keys: Selection) => {\n // impossible, but TS doesn't know that\n if (keys === 'all') {\n return;\n }\n\n if (selectionMode === 'single') {\n let key = keys.values().next().value ?? null;\n setValue(key);\n } else {\n setValue([...keys]);\n }\n if (shouldCloseOnSelect) {\n triggerState.close();\n }\n\n validationState.commitValidation();\n }\n });\n\n let selectedKey = listState.selectionManager.firstSelectedKey;\n let selectedItems = useMemo(() => {\n return [...listState.selectionManager.selectedKeys].map(key => listState.collection.getItem(key)).filter(item => item != null);\n }, [listState.selectionManager.selectedKeys, listState.collection]);\n\n let validationState = useFormValidationState({\n ...props,\n value: Array.isArray(displayValue) && displayValue.length === 0 ? null : displayValue as any\n });\n\n let [isFocused, setFocused] = useState(false);\n let [initialValue] = useState(displayValue);\n\n return {\n ...validationState,\n ...listState,\n ...triggerState,\n value: displayValue as ValueType<M>,\n defaultValue: defaultValue ?? initialValue as ValueType<M>,\n setValue,\n selectedKey,\n setSelectedKey: setValue,\n selectedItem: selectedItems[0] ?? null,\n selectedItems,\n defaultSelectedKey: props.defaultSelectedKey ?? (props.selectionMode === 'single' ? initialValue as Key : null),\n focusStrategy,\n open(focusStrategy: FocusStrategy | null = null) {\n // Don't open if the collection is empty.\n if (listState.collection.size !== 0 || props.allowsEmptyCollection) {\n setFocusStrategy(focusStrategy);\n triggerState.open();\n }\n },\n toggle(focusStrategy: FocusStrategy | null = null) {\n if (listState.collection.size !== 0 || props.allowsEmptyCollection) {\n setFocusStrategy(focusStrategy);\n triggerState.toggle();\n }\n },\n isFocused,\n setFocused\n };\n}\n\nfunction convertValue(value: Key | Key[] | null | undefined) {\n if (value === undefined) {\n return undefined;\n }\n if (value === null) {\n return [];\n }\n return Array.isArray(value) ? value : [value];\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {Collection, CollectionBase, CollectionStateBase, Key, Node, SingleSelection} from '@react-types/shared';\nimport {SingleSelectListState, useSingleSelectListState} from '../list/useSingleSelectListState';\nimport {useEffect, useRef} from 'react';\n\nexport interface TabListProps<T> extends CollectionBase<T>, Omit<SingleSelection, 'disallowEmptySelection' | 'selectedKey' | 'defaultSelectedKey' | 'onSelectionChange'> {\n /**\n * Whether the TabList is disabled.\n * Shows that a selection exists, but is not available in that circumstance.\n */\n isDisabled?: boolean,\n /** The currently selected key in the collection (controlled). */\n selectedKey?: Key,\n /** The initial selected keys in the collection (uncontrolled). */\n defaultSelectedKey?: Key,\n /** Handler that is called when the selection changes. */\n onSelectionChange?: (key: Key) => void\n}\n\nexport interface TabListStateOptions<T> extends Omit<TabListProps<T>, 'children'>, CollectionStateBase<T> {}\n\nexport interface TabListState<T> extends SingleSelectListState<T> {\n /** Whether the tab list is disabled. */\n isDisabled: boolean\n}\n\n/**\n * Provides state management for a Tabs component. Tabs include a TabList which tracks\n * which tab is currently selected and displays the content associated with that Tab in a TabPanel.\n */\nexport function useTabListState<T extends object>(props: TabListStateOptions<T>): TabListState<T> {\n let state = useSingleSelectListState<T>({\n ...props,\n onSelectionChange: props.onSelectionChange ? (key => {\n if (key != null) {\n props.onSelectionChange?.(key);\n }\n }) : undefined,\n suppressTextValueWarning: true,\n defaultSelectedKey: props.defaultSelectedKey ?? findDefaultSelectedKey(props.collection, props.disabledKeys ? new Set(props.disabledKeys) : new Set()) ?? undefined\n });\n\n let {\n selectionManager,\n collection,\n selectedKey: currentSelectedKey\n } = state;\n\n let lastSelectedKey = useRef(currentSelectedKey);\n useEffect(() => {\n // Ensure a tab is always selected (in case no selected key was specified or if selected item was deleted from collection)\n let selectedKey = currentSelectedKey;\n if (props.selectedKey == null && (selectionManager.isEmpty || selectedKey == null || !collection.getItem(selectedKey))) {\n selectedKey = findDefaultSelectedKey(collection, state.disabledKeys);\n if (selectedKey != null) {\n // directly set selection because replace/toggle selection won't consider disabled keys\n selectionManager.setSelectedKeys([selectedKey]);\n }\n }\n\n // If the tablist doesn't have focus and the selected key changes or if there isn't a focused key yet, change focused key to the selected key if it exists.\n if (selectedKey != null && selectionManager.focusedKey == null || (!selectionManager.isFocused && selectedKey !== lastSelectedKey.current)) {\n selectionManager.setFocusedKey(selectedKey);\n }\n lastSelectedKey.current = selectedKey;\n });\n\n return {\n ...state,\n isDisabled: props.isDisabled || false\n };\n}\n\nfunction findDefaultSelectedKey<T>(collection: Collection<Node<T>> | undefined, disabledKeys: Set<Key>) {\n let selectedKey: Key | null = null;\n if (collection) {\n selectedKey = collection.getFirstKey();\n // loop over tabs until we find one that isn't disabled and select that\n while (selectedKey != null && (disabledKeys.has(selectedKey) || collection.getItem(selectedKey)?.props?.isDisabled) && selectedKey !== collection.getLastKey()) {\n selectedKey = collection.getKeyAfter(selectedKey);\n }\n // if this check is true, then every item is disabled, it makes more sense to default to the first key than the last\n if (selectedKey != null && (disabledKeys.has(selectedKey) || collection.getItem(selectedKey)?.props?.isDisabled) && selectedKey === collection.getLastKey()) {\n selectedKey = collection.getFirstKey();\n }\n }\n\n return selectedKey;\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {FocusableProps, InputBase, Validation} from '@react-types/shared';\nimport {ReactNode, useState} from 'react';\nimport {useControlledState} from '../utils/useControlledState';\n\nexport interface ToggleStateOptions extends InputBase {\n /**\n * Whether the element should be selected (uncontrolled).\n */\n defaultSelected?: boolean,\n /**\n * Whether the element should be selected (controlled).\n */\n isSelected?: boolean,\n /**\n * Handler that is called when the element's selection state changes.\n */\n onChange?: (isSelected: boolean) => void\n}\n\nexport interface ToggleProps extends ToggleStateOptions, Validation<boolean>, FocusableProps {\n /**\n * The label for the element.\n */\n children?: ReactNode,\n /**\n * The value of the input element, used when submitting an HTML form. See [MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#htmlattrdefvalue).\n */\n value?: string\n}\n\nexport interface ToggleState {\n /** Whether the toggle is selected. */\n readonly isSelected: boolean,\n\n /** Whether the toggle is selected by default. */\n readonly defaultSelected: boolean,\n\n /** Updates selection state. */\n setSelected(isSelected: boolean): void,\n\n /** Toggle the selection state. */\n toggle(): void\n}\n\n/**\n * Provides state management for toggle components like checkboxes and switches.\n */\nexport function useToggleState(props: ToggleStateOptions = {}): ToggleState {\n let {isReadOnly} = props;\n\n // have to provide an empty function so useControlledState doesn't throw a fit\n // can't use useControlledState's prop calling because we need the event object from the change\n let [isSelected, setSelected] = useControlledState(props.isSelected, props.defaultSelected || false, props.onChange);\n let [initialValue] = useState(isSelected);\n\n function updateSelected(value) {\n if (!isReadOnly) {\n setSelected(value);\n }\n }\n\n function toggleState() {\n if (!isReadOnly) {\n setSelected(!isSelected);\n }\n }\n\n return {\n isSelected,\n defaultSelected: props.defaultSelected ?? initialValue,\n setSelected: updateSelected,\n toggle: toggleState\n };\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {OverlayTriggerProps, useOverlayTriggerState} from '../overlays/useOverlayTriggerState';\nimport {useEffect, useMemo, useRef} from 'react';\n\nexport interface TooltipTriggerProps extends OverlayTriggerProps {\n /**\n * Whether the tooltip should be disabled, independent from the trigger.\n */\n isDisabled?: boolean,\n\n /**\n * The delay time for the tooltip to show up. [See guidelines](https://spectrum.adobe.com/page/tooltip/#Immediate-or-delayed-appearance).\n * @default 1500\n */\n delay?: number,\n\n /**\n * The delay time for the tooltip to close. [See guidelines](https://spectrum.adobe.com/page/tooltip/#Warmup-and-cooldown).\n * @default 500\n */\n closeDelay?: number,\n\n /**\n * By default, opens for both focus and hover. Can be made to open only for focus.\n * @default 'hover'\n */\n trigger?: 'hover' | 'focus',\n\n /**\n * Whether the tooltip should close when the trigger is pressed.\n * @default true\n */\n shouldCloseOnPress?: boolean\n}\n\nconst TOOLTIP_DELAY = 1500; // this seems to be a 1.5 second delay, check with design\nconst TOOLTIP_COOLDOWN = 500;\n\nexport interface TooltipTriggerState {\n /** Whether the tooltip is currently showing. */\n isOpen: boolean,\n /**\n * Shows the tooltip. By default, the tooltip becomes visible after a delay\n * depending on a global warmup timer. The `immediate` option shows the\n * tooltip immediately instead.\n */\n open(immediate?: boolean): void,\n /** Hides the tooltip. */\n close(immediate?: boolean): void\n}\n\nlet tooltips = {};\nlet tooltipId = 0;\nlet globalWarmedUp = false;\nlet globalWarmUpTimeout: ReturnType<typeof setTimeout> | null = null;\nlet globalCooldownTimeout: ReturnType<typeof setTimeout> | null = null;\n\n/**\n * Manages state for a tooltip trigger. Tracks whether the tooltip is open, and provides\n * methods to toggle this state. Ensures only one tooltip is open at a time and controls\n * the delay for showing a tooltip.\n */\nexport function useTooltipTriggerState(props: TooltipTriggerProps = {}): TooltipTriggerState {\n let {delay = TOOLTIP_DELAY, closeDelay = TOOLTIP_COOLDOWN} = props;\n let {isOpen, open, close} = useOverlayTriggerState(props);\n let id = useMemo(() => `${++tooltipId}`, []);\n let closeTimeout = useRef<ReturnType<typeof setTimeout> | null>(null);\n let closeCallback = useRef<() => void>(close);\n\n let ensureTooltipEntry = () => {\n tooltips[id] = hideTooltip;\n };\n\n let closeOpenTooltips = () => {\n for (let hideTooltipId in tooltips) {\n if (hideTooltipId !== id) {\n tooltips[hideTooltipId](true);\n delete tooltips[hideTooltipId];\n }\n }\n };\n\n let showTooltip = () => {\n if (closeTimeout.current) {\n clearTimeout(closeTimeout.current);\n }\n closeTimeout.current = null;\n closeOpenTooltips();\n ensureTooltipEntry();\n globalWarmedUp = true;\n open();\n if (globalWarmUpTimeout) {\n clearTimeout(globalWarmUpTimeout);\n globalWarmUpTimeout = null;\n }\n if (globalCooldownTimeout) {\n clearTimeout(globalCooldownTimeout);\n globalCooldownTimeout = null;\n }\n };\n\n let hideTooltip = (immediate?: boolean) => {\n if (immediate || closeDelay <= 0) {\n if (closeTimeout.current) {\n clearTimeout(closeTimeout.current);\n }\n closeTimeout.current = null;\n closeCallback.current();\n } else if (!closeTimeout.current) {\n closeTimeout.current = setTimeout(() => {\n closeTimeout.current = null;\n closeCallback.current();\n }, closeDelay);\n }\n\n if (globalWarmUpTimeout) {\n clearTimeout(globalWarmUpTimeout);\n globalWarmUpTimeout = null;\n }\n if (globalWarmedUp) {\n if (globalCooldownTimeout) {\n clearTimeout(globalCooldownTimeout);\n }\n globalCooldownTimeout = setTimeout(() => {\n delete tooltips[id];\n globalCooldownTimeout = null;\n globalWarmedUp = false;\n }, Math.max(TOOLTIP_COOLDOWN, closeDelay));\n }\n };\n\n let warmupTooltip = () => {\n closeOpenTooltips();\n ensureTooltipEntry();\n if (!isOpen && !globalWarmedUp) {\n if (globalWarmUpTimeout) {\n clearTimeout(globalWarmUpTimeout);\n }\n\n globalWarmUpTimeout = setTimeout(() => {\n globalWarmUpTimeout = null;\n globalWarmedUp = true;\n showTooltip();\n }, delay);\n } else if (!isOpen) {\n showTooltip();\n }\n };\n\n useEffect(() => {\n closeCallback.current = close;\n }, [close]);\n\n\n useEffect(() => {\n return () => {\n if (closeTimeout.current) {\n clearTimeout(closeTimeout.current);\n }\n let tooltip = tooltips[id];\n if (tooltip) {\n delete tooltips[id];\n }\n };\n }, [id]);\n\n return {\n isOpen,\n open: (immediate) => {\n if (!immediate && delay > 0 && !closeTimeout.current) {\n warmupTooltip();\n } else {\n showTooltip();\n }\n },\n close: hideTooltip\n };\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {Collection, Key, Node} from '@react-types/shared';\n\nexport class TreeCollection<T> implements Collection<Node<T>> {\n private keyMap: Map<Key, Node<T>> = new Map();\n private iterable: Iterable<Node<T>>;\n private firstKey: Key | null = null;\n private lastKey: Key | null = null;\n\n constructor(nodes: Iterable<Node<T>>, {expandedKeys}: {expandedKeys?: Set<Key>} = {}) {\n this.iterable = nodes;\n expandedKeys = expandedKeys || new Set();\n\n let visit = (node: Node<T>) => {\n this.keyMap.set(node.key, node);\n\n if (node.childNodes && (node.type === 'section' || expandedKeys.has(node.key))) {\n for (let child of node.childNodes) {\n visit(child);\n }\n }\n };\n\n for (let node of nodes) {\n visit(node);\n }\n\n let last: Node<T> | null = null;\n let index = 0;\n for (let [key, node] of this.keyMap) {\n if (last) {\n last.nextKey = key;\n node.prevKey = last.key;\n } else {\n this.firstKey = key;\n node.prevKey = undefined;\n }\n\n if (node.type === 'item') {\n node.index = index++;\n }\n\n last = node;\n\n // Set nextKey as undefined since this might be the last node\n // If it isn't the last node, last.nextKey will properly set at start of new loop\n last.nextKey = undefined;\n }\n\n this.lastKey = last?.key ?? null;\n }\n\n *[Symbol.iterator](): IterableIterator<Node<T>> {\n yield* this.iterable;\n }\n\n get size(): number {\n return this.keyMap.size;\n }\n\n getKeys(): IterableIterator<Key> {\n return this.keyMap.keys();\n }\n\n getKeyBefore(key: Key): Key | null {\n let node = this.keyMap.get(key);\n return node ? node.prevKey ?? null : null;\n }\n\n getKeyAfter(key: Key): Key | null {\n let node = this.keyMap.get(key);\n return node ? node.nextKey ?? null : null;\n }\n\n getFirstKey(): Key | null {\n return this.firstKey;\n }\n\n getLastKey(): Key | null {\n return this.lastKey;\n }\n\n getItem(key: Key): Node<T> | null {\n return this.keyMap.get(key) ?? null;\n }\n\n at(idx: number): Node<T> | null {\n const keys = [...this.getKeys()];\n return this.getItem(keys[idx]);\n }\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {\n Collection,\n CollectionStateBase,\n DisabledBehavior,\n Expandable,\n Key,\n MultipleSelection,\n Node\n} from '@react-types/shared';\nimport {SelectionManager} from '../selection/SelectionManager';\nimport {TreeCollection} from './TreeCollection';\nimport {useCallback, useEffect, useMemo} from 'react';\nimport {useCollection} from '../collections/useCollection';\nimport {useControlledState} from '../utils/useControlledState';\nimport {useMultipleSelectionState} from '../selection/useMultipleSelectionState';\n\nexport interface TreeProps<T>\n extends CollectionStateBase<T>,\n Expandable,\n MultipleSelection {\n /** Whether `disabledKeys` applies to all interactions, or only selection. */\n disabledBehavior?: DisabledBehavior\n}\nexport interface TreeState<T> {\n /** A collection of items in the tree. */\n readonly collection: Collection<Node<T>>,\n\n /** A set of keys for items that are disabled. */\n readonly disabledKeys: Set<Key>,\n\n /** A set of keys for items that are expanded. */\n readonly expandedKeys: Set<Key>,\n\n /** Toggles the expanded state for an item by its key. */\n toggleKey(key: Key): void,\n\n /** Replaces the set of expanded keys. */\n setExpandedKeys(keys: Set<Key>): void,\n\n /** A selection manager to read and update multiple selection state. */\n readonly selectionManager: SelectionManager\n}\n\n/**\n * Provides state management for tree-like components. Handles building a collection\n * of items from props, item expanded state, and manages multiple selection state.\n */\nexport function useTreeState<T extends object>(props: TreeProps<T>): TreeState<T> {\n let {\n onExpandedChange\n } = props;\n\n let [expandedKeys, setExpandedKeys] = useControlledState(\n props.expandedKeys ? new Set(props.expandedKeys) : undefined,\n props.defaultExpandedKeys ? new Set(props.defaultExpandedKeys) : new Set(),\n onExpandedChange\n );\n\n let selectionState = useMultipleSelectionState(props);\n let disabledKeys = useMemo(() =>\n props.disabledKeys ? new Set(props.disabledKeys) : new Set<Key>()\n , [props.disabledKeys]);\n\n let tree = useCollection(props, useCallback(nodes => new TreeCollection(nodes, {expandedKeys}), [expandedKeys]), null);\n\n // Reset focused key if that item is deleted from the collection.\n useEffect(() => {\n if (selectionState.focusedKey != null && !tree.getItem(selectionState.focusedKey)) {\n selectionState.setFocusedKey(null);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [tree, selectionState.focusedKey]);\n\n let onToggle = (key: Key) => {\n setExpandedKeys(toggleKey(expandedKeys, key));\n };\n\n return {\n collection: tree,\n expandedKeys,\n disabledKeys,\n toggleKey: onToggle,\n setExpandedKeys,\n selectionManager: new SelectionManager(tree, selectionState)\n };\n}\n\nfunction toggleKey(set: Set<Key>, key: Key): Set<Key> {\n let res = new Set(set);\n if (res.has(key)) {\n res.delete(key);\n } else {\n res.add(key);\n }\n\n return res;\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface ChatBubbleProps {\n variant?: \"user\" | \"bot\" | \"system\";\n author?: ReactNode;\n timestamp?: ReactNode;\n avatar?: ReactNode;\n initial?: ReactNode;\n hideAvatar?: boolean;\n children: ReactNode;\n className?: string;\n}\n\nexport function ChatBubble({\n variant = \"bot\",\n author,\n timestamp,\n avatar,\n initial,\n hideAvatar = false,\n children,\n className,\n}: ChatBubbleProps) {\n const isUser = variant === \"user\";\n return (\n <div className={cn(\"ods-chat\", `ods-chat--${variant}`, className)}>\n {!hideAvatar && (\n <div className=\"ods-chat__avatar\" aria-hidden=\"true\">\n {avatar ?? (\n <span>\n {initial ?? (typeof author === \"string\" ? author.charAt(0).toUpperCase() : isUser ? \"U\" : \"AI\")}\n </span>\n )}\n </div>\n )}\n <div className=\"ods-chat__bubble\">\n <div className=\"ods-chat__body\">{children}</div>\n {(author || timestamp) && (\n <div className=\"ods-chat__meta\">\n {author && <span className=\"ods-chat__author\">{author}</span>}\n {timestamp && <span className=\"ods-chat__time\">{timestamp}</span>}\n </div>\n )}\n </div>\n </div>\n );\n}\n","\"use client\";\nimport {\n type ReactNode,\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"../../utils/cn\";\n\nexport type HoverCardPlacement = \"top\" | \"bottom\" | \"left\" | \"right\";\n\nexport interface HoverCardProps {\n content: ReactNode;\n placement?: HoverCardPlacement;\n offset?: number;\n openDelay?: number; // ms before it opens on hover\n closeDelay?: number; // ms before it closes when mouse leaves\n children: ReactNode;\n className?: string;\n}\n\ninterface Coords { top: number; left: number; }\n\nfunction computePosition(rect: DOMRect, panelRect: DOMRect, placement: HoverCardPlacement, offset: number): Coords {\n const cx = rect.left + rect.width / 2;\n const cy = rect.top + rect.height / 2;\n switch (placement) {\n case \"top\": return { top: rect.top - panelRect.height - offset, left: cx - panelRect.width / 2 };\n case \"bottom\": return { top: rect.bottom + offset, left: cx - panelRect.width / 2 };\n case \"left\": return { top: cy - panelRect.height / 2, left: rect.left - panelRect.width - offset };\n case \"right\": return { top: cy - panelRect.height / 2, left: rect.right + offset };\n }\n}\n\nexport function HoverCard({\n content,\n placement = \"bottom\",\n offset = 8,\n openDelay = 300,\n closeDelay = 180,\n children,\n className,\n}: HoverCardProps) {\n const [open, setOpen] = useState(false);\n const triggerRef = useRef<HTMLSpanElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const openTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const closeTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const [coords, setCoords] = useState<Coords | null>(null);\n\n const clearTimers = () => {\n if (openTimer.current) { clearTimeout(openTimer.current); openTimer.current = null; }\n if (closeTimer.current) { clearTimeout(closeTimer.current); closeTimer.current = null; }\n };\n useEffect(() => () => clearTimers(), []);\n\n const show = () => {\n clearTimers();\n openTimer.current = setTimeout(() => setOpen(true), openDelay);\n };\n const hide = () => {\n clearTimers();\n closeTimer.current = setTimeout(() => setOpen(false), closeDelay);\n };\n\n const reposition = useCallback(() => {\n if (!triggerRef.current || !panelRef.current) return;\n const trigRect = triggerRef.current.getBoundingClientRect();\n const panelRect = panelRef.current.getBoundingClientRect();\n setCoords(computePosition(trigRect, panelRect, placement, offset));\n }, [placement, offset]);\n\n useLayoutEffect(() => {\n if (!open) return;\n reposition();\n const id = requestAnimationFrame(reposition);\n return () => cancelAnimationFrame(id);\n }, [open, reposition]);\n\n useEffect(() => {\n if (!open) return;\n const h = () => reposition();\n window.addEventListener(\"scroll\", h, true);\n window.addEventListener(\"resize\", h);\n return () => { window.removeEventListener(\"scroll\", h, true); window.removeEventListener(\"resize\", h); };\n }, [open, reposition]);\n\n // Wrapper span anchors the hover card — works even if the child component\n // (e.g. our Button) doesn't forward refs.\n const triggerEl = (\n <span\n ref={triggerRef}\n className=\"ods-hover-card__anchor\"\n onMouseEnter={show}\n onMouseLeave={hide}\n onFocusCapture={show}\n onBlurCapture={hide}\n >\n {children}\n </span>\n );\n\n const portal =\n typeof document !== \"undefined\" && open\n ? createPortal(\n <div\n ref={panelRef}\n role=\"tooltip\"\n data-placement={placement}\n className={cn(\"ods-hover-card\", className)}\n onMouseEnter={show}\n onMouseLeave={hide}\n style={{\n position: \"fixed\",\n zIndex: 1000,\n top: coords?.top ?? -9999,\n left: coords?.left ?? -9999,\n visibility: coords ? \"visible\" : \"hidden\",\n }}\n >\n {content}\n </div>,\n document.body,\n )\n : null;\n\n return (\n <>\n {triggerEl}\n {portal}\n </>\n );\n}\n","\"use client\";\nimport {\n type ReactNode,\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"../../utils/cn\";\n\nexport type PopoverPlacement = \"top\" | \"bottom\" | \"left\" | \"right\";\n\nexport interface PopoverProps {\n content: ReactNode;\n placement?: PopoverPlacement;\n offset?: number;\n open?: boolean; // controlled\n defaultOpen?: boolean; // uncontrolled\n onOpenChange?: (open: boolean) => void;\n trigger?: \"click\" | \"manual\";\n closeOnClickOutside?: boolean;\n closeOnEsc?: boolean;\n arrow?: boolean;\n children: ReactNode;\n className?: string;\n}\n\ninterface Coords { top: number; left: number; }\n\nfunction computePosition(rect: DOMRect, popRect: DOMRect, placement: PopoverPlacement, offset: number): Coords {\n const cx = rect.left + rect.width / 2;\n const cy = rect.top + rect.height / 2;\n switch (placement) {\n case \"top\": return { top: rect.top - popRect.height - offset, left: cx - popRect.width / 2 };\n case \"bottom\": return { top: rect.bottom + offset, left: cx - popRect.width / 2 };\n case \"left\": return { top: cy - popRect.height / 2, left: rect.left - popRect.width - offset };\n case \"right\": return { top: cy - popRect.height / 2, left: rect.right + offset };\n }\n}\n\nexport function Popover({\n content,\n placement = \"bottom\",\n offset = 8,\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n trigger = \"click\",\n closeOnClickOutside = true,\n closeOnEsc = true,\n arrow = true,\n children,\n className,\n}: PopoverProps) {\n const [openState, setOpenState] = useState(defaultOpen);\n const open = openProp ?? openState;\n const setOpen = useCallback((v: boolean) => {\n if (openProp === undefined) setOpenState(v);\n onOpenChange?.(v);\n }, [openProp, onOpenChange]);\n\n const triggerRef = useRef<HTMLSpanElement>(null);\n const popRef = useRef<HTMLDivElement>(null);\n const [coords, setCoords] = useState<Coords | null>(null);\n\n const reposition = useCallback(() => {\n if (!triggerRef.current || !popRef.current) return;\n const trigRect = triggerRef.current.getBoundingClientRect();\n const popRect = popRef.current.getBoundingClientRect();\n setCoords(computePosition(trigRect, popRect, placement, offset));\n }, [placement, offset]);\n\n useLayoutEffect(() => {\n if (!open) return;\n reposition();\n const id = requestAnimationFrame(reposition);\n return () => cancelAnimationFrame(id);\n }, [open, reposition, content]);\n\n useEffect(() => {\n if (!open) return;\n const onScroll = () => reposition();\n window.addEventListener(\"scroll\", onScroll, true);\n window.addEventListener(\"resize\", onScroll);\n return () => {\n window.removeEventListener(\"scroll\", onScroll, true);\n window.removeEventListener(\"resize\", onScroll);\n };\n }, [open, reposition]);\n\n useEffect(() => {\n if (!open || !closeOnClickOutside) return;\n const onDoc = (e: MouseEvent) => {\n const t = e.target as Node;\n if (!triggerRef.current?.contains(t) && !popRef.current?.contains(t)) {\n setOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", onDoc);\n return () => document.removeEventListener(\"mousedown\", onDoc);\n }, [open, closeOnClickOutside, setOpen]);\n\n useEffect(() => {\n if (!open || !closeOnEsc) return;\n const onKey = (e: KeyboardEvent) => { if (e.key === \"Escape\") setOpen(false); };\n document.addEventListener(\"keydown\", onKey);\n return () => document.removeEventListener(\"keydown\", onKey);\n }, [open, closeOnEsc, setOpen]);\n\n // Wrapper span anchors the popover — works regardless of whether the\n // child component forwards refs (e.g. our Button doesn't).\n const triggerEl = (\n <span\n ref={triggerRef}\n className=\"ods-popover__anchor\"\n onClickCapture={() => {\n if (trigger === \"click\") setOpen(!open);\n }}\n aria-expanded={open}\n aria-haspopup=\"dialog\"\n >\n {children}\n </span>\n );\n\n const portal =\n typeof document !== \"undefined\" && open\n ? createPortal(\n <div\n ref={popRef}\n role=\"dialog\"\n data-placement={placement}\n className={cn(\"ods-popover\", className)}\n style={{\n position: \"fixed\",\n zIndex: 1000,\n top: coords?.top ?? -9999,\n left: coords?.left ?? -9999,\n visibility: coords ? \"visible\" : \"hidden\",\n }}\n >\n {content}\n {arrow && <span className=\"ods-popover__arrow\" aria-hidden=\"true\" />}\n </div>,\n document.body,\n )\n : null;\n\n return (\n <>\n {triggerEl}\n {portal}\n </>\n );\n}\n","\"use client\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport { type ReactNode, useEffect } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"../../utils/cn\";\n\nexport type SheetSide = \"top\" | \"right\" | \"bottom\" | \"left\";\n\nexport interface SheetProps {\n open: boolean;\n onClose: () => void;\n side?: SheetSide;\n size?: \"sm\" | \"md\" | \"lg\" | \"full\" | number | string;\n title?: ReactNode;\n description?: ReactNode;\n children?: ReactNode;\n footer?: ReactNode;\n closeOnOverlayClick?: boolean;\n closeOnEsc?: boolean;\n dragHandle?: boolean; // render the notch at the top (bottom/top sheets)\n className?: string;\n}\n\nconst slideVariants: Record<SheetSide, { initial: any; animate: any; exit: any }> = {\n top: { initial: { y: \"-100%\" }, animate: { y: 0 }, exit: { y: \"-100%\" } },\n bottom: { initial: { y: \"100%\" }, animate: { y: 0 }, exit: { y: \"100%\" } },\n left: { initial: { x: \"-100%\" }, animate: { x: 0 }, exit: { x: \"-100%\" } },\n right: { initial: { x: \"100%\" }, animate: { x: 0 }, exit: { x: \"100%\" } },\n};\n\nfunction resolveSize(side: SheetSide, size: SheetProps[\"size\"]): string {\n const isVertical = side === \"left\" || side === \"right\";\n if (size === \"full\") return isVertical ? \"100vw\" : \"100vh\";\n if (typeof size === \"number\") return `${size}px`;\n if (typeof size === \"string\") return size;\n const scale = { sm: isVertical ? 320 : 240, md: isVertical ? 420 : 360, lg: isVertical ? 560 : 480 };\n return `${scale[size ?? \"md\"]}px`;\n}\n\nexport function Sheet({\n open,\n onClose,\n side = \"bottom\",\n size = \"md\",\n title,\n description,\n children,\n footer,\n closeOnOverlayClick = true,\n closeOnEsc = true,\n dragHandle = true,\n className,\n}: SheetProps) {\n useEffect(() => {\n if (!open || !closeOnEsc) return;\n const onKey = (e: KeyboardEvent) => { if (e.key === \"Escape\") onClose(); };\n document.addEventListener(\"keydown\", onKey);\n return () => document.removeEventListener(\"keydown\", onKey);\n }, [open, closeOnEsc, onClose]);\n\n const variant = slideVariants[side];\n const resolved = resolveSize(side, size);\n const isVertical = side === \"left\" || side === \"right\";\n\n const content = (\n <AnimatePresence>\n {open && (\n <>\n <motion.div\n className=\"ods-sheet__backdrop\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.18 }}\n onClick={closeOnOverlayClick ? onClose : undefined}\n aria-hidden=\"true\"\n />\n <motion.div\n className={cn(\"ods-sheet\", `ods-sheet--${side}`, className)}\n style={isVertical ? { width: resolved } : { height: resolved }}\n role=\"dialog\"\n aria-modal=\"true\"\n initial={variant.initial}\n animate={variant.animate}\n exit={variant.exit}\n transition={{ type: \"tween\", ease: [0.32, 0.72, 0, 1], duration: 0.28 }}\n >\n {(side === \"bottom\" || side === \"top\") && dragHandle && (\n <div className=\"ods-sheet__handle\" aria-hidden=\"true\" />\n )}\n {(title || description) && (\n <header className=\"ods-sheet__head\">\n {title && <h2 className=\"ods-sheet__title\">{title}</h2>}\n {description && <p className=\"ods-sheet__desc\">{description}</p>}\n </header>\n )}\n <div className=\"ods-sheet__body\">{children}</div>\n {footer && <footer className=\"ods-sheet__footer\">{footer}</footer>}\n </motion.div>\n </>\n )}\n </AnimatePresence>\n );\n\n if (typeof document === \"undefined\") return null;\n return createPortal(content, document.body);\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface ChipProps {\n variant?: \"default\" | \"primary\" | \"success\" | \"warning\" | \"error\";\n size?: \"sm\" | \"md\";\n avatar?: ReactNode;\n icon?: ReactNode;\n removable?: boolean;\n onRemove?: () => void;\n onClick?: () => void;\n disabled?: boolean;\n children: ReactNode;\n className?: string;\n}\n\nexport function Chip({\n variant = \"default\",\n size = \"md\",\n avatar,\n icon,\n removable = false,\n onRemove,\n onClick,\n disabled = false,\n children,\n className,\n}: ChipProps) {\n const interactive = Boolean(onClick) && !disabled;\n return (\n <span\n className={cn(\n \"ods-chip\",\n `ods-chip--${variant}`,\n `ods-chip--${size}`,\n avatar && \"ods-chip--avatar\",\n interactive && \"ods-chip--interactive\",\n disabled && \"ods-chip--disabled\",\n className,\n )}\n onClick={interactive ? onClick : undefined}\n role={interactive ? \"button\" : undefined}\n tabIndex={interactive ? 0 : undefined}\n >\n {avatar && <span className=\"ods-chip__avatar\">{avatar}</span>}\n {icon && !avatar && <span className=\"ods-chip__icon\" aria-hidden=\"true\">{icon}</span>}\n <span className=\"ods-chip__label\">{children}</span>\n {removable && (\n <button\n type=\"button\"\n className=\"ods-chip__remove\"\n onClick={(e) => {\n e.stopPropagation();\n onRemove?.();\n }}\n aria-label=\"Remove\"\n disabled={disabled}\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M3 3L9 9M9 3L3 9\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n )}\n </span>\n );\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface ChoiceCardProps {\n icon?: ReactNode;\n title: ReactNode;\n description?: ReactNode;\n selected?: boolean;\n disabled?: boolean;\n badge?: ReactNode;\n onClick?: () => void;\n className?: string;\n}\n\nexport function ChoiceCard({ icon, title, description, selected = false, disabled = false, badge, onClick, className }: ChoiceCardProps) {\n return (\n <button\n type=\"button\"\n role=\"radio\"\n aria-checked={selected}\n disabled={disabled}\n onClick={onClick}\n className={cn(\n \"ods-choice-card\",\n selected && \"ods-choice-card--selected\",\n disabled && \"ods-choice-card--disabled\",\n className,\n )}\n >\n <div className=\"ods-choice-card__head\">\n {icon && <span className=\"ods-choice-card__icon\">{icon}</span>}\n {badge ? (\n <span className=\"ods-choice-card__badge\">{badge}</span>\n ) : (\n <span className={cn(\"ods-choice-card__check\", selected && \"ods-choice-card__check--on\")}>\n {selected && (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"m3 7.5 3 3 5-6\" stroke=\"currentColor\" strokeWidth=\"1.7\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n )}\n </span>\n )}\n </div>\n <div className=\"ods-choice-card__title\">{title}</div>\n {description && <div className=\"ods-choice-card__desc\">{description}</div>}\n </button>\n );\n}\n","\"use client\";\nimport { type ChangeEvent, type ReactNode, useState } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface ColorPickerProps {\n label?: ReactNode;\n value: string;\n onChange?: (value: string) => void;\n swatches?: string[];\n showHex?: boolean;\n showPicker?: boolean;\n size?: \"sm\" | \"md\" | \"lg\";\n disabled?: boolean;\n className?: string;\n}\n\nconst DEFAULT_SWATCHES = [\n \"#ef4444\", \"#f59e0b\", \"#22c55e\", \"#0ea5e9\",\n \"#6366f1\", \"#8b5cf6\", \"#ec4899\", \"#1e1b4b\",\n];\n\nfunction isValidHex(v: string): boolean {\n return /^#([0-9a-f]{3}|[0-9a-f]{6})$/i.test(v);\n}\n\nexport function ColorPicker({\n label,\n value,\n onChange,\n swatches = DEFAULT_SWATCHES,\n showHex = true,\n showPicker = true,\n size = \"md\",\n disabled = false,\n className,\n}: ColorPickerProps) {\n const [hex, setHex] = useState(value);\n\n const commit = (v: string) => {\n setHex(v);\n if (isValidHex(v)) onChange?.(v);\n };\n\n const onHexChange = (e: ChangeEvent<HTMLInputElement>) => {\n let v = e.target.value;\n if (v && !v.startsWith(\"#\")) v = `#${v}`;\n commit(v);\n };\n\n const onNativeChange = (e: ChangeEvent<HTMLInputElement>) => {\n commit(e.target.value);\n };\n\n return (\n <div\n className={cn(\n \"ods-color\",\n `ods-color--${size}`,\n disabled && \"ods-color--disabled\",\n className,\n )}\n >\n {label && <label className=\"ods-color__label\">{label}</label>}\n <div className=\"ods-color__field\">\n <span className=\"ods-color__swatch\" style={{ background: value }} />\n {showHex && (\n <input\n type=\"text\"\n className=\"ods-color__hex\"\n value={hex.toUpperCase()}\n onChange={onHexChange}\n onBlur={() => isValidHex(hex) ? null : setHex(value)}\n disabled={disabled}\n spellCheck={false}\n />\n )}\n {showPicker && (\n <label className=\"ods-color__pick\" aria-label=\"Open native color picker\">\n <input\n type=\"color\"\n value={isValidHex(value) ? value : \"#000000\"}\n onChange={onNativeChange}\n disabled={disabled}\n tabIndex={-1}\n />\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M3 11l8-8M9 1l4 4-2 2-4-4 2-2zM3 11v2h2\" stroke=\"currentColor\" strokeWidth=\"1.4\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </label>\n )}\n </div>\n {swatches.length > 0 && (\n <div className=\"ods-color__swatches\" role=\"radiogroup\" aria-label=\"Preset colors\">\n {swatches.map((c) => {\n const active = c.toLowerCase() === value.toLowerCase();\n return (\n <button\n key={c}\n type=\"button\"\n role=\"radio\"\n aria-checked={active}\n aria-label={c}\n className={cn(\"ods-color__sw\", active && \"ods-color__sw--active\")}\n style={{ background: c }}\n onClick={() => !disabled && commit(c)}\n disabled={disabled}\n />\n );\n })}\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\nimport {\n type KeyboardEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface ConditionField {\n value: string;\n label: string;\n icon?: ReactNode;\n description?: string;\n}\n\nexport interface ConditionOperator {\n value: string;\n label: string;\n symbol?: string; // e.g. \"=\", \"≠\", \">\", \"<=\"\n description?: string;\n}\n\nexport interface Condition {\n field: string;\n operator: string;\n value: string;\n}\n\nexport interface ConditionGroup {\n type: \"group\";\n joinOperator: \"AND\" | \"OR\";\n conditions: (Condition | ConditionGroup)[];\n}\n\nexport interface ConditionBuilderProps {\n conditions: Condition[];\n onChange: (conditions: Condition[]) => void;\n fields: ConditionField[];\n operators: ConditionOperator[];\n /** Auto-enables search above 8 options. Force on/off via boolean. */\n searchable?: boolean;\n allowGroups?: boolean;\n joinOperator?: \"AND\" | \"OR\";\n onJoinChange?: (join: \"AND\" | \"OR\") => void;\n className?: string;\n}\n\ninterface DropdownOption {\n value: string;\n label: string;\n icon?: ReactNode;\n symbol?: string;\n description?: string;\n}\n\ninterface OptionDropdownProps {\n value: string;\n options: DropdownOption[];\n onChange: (value: string) => void;\n placeholder?: string;\n searchable?: boolean | \"auto\";\n ariaLabel: string;\n minWidth?: number;\n}\n\nfunction OptionDropdown({\n value,\n options,\n onChange,\n placeholder = \"Select…\",\n searchable = \"auto\",\n ariaLabel,\n minWidth = 140,\n}: OptionDropdownProps) {\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState(\"\");\n const [activeIdx, setActiveIdx] = useState(0);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const listboxId = useId();\n\n const showSearch = searchable === true || (searchable === \"auto\" && options.length > 8);\n\n const selected = options.find((o) => o.value === value);\n\n const filtered = useMemo(() => {\n if (!showSearch || !query.trim()) return options;\n const q = query.trim().toLowerCase();\n return options.filter(\n (o) =>\n o.label.toLowerCase().includes(q) ||\n o.value.toLowerCase().includes(q) ||\n o.description?.toLowerCase().includes(q),\n );\n }, [options, query, showSearch]);\n\n // Reset active index when filter changes\n useEffect(() => {\n setActiveIdx(0);\n }, [query, open]);\n\n // Click outside closes\n useEffect(() => {\n if (!open) return;\n const onDoc = (e: MouseEvent) => {\n const t = e.target as Node;\n if (\n !triggerRef.current?.contains(t) &&\n !panelRef.current?.contains(t)\n ) {\n setOpen(false);\n setQuery(\"\");\n }\n };\n document.addEventListener(\"mousedown\", onDoc);\n return () => document.removeEventListener(\"mousedown\", onDoc);\n }, [open]);\n\n // Focus search input when opened with searchable\n useEffect(() => {\n if (open && showSearch) {\n requestAnimationFrame(() => inputRef.current?.focus());\n }\n }, [open, showSearch]);\n\n const select = (v: string) => {\n onChange(v);\n setOpen(false);\n setQuery(\"\");\n triggerRef.current?.focus();\n };\n\n const handleKey = (e: KeyboardEvent) => {\n if (!open) {\n if (e.key === \"Enter\" || e.key === \" \" || e.key === \"ArrowDown\") {\n e.preventDefault();\n setOpen(true);\n }\n return;\n }\n if (e.key === \"Escape\") {\n e.preventDefault();\n setOpen(false);\n setQuery(\"\");\n triggerRef.current?.focus();\n } else if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setActiveIdx((i) => Math.min(filtered.length - 1, i + 1));\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setActiveIdx((i) => Math.max(0, i - 1));\n } else if (e.key === \"Enter\") {\n e.preventDefault();\n const opt = filtered[activeIdx];\n if (opt) select(opt.value);\n } else if (e.key === \"Home\") {\n e.preventDefault();\n setActiveIdx(0);\n } else if (e.key === \"End\") {\n e.preventDefault();\n setActiveIdx(filtered.length - 1);\n }\n };\n\n return (\n <div className=\"ods-cb-dd\" style={{ minWidth }} onKeyDown={handleKey}>\n <button\n ref={triggerRef}\n type=\"button\"\n className={cn(\"ods-cb-dd__trigger\", open && \"ods-cb-dd__trigger--open\")}\n onClick={() => setOpen((o) => !o)}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-controls={open ? listboxId : undefined}\n aria-label={ariaLabel}\n >\n {selected?.icon && <span className=\"ods-cb-dd__icon\" aria-hidden=\"true\">{selected.icon}</span>}\n {selected?.symbol && <span className=\"ods-cb-dd__symbol\">{selected.symbol}</span>}\n <span className={cn(\"ods-cb-dd__label\", !selected && \"ods-cb-dd__label--placeholder\")}>\n {selected?.label ?? placeholder}\n </span>\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\" className=\"ods-cb-dd__chev\">\n <path d=\"M3 4.5 6 7.5 9 4.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n {open && (\n <div ref={panelRef} className=\"ods-cb-dd__panel\" role=\"presentation\">\n {showSearch && (\n <div className=\"ods-cb-dd__search\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"6\" cy=\"6\" r=\"4.5\" stroke=\"currentColor\" strokeWidth=\"1.4\" />\n <path d=\"m12 12-2.5-2.5\" stroke=\"currentColor\" strokeWidth=\"1.4\" strokeLinecap=\"round\" />\n </svg>\n <input\n ref={inputRef}\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder=\"Search…\"\n aria-label=\"Search options\"\n />\n </div>\n )}\n <ul\n id={listboxId}\n role=\"listbox\"\n aria-label={ariaLabel}\n className=\"ods-cb-dd__list\"\n >\n {filtered.length === 0 && (\n <li className=\"ods-cb-dd__empty\">No matches</li>\n )}\n {filtered.map((opt, idx) => (\n <li key={opt.value}>\n <button\n type=\"button\"\n role=\"option\"\n aria-selected={opt.value === value}\n className={cn(\n \"ods-cb-dd__opt\",\n opt.value === value && \"ods-cb-dd__opt--selected\",\n idx === activeIdx && \"ods-cb-dd__opt--active\",\n )}\n onClick={() => select(opt.value)}\n onMouseEnter={() => setActiveIdx(idx)}\n >\n {opt.icon && <span className=\"ods-cb-dd__opt-icon\" aria-hidden=\"true\">{opt.icon}</span>}\n {opt.symbol && <span className=\"ods-cb-dd__opt-symbol\">{opt.symbol}</span>}\n <span className=\"ods-cb-dd__opt-text\">\n <span className=\"ods-cb-dd__opt-label\">{opt.label}</span>\n {opt.description && <span className=\"ods-cb-dd__opt-desc\">{opt.description}</span>}\n </span>\n {opt.value === value && (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\" className=\"ods-cb-dd__opt-check\">\n <path d=\"m3 7.5 3 3 5-6\" stroke=\"currentColor\" strokeWidth=\"1.7\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n )}\n </button>\n </li>\n ))}\n </ul>\n </div>\n )}\n </div>\n );\n}\n\nexport function ConditionBuilder({\n conditions,\n onChange,\n fields,\n operators,\n searchable,\n joinOperator = \"AND\",\n onJoinChange,\n className,\n}: ConditionBuilderProps) {\n const handleFieldChange = useCallback(\n (index: number, field: string) => {\n const next = [...conditions];\n next[index] = { ...next[index], field };\n onChange(next);\n },\n [conditions, onChange],\n );\n\n const handleOperatorChange = useCallback(\n (index: number, operator: string) => {\n const next = [...conditions];\n next[index] = { ...next[index], operator };\n onChange(next);\n },\n [conditions, onChange],\n );\n\n const handleValueChange = useCallback(\n (index: number, value: string) => {\n const next = [...conditions];\n next[index] = { ...next[index], value };\n onChange(next);\n },\n [conditions, onChange],\n );\n\n const handleRemove = useCallback(\n (index: number) => {\n onChange(conditions.filter((_, i) => i !== index));\n },\n [conditions, onChange],\n );\n\n const handleAdd = useCallback(() => {\n onChange([\n ...conditions,\n { field: fields[0]?.value ?? \"\", operator: operators[0]?.value ?? \"\", value: \"\" },\n ]);\n }, [conditions, onChange, fields, operators]);\n\n const handleJoinToggle = useCallback(() => {\n if (onJoinChange) onJoinChange(joinOperator === \"AND\" ? \"OR\" : \"AND\");\n }, [joinOperator, onJoinChange]);\n\n return (\n <div className={cn(\"ods-condition-builder\", className)}>\n {conditions.map((condition, index) => (\n <div key={index}>\n {index > 0 && (\n <div className=\"ods-condition-builder__join\">\n <button\n type=\"button\"\n className={cn(\n \"ods-condition-builder__join-btn\",\n onJoinChange && \"ods-condition-builder__join-btn--clickable\",\n )}\n onClick={onJoinChange ? handleJoinToggle : undefined}\n aria-label={`Join operator: ${joinOperator}.${onJoinChange ? \" Click to toggle.\" : \"\"}`}\n >\n {joinOperator}\n </button>\n </div>\n )}\n <div className=\"ods-condition-row\">\n <OptionDropdown\n ariaLabel=\"Field\"\n value={condition.field}\n options={fields}\n onChange={(v) => handleFieldChange(index, v)}\n searchable={typeof searchable === \"boolean\" ? searchable : \"auto\"}\n minWidth={160}\n />\n <OptionDropdown\n ariaLabel=\"Operator\"\n value={condition.operator}\n options={operators}\n onChange={(v) => handleOperatorChange(index, v)}\n searchable={typeof searchable === \"boolean\" ? searchable : \"auto\"}\n minWidth={140}\n />\n <input\n type=\"text\"\n className=\"ods-condition-row__value\"\n value={condition.value}\n onChange={(e) => handleValueChange(index, e.target.value)}\n placeholder=\"Value\"\n aria-label=\"Value\"\n />\n <button\n type=\"button\"\n className=\"ods-condition-row__remove\"\n onClick={() => handleRemove(index)}\n aria-label=\"Remove condition\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path\n fillRule=\"evenodd\"\n d=\"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </button>\n </div>\n </div>\n ))}\n <div className=\"ods-condition-builder__actions\">\n <button type=\"button\" className=\"ods-condition-builder__add\" onClick={handleAdd}>\n + Add condition\n </button>\n </div>\n </div>\n );\n}\n","\"use client\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport { type ReactNode, useRef } from \"react\";\nimport { useButton } from \"react-aria\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface ConfigPanelProps {\n open?: boolean;\n onClose?: () => void;\n title?: string;\n icon?: ReactNode;\n children?: ReactNode;\n onSave?: () => void;\n onCancel?: () => void;\n className?: string;\n}\n\nexport function ConfigPanel({\n open = false,\n onClose,\n title = \"Configure\",\n icon,\n children,\n onSave,\n onCancel,\n className,\n}: ConfigPanelProps) {\n const closeRef = useRef<HTMLButtonElement>(null);\n const saveRef = useRef<HTMLButtonElement>(null);\n const cancelRef = useRef<HTMLButtonElement>(null);\n\n const { buttonProps: closeProps } = useButton(\n { onPress: onClose, \"aria-label\": \"Close panel\" },\n closeRef,\n );\n const { buttonProps: saveProps } = useButton({ onPress: onSave }, saveRef);\n const { buttonProps: cancelProps } = useButton({ onPress: onCancel || onClose }, cancelRef);\n\n // Strip conflicting event props from react-aria before passing to DOM/motion\n const safeCloseProps = stripMotionConflicts(closeProps);\n const safeSaveProps = stripMotionConflicts(saveProps);\n const safeCancelProps = stripMotionConflicts(cancelProps);\n\n return (\n <AnimatePresence>\n {open && (\n <motion.div\n className={cn('ods-config-panel', className)}\n initial={{ x: 320, opacity: 0 }}\n animate={{ x: 0, opacity: 1 }}\n exit={{ x: 320, opacity: 0 }}\n transition={{ type: \"spring\", stiffness: 300, damping: 30 }}\n data-testid=\"config-panel\"\n role=\"dialog\"\n aria-label={title}\n >\n {/* Header */}\n <div className={'ods-config-panel__header'}>\n <div className={'ods-config-panel__header-left'}>\n {icon && <div className={'ods-config-panel__icon'}>{icon}</div>}\n <h2 className={'ods-config-panel__title'}>{title}</h2>\n </div>\n <button\n {...safeCloseProps}\n ref={closeRef}\n className={'ods-config-panel__close'}\n data-testid=\"config-panel-close\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M4.646 4.646a.5.5 0 01.708 0L8 7.293l2.646-2.647a.5.5 0 01.708.708L8.707 8l2.647 2.646a.5.5 0 01-.708.708L8 8.707l-2.646 2.647a.5.5 0 01-.708-.708L7.293 8 4.646 5.354a.5.5 0 010-.708z\" />\n </svg>\n </button>\n </div>\n\n {/* Body */}\n <div className={'ods-config-panel__body'} data-testid=\"config-panel-body\">\n {children}\n </div>\n\n {/* Footer */}\n <div className={'ods-config-panel__footer'}>\n <button\n {...safeCancelProps}\n ref={cancelRef}\n className={cn(\n 'ods-config-panel__btn',\n 'ods-config-panel__btn--cancel',\n )}\n data-testid=\"config-panel-cancel\"\n >\n Cancel\n </button>\n <button\n {...safeSaveProps}\n ref={saveRef}\n className={cn('ods-config-panel__btn', 'ods-config-panel__btn--save')}\n data-testid=\"config-panel-save\"\n >\n Save\n </button>\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n );\n}\n\n/** Strip event props that conflict with Framer Motion from React Aria's buttonProps */\nfunction stripMotionConflicts(props: Record<string, any>) {\n const { onDrag, onDragStart, onDragEnd, onAnimationStart, ...safe } = props;\n return safe;\n}\n","\"use client\";\nimport { type ReactNode, useCallback, useEffect, useRef, useState } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface DataMapperField {\n key: string;\n label: string;\n type?: string;\n children?: DataMapperField[];\n}\n\nexport interface DataMapping {\n source: string;\n target: string;\n}\n\nexport interface DataMapperProps {\n sourceFields: DataMapperField[];\n targetFields: DataMapperField[];\n mappings: DataMapping[];\n onChange: (mappings: DataMapping[]) => void;\n className?: string;\n}\n\ninterface DotPosition {\n key: string;\n x: number;\n y: number;\n}\n\nexport function DataMapper({\n sourceFields,\n targetFields,\n mappings,\n onChange,\n className,\n}: DataMapperProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const [expandedNodes, setExpandedNodes] = useState<Set<string>>(new Set());\n const [pendingSource, setPendingSource] = useState<string | null>(null);\n const [dotPositions, setDotPositions] = useState<{\n source: DotPosition[];\n target: DotPosition[];\n }>({ source: [], target: [] });\n\n const toggleExpand = useCallback((key: string) => {\n setExpandedNodes((prev) => {\n const next = new Set(prev);\n if (next.has(key)) {\n next.delete(key);\n } else {\n next.add(key);\n }\n return next;\n });\n }, []);\n\n const handleSourceDotClick = useCallback(\n (key: string) => {\n if (pendingSource === key) {\n setPendingSource(null);\n } else {\n setPendingSource(key);\n }\n },\n [pendingSource],\n );\n\n const handleTargetDotClick = useCallback(\n (key: string) => {\n if (pendingSource) {\n const exists = mappings.some((m) => m.source === pendingSource && m.target === key);\n if (!exists) {\n onChange([...mappings, { source: pendingSource, target: key }]);\n }\n setPendingSource(null);\n }\n },\n [pendingSource, mappings, onChange],\n );\n\n const handleLineClick = useCallback(\n (mapping: DataMapping) => {\n onChange(\n mappings.filter((m) => !(m.source === mapping.source && m.target === mapping.target)),\n );\n },\n [mappings, onChange],\n );\n\n // Recalculate dot positions after renders\n useEffect(() => {\n if (!containerRef.current) return;\n const container = containerRef.current;\n const containerRect = container.getBoundingClientRect();\n\n const sourceDots: DotPosition[] = [];\n const targetDots: DotPosition[] = [];\n\n container.querySelectorAll(\"[data-source-key]\").forEach((el) => {\n const rect = el.getBoundingClientRect();\n sourceDots.push({\n key: el.getAttribute(\"data-source-key\")!,\n x: rect.right - containerRect.left,\n y: rect.top + rect.height / 2 - containerRect.top,\n });\n });\n\n container.querySelectorAll(\"[data-target-key]\").forEach((el) => {\n const rect = el.getBoundingClientRect();\n targetDots.push({\n key: el.getAttribute(\"data-target-key\")!,\n x: rect.left - containerRect.left,\n y: rect.top + rect.height / 2 - containerRect.top,\n });\n });\n\n setDotPositions({ source: sourceDots, target: targetDots });\n }, []);\n\n const renderSourceTree = (fields: DataMapperField[], depth: number = 0): ReactNode => {\n return fields.map((field) => {\n const hasChildren = field.children && field.children.length > 0;\n const isExpanded = expandedNodes.has(field.key);\n const isMapped = mappings.some((m) => m.source === field.key);\n\n return (\n <div key={field.key}>\n <div\n className={cn(\n 'ods-data-mapper__field',\n isMapped && 'ods-data-mapper__field--mapped',\n pendingSource === field.key && 'ods-data-mapper__field--pending',\n )}\n style={{ paddingLeft: `${depth * 20 + 12}px` }}\n >\n {hasChildren && (\n <button\n type=\"button\"\n className={cn(\n 'ods-data-mapper__tree-toggle',\n isExpanded && 'ods-data-mapper__tree-toggle--open',\n )}\n onClick={() => toggleExpand(field.key)}\n aria-label={isExpanded ? \"Collapse\" : \"Expand\"}\n >\n ▶\n </button>\n )}\n {!hasChildren && <span className={'ods-data-mapper__tree-spacer'} />}\n <span className={'ods-data-mapper__field-label'}>{field.label}</span>\n {field.type && (\n <span className={'ods-data-mapper__field-type'}>{field.type}</span>\n )}\n <button\n type=\"button\"\n className={cn(\n 'ods-data-mapper__dot',\n 'ods-data-mapper__dot--source',\n isMapped && 'ods-data-mapper__dot--connected',\n pendingSource === field.key && 'ods-data-mapper__dot--active',\n )}\n data-source-key={field.key}\n onClick={() => handleSourceDotClick(field.key)}\n aria-label={`Map from ${field.label}`}\n />\n </div>\n {hasChildren && isExpanded && renderSourceTree(field.children!, depth + 1)}\n </div>\n );\n });\n };\n\n const renderTargetList = (): ReactNode => {\n return targetFields.map((field) => {\n const isMapped = mappings.some((m) => m.target === field.key);\n\n return (\n <div\n key={field.key}\n className={cn(\n 'ods-data-mapper__field',\n isMapped && 'ods-data-mapper__field--mapped',\n )}\n >\n <button\n type=\"button\"\n className={cn(\n 'ods-data-mapper__dot',\n 'ods-data-mapper__dot--target',\n isMapped && 'ods-data-mapper__dot--connected',\n pendingSource && 'ods-data-mapper__dot--receptive',\n )}\n data-target-key={field.key}\n onClick={() => handleTargetDotClick(field.key)}\n aria-label={`Map to ${field.label}`}\n />\n <span className={'ods-data-mapper__field-label'}>{field.label}</span>\n {field.type && (\n <span className={'ods-data-mapper__field-type'}>{field.type}</span>\n )}\n </div>\n );\n });\n };\n\n const renderLines = (): ReactNode => {\n return mappings.map((mapping) => {\n const sourcePos = dotPositions.source.find((d) => d.key === mapping.source);\n const targetPos = dotPositions.target.find((d) => d.key === mapping.target);\n if (!sourcePos || !targetPos) return null;\n\n const midX = (sourcePos.x + targetPos.x) / 2;\n\n return (\n <g\n key={`${mapping.source}-${mapping.target}`}\n onClick={() => handleLineClick(mapping)}\n style={{ cursor: \"pointer\" }}\n role=\"button\"\n aria-label={`Remove mapping from ${mapping.source} to ${mapping.target}`}\n >\n <path\n d={`M ${sourcePos.x} ${sourcePos.y} C ${midX} ${sourcePos.y}, ${midX} ${targetPos.y}, ${targetPos.x} ${targetPos.y}`}\n className={'ods-data-mapper__line'}\n />\n {/* Invisible wider path for easier clicking */}\n <path\n d={`M ${sourcePos.x} ${sourcePos.y} C ${midX} ${sourcePos.y}, ${midX} ${targetPos.y}, ${targetPos.x} ${targetPos.y}`}\n stroke=\"transparent\"\n strokeWidth=\"12\"\n fill=\"none\"\n />\n </g>\n );\n });\n };\n\n return (\n <div ref={containerRef} className={cn('ods-data-mapper', className)}>\n <div className={'ods-data-mapper__source'}>\n <div className={'ods-data-mapper__panel-header'}>Source</div>\n {renderSourceTree(sourceFields)}\n </div>\n <svg className={'ods-data-mapper__svg'}>{renderLines()}</svg>\n <div className={'ods-data-mapper__target'}>\n <div className={'ods-data-mapper__panel-header'}>Target</div>\n {renderTargetList()}\n </div>\n </div>\n );\n}\n","\"use client\";\nimport { type ReactNode, useEffect, useRef, useState } from \"react\";\nimport { Calendar } from \"../Calendar\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface DatePickerProps {\n label?: ReactNode;\n value: Date | null;\n onChange?: (value: Date | null) => void;\n placeholder?: string;\n format?: (d: Date) => string;\n size?: \"sm\" | \"md\" | \"lg\";\n disabled?: boolean;\n error?: ReactNode;\n helperText?: ReactNode;\n minDate?: Date;\n maxDate?: Date;\n className?: string;\n}\n\nconst defaultFormat = (d: Date) =>\n d.toLocaleDateString(undefined, { month: \"short\", day: \"numeric\", year: \"numeric\" });\n\nexport function DatePicker({\n label,\n value,\n onChange,\n placeholder = \"Select date\",\n format = defaultFormat,\n size = \"md\",\n disabled = false,\n error,\n helperText,\n minDate,\n maxDate,\n className,\n}: DatePickerProps) {\n const [open, setOpen] = useState(false);\n const wrapRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!open) return;\n const onDoc = (e: MouseEvent) => {\n if (!wrapRef.current?.contains(e.target as Node)) setOpen(false);\n };\n document.addEventListener(\"mousedown\", onDoc);\n return () => document.removeEventListener(\"mousedown\", onDoc);\n }, [open]);\n\n return (\n <div\n ref={wrapRef}\n className={cn(\"ods-datepicker\", `ods-datepicker--${size}`, disabled && \"ods-datepicker--disabled\", error && \"ods-datepicker--error\", className)}\n >\n {label && <label className=\"ods-datepicker__label\">{label}</label>}\n <button\n type=\"button\"\n className=\"ods-datepicker__trigger\"\n onClick={() => !disabled && setOpen((o) => !o)}\n disabled={disabled}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <rect x=\"2\" y=\"3.5\" width=\"12\" height=\"10\" rx=\"1.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M5 2v3M11 2v3M2 6.5h12\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n <span className={cn(\"ods-datepicker__value\", !value && \"ods-datepicker__value--placeholder\")}>\n {value ? format(value) : placeholder}\n </span>\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\" className=\"ods-datepicker__chev\">\n <path d=\"M3 4.5 6 7.5 9 4.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n {open && (\n <div className=\"ods-datepicker__popover\" role=\"dialog\">\n <Calendar\n mode=\"single\"\n value={value}\n onChange={(d) => {\n onChange?.(d as Date);\n setOpen(false);\n }}\n minDate={minDate}\n maxDate={maxDate}\n />\n </div>\n )}\n {error ? <div className=\"ods-datepicker__hint ods-datepicker__hint--error\">{error}</div>\n : helperText ? <div className=\"ods-datepicker__hint\">{helperText}</div>\n : null}\n </div>\n );\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface DonutSegment {\n label: ReactNode;\n value: number;\n color: string;\n}\n\nexport interface DonutChartProps {\n data: DonutSegment[];\n size?: number;\n strokeWidth?: number;\n title?: ReactNode;\n centerLabel?: ReactNode; // overrides default \"total\"\n showLegend?: boolean;\n className?: string;\n}\n\nexport function DonutChart({\n data,\n size = 160,\n strokeWidth = 22,\n title,\n centerLabel,\n showLegend = true,\n className,\n}: DonutChartProps) {\n const total = data.reduce((s, d) => s + d.value, 0) || 1;\n const r = (size - strokeWidth) / 2;\n const c = 2 * Math.PI * r;\n\n let offset = 0;\n const segs = data.map((d) => {\n const len = (d.value / total) * c;\n const seg = { ...d, dash: `${len} ${c - len}`, dashoffset: -offset };\n offset += len;\n return seg;\n });\n\n return (\n <div className={cn(\"ods-donut\", className)}>\n {title && <div className=\"ods-donut__title\">{title}</div>}\n <div className=\"ods-donut__ring\" style={{ width: size, height: size }}>\n <svg width={size} height={size}>\n <circle\n cx={size / 2}\n cy={size / 2}\n r={r}\n fill=\"none\"\n stroke=\"#f3f1ff\"\n strokeWidth={strokeWidth}\n />\n <g transform={`rotate(-90 ${size / 2} ${size / 2})`}>\n {segs.map((s, i) => (\n <circle\n key={i}\n cx={size / 2}\n cy={size / 2}\n r={r}\n fill=\"none\"\n stroke={s.color}\n strokeWidth={strokeWidth}\n strokeDasharray={s.dash}\n strokeDashoffset={s.dashoffset}\n strokeLinecap=\"butt\"\n />\n ))}\n </g>\n </svg>\n <div className=\"ods-donut__center\">\n {centerLabel ?? (\n <>\n <div className=\"ods-donut__value\">{total}</div>\n <div className=\"ods-donut__small\">total</div>\n </>\n )}\n </div>\n </div>\n {showLegend && (\n <ul className=\"ods-donut__legend\">\n {data.map((d, i) => (\n <li key={i} className=\"ods-donut__legend-item\">\n <span className=\"ods-donut__dot\" style={{ background: d.color }} />\n <span className=\"ods-donut__legend-label\">{d.label}</span>\n <span className=\"ods-donut__legend-pct\">{Math.round((d.value / total) * 100)}%</span>\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface DescriptionListItem {\n label: ReactNode;\n value: ReactNode;\n key?: string | number;\n}\n\nexport interface DescriptionListProps {\n items: DescriptionListItem[];\n layout?: \"row\" | \"stacked\";\n divided?: boolean;\n size?: \"sm\" | \"md\";\n labelWidth?: number | string;\n className?: string;\n}\n\nexport function DescriptionList({\n items,\n layout = \"row\",\n divided = true,\n size = \"md\",\n labelWidth = 120,\n className,\n}: DescriptionListProps) {\n return (\n <dl\n className={cn(\n \"ods-dl\",\n `ods-dl--${layout}`,\n `ods-dl--${size}`,\n divided && \"ods-dl--divided\",\n className,\n )}\n >\n {items.map((item, i) => (\n <div className=\"ods-dl__row\" key={item.key ?? i}>\n <dt\n className=\"ods-dl__label\"\n style={layout === \"row\" ? { width: labelWidth } : undefined}\n >\n {item.label}\n </dt>\n <dd className=\"ods-dl__value\">{item.value}</dd>\n </div>\n ))}\n </dl>\n );\n}\n","\"use client\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport { type ReactNode, useRef } from \"react\";\nimport { FocusScope, useDialog, useModal, useOverlay } from \"react-aria\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"../../utils/cn\";\nimport { odsMotion } from \"../../utils/motion\";\n\nexport interface DialogProps {\n open: boolean;\n onClose: () => void;\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\";\n title?: ReactNode;\n description?: ReactNode;\n closeOnOverlayClick?: boolean;\n closeOnEsc?: boolean;\n children?: ReactNode;\n footer?: ReactNode;\n className?: string;\n}\n\nfunction DialogContent({\n open,\n onClose,\n size = \"md\",\n title,\n description,\n closeOnOverlayClick = true,\n closeOnEsc = true,\n children,\n footer,\n className,\n}: DialogProps) {\n const overlayRef = useRef<HTMLDivElement>(null);\n const dialogRef = useRef<HTMLDivElement>(null);\n\n const { overlayProps, underlayProps } = useOverlay(\n {\n isOpen: open,\n onClose,\n isDismissable: closeOnOverlayClick,\n isKeyboardDismissDisabled: !closeOnEsc,\n },\n overlayRef,\n );\n\n const { modalProps } = useModal();\n const { dialogProps, titleProps } = useDialog({}, dialogRef);\n\n // Destructure conflicting motion props\n const { onDrag, onDragStart, onDragEnd, onAnimationStart, ...safeOverlayProps } =\n overlayProps as any;\n\n return (\n <AnimatePresence>\n {open && (\n <motion.div\n className={'ods-dialog'}\n {...(() => { const { onDrag, onDragStart, onDragEnd, onAnimationStart, ...safe } = underlayProps as any; return safe; })()}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.15 }}\n data-testid=\"dialog-overlay\"\n >\n <FocusScope contain restoreFocus autoFocus>\n <motion.div\n {...safeOverlayProps}\n {...modalProps}\n {...dialogProps}\n ref={(node) => {\n (overlayRef as any).current = node;\n (dialogRef as any).current = node;\n }}\n className={cn(\n 'ods-dialog__card',\n `ods-dialog__card--${size}`,\n className,\n )}\n initial={odsMotion.scaleIn.initial}\n animate={odsMotion.scaleIn.animate}\n exit={odsMotion.scaleIn.exit}\n transition={odsMotion.scaleIn.transition}\n >\n {title && (\n <div className={'ods-dialog__header'}>\n <h2 {...titleProps} className={'ods-dialog__title'}>\n {title}\n </h2>\n {description && (\n <p className={'ods-dialog__description'}>{description}</p>\n )}\n <button\n className={'ods-dialog__close'}\n onClick={onClose}\n aria-label=\"Close dialog\"\n type=\"button\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path d=\"M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z\" />\n </svg>\n </button>\n </div>\n )}\n <div className={'ods-dialog__body'}>{children}</div>\n {footer && <div className={'ods-dialog__footer'}>{footer}</div>}\n </motion.div>\n </FocusScope>\n </motion.div>\n )}\n </AnimatePresence>\n );\n}\n\nexport function Dialog(props: DialogProps) {\n if (typeof document === \"undefined\") return null;\n return createPortal(<DialogContent {...props} />, document.body);\n}\n","// Motion presets matching v3 prototype — fast, subtle, not sluggish\nexport const odsMotion = {\n // Instant fade (100ms) — tooltips, badges\n fadeIn: {\n initial: { opacity: 0 },\n animate: { opacity: 1 },\n exit: { opacity: 0 },\n transition: { duration: 0.1 },\n },\n // Quick scale (120ms) — dropdowns, popovers\n scaleIn: {\n initial: { opacity: 0, scale: 0.97 },\n animate: { opacity: 1, scale: 1 },\n exit: { opacity: 0, scale: 0.97 },\n transition: { duration: 0.12, ease: [0.4, 0, 0.2, 1] },\n },\n // Slide panel (150ms) — config panels, slideouts\n slideRight: {\n initial: { x: \"100%\" },\n animate: { x: 0 },\n exit: { x: \"100%\" },\n transition: { duration: 0.15, ease: [0.4, 0, 0.2, 1] },\n },\n // Slide up (120ms) — toasts, modals\n slideUp: {\n initial: { opacity: 0, y: 8 },\n animate: { opacity: 1, y: 0 },\n exit: { opacity: 0, y: 8 },\n transition: { duration: 0.12, ease: [0.4, 0, 0.2, 1] },\n },\n // Tap feedback — buttons\n tap: { whileTap: { scale: 0.97 } },\n // Hover lift — cards (subtle, 1px not 2px)\n hover: { whileHover: { y: -1 } },\n};\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface DrawerProps {\n title?: ReactNode;\n subtitle?: ReactNode;\n onClose?: () => void;\n children?: ReactNode;\n footer?: ReactNode;\n width?: number | string;\n height?: number | string;\n className?: string;\n}\n\n/**\n * Inline drawer / detail panel — not a portaled overlay.\n * Use SlideoutPanel for overlay+focus-trap UX.\n */\nexport function Drawer({\n title,\n subtitle,\n onClose,\n children,\n footer,\n width = 420,\n height = \"100%\",\n className,\n}: DrawerProps) {\n return (\n <aside\n className={cn(\"ods-drawer\", className)}\n style={{ width, height }}\n aria-label={typeof title === \"string\" ? title : undefined}\n >\n {(title || subtitle || onClose) && (\n <header className=\"ods-drawer__head\">\n <div className=\"ods-drawer__titles\">\n {title && <h3 className=\"ods-drawer__title\">{title}</h3>}\n {subtitle && <p className=\"ods-drawer__subtitle\">{subtitle}</p>}\n </div>\n {onClose && (\n <button\n type=\"button\"\n className=\"ods-drawer__close\"\n onClick={onClose}\n aria-label=\"Close\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M4 4l8 8M12 4l-8 8\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n </button>\n )}\n </header>\n )}\n <div className=\"ods-drawer__body\">{children}</div>\n {footer && <footer className=\"ods-drawer__footer\">{footer}</footer>}\n </aside>\n );\n}\n","\"use client\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport { type ReactNode, useRef } from \"react\";\nimport { useButton, useMenu, useMenuItem, useMenuTrigger } from \"react-aria\";\nimport { createPortal } from \"react-dom\";\nimport { Item, useMenuTriggerState, useTreeState } from \"react-stately\";\nimport { cn } from \"../../utils/cn\";\nimport { odsMotion } from \"../../utils/motion\";\n\nexport interface DropdownMenuItem {\n label: string;\n icon?: ReactNode;\n onClick?: () => void;\n danger?: boolean;\n disabled?: boolean;\n separator?: boolean;\n}\n\nexport interface DropdownMenuProps {\n trigger: ReactNode;\n items: DropdownMenuItem[];\n align?: \"start\" | \"end\";\n className?: string;\n}\n\nfunction MenuItemComponent({ item, state, onAction }: any) {\n const ref = useRef<HTMLLIElement>(null);\n const { menuItemProps } = useMenuItem({ key: item.key, onAction }, state, ref);\n\n const menuItem = item.value as DropdownMenuItem;\n const isDisabled = state.disabledKeys.has(item.key);\n\n return (\n <li\n {...menuItemProps}\n ref={ref}\n className={cn(\n 'ods-dropdown__item',\n menuItem.danger && 'ods-dropdown__item--danger',\n isDisabled && 'ods-dropdown__item--disabled',\n )}\n >\n {menuItem.icon && <span className={'ods-dropdown__icon'}>{menuItem.icon}</span>}\n <span>{menuItem.label}</span>\n </li>\n );\n}\n\nfunction MenuPopup({\n state,\n menuItems,\n triggerRef,\n align,\n className,\n}: {\n state: ReturnType<typeof useMenuTriggerState>;\n menuItems: DropdownMenuItem[];\n triggerRef: React.RefObject<HTMLButtonElement | null>;\n align: \"start\" | \"end\";\n className?: string;\n}) {\n const menuRef = useRef<HTMLUListElement>(null);\n\n // Build items for react-stately, filtering separators\n const nonSepItems = menuItems.filter((i) => !i.separator);\n const children = nonSepItems.map((item, idx) => (\n <Item key={idx} textValue={item.label}>\n {item.label}\n </Item>\n ));\n\n const treeState = useTreeState({\n children,\n selectionMode: \"none\",\n disabledKeys: nonSepItems\n .map((item, idx) => (item.disabled ? String(idx) : null))\n .filter(Boolean) as string[],\n });\n\n const { menuProps } = useMenu({}, treeState, menuRef);\n\n const onAction = (key: any) => {\n const idx = Number(key);\n nonSepItems[idx]?.onClick?.();\n state.close();\n };\n\n const getStyle = (): React.CSSProperties => {\n if (!triggerRef.current) return {};\n const rect = triggerRef.current.getBoundingClientRect();\n const style: React.CSSProperties = {\n position: \"fixed\",\n zIndex: 1200,\n top: rect.bottom + 4,\n };\n\n if (align === \"end\") {\n style.right = window.innerWidth - rect.right;\n } else {\n style.left = rect.left;\n }\n\n return style;\n };\n\n // Build the full list with separators\n let nonSepIdx = 0;\n const renderedItems: ReactNode[] = [];\n\n menuItems.forEach((menuItem, rawIdx) => {\n if (menuItem.separator) {\n renderedItems.push(\n <li key={`sep-${rawIdx}`} className={'ods-dropdown__separator'} />,\n );\n } else {\n const treeItem = [...treeState.collection][nonSepIdx];\n if (treeItem) {\n renderedItems.push(\n <MenuItemComponent\n key={treeItem.key}\n item={{ ...treeItem, value: menuItem }}\n state={treeState}\n onAction={onAction}\n />,\n );\n }\n nonSepIdx++;\n }\n });\n\n const portalContent = (\n <AnimatePresence>\n {state.isOpen && (\n <motion.ul\n {...(() => { const { onDrag, onDragStart, onDragEnd, onAnimationStart, ...safe } = menuProps as any; return safe; })()}\n ref={menuRef}\n className={cn('ods-dropdown', className)}\n style={getStyle()}\n initial={odsMotion.scaleIn.initial}\n animate={odsMotion.scaleIn.animate}\n exit={odsMotion.scaleIn.exit}\n transition={odsMotion.scaleIn.transition as any}\n >\n {renderedItems}\n </motion.ul>\n )}\n </AnimatePresence>\n );\n\n if (typeof document !== \"undefined\") {\n return createPortal(portalContent, document.body);\n }\n\n return null;\n}\n\nexport function DropdownMenu({ trigger, items, align = \"start\", className }: DropdownMenuProps) {\n const triggerRef = useRef<HTMLButtonElement>(null);\n const state = useMenuTriggerState({});\n const { menuTriggerProps } = useMenuTrigger({}, state, triggerRef);\n const { buttonProps } = useButton(menuTriggerProps, triggerRef);\n\n // Remove motion-conflicting props\n const { onDrag, onDragStart, onDragEnd, onAnimationStart, ...safeTriggerProps } =\n buttonProps as any;\n\n return (\n <>\n <button {...safeTriggerProps} ref={triggerRef} className={'ods-dropdown__trigger'}>\n {trigger}\n </button>\n <MenuPopup\n state={state}\n menuItems={items}\n triggerRef={triggerRef}\n align={align}\n className={className}\n />\n </>\n );\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface EmptyStateProps {\n icon?: ReactNode;\n title: string;\n description?: string;\n action?: ReactNode;\n className?: string;\n}\n\nexport function EmptyState({ icon, title, description, action, className }: EmptyStateProps) {\n return (\n <div className={cn('ods-empty-state', className)}>\n {icon && (\n <div className={'ods-empty-state__icon'} aria-hidden=\"true\">\n {icon}\n </div>\n )}\n <h3 className={'ods-empty-state__title'}>{title}</h3>\n {description && <p className={'ods-empty-state__description'}>{description}</p>}\n {action && <div className={'ods-empty-state__action'}>{action}</div>}\n </div>\n );\n}\n","\"use client\";\nimport { motion } from \"framer-motion\";\nimport { type ReactNode, useEffect, useRef } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport type LogLevel = \"info\" | \"warn\" | \"error\" | \"debug\" | \"success\";\n\nexport interface LogEntry {\n timestamp: string;\n level: LogLevel;\n message: string;\n}\n\nexport interface ExecutionConsoleProps {\n open?: boolean;\n onToggle?: () => void;\n logs?: LogEntry[];\n running?: boolean;\n /** Handler for the built-in Stop button — only rendered when `running` is true. */\n onStop?: () => void;\n /** Handler for the built-in Clear button. */\n onClear?: () => void;\n /** Handler for the built-in Copy button — copies log text to the clipboard. */\n onCopy?: () => void;\n /** Extra toolbar content rendered in the top-right, after the built-in actions. */\n toolbar?: ReactNode;\n className?: string;\n}\n\n// ── Inline icons (lucide-compatible) ─────────────────────────────────────────\nconst iconProps = {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\" as const,\n strokeLinejoin: \"round\" as const,\n \"aria-hidden\": true,\n};\nconst StopIcon = () => (\n <svg {...iconProps} width={14} height={14}>\n <rect x=\"6\" y=\"6\" width=\"12\" height=\"12\" rx=\"1\" />\n </svg>\n);\nconst CopyIcon = () => (\n <svg {...iconProps} width={14} height={14}>\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\n </svg>\n);\nconst TrashIcon = () => (\n <svg {...iconProps} width={14} height={14}>\n <polyline points=\"3 6 5 6 21 6\" />\n <path d=\"M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6\" />\n <path d=\"M10 11v6M14 11v6\" />\n <path d=\"M9 6V4a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2v2\" />\n </svg>\n);\n\nconst COLLAPSED_HEIGHT = 36;\nconst EXPANDED_HEIGHT = 220;\n\nexport function ExecutionConsole({\n open = false,\n onToggle,\n logs = [],\n running = false,\n onStop,\n onClear,\n onCopy,\n toolbar,\n className,\n}: ExecutionConsoleProps) {\n const logEndRef = useRef<HTMLDivElement>(null);\n\n const handleCopy = () => {\n if (onCopy) {\n onCopy();\n return;\n }\n if (typeof navigator !== \"undefined\" && navigator.clipboard) {\n const text = logs\n .map((l) => `${l.timestamp} ${l.level.toUpperCase()} ${l.message}`)\n .join(\"\\n\");\n void navigator.clipboard.writeText(text);\n }\n };\n\n useEffect(() => {\n if (open && logEndRef.current) {\n logEndRef.current.scrollIntoView?.({ behavior: \"smooth\" });\n }\n }, [open]);\n\n return (\n <motion.div\n className={cn('ods-console', className)}\n animate={{ height: open ? EXPANDED_HEIGHT : COLLAPSED_HEIGHT }}\n transition={{ type: \"spring\", stiffness: 300, damping: 30 }}\n data-testid=\"execution-console\"\n >\n {/* Mini bar / header */}\n <div className={'ods-console__bar'} data-testid=\"console-bar\">\n <button\n className={'ods-console__toggle'}\n onClick={onToggle}\n aria-label={open ? \"Collapse console\" : \"Expand console\"}\n data-testid=\"console-toggle\"\n >\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"currentColor\"\n style={{\n transform: open ? \"rotate(180deg)\" : \"rotate(0deg)\",\n transition: \"transform 0.2s\",\n }}\n >\n <path\n d=\"M3 9l4-4 4 4\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n fill=\"none\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n <span className={'ods-console__label'}>\n Console\n {running && (\n <span className=\"ods-console__status\" data-testid=\"console-running\">\n <span className=\"ods-console__status-dot\" aria-hidden=\"true\" />\n <span className=\"ods-console__status-text\">Running…</span>\n </span>\n )}\n </span>\n <span className={'ods-console__count'} data-testid=\"console-count\">\n {logs.length} {logs.length === 1 ? \"entry\" : \"entries\"}\n </span>\n <div className={'ods-console__actions'} role=\"toolbar\" aria-label=\"Console actions\">\n {running && onStop && (\n <button\n type=\"button\"\n className={cn('ods-console__action', 'ods-console__action--stop')}\n onClick={onStop}\n aria-label=\"Stop execution\"\n title=\"Stop\"\n data-testid=\"console-stop\"\n >\n <StopIcon />\n </button>\n )}\n {logs.length > 0 && (\n <button\n type=\"button\"\n className={'ods-console__action'}\n onClick={handleCopy}\n aria-label=\"Copy logs\"\n title=\"Copy logs\"\n data-testid=\"console-copy\"\n >\n <CopyIcon />\n </button>\n )}\n {onClear && (\n <button\n type=\"button\"\n className={'ods-console__action'}\n onClick={onClear}\n aria-label=\"Clear console\"\n title=\"Clear\"\n data-testid=\"console-clear\"\n >\n <TrashIcon />\n </button>\n )}\n {toolbar && (\n <>\n <span className=\"ods-console__action-separator\" aria-hidden=\"true\" />\n {toolbar}\n </>\n )}\n </div>\n </div>\n\n {/* Log area */}\n {open && (\n <div className={'ods-console__logs'} data-testid=\"console-logs\">\n {logs.length === 0 && (\n <div className={'ods-console__empty'} data-testid=\"console-empty\">\n No log entries\n </div>\n )}\n {logs.map((log, i) => (\n <div\n key={i}\n className={cn('ods-console__line', `ods-console__line--${log.level}`)}\n data-testid=\"console-log-line\"\n >\n <span className={'ods-console__timestamp'}>{log.timestamp}</span>\n <span\n className={cn(\n 'ods-console__level',\n `ods-console__level--${log.level}`,\n )}\n >\n {log.level.toUpperCase()}\n </span>\n <span className={'ods-console__message'}>{log.message}</span>\n </div>\n ))}\n <div ref={logEndRef} />\n </div>\n )}\n </motion.div>\n );\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface FeatureCardProps {\n icon: ReactNode;\n title: ReactNode;\n description?: ReactNode;\n link?: { label: ReactNode; href?: string; onClick?: () => void };\n variant?: \"default\" | \"primary\" | \"success\" | \"warning\" | \"error\";\n className?: string;\n}\n\nexport function FeatureCard({ icon, title, description, link, variant = \"primary\", className }: FeatureCardProps) {\n const Comp = link?.href ? \"a\" : \"button\";\n return (\n <div className={cn(\"ods-feature-card\", `ods-feature-card--${variant}`, className)}>\n <span className=\"ods-feature-card__icon\" aria-hidden=\"true\">{icon}</span>\n <div className=\"ods-feature-card__title\">{title}</div>\n {description && <div className=\"ods-feature-card__desc\">{description}</div>}\n {link && (\n <Comp\n href={link.href}\n onClick={link.onClick as any}\n type={link.href ? undefined : \"button\"}\n className=\"ods-feature-card__link\"\n >\n <span>{link.label}</span>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M3 7h8m-3-3l3 3-3 3\" stroke=\"currentColor\" strokeWidth=\"1.7\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </Comp>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport {\n type ReactNode,\n type ComponentPropsWithoutRef,\n useRef,\n useCallback,\n} from 'react';\nimport { AnimatePresence } from 'framer-motion';\nimport { cn } from '../../utils/cn';\nimport type { WorkflowNode, WorkflowEdge, CanvasViewport } from '../../workflow/types';\nimport { FlowNode, type FlowNodeProps } from '../FlowNode/FlowNode';\nimport { FlowEdge } from '../FlowEdge/FlowEdge';\n\nexport interface FlowCanvasProps extends Omit<ComponentPropsWithoutRef<'div'>, 'children'> {\n nodes: WorkflowNode[];\n edges: WorkflowEdge[];\n viewport: CanvasViewport;\n connectingFrom?: FlowNodeProps['connectingFrom'];\n\n // Viewport\n onViewportChange?: (viewport: Partial<CanvasViewport>) => void;\n minZoom?: number;\n maxZoom?: number;\n\n // Selection\n onNodeSelect?: (id: string) => void;\n onEdgeSelect?: (id: string) => void;\n onDeselectAll?: () => void;\n\n // Node interactions\n onNodePositionChange?: (id: string, position: { x: number; y: number }) => void;\n onNodeDelete?: (id: string) => void;\n onNodesDelete?: (ids: string[]) => void;\n\n // Edge interactions\n onEdgeDelete?: (id: string) => void;\n\n // Connecting\n onStartConnecting?: FlowNodeProps['onStartConnecting'];\n onEndConnecting?: FlowNodeProps['onEndConnecting'];\n validateConnection?: FlowNodeProps['validateConnection'];\n\n selectedNodeId?: string;\n children?: ReactNode;\n emptyState?: ReactNode;\n\n gridSize?: number;\n showGrid?: boolean;\n isLockMode?: boolean;\n height?: number | string;\n width?: number | string;\n}\n\n/**\n * FlowCanvas - Canvas for workflow editor\n *\n * TODO: This is a stub implementation. Full feature set from octaviaflow-ui needs to be ported:\n * - Pan and zoom controls\n * - Grid background\n * - Touch gestures\n * - Keyboard shortcuts\n * - Execution console\n * - History panel\n * - Validation panel\n * - Debug panel\n * - Layout algorithms\n * - SSE streaming\n *\n * See: octaviaflow-ui/src/components/WorkFlowCanvas for full implementation\n */\nexport function FlowCanvas({\n nodes,\n edges,\n viewport,\n connectingFrom,\n onViewportChange,\n minZoom = 0.25,\n maxZoom = 2,\n onNodeSelect,\n onEdgeSelect,\n onDeselectAll,\n onNodePositionChange,\n onNodeDelete,\n onNodesDelete,\n onEdgeDelete,\n onStartConnecting,\n onEndConnecting,\n validateConnection,\n selectedNodeId,\n children,\n emptyState,\n gridSize = 20,\n showGrid = true,\n isLockMode = false,\n height = '100%',\n width = '100%',\n className,\n ...props\n}: FlowCanvasProps) {\n const canvasRef = useRef<HTMLDivElement>(null);\n const isEmpty = nodes.length === 0 && edges.length === 0;\n\n const handleCanvasClick = useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n const target = e.target as HTMLElement;\n if (target === canvasRef.current) {\n onDeselectAll?.();\n }\n },\n [onDeselectAll]\n );\n\n return (\n <div\n ref={canvasRef}\n className={cn('ods-flow-canvas', className)}\n style={{ width, height }}\n onClick={handleCanvasClick}\n role=\"application\"\n aria-label=\"Workflow canvas\"\n {...props}\n >\n {/* Grid background */}\n {showGrid && (\n <div\n className=\"ods-flow-canvas__grid\"\n style={{\n backgroundSize: `${gridSize}px ${gridSize}px`,\n }}\n />\n )}\n\n {/* Viewport content */}\n <div\n className=\"ods-flow-canvas__viewport\"\n style={{\n transform: `translate(${viewport.x}px, ${viewport.y}px) scale(${viewport.zoom})`,\n transformOrigin: '0 0',\n }}\n >\n {/* Edges layer */}\n <svg\n className=\"ods-flow-canvas__edges\"\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n pointerEvents: 'none',\n overflow: 'visible',\n }}\n >\n <g style={{ pointerEvents: 'auto' }}>\n {edges.map((edge) => (\n <FlowEdge\n key={edge.id}\n edge={edge}\n nodes={nodes}\n onSelect={onEdgeSelect}\n onDelete={onEdgeDelete}\n />\n ))}\n </g>\n </svg>\n\n {/* Nodes layer */}\n <AnimatePresence>\n {nodes.map((node) => (\n <FlowNode\n key={node.id}\n node={node}\n viewport={viewport}\n connectingFrom={connectingFrom}\n isLockMode={isLockMode}\n isConfigOpen={selectedNodeId === node.id}\n onSelect={onNodeSelect}\n onDelete={onNodeDelete}\n onPositionChange={onNodePositionChange}\n onStartConnecting={onStartConnecting}\n onEndConnecting={onEndConnecting}\n validateConnection={validateConnection}\n />\n ))}\n </AnimatePresence>\n </div>\n\n {/* Empty state */}\n {isEmpty && emptyState && (\n <div className=\"ods-flow-canvas__empty\">{emptyState}</div>\n )}\n\n {/* Chrome slot (toolbar, drawer, panels) */}\n {children}\n </div>\n );\n}\n","\"use client\";\n\nimport { motion } from \"framer-motion\";\nimport {\n type CSSProperties,\n type MouseEvent as ReactMouseEvent,\n type ReactNode,\n type TouchEvent as ReactTouchEvent,\n forwardRef,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport type { ConfigStatusResult } from \"../../workflow/configStatus\";\nimport type {\n WorkflowEdge as WorkflowEdgeType,\n WorkflowNode as WorkflowNodeType,\n} from \"../../workflow/types\";\n\nconst DEFAULT_NODE_WIDTH = 368;\nconst DRAG_THRESHOLD_PX = 5;\n\nexport interface FlowNodeIconSlots {\n statusValid?: ReactNode;\n statusWarning?: ReactNode;\n statusError?: ReactNode;\n statusUnconfigured?: ReactNode;\n delete?: ReactNode;\n running?: ReactNode;\n trigger?: ReactNode;\n action?: ReactNode;\n}\n\nexport interface FlowNodeProps {\n node: WorkflowNodeType;\n className?: string;\n style?: CSSProperties;\n /** Canvas viewport — used to scale drag deltas. */\n viewport?: { zoom: number; x: number; y: number };\n isLockMode?: boolean;\n isConfigOpen?: boolean;\n /** Pre-computed config status (from `getNodeConfigStatus`). */\n configStatus?: ConfigStatusResult;\n /** Edges, used to highlight ports whose incoming/outgoing edge is selected. */\n edges?: WorkflowEdgeType[];\n /** Shared connection-in-progress state, passed down from the canvas. */\n connectingFrom?: {\n nodeId: string;\n portId: string;\n portType: \"input\" | \"output\";\n } | null;\n /** Slot overrides for the handful of internal icons. */\n icons?: FlowNodeIconSlots;\n\n onSelect?: (id: string) => void;\n onDelete?: (id: string) => void;\n onPositionChange?: (id: string, position: { x: number; y: number }) => void;\n onStartConnecting?: (\n nodeId: string,\n portId: string,\n portType: \"input\" | \"output\",\n ) => void;\n onEndConnecting?: (\n target: { nodeId: string; portId: string; portType: \"input\" | \"output\" } | null,\n ) => void;\n validateConnection?: (\n targetNodeId: string,\n targetPortId: string,\n targetPortType: \"input\" | \"output\",\n ) => { valid: boolean; reason?: string };\n}\n\n// ── Inline default icons ─────────────────────────────────────────────────────\n// Kept lucide-compatible (24x24 viewBox, stroke-based) for visual harmony with\n// the rest of the design system. Consumers may override via the `icons` prop.\n\nconst iconBaseProps = {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\" as const,\n strokeLinejoin: \"round\" as const,\n};\n\nconst CheckCircleSvg = ({ size = 16 }: { size?: number }) => (\n <svg {...iconBaseProps} width={size} height={size} aria-hidden=\"true\">\n <path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\" />\n <polyline points=\"22 4 12 14.01 9 11.01\" />\n </svg>\n);\nconst AlertTriangleSvg = ({ size = 16 }: { size?: number }) => (\n <svg {...iconBaseProps} width={size} height={size} aria-hidden=\"true\">\n <path d=\"M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0Z\" />\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\" />\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\n </svg>\n);\nconst XCircleSvg = ({ size = 16 }: { size?: number }) => (\n <svg {...iconBaseProps} width={size} height={size} aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\" />\n <line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\" />\n </svg>\n);\nconst CircleDashedSvg = ({ size = 16 }: { size?: number }) => (\n <svg {...iconBaseProps} width={size} height={size} aria-hidden=\"true\" strokeDasharray=\"3 3\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n </svg>\n);\nconst TrashSvg = ({ size = 16 }: { size?: number }) => (\n <svg {...iconBaseProps} width={size} height={size} aria-hidden=\"true\">\n <polyline points=\"3 6 5 6 21 6\" />\n <path d=\"M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6\" />\n <path d=\"M10 11v6M14 11v6\" />\n <path d=\"M9 6V4a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2v2\" />\n </svg>\n);\nconst LoaderSvg = ({ size = 24 }: { size?: number }) => (\n <svg {...iconBaseProps} width={size} height={size} aria-hidden=\"true\">\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\n </svg>\n);\nconst PlaySvg = ({ size = 14 }: { size?: number }) => (\n <svg {...iconBaseProps} width={size} height={size} aria-hidden=\"true\">\n <polygon points=\"5 3 19 12 5 21 5 3\" />\n </svg>\n);\nconst LinkSvg = ({ size = 14 }: { size?: number }) => (\n <svg {...iconBaseProps} width={size} height={size} aria-hidden=\"true\">\n <path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" />\n <path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" />\n </svg>\n);\n\nfunction resolveIcon(slot: ReactNode | undefined, fallback: ReactNode): ReactNode {\n return slot !== undefined ? slot : fallback;\n}\n\n// ── Component ────────────────────────────────────────────────────────────────\nexport const FlowNode = forwardRef<HTMLDivElement, FlowNodeProps>(\n function FlowNode(\n {\n node,\n viewport,\n isLockMode = false,\n isConfigOpen = false,\n configStatus,\n edges = [],\n connectingFrom = null,\n icons,\n onSelect,\n onDelete,\n onPositionChange,\n onStartConnecting,\n onEndConnecting,\n validateConnection,\n className,\n style,\n },\n ref,\n ) {\n const [isDragging, setIsDragging] = useState(false);\n const [wasDragged, setWasDragged] = useState(false);\n const dragStartRef = useRef<{ x: number; y: number } | null>(null);\n const zoom = viewport?.zoom ?? 1;\n\n // ── Selection / click ──\n const handleClick = useCallback(\n (e: ReactMouseEvent<HTMLDivElement>) => {\n e.stopPropagation();\n if (wasDragged) {\n setWasDragged(false);\n return;\n }\n onSelect?.(node.id);\n },\n [node.id, onSelect, wasDragged],\n );\n\n const handleDelete = useCallback(\n (e: ReactMouseEvent<HTMLButtonElement>) => {\n e.stopPropagation();\n if (isLockMode) return;\n onDelete?.(node.id);\n },\n [node.id, onDelete, isLockMode],\n );\n\n // ── Drag (mouse) ──\n const handleMouseDown = useCallback(\n (e: ReactMouseEvent<HTMLDivElement>) => {\n if (isLockMode) return;\n const target = e.target as HTMLElement;\n if (\n target.closest('[data-flow-node-no-drag=\"true\"]') ||\n target.closest(\".ods-flow-node__delete-btn\") ||\n target.closest(\".ods-flow-node__port\")\n ) {\n return;\n }\n e.stopPropagation();\n setIsDragging(true);\n dragStartRef.current = { x: e.clientX, y: e.clientY };\n },\n [isLockMode],\n );\n\n const handleTouchStart = useCallback(\n (e: ReactTouchEvent<HTMLDivElement>) => {\n if (isLockMode) return;\n if (e.touches.length !== 1) return;\n const target = e.target as HTMLElement;\n if (\n target.closest('[data-flow-node-no-drag=\"true\"]') ||\n target.closest(\".ods-flow-node__delete-btn\") ||\n target.closest(\".ods-flow-node__port\")\n ) {\n return;\n }\n e.stopPropagation();\n setIsDragging(true);\n dragStartRef.current = {\n x: e.touches[0].clientX,\n y: e.touches[0].clientY,\n };\n },\n [isLockMode],\n );\n\n useEffect(() => {\n if (!isDragging) return;\n\n const applyDelta = (clientX: number, clientY: number) => {\n const start = dragStartRef.current;\n if (!start) return;\n const deltaX = (clientX - start.x) / zoom;\n const deltaY = (clientY - start.y) / zoom;\n if (Math.abs(deltaX) > DRAG_THRESHOLD_PX || Math.abs(deltaY) > DRAG_THRESHOLD_PX) {\n setWasDragged(true);\n }\n onPositionChange?.(node.id, {\n x: node.position.x + deltaX,\n y: node.position.y + deltaY,\n });\n dragStartRef.current = { x: clientX, y: clientY };\n };\n\n const onMouseMove = (e: MouseEvent) => applyDelta(e.clientX, e.clientY);\n const onMouseUp = () => {\n setIsDragging(false);\n dragStartRef.current = null;\n // small delay so the trailing click can be suppressed\n window.setTimeout(() => setWasDragged(false), 100);\n };\n const onTouchMove = (e: TouchEvent) => {\n if (e.touches.length !== 1) return;\n e.preventDefault();\n applyDelta(e.touches[0].clientX, e.touches[0].clientY);\n };\n const onTouchEnd = () => {\n setIsDragging(false);\n dragStartRef.current = null;\n window.setTimeout(() => setWasDragged(false), 100);\n };\n\n document.addEventListener(\"mousemove\", onMouseMove);\n document.addEventListener(\"mouseup\", onMouseUp);\n document.addEventListener(\"touchmove\", onTouchMove, { passive: false });\n document.addEventListener(\"touchend\", onTouchEnd);\n document.addEventListener(\"touchcancel\", onTouchEnd);\n return () => {\n document.removeEventListener(\"mousemove\", onMouseMove);\n document.removeEventListener(\"mouseup\", onMouseUp);\n document.removeEventListener(\"touchmove\", onTouchMove);\n document.removeEventListener(\"touchend\", onTouchEnd);\n document.removeEventListener(\"touchcancel\", onTouchEnd);\n };\n }, [isDragging, zoom, node.id, node.position.x, node.position.y, onPositionChange]);\n\n // ── Ports: connection-state helpers ──\n const handlePortMouseDown = useCallback(\n (e: ReactMouseEvent, portId: string, portType: \"input\" | \"output\") => {\n e.stopPropagation();\n if (isLockMode) return;\n if (!connectingFrom) {\n onStartConnecting?.(node.id, portId, portType);\n }\n },\n [connectingFrom, isLockMode, node.id, onStartConnecting],\n );\n\n const handlePortMouseUp = useCallback(\n (e: ReactMouseEvent, portId: string, portType: \"input\" | \"output\") => {\n e.stopPropagation();\n if (isLockMode) return;\n if (!connectingFrom) return;\n onEndConnecting?.({ nodeId: node.id, portId, portType });\n },\n [connectingFrom, isLockMode, node.id, onEndConnecting],\n );\n\n const isPortEdgeSelected = useCallback(\n (portId: string, portType: \"input\" | \"output\") =>\n edges.some(\n (edge) =>\n edge.selected &&\n (portType === \"input\"\n ? edge.target === node.id && edge.targetPort === portId\n : edge.source === node.id && edge.sourcePort === portId),\n ),\n [edges, node.id],\n );\n\n // ── Config status (falls back to simple node.configStatus enum) ──\n const statusValue = configStatus?.status ?? node.configStatus;\n const statusTitle = (() => {\n if (!statusValue || statusValue === \"hidden\") return undefined;\n if (statusValue === \"valid\") return \"Configured\";\n if (statusValue === \"warning\") {\n return configStatus?.missingRequired?.length\n ? `Missing required: ${configStatus.missingRequired.join(\", \")}`\n : \"Incomplete configuration\";\n }\n if (statusValue === \"error\") {\n const total = configStatus?.requiredTotal;\n return total\n ? `Not configured (${total} required field${total !== 1 ? \"s\" : \"\"})`\n : \"Not configured\";\n }\n return \"Unknown action\";\n })();\n\n const statusIcon: ReactNode = (() => {\n switch (statusValue) {\n case \"valid\":\n return resolveIcon(icons?.statusValid, <CheckCircleSvg />);\n case \"warning\":\n return resolveIcon(icons?.statusWarning, <AlertTriangleSvg />);\n case \"error\":\n return resolveIcon(icons?.statusError, <XCircleSvg />);\n case \"unconfigured\":\n return resolveIcon(icons?.statusUnconfigured, <CircleDashedSvg />);\n default:\n return null;\n }\n })();\n\n const nodeStyle: CSSProperties = {\n left: node.position.x,\n top: node.position.y,\n cursor: isDragging ? \"grabbing\" : \"grab\",\n WebkitFontSmoothing: \"antialiased\",\n MozOsxFontSmoothing: \"grayscale\",\n textRendering: \"geometricPrecision\",\n willChange: \"transform\",\n backfaceVisibility: \"hidden\",\n perspective: \"1000px\",\n ...style,\n };\n\n const outputIsBranching = node.ports.output.length > 1;\n const subtitle = node.type === \"trigger\" ? \"Start\" : \"Action\";\n const triggerDescription =\n typeof node.config?.description === \"string\" ? node.config.description : \"Manually Triggered\";\n const actionName =\n node.type === \"action\" && typeof node.config?.name === \"string\" ? node.config.name : null;\n\n return (\n <motion.div\n ref={ref}\n data-node-id={node.id}\n className={cn(\n \"ods-flow-node\",\n `ods-flow-node--${node.type}`,\n node.selected && \"ods-flow-node--selected\",\n isDragging && \"ods-flow-node--dragging\",\n isConfigOpen && \"ods-flow-node--config-open\",\n className,\n )}\n style={nodeStyle}\n onClick={handleClick}\n onMouseDown={handleMouseDown}\n onTouchStart={handleTouchStart}\n initial={{ scale: 0.8, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n exit={{ scale: 0.8, opacity: 0 }}\n transition={{ type: \"spring\", stiffness: 300, damping: 25 }}\n >\n {/* Config status indicator */}\n {statusIcon && statusValue !== \"hidden\" && (\n <div\n className={cn(\n \"ods-flow-node__status\",\n statusValue && `ods-flow-node__status--${statusValue}`,\n )}\n title={statusTitle}\n data-flow-node-no-drag=\"true\"\n >\n {statusIcon}\n </div>\n )}\n\n {/* Header band */}\n <div className=\"ods-flow-node__header\">\n <div className=\"ods-flow-node__header-left\">\n {node.icon ? (\n <div className=\"ods-flow-node__icon\">{node.icon as ReactNode}</div>\n ) : null}\n <div className=\"ods-flow-node__title\">\n <div className=\"ods-flow-node__label\">{node.label}</div>\n </div>\n </div>\n </div>\n\n {/* Body */}\n <div className=\"ods-flow-node__body\">\n <div className=\"ods-flow-node__content\">\n {node.icon ? (\n <div className=\"ods-flow-node__content-icon\">{node.icon as ReactNode}</div>\n ) : null}\n <div className=\"ods-flow-node__content-text\">\n <div className=\"ods-flow-node__content-title\">{node.label}</div>\n <div className=\"ods-flow-node__content-subtitle\">{subtitle}</div>\n\n {node.type === \"trigger\" && (\n <div className=\"ods-flow-node__content-info\">\n {resolveIcon(icons?.trigger, <PlaySvg />)}\n <span>{triggerDescription}</span>\n </div>\n )}\n {actionName && (\n <div className=\"ods-flow-node__content-info\">\n {resolveIcon(icons?.action, <LinkSvg />)}\n <span>{actionName}</span>\n </div>\n )}\n </div>\n </div>\n\n {node.description && (\n <div className=\"ods-flow-node__description\">\n {node.description.length > 50\n ? `${node.description.substring(0, 50)}...`\n : node.description}\n </div>\n )}\n\n {!isLockMode && onDelete && (\n <button\n type=\"button\"\n className=\"ods-flow-node__delete-btn\"\n data-flow-node-no-drag=\"true\"\n onClick={handleDelete}\n title=\"Delete node\"\n aria-label={`Delete ${node.label}`}\n >\n {resolveIcon(icons?.delete, <TrashSvg />)}\n </button>\n )}\n </div>\n\n {/* Input ports */}\n {node.ports.input.length > 0 && (\n <div className=\"ods-flow-node__ports ods-flow-node__ports--input\">\n {node.ports.input.map((port) => {\n const validation = connectingFrom\n ? validateConnection?.(node.id, port.id, \"input\") ?? { valid: true }\n : { valid: true };\n const isConnectingPort =\n connectingFrom?.nodeId === node.id && connectingFrom?.portId === port.id;\n const showConnectable =\n !!connectingFrom && connectingFrom.portType === \"output\" && validation.valid;\n const showInvalid = !!connectingFrom && !validation.valid;\n const edgeSelected = isPortEdgeSelected(port.id, \"input\");\n\n return (\n <div\n key={port.id}\n className={cn(\n \"ods-flow-node__port\",\n port.connected && \"ods-flow-node__port--connected\",\n isConnectingPort && \"ods-flow-node__port--connecting\",\n showConnectable && \"ods-flow-node__port--connectable\",\n showInvalid && \"ods-flow-node__port--invalid\",\n edgeSelected && \"ods-flow-node__port--edge-selected\",\n )}\n data-port-id={port.id}\n data-port-type=\"input\"\n title={showInvalid ? validation.reason : port.id}\n onMouseDown={(e) => handlePortMouseDown(e, port.id, \"input\")}\n onMouseUp={(e) => handlePortMouseUp(e, port.id, \"input\")}\n >\n <div className=\"ods-flow-node__port-dot\" />\n </div>\n );\n })}\n </div>\n )}\n\n {/* Output ports */}\n {node.ports.output.length > 0 && (\n <div\n className={cn(\n \"ods-flow-node__ports\",\n \"ods-flow-node__ports--output\",\n outputIsBranching && \"ods-flow-node__ports--branching\",\n )}\n >\n {node.ports.output.map((port) => {\n const validation = connectingFrom\n ? validateConnection?.(node.id, port.id, \"output\") ?? { valid: true }\n : { valid: true };\n const isConnectingPort =\n connectingFrom?.nodeId === node.id && connectingFrom?.portId === port.id;\n const showConnectable =\n !!connectingFrom && connectingFrom.portType === \"input\" && validation.valid;\n const showInvalid = !!connectingFrom && !validation.valid;\n const edgeSelected = isPortEdgeSelected(port.id, \"output\");\n\n return (\n <div\n key={port.id}\n className={cn(\n \"ods-flow-node__port\",\n port.connected && \"ods-flow-node__port--connected\",\n isConnectingPort && \"ods-flow-node__port--connecting\",\n showConnectable && \"ods-flow-node__port--connectable\",\n showInvalid && \"ods-flow-node__port--invalid\",\n edgeSelected && \"ods-flow-node__port--edge-selected\",\n port.label && \"ods-flow-node__port--labeled\",\n )}\n data-port-id={port.id}\n data-port-type=\"output\"\n title={showInvalid ? validation.reason : port.label || port.id}\n onMouseDown={(e) => handlePortMouseDown(e, port.id, \"output\")}\n onMouseUp={(e) => handlePortMouseUp(e, port.id, \"output\")}\n >\n {port.label && (\n <span className=\"ods-flow-node__port-label\">{port.label}</span>\n )}\n <div className=\"ods-flow-node__port-dot\" />\n </div>\n );\n })}\n </div>\n )}\n\n {/* Execution overlay */}\n {node.status === \"running\" && (\n <motion.div\n className=\"ods-flow-node__running-overlay\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n data-flow-node-no-drag=\"true\"\n >\n {resolveIcon(icons?.running, <LoaderSvg />)}\n </motion.div>\n )}\n </motion.div>\n );\n },\n);\n\nFlowNode.displayName = \"FlowNode\";\n\n// Export node width constant for consumers that need to lay out nodes or edges.\nexport const FLOW_NODE_WIDTH = DEFAULT_NODE_WIDTH;\n","\"use client\";\n\nimport { type ComponentPropsWithoutRef } from 'react';\nimport { cn } from '../../utils/cn';\nimport type { WorkflowEdge as WorkflowEdgeType, WorkflowNode } from '../../workflow/types';\n\nexport interface FlowEdgeProps extends Omit<ComponentPropsWithoutRef<'g'>, 'id' | 'onSelect'> {\n edge: WorkflowEdgeType;\n nodes?: WorkflowNode[];\n onSelect?: (id: string) => void;\n onDelete?: (id: string) => void;\n}\n\n/**\n * FlowEdge - Connection line between workflow nodes\n *\n * TODO: This is a stub implementation. Full feature set from octaviaflow-ui needs to be ported:\n * - Bezier curve calculations\n * - Selection handling\n * - Delete button\n * - Hover states\n * - Port-aware positioning\n *\n * See: octaviaflow-ui/src/components/WorkflowEdge for full implementation\n */\nexport function FlowEdge({ edge, nodes = [], onSelect, className, ...props }: FlowEdgeProps) {\n // Simple straight line for stub - TODO: implement bezier curves\n const sourceNode = nodes.find(n => n.id === edge.source);\n const targetNode = nodes.find(n => n.id === edge.target);\n\n if (!sourceNode || !targetNode) {\n return null;\n }\n\n const startX = sourceNode.position.x + 184; // half of node width (368/2)\n const startY = sourceNode.position.y + 108; // node height\n const endX = targetNode.position.x + 184;\n const endY = targetNode.position.y;\n\n const path = `M ${startX},${startY} L ${endX},${endY}`;\n\n return (\n <g\n className={cn('ods-flow-edge', className)}\n onClick={() => onSelect?.(edge.id)}\n {...props}\n >\n {/* Invisible hitbox for easier clicking */}\n <path\n d={path}\n className=\"ods-flow-edge__hitbox\"\n stroke=\"transparent\"\n strokeWidth={20}\n fill=\"none\"\n />\n\n {/* Visible path */}\n <path\n d={path}\n className={cn(\n 'ods-flow-edge__path',\n edge.selected && 'ods-flow-edge__path--selected'\n )}\n stroke=\"#8b8ca0\"\n strokeWidth={2}\n fill=\"none\"\n />\n </g>\n );\n}\n","\"use client\";\nimport { type MouseEvent, useCallback, useMemo } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface FlowMinimapNode {\n id: string;\n x: number;\n y: number;\n width: number;\n height: number;\n color?: string;\n}\n\nexport interface FlowMinimapEdge {\n from: { x: number; y: number };\n to: { x: number; y: number };\n}\n\nexport interface FlowMinimapViewportRect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface FlowMinimapProps {\n nodes?: FlowMinimapNode[];\n edges?: FlowMinimapEdge[];\n viewportRect?: FlowMinimapViewportRect;\n totalWidth?: number;\n totalHeight?: number;\n onViewportChange?: (x: number, y: number) => void;\n className?: string;\n}\n\nconst MINIMAP_WIDTH = 140;\nconst MINIMAP_HEIGHT = 100;\n\nexport function FlowMinimap({\n nodes = [],\n edges = [],\n viewportRect,\n totalWidth = 2000,\n totalHeight = 1500,\n onViewportChange,\n className,\n}: FlowMinimapProps) {\n const scaleX = MINIMAP_WIDTH / totalWidth;\n const scaleY = MINIMAP_HEIGHT / totalHeight;\n\n const scaledNodes = useMemo(\n () =>\n nodes.map((n) => ({\n ...n,\n sx: n.x * scaleX,\n sy: n.y * scaleY,\n sw: Math.max(n.width * scaleX, 4),\n sh: Math.max(n.height * scaleY, 3),\n })),\n [nodes, scaleX, scaleY],\n );\n\n const scaledEdges = useMemo(\n () =>\n edges.map((e) => ({\n x1: e.from.x * scaleX,\n y1: e.from.y * scaleY,\n x2: e.to.x * scaleX,\n y2: e.to.y * scaleY,\n })),\n [edges, scaleX, scaleY],\n );\n\n const scaledViewport = useMemo(() => {\n if (!viewportRect) return null;\n return {\n x: viewportRect.x * scaleX,\n y: viewportRect.y * scaleY,\n width: viewportRect.width * scaleX,\n height: viewportRect.height * scaleY,\n };\n }, [viewportRect, scaleX, scaleY]);\n\n const handleClick = useCallback(\n (e: MouseEvent<SVGSVGElement>) => {\n if (!onViewportChange) return;\n const rect = e.currentTarget.getBoundingClientRect();\n const clickX = e.clientX - rect.left;\n const clickY = e.clientY - rect.top;\n const worldX = clickX / scaleX;\n const worldY = clickY / scaleY;\n onViewportChange(worldX, worldY);\n },\n [onViewportChange, scaleX, scaleY],\n );\n\n return (\n <div className={cn('ods-flow-minimap', className)} data-testid=\"flow-minimap\">\n <svg\n width={MINIMAP_WIDTH}\n height={MINIMAP_HEIGHT}\n viewBox={`0 0 ${MINIMAP_WIDTH} ${MINIMAP_HEIGHT}`}\n onClick={handleClick}\n data-testid=\"flow-minimap-svg\"\n >\n {/* Edges */}\n {scaledEdges.map((e, i) => (\n <line\n key={i}\n x1={e.x1}\n y1={e.y1}\n x2={e.x2}\n y2={e.y2}\n className={'ods-flow-minimap__edge'}\n />\n ))}\n\n {/* Nodes */}\n {scaledNodes.map((n) => (\n <rect\n key={n.id}\n x={n.sx}\n y={n.sy}\n width={n.sw}\n height={n.sh}\n rx={1}\n fill={n.color || \"var(--ods-color-brand-500, #3b5bff)\"}\n className={'ods-flow-minimap__node'}\n data-testid={`minimap-node-${n.id}`}\n />\n ))}\n\n {/* Viewport rectangle */}\n {scaledViewport && (\n <rect\n x={scaledViewport.x}\n y={scaledViewport.y}\n width={scaledViewport.width}\n height={scaledViewport.height}\n className={'ods-flow-minimap__viewport'}\n data-testid=\"minimap-viewport\"\n />\n )}\n </svg>\n </div>\n );\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface FlowToolbarProps {\n children?: ReactNode;\n /** \"left\" / \"right\" pin to side and stack vertically; \"top\" / \"bottom\" stack horizontally. */\n placement?: \"left\" | \"top\" | \"right\" | \"bottom\";\n className?: string;\n}\n\nexport function FlowToolbar({ children, placement = \"left\", className }: FlowToolbarProps) {\n return (\n <div\n className={cn(\"ods-flow-toolbar\", `ods-flow-toolbar--${placement}`, className)}\n role=\"toolbar\"\n aria-label=\"Canvas toolbar\"\n >\n {children}\n </div>\n );\n}\n\nexport interface FlowToolbarButtonProps {\n icon: ReactNode;\n label: string;\n onClick?: () => void;\n active?: boolean;\n disabled?: boolean;\n danger?: boolean;\n /** Optional keyboard shortcut hint — shown in the tooltip. */\n shortcut?: string;\n /** When provided, acts as the hover-tooltip text. Defaults to `label`. */\n tooltip?: string;\n className?: string;\n}\n\nexport function FlowToolbarButton({\n icon,\n label,\n onClick,\n active = false,\n disabled = false,\n danger = false,\n shortcut,\n tooltip,\n className,\n}: FlowToolbarButtonProps) {\n const hoverLabel = tooltip ?? label;\n const title = shortcut ? `${hoverLabel} (${shortcut})` : hoverLabel;\n return (\n <span\n className=\"ods-flow-toolbar__btn-wrapper\"\n data-tooltip={title}\n >\n <button\n type=\"button\"\n className={cn(\n \"ods-flow-toolbar__btn\",\n active && \"ods-flow-toolbar__btn--active\",\n danger && \"ods-flow-toolbar__btn--danger\",\n className,\n )}\n onClick={onClick}\n disabled={disabled}\n aria-label={label}\n aria-pressed={active}\n title={title}\n >\n <span className=\"ods-flow-toolbar__btn-icon\">{icon}</span>\n </button>\n </span>\n );\n}\n\nexport interface FlowToolbarDividerProps {\n className?: string;\n}\n\nexport function FlowToolbarDivider({ className }: FlowToolbarDividerProps) {\n return <span className={cn(\"ods-flow-toolbar__divider\", className)} aria-hidden=\"true\" />;\n}\n\nexport interface FlowToolbarZoomProps {\n zoom: number;\n onZoomIn?: () => void;\n onZoomOut?: () => void;\n onFit?: () => void;\n onReset?: () => void;\n className?: string;\n}\n\n// ── Shared icon set — kept simple lucide-style, stroke-based ─────────────────\nconst SVG_BASE = {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\" as const,\n strokeLinejoin: \"round\" as const,\n \"aria-hidden\": true,\n};\nconst mkIcon = (children: ReactNode) => (\n <svg {...SVG_BASE} width=\"16\" height=\"16\">\n {children}\n </svg>\n);\n\nexport const FlowToolbarIcons = {\n save: mkIcon(\n <>\n <path d=\"M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z\" />\n <polyline points=\"17 21 17 13 7 13 7 21\" />\n <polyline points=\"7 3 7 8 15 8\" />\n </>,\n ),\n run: mkIcon(<polygon points=\"6 4 20 12 6 20 6 4\" fill=\"currentColor\" stroke=\"none\" />),\n stop: mkIcon(<rect x=\"6\" y=\"6\" width=\"12\" height=\"12\" rx=\"1\" />),\n lock: mkIcon(\n <>\n <rect x=\"4\" y=\"11\" width=\"16\" height=\"10\" rx=\"2\" />\n <path d=\"M8 11V7a4 4 0 0 1 8 0v4\" />\n </>,\n ),\n unlock: mkIcon(\n <>\n <rect x=\"4\" y=\"11\" width=\"16\" height=\"10\" rx=\"2\" />\n <path d=\"M8 11V7a4 4 0 0 1 8 0\" />\n </>,\n ),\n reset: mkIcon(\n <>\n <polyline points=\"1 4 1 10 7 10\" />\n <path d=\"M3.51 15a9 9 0 1 0 2.13-9.36L1 10\" />\n </>,\n ),\n undo: mkIcon(\n <>\n <path d=\"M3 7v6h6\" />\n <path d=\"M21 17a9 9 0 0 0-9-9 9 9 0 0 0-7.07 3.43L3 13\" />\n </>,\n ),\n redo: mkIcon(\n <>\n <path d=\"M21 7v6h-6\" />\n <path d=\"M3 17a9 9 0 0 1 9-9 9 9 0 0 1 7.07 3.43L21 13\" />\n </>,\n ),\n drawerOpen: mkIcon(\n <>\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" />\n <line x1=\"9\" y1=\"3\" x2=\"9\" y2=\"21\" />\n <polyline points=\"13 9 16 12 13 15\" />\n </>,\n ),\n drawerClose: mkIcon(\n <>\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" />\n <line x1=\"9\" y1=\"3\" x2=\"9\" y2=\"21\" />\n <polyline points=\"16 9 13 12 16 15\" />\n </>,\n ),\n settings: mkIcon(\n <>\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n <path d=\"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 2.83-2.83l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z\" />\n </>,\n ),\n history: mkIcon(\n <>\n <path d=\"M22 12A10 10 0 1 1 12 2\" />\n <polyline points=\"22 2 22 8 16 8\" />\n <polyline points=\"12 7 12 12 15 15\" />\n </>,\n ),\n debug: mkIcon(\n <>\n <polyline points=\"4 17 10 11 4 5\" />\n <line x1=\"12\" y1=\"19\" x2=\"20\" y2=\"19\" />\n </>,\n ),\n zoomIn: mkIcon(\n <>\n <circle cx=\"11\" cy=\"11\" r=\"7\" />\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\n <line x1=\"11\" y1=\"8\" x2=\"11\" y2=\"14\" />\n <line x1=\"8\" y1=\"11\" x2=\"14\" y2=\"11\" />\n </>,\n ),\n zoomOut: mkIcon(\n <>\n <circle cx=\"11\" cy=\"11\" r=\"7\" />\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\n <line x1=\"8\" y1=\"11\" x2=\"14\" y2=\"11\" />\n </>,\n ),\n zoomReset: mkIcon(\n <>\n <circle cx=\"11\" cy=\"11\" r=\"7\" />\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\n <polyline points=\"8 9 8 13 12 13\" />\n <path d=\"M14 8a4 4 0 0 1 0 6\" />\n </>,\n ),\n fit: mkIcon(\n <>\n <path d=\"M3 7V5a2 2 0 0 1 2-2h2\" />\n <path d=\"M17 3h2a2 2 0 0 1 2 2v2\" />\n <path d=\"M21 17v2a2 2 0 0 1-2 2h-2\" />\n <path d=\"M7 21H5a2 2 0 0 1-2-2v-2\" />\n </>,\n ),\n};\n\nexport function FlowToolbarZoom({\n zoom,\n onZoomIn,\n onZoomOut,\n onFit,\n onReset,\n className,\n}: FlowToolbarZoomProps) {\n return (\n <div className={cn(\"ods-flow-toolbar__zoom\", className)}>\n <FlowToolbarButton\n icon={FlowToolbarIcons.zoomIn}\n label=\"Zoom in\"\n onClick={onZoomIn}\n shortcut=\"⌘+\"\n />\n <FlowToolbarButton\n icon={FlowToolbarIcons.zoomOut}\n label=\"Zoom out\"\n onClick={onZoomOut}\n shortcut=\"⌘−\"\n />\n {onReset && (\n <FlowToolbarButton\n icon={FlowToolbarIcons.zoomReset}\n label=\"Reset zoom\"\n tooltip=\"Reset zoom to 100%\"\n onClick={onReset}\n shortcut=\"⌘0\"\n />\n )}\n {onFit && (\n <FlowToolbarButton\n icon={FlowToolbarIcons.fit}\n label=\"Fit to view\"\n onClick={onFit}\n shortcut=\"⌘.\"\n />\n )}\n <div\n className=\"ods-flow-toolbar__zoom-label\"\n aria-label={`Current zoom ${Math.round(zoom * 100)} percent`}\n title=\"Current zoom\"\n >\n {Math.round(zoom * 100)}%\n </div>\n </div>\n );\n}\n","\"use client\";\nimport { type ReactNode, useCallback, useMemo, useState } from \"react\";\nimport { useWorkflow, type UseWorkflowOptions } from \"../../hooks/useWorkflow\";\nimport { wouldCreateCycle } from \"../../workflow/validator\";\nimport { cn } from \"../../utils/cn\";\nimport { FlowCanvas } from \"../FlowCanvas/FlowCanvas\";\nimport {\n FlowToolbar,\n FlowToolbarButton,\n FlowToolbarDivider,\n FlowToolbarIcons,\n FlowToolbarZoom,\n} from \"../FlowToolbar/FlowToolbar\";\nimport type { WorkflowNode, WorkflowPolicies } from \"../../workflow/types\";\n\nexport interface WorkflowEditorProps extends UseWorkflowOptions {\n /** Slot at the top-left — defaults to FlowToolbar with common actions. */\n toolbar?: ReactNode | \"default\" | null;\n\n /** Left-side drawer slot (e.g. an ActionDrawer). Rendered before the canvas. */\n drawer?: ReactNode;\n\n /** Bottom slot (e.g. an ExecutionConsole). Rendered absolutely at the bottom. */\n console?: ReactNode;\n\n /** Minimap slot — rendered in the bottom-right of the canvas. */\n minimap?: ReactNode;\n\n /** Empty-state contents (shown when no nodes/edges). */\n emptyState?: ReactNode;\n\n /** Action side-panel (e.g. a config form) — rendered as overlay via `children`. */\n children?: ReactNode;\n\n // Editor-level callbacks\n onSave?: (workflow: ReturnType<typeof useWorkflow>[\"workflow\"]) => void;\n onRun?: () => void;\n onStop?: () => void;\n onSettings?: () => void;\n /** Called when Reset is pressed — consumer should clear workflow state or ignore. */\n onReset?: () => void;\n onToggleDrawer?: (open: boolean) => void;\n onToggleHistory?: (open: boolean) => void;\n onToggleDebug?: (open: boolean) => void;\n onToggleLockMode?: (locked: boolean) => void;\n /** Controlled lock mode. If omitted, editor owns the state. */\n isLockMode?: boolean;\n /** Controlled drawer state. If omitted, editor owns the state. */\n isDrawerOpen?: boolean;\n /** Controlled history panel state. */\n isHistoryOpen?: boolean;\n /** Controlled debug console state. */\n isDebugOpen?: boolean;\n /** Show/hide the debug button in the default toolbar. */\n isDebugModeEnabled?: boolean;\n /** Show the Run button as an active \"stop\" button while true. */\n isExecuting?: boolean;\n\n height?: number | string;\n width?: number | string;\n className?: string;\n}\n\nconst NODE_DEFAULT_WIDTH = 368;\nconst NODE_DEFAULT_HEIGHT = 108;\n\nfunction computeFitViewport(\n nodes: WorkflowNode[],\n containerWidth: number,\n containerHeight: number,\n padding = 80,\n): { x: number; y: number; zoom: number } | null {\n if (nodes.length === 0) return null;\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (const n of nodes) {\n const w = n.dimensions?.width ?? NODE_DEFAULT_WIDTH;\n const h = n.dimensions?.height ?? NODE_DEFAULT_HEIGHT;\n minX = Math.min(minX, n.position.x);\n minY = Math.min(minY, n.position.y);\n maxX = Math.max(maxX, n.position.x + w);\n maxY = Math.max(maxY, n.position.y + h);\n }\n const contentW = maxX - minX;\n const contentH = maxY - minY;\n const zoomX = (containerWidth - padding * 2) / contentW;\n const zoomY = (containerHeight - padding * 2) / contentH;\n const zoom = Math.min(zoomX, zoomY, 1.5);\n const clampedZoom = Math.max(zoom, 0.25);\n const centerX = (minX + maxX) / 2;\n const centerY = (minY + maxY) / 2;\n return {\n zoom: clampedZoom,\n x: containerWidth / 2 - centerX * clampedZoom,\n y: containerHeight / 2 - centerY * clampedZoom,\n };\n}\n\nexport function WorkflowEditor({\n toolbar = \"default\",\n drawer,\n console: consoleSlot,\n minimap,\n emptyState = <DefaultEmptyState />,\n children,\n onSave,\n onRun,\n onStop,\n onSettings,\n onReset,\n onToggleDrawer,\n onToggleHistory,\n onToggleDebug,\n onToggleLockMode,\n isLockMode: controlledLockMode,\n isDrawerOpen: controlledDrawerOpen,\n isHistoryOpen: controlledHistoryOpen,\n isDebugOpen: controlledDebugOpen,\n isDebugModeEnabled = false,\n isExecuting = false,\n height = 720,\n width = \"100%\",\n className,\n ...options\n}: WorkflowEditorProps) {\n const wf = useWorkflow(options);\n const { workflow, dispatch, canUndo, canRedo, undo, redo } = wf;\n\n // ── Uncontrolled state for lock/drawer/history/debug ────────────────────\n const [uncontrolledLock, setUncontrolledLock] = useState(false);\n const [uncontrolledDrawer, setUncontrolledDrawer] = useState(!!drawer);\n const [uncontrolledHistory, setUncontrolledHistory] = useState(false);\n const [uncontrolledDebug, setUncontrolledDebug] = useState(false);\n const isLockMode = controlledLockMode ?? uncontrolledLock;\n const isDrawerOpen = controlledDrawerOpen ?? uncontrolledDrawer;\n const isHistoryOpen = controlledHistoryOpen ?? uncontrolledHistory;\n const isDebugOpen = controlledDebugOpen ?? uncontrolledDebug;\n\n const toggleLock = useCallback(() => {\n const next = !isLockMode;\n if (controlledLockMode === undefined) setUncontrolledLock(next);\n onToggleLockMode?.(next);\n }, [isLockMode, controlledLockMode, onToggleLockMode]);\n\n const toggleDrawer = useCallback(() => {\n const next = !isDrawerOpen;\n if (controlledDrawerOpen === undefined) setUncontrolledDrawer(next);\n onToggleDrawer?.(next);\n }, [isDrawerOpen, controlledDrawerOpen, onToggleDrawer]);\n\n const toggleHistory = useCallback(() => {\n const next = !isHistoryOpen;\n if (controlledHistoryOpen === undefined) setUncontrolledHistory(next);\n onToggleHistory?.(next);\n }, [isHistoryOpen, controlledHistoryOpen, onToggleHistory]);\n\n const toggleDebug = useCallback(() => {\n const next = !isDebugOpen;\n if (controlledDebugOpen === undefined) setUncontrolledDebug(next);\n onToggleDebug?.(next);\n }, [isDebugOpen, controlledDebugOpen, onToggleDebug]);\n\n const handleReset = useCallback(() => {\n if (onReset) onReset();\n else dispatch({ type: \"RESET\" });\n }, [onReset, dispatch]);\n\n // ── Canvas sizing for fit-to-view ───────────────────────────────────────\n const [canvasSize, setCanvasSize] = useState<{ w: number; h: number }>({\n w: 0,\n h: 0,\n });\n\n const handleCanvasRef = useCallback((node: HTMLDivElement | null) => {\n if (!node) return;\n setCanvasSize({ w: node.clientWidth, h: node.clientHeight });\n }, []);\n\n const fitToView = useCallback(() => {\n const viewport = computeFitViewport(\n workflow.canvas.nodes as WorkflowNode[],\n canvasSize.w || 800,\n canvasSize.h || 600,\n );\n if (viewport) wf.setViewport(viewport);\n }, [workflow.canvas.nodes, canvasSize, wf]);\n\n const policies: WorkflowPolicies = workflow.policies;\n\n // ── Connection validation used by FlowNode ──\n const validateConnection = useCallback(\n (\n targetNodeId: string,\n targetPortId: string,\n targetPortType: \"input\" | \"output\",\n ) => {\n const from = workflow.canvas.connectingFrom;\n if (!from) return { valid: true };\n\n if (!policies.connection.allowSelfLoop && from.nodeId === targetNodeId) {\n return { valid: false, reason: \"Self-loops are not allowed\" };\n }\n if (from.portType === targetPortType) {\n return {\n valid: false,\n reason: `Cannot connect ${targetPortType} to ${targetPortType}`,\n };\n }\n const maxPerNode = policies.connection.maxConnectionsPerNode;\n if (maxPerNode !== undefined) {\n const count = workflow.canvas.edges.filter(\n (e) => e.source === targetNodeId || e.target === targetNodeId,\n ).length;\n if (count >= maxPerNode) {\n return { valid: false, reason: `Max ${maxPerNode} connections per node` };\n }\n }\n if (!policies.connection.allowMultipleInputs && targetPortType === \"input\") {\n if (\n workflow.canvas.edges.some(\n (e) => e.target === targetNodeId && e.targetPort === targetPortId,\n )\n ) {\n return { valid: false, reason: \"Port already has a connection\" };\n }\n }\n if (!policies.connection.allowMultipleOutputs && targetPortType === \"output\") {\n if (\n workflow.canvas.edges.some(\n (e) => e.source === targetNodeId && e.sourcePort === targetPortId,\n )\n ) {\n return { valid: false, reason: \"Port already has a connection\" };\n }\n }\n if (policies.connection.preventCircularDependencies) {\n const [src, tgt] = from.portType === \"output\"\n ? [from.nodeId, targetNodeId]\n : [targetNodeId, from.nodeId];\n if (wouldCreateCycle(src, tgt, workflow.canvas.edges)) {\n return { valid: false, reason: \"Would create a circular dependency\" };\n }\n }\n return { valid: true };\n },\n [policies, workflow.canvas.connectingFrom, workflow.canvas.edges],\n );\n\n const handleEndConnecting = useCallback(\n (\n target:\n | { nodeId: string; portId: string; portType: \"input\" | \"output\" }\n | null,\n ) => {\n const from = workflow.canvas.connectingFrom;\n if (!from) return;\n if (!target) {\n wf.endConnecting();\n return;\n }\n const result = validateConnection(target.nodeId, target.portId, target.portType);\n if (!result.valid) {\n wf.endConnecting();\n return;\n }\n if (from.portType === \"output\" && target.portType === \"input\") {\n wf.createEdge(from.nodeId, from.portId, target.nodeId, target.portId);\n } else if (from.portType === \"input\" && target.portType === \"output\") {\n wf.createEdge(target.nodeId, target.portId, from.nodeId, from.portId);\n }\n wf.endConnecting();\n },\n [workflow.canvas.connectingFrom, validateConnection, wf],\n );\n\n const selectedNodeId = workflow.canvas.selectedNodes[0];\n\n // ── Default toolbar: Save / Run / Lock / Reset / Drawer / Settings / History / Zoom ──\n const defaultToolbar = useMemo(\n () => (\n <FlowToolbar placement=\"left\">\n {onSave && (\n <FlowToolbarButton\n icon={FlowToolbarIcons.save}\n label=\"Save\"\n shortcut=\"⌘S\"\n onClick={() => onSave(workflow)}\n />\n )}\n {onRun && (\n <FlowToolbarButton\n icon={isExecuting ? FlowToolbarIcons.stop : FlowToolbarIcons.run}\n label={isExecuting ? \"Stop\" : \"Run\"}\n tooltip={isExecuting ? \"Running — click to stop\" : \"Run workflow\"}\n shortcut=\"⌘↵\"\n active={isExecuting}\n onClick={isExecuting ? onStop : onRun}\n />\n )}\n <FlowToolbarButton\n icon={isLockMode ? FlowToolbarIcons.lock : FlowToolbarIcons.unlock}\n label={isLockMode ? \"Unlock canvas\" : \"Lock canvas\"}\n tooltip={isLockMode ? \"Unlock canvas (edit mode)\" : \"Lock canvas\"}\n active={isLockMode}\n onClick={toggleLock}\n />\n <FlowToolbarButton\n icon={FlowToolbarIcons.reset}\n label=\"Reset canvas\"\n onClick={handleReset}\n />\n {drawer && (\n <FlowToolbarButton\n icon={isDrawerOpen ? FlowToolbarIcons.drawerClose : FlowToolbarIcons.drawerOpen}\n label={isDrawerOpen ? \"Hide actions drawer\" : \"Show actions drawer\"}\n active={isDrawerOpen}\n onClick={toggleDrawer}\n />\n )}\n <FlowToolbarDivider />\n {onSettings && (\n <FlowToolbarButton\n icon={FlowToolbarIcons.settings}\n label=\"Settings\"\n onClick={onSettings}\n />\n )}\n <FlowToolbarButton\n icon={FlowToolbarIcons.history}\n label={isHistoryOpen ? \"Hide history\" : \"Show history\"}\n active={isHistoryOpen}\n onClick={toggleHistory}\n />\n {isDebugModeEnabled && (\n <FlowToolbarButton\n icon={FlowToolbarIcons.debug}\n label={isDebugOpen ? \"Hide debug console\" : \"Show debug console\"}\n active={isDebugOpen}\n onClick={toggleDebug}\n />\n )}\n <FlowToolbarDivider />\n <FlowToolbarButton\n icon={FlowToolbarIcons.undo}\n label=\"Undo\"\n shortcut=\"⌘Z\"\n disabled={!canUndo}\n onClick={undo}\n />\n <FlowToolbarButton\n icon={FlowToolbarIcons.redo}\n label=\"Redo\"\n shortcut=\"⌘⇧Z\"\n disabled={!canRedo}\n onClick={redo}\n />\n <FlowToolbarDivider />\n <FlowToolbarZoom\n zoom={workflow.canvas.viewport.zoom}\n onZoomIn={wf.zoomIn}\n onZoomOut={wf.zoomOut}\n onReset={wf.resetViewport}\n onFit={fitToView}\n />\n </FlowToolbar>\n ),\n [\n onSave,\n onRun,\n onStop,\n onSettings,\n isExecuting,\n isLockMode,\n isDrawerOpen,\n isHistoryOpen,\n isDebugOpen,\n isDebugModeEnabled,\n drawer,\n toggleLock,\n toggleDrawer,\n toggleHistory,\n toggleDebug,\n handleReset,\n canUndo,\n canRedo,\n undo,\n redo,\n workflow,\n wf,\n fitToView,\n ],\n );\n\n const resolvedToolbar =\n toolbar === \"default\" ? defaultToolbar : toolbar === null ? null : toolbar;\n\n return (\n <div\n className={cn(\"ods-workflow-editor\", className)}\n style={{ width, height, position: \"relative\", display: \"flex\", overflow: \"hidden\" }}\n >\n {drawer && isDrawerOpen && (\n <div className=\"ods-workflow-editor__drawer\">{drawer}</div>\n )}\n <div\n ref={handleCanvasRef}\n className=\"ods-workflow-editor__canvas-wrapper\"\n style={{ position: \"relative\", flex: 1, minWidth: 0 }}\n >\n <FlowCanvas\n nodes={workflow.canvas.nodes as WorkflowNode[]}\n edges={workflow.canvas.edges}\n viewport={workflow.canvas.viewport}\n connectingFrom={workflow.canvas.connectingFrom}\n selectedNodeId={selectedNodeId}\n isLockMode={isLockMode}\n onViewportChange={wf.setViewport}\n onNodeSelect={(id) => wf.selectNode(id)}\n onEdgeSelect={wf.selectEdge}\n onDeselectAll={wf.deselectAll}\n onNodePositionChange={(id, pos) => wf.updateNode(id, { position: pos })}\n onNodeDelete={wf.deleteNode}\n onNodesDelete={wf.deleteNodes}\n onEdgeDelete={wf.deleteEdge}\n onStartConnecting={(nodeId, portId, portType) =>\n dispatch({ type: \"START_CONNECTING\", payload: { nodeId, portId, portType } })\n }\n onEndConnecting={handleEndConnecting}\n validateConnection={validateConnection}\n emptyState={emptyState}\n >\n {resolvedToolbar}\n {minimap && (\n <div className=\"ods-workflow-editor__minimap\">{minimap}</div>\n )}\n {consoleSlot && (\n <div className=\"ods-workflow-editor__console\">{consoleSlot}</div>\n )}\n {children}\n </FlowCanvas>\n </div>\n </div>\n );\n}\n\nfunction DefaultEmptyState() {\n return (\n <div\n style={{\n textAlign: \"center\",\n color: \"#8b8ca0\",\n maxWidth: 280,\n lineHeight: 1.5,\n }}\n >\n <div style={{ fontSize: 14, fontWeight: 600, color: \"#1e1b4b\", marginBottom: 4 }}>\n Start with a trigger\n </div>\n <div style={{ fontSize: 12 }}>\n Drop an action here, or use the drawer to add your first node.\n </div>\n </div>\n );\n}\n","\"use client\";\nimport { useCallback, useMemo, useReducer } from \"react\";\nimport { validateWorkflow } from \"../workflow/validator\";\nimport {\n type CanvasViewport,\n DEFAULT_WORKFLOW_POLICIES,\n type Position,\n type ValidationResult,\n type Workflow,\n type WorkflowAction,\n type WorkflowEdge,\n type WorkflowNode,\n type WorkflowPolicies,\n} from \"../workflow/types\";\n\n// ── Initial workflow ────────────────────────────────────────────────────────\nconst now = () => new Date().toISOString();\n\nfunction buildInitialWorkflow(\n overrides: Partial<Workflow> = {},\n): Workflow {\n const base: Workflow = {\n metadata: {\n id: \"\",\n name: \"Untitled Workflow\",\n projectId: undefined,\n version: \"1.0.0\",\n status: \"draft\",\n createdAt: now(),\n updatedAt: now(),\n tags: [],\n },\n canvas: {\n nodes: [],\n edges: [],\n viewport: { x: 0, y: 0, zoom: 1 },\n selectedNodes: [],\n selectedEdges: [],\n isDragging: false,\n isPanning: false,\n isConnecting: false,\n settings: {\n snapToGrid: true,\n gridSize: 20,\n showGrid: true,\n showMinimap: false,\n autoLayout: false,\n useAdvancedLayout: false,\n theme: \"light\",\n },\n history: { past: [], future: [] },\n },\n policies: DEFAULT_WORKFLOW_POLICIES,\n validation: { isValid: true, errors: [], warnings: [] },\n };\n return {\n ...base,\n ...overrides,\n metadata: { ...base.metadata, ...(overrides.metadata ?? {}) },\n canvas: { ...base.canvas, ...(overrides.canvas ?? {}) },\n policies: { ...base.policies, ...(overrides.policies ?? {}) },\n };\n}\n\n// ── Reducer helpers ────────────────────────────────────────────────────────\nfunction withValidation(state: Workflow): Workflow {\n return { ...state, validation: validateWorkflow(state.canvas.nodes, state.canvas.edges) };\n}\n\nfunction snapshot(state: Workflow): Pick<Workflow[\"canvas\"], \"nodes\" | \"edges\"> {\n return { nodes: state.canvas.nodes, edges: state.canvas.edges };\n}\n\nfunction withHistoryCheckpoint(state: Workflow): Workflow {\n return {\n ...state,\n canvas: {\n ...state.canvas,\n history: {\n past: [...state.canvas.history.past, snapshot(state)].slice(-50),\n future: [],\n },\n },\n };\n}\n\n// ── Reducer ─────────────────────────────────────────────────────────────────\nfunction reducer(state: Workflow, action: WorkflowAction): Workflow {\n switch (action.type) {\n case \"ADD_NODE\": {\n const checkpoint = withHistoryCheckpoint(state);\n return withValidation({\n ...checkpoint,\n canvas: { ...checkpoint.canvas, nodes: [...checkpoint.canvas.nodes, action.payload] },\n metadata: { ...checkpoint.metadata, updatedAt: now() },\n });\n }\n case \"UPDATE_NODE\": {\n const { id, updates } = action.payload;\n return withValidation({\n ...state,\n canvas: {\n ...state.canvas,\n nodes: state.canvas.nodes.map((n) =>\n n.id === id ? { ...n, ...updates, updatedAt: now() } : n,\n ),\n },\n metadata: { ...state.metadata, updatedAt: now() },\n });\n }\n case \"DELETE_NODE\": {\n const checkpoint = withHistoryCheckpoint(state);\n const nodeId = action.payload;\n return withValidation({\n ...checkpoint,\n canvas: {\n ...checkpoint.canvas,\n nodes: checkpoint.canvas.nodes.filter((n) => n.id !== nodeId),\n edges: checkpoint.canvas.edges.filter(\n (e) => e.source !== nodeId && e.target !== nodeId,\n ),\n selectedNodes: checkpoint.canvas.selectedNodes.filter((id) => id !== nodeId),\n },\n metadata: { ...checkpoint.metadata, updatedAt: now() },\n });\n }\n case \"DELETE_NODES\": {\n const checkpoint = withHistoryCheckpoint(state);\n const ids = action.payload;\n return withValidation({\n ...checkpoint,\n canvas: {\n ...checkpoint.canvas,\n nodes: checkpoint.canvas.nodes.filter((n) => !ids.includes(n.id)),\n edges: checkpoint.canvas.edges.filter(\n (e) => !ids.includes(e.source) && !ids.includes(e.target),\n ),\n selectedNodes: checkpoint.canvas.selectedNodes.filter((id) => !ids.includes(id)),\n },\n metadata: { ...checkpoint.metadata, updatedAt: now() },\n });\n }\n case \"ADD_EDGE\": {\n const checkpoint = withHistoryCheckpoint(state);\n return withValidation({\n ...checkpoint,\n canvas: { ...checkpoint.canvas, edges: [...checkpoint.canvas.edges, action.payload] },\n metadata: { ...checkpoint.metadata, updatedAt: now() },\n });\n }\n case \"DELETE_EDGE\": {\n const checkpoint = withHistoryCheckpoint(state);\n const edgeId = action.payload;\n return withValidation({\n ...checkpoint,\n canvas: {\n ...checkpoint.canvas,\n edges: checkpoint.canvas.edges.filter((e) => e.id !== edgeId),\n selectedEdges: checkpoint.canvas.selectedEdges.filter((id) => id !== edgeId),\n },\n metadata: { ...checkpoint.metadata, updatedAt: now() },\n });\n }\n case \"DELETE_EDGES\": {\n const checkpoint = withHistoryCheckpoint(state);\n const ids = action.payload;\n return withValidation({\n ...checkpoint,\n canvas: {\n ...checkpoint.canvas,\n edges: checkpoint.canvas.edges.filter((e) => !ids.includes(e.id)),\n selectedEdges: checkpoint.canvas.selectedEdges.filter((id) => !ids.includes(id)),\n },\n metadata: { ...checkpoint.metadata, updatedAt: now() },\n });\n }\n case \"SELECT_NODE\": {\n const id = action.payload;\n return {\n ...state,\n canvas: {\n ...state.canvas,\n selectedNodes: [id],\n selectedEdges: [],\n nodes: state.canvas.nodes.map((n) => ({ ...n, selected: n.id === id })),\n edges: state.canvas.edges.map((e) => ({ ...e, selected: false })),\n },\n };\n }\n case \"SELECT_NODES\": {\n const ids = action.payload;\n return {\n ...state,\n canvas: {\n ...state.canvas,\n selectedNodes: ids,\n selectedEdges: [],\n nodes: state.canvas.nodes.map((n) => ({ ...n, selected: ids.includes(n.id) })),\n edges: state.canvas.edges.map((e) => ({ ...e, selected: false })),\n },\n };\n }\n case \"SELECT_EDGE\": {\n const id = action.payload;\n return {\n ...state,\n canvas: {\n ...state.canvas,\n selectedNodes: [],\n selectedEdges: [id],\n nodes: state.canvas.nodes.map((n) => ({ ...n, selected: false })),\n edges: state.canvas.edges.map((e) => ({ ...e, selected: e.id === id })),\n },\n };\n }\n case \"DESELECT_ALL\":\n return {\n ...state,\n canvas: {\n ...state.canvas,\n selectedNodes: [],\n selectedEdges: [],\n nodes: state.canvas.nodes.map((n) => ({ ...n, selected: false })),\n edges: state.canvas.edges.map((e) => ({ ...e, selected: false })),\n },\n };\n case \"UPDATE_VIEWPORT\":\n return {\n ...state,\n canvas: { ...state.canvas, viewport: { ...state.canvas.viewport, ...action.payload } },\n };\n case \"UPDATE_SETTINGS\":\n return {\n ...state,\n canvas: { ...state.canvas, settings: { ...state.canvas.settings, ...action.payload } },\n };\n case \"START_CONNECTING\":\n return {\n ...state,\n canvas: { ...state.canvas, isConnecting: true, connectingFrom: action.payload },\n };\n case \"END_CONNECTING\":\n return {\n ...state,\n canvas: { ...state.canvas, isConnecting: false, connectingFrom: undefined },\n };\n case \"REPLACE_NODES\": {\n const checkpoint = withHistoryCheckpoint(state);\n return withValidation({\n ...checkpoint,\n canvas: { ...checkpoint.canvas, nodes: action.payload },\n metadata: { ...checkpoint.metadata, updatedAt: now() },\n });\n }\n case \"REPLACE_EDGES\": {\n const checkpoint = withHistoryCheckpoint(state);\n return withValidation({\n ...checkpoint,\n canvas: { ...checkpoint.canvas, edges: action.payload },\n metadata: { ...checkpoint.metadata, updatedAt: now() },\n });\n }\n case \"UNDO\": {\n const { past, future } = state.canvas.history;\n if (past.length === 0) return state;\n const previous = past[past.length - 1];\n const newPast = past.slice(0, -1);\n return withValidation({\n ...state,\n canvas: {\n ...state.canvas,\n nodes: previous.nodes,\n edges: previous.edges,\n history: {\n past: newPast,\n future: [snapshot(state), ...future].slice(0, 50),\n },\n },\n });\n }\n case \"REDO\": {\n const { past, future } = state.canvas.history;\n if (future.length === 0) return state;\n const [next, ...rest] = future;\n return withValidation({\n ...state,\n canvas: {\n ...state.canvas,\n nodes: next.nodes,\n edges: next.edges,\n history: {\n past: [...past, snapshot(state)].slice(-50),\n future: rest,\n },\n },\n });\n }\n case \"RESET\":\n return buildInitialWorkflow();\n default:\n return state;\n }\n}\n\n// ── Hook ────────────────────────────────────────────────────────────────────\nexport interface UseWorkflowOptions {\n initialNodes?: WorkflowNode[];\n initialEdges?: WorkflowEdge[];\n initialViewport?: Partial<CanvasViewport>;\n policies?: Partial<WorkflowPolicies>;\n metadata?: Partial<Workflow[\"metadata\"]>;\n}\n\nexport interface UseWorkflowReturn {\n workflow: Workflow;\n dispatch: React.Dispatch<WorkflowAction>;\n\n // Nodes\n addNode: (node: WorkflowNode) => void;\n createNode: (partial: Partial<WorkflowNode> & { label: string; position: Position }) => WorkflowNode;\n updateNode: (id: string, updates: Partial<WorkflowNode>) => void;\n deleteNode: (id: string) => void;\n deleteNodes: (ids: string[]) => void;\n replaceNodes: (nodes: WorkflowNode[]) => void;\n\n // Edges\n addEdge: (edge: WorkflowEdge) => void;\n createEdge: (source: string, sourcePort: string, target: string, targetPort: string) => WorkflowEdge;\n deleteEdge: (id: string) => void;\n replaceEdges: (edges: WorkflowEdge[]) => void;\n\n // Connecting\n startConnecting: (nodeId: string, portId: string, portType: \"input\" | \"output\") => void;\n endConnecting: () => void;\n\n // Selection\n selectNode: (id: string, multi?: boolean) => void;\n selectNodes: (ids: string[]) => void;\n selectEdge: (id: string) => void;\n deselectAll: () => void;\n\n // Viewport\n zoomIn: () => void;\n zoomOut: () => void;\n resetViewport: () => void;\n setViewport: (viewport: Partial<CanvasViewport>) => void;\n\n // History\n undo: () => void;\n redo: () => void;\n canUndo: boolean;\n canRedo: boolean;\n\n // Validation\n validate: () => ValidationResult;\n}\n\nlet idCounter = 0;\nfunction genId(prefix: string): string {\n idCounter += 1;\n return `${prefix}_${Date.now().toString(36)}_${idCounter}`;\n}\n\nexport function useWorkflow(options: UseWorkflowOptions = {}): UseWorkflowReturn {\n const initial = useMemo(\n () =>\n buildInitialWorkflow({\n metadata: options.metadata ? { ...options.metadata } as Workflow[\"metadata\"] : undefined,\n canvas: {\n nodes: options.initialNodes ?? [],\n edges: options.initialEdges ?? [],\n viewport: {\n x: options.initialViewport?.x ?? 0,\n y: options.initialViewport?.y ?? 0,\n zoom: options.initialViewport?.zoom ?? 1,\n },\n selectedNodes: [],\n selectedEdges: [],\n isDragging: false,\n isPanning: false,\n isConnecting: false,\n settings: {\n snapToGrid: true,\n gridSize: 20,\n showGrid: true,\n showMinimap: false,\n autoLayout: false,\n useAdvancedLayout: false,\n theme: \"light\",\n },\n history: { past: [], future: [] },\n },\n policies: options.policies\n ? { ...DEFAULT_WORKFLOW_POLICIES, ...options.policies } as WorkflowPolicies\n : undefined,\n }),\n // Initial value only; subsequent option changes don't reset state.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [],\n );\n const [workflow, dispatch] = useReducer(reducer, initial);\n\n const addNode = useCallback((node: WorkflowNode) => dispatch({ type: \"ADD_NODE\", payload: node }), []);\n\n const createNode = useCallback(\n (partial: Partial<WorkflowNode> & { label: string; position: Position }): WorkflowNode => {\n const id = partial.id ?? genId(\"node\");\n const ports = partial.ports ?? {\n input: partial.type === \"trigger\" ? [] : [{\n id: `${id}_input_0`,\n type: \"input\" as const,\n position: \"left\" as const,\n connected: false,\n }],\n output: [{\n id: `${id}_output_0`,\n type: \"output\" as const,\n position: \"right\" as const,\n connected: false,\n }],\n };\n const node: WorkflowNode = {\n id,\n type: partial.type ?? \"action\",\n label: partial.label,\n description: partial.description,\n icon: partial.icon,\n color: partial.color,\n position: partial.position,\n config: partial.config ?? {},\n ports,\n status: partial.status ?? \"idle\",\n selected: false,\n dragging: false,\n isValid: partial.isValid ?? true,\n expanded: true,\n minimized: false,\n locked: false,\n createdAt: now(),\n updatedAt: now(),\n actionDefinitionId: partial.actionDefinitionId,\n data: partial.data,\n configStatus: partial.configStatus,\n };\n dispatch({ type: \"ADD_NODE\", payload: node });\n return node;\n },\n [],\n );\n\n const updateNode = useCallback(\n (id: string, updates: Partial<WorkflowNode>) =>\n dispatch({ type: \"UPDATE_NODE\", payload: { id, updates } }),\n [],\n );\n const deleteNode = useCallback((id: string) => dispatch({ type: \"DELETE_NODE\", payload: id }), []);\n const deleteNodes = useCallback((ids: string[]) => dispatch({ type: \"DELETE_NODES\", payload: ids }), []);\n const replaceNodes = useCallback(\n (nodes: WorkflowNode[]) => dispatch({ type: \"REPLACE_NODES\", payload: nodes }),\n [],\n );\n\n const addEdge = useCallback((edge: WorkflowEdge) => dispatch({ type: \"ADD_EDGE\", payload: edge }), []);\n const createEdge = useCallback(\n (source: string, sourcePort: string, target: string, targetPort: string): WorkflowEdge => {\n const edge: WorkflowEdge = {\n id: genId(\"edge\"),\n type: \"default\",\n source,\n sourcePort,\n target,\n targetPort,\n selected: false,\n animated: false,\n createdAt: now(),\n };\n dispatch({ type: \"ADD_EDGE\", payload: edge });\n return edge;\n },\n [],\n );\n const deleteEdge = useCallback((id: string) => dispatch({ type: \"DELETE_EDGE\", payload: id }), []);\n const replaceEdges = useCallback(\n (edges: WorkflowEdge[]) => dispatch({ type: \"REPLACE_EDGES\", payload: edges }),\n [],\n );\n\n const startConnecting = useCallback(\n (nodeId: string, portId: string, portType: \"input\" | \"output\") =>\n dispatch({ type: \"START_CONNECTING\", payload: { nodeId, portId, portType } }),\n [],\n );\n const endConnecting = useCallback(() => dispatch({ type: \"END_CONNECTING\" }), []);\n\n const selectNode = useCallback(\n (id: string, multi = false) => {\n if (multi) {\n const current = workflow.canvas.selectedNodes;\n const next = current.includes(id) ? current.filter((x) => x !== id) : [...current, id];\n dispatch({ type: \"SELECT_NODES\", payload: next });\n } else {\n dispatch({ type: \"SELECT_NODE\", payload: id });\n }\n },\n [workflow.canvas.selectedNodes],\n );\n const selectNodes = useCallback(\n (ids: string[]) => dispatch({ type: \"SELECT_NODES\", payload: ids }),\n [],\n );\n const selectEdge = useCallback((id: string) => dispatch({ type: \"SELECT_EDGE\", payload: id }), []);\n const deselectAll = useCallback(() => dispatch({ type: \"DESELECT_ALL\" }), []);\n\n const zoomIn = useCallback(() => {\n const z = Math.min(workflow.canvas.viewport.zoom * 1.2, 2);\n dispatch({ type: \"UPDATE_VIEWPORT\", payload: { zoom: z } });\n }, [workflow.canvas.viewport.zoom]);\n\n const zoomOut = useCallback(() => {\n const z = Math.max(workflow.canvas.viewport.zoom / 1.2, 0.25);\n dispatch({ type: \"UPDATE_VIEWPORT\", payload: { zoom: z } });\n }, [workflow.canvas.viewport.zoom]);\n\n const resetViewport = useCallback(\n () => dispatch({ type: \"UPDATE_VIEWPORT\", payload: { x: 0, y: 0, zoom: 1 } }),\n [],\n );\n const setViewport = useCallback(\n (viewport: Partial<CanvasViewport>) => dispatch({ type: \"UPDATE_VIEWPORT\", payload: viewport }),\n [],\n );\n\n const undo = useCallback(() => dispatch({ type: \"UNDO\" }), []);\n const redo = useCallback(() => dispatch({ type: \"REDO\" }), []);\n const canUndo = workflow.canvas.history.past.length > 0;\n const canRedo = workflow.canvas.history.future.length > 0;\n\n const validate = useCallback((): ValidationResult => workflow.validation, [workflow.validation]);\n\n return {\n workflow,\n dispatch,\n addNode,\n createNode,\n updateNode,\n deleteNode,\n deleteNodes,\n replaceNodes,\n addEdge,\n createEdge,\n deleteEdge,\n replaceEdges,\n startConnecting,\n endConnecting,\n selectNode,\n selectNodes,\n selectEdge,\n deselectAll,\n zoomIn,\n zoomOut,\n resetViewport,\n setViewport,\n undo,\n redo,\n canUndo,\n canRedo,\n validate,\n };\n}\n","import type { ValidationIssue, ValidationResult, WorkflowEdge, WorkflowNode } from \"./types\";\n\n// ── Node validation ─────────────────────────────────────────────────────────\nexport function validateNode(\n node: WorkflowNode,\n _allNodes: WorkflowNode[],\n allEdges: WorkflowEdge[],\n): ValidationIssue[] {\n const issues: ValidationIssue[] = [];\n\n if (!node.id || node.id.trim().length === 0) {\n issues.push({\n id: `node-${node.id}-id`,\n type: \"node\",\n severity: \"error\",\n message: \"Node ID is required\",\n nodeId: node.id,\n });\n }\n\n if (!node.label || (typeof node.label === \"string\" && node.label.trim().length === 0)) {\n issues.push({\n id: `node-${node.id}-label`,\n type: \"node\",\n severity: \"error\",\n message: \"Node label is required\",\n nodeId: node.id,\n });\n }\n\n if (!node.isValid) {\n issues.push({\n id: `node-${node.id}-config`,\n type: \"node\",\n severity: \"error\",\n message: `Node \"${node.label}\" has incomplete configuration`,\n nodeId: node.id,\n });\n }\n\n if (node.type !== \"trigger\") {\n const hasInput = allEdges.some((edge) => edge.target === node.id);\n if (!hasInput) {\n issues.push({\n id: `node-${node.id}-input`,\n type: \"node\",\n severity: \"warning\",\n message: `Node \"${node.label}\" has no incoming connections`,\n nodeId: node.id,\n });\n }\n }\n\n const hasOutput = allEdges.some((edge) => edge.source === node.id);\n if (!hasOutput && node.type === \"trigger\") {\n issues.push({\n id: `node-${node.id}-output`,\n type: \"node\",\n severity: \"warning\",\n message: `Trigger \"${node.label}\" has no outgoing connections`,\n nodeId: node.id,\n });\n }\n\n return issues;\n}\n\n// ── Edge validation ─────────────────────────────────────────────────────────\nexport function validateEdge(edge: WorkflowEdge, allNodes: WorkflowNode[]): ValidationIssue[] {\n const issues: ValidationIssue[] = [];\n\n const sourceNode = allNodes.find((n) => n.id === edge.source);\n if (!sourceNode) {\n issues.push({\n id: `edge-${edge.id}-source`,\n type: \"edge\",\n severity: \"error\",\n message: `Source node \"${edge.source}\" does not exist`,\n edgeId: edge.id,\n });\n }\n\n const targetNode = allNodes.find((n) => n.id === edge.target);\n if (!targetNode) {\n issues.push({\n id: `edge-${edge.id}-target`,\n type: \"edge\",\n severity: \"error\",\n message: `Target node \"${edge.target}\" does not exist`,\n edgeId: edge.id,\n });\n }\n\n if (edge.source === edge.target) {\n issues.push({\n id: `edge-${edge.id}-loop`,\n type: \"edge\",\n severity: \"error\",\n message: \"Nodes cannot connect to themselves\",\n edgeId: edge.id,\n });\n }\n\n return issues;\n}\n\n// ── Workflow-level validation ──────────────────────────────────────────────\nexport function validateWorkflow(\n nodes: WorkflowNode[],\n edges: WorkflowEdge[],\n): ValidationResult {\n const all: ValidationIssue[] = [];\n\n const hasTrigger = nodes.some((n) => n.type === \"trigger\");\n if (!hasTrigger) {\n all.push({\n id: \"workflow-trigger\",\n type: \"workflow\",\n severity: \"error\",\n message: \"Workflow must have at least one trigger node\",\n });\n }\n\n const hasAction = nodes.some((n) => n.type === \"action\");\n if (!hasAction && nodes.length > 0) {\n all.push({\n id: \"workflow-action\",\n type: \"workflow\",\n severity: \"warning\",\n message: \"Workflow should have at least one action node\",\n });\n }\n\n for (const node of nodes) all.push(...validateNode(node, nodes, edges));\n for (const edge of edges) all.push(...validateEdge(edge, nodes));\n\n // Orphan detection\n for (const node of nodes) {\n if (node.type === \"trigger\") continue;\n const connected = edges.some((e) => e.source === node.id || e.target === node.id);\n if (!connected) {\n all.push({\n id: `node-${node.id}-orphan`,\n type: \"node\",\n severity: \"warning\",\n message: `Node \"${node.label}\" is not connected to the workflow`,\n nodeId: node.id,\n });\n }\n }\n\n const errors = all.filter((e) => e.severity === \"error\");\n const warnings = all.filter((e) => e.severity === \"warning\");\n\n return { isValid: errors.length === 0, errors, warnings };\n}\n\n// ── Selectors ───────────────────────────────────────────────────────────────\nexport function getNodeValidationStatus(\n nodeId: string,\n result: ValidationResult,\n): \"valid\" | \"error\" | \"warning\" {\n if (result.errors.some((e) => e.nodeId === nodeId)) return \"error\";\n if (result.warnings.some((e) => e.nodeId === nodeId)) return \"warning\";\n return \"valid\";\n}\n\nexport function getEdgeValidationStatus(\n edgeId: string,\n result: ValidationResult,\n): \"valid\" | \"error\" | \"warning\" {\n if (result.errors.some((e) => e.edgeId === edgeId)) return \"error\";\n if (result.warnings.some((e) => e.edgeId === edgeId)) return \"warning\";\n return \"valid\";\n}\n\n// ── Cycle detection ─────────────────────────────────────────────────────────\nexport function wouldCreateCycle(\n source: string,\n target: string,\n edges: WorkflowEdge[],\n): boolean {\n if (source === target) return true;\n const visited = new Set<string>();\n const queue: string[] = [target];\n while (queue.length > 0) {\n const current = queue.shift();\n if (!current) continue;\n if (current === source) return true;\n if (visited.has(current)) continue;\n visited.add(current);\n for (const edge of edges) if (edge.source === current && !visited.has(edge.target)) queue.push(edge.target);\n }\n return false;\n}\n","// ============================================================================\n// Workflow types — ported from octaviaflow-ui, decoupled from app-specific\n// ActionDefinition/Next.js so the design system can stand alone.\n// Consumers can extend WorkflowNode via the `data` field for their own schemas.\n// ============================================================================\n\n// ── Geometry ────────────────────────────────────────────────────────────────\nexport interface Position {\n x: number;\n y: number;\n}\nexport interface Dimensions {\n width: number;\n height: number;\n}\nexport interface Bounds {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n// ── Node ────────────────────────────────────────────────────────────────────\nexport type NodeStatus = \"idle\" | \"running\" | \"success\" | \"error\" | \"warning\" | \"disabled\";\nexport type NodeKind = \"trigger\" | \"action\" | \"condition\" | \"transform\";\nexport type ConfigStatus = \"valid\" | \"warning\" | \"error\" | \"unconfigured\" | \"hidden\";\n\nexport interface NodePort {\n id: string;\n type: \"input\" | \"output\";\n position: \"top\" | \"right\" | \"bottom\" | \"left\";\n label?: string;\n connected: boolean;\n maxConnections?: number;\n}\n\nexport interface DataSchema {\n type: \"object\" | \"array\" | \"string\" | \"number\" | \"boolean\" | \"null\";\n properties?: Record<string, DataSchema>;\n items?: DataSchema;\n required?: string[];\n description?: string;\n example?: unknown;\n}\n\nexport interface WorkflowNode<TData = unknown> {\n id: string;\n type: NodeKind;\n\n /** Optional reference to an action-definition id in the consumer's registry. */\n actionDefinitionId?: string;\n\n // Display\n name?: string;\n label: string;\n description?: string;\n /**\n * Icon — a ReactNode rendered inside the node chrome. Consumer provides it\n * (Lucide, Carbon, custom SVG, whatever). The DS doesn't bundle icons.\n */\n icon?: unknown;\n color?: string;\n\n // Position & size\n position: Position;\n dimensions?: Dimensions;\n\n // Configuration (arbitrary consumer data). `data` is a type-safe bag.\n config: Record<string, unknown>;\n data?: TData;\n configStatus?: ConfigStatus;\n\n // Ports\n ports: {\n input: NodePort[];\n output: NodePort[];\n };\n\n // Data flow schemas\n inputSchema?: DataSchema;\n outputSchema?: DataSchema;\n\n // Runtime state\n status: NodeStatus;\n selected: boolean;\n dragging: boolean;\n\n // Validation\n isValid: boolean;\n validationErrors?: string[];\n\n // UI state\n expanded: boolean;\n minimized: boolean;\n locked: boolean;\n\n // Execution data\n executionData?: {\n lastRun?: string;\n duration?: number;\n output?: unknown;\n error?: string;\n };\n\n // Metadata\n createdAt: string;\n updatedAt: string;\n notes?: string;\n}\n\n// ── Edge ────────────────────────────────────────────────────────────────────\nexport type EdgeType = \"default\" | \"conditional\" | \"loop\" | \"error\";\n\nexport interface EdgeStyle {\n stroke?: string;\n strokeWidth?: number;\n strokeDasharray?: string;\n animated?: boolean;\n}\n\nexport interface WorkflowEdge {\n id: string;\n type: EdgeType;\n source: string;\n sourcePort: string;\n target: string;\n targetPort: string;\n style?: EdgeStyle;\n label?: string;\n condition?: string;\n selected: boolean;\n animated: boolean;\n createdAt: string;\n}\n\n// ── Viewport & settings ─────────────────────────────────────────────────────\nexport interface CanvasViewport {\n x: number;\n y: number;\n zoom: number;\n}\n\nexport interface CanvasSettings {\n snapToGrid: boolean;\n gridSize: number;\n showGrid: boolean;\n showMinimap: boolean;\n autoLayout: boolean;\n useAdvancedLayout: boolean;\n theme: \"light\" | \"dark\";\n}\n\n// ── Canvas state ────────────────────────────────────────────────────────────\nexport interface WorkflowCanvasState {\n nodes: WorkflowNode[];\n edges: WorkflowEdge[];\n viewport: CanvasViewport;\n selectedNodes: string[];\n selectedEdges: string[];\n isDragging: boolean;\n isPanning: boolean;\n isConnecting: boolean;\n connectingFrom?: {\n nodeId: string;\n portId: string;\n portType: \"input\" | \"output\";\n };\n settings: CanvasSettings;\n history: {\n past: Array<Pick<WorkflowCanvasState, \"nodes\" | \"edges\">>;\n future: Array<Pick<WorkflowCanvasState, \"nodes\" | \"edges\">>;\n };\n}\n\n// ── Actions (reducer input) ─────────────────────────────────────────────────\nexport type WorkflowAction =\n | { type: \"ADD_NODE\"; payload: WorkflowNode }\n | { type: \"UPDATE_NODE\"; payload: { id: string; updates: Partial<WorkflowNode> } }\n | { type: \"DELETE_NODE\"; payload: string }\n | { type: \"DELETE_NODES\"; payload: string[] }\n | { type: \"ADD_EDGE\"; payload: WorkflowEdge }\n | { type: \"DELETE_EDGE\"; payload: string }\n | { type: \"DELETE_EDGES\"; payload: string[] }\n | { type: \"SELECT_NODE\"; payload: string }\n | { type: \"SELECT_NODES\"; payload: string[] }\n | { type: \"SELECT_EDGE\"; payload: string }\n | { type: \"DESELECT_ALL\" }\n | { type: \"UPDATE_VIEWPORT\"; payload: Partial<CanvasViewport> }\n | { type: \"UPDATE_SETTINGS\"; payload: Partial<CanvasSettings> }\n | { type: \"START_CONNECTING\"; payload: { nodeId: string; portId: string; portType: \"input\" | \"output\" } }\n | { type: \"END_CONNECTING\" }\n | { type: \"UNDO\" }\n | { type: \"REDO\" }\n | { type: \"REPLACE_NODES\"; payload: WorkflowNode[] }\n | { type: \"REPLACE_EDGES\"; payload: WorkflowEdge[] }\n | { type: \"RESET\" };\n\n// ── Policies ────────────────────────────────────────────────────────────────\nexport interface ConnectionPolicies {\n allowSelfLoop: boolean;\n allowMultipleOutputs: boolean;\n allowMultipleInputs: boolean;\n strictTypeChecking: boolean;\n maxConnectionsPerNode?: number;\n preventCircularDependencies: boolean;\n allowConditionalConnections: boolean;\n requireAllInputsConnected: boolean;\n}\n\nexport interface NodePolicies {\n minNodes: number;\n maxNodes?: number;\n allowDuplicateTypes: boolean;\n requiredNodeTypes?: string[];\n forbiddenNodeTypes?: string[];\n allowOrphanNodes: boolean;\n snapToGrid: boolean;\n gridSize: number;\n}\n\nexport interface ExecutionPolicies {\n allowParallelExecution: boolean;\n maxExecutionTime?: number;\n retryFailedNodes: boolean;\n maxRetries: number;\n continueOnError: boolean;\n requireApproval: boolean;\n}\n\nexport interface ValidationPolicies {\n validateOnChange: boolean;\n validateBeforeExecution: boolean;\n blockExecutionOnValidationError: boolean;\n showValidationWarnings: boolean;\n strictMode: boolean;\n}\n\nexport interface WorkflowPolicies {\n connection: ConnectionPolicies;\n node: NodePolicies;\n execution: ExecutionPolicies;\n validation: ValidationPolicies;\n}\n\nexport const DEFAULT_WORKFLOW_POLICIES: WorkflowPolicies = {\n connection: {\n allowSelfLoop: false,\n allowMultipleOutputs: true,\n allowMultipleInputs: false,\n strictTypeChecking: true,\n maxConnectionsPerNode: undefined,\n preventCircularDependencies: true,\n allowConditionalConnections: true,\n requireAllInputsConnected: false,\n },\n node: {\n minNodes: 1,\n maxNodes: undefined,\n allowDuplicateTypes: true,\n requiredNodeTypes: undefined,\n forbiddenNodeTypes: undefined,\n allowOrphanNodes: true,\n snapToGrid: true,\n gridSize: 20,\n },\n execution: {\n allowParallelExecution: true,\n maxExecutionTime: undefined,\n retryFailedNodes: true,\n maxRetries: 3,\n continueOnError: false,\n requireApproval: false,\n },\n validation: {\n validateOnChange: true,\n validateBeforeExecution: true,\n blockExecutionOnValidationError: true,\n showValidationWarnings: true,\n strictMode: false,\n },\n};\n\n// ── Validation ──────────────────────────────────────────────────────────────\nexport interface ValidationIssue {\n id: string;\n type: \"node\" | \"edge\" | \"workflow\";\n severity: \"error\" | \"warning\";\n message: string;\n nodeId?: string;\n edgeId?: string;\n}\n\nexport interface ValidationResult {\n isValid: boolean;\n errors: ValidationIssue[];\n warnings: ValidationIssue[];\n}\n\n// ── Workflow metadata & aggregate ───────────────────────────────────────────\nexport interface WorkflowMetadata {\n id: string;\n name: string;\n description?: string;\n projectId?: string;\n version: string;\n status: \"draft\" | \"published\" | \"archived\";\n createdAt: string;\n updatedAt: string;\n createdBy?: string;\n tags: string[];\n}\n\nexport interface Workflow {\n metadata: WorkflowMetadata;\n canvas: WorkflowCanvasState;\n policies: WorkflowPolicies;\n validation: ValidationResult;\n}\n\n// ── Helpers ─────────────────────────────────────────────────────────────────\nexport interface ConnectionValidation {\n valid: boolean;\n reason?: string;\n}\n","import type { WorkflowEdge, WorkflowNode } from \"./types\";\n\nconst NODE_WIDTH = 368;\nconst NODE_HEIGHT = 108;\n\nexport interface LayoutResult {\n nodes: WorkflowNode[];\n}\n\nfunction buildAdjacencyList(edges: WorkflowEdge[]): Map<string, string[]> {\n const adj = new Map<string, string[]>();\n for (const edge of edges) {\n const children = adj.get(edge.source) ?? [];\n children.push(edge.target);\n adj.set(edge.source, children);\n }\n return adj;\n}\n\nfunction findRootNodes(nodes: WorkflowNode[], edges: WorkflowEdge[]): Set<string> {\n const hasIncoming = new Set<string>();\n for (const edge of edges) hasIncoming.add(edge.target);\n const roots = new Set<string>();\n for (const node of nodes) if (!hasIncoming.has(node.id)) roots.add(node.id);\n return roots;\n}\n\nfunction assignLevels(nodes: WorkflowNode[], edges: WorkflowEdge[]): Map<string, number> {\n const levels = new Map<string, number>();\n const adj = buildAdjacencyList(edges);\n const roots = findRootNodes(nodes, edges);\n\n if (roots.size === 0 && nodes.length > 0) roots.add(nodes[0].id);\n\n const queue: Array<{ id: string; level: number }> = [];\n const visited = new Set<string>();\n for (const rootId of roots) queue.push({ id: rootId, level: 0 });\n\n while (queue.length > 0) {\n const next = queue.shift();\n if (!next) continue;\n const { id, level } = next;\n if (visited.has(id)) continue;\n visited.add(id);\n levels.set(id, level);\n\n const children = adj.get(id) ?? [];\n for (const childId of children) {\n if (!visited.has(childId)) queue.push({ id: childId, level: level + 1 });\n }\n }\n\n for (const node of nodes) if (!levels.has(node.id)) levels.set(node.id, 0);\n return levels;\n}\n\nexport interface LayoutOptions {\n direction?: \"horizontal\" | \"vertical\";\n nodeSpacing?: number;\n rankSpacing?: number;\n startX?: number;\n startY?: number;\n nodeWidth?: number;\n nodeHeight?: number;\n}\n\nexport function applyLayout(\n nodes: WorkflowNode[],\n edges: WorkflowEdge[],\n options: LayoutOptions = {},\n): LayoutResult {\n if (nodes.length === 0) return { nodes: [] };\n\n const direction = options.direction ?? \"horizontal\";\n const nodeW = options.nodeWidth ?? NODE_WIDTH;\n const nodeH = options.nodeHeight ?? NODE_HEIGHT;\n const startX = options.startX ?? 50;\n const startY = options.startY ?? 50;\n\n const horizontalSpacing = options.rankSpacing ?? (direction === \"horizontal\" ? 150 : 100);\n const verticalSpacing = options.nodeSpacing ?? (direction === \"horizontal\" ? 80 : 120);\n\n const levels = assignLevels(nodes, edges);\n const nodesByLevel = new Map<number, WorkflowNode[]>();\n for (const node of nodes) {\n const level = levels.get(node.id) ?? 0;\n const group = nodesByLevel.get(level) ?? [];\n group.push(node);\n nodesByLevel.set(level, group);\n }\n\n const laid: WorkflowNode[] = [];\n const sortedLevels = Array.from(nodesByLevel.keys()).sort((a, b) => a - b);\n\n for (const level of sortedLevels) {\n const group = nodesByLevel.get(level) ?? [];\n if (direction === \"horizontal\") {\n const x = startX + level * (nodeW + horizontalSpacing);\n for (let i = 0; i < group.length; i++) {\n const y = startY + i * (nodeH + verticalSpacing);\n laid.push({ ...group[i], position: { x, y } });\n }\n } else {\n const y = startY + level * (nodeH + verticalSpacing);\n for (let i = 0; i < group.length; i++) {\n const x = startX + i * (nodeW + horizontalSpacing);\n laid.push({ ...group[i], position: { x, y } });\n }\n }\n }\n\n return { nodes: laid };\n}\n\nexport function applyHorizontalLayout(\n nodes: WorkflowNode[],\n edges: WorkflowEdge[],\n): LayoutResult {\n return applyLayout(nodes, edges, { direction: \"horizontal\" });\n}\n\nexport function applyVerticalLayout(\n nodes: WorkflowNode[],\n edges: WorkflowEdge[],\n): LayoutResult {\n return applyLayout(nodes, edges, { direction: \"vertical\" });\n}\n","import type { ConfigStatus, WorkflowNode } from \"./types\";\n\n/**\n * Lightweight field schema type the DS uses to compute config status.\n * Consumers map their own schemas (zod, yup, custom) to this shape.\n */\nexport interface FieldConditional {\n action: \"show\" | \"hide\" | \"require\" | \"disable\";\n field: string;\n operator: \"==\" | \"!=\" | \">\" | \"<\" | \">=\" | \"<=\" | \"in\" | \"not_in\" | \"contains\";\n value: unknown;\n}\n\nexport interface FieldSchema {\n key: string;\n required?: boolean;\n defaultValue?: unknown;\n hidden?: boolean;\n conditional?: FieldConditional[];\n}\n\nexport interface ConfigStatusResult {\n status: ConfigStatus;\n requiredTotal: number;\n requiredFilled: number;\n optionalTotal: number;\n optionalFilled: number;\n missingRequired: string[];\n filledOptional: string[];\n}\n\nfunction isFilled(value: unknown): boolean {\n if (value === undefined || value === null) return false;\n if (typeof value === \"string\") return value.trim().length > 0;\n if (typeof value === \"number\" || typeof value === \"boolean\") return true;\n if (Array.isArray(value)) return value.length > 0;\n if (typeof value === \"object\") return Object.keys(value as Record<string, unknown>).length > 0;\n return false;\n}\n\nfunction getNested(config: Record<string, unknown>, keyPath: string): unknown {\n const parts = keyPath.split(\".\");\n let current: unknown = config;\n for (const part of parts) {\n if (current === null || current === undefined || typeof current !== \"object\") return undefined;\n current = (current as Record<string, unknown>)[part];\n }\n return current;\n}\n\nfunction isActive(field: FieldSchema, config: Record<string, unknown>): boolean {\n if (!field.conditional || field.conditional.length === 0) return true;\n return field.conditional.some((cond) => {\n if (cond.action !== \"show\" && cond.action !== \"require\") return false;\n const value = getNested(config, cond.field);\n switch (cond.operator) {\n case \"==\": return value === cond.value;\n case \"!=\": return value !== cond.value;\n case \">\": return (value as number) > (cond.value as number);\n case \"<\": return (value as number) < (cond.value as number);\n case \">=\": return (value as number) >= (cond.value as number);\n case \"<=\": return (value as number) <= (cond.value as number);\n case \"in\": return Array.isArray(cond.value) && (cond.value as unknown[]).includes(value);\n case \"not_in\": return Array.isArray(cond.value) && !(cond.value as unknown[]).includes(value);\n case \"contains\":\n return typeof value === \"string\" && value.includes(cond.value as string);\n default: return false;\n }\n });\n}\n\n/**\n * Compute the config status of a node, given its fields schema.\n * Returns \"hidden\" if no schema is provided — caller can wrap this and\n * apply their own registry lookup.\n */\nexport function getNodeConfigStatus(\n node: WorkflowNode,\n fields: FieldSchema[] | undefined,\n options: { hiddenActionIds?: Set<string> } = {},\n): ConfigStatusResult {\n const hiddenIds = options.hiddenActionIds;\n if (node.actionDefinitionId && hiddenIds?.has(node.actionDefinitionId)) {\n return {\n status: \"hidden\",\n requiredTotal: 0,\n requiredFilled: 0,\n optionalTotal: 0,\n optionalFilled: 0,\n missingRequired: [],\n filledOptional: [],\n };\n }\n\n if (!fields) {\n return {\n status: \"unconfigured\",\n requiredTotal: 0,\n requiredFilled: 0,\n optionalTotal: 0,\n optionalFilled: 0,\n missingRequired: [],\n filledOptional: [],\n };\n }\n\n const config = node.config ?? {};\n const active = fields.filter((f) => !f.hidden && isActive(f, config));\n const required = active.filter((f) => f.required);\n const optional = active.filter((f) => !f.required);\n\n const missingRequired: string[] = [];\n let requiredFilled = 0;\n\n for (const field of required) {\n const value = getNested(config, field.key);\n if (isFilled(value) || isFilled(field.defaultValue)) requiredFilled++;\n else missingRequired.push(field.key);\n }\n\n const filledOptional: string[] = [];\n let optionalFilled = 0;\n\n for (const field of optional) {\n const value = getNested(config, field.key);\n if (isFilled(value)) {\n optionalFilled++;\n filledOptional.push(field.key);\n }\n }\n\n let status: ConfigStatus;\n if (required.length === 0) status = \"valid\";\n else if (missingRequired.length === 0) status = \"valid\";\n else if (requiredFilled > 0 || optionalFilled > 0) status = \"warning\";\n else status = \"error\";\n\n return {\n status,\n requiredTotal: required.length,\n requiredFilled,\n optionalTotal: optional.length,\n optionalFilled,\n missingRequired,\n filledOptional,\n };\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface IconCardProps {\n variant?: \"default\" | \"primary\" | \"success\" | \"warning\" | \"error\";\n icon: ReactNode;\n title: ReactNode;\n description?: ReactNode;\n action?: ReactNode;\n onClick?: () => void;\n className?: string;\n}\n\nexport function IconCard({\n variant = \"default\",\n icon,\n title,\n description,\n action,\n onClick,\n className,\n}: IconCardProps) {\n const interactive = Boolean(onClick);\n return (\n <div\n className={cn(\n \"ods-icon-card\",\n `ods-icon-card--${variant}`,\n interactive && \"ods-icon-card--interactive\",\n className,\n )}\n onClick={onClick}\n role={interactive ? \"button\" : undefined}\n tabIndex={interactive ? 0 : undefined}\n >\n <span className=\"ods-icon-card__icon\" aria-hidden=\"true\">{icon}</span>\n <div className=\"ods-icon-card__body\">\n <div className=\"ods-icon-card__title\">{title}</div>\n {description && <div className=\"ods-icon-card__description\">{description}</div>}\n </div>\n {action && <div className=\"ods-icon-card__action\">{action}</div>}\n </div>\n );\n}\n","\"use client\";\nimport { type InputHTMLAttributes, type ReactNode, useId, useRef } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface InputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, \"size\"> {\n type?: \"text\" | \"email\" | \"password\" | \"search\" | \"number\" | \"tel\" | \"url\";\n size?: \"sm\" | \"md\" | \"lg\";\n error?: boolean;\n errorMessage?: string;\n label?: ReactNode;\n helperText?: ReactNode;\n leftIcon?: ReactNode;\n rightIcon?: ReactNode;\n}\n\nexport function Input({\n type = \"text\",\n size = \"md\",\n error = false,\n errorMessage,\n label,\n helperText,\n leftIcon,\n rightIcon,\n disabled = false,\n id,\n className,\n ...props\n}: InputProps) {\n const ref = useRef<HTMLInputElement>(null);\n const reactId = useId();\n const inputId = id ?? `${reactId}-input`;\n const errorId = `${reactId}-err`;\n const helperId = `${reactId}-help`;\n\n const describedBy =\n error && errorMessage ? errorId : helperText ? helperId : undefined;\n\n return (\n <div\n className={cn(\n \"ods-input\",\n `ods-input--${size}`,\n error && \"ods-input--error\",\n disabled && \"ods-input--disabled\",\n className,\n )}\n >\n {label && (\n <label htmlFor={inputId} className=\"ods-input__label\">\n {label}\n </label>\n )}\n <div className=\"ods-input__wrapper\">\n {leftIcon && (\n <span className=\"ods-input__icon--left\" aria-hidden=\"true\">\n {leftIcon}\n </span>\n )}\n <input\n {...props}\n id={inputId}\n ref={ref}\n type={type}\n disabled={disabled}\n className={cn(\n \"ods-input__field\",\n leftIcon && \"ods-input__field--with-left-icon\",\n rightIcon && \"ods-input__field--with-right-icon\",\n )}\n aria-invalid={error || undefined}\n aria-describedby={describedBy}\n />\n {rightIcon && (\n <span className=\"ods-input__icon--right\" aria-hidden=\"true\">\n {rightIcon}\n </span>\n )}\n </div>\n {error && errorMessage && (\n <div id={errorId} className=\"ods-input__error-message\" role=\"alert\">\n {errorMessage}\n </div>\n )}\n {!error && helperText && (\n <div id={helperId} className=\"ods-input__helper\">\n {helperText}\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface KbdProps {\n size?: \"sm\" | \"md\";\n children: ReactNode;\n className?: string;\n}\n\nexport function Kbd({ size = \"md\", children, className }: KbdProps) {\n return (\n <kbd className={cn(\"ods-kbd\", `ods-kbd--${size}`, className)}>\n {children}\n </kbd>\n );\n}\n\nexport interface KbdGroupProps {\n size?: \"sm\" | \"md\";\n separator?: ReactNode;\n keys: ReactNode[];\n className?: string;\n}\n\nexport function KbdGroup({ size = \"md\", separator = \"+\", keys, className }: KbdGroupProps) {\n return (\n <span className={cn(\"ods-kbd-group\", className)}>\n {keys.map((k, i) => (\n <span key={i} className=\"ods-kbd-group__item\">\n <Kbd size={size}>{k}</Kbd>\n {i < keys.length - 1 && (\n <span className=\"ods-kbd-group__sep\" aria-hidden=\"true\">{separator}</span>\n )}\n </span>\n ))}\n </span>\n );\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface LinePoint {\n x: number | string;\n y: number;\n}\n\nexport interface LineChartProps {\n data: LinePoint[];\n height?: number;\n stroke?: string;\n fill?: string; // area fill under line\n title?: ReactNode;\n total?: ReactNode;\n smooth?: boolean;\n className?: string;\n}\n\nfunction buildPath(points: [number, number][], smooth: boolean): string {\n if (points.length === 0) return \"\";\n if (!smooth) {\n return points.map(([x, y], i) => `${i === 0 ? \"M\" : \"L\"}${x},${y}`).join(\" \");\n }\n // Simple Catmull-Rom → Bezier smoothing\n let d = `M${points[0][0]},${points[0][1]}`;\n for (let i = 0; i < points.length - 1; i++) {\n const [x0, y0] = points[Math.max(0, i - 1)];\n const [x1, y1] = points[i];\n const [x2, y2] = points[i + 1];\n const [x3, y3] = points[Math.min(points.length - 1, i + 2)];\n const cp1x = x1 + (x2 - x0) / 6;\n const cp1y = y1 + (y2 - y0) / 6;\n const cp2x = x2 - (x3 - x1) / 6;\n const cp2y = y2 - (y3 - y1) / 6;\n d += ` C${cp1x},${cp1y} ${cp2x},${cp2y} ${x2},${y2}`;\n }\n return d;\n}\n\nexport function LineChart({\n data,\n height = 120,\n stroke = \"#6c5ce7\",\n fill,\n title,\n total,\n smooth = true,\n className,\n}: LineChartProps) {\n const W = 360;\n const H = 100;\n const pad = 6;\n const ys = data.map((d) => d.y);\n const min = Math.min(...ys);\n const max = Math.max(...ys);\n const range = Math.max(1, max - min);\n const stepX = (W - pad * 2) / Math.max(1, data.length - 1);\n\n const pts: [number, number][] = data.map((d, i) => [\n pad + i * stepX,\n pad + (1 - (d.y - min) / range) * (H - pad * 2),\n ]);\n\n const path = buildPath(pts, smooth);\n const areaPath = fill && pts.length\n ? `${path} L${pts[pts.length - 1][0]},${H - pad} L${pts[0][0]},${H - pad} Z`\n : null;\n\n return (\n <div className={cn(\"ods-line-chart\", className)}>\n {(title || total) && (\n <div className=\"ods-line-chart__head\">\n {title && <div className=\"ods-line-chart__title\">{title}</div>}\n {total && <div className=\"ods-line-chart__total\">{total}</div>}\n </div>\n )}\n <svg className=\"ods-line-chart__svg\" viewBox={`0 0 ${W} ${H}`} preserveAspectRatio=\"none\" style={{ height }}>\n {areaPath && <path d={areaPath} fill={fill} />}\n <path d={path} fill=\"none\" stroke={stroke} strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </div>\n );\n}\n","\"use client\";\nimport type { AnchorHTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface LinkButtonProps extends AnchorHTMLAttributes<HTMLAnchorElement> {\n variant?: \"primary\" | \"neutral\" | \"danger\";\n size?: \"sm\" | \"md\" | \"lg\";\n underline?: boolean;\n leftIcon?: ReactNode;\n rightIcon?: ReactNode;\n children: ReactNode;\n}\n\nexport function LinkButton({\n variant = \"primary\",\n size = \"md\",\n underline = false,\n leftIcon,\n rightIcon,\n className,\n children,\n ...props\n}: LinkButtonProps) {\n return (\n <a\n {...props}\n className={cn(\n \"ods-link-btn\",\n `ods-link-btn--${variant}`,\n `ods-link-btn--${size}`,\n underline && \"ods-link-btn--underline\",\n className,\n )}\n >\n {leftIcon && <span className=\"ods-link-btn__icon ods-link-btn__icon--left\" aria-hidden=\"true\">{leftIcon}</span>}\n <span className=\"ods-link-btn__label\">{children}</span>\n {rightIcon && <span className=\"ods-link-btn__icon ods-link-btn__icon--right\" aria-hidden=\"true\">{rightIcon}</span>}\n </a>\n );\n}\n","\"use client\";\nimport { type ChangeEvent, type ReactNode, useCallback } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface NumberInputProps {\n label?: ReactNode;\n value: number;\n onChange?: (value: number) => void;\n min?: number;\n max?: number;\n step?: number;\n prefix?: ReactNode;\n suffix?: ReactNode;\n size?: \"sm\" | \"md\" | \"lg\";\n disabled?: boolean;\n error?: ReactNode;\n helperText?: ReactNode;\n placeholder?: string;\n \"aria-label\"?: string;\n className?: string;\n}\n\nexport function NumberInput({\n label,\n value,\n onChange,\n min,\n max,\n step = 1,\n prefix,\n suffix,\n size = \"md\",\n disabled = false,\n error,\n helperText,\n placeholder,\n className,\n ...props\n}: NumberInputProps) {\n const clamp = useCallback(\n (v: number) => {\n if (typeof min === \"number\") v = Math.max(min, v);\n if (typeof max === \"number\") v = Math.min(max, v);\n return v;\n },\n [min, max],\n );\n\n const dec = () => !disabled && onChange?.(clamp(value - step));\n const inc = () => !disabled && onChange?.(clamp(value + step));\n const handleInput = (e: ChangeEvent<HTMLInputElement>) => {\n const num = Number(e.target.value);\n if (!Number.isNaN(num)) onChange?.(clamp(num));\n };\n\n return (\n <div className={cn(\"ods-num\", `ods-num--${size}`, disabled && \"ods-num--disabled\", error && \"ods-num--error\", className)}>\n {label && <label className=\"ods-num__label\">{label}</label>}\n <div className=\"ods-num__field\">\n <button\n type=\"button\"\n className=\"ods-num__step ods-num__step--dec\"\n onClick={dec}\n disabled={disabled || (typeof min === \"number\" && value <= min)}\n aria-label=\"Decrease\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M3 7h8\" stroke=\"currentColor\" strokeWidth=\"1.75\" strokeLinecap=\"round\" />\n </svg>\n </button>\n {prefix && <span className=\"ods-num__prefix\">{prefix}</span>}\n <input\n type=\"number\"\n className=\"ods-num__input\"\n value={Number.isFinite(value) ? value : \"\"}\n onChange={handleInput}\n disabled={disabled}\n min={min}\n max={max}\n step={step}\n placeholder={placeholder}\n aria-label={props[\"aria-label\"]}\n />\n {suffix && <span className=\"ods-num__suffix\">{suffix}</span>}\n <button\n type=\"button\"\n className=\"ods-num__step ods-num__step--inc\"\n onClick={inc}\n disabled={disabled || (typeof max === \"number\" && value >= max)}\n aria-label=\"Increase\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M7 3v8M3 7h8\" stroke=\"currentColor\" strokeWidth=\"1.75\" strokeLinecap=\"round\" />\n </svg>\n </button>\n </div>\n {error ? <div className=\"ods-num__hint ods-num__hint--error\">{error}</div>\n : helperText ? <div className=\"ods-num__hint\">{helperText}</div>\n : null}\n </div>\n );\n}\n","\"use client\";\nimport {\n type ClipboardEvent,\n type KeyboardEvent,\n type ReactNode,\n useCallback,\n useRef,\n} from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface OTPInputProps {\n label?: ReactNode;\n length?: number;\n value: string;\n onChange?: (value: string) => void;\n onComplete?: (value: string) => void;\n disabled?: boolean;\n error?: ReactNode;\n type?: \"numeric\" | \"alphanumeric\";\n mask?: boolean;\n autoFocus?: boolean;\n className?: string;\n}\n\nexport function OTPInput({\n label,\n length = 6,\n value,\n onChange,\n onComplete,\n disabled = false,\n error,\n type = \"numeric\",\n mask = false,\n autoFocus = false,\n className,\n}: OTPInputProps) {\n const refs = useRef<(HTMLInputElement | null)[]>([]);\n const pattern = type === \"numeric\" ? /[^0-9]/g : /[^a-zA-Z0-9]/g;\n\n const setCharAt = useCallback(\n (idx: number, ch: string) => {\n const cleaned = ch.replace(pattern, \"\").slice(0, 1);\n const chars = value.split(\"\");\n while (chars.length < length) chars.push(\"\");\n chars[idx] = cleaned;\n const next = chars.join(\"\").slice(0, length);\n onChange?.(next);\n if (cleaned && idx < length - 1) refs.current[idx + 1]?.focus();\n if (next.length === length && !next.includes(\"\")) onComplete?.(next);\n },\n [value, length, onChange, onComplete, pattern],\n );\n\n const handleKeyDown = (idx: number) => (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Backspace\" && !value[idx] && idx > 0) {\n refs.current[idx - 1]?.focus();\n }\n if (e.key === \"ArrowLeft\" && idx > 0) refs.current[idx - 1]?.focus();\n if (e.key === \"ArrowRight\" && idx < length - 1) refs.current[idx + 1]?.focus();\n };\n\n const handlePaste = (e: ClipboardEvent<HTMLInputElement>) => {\n e.preventDefault();\n const paste = e.clipboardData.getData(\"text\").replace(pattern, \"\").slice(0, length);\n onChange?.(paste);\n if (paste.length === length) onComplete?.(paste);\n refs.current[Math.min(paste.length, length - 1)]?.focus();\n };\n\n return (\n <div className={cn(\"ods-otp\", disabled && \"ods-otp--disabled\", error && \"ods-otp--error\", className)}>\n {label && <label className=\"ods-otp__label\">{label}</label>}\n <div className=\"ods-otp__row\" role=\"group\" aria-label={typeof label === \"string\" ? label : \"One-time passcode\"}>\n {Array.from({ length }).map((_, i) => {\n const ch = value[i] ?? \"\";\n return (\n <input\n key={i}\n ref={(el) => {\n refs.current[i] = el;\n }}\n type={mask ? \"password\" : \"text\"}\n inputMode={type === \"numeric\" ? \"numeric\" : \"text\"}\n maxLength={1}\n value={ch}\n disabled={disabled}\n autoFocus={autoFocus && i === 0}\n onChange={(e) => setCharAt(i, e.target.value)}\n onKeyDown={handleKeyDown(i)}\n onPaste={handlePaste}\n className={cn(\"ods-otp__cell\", ch && \"ods-otp__cell--filled\")}\n aria-label={`Digit ${i + 1} of ${length}`}\n />\n );\n })}\n </div>\n {error && <div className=\"ods-otp__hint\">{error}</div>}\n </div>\n );\n}\n","\"use client\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport {\n type KeyboardEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface MultiSelectOption {\n value: string;\n label: string;\n icon?: ReactNode;\n description?: string;\n}\n\nexport interface MultiSelectProps {\n options: MultiSelectOption[];\n value?: string[];\n defaultValue?: string[];\n onChange?: (values: string[]) => void;\n placeholder?: string;\n searchPlaceholder?: string;\n label?: string;\n error?: boolean;\n errorMessage?: string;\n disabled?: boolean;\n size?: \"sm\" | \"md\";\n /** Force searchable on/off. Auto: enabled when options.length > 6. */\n searchable?: boolean;\n /** Hard cap on visible chips. Overrides auto-measurement. */\n maxVisibleTags?: number;\n /** Maximum number of selectable options. */\n maxTags?: number;\n className?: string;\n}\n\nconst RESERVED_TAIL_PX = 64; // reserved for the \"Add more…\" hint + clear button\nconst TAGS_GAP = 6;\n\nexport function MultiSelect({\n options,\n value: controlledValue,\n defaultValue,\n onChange,\n placeholder = \"Select options…\",\n searchPlaceholder = \"Search options…\",\n label,\n error = false,\n errorMessage,\n disabled = false,\n size = \"md\",\n searchable,\n maxVisibleTags,\n maxTags,\n className,\n}: MultiSelectProps) {\n // ── State ──────────────────────────────────────\n const [internalValue, setInternalValue] = useState<string[]>(defaultValue ?? []);\n const selectedValues = controlledValue ?? internalValue;\n\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState(\"\");\n const [activeIdx, setActiveIdx] = useState(0);\n const [dropdownPos, setDropdownPos] = useState({ top: 0, left: 0, width: 0 });\n\n // ── Refs ───────────────────────────────────────\n const wrapRef = useRef<HTMLDivElement>(null);\n const tagsRowRef = useRef<HTMLDivElement>(null);\n const searchRef = useRef<HTMLInputElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const chipRefs = useRef<(HTMLSpanElement | null)[]>([]);\n\n // ── Helpers ────────────────────────────────────\n const commit = useCallback(\n (next: string[]) => {\n if (controlledValue === undefined) setInternalValue(next);\n onChange?.(next);\n },\n [controlledValue, onChange],\n );\n\n const availableOptions = useMemo(() => {\n const selected = new Set(selectedValues);\n const unselected = options.filter((o) => !selected.has(o.value));\n if (!query.trim()) return unselected;\n const q = query.trim().toLowerCase();\n return unselected.filter(\n (o) =>\n o.label.toLowerCase().includes(q) ||\n o.value.toLowerCase().includes(q) ||\n o.description?.toLowerCase().includes(q),\n );\n }, [options, selectedValues, query]);\n\n const showSearch = searchable ?? options.length > 6;\n const getLabel = (v: string) => options.find((o) => o.value === v)?.label ?? v;\n const getIcon = (v: string) => options.find((o) => o.value === v)?.icon;\n\n // ── Position dropdown ──────────────────────────\n const updatePosition = useCallback(() => {\n if (!wrapRef.current) return;\n const rect = wrapRef.current.getBoundingClientRect();\n setDropdownPos({ top: rect.bottom + 4, left: rect.left, width: rect.width });\n }, []);\n\n useEffect(() => {\n if (!open) return;\n updatePosition();\n window.addEventListener(\"scroll\", updatePosition, true);\n window.addEventListener(\"resize\", updatePosition);\n return () => {\n window.removeEventListener(\"scroll\", updatePosition, true);\n window.removeEventListener(\"resize\", updatePosition);\n };\n }, [open, updatePosition]);\n\n // Close on outside click\n useEffect(() => {\n if (!open) return;\n const onDoc = (e: MouseEvent) => {\n const t = e.target as Node;\n if (\n !wrapRef.current?.contains(t) &&\n !dropdownRef.current?.contains(t)\n ) {\n setOpen(false);\n setQuery(\"\");\n }\n };\n document.addEventListener(\"mousedown\", onDoc);\n return () => document.removeEventListener(\"mousedown\", onDoc);\n }, [open]);\n\n // Focus the search when opened\n useEffect(() => {\n if (open && showSearch) {\n requestAnimationFrame(() => searchRef.current?.focus());\n }\n }, [open, showSearch]);\n\n // Reset highlight when filter changes\n useEffect(() => setActiveIdx(0), [query, open]);\n\n // ── Chip overflow measurement ──────────────────\n // Renders all chips first (hidden), then measures widths and decides how many fit.\n // Re-measures on selected-list change and on wrapper resize.\n const [fitCount, setFitCount] = useState(selectedValues.length);\n const [tick, setTick] = useState(0);\n\n useLayoutEffect(() => {\n if (maxVisibleTags !== undefined) {\n setFitCount(Math.min(selectedValues.length, maxVisibleTags));\n return;\n }\n const row = tagsRowRef.current;\n if (!row) return;\n const rowRect = row.getBoundingClientRect();\n const available = Math.max(0, rowRect.width - RESERVED_TAIL_PX);\n // If we can't measure (zero-width container e.g. jsdom), show everything.\n if (available <= 0) {\n setFitCount(selectedValues.length);\n return;\n }\n let sum = 0;\n let count = 0;\n for (let i = 0; i < chipRefs.current.length; i++) {\n const chip = chipRefs.current[i];\n if (!chip) break;\n const w = chip.getBoundingClientRect().width;\n sum += w + TAGS_GAP;\n if (sum > available) break;\n count++;\n }\n if (count < selectedValues.length && count > 0) count = Math.max(1, count - 1);\n setFitCount(count);\n }, [tick, selectedValues, maxVisibleTags]);\n\n // ResizeObserver isn't available in non-browser envs (jsdom tests).\n useEffect(() => {\n if (typeof ResizeObserver === \"undefined\") return;\n const row = tagsRowRef.current;\n if (!row) return;\n const ro = new ResizeObserver(() => setTick((t) => t + 1));\n ro.observe(row);\n return () => ro.disconnect();\n }, []);\n\n // ── Actions ────────────────────────────────────\n const addValue = useCallback(\n (val: string) => {\n if (maxTags && selectedValues.length >= maxTags) return;\n commit([...selectedValues, val]);\n setQuery(\"\");\n setActiveIdx(0);\n searchRef.current?.focus();\n },\n [selectedValues, maxTags, commit],\n );\n\n const removeValue = useCallback(\n (val: string) => {\n commit(selectedValues.filter((v) => v !== val));\n },\n [selectedValues, commit],\n );\n\n const clearAll = useCallback(() => {\n commit([]);\n setQuery(\"\");\n }, [commit]);\n\n // ── Keyboard ───────────────────────────────────\n const handleSearchKey = useCallback(\n (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Escape\") {\n setOpen(false);\n setQuery(\"\");\n return;\n }\n if (e.key === \"Backspace\" && !query && selectedValues.length > 0) {\n removeValue(selectedValues[selectedValues.length - 1]);\n return;\n }\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setActiveIdx((i) => Math.min(availableOptions.length - 1, i + 1));\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setActiveIdx((i) => Math.max(0, i - 1));\n } else if (e.key === \"Enter\") {\n e.preventDefault();\n const opt = availableOptions[activeIdx];\n if (opt) addValue(opt.value);\n } else if (e.key === \"Home\") {\n e.preventDefault();\n setActiveIdx(0);\n } else if (e.key === \"End\") {\n e.preventDefault();\n setActiveIdx(availableOptions.length - 1);\n }\n },\n [query, selectedValues, availableOptions, activeIdx, addValue, removeValue],\n );\n\n // ── Render ─────────────────────────────────────\n const visibleChips = selectedValues.slice(0, fitCount);\n const overflow = selectedValues.length - visibleChips.length;\n\n return (\n <div\n className={cn(\n \"ods-multiselect\",\n `ods-multiselect--${size}`,\n error && \"ods-multiselect--error\",\n disabled && \"ods-multiselect--disabled\",\n className,\n )}\n >\n {label && <label className=\"ods-multiselect__label\">{label}</label>}\n\n <div\n ref={wrapRef}\n className={cn(\n \"ods-multiselect__input-wrap\",\n open && \"ods-multiselect__input-wrap--open\",\n )}\n role=\"combobox\"\n aria-expanded={open}\n aria-haspopup=\"listbox\"\n aria-disabled={disabled}\n onClick={() => !disabled && setOpen(true)}\n >\n <div ref={tagsRowRef} className=\"ods-multiselect__tags\">\n {/* Hidden measurement copies: render ALL chips to measure width, then visibly render only the first N */}\n <div className=\"ods-multiselect__measure\" aria-hidden=\"true\">\n {selectedValues.map((val, i) => (\n <span\n key={val}\n ref={(el) => { chipRefs.current[i] = el; }}\n className=\"ods-multiselect__tag\"\n >\n {getIcon(val) && <span className=\"ods-multiselect__tag-icon\">{getIcon(val)}</span>}\n <span>{getLabel(val)}</span>\n <span className=\"ods-multiselect__tag-remove-spacer\" aria-hidden=\"true\" />\n </span>\n ))}\n </div>\n\n {/* Actually displayed chips */}\n {visibleChips.map((val) => (\n <span key={val} className=\"ods-multiselect__tag\">\n {getIcon(val) && <span className=\"ods-multiselect__tag-icon\">{getIcon(val)}</span>}\n <span>{getLabel(val)}</span>\n <button\n type=\"button\"\n className=\"ods-multiselect__tag-remove\"\n onClick={(e) => { e.stopPropagation(); removeValue(val); }}\n aria-label={`Remove ${getLabel(val)}`}\n tabIndex={-1}\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M3 3L9 9M9 3L3 9\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n </button>\n </span>\n ))}\n\n {overflow > 0 && (\n <span\n className=\"ods-multiselect__tag ods-multiselect__tag--overflow\"\n title={selectedValues.slice(fitCount).map(getLabel).join(\", \")}\n >\n +{overflow}\n </span>\n )}\n\n {selectedValues.length === 0 && (\n <span className=\"ods-multiselect__placeholder\">{placeholder}</span>\n )}\n </div>\n\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n aria-hidden=\"true\"\n className={cn(\"ods-multiselect__chevron\", open && \"ods-multiselect__chevron--open\")}\n >\n <path d=\"M4 6l4 4 4-4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n\n {selectedValues.length > 0 && !disabled && (\n <button\n type=\"button\"\n className=\"ods-multiselect__clear\"\n onClick={(e) => { e.stopPropagation(); clearAll(); }}\n aria-label=\"Clear all\"\n tabIndex={-1}\n >\n Clear\n </button>\n )}\n </div>\n\n {typeof document !== \"undefined\" &&\n createPortal(\n <AnimatePresence>\n {open && (\n <motion.div\n ref={dropdownRef}\n className=\"ods-multiselect__dropdown\"\n style={{\n position: \"fixed\",\n top: dropdownPos.top,\n left: dropdownPos.left,\n width: dropdownPos.width,\n }}\n initial={{ opacity: 0, y: -4 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -4 }}\n transition={{ duration: 0.15, ease: \"easeOut\" }}\n role=\"listbox\"\n aria-label={label || \"Options\"}\n >\n {showSearch && (\n <div className=\"ods-multiselect__search\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"6\" cy=\"6\" r=\"4.5\" stroke=\"currentColor\" strokeWidth=\"1.4\" />\n <path d=\"m12 12-2.5-2.5\" stroke=\"currentColor\" strokeWidth=\"1.4\" strokeLinecap=\"round\" />\n </svg>\n <input\n ref={searchRef}\n className=\"ods-multiselect__search-input\"\n type=\"text\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n onKeyDown={handleSearchKey}\n placeholder={searchPlaceholder}\n aria-label=\"Search options\"\n autoComplete=\"off\"\n />\n </div>\n )}\n <div className=\"ods-multiselect__list\">\n {availableOptions.length > 0 ? (\n availableOptions.map((opt, idx) => (\n <div\n key={opt.value}\n className={cn(\n \"ods-multiselect__option\",\n idx === activeIdx && \"ods-multiselect__option--highlighted\",\n )}\n role=\"option\"\n aria-selected={false}\n onClick={() => addValue(opt.value)}\n onMouseEnter={() => setActiveIdx(idx)}\n >\n {opt.icon && <span className=\"ods-multiselect__option-icon\">{opt.icon}</span>}\n <span className=\"ods-multiselect__option-text\">\n <span>{opt.label}</span>\n {opt.description && (\n <span className=\"ods-multiselect__option-desc\">{opt.description}</span>\n )}\n </span>\n </div>\n ))\n ) : (\n <div className=\"ods-multiselect__empty\">No results</div>\n )}\n </div>\n </motion.div>\n )}\n </AnimatePresence>,\n document.body,\n )}\n\n {error && errorMessage && (\n <span className=\"ods-multiselect__error\">{errorMessage}</span>\n )}\n </div>\n );\n}\n","\"use client\";\nimport {\n type ChangeEvent,\n type InputHTMLAttributes,\n type ReactNode,\n useState,\n} from \"react\";\nimport { cn } from \"../../utils/cn\";\n\ntype NativeProps = Omit<InputHTMLAttributes<HTMLInputElement>, \"type\" | \"size\" | \"value\" | \"onChange\">;\n\nexport interface PasswordInputProps extends NativeProps {\n label?: ReactNode;\n value: string;\n onChange?: (value: string) => void;\n size?: \"sm\" | \"md\" | \"lg\";\n error?: ReactNode;\n helperText?: ReactNode;\n strength?: 0 | 1 | 2 | 3 | 4;\n showToggle?: boolean;\n leftIcon?: ReactNode;\n className?: string;\n}\n\nconst strengthLabels = [\"Very weak\", \"Weak\", \"Fair\", \"Strong\", \"Very strong\"] as const;\n\nexport function PasswordInput({\n label,\n value,\n onChange,\n size = \"md\",\n error,\n helperText,\n strength,\n showToggle = true,\n leftIcon,\n disabled,\n className,\n ...rest\n}: PasswordInputProps) {\n const [shown, setShown] = useState(false);\n const handle = (e: ChangeEvent<HTMLInputElement>) => onChange?.(e.target.value);\n\n return (\n <div className={cn(\"ods-pwd\", `ods-pwd--${size}`, disabled && \"ods-pwd--disabled\", error && \"ods-pwd--error\", className)}>\n {label && <label className=\"ods-pwd__label\">{label}</label>}\n <div className=\"ods-pwd__field\">\n {leftIcon && <span className=\"ods-pwd__icon\" aria-hidden=\"true\">{leftIcon}</span>}\n <input\n {...rest}\n type={shown ? \"text\" : \"password\"}\n value={value}\n onChange={handle}\n disabled={disabled}\n className=\"ods-pwd__input\"\n />\n {showToggle && (\n <button\n type=\"button\"\n className=\"ods-pwd__toggle\"\n onClick={() => setShown((s) => !s)}\n aria-label={shown ? \"Hide password\" : \"Show password\"}\n disabled={disabled}\n >\n {shown ? (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M2 8c1.5-2.6 3.6-4 6-4s4.5 1.4 6 4c-1.5 2.6-3.6 4-6 4s-4.5-1.4-6-4z\" stroke=\"currentColor\" strokeWidth=\"1.3\" />\n <circle cx=\"8\" cy=\"8\" r=\"1.8\" stroke=\"currentColor\" strokeWidth=\"1.3\" />\n <path d=\"M2 2l12 12\" stroke=\"currentColor\" strokeWidth=\"1.3\" strokeLinecap=\"round\" />\n </svg>\n ) : (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M2 8c1.5-2.6 3.6-4 6-4s4.5 1.4 6 4c-1.5 2.6-3.6 4-6 4s-4.5-1.4-6-4z\" stroke=\"currentColor\" strokeWidth=\"1.3\" />\n <circle cx=\"8\" cy=\"8\" r=\"2\" stroke=\"currentColor\" strokeWidth=\"1.3\" />\n </svg>\n )}\n </button>\n )}\n </div>\n {typeof strength === \"number\" && (\n <div className=\"ods-pwd__strength\" data-level={strength}>\n <span className=\"ods-pwd__meter\">\n <span className={cn(\"ods-pwd__bar\", `ods-pwd__bar--${strength}`)} />\n </span>\n <span className=\"ods-pwd__strength-label\">{strengthLabels[strength]}</span>\n </div>\n )}\n {error ? <div className=\"ods-pwd__hint ods-pwd__hint--error\">{error}</div>\n : helperText ? <div className=\"ods-pwd__hint\">{helperText}</div>\n : null}\n </div>\n );\n}\n","\"use client\";\nimport { type ChangeEvent, type ReactNode, useState } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface CountryOption {\n code: string; // ISO-3166-1 alpha-2 (US, GB, IN, ...)\n name: string;\n dialCode: string; // \"+1\", \"+44\", \"+91\"\n flag?: string; // Emoji flag\n}\n\nexport interface PhoneInputProps {\n label?: ReactNode;\n value: string; // local number (without dial code)\n countryCode: string; // current selected country code (e.g. \"US\")\n onChange?: (value: string) => void;\n onCountryChange?: (code: string) => void;\n countries?: CountryOption[];\n placeholder?: string;\n size?: \"sm\" | \"md\" | \"lg\";\n disabled?: boolean;\n error?: ReactNode;\n helperText?: ReactNode;\n className?: string;\n}\n\nconst DEFAULT_COUNTRIES: CountryOption[] = [\n { code: \"US\", name: \"United States\", dialCode: \"+1\", flag: \"🇺🇸\" },\n { code: \"GB\", name: \"United Kingdom\", dialCode: \"+44\", flag: \"🇬🇧\" },\n { code: \"IN\", name: \"India\", dialCode: \"+91\", flag: \"🇮🇳\" },\n { code: \"DE\", name: \"Germany\", dialCode: \"+49\", flag: \"🇩🇪\" },\n { code: \"FR\", name: \"France\", dialCode: \"+33\", flag: \"🇫🇷\" },\n { code: \"JP\", name: \"Japan\", dialCode: \"+81\", flag: \"🇯🇵\" },\n { code: \"AU\", name: \"Australia\", dialCode: \"+61\", flag: \"🇦🇺\" },\n { code: \"BR\", name: \"Brazil\", dialCode: \"+55\", flag: \"🇧🇷\" },\n];\n\nexport function PhoneInput({\n label,\n value,\n countryCode,\n onChange,\n onCountryChange,\n countries = DEFAULT_COUNTRIES,\n placeholder = \"(555) 123-4567\",\n size = \"md\",\n disabled = false,\n error,\n helperText,\n className,\n}: PhoneInputProps) {\n const [open, setOpen] = useState(false);\n const country = countries.find((c) => c.code === countryCode) ?? countries[0];\n\n const onInput = (e: ChangeEvent<HTMLInputElement>) => onChange?.(e.target.value);\n\n return (\n <div\n className={cn(\n \"ods-phone\",\n `ods-phone--${size}`,\n disabled && \"ods-phone--disabled\",\n error && \"ods-phone--error\",\n className,\n )}\n >\n {label && <label className=\"ods-phone__label\">{label}</label>}\n <div className=\"ods-phone__field\">\n <button\n type=\"button\"\n className=\"ods-phone__country\"\n onClick={() => !disabled && setOpen((o) => !o)}\n disabled={disabled}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n >\n <span className=\"ods-phone__flag\" aria-hidden=\"true\">{country.flag}</span>\n <span className=\"ods-phone__dial\">{country.dialCode}</span>\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M3 4.5L6 7.5L9 4.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n <input\n type=\"tel\"\n className=\"ods-phone__input\"\n value={value}\n onChange={onInput}\n disabled={disabled}\n placeholder={placeholder}\n aria-label={typeof label === \"string\" ? `${label} number` : \"Phone number\"}\n />\n {open && (\n <ul className=\"ods-phone__menu\" role=\"listbox\" aria-label=\"Country\">\n {countries.map((c) => (\n <li key={c.code}>\n <button\n type=\"button\"\n role=\"option\"\n aria-selected={c.code === countryCode}\n className={cn(\n \"ods-phone__menu-item\",\n c.code === countryCode && \"ods-phone__menu-item--active\",\n )}\n onClick={() => {\n onCountryChange?.(c.code);\n setOpen(false);\n }}\n >\n <span className=\"ods-phone__flag\" aria-hidden=\"true\">{c.flag}</span>\n <span className=\"ods-phone__menu-name\">{c.name}</span>\n <span className=\"ods-phone__menu-dial\">{c.dialCode}</span>\n </button>\n </li>\n ))}\n </ul>\n )}\n </div>\n {error ? <div className=\"ods-phone__hint ods-phone__hint--error\">{error}</div>\n : helperText ? <div className=\"ods-phone__hint\">{helperText}</div>\n : null}\n </div>\n );\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface QuoteProps {\n variant?: \"default\" | \"muted\" | \"primary\";\n author?: ReactNode;\n attribution?: ReactNode;\n size?: \"sm\" | \"md\" | \"lg\";\n children: ReactNode;\n className?: string;\n}\n\nexport function Quote({\n variant = \"default\",\n author,\n attribution,\n size = \"md\",\n children,\n className,\n}: QuoteProps) {\n return (\n <blockquote\n className={cn(\n \"ods-quote\",\n `ods-quote--${variant}`,\n `ods-quote--${size}`,\n className,\n )}\n >\n <span className=\"ods-quote__mark\" aria-hidden=\"true\">\"</span>\n <p className=\"ods-quote__text\">{children}</p>\n {(author || attribution) && (\n <footer className=\"ods-quote__footer\">\n {author && <cite className=\"ods-quote__author\">{author}</cite>}\n {attribution && <span className=\"ods-quote__attribution\">{attribution}</span>}\n </footer>\n )}\n </blockquote>\n );\n}\n","\"use client\";\nimport { useRef } from \"react\";\nimport { useRadio } from \"react-aria\";\nimport { cn } from \"../../utils/cn\";\nimport { useRadioGroupContext } from \"./RadioGroup\";\n\nexport interface RadioProps {\n value: string;\n label?: string;\n disabled?: boolean;\n className?: string;\n}\n\nexport function Radio({ value, label, disabled = false, className }: RadioProps) {\n const state = useRadioGroupContext();\n const ref = useRef<HTMLInputElement>(null);\n\n const { inputProps } = useRadio(\n {\n value,\n isDisabled: disabled,\n \"aria-label\": label,\n },\n state,\n ref,\n );\n\n const isSelected = state.selectedValue === value;\n\n return (\n <label\n className={cn(\n 'ods-radio',\n isSelected && 'ods-radio--selected',\n disabled && 'ods-radio--disabled',\n className,\n )}\n >\n <input {...inputProps} ref={ref} className={'ods-radio__input'} />\n <div className={'ods-radio__circle'} aria-hidden=\"true\">\n <div\n className={cn('ods-radio__dot', isSelected && 'ods-radio__dot--visible')}\n />\n </div>\n {label && <span className={'ods-radio__label'}>{label}</span>}\n </label>\n );\n}\n","\"use client\";\nimport { createContext, type ReactNode, useContext, useRef } from \"react\";\nimport { useRadioGroup } from \"react-aria\";\nimport { type RadioGroupState, useRadioGroupState } from \"react-stately\";\nimport { cn } from \"../../utils/cn\";\n\nexport const RadioGroupContext = createContext<RadioGroupState | null>(null);\n\nexport function useRadioGroupContext() {\n const context = useContext(RadioGroupContext);\n if (!context) {\n throw new Error(\"Radio must be used within a RadioGroup\");\n }\n return context;\n}\n\nexport interface RadioGroupProps {\n value?: string;\n defaultValue?: string;\n onChange?: (value: string) => void;\n label?: string | ReactNode;\n orientation?: \"horizontal\" | \"vertical\";\n disabled?: boolean;\n children: ReactNode;\n className?: string;\n}\n\nexport function RadioGroup({\n value,\n defaultValue,\n onChange,\n label,\n orientation = \"vertical\",\n disabled = false,\n children,\n className,\n}: RadioGroupProps) {\n const ariaProps = {\n label: typeof label === \"string\" ? label : \"radio group\",\n value,\n defaultValue,\n onChange,\n isDisabled: disabled,\n orientation,\n };\n\n const state = useRadioGroupState(ariaProps);\n const ref = useRef<HTMLDivElement>(null);\n const { radioGroupProps, labelProps } = useRadioGroup(ariaProps, state);\n\n return (\n <div\n {...radioGroupProps}\n ref={ref}\n className={cn(\n 'ods-radio-group',\n `ods-radio-group--${orientation}`,\n disabled && 'ods-radio-group--disabled',\n className,\n )}\n >\n {label && (\n <span {...labelProps} className={'ods-radio-group__label'}>\n {label}\n </span>\n )}\n <RadioGroupContext.Provider value={state}>\n <div className={'ods-radio-group__items'}>{children}</div>\n </RadioGroupContext.Provider>\n </div>\n );\n}\n","\"use client\";\nimport { type ChangeEvent, type ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface RangeSliderProps {\n label?: ReactNode;\n value: [number, number];\n onChange?: (value: [number, number]) => void;\n min?: number;\n max?: number;\n step?: number;\n formatValue?: (value: number) => ReactNode;\n showValue?: boolean;\n size?: \"sm\" | \"md\" | \"lg\";\n disabled?: boolean;\n className?: string;\n}\n\nexport function RangeSlider({\n label,\n value,\n onChange,\n min = 0,\n max = 100,\n step = 1,\n formatValue,\n showValue = true,\n size = \"md\",\n disabled = false,\n className,\n}: RangeSliderProps) {\n const [lo, hi] = value;\n const fmt = (v: number) => (formatValue ? formatValue(v) : `${v}`);\n const span = max - min || 1;\n const loPct = ((lo - min) / span) * 100;\n const hiPct = ((hi - min) / span) * 100;\n\n const setLo = (e: ChangeEvent<HTMLInputElement>) => {\n const next = Math.min(Number(e.target.value), hi);\n onChange?.([next, hi]);\n };\n const setHi = (e: ChangeEvent<HTMLInputElement>) => {\n const next = Math.max(Number(e.target.value), lo);\n onChange?.([lo, next]);\n };\n\n return (\n <div\n className={cn(\n \"ods-range-slider\",\n `ods-range-slider--${size}`,\n disabled && \"ods-range-slider--disabled\",\n className,\n )}\n >\n {(label || showValue) && (\n <div className=\"ods-range-slider__head\">\n {label && <span className=\"ods-range-slider__label\">{label}</span>}\n {showValue && (\n <span className=\"ods-range-slider__value\">\n {fmt(lo)} – {fmt(hi)}\n </span>\n )}\n </div>\n )}\n <div className=\"ods-range-slider__track\">\n <span\n className=\"ods-range-slider__fill\"\n style={{ left: `${loPct}%`, right: `${100 - hiPct}%` }}\n />\n <input\n type=\"range\"\n className=\"ods-range-slider__input ods-range-slider__input--lo\"\n min={min}\n max={max}\n step={step}\n value={lo}\n onChange={setLo}\n disabled={disabled}\n aria-label=\"Minimum\"\n />\n <input\n type=\"range\"\n className=\"ods-range-slider__input ods-range-slider__input--hi\"\n min={min}\n max={max}\n step={step}\n value={hi}\n onChange={setHi}\n disabled={disabled}\n aria-label=\"Maximum\"\n />\n </div>\n </div>\n );\n}\n","\"use client\";\nimport { type ReactNode, useState } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface RatingProps {\n value: number;\n onChange?: (value: number) => void;\n max?: number;\n size?: \"sm\" | \"md\" | \"lg\";\n allowHalf?: boolean;\n readOnly?: boolean;\n disabled?: boolean;\n showLabel?: boolean;\n label?: ReactNode;\n icon?: \"star\" | \"heart\";\n className?: string;\n}\n\nfunction StarIcon({ fill }: { fill: number }) {\n const pathId = `r-${Math.random().toString(36).slice(2)}`;\n return (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 22 22\" fill=\"none\" aria-hidden=\"true\">\n <defs>\n <linearGradient id={pathId} x1=\"0\" x2=\"1\" y1=\"0\" y2=\"0\">\n <stop offset={`${fill * 100}%`} stopColor=\"#f59e0b\" />\n <stop offset={`${fill * 100}%`} stopColor=\"#e1e5eb\" />\n </linearGradient>\n </defs>\n <path\n d=\"M11 2l2.6 5.4 6 .9-4.3 4.2 1 6-5.3-2.8-5.3 2.8 1-6L2 8.3l6-.9L11 2z\"\n fill={`url(#${pathId})`}\n stroke=\"currentColor\"\n strokeWidth=\"0.6\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction HeartIcon({ fill }: { fill: number }) {\n const pathId = `h-${Math.random().toString(36).slice(2)}`;\n return (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 22 22\" fill=\"none\" aria-hidden=\"true\">\n <defs>\n <linearGradient id={pathId} x1=\"0\" x2=\"1\" y1=\"0\" y2=\"0\">\n <stop offset={`${fill * 100}%`} stopColor=\"#ec4899\" />\n <stop offset={`${fill * 100}%`} stopColor=\"#e1e5eb\" />\n </linearGradient>\n </defs>\n <path\n d=\"M11 18s-6-4-6-8.5A3.5 3.5 0 0 1 11 6a3.5 3.5 0 0 1 6 3.5c0 4.5-6 8.5-6 8.5z\"\n fill={`url(#${pathId})`}\n stroke=\"currentColor\"\n strokeWidth=\"0.6\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nexport function Rating({\n value,\n onChange,\n max = 5,\n size = \"md\",\n allowHalf = false,\n readOnly = false,\n disabled = false,\n showLabel = false,\n label,\n icon = \"star\",\n className,\n}: RatingProps) {\n const [hover, setHover] = useState<number | null>(null);\n const display = hover ?? value;\n const interactive = !readOnly && !disabled;\n const Icon = icon === \"heart\" ? HeartIcon : StarIcon;\n\n const click = (idx: number, half: boolean) => {\n if (!interactive) return;\n onChange?.(half ? idx + 0.5 : idx + 1);\n };\n\n return (\n <div\n className={cn(\n \"ods-rating\",\n `ods-rating--${size}`,\n readOnly && \"ods-rating--readonly\",\n disabled && \"ods-rating--disabled\",\n interactive && \"ods-rating--interactive\",\n className,\n )}\n role=\"radiogroup\"\n aria-label={typeof label === \"string\" ? label : \"Rating\"}\n >\n {Array.from({ length: max }).map((_, i) => {\n const fill = Math.max(0, Math.min(1, display - i));\n return (\n <button\n key={i}\n type=\"button\"\n role=\"radio\"\n aria-checked={Math.ceil(value) === i + 1}\n disabled={!interactive}\n onMouseLeave={() => setHover(null)}\n className=\"ods-rating__item\"\n >\n <span\n className=\"ods-rating__half ods-rating__half--left\"\n onMouseEnter={() => interactive && allowHalf && setHover(i + 0.5)}\n onClick={() => click(i, allowHalf)}\n />\n <span\n className=\"ods-rating__half ods-rating__half--right\"\n onMouseEnter={() => interactive && setHover(i + 1)}\n onClick={() => click(i, false)}\n />\n <Icon fill={fill} />\n </button>\n );\n })}\n {showLabel && (\n <span className=\"ods-rating__label\">\n {typeof label === \"string\" || label ? label : `${value.toFixed(allowHalf ? 1 : 0)}/${max}`}\n </span>\n )}\n </div>\n );\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface RibbonProps {\n variant?: \"primary\" | \"success\" | \"warning\" | \"error\" | \"neutral\";\n icon?: ReactNode;\n size?: \"sm\" | \"md\";\n children: ReactNode;\n className?: string;\n}\n\nexport function Ribbon({\n variant = \"primary\",\n icon,\n size = \"md\",\n children,\n className,\n}: RibbonProps) {\n return (\n <span\n className={cn(\n \"ods-ribbon\",\n `ods-ribbon--${variant}`,\n `ods-ribbon--${size}`,\n className,\n )}\n >\n {icon && <span className=\"ods-ribbon__icon\" aria-hidden=\"true\">{icon}</span>}\n <span className=\"ods-ribbon__label\">{children}</span>\n </span>\n );\n}\n","\"use client\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport { type ReactNode, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { HiddenSelect, useButton, useListBox, useOption, useSelect } from \"react-aria\";\nimport { createPortal } from \"react-dom\";\nimport { Item, useSelectState } from \"react-stately\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface SelectOption {\n value: string;\n label: string;\n icon?: ReactNode;\n description?: string;\n disabled?: boolean;\n}\n\nexport interface SelectProps {\n options: SelectOption[];\n value?: string;\n defaultValue?: string;\n onChange?: (value: string) => void;\n placeholder?: string;\n searchable?: boolean;\n label?: string;\n error?: boolean;\n errorMessage?: string;\n disabled?: boolean;\n size?: \"sm\" | \"md\" | \"lg\";\n className?: string;\n /** Name for form submission */\n name?: string;\n}\n\n/* ------------------------------------------------------------------ */\n/* Internal ListBox rendered inside the dropdown */\n/* ------------------------------------------------------------------ */\n\nfunction ListBox(props: any) {\n const ref = useRef<HTMLUListElement>(null);\n const { listBoxRef = ref, state } = props;\n const { listBoxProps } = useListBox(props, state, listBoxRef);\n\n return (\n <ul {...listBoxProps} ref={listBoxRef} className={'ods-select__options'}>\n {[...state.collection].map((item: any) => (\n <Option key={item.key} item={item} state={state} />\n ))}\n </ul>\n );\n}\n\nfunction Option({ item, state }: any) {\n const ref = useRef<HTMLLIElement>(null);\n const { optionProps, isSelected, isFocused, isDisabled } = useOption(\n { key: item.key },\n state,\n ref,\n );\n\n // item.value is the items-array object; the actual SelectOption is nested inside\n const raw = item.value;\n const option: SelectOption | undefined = raw?.value ?? raw;\n\n return (\n <li\n {...optionProps}\n ref={ref}\n className={cn(\n 'ods-select__option',\n isFocused && 'ods-select__option--highlighted',\n isSelected && 'ods-select__option--selected',\n isDisabled && 'ods-select__option--disabled',\n )}\n >\n {option?.icon && <span className={'ods-select__option-icon'}>{option.icon}</span>}\n <span className={'ods-select__option-text'}>\n <span className={'ods-select__option-label'}>{item.rendered}</span>\n {option?.description && (\n <span className={'ods-select__option-desc'}>{option.description}</span>\n )}\n </span>\n {isSelected && (\n <span className={'ods-select__check'} aria-hidden=\"true\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M3.5 8.5L6.5 11.5L12.5 4.5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </span>\n )}\n </li>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Chevron SVG */\n/* ------------------------------------------------------------------ */\nfunction ChevronDown({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M4 6L8 10L12 6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Main Select component */\n/* ------------------------------------------------------------------ */\n\nexport function Select({\n options,\n value,\n defaultValue,\n onChange,\n placeholder = \"Select an option...\",\n searchable = false,\n label,\n error = false,\n errorMessage,\n disabled = false,\n size = \"md\",\n className,\n name,\n}: SelectProps) {\n const triggerRef = useRef<HTMLButtonElement>(null);\n const listBoxRef = useRef<HTMLUListElement>(null);\n const searchRef = useRef<HTMLInputElement>(null);\n const [searchQuery, setSearchQuery] = useState(\"\");\n const [dropdownPos, setDropdownPos] = useState({ top: 0, left: 0, width: 0 });\n\n // Build react-stately items from options, applying search filter\n const filteredOptions = useMemo(() => {\n if (!searchable || !searchQuery) return options;\n const q = searchQuery.toLowerCase();\n return options.filter(\n (o) => o.label.toLowerCase().includes(q) || o.description?.toLowerCase().includes(q),\n );\n }, [options, searchQuery, searchable]);\n\n // Build collection props for useSelectState\n const ariaProps = useMemo(() => {\n const items = filteredOptions.map((o) => ({\n key: o.value,\n label: o.label,\n value: o,\n isDisabled: o.disabled,\n }));\n\n const props: any = {\n label: label || \"Select\",\n items,\n children: (item: any) => (\n <Item key={item.key} textValue={item.label}>\n {item.label}\n </Item>\n ),\n isDisabled: disabled,\n onSelectionChange: (key: any) => {\n onChange?.(String(key));\n setSearchQuery(\"\");\n },\n };\n\n if (value !== undefined) {\n props.selectedKey = value;\n }\n if (defaultValue !== undefined) {\n props.defaultSelectedKey = defaultValue;\n }\n\n return props;\n }, [filteredOptions, label, disabled, value, defaultValue, onChange]);\n\n const state = useSelectState(ariaProps);\n\n const { triggerProps, menuProps } = useSelect(ariaProps, state, triggerRef);\n const { buttonProps } = useButton(triggerProps, triggerRef);\n\n // Position dropdown using getBoundingClientRect (fixed positioning to escape stacking contexts)\n const updatePosition = useCallback(() => {\n if (!triggerRef.current) return;\n const rect = triggerRef.current.getBoundingClientRect();\n setDropdownPos({\n top: rect.bottom + 4,\n left: rect.left,\n width: rect.width,\n });\n }, []);\n\n useEffect(() => {\n if (state.isOpen) {\n updatePosition();\n window.addEventListener(\"scroll\", updatePosition, true);\n window.addEventListener(\"resize\", updatePosition);\n return () => {\n window.removeEventListener(\"scroll\", updatePosition, true);\n window.removeEventListener(\"resize\", updatePosition);\n };\n }\n }, [state.isOpen, updatePosition]);\n\n // Focus search input when dropdown opens\n useEffect(() => {\n if (state.isOpen && searchable && searchRef.current) {\n // Small delay to allow animation frame\n requestAnimationFrame(() => searchRef.current?.focus());\n }\n }, [state.isOpen, searchable]);\n\n // Find currently selected option for display\n const selectedOption = options.find((o) => o.value === String(state.selectedKey ?? \"\"));\n\n return (\n <div\n className={cn(\n 'ods-select',\n `ods-select--${size}`,\n error && 'ods-select--error',\n disabled && 'ods-select--disabled',\n className,\n )}\n >\n {label && <label className={'ods-select__label'}>{label}</label>}\n\n <HiddenSelect state={state} triggerRef={triggerRef} label={label} name={name} />\n\n <button\n {...buttonProps}\n ref={triggerRef}\n className={cn(\n 'ods-select__trigger',\n state.isOpen && 'ods-select__trigger--open',\n )}\n >\n <span className={'ods-select__value'}>\n {selectedOption ? (\n <>\n {selectedOption.icon && (\n <span className={'ods-select__value-icon'}>{selectedOption.icon}</span>\n )}\n {selectedOption.label}\n </>\n ) : (\n <span className={'ods-select__placeholder'}>{placeholder}</span>\n )}\n </span>\n <ChevronDown\n className={cn(\n 'ods-select__chevron',\n state.isOpen && 'ods-select__chevron--open',\n )}\n />\n </button>\n\n {typeof document !== \"undefined\" &&\n createPortal(\n <AnimatePresence>\n {state.isOpen && (\n <motion.div\n className={'ods-select__dropdown'}\n style={{\n position: \"fixed\",\n top: dropdownPos.top,\n left: dropdownPos.left,\n width: dropdownPos.width,\n }}\n initial={{ opacity: 0, scale: 0.95 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.95 }}\n transition={{ duration: 0.2, ease: [0.16, 1, 0.3, 1] }}\n >\n {searchable && (\n <div className={'ods-select__search-wrap'}>\n <input\n ref={searchRef}\n className={'ods-select__search'}\n type=\"text\"\n placeholder=\"Search...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n aria-label=\"Search options\"\n onKeyDown={(e) => {\n // Allow Escape to close the dropdown\n if (e.key === \"Escape\") {\n state.close();\n }\n }}\n />\n </div>\n )}\n <ListBox {...menuProps} listBoxRef={listBoxRef} state={state} />\n {filteredOptions.length === 0 && (\n <div className={'ods-select__empty'}>No results found</div>\n )}\n </motion.div>\n )}\n </AnimatePresence>,\n document.body,\n )}\n\n {error && errorMessage && <span className={'ods-select__error'}>{errorMessage}</span>}\n </div>\n );\n}\n","\"use client\";\nimport { type ReactNode, useCallback, useEffect, useRef, useState } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface SidebarNavItem {\n id: string;\n label: ReactNode;\n icon: ReactNode;\n badge?: ReactNode;\n tag?: ReactNode;\n active?: boolean;\n /** Shortcut hint shown in rail tooltip, e.g. \"⌘1\". */\n shortcut?: string;\n onClick?: () => void;\n href?: string;\n /** Nested children (L2/L3). Items with children expand in place. */\n children?: SidebarNavItem[];\n /** Start expanded. Defaults to active (so active path is pre-revealed). */\n defaultExpanded?: boolean;\n}\n\nexport interface SidebarSection {\n id?: string;\n label?: ReactNode;\n items: SidebarNavItem[];\n}\n\nexport interface SidebarUser {\n name: ReactNode;\n email?: ReactNode;\n initial?: ReactNode;\n avatar?: ReactNode;\n onClick?: () => void;\n}\n\nexport interface SidebarProps {\n /**\n * - \"rail\" — always-collapsed 64px rail\n * - \"expanded\" — always-expanded 260px\n * - \"auto\" — rail that expands into a floating overlay on hover;\n * user can pin it to stay expanded (persisted to localStorage)\n */\n variant?: \"rail\" | \"expanded\" | \"auto\";\n brand?: { name: ReactNode; subtitle?: ReactNode };\n logo?: ReactNode;\n sections?: SidebarSection[];\n items?: SidebarNavItem[];\n footerItems?: SidebarNavItem[];\n user?: SidebarUser;\n /** For rail/expanded: toggle callback. For auto: optional hook called on pin change. */\n onToggle?: () => void;\n\n // ── \"auto\" controls ────────────────────────────\n pinned?: boolean;\n defaultPinned?: boolean;\n onPinnedChange?: (pinned: boolean) => void;\n pinStorageKey?: string;\n hoverOpenDelay?: number;\n hoverCloseDelay?: number;\n\n // ── rail tooltip ───────────────────────────────\n tooltipDelay?: number;\n\n height?: number | string;\n className?: string;\n}\n\nexport function Sidebar({\n variant = \"expanded\",\n brand,\n logo,\n sections,\n items,\n footerItems,\n user,\n onToggle,\n pinned: pinnedProp,\n defaultPinned = false,\n onPinnedChange,\n pinStorageKey = \"ods-sidebar-pinned\",\n hoverOpenDelay = 100,\n hoverCloseDelay = 250,\n tooltipDelay = 300,\n height = \"100%\",\n className,\n}: SidebarProps) {\n const allSections: SidebarSection[] = sections ?? (items ? [{ items }] : []);\n\n // ── Pin state (persisted) ────────────────────\n const [internalPinned, setInternalPinned] = useState<boolean>(() => {\n if (typeof window === \"undefined\") return defaultPinned;\n try {\n const stored = window.localStorage.getItem(pinStorageKey);\n if (stored !== null) return stored === \"true\";\n } catch { /* noop */ }\n return defaultPinned;\n });\n const pinned = pinnedProp ?? internalPinned;\n const setPinned = useCallback((p: boolean) => {\n if (pinnedProp === undefined) setInternalPinned(p);\n try { window.localStorage.setItem(pinStorageKey, String(p)); } catch { /* noop */ }\n onPinnedChange?.(p);\n }, [pinnedProp, pinStorageKey, onPinnedChange]);\n\n // ── Hover overlay ────────────────────────────\n const [hoverOpen, setHoverOpen] = useState(false);\n const openTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const closeTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const clearTimers = () => {\n if (openTimer.current) { clearTimeout(openTimer.current); openTimer.current = null; }\n if (closeTimer.current) { clearTimeout(closeTimer.current); closeTimer.current = null; }\n };\n useEffect(() => () => clearTimers(), []);\n const handleEnter = () => {\n clearTimers();\n openTimer.current = setTimeout(() => setHoverOpen(true), hoverOpenDelay);\n };\n const handleLeave = () => {\n clearTimers();\n closeTimer.current = setTimeout(() => setHoverOpen(false), hoverCloseDelay);\n };\n\n const autoMode = variant === \"auto\";\n const showAsRail = autoMode ? !pinned : variant === \"rail\";\n const overlayOpen = autoMode && !pinned && hoverOpen;\n\n return (\n <nav\n className={cn(\n \"ods-sidebar\",\n `ods-sidebar--${showAsRail ? \"rail\" : \"expanded\"}`,\n autoMode && \"ods-sidebar--auto\",\n overlayOpen && \"ods-sidebar--overlay-open\",\n className,\n )}\n style={{ height }}\n aria-label=\"Sidebar navigation\"\n onMouseEnter={autoMode && !pinned ? handleEnter : undefined}\n onMouseLeave={autoMode && !pinned ? handleLeave : undefined}\n >\n {showAsRail ? (\n <RailLayout\n logo={logo}\n sections={allSections}\n footerItems={footerItems}\n user={user}\n onToggle={autoMode ? () => setPinned(true) : onToggle}\n tooltipDelay={tooltipDelay}\n suppressTooltips={overlayOpen}\n />\n ) : (\n <ExpandedLayout\n logo={logo}\n brand={brand}\n sections={allSections}\n footerItems={footerItems}\n user={user}\n onToggle={autoMode ? () => setPinned(false) : onToggle}\n pinned={autoMode ? pinned : undefined}\n onPinToggle={autoMode ? () => setPinned(!pinned) : undefined}\n />\n )}\n\n {overlayOpen && (\n <div className=\"ods-sidebar__overlay\" onMouseEnter={handleEnter} onMouseLeave={handleLeave}>\n <ExpandedLayout\n logo={logo}\n brand={brand}\n sections={allSections}\n footerItems={footerItems}\n user={user}\n onToggle={() => setPinned(true)}\n pinned={false}\n onPinToggle={() => setPinned(!pinned)}\n />\n </div>\n )}\n </nav>\n );\n}\n\n// ──────────────────────────────────────────────────────────────────────\n// Rail (collapsed) — 64px wide, icon-only\n// ──────────────────────────────────────────────────────────────────────\nfunction RailLayout({\n logo,\n sections,\n footerItems,\n user,\n onToggle,\n tooltipDelay,\n suppressTooltips,\n}: Pick<SidebarProps, \"logo\" | \"footerItems\" | \"user\" | \"onToggle\"> & {\n sections: SidebarSection[];\n tooltipDelay: number;\n suppressTooltips?: boolean;\n}) {\n return (\n <>\n {logo && <div className=\"ods-sidebar__logo-rail\">{logo}</div>}\n {onToggle && (\n <button\n type=\"button\"\n className=\"ods-sidebar__expand-rail\"\n onClick={onToggle}\n aria-label=\"Expand sidebar\"\n title=\"Expand sidebar\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M13 3v10M5 5l3 3-3 3\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n )}\n <div className=\"ods-sidebar__nav-rail\">\n {sections.flatMap((s) => s.items).map((item) => (\n <RailItem key={item.id} item={item} tooltipDelay={tooltipDelay} suppressTooltip={suppressTooltips} />\n ))}\n </div>\n <div className=\"ods-sidebar__spacer\" />\n {footerItems && footerItems.length > 0 && (\n <div className=\"ods-sidebar__footer-rail\">\n {footerItems.map((item) => (\n <RailItem key={item.id} item={item} tooltipDelay={tooltipDelay} suppressTooltip={suppressTooltips} />\n ))}\n </div>\n )}\n {user && (\n <button\n type=\"button\"\n className=\"ods-sidebar__user-rail\"\n onClick={user.onClick}\n aria-label={typeof user.name === \"string\" ? user.name : \"User\"}\n >\n {user.avatar ?? (\n <span>{user.initial ?? (typeof user.name === \"string\" ? user.name.charAt(0).toUpperCase() : \"?\")}</span>\n )}\n </button>\n )}\n </>\n );\n}\n\nfunction RailItem({\n item,\n tooltipDelay,\n suppressTooltip,\n}: {\n item: SidebarNavItem;\n tooltipDelay: number;\n suppressTooltip?: boolean;\n}) {\n const [tipOpen, setTipOpen] = useState(false);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const clear = () => {\n if (timerRef.current) { clearTimeout(timerRef.current); timerRef.current = null; }\n };\n useEffect(() => () => clear(), []);\n\n const show = () => {\n if (suppressTooltip) return;\n clear();\n timerRef.current = setTimeout(() => setTipOpen(true), tooltipDelay);\n };\n const hide = () => {\n clear();\n setTipOpen(false);\n };\n\n const Comp = item.href ? \"a\" : \"button\";\n const labelText = typeof item.label === \"string\" ? item.label : undefined;\n\n return (\n <div\n className=\"ods-sidebar__rail-wrap\"\n onMouseEnter={show}\n onMouseLeave={hide}\n onFocus={show}\n onBlur={hide}\n >\n <Comp\n type={item.href ? undefined : \"button\"}\n href={item.href}\n onClick={item.onClick}\n className={cn(\n \"ods-sidebar__rail-item\",\n item.active && \"ods-sidebar__rail-item--active\",\n )}\n aria-current={item.active ? \"page\" : undefined}\n aria-label={labelText}\n title={labelText}\n >\n <span className=\"ods-sidebar__rail-icon\">{item.icon}</span>\n </Comp>\n {tipOpen && labelText && (\n <div className=\"ods-sidebar__rail-tooltip\" role=\"tooltip\">\n <span className=\"ods-sidebar__rail-tooltip-label\">{labelText}</span>\n {item.shortcut && (\n <kbd className=\"ods-sidebar__rail-kbd\">{item.shortcut}</kbd>\n )}\n </div>\n )}\n </div>\n );\n}\n\n// ──────────────────────────────────────────────────────────────────────\n// Expanded — 260px wide, with labels + sections + footer + user card\n// ──────────────────────────────────────────────────────────────────────\nfunction ExpandedLayout({\n logo,\n brand,\n sections,\n footerItems,\n user,\n onToggle,\n pinned,\n onPinToggle,\n}: Pick<SidebarProps, \"logo\" | \"brand\" | \"footerItems\" | \"user\" | \"onToggle\"> & {\n sections: SidebarSection[];\n pinned?: boolean;\n onPinToggle?: () => void;\n}) {\n return (\n <>\n <div className=\"ods-sidebar__header\">\n {logo && <div className=\"ods-sidebar__logo\">{logo}</div>}\n {brand && (\n <div className=\"ods-sidebar__brand\">\n <span className=\"ods-sidebar__brand-name\">{brand.name}</span>\n {brand.subtitle && <span className=\"ods-sidebar__brand-sub\">{brand.subtitle}</span>}\n </div>\n )}\n {onPinToggle && (\n <button\n type=\"button\"\n className={cn(\"ods-sidebar__pin\", pinned && \"ods-sidebar__pin--pinned\")}\n onClick={onPinToggle}\n aria-label={pinned ? \"Unpin sidebar\" : \"Pin sidebar\"}\n aria-pressed={pinned}\n title={pinned ? \"Unpin (collapse on leave)\" : \"Pin (keep expanded)\"}\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M5.5 1h3v3l2 3h-3v3l-1.5 2L4.5 10V7h-3l2-3V1z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.3\"\n strokeLinejoin=\"round\"\n fill={pinned ? \"currentColor\" : \"none\"}\n />\n </svg>\n </button>\n )}\n {onToggle && !onPinToggle && (\n <button\n type=\"button\"\n className=\"ods-sidebar__collapse\"\n onClick={onToggle}\n aria-label=\"Collapse sidebar\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M3 3v10M11 5l-3 3 3 3\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n )}\n </div>\n <div className=\"ods-sidebar__body\">\n {sections.map((section, sIdx) => (\n <div className=\"ods-sidebar__section\" key={section.id ?? sIdx}>\n {section.label && (\n <div className=\"ods-sidebar__section-label\">{section.label}</div>\n )}\n {section.items.map((item) => (\n <ExpandedItem key={item.id} item={item} level={0} />\n ))}\n </div>\n ))}\n </div>\n {(footerItems || user) && (\n <div className=\"ods-sidebar__footer\">\n {footerItems && footerItems.length > 0 && (\n <div className=\"ods-sidebar__footer-list\">\n {footerItems.map((item) => (\n <ExpandedItem key={item.id} item={item} level={0} />\n ))}\n </div>\n )}\n {user && (\n <button\n type=\"button\"\n className=\"ods-sidebar__user-card\"\n onClick={user.onClick}\n >\n <span className=\"ods-sidebar__user-avatar\">\n {user.avatar ?? (\n <span>{user.initial ?? (typeof user.name === \"string\" ? user.name.charAt(0).toUpperCase() : \"?\")}</span>\n )}\n </span>\n <span className=\"ods-sidebar__user-info\">\n <span className=\"ods-sidebar__user-name\">{user.name}</span>\n {user.email && <span className=\"ods-sidebar__user-email\">{user.email}</span>}\n </span>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"8\" cy=\"3\" r=\"1.3\" fill=\"currentColor\" />\n <circle cx=\"8\" cy=\"8\" r=\"1.3\" fill=\"currentColor\" />\n <circle cx=\"8\" cy=\"13\" r=\"1.3\" fill=\"currentColor\" />\n </svg>\n </button>\n )}\n </div>\n )}\n </>\n );\n}\n\nfunction ExpandedItem({ item, level }: { item: SidebarNavItem; level: number }) {\n const hasChildren = !!(item.children && item.children.length > 0);\n const [open, setOpen] = useState<boolean>(\n item.defaultExpanded ?? (hasChildren && hasActiveDescendant(item)),\n );\n\n if (hasChildren) {\n return (\n <>\n <button\n type=\"button\"\n className={cn(\n \"ods-sidebar__item\",\n level > 0 && `ods-sidebar__item--l${Math.min(level + 1, 3)}`,\n item.active && \"ods-sidebar__item--active\",\n open && \"ods-sidebar__item--open\",\n )}\n onClick={(e) => {\n setOpen((o) => !o);\n item.onClick?.();\n e.stopPropagation();\n }}\n aria-expanded={open}\n >\n <span className=\"ods-sidebar__icon\">{item.icon}</span>\n <span className=\"ods-sidebar__label\">{item.label}</span>\n {item.tag && <span className=\"ods-sidebar__tag\">{item.tag}</span>}\n {item.badge && <span className=\"ods-sidebar__badge\">{item.badge}</span>}\n <svg\n className={cn(\"ods-sidebar__chevron\", open && \"ods-sidebar__chevron--open\")}\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <path d=\"M4.5 3l3 3-3 3\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n {open && (\n <div className={cn(\"ods-sidebar__subtree\", `ods-sidebar__subtree--l${Math.min(level + 1, 3)}`)}>\n {item.children!.map((child) => (\n <ExpandedItem key={child.id} item={child} level={level + 1} />\n ))}\n </div>\n )}\n </>\n );\n }\n\n const Comp = item.href ? \"a\" : \"button\";\n return (\n <Comp\n type={item.href ? undefined : \"button\"}\n href={item.href}\n onClick={item.onClick}\n className={cn(\n \"ods-sidebar__item\",\n level > 0 && `ods-sidebar__item--l${Math.min(level + 1, 3)}`,\n item.active && \"ods-sidebar__item--active\",\n )}\n aria-current={item.active ? \"page\" : undefined}\n >\n <span className=\"ods-sidebar__icon\">{item.icon}</span>\n <span className=\"ods-sidebar__label\">{item.label}</span>\n {item.tag && <span className=\"ods-sidebar__tag\">{item.tag}</span>}\n {item.badge && <span className=\"ods-sidebar__badge\">{item.badge}</span>}\n </Comp>\n );\n}\n\nfunction hasActiveDescendant(item: SidebarNavItem): boolean {\n if (!item.children) return false;\n for (const c of item.children) {\n if (c.active) return true;\n if (hasActiveDescendant(c)) return true;\n }\n return false;\n}\n","\"use client\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface SkeletonProps {\n variant?: \"text\" | \"circular\" | \"rectangular\";\n width?: string | number;\n height?: string | number;\n lines?: number;\n className?: string;\n}\n\nexport function Skeleton({ variant = \"text\", width, height, lines = 1, className }: SkeletonProps) {\n const resolvedWidth = typeof width === \"number\" ? `${width}px` : width;\n const resolvedHeight = typeof height === \"number\" ? `${height}px` : height;\n\n if (variant === \"text\" && lines > 1) {\n return (\n <div\n className={cn('ods-skeleton__group', className)}\n role=\"status\"\n aria-label=\"Loading\"\n >\n {Array.from({ length: lines }).map((_, i) => (\n <div\n key={i}\n className={cn('ods-skeleton', 'ods-skeleton--text')}\n style={{\n width: i === lines - 1 ? \"75%\" : resolvedWidth || \"100%\",\n height: resolvedHeight,\n }}\n />\n ))}\n </div>\n );\n }\n\n return (\n <div\n className={cn('ods-skeleton', `ods-skeleton--${variant}`, className)}\n style={{\n width: resolvedWidth,\n height: resolvedHeight,\n }}\n role=\"status\"\n aria-label=\"Loading\"\n />\n );\n}\n","\"use client\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport { type ReactNode, useRef } from \"react\";\nimport { FocusScope, useDialog, useModal, useOverlay } from \"react-aria\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface SlideoutPanelProps {\n open: boolean;\n onClose: () => void;\n position?: \"left\" | \"right\";\n width?: number | string;\n title?: ReactNode;\n children?: ReactNode;\n footer?: ReactNode;\n className?: string;\n}\n\nconst slideVariants = {\n left: {\n initial: { x: \"-100%\" },\n animate: { x: 0 },\n exit: { x: \"-100%\" },\n },\n right: {\n initial: { x: \"100%\" },\n animate: { x: 0 },\n exit: { x: \"100%\" },\n },\n};\n\nfunction SlideoutContent({\n open,\n onClose,\n position = \"right\",\n width = 360,\n title,\n children,\n footer,\n className,\n}: SlideoutPanelProps) {\n const overlayRef = useRef<HTMLDivElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n\n const { overlayProps } = useOverlay(\n {\n isOpen: open,\n onClose,\n isDismissable: true,\n },\n overlayRef,\n );\n\n const { modalProps } = useModal();\n const { dialogProps, titleProps } = useDialog({}, panelRef);\n\n // Remove motion-conflicting props\n const { onDrag, onDragStart, onDragEnd, onAnimationStart, ...safeOverlayProps } =\n overlayProps as any;\n\n const variant = slideVariants[position];\n const panelWidth = typeof width === \"number\" ? `${width}px` : width;\n\n return (\n <AnimatePresence>\n {open && (\n <>\n {/* Backdrop */}\n <motion.div\n className={'ods-slideout__backdrop'}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.2 }}\n onClick={onClose}\n data-testid=\"slideout-backdrop\"\n aria-hidden=\"true\"\n />\n\n {/* Panel */}\n <FocusScope contain restoreFocus autoFocus>\n <motion.div\n {...safeOverlayProps}\n {...modalProps}\n {...dialogProps}\n ref={(node) => {\n (overlayRef as any).current = node;\n (panelRef as any).current = node;\n }}\n className={cn(\n 'ods-slideout__panel',\n `ods-slideout__panel--${position}`,\n className,\n )}\n style={{ width: panelWidth }}\n initial={variant.initial}\n animate={variant.animate}\n exit={variant.exit}\n transition={{ type: \"tween\", ease: [0.32, 0.72, 0, 1], duration: 0.28 }}\n >\n {title && (\n <div className={'ods-slideout__header'}>\n <h2 {...titleProps} className={'ods-slideout__title'}>\n {title}\n </h2>\n <button\n className={'ods-slideout__close'}\n onClick={onClose}\n aria-label=\"Close panel\"\n type=\"button\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path d=\"M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z\" />\n </svg>\n </button>\n </div>\n )}\n <div className={'ods-slideout__body'}>{children}</div>\n {footer && <div className={'ods-slideout__footer'}>{footer}</div>}\n </motion.div>\n </FocusScope>\n </>\n )}\n </AnimatePresence>\n );\n}\n\nexport function SlideoutPanel(props: SlideoutPanelProps) {\n if (typeof document === \"undefined\") return null;\n return createPortal(<SlideoutContent {...props} />, document.body);\n}\n","\"use client\";\nimport { type ChangeEvent, type ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface SliderProps {\n label?: ReactNode;\n value: number;\n onChange?: (value: number) => void;\n min?: number;\n max?: number;\n step?: number;\n formatValue?: (value: number) => ReactNode;\n showValue?: boolean;\n size?: \"sm\" | \"md\" | \"lg\";\n disabled?: boolean;\n variant?: \"primary\" | \"success\" | \"warning\" | \"error\";\n \"aria-label\"?: string;\n className?: string;\n}\n\nexport function Slider({\n label,\n value,\n onChange,\n min = 0,\n max = 100,\n step = 1,\n formatValue,\n showValue = true,\n size = \"md\",\n disabled = false,\n variant = \"primary\",\n className,\n ...props\n}: SliderProps) {\n const pct = max === min ? 0 : ((value - min) / (max - min)) * 100;\n const display = formatValue ? formatValue(value) : `${value}`;\n const handle = (e: ChangeEvent<HTMLInputElement>) => onChange?.(Number(e.target.value));\n\n return (\n <div\n className={cn(\n \"ods-slider\",\n `ods-slider--${size}`,\n `ods-slider--${variant}`,\n disabled && \"ods-slider--disabled\",\n className,\n )}\n >\n {(label || showValue) && (\n <div className=\"ods-slider__head\">\n {label && <span className=\"ods-slider__label\">{label}</span>}\n {showValue && <span className=\"ods-slider__value\">{display}</span>}\n </div>\n )}\n <div className=\"ods-slider__track\">\n <span className=\"ods-slider__fill\" style={{ width: `${pct}%` }} />\n <input\n type=\"range\"\n className=\"ods-slider__input\"\n min={min}\n max={max}\n step={step}\n value={value}\n onChange={handle}\n disabled={disabled}\n aria-label={typeof label === \"string\" ? label : props[\"aria-label\"]}\n />\n </div>\n </div>\n );\n}\n","\"use client\";\nimport type { ButtonHTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport type SocialProvider = \"google\" | \"github\" | \"apple\" | \"twitter\" | \"custom\";\n\nexport interface SocialButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n provider: SocialProvider;\n label?: ReactNode; // e.g. \"Continue with Google\"\n icon?: ReactNode; // custom icon override\n size?: \"sm\" | \"md\" | \"lg\";\n fullWidth?: boolean;\n}\n\nconst DEFAULT_LABELS: Record<Exclude<SocialProvider, \"custom\">, string> = {\n google: \"Continue with Google\",\n github: \"Continue with GitHub\",\n apple: \"Continue with Apple\",\n twitter: \"Continue with X\",\n};\n\nconst GoogleIcon = () => (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M17.64 9.2c0-.64-.06-1.25-.16-1.84H9v3.48h4.84a4.14 4.14 0 0 1-1.79 2.72v2.26h2.9c1.69-1.56 2.69-3.85 2.69-6.62z\" fill=\"#4285F4\" />\n <path d=\"M9 18c2.43 0 4.47-.8 5.96-2.18l-2.9-2.26c-.8.54-1.84.86-3.06.86-2.34 0-4.33-1.58-5.04-3.71H.96v2.33A9 9 0 0 0 9 18z\" fill=\"#34A853\" />\n <path d=\"M3.96 10.71A5.38 5.38 0 0 1 3.68 9c0-.6.1-1.18.28-1.71V4.96H.96A9 9 0 0 0 0 9c0 1.45.35 2.82.96 4.04l3-2.33z\" fill=\"#FBBC05\" />\n <path d=\"M9 3.58c1.32 0 2.5.45 3.44 1.35l2.58-2.58A9 9 0 0 0 9 0 9 9 0 0 0 .96 4.96l3 2.33C4.67 5.16 6.66 3.58 9 3.58z\" fill=\"#EA4335\" />\n </svg>\n);\n\nconst GitHubIcon = () => (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M9 .2a9 9 0 0 0-2.85 17.55c.45.08.62-.2.62-.43v-1.5c-2.5.54-3.04-1.2-3.04-1.2-.41-1.05-1-1.33-1-1.33-.82-.56.06-.55.06-.55.9.06 1.38.93 1.38.93.8 1.38 2.11.98 2.63.75.08-.58.31-.98.57-1.2-2-.23-4.1-1-4.1-4.44 0-.98.35-1.78.93-2.41-.1-.23-.4-1.15.09-2.4 0 0 .76-.25 2.48.92a8.6 8.6 0 0 1 4.5 0c1.72-1.17 2.48-.92 2.48-.92.49 1.25.18 2.17.09 2.4.58.63.93 1.43.93 2.4 0 3.45-2.1 4.21-4.1 4.44.32.28.6.82.6 1.67v2.47c0 .24.17.52.63.43A9 9 0 0 0 9 .2z\" fill=\"#ffffff\" />\n </svg>\n);\n\nconst AppleIcon = () => (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M13.4 9.5c0-1.7 1.4-2.5 1.5-2.6-.8-1.2-2.1-1.3-2.5-1.3-1.1-.1-2.1.6-2.6.6-.6 0-1.4-.6-2.3-.6-1.2 0-2.3.7-2.9 1.8-1.2 2.1-.3 5.3.9 7 .6.9 1.3 1.8 2.2 1.8.9 0 1.2-.6 2.3-.6s1.4.6 2.3.6 1.5-.9 2.1-1.8c.7-1 1-2 1-2.1 0 0-1.9-.7-2-2.8zM11.5 4.5c.5-.6.8-1.4.7-2.2-.7 0-1.5.5-2 1.1-.4.5-.8 1.3-.7 2.1.8.1 1.6-.4 2-1z\" fill=\"#ffffff\" />\n </svg>\n);\n\nconst TwitterIcon = () => (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M13.8 1.3h2.6l-5.7 6.5L17.4 16h-5.2l-4.1-5.3L3.4 16H.8l6-6.9L.5 1.3h5.4l3.7 4.9 4.2-4.9z\" fill=\"#ffffff\" />\n </svg>\n);\n\nconst PROVIDER_ICONS: Record<Exclude<SocialProvider, \"custom\">, () => ReactNode> = {\n google: GoogleIcon,\n github: GitHubIcon,\n apple: AppleIcon,\n twitter: TwitterIcon,\n};\n\nexport function SocialButton({\n provider,\n label,\n icon,\n size = \"md\",\n fullWidth = true,\n className,\n children,\n ...props\n}: SocialButtonProps) {\n const resolvedIcon = icon ?? (provider !== \"custom\" ? PROVIDER_ICONS[provider]() : null);\n const resolvedLabel = label ?? children ?? (provider !== \"custom\" ? DEFAULT_LABELS[provider] : null);\n return (\n <button\n type=\"button\"\n {...props}\n className={cn(\n \"ods-social-btn\",\n `ods-social-btn--${provider}`,\n `ods-social-btn--${size}`,\n fullWidth && \"ods-social-btn--full\",\n className,\n )}\n >\n {resolvedIcon && <span className=\"ods-social-btn__icon\" aria-hidden=\"true\">{resolvedIcon}</span>}\n <span className=\"ods-social-btn__label\">{resolvedLabel}</span>\n </button>\n );\n}\n","\"use client\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface SparklineProps {\n data: number[];\n width?: number;\n height?: number;\n stroke?: string;\n fill?: string;\n smooth?: boolean;\n className?: string;\n \"aria-label\"?: string;\n}\n\nexport function Sparkline({\n data,\n width = 80,\n height = 24,\n stroke = \"#6c5ce7\",\n fill,\n smooth = true,\n className,\n \"aria-label\": ariaLabel,\n}: SparklineProps) {\n if (data.length < 2) return null;\n const pad = 1;\n const min = Math.min(...data);\n const max = Math.max(...data);\n const range = Math.max(1, max - min);\n const stepX = (width - pad * 2) / (data.length - 1);\n\n const pts = data.map((y, i) => [\n pad + i * stepX,\n pad + (1 - (y - min) / range) * (height - pad * 2),\n ]) as [number, number][];\n\n let path = `M${pts[0][0]},${pts[0][1]}`;\n if (smooth) {\n for (let i = 0; i < pts.length - 1; i++) {\n const [x0, y0] = pts[Math.max(0, i - 1)];\n const [x1, y1] = pts[i];\n const [x2, y2] = pts[i + 1];\n const [x3, y3] = pts[Math.min(pts.length - 1, i + 2)];\n const cp1x = x1 + (x2 - x0) / 6;\n const cp1y = y1 + (y2 - y0) / 6;\n const cp2x = x2 - (x3 - x1) / 6;\n const cp2y = y2 - (y3 - y1) / 6;\n path += ` C${cp1x},${cp1y} ${cp2x},${cp2y} ${x2},${y2}`;\n }\n } else {\n path += pts.slice(1).map(([x, y]) => ` L${x},${y}`).join(\"\");\n }\n\n const area = fill\n ? `${path} L${pts[pts.length - 1][0]},${height - pad} L${pts[0][0]},${height - pad} Z`\n : null;\n\n return (\n <svg\n className={cn(\"ods-sparkline\", className)}\n width={width}\n height={height}\n viewBox={`0 0 ${width} ${height}`}\n role=\"img\"\n aria-label={ariaLabel}\n >\n {area && <path d={area} fill={fill} />}\n <path d={path} fill=\"none\" stroke={stroke} strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n","\"use client\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface SpinnerProps {\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\";\n color?: string;\n className?: string;\n}\n\nconst sizeMap = {\n sm: 16,\n md: 24,\n lg: 32,\n xl: 48,\n} as const;\n\nexport function Spinner({\n size = \"md\",\n color = \"var(--ods-color-brand-500)\",\n className,\n}: SpinnerProps) {\n const px = sizeMap[size];\n\n return (\n <svg\n className={cn('ods-spinner', `ods-spinner--${size}`, className)}\n width={px}\n height={px}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n role=\"status\"\n aria-label=\"Loading\"\n style={{ color }}\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeDasharray=\"31.4 31.4\"\n className={'ods-spinner__circle'}\n />\n </svg>\n );\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface StatProps {\n label: ReactNode;\n value: ReactNode;\n delta?: ReactNode;\n deltaTrend?: \"up\" | \"down\" | \"neutral\";\n deltaSuffix?: ReactNode;\n icon?: ReactNode;\n size?: \"sm\" | \"md\" | \"lg\";\n className?: string;\n}\n\nexport function Stat({\n label,\n value,\n delta,\n deltaTrend = \"up\",\n deltaSuffix,\n icon,\n size = \"md\",\n className,\n}: StatProps) {\n return (\n <div className={cn(\"ods-stat\", `ods-stat--${size}`, className)}>\n <div className=\"ods-stat__head\">\n <div className=\"ods-stat__label\">{label}</div>\n {icon && <span className=\"ods-stat__icon\" aria-hidden=\"true\">{icon}</span>}\n </div>\n <div className=\"ods-stat__value\">{value}</div>\n {delta && (\n <div className={cn(\"ods-stat__delta\", `ods-stat__delta--${deltaTrend}`)}>\n <span className=\"ods-stat__delta-arrow\" aria-hidden=\"true\">\n {deltaTrend === \"up\" && \"▲\"}\n {deltaTrend === \"down\" && \"▼\"}\n {deltaTrend === \"neutral\" && \"—\"}\n </span>\n <span className=\"ods-stat__delta-value\">{delta}</span>\n {deltaSuffix && <span className=\"ods-stat__delta-suffix\">{deltaSuffix}</span>}\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\nimport { type InputHTMLAttributes, type ReactNode, useRef } from \"react\";\nimport { useSwitch } from \"react-aria\";\nimport { useToggleState } from \"react-stately\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface SwitchProps\n extends Omit<InputHTMLAttributes<HTMLInputElement>, \"onChange\" | \"size\"> {\n checked?: boolean;\n defaultChecked?: boolean;\n onChange?: (isSelected: boolean) => void;\n disabled?: boolean;\n size?: \"sm\" | \"md\";\n label?: string | ReactNode;\n className?: string;\n}\n\nexport function Switch({\n checked,\n defaultChecked,\n onChange,\n disabled = false,\n size = \"md\",\n label,\n className,\n ...props\n}: SwitchProps) {\n const ref = useRef<HTMLInputElement>(null);\n\n const state = useToggleState({\n isSelected: checked,\n defaultSelected: defaultChecked,\n onChange,\n });\n\n const { inputProps } = useSwitch(\n {\n isSelected: state.isSelected,\n isDisabled: disabled,\n onChange,\n \"aria-label\": typeof label === \"string\" ? label : undefined,\n },\n state,\n ref,\n );\n\n const isOn = state.isSelected;\n\n return (\n <label\n className={cn(\n 'ods-switch',\n `ods-switch--${size}`,\n disabled && 'ods-switch--disabled',\n className,\n )}\n >\n <input {...inputProps} ref={ref} className={'ods-switch__input'} />\n <div\n className={cn('ods-switch__track', isOn && 'ods-switch__track--on')}\n aria-hidden=\"true\"\n >\n <div className={'ods-switch__thumb'} />\n </div>\n {label && <span className={'ods-switch__label'}>{label}</span>}\n </label>\n );\n}\n","\"use client\";\nimport { type ReactNode, useCallback, useState } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface TableColumn<T = any> {\n key: string;\n header: ReactNode;\n sortable?: boolean;\n width?: string | number;\n render?: (value: any, row: T, index: number) => ReactNode;\n}\n\nexport interface TableProps<T extends Record<string, any> = Record<string, any>> {\n columns: TableColumn<T>[];\n data: T[];\n selectable?: boolean;\n selectedRows?: Set<number>;\n onSelectionChange?: (selected: Set<number>) => void;\n expandable?: boolean;\n renderExpanded?: (row: T, index: number) => ReactNode;\n onSort?: (key: string, direction: \"asc\" | \"desc\") => void;\n sortKey?: string;\n sortDirection?: \"asc\" | \"desc\";\n loading?: boolean;\n emptyMessage?: string;\n className?: string;\n}\n\nexport function Table<T extends Record<string, any> = Record<string, any>>({\n columns,\n data,\n selectable = false,\n selectedRows,\n onSelectionChange,\n expandable = false,\n renderExpanded,\n onSort,\n sortKey,\n sortDirection,\n loading = false,\n emptyMessage = \"No data available\",\n className,\n}: TableProps<T>) {\n const _expandedRows = new Set<number>();\n // We use a state-free approach: toggling is handled via a local ref to avoid\n // re-renders for internal-only expanded state. But for simplicity we use a\n // controlled approach where the parent can manage expansion if needed.\n // For self-contained usage, we track expanded rows internally.\n\n const handleSort = useCallback(\n (key: string) => {\n if (!onSort) return;\n const col = columns.find((c) => c.key === key);\n if (!col?.sortable) return;\n const newDirection: \"asc\" | \"desc\" =\n sortKey === key && sortDirection === \"asc\" ? \"desc\" : \"asc\";\n onSort(key, newDirection);\n },\n [columns, onSort, sortKey, sortDirection],\n );\n\n const handleSelectAll = useCallback(() => {\n if (!onSelectionChange) return;\n const allSelected = selectedRows?.size === data.length;\n if (allSelected) {\n onSelectionChange(new Set());\n } else {\n onSelectionChange(new Set(data.map((_, i) => i)));\n }\n }, [data, onSelectionChange, selectedRows]);\n\n const handleSelectRow = useCallback(\n (index: number) => {\n if (!onSelectionChange || !selectedRows) return;\n const next = new Set(selectedRows);\n if (next.has(index)) {\n next.delete(index);\n } else {\n next.add(index);\n }\n onSelectionChange(next);\n },\n [onSelectionChange, selectedRows],\n );\n\n const totalCols = columns.length + (selectable ? 1 : 0) + (expandable ? 1 : 0);\n\n return (\n <div\n className={cn('ods-table-wrapper', className)}\n role=\"region\"\n aria-label=\"Data table\"\n >\n <table className={'ods-table'}>\n <thead className={'ods-table__header'}>\n <tr>\n {selectable && (\n <th className={'ods-table__cell--checkbox'} scope=\"col\">\n <input\n type=\"checkbox\"\n aria-label=\"Select all rows\"\n checked={data.length > 0 && selectedRows?.size === data.length}\n onChange={handleSelectAll}\n />\n </th>\n )}\n {expandable && (\n <th className={'ods-table__cell--expand'} scope=\"col\" aria-label=\"Expand\" />\n )}\n {columns.map((col) => (\n <th\n key={col.key}\n className={cn(\n 'ods-table__cell',\n col.sortable && 'ods-table__cell--sortable',\n )}\n style={col.width ? { width: col.width } : undefined}\n scope=\"col\"\n aria-sort={\n sortKey === col.key\n ? sortDirection === \"asc\"\n ? \"ascending\"\n : \"descending\"\n : undefined\n }\n onClick={col.sortable ? () => handleSort(col.key) : undefined}\n >\n <span className={'ods-table__header-content'}>\n {col.header}\n {col.sortable && (\n <span\n className={cn(\n 'ods-table__sort-icon',\n sortKey === col.key && 'ods-table__sort-icon--active',\n sortKey === col.key &&\n sortDirection === \"desc\" &&\n 'ods-table__sort-icon--desc',\n )}\n aria-hidden=\"true\"\n >\n ▲\n </span>\n )}\n </span>\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {loading && (\n <tr>\n <td colSpan={totalCols} className={'ods-table__loading'}>\n <div className={'ods-table__loading-bar'} />\n </td>\n </tr>\n )}\n {!loading && data.length === 0 && (\n <tr>\n <td colSpan={totalCols} className={'ods-table__empty'}>\n {emptyMessage}\n </td>\n </tr>\n )}\n {data.map((row, rowIndex) => (\n <TableRow\n key={rowIndex}\n row={row}\n rowIndex={rowIndex}\n columns={columns}\n selectable={selectable}\n selectedRows={selectedRows}\n onSelectRow={handleSelectRow}\n expandable={expandable}\n renderExpanded={renderExpanded}\n totalCols={totalCols}\n />\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\ninterface TableRowProps<T extends Record<string, any>> {\n row: T;\n rowIndex: number;\n columns: TableColumn<T>[];\n selectable: boolean;\n selectedRows?: Set<number>;\n onSelectRow: (index: number) => void;\n expandable: boolean;\n renderExpanded?: (row: T, index: number) => ReactNode;\n totalCols: number;\n}\n\nfunction TableRow<T extends Record<string, any>>({\n row,\n rowIndex,\n columns,\n selectable,\n selectedRows,\n onSelectRow,\n expandable,\n renderExpanded,\n totalCols,\n}: TableRowProps<T>) {\n const isSelected = selectedRows?.has(rowIndex) ?? false;\n const [expanded, setExpanded] = useState(false);\n\n return (\n <>\n <tr\n className={cn('ods-table__row', isSelected && 'ods-table__row--selected')}\n data-row-index={rowIndex}\n >\n {selectable && (\n <td className={'ods-table__cell--checkbox'}>\n <input\n type=\"checkbox\"\n aria-label={`Select row ${rowIndex + 1}`}\n checked={isSelected}\n onChange={() => onSelectRow(rowIndex)}\n />\n </td>\n )}\n {expandable && (\n <td className={'ods-table__cell--expand'}>\n <button\n type=\"button\"\n className={cn(\n 'ods-table__expand-btn',\n expanded && 'ods-table__expand-btn--open',\n )}\n aria-label={expanded ? \"Collapse row\" : \"Expand row\"}\n onClick={() => setExpanded(!expanded)}\n >\n ▶\n </button>\n </td>\n )}\n {columns.map((col) => (\n <td key={col.key} className={'ods-table__cell'}>\n {col.render ? col.render(row[col.key], row, rowIndex) : row[col.key]}\n </td>\n ))}\n </tr>\n {expandable && expanded && renderExpanded && (\n <tr className={'ods-table__row--expanded'}>\n <td colSpan={totalCols} className={'ods-table__expanded-cell'}>\n {renderExpanded(row, rowIndex)}\n </td>\n </tr>\n )}\n </>\n );\n}\n","\"use client\";\nimport { motion } from \"framer-motion\";\nimport { type ReactNode, useMemo, useRef, useState } from \"react\";\nimport { useTab, useTabList, useTabPanel } from \"react-aria\";\nimport { Item, type TabListStateOptions, useTabListState } from \"react-stately\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface TabItem {\n value: string;\n label: string;\n icon?: ReactNode;\n disabled?: boolean;\n children?: ReactNode;\n}\n\nexport interface TabsProps {\n items: TabItem[];\n value?: string;\n defaultValue?: string;\n onChange?: (value: string) => void;\n orientation?: \"horizontal\" | \"vertical\";\n className?: string;\n}\n\nfunction TabButton({ item, state }: { item: any; state: any }) {\n const ref = useRef<HTMLDivElement>(null);\n const { tabProps } = useTab({ key: item.key }, state, ref);\n const isSelected = state.selectedKey === item.key;\n const isDisabled = state.disabledKeys.has(item.key);\n\n // Remove motion-conflicting props\n const { onDrag, onDragStart, onDragEnd, onAnimationStart, ...safeTabProps } = tabProps as any;\n\n return (\n <motion.div\n {...safeTabProps}\n ref={ref}\n className={cn(\n 'ods-tabs__tab',\n isSelected && 'ods-tabs__tab--selected',\n isDisabled && 'ods-tabs__tab--disabled',\n )}\n >\n {item.rendered}\n {isSelected && (\n <motion.div\n className={'ods-tabs__indicator'}\n layoutId=\"ods-tabs-indicator\"\n transition={{ type: \"spring\", damping: 30, stiffness: 400 }}\n />\n )}\n </motion.div>\n );\n}\n\nfunction TabPanelContent({ state, panelContent, ...props }: any) {\n const ref = useRef<HTMLDivElement>(null);\n const { tabPanelProps } = useTabPanel(props, state, ref);\n return (\n <div {...tabPanelProps} ref={ref} className={'ods-tabs__panel'}>\n {panelContent}\n </div>\n );\n}\n\nexport function Tabs({\n items,\n value,\n defaultValue,\n onChange,\n orientation = \"horizontal\",\n className,\n}: TabsProps) {\n const [internalValue, setInternalValue] = useState(defaultValue || items[0]?.value);\n const selectedKey = value ?? internalValue;\n\n const handleSelectionChange = (key: any) => {\n const keyStr = String(key);\n if (!value) setInternalValue(keyStr);\n onChange?.(keyStr);\n };\n\n // Build a map of value -> panel content\n const panelContentMap = useMemo(() => {\n const map = new Map<string, ReactNode>();\n items.forEach((item) => {\n map.set(item.value, item.children);\n });\n return map;\n }, [items]);\n\n const stateProps: TabListStateOptions<any> = {\n children: items.map((item) => (\n <Item key={item.value} textValue={item.label}>\n {item.icon && <span className={'ods-tabs__icon'}>{item.icon}</span>}\n <span>{item.label}</span>\n </Item>\n )),\n selectedKey,\n onSelectionChange: handleSelectionChange,\n disabledKeys: items.filter((i) => i.disabled).map((i) => i.value),\n };\n\n const state = useTabListState(stateProps);\n const ref = useRef<HTMLDivElement>(null);\n const { tabListProps } = useTabList({ ...stateProps, orientation }, state, ref);\n\n const currentPanelContent = panelContentMap.get(String(selectedKey));\n\n return (\n <div className={cn('ods-tabs', `ods-tabs--${orientation}`, className)}>\n <div {...tabListProps} ref={ref} className={'ods-tabs__list'}>\n {[...state.collection].map((item) => (\n <TabButton key={item.key} item={item} state={state} />\n ))}\n </div>\n <TabPanelContent key={state.selectedKey} state={state} panelContent={currentPanelContent} />\n </div>\n );\n}\n","\"use client\";\nimport { type KeyboardEvent, type ReactNode, useState } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface TagsInputProps {\n label?: ReactNode;\n value: string[];\n onChange?: (value: string[]) => void;\n placeholder?: string;\n maxTags?: number;\n disabled?: boolean;\n error?: ReactNode;\n helperText?: ReactNode;\n size?: \"sm\" | \"md\" | \"lg\";\n validate?: (tag: string) => boolean;\n separators?: string[];\n className?: string;\n}\n\nexport function TagsInput({\n label,\n value,\n onChange,\n placeholder = \"Add tag...\",\n maxTags,\n disabled = false,\n error,\n helperText,\n size = \"md\",\n validate,\n separators = [\"Enter\", \",\"],\n className,\n}: TagsInputProps) {\n const [draft, setDraft] = useState(\"\");\n\n const addTag = (raw: string) => {\n const tag = raw.trim();\n if (!tag) return;\n if (validate && !validate(tag)) return;\n if (value.includes(tag)) {\n setDraft(\"\");\n return;\n }\n if (maxTags && value.length >= maxTags) return;\n onChange?.([...value, tag]);\n setDraft(\"\");\n };\n\n const removeTag = (i: number) => {\n onChange?.(value.filter((_, idx) => idx !== i));\n };\n\n const onKey = (e: KeyboardEvent<HTMLInputElement>) => {\n if (separators.includes(e.key)) {\n e.preventDefault();\n addTag(draft);\n } else if (e.key === \"Backspace\" && !draft && value.length) {\n removeTag(value.length - 1);\n }\n };\n\n return (\n <div\n className={cn(\n \"ods-tags\",\n `ods-tags--${size}`,\n disabled && \"ods-tags--disabled\",\n error && \"ods-tags--error\",\n className,\n )}\n >\n {label && <label className=\"ods-tags__label\">{label}</label>}\n <div className=\"ods-tags__field\">\n {value.map((tag, i) => (\n <span key={`${tag}-${i}`} className=\"ods-tags__chip\">\n <span className=\"ods-tags__chip-text\">{tag}</span>\n <button\n type=\"button\"\n className=\"ods-tags__chip-x\"\n onClick={() => removeTag(i)}\n aria-label={`Remove ${tag}`}\n disabled={disabled}\n >\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M2 2l6 6m0-6L2 8\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n </button>\n </span>\n ))}\n <input\n className=\"ods-tags__input\"\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={onKey}\n onBlur={() => draft && addTag(draft)}\n placeholder={value.length ? \"\" : placeholder}\n disabled={disabled || (maxTags ? value.length >= maxTags : false)}\n />\n </div>\n {error ? <div className=\"ods-tags__hint ods-tags__hint--error\">{error}</div>\n : helperText ? <div className=\"ods-tags__hint\">{helperText}</div>\n : null}\n </div>\n );\n}\n","\"use client\";\nimport { type TextareaHTMLAttributes, useId, useRef, useState } from \"react\";\nimport { useTextField } from \"react-aria\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface TextareaProps extends Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, \"size\"> {\n label?: string;\n error?: boolean;\n errorMessage?: string;\n resize?: boolean;\n maxLength?: number;\n size?: \"sm\" | \"md\" | \"lg\";\n rows?: number;\n}\n\nexport function Textarea({\n label,\n error = false,\n errorMessage,\n resize = true,\n maxLength,\n size = \"md\",\n rows = 3,\n disabled = false,\n className,\n defaultValue,\n value,\n onChange,\n ...props\n}: TextareaProps) {\n const ref = useRef<HTMLTextAreaElement>(null);\n const errorId = useId();\n const [charCount, setCharCount] = useState(() => String(value ?? defaultValue ?? \"\").length);\n\n const { labelProps, inputProps } = useTextField(\n {\n label: label || props[\"aria-label\"] || \"textarea\",\n isDisabled: disabled,\n errorMessage,\n validationState: error ? \"invalid\" : undefined,\n inputElementType: \"textarea\",\n value: value as string | undefined,\n defaultValue: defaultValue as string | undefined,\n },\n ref,\n );\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n setCharCount(e.target.value.length);\n onChange?.(e);\n };\n\n return (\n <div\n className={cn(\n 'ods-textarea',\n `ods-textarea--${size}`,\n error && 'ods-textarea--error',\n disabled && 'ods-textarea--disabled',\n className,\n )}\n >\n {label && (\n <label {...labelProps} className={'ods-textarea__label'}>\n {label}\n </label>\n )}\n <div className={'ods-textarea__wrapper'}>\n <textarea\n {...inputProps}\n ref={ref}\n rows={rows}\n disabled={disabled}\n maxLength={maxLength}\n defaultValue={defaultValue}\n value={value}\n onChange={handleChange}\n className={cn(\n 'ods-textarea__field',\n !resize && 'ods-textarea__field--no-resize',\n )}\n aria-invalid={error || undefined}\n aria-describedby={error && errorMessage ? errorId : undefined}\n />\n {maxLength != null && (\n <span className={'ods-textarea__count'} aria-live=\"polite\">\n {charCount}/{maxLength}\n </span>\n )}\n </div>\n {error && errorMessage && (\n <div id={errorId} className={'ods-textarea__error-message'} role=\"alert\">\n {errorMessage}\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport type TimelineStatus = \"default\" | \"success\" | \"warning\" | \"error\" | \"muted\";\n\nexport interface TimelineItem {\n id: string;\n title: ReactNode;\n description?: ReactNode;\n meta?: ReactNode;\n icon?: ReactNode;\n status?: TimelineStatus;\n}\n\nexport interface TimelineProps {\n items: TimelineItem[];\n size?: \"sm\" | \"md\";\n className?: string;\n}\n\nexport function Timeline({ items, size = \"md\", className }: TimelineProps) {\n return (\n <ol className={cn(\"ods-timeline\", `ods-timeline--${size}`, className)}>\n {items.map((item, idx) => {\n const last = idx === items.length - 1;\n const status = item.status ?? \"default\";\n return (\n <li key={item.id} className=\"ods-timeline__item\">\n <div className=\"ods-timeline__rail\">\n <span className={cn(\"ods-timeline__dot\", `ods-timeline__dot--${status}`)} aria-hidden=\"true\">\n {item.icon}\n </span>\n {!last && <span className=\"ods-timeline__line\" aria-hidden=\"true\" />}\n </div>\n <div className=\"ods-timeline__body\">\n <div className=\"ods-timeline__title\">{item.title}</div>\n {item.description && <div className=\"ods-timeline__desc\">{item.description}</div>}\n {item.meta && <div className=\"ods-timeline__meta\">{item.meta}</div>}\n </div>\n </li>\n );\n })}\n </ol>\n );\n}\n","\"use client\";\nimport {\n Fragment,\n type KeyboardEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface TimeValue {\n hours: number;\n minutes: number;\n seconds?: number;\n period?: \"AM\" | \"PM\";\n}\n\nexport interface TimePickerProps {\n label?: ReactNode;\n value: TimeValue;\n onChange?: (value: TimeValue) => void;\n use24h?: boolean;\n showSeconds?: boolean;\n minuteStep?: number;\n secondStep?: number;\n size?: \"sm\" | \"md\" | \"lg\";\n disabled?: boolean;\n error?: ReactNode;\n helperText?: ReactNode;\n className?: string;\n}\n\ntype Segment = \"hours\" | \"minutes\" | \"seconds\";\n\nconst pad = (n: number) => n.toString().padStart(2, \"0\");\n\nfunction format(v: TimeValue, use24h: boolean, showSeconds: boolean): string {\n const base = `${pad(v.hours)}:${pad(v.minutes)}${showSeconds ? `:${pad(v.seconds ?? 0)}` : \"\"}`;\n return use24h ? base : `${base} ${v.period ?? \"AM\"}`;\n}\n\nfunction clampSeg(seg: Segment, n: number, use24h: boolean): number {\n if (seg === \"hours\") {\n if (use24h) return Math.max(0, Math.min(23, n));\n return Math.max(1, Math.min(12, n));\n }\n return Math.max(0, Math.min(59, n));\n}\n\nexport function TimePicker({\n label,\n value,\n onChange,\n use24h = false,\n showSeconds = false,\n minuteStep = 1,\n secondStep = 1,\n size = \"md\",\n disabled = false,\n error,\n helperText,\n className,\n}: TimePickerProps) {\n const [open, setOpen] = useState(false);\n const [activeSeg, setActiveSeg] = useState<Segment | null>(null);\n // Keep the in-progress draft in a ref so rapid keystrokes always see the\n // latest digit (state updates are async and would otherwise drop key #2).\n const draftRef = useRef<string>(\"\");\n const wrapRef = useRef<HTMLDivElement>(null);\n const hoursRef = useRef<HTMLButtonElement>(null);\n const minutesRef = useRef<HTMLButtonElement>(null);\n const secondsRef = useRef<HTMLButtonElement>(null);\n\n const refOf = (s: Segment) =>\n s === \"hours\" ? hoursRef : s === \"minutes\" ? minutesRef : secondsRef;\n\n useEffect(() => {\n if (!open) return;\n const onDoc = (e: MouseEvent) => {\n if (!wrapRef.current?.contains(e.target as Node)) {\n setOpen(false);\n setActiveSeg(null);\n }\n };\n document.addEventListener(\"mousedown\", onDoc);\n return () => document.removeEventListener(\"mousedown\", onDoc);\n }, [open]);\n\n const commit = useCallback(\n (seg: Segment, n: number) => {\n const next: TimeValue = { ...value, [seg]: clampSeg(seg, n, use24h) };\n if (showSeconds && next.seconds === undefined) next.seconds = 0;\n onChange?.(next);\n },\n [value, use24h, onChange, showSeconds],\n );\n\n const stepBy = (seg: Segment, delta: number) => {\n const step = seg === \"hours\" ? 1 : seg === \"minutes\" ? minuteStep : secondStep;\n const cur = (seg === \"hours\" ? value.hours : seg === \"minutes\" ? value.minutes : value.seconds ?? 0);\n let next = cur + delta * step;\n if (seg === \"hours\") {\n const max = use24h ? 23 : 12;\n const min = use24h ? 0 : 1;\n if (next > max) next = min;\n if (next < min) next = max;\n } else {\n if (next >= 60) next -= 60;\n if (next < 0) next += 60;\n }\n commit(seg, next);\n };\n\n const setPeriod = (p: \"AM\" | \"PM\") => onChange?.({ ...value, period: p });\n\n const focusSegment = (seg: Segment) => {\n setActiveSeg(seg);\n draftRef.current = \"\";\n requestAnimationFrame(() => refOf(seg).current?.focus());\n };\n\n const segOrder = (): Segment[] => (showSeconds ? [\"hours\", \"minutes\", \"seconds\"] : [\"hours\", \"minutes\"]);\n\n const handleSegKey = (seg: Segment) => (e: KeyboardEvent<HTMLButtonElement>) => {\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n stepBy(seg, 1);\n } else if (e.key === \"ArrowDown\") {\n e.preventDefault();\n stepBy(seg, -1);\n } else if (e.key === \"ArrowLeft\") {\n e.preventDefault();\n const order = segOrder();\n focusSegment(order[Math.max(0, order.indexOf(seg) - 1)]);\n } else if (e.key === \"ArrowRight\" || e.key === \":\" || e.key === \" \") {\n e.preventDefault();\n const order = segOrder();\n focusSegment(order[Math.min(order.length - 1, order.indexOf(seg) + 1)]);\n } else if (/^[0-9]$/.test(e.key)) {\n e.preventDefault();\n // Two-digit logic with overflow heuristic:\n // - \"0\" alone keeps draft \"0\" so the next digit appends\n // - first digit too large to fit a 2nd one (e.g. \"5\" in 12h hours, or\n // \"6\"+ for minutes/seconds) commits and advances immediately\n const max = seg === \"hours\" ? (use24h ? 23 : 12) : 59;\n const cur = draftRef.current;\n const combined = cur + e.key;\n const combinedNum = parseInt(combined, 10);\n\n if (cur.length === 0) {\n // First key\n const n = parseInt(e.key, 10);\n if (n * 10 > max) {\n // Cannot prefix a 2nd digit — commit and jump to next segment\n commit(seg, n);\n draftRef.current = \"\";\n const order = segOrder();\n const nx = order[order.indexOf(seg) + 1];\n if (nx) focusSegment(nx);\n } else {\n draftRef.current = e.key;\n commit(seg, n);\n }\n } else {\n // Second key\n if (combinedNum <= max) {\n commit(seg, combinedNum);\n } else {\n commit(seg, parseInt(e.key, 10));\n }\n draftRef.current = \"\";\n const order = segOrder();\n const nx = order[order.indexOf(seg) + 1];\n if (nx) focusSegment(nx);\n }\n } else if (e.key === \"Backspace\") {\n e.preventDefault();\n draftRef.current = \"\";\n commit(seg, 0);\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n setActiveSeg(null);\n draftRef.current = \"\";\n }\n };\n\n const segButton = (seg: Segment, val: number) => (\n <button\n ref={refOf(seg)}\n type=\"button\"\n className={cn(\"ods-timepicker__seg\", activeSeg === seg && \"ods-timepicker__seg--active\")}\n onClick={() => focusSegment(seg)}\n onKeyDown={handleSegKey(seg)}\n onBlur={() => activeSeg === seg && setActiveSeg(null)}\n aria-label={seg}\n >\n {pad(val)}\n </button>\n );\n\n return (\n <div\n ref={wrapRef}\n className={cn(\n \"ods-timepicker\",\n `ods-timepicker--${size}`,\n disabled && \"ods-timepicker--disabled\",\n error && \"ods-timepicker--error\",\n className,\n )}\n >\n {label && <label className=\"ods-timepicker__label\">{label}</label>}\n <button\n type=\"button\"\n className=\"ods-timepicker__trigger\"\n onClick={() => !disabled && setOpen((o) => !o)}\n disabled={disabled}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"8\" cy=\"8\" r=\"6\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M8 4.5V8l2.5 1.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n <span className=\"ods-timepicker__value\">{format(value, use24h, showSeconds)}</span>\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\" className=\"ods-timepicker__chev\">\n <path d=\"M3 4.5 6 7.5 9 4.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n {open && (\n <div className=\"ods-timepicker__popover\" role=\"dialog\">\n <div className=\"ods-timepicker__head\">\n <div className=\"ods-timepicker__display\">\n {segButton(\"hours\", value.hours)}\n <span className=\"ods-timepicker__display-sep\">:</span>\n {segButton(\"minutes\", value.minutes)}\n {showSeconds && (\n <>\n <span className=\"ods-timepicker__display-sep\">:</span>\n {segButton(\"seconds\", value.seconds ?? 0)}\n </>\n )}\n </div>\n {!use24h && (\n <div className=\"ods-timepicker__period\">\n <button\n type=\"button\"\n className={cn(\"ods-timepicker__period-btn\", value.period === \"AM\" && \"ods-timepicker__period-btn--active\")}\n onClick={() => setPeriod(\"AM\")}\n >AM</button>\n <button\n type=\"button\"\n className={cn(\"ods-timepicker__period-btn\", value.period === \"PM\" && \"ods-timepicker__period-btn--active\")}\n onClick={() => setPeriod(\"PM\")}\n >PM</button>\n </div>\n )}\n </div>\n <div className=\"ods-timepicker__body\">\n {segOrder().map((seg, i, arr) => (\n <Fragment key={seg}>\n <div className=\"ods-timepicker__col\">\n <span className=\"ods-timepicker__col-lbl\">\n {seg === \"hours\" ? \"HOUR\" : seg === \"minutes\" ? \"MIN\" : \"SEC\"}\n </span>\n <button type=\"button\" className=\"ods-timepicker__step\" onClick={() => stepBy(seg, 1)} aria-label={`${seg} up`}>\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M5 11l4-4 4 4\" stroke=\"currentColor\" strokeWidth=\"1.7\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n <span className=\"ods-timepicker__col-val\">\n {pad(seg === \"hours\" ? value.hours : seg === \"minutes\" ? value.minutes : value.seconds ?? 0)}\n </span>\n <button type=\"button\" className=\"ods-timepicker__step\" onClick={() => stepBy(seg, -1)} aria-label={`${seg} down`}>\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M5 7l4 4 4-4\" stroke=\"currentColor\" strokeWidth=\"1.7\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n </div>\n {i < arr.length - 1 && <span className=\"ods-timepicker__sep\">:</span>}\n </Fragment>\n ))}\n </div>\n </div>\n )}\n {error ? <div className=\"ods-timepicker__hint ods-timepicker__hint--error\">{error}</div>\n : helperText ? <div className=\"ods-timepicker__hint\">{helperText}</div>\n : null}\n </div>\n );\n}\n","\"use client\";\nimport { type ReactNode, useEffect, useMemo, useRef, useState } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface TimezoneOption {\n /** IANA name, e.g. \"America/Los_Angeles\". */\n iana: string;\n /** Friendly label e.g. \"Pacific Time\". */\n label: string;\n /** UTC offset string e.g. \"UTC−8\" or \"UTC+5:30\". */\n offset: string;\n /** Optional country / region for filtering. */\n region?: string;\n}\n\nexport interface TimezonePickerProps {\n label?: ReactNode;\n value: string; // IANA name\n onChange?: (iana: string) => void;\n options?: TimezoneOption[];\n size?: \"sm\" | \"md\" | \"lg\";\n disabled?: boolean;\n error?: ReactNode;\n helperText?: ReactNode;\n placeholder?: string;\n className?: string;\n}\n\nconst DEFAULT_TZS: TimezoneOption[] = [\n { iana: \"America/Los_Angeles\", label: \"Pacific Time\", offset: \"UTC−8\" },\n { iana: \"America/Denver\", label: \"Mountain Time\", offset: \"UTC−7\" },\n { iana: \"America/Chicago\", label: \"Central Time\", offset: \"UTC−6\" },\n { iana: \"America/New_York\", label: \"Eastern Time\", offset: \"UTC−5\" },\n { iana: \"Europe/London\", label: \"London\", offset: \"UTC+0\" },\n { iana: \"Europe/Berlin\", label: \"Berlin\", offset: \"UTC+1\" },\n { iana: \"Europe/Athens\", label: \"Athens\", offset: \"UTC+2\" },\n { iana: \"Asia/Dubai\", label: \"Dubai\", offset: \"UTC+4\" },\n { iana: \"Asia/Kolkata\", label: \"India Standard Time\", offset: \"UTC+5:30\" },\n { iana: \"Asia/Singapore\", label: \"Singapore\", offset: \"UTC+8\" },\n { iana: \"Asia/Tokyo\", label: \"Tokyo\", offset: \"UTC+9\" },\n { iana: \"Australia/Sydney\", label: \"Sydney\", offset: \"UTC+10\" },\n];\n\nexport function TimezonePicker({\n label,\n value,\n onChange,\n options = DEFAULT_TZS,\n size = \"md\",\n disabled = false,\n error,\n helperText,\n placeholder = \"Select timezone\",\n className,\n}: TimezonePickerProps) {\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState(\"\");\n const wrapRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const selected = options.find((o) => o.iana === value);\n\n const filtered = useMemo(() => {\n if (!query.trim()) return options;\n const q = query.trim().toLowerCase();\n return options.filter(\n (o) =>\n o.iana.toLowerCase().includes(q) ||\n o.label.toLowerCase().includes(q) ||\n o.offset.toLowerCase().includes(q) ||\n o.region?.toLowerCase().includes(q),\n );\n }, [options, query]);\n\n useEffect(() => {\n if (!open) return;\n const onDoc = (e: MouseEvent) => {\n if (!wrapRef.current?.contains(e.target as Node)) {\n setOpen(false);\n setQuery(\"\");\n }\n };\n document.addEventListener(\"mousedown\", onDoc);\n return () => document.removeEventListener(\"mousedown\", onDoc);\n }, [open]);\n\n useEffect(() => {\n if (open) requestAnimationFrame(() => inputRef.current?.focus());\n }, [open]);\n\n const select = (iana: string) => {\n onChange?.(iana);\n setOpen(false);\n setQuery(\"\");\n };\n\n return (\n <div\n ref={wrapRef}\n className={cn(\"ods-tzpicker\", `ods-tzpicker--${size}`, disabled && \"ods-tzpicker--disabled\", error && \"ods-tzpicker--error\", className)}\n >\n {label && <label className=\"ods-tzpicker__label\">{label}</label>}\n <button\n type=\"button\"\n className=\"ods-tzpicker__trigger\"\n onClick={() => !disabled && setOpen((o) => !o)}\n disabled={disabled}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"8\" cy=\"8\" r=\"6\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M2 8h12M8 2c1.8 2 1.8 10 0 12M8 2c-1.8 2-1.8 10 0 12\" stroke=\"currentColor\" strokeWidth=\"1.3\" strokeLinecap=\"round\" />\n </svg>\n <span className=\"ods-tzpicker__info\">\n {selected ? (\n <>\n <span className=\"ods-tzpicker__name\">{selected.label}</span>\n <span className=\"ods-tzpicker__meta\">\n {selected.iana.split(\"/\").pop()?.replace(/_/g, \" \")} · {selected.offset}\n </span>\n </>\n ) : (\n <span className=\"ods-tzpicker__name ods-tzpicker__name--placeholder\">{placeholder}</span>\n )}\n </span>\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\" className=\"ods-tzpicker__chev\">\n <path d=\"M3 4.5 6 7.5 9 4.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n {open && (\n <div className=\"ods-tzpicker__popover\">\n <div className=\"ods-tzpicker__search\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"6\" cy=\"6\" r=\"4.5\" stroke=\"currentColor\" strokeWidth=\"1.4\" />\n <path d=\"m12 12-2.5-2.5\" stroke=\"currentColor\" strokeWidth=\"1.4\" strokeLinecap=\"round\" />\n </svg>\n <input\n ref={inputRef}\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder=\"Search timezone or city…\"\n aria-label=\"Search timezones\"\n />\n </div>\n <ul className=\"ods-tzpicker__list\" role=\"listbox\">\n {filtered.length === 0 && <li className=\"ods-tzpicker__empty\">No timezones found</li>}\n {filtered.map((opt) => (\n <li key={opt.iana}>\n <button\n type=\"button\"\n role=\"option\"\n aria-selected={opt.iana === value}\n className={cn(\"ods-tzpicker__opt\", opt.iana === value && \"ods-tzpicker__opt--selected\")}\n onClick={() => select(opt.iana)}\n >\n <span className=\"ods-tzpicker__opt-text\">\n <span className=\"ods-tzpicker__opt-name\">{opt.label}</span>\n <span className=\"ods-tzpicker__opt-iana\">{opt.iana}</span>\n </span>\n <span className=\"ods-tzpicker__opt-off\">{opt.offset}</span>\n {opt.iana === value && (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\" className=\"ods-tzpicker__opt-check\">\n <path d=\"m3 7.5 3 3 5-6\" stroke=\"currentColor\" strokeWidth=\"1.7\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n )}\n </button>\n </li>\n ))}\n </ul>\n </div>\n )}\n {error ? <div className=\"ods-tzpicker__hint ods-tzpicker__hint--error\">{error}</div>\n : helperText ? <div className=\"ods-tzpicker__hint\">{helperText}</div>\n : null}\n </div>\n );\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface ToggleOption<T extends string = string> {\n value: T;\n label: ReactNode;\n icon?: ReactNode;\n disabled?: boolean;\n}\n\nexport interface ToggleProps<T extends string = string> {\n options: ToggleOption<T>[];\n value: T;\n onChange?: (value: T) => void;\n size?: \"sm\" | \"md\" | \"lg\";\n fullWidth?: boolean;\n className?: string;\n \"aria-label\"?: string;\n}\n\nexport function Toggle<T extends string = string>({\n options,\n value,\n onChange,\n size = \"md\",\n fullWidth = false,\n className,\n ...props\n}: ToggleProps<T>) {\n return (\n <div\n role=\"radiogroup\"\n aria-label={props[\"aria-label\"]}\n className={cn(\n \"ods-toggle\",\n `ods-toggle--${size}`,\n fullWidth && \"ods-toggle--full\",\n className,\n )}\n >\n {options.map((opt) => {\n const active = opt.value === value;\n return (\n <button\n key={opt.value}\n type=\"button\"\n role=\"radio\"\n aria-checked={active}\n disabled={opt.disabled}\n onClick={() => onChange?.(opt.value)}\n className={cn(\n \"ods-toggle__opt\",\n active && \"ods-toggle__opt--active\",\n )}\n >\n {opt.icon && <span className=\"ods-toggle__icon\" aria-hidden=\"true\">{opt.icon}</span>}\n <span className=\"ods-toggle__label\">{opt.label}</span>\n </button>\n );\n })}\n </div>\n );\n}\n","\"use client\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport {\n createContext,\n type ReactNode,\n useCallback,\n useContext,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"../../utils/cn\";\n\n// ─────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────\nexport type ToastVariant = \"success\" | \"error\" | \"warning\" | \"info\";\nexport type ToastPosition =\n | \"top-left\" | \"top-center\" | \"top-right\"\n | \"bottom-left\" | \"bottom-center\" | \"bottom-right\";\n\nexport interface ToastOptions {\n variant?: ToastVariant;\n /** Shorthand — shown as the title. */\n message?: ReactNode;\n title?: ReactNode;\n description?: ReactNode;\n icon?: ReactNode;\n action?: ReactNode;\n /** Completely replaces the default body. */\n render?: (props: { id: string; dismiss: () => void }) => ReactNode;\n duration?: number;\n closeable?: boolean;\n position?: ToastPosition;\n}\n\ninterface ToastItem extends Omit<ToastOptions, \"duration\" | \"closeable\" | \"variant\" | \"position\"> {\n id: string;\n variant: ToastVariant;\n duration: number;\n closeable: boolean;\n position: ToastPosition;\n}\n\ninterface ToastContextValue {\n toast: (options: ToastOptions) => string;\n dismiss: (id: string) => void;\n dismissAll: (position?: ToastPosition) => void;\n}\n\n// ─────────────────────────────────────────────\n// Default icons\n// ─────────────────────────────────────────────\nconst defaultIcons: Record<ToastVariant, ReactNode> = {\n success: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <circle cx=\"10\" cy=\"10\" r=\"8\" fill=\"#22c55e\" fillOpacity=\"0.15\" />\n <path d=\"m6.5 10 2.5 2.5L14 7.5\" stroke=\"#16a34a\" strokeWidth=\"1.7\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n ),\n error: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <circle cx=\"10\" cy=\"10\" r=\"8\" fill=\"#ef4444\" fillOpacity=\"0.15\" />\n <path d=\"M7 7l6 6M13 7l-6 6\" stroke=\"#dc2626\" strokeWidth=\"1.7\" strokeLinecap=\"round\" />\n </svg>\n ),\n warning: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <circle cx=\"10\" cy=\"10\" r=\"8\" fill=\"#f59e0b\" fillOpacity=\"0.15\" />\n <path d=\"M10 6v5M10 13.5v.5\" stroke=\"#d97706\" strokeWidth=\"1.7\" strokeLinecap=\"round\" />\n </svg>\n ),\n info: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <circle cx=\"10\" cy=\"10\" r=\"8\" fill=\"#6c5ce7\" fillOpacity=\"0.15\" />\n <path d=\"M10 9v5M10 6v0.5\" stroke=\"#5b4bd1\" strokeWidth=\"1.7\" strokeLinecap=\"round\" />\n </svg>\n ),\n};\n\nconst ToastContext = createContext<ToastContextValue | null>(null);\n\n// ─────────────────────────────────────────────\n// Toast body\n// ─────────────────────────────────────────────\nfunction ToastBody({ item, onDismiss }: { item: ToastItem; onDismiss: (id: string) => void }) {\n const dismiss = () => onDismiss(item.id);\n\n if (item.render) return <>{item.render({ id: item.id, dismiss })}</>;\n\n const title = item.title ?? item.message;\n return (\n <>\n <span className=\"ods-toast__icon\" aria-hidden=\"true\">\n {item.icon ?? defaultIcons[item.variant]}\n </span>\n <div className=\"ods-toast__body\">\n {title && <div className=\"ods-toast__title\">{title}</div>}\n {item.description && <div className=\"ods-toast__desc\">{item.description}</div>}\n </div>\n {item.action && <div className=\"ods-toast__action\">{item.action}</div>}\n {item.closeable && (\n <button\n type=\"button\"\n className=\"ods-toast__close\"\n aria-label=\"Dismiss\"\n onClick={(e) => { e.stopPropagation(); dismiss(); }}\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M3 3l8 8M11 3l-8 8\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n </button>\n )}\n </>\n );\n}\n\n// ─────────────────────────────────────────────\n// Stack per-position (handles stacking, hover expand, click pin)\n// ─────────────────────────────────────────────\ninterface StackProps {\n items: ToastItem[];\n position: ToastPosition;\n onDismiss: (id: string) => void;\n maxStack: number;\n}\n\nfunction PositionStack({ items, position, onDismiss, maxStack }: StackProps) {\n const [hovered, setHovered] = useState(false);\n const [pinned, setPinned] = useState(false);\n const expanded = hovered || pinned;\n\n // Display order: newest first (index 0 = newest)\n const ordered = useMemo(() => [...items].reverse(), [items]);\n const isBottom = position.startsWith(\"bottom\");\n const dir = isBottom ? -1 : 1;\n\n // Reset pinned state when the last toast dismisses\n if (pinned && items.length === 0) setPinned(false);\n\n // Per-index stacked transform (only used when collapsed)\n const stackedStyle = (idx: number) => {\n if (expanded) return { y: 0, scale: 1, opacity: 1 };\n if (idx === 0) return { y: 0, scale: 1, opacity: 1 };\n if (idx < maxStack) {\n return {\n y: idx * 10 * dir,\n scale: 1 - idx * 0.05,\n opacity: 1 - idx * 0.22,\n };\n }\n // Hidden beyond the stack depth\n return { y: maxStack * 10 * dir, scale: 1 - maxStack * 0.05, opacity: 0 };\n };\n\n return (\n <div\n className={cn(\n \"ods-toast-stack\",\n `ods-toast-stack--${position}`,\n expanded && \"ods-toast-stack--expanded\",\n pinned && \"ods-toast-stack--pinned\",\n )}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n aria-live=\"polite\"\n >\n <div\n className={cn(\"ods-toast-stack__scroll\", expanded && \"ods-toast-stack__scroll--expanded\")}\n style={expanded ? { flexDirection: isBottom ? \"column-reverse\" : \"column\" } : undefined}\n onClick={(e) => {\n // Only handle clicks on the container itself (not on a toast or its buttons).\n if (e.target === e.currentTarget && items.length > 1) {\n setPinned((p) => !p);\n }\n }}\n >\n <AnimatePresence mode=\"popLayout\">\n {ordered.map((item, idx) => {\n const s = stackedStyle(idx);\n return (\n <motion.div\n key={item.id}\n layout\n className={cn(\n \"ods-toast\",\n `ods-toast--${item.variant}`,\n !expanded && \"ods-toast--stacked\",\n )}\n style={{\n zIndex: ordered.length - idx,\n transformOrigin: isBottom ? \"bottom center\" : \"top center\",\n }}\n initial={{ opacity: 0, y: 24 * -dir, scale: 0.96 }}\n animate={{ opacity: s.opacity, y: s.y, scale: s.scale }}\n exit={{ opacity: 0, y: 10 * -dir, scale: 0.96 }}\n transition={{ type: \"tween\", duration: 0.28, ease: [0.32, 0.72, 0, 1] }}\n onClick={(e) => {\n // Click on the newest toast (or anywhere on a stacked toast) toggles pin\n if (!expanded && items.length > 1) {\n e.stopPropagation();\n setPinned(true);\n }\n }}\n >\n <ToastBody item={item} onDismiss={onDismiss} />\n </motion.div>\n );\n })}\n </AnimatePresence>\n </div>\n {expanded && items.length > 1 && pinned && (\n <button\n type=\"button\"\n className=\"ods-toast-stack__collapse\"\n onClick={() => setPinned(false)}\n aria-label=\"Collapse toasts\"\n >\n Collapse\n </button>\n )}\n </div>\n );\n}\n\n// ─────────────────────────────────────────────\n// Provider\n// ─────────────────────────────────────────────\nexport interface ToastProviderProps {\n children: ReactNode;\n defaultPosition?: ToastPosition;\n /** How many toasts to show \"peeking\" when collapsed. Default 3. */\n maxStack?: number;\n}\n\nconst POSITIONS: ToastPosition[] = [\n \"top-left\", \"top-center\", \"top-right\",\n \"bottom-left\", \"bottom-center\", \"bottom-right\",\n];\n\nexport function ToastProvider({\n children,\n defaultPosition = \"bottom-right\",\n maxStack = 3,\n}: ToastProviderProps) {\n const [toasts, setToasts] = useState<ToastItem[]>([]);\n const timers = useRef<Map<string, ReturnType<typeof setTimeout>>>(new Map());\n const idCounter = useRef(0);\n\n const dismiss = useCallback((id: string) => {\n setToasts((prev) => prev.filter((t) => t.id !== id));\n const timer = timers.current.get(id);\n if (timer) {\n clearTimeout(timer);\n timers.current.delete(id);\n }\n }, []);\n\n const dismissAll = useCallback((position?: ToastPosition) => {\n setToasts((prev) => {\n const remaining = position ? prev.filter((t) => t.position !== position) : [];\n for (const t of prev) {\n if (!remaining.find((r) => r.id === t.id)) {\n const timer = timers.current.get(t.id);\n if (timer) { clearTimeout(timer); timers.current.delete(t.id); }\n }\n }\n return remaining;\n });\n }, []);\n\n const toast = useCallback(\n (options: ToastOptions): string => {\n const id = `toast-${++idCounter.current}`;\n const item: ToastItem = {\n id,\n variant: options.variant ?? \"info\",\n message: options.message,\n title: options.title,\n description: options.description,\n icon: options.icon,\n action: options.action,\n render: options.render,\n duration: options.duration ?? 5000,\n closeable: options.closeable ?? true,\n position: options.position ?? defaultPosition,\n };\n setToasts((prev) => [...prev, item]);\n if (item.duration > 0) {\n const timer = setTimeout(() => dismiss(id), item.duration);\n timers.current.set(id, timer);\n }\n return id;\n },\n [dismiss, defaultPosition],\n );\n\n const groups = useMemo(() => {\n const out: Record<ToastPosition, ToastItem[]> = {\n \"top-left\": [], \"top-center\": [], \"top-right\": [],\n \"bottom-left\": [], \"bottom-center\": [], \"bottom-right\": [],\n };\n for (const t of toasts) out[t.position].push(t);\n return out;\n }, [toasts]);\n\n const ctx: ToastContextValue = { toast, dismiss, dismissAll };\n\n const containers = (\n <>\n {POSITIONS.map((pos) => {\n const list = groups[pos];\n if (list.length === 0) return null;\n return (\n <PositionStack\n key={pos}\n items={list}\n position={pos}\n maxStack={maxStack}\n onDismiss={dismiss}\n />\n );\n })}\n </>\n );\n\n return (\n <ToastContext.Provider value={ctx}>\n {children}\n {typeof document !== \"undefined\" && createPortal(containers, document.body)}\n </ToastContext.Provider>\n );\n}\n\n// ─────────────────────────────────────────────\n// Hook\n// ─────────────────────────────────────────────\nexport function useToast() {\n const ctx = useContext(ToastContext);\n if (!ctx) throw new Error(\"useToast must be used within a ToastProvider\");\n const { toast: raw, dismiss, dismissAll } = ctx;\n\n const toast = Object.assign((options: ToastOptions) => raw(options), {\n success: (message: ReactNode, opts: Omit<ToastOptions, \"variant\" | \"message\"> = {}) =>\n raw({ ...opts, variant: \"success\", message }),\n error: (message: ReactNode, opts: Omit<ToastOptions, \"variant\" | \"message\"> = {}) =>\n raw({ ...opts, variant: \"error\", message }),\n warning: (message: ReactNode, opts: Omit<ToastOptions, \"variant\" | \"message\"> = {}) =>\n raw({ ...opts, variant: \"warning\", message }),\n info: (message: ReactNode, opts: Omit<ToastOptions, \"variant\" | \"message\"> = {}) =>\n raw({ ...opts, variant: \"info\", message }),\n custom: (\n render: NonNullable<ToastOptions[\"render\"]>,\n opts: Omit<ToastOptions, \"render\"> = {},\n ) => raw({ ...opts, render }),\n });\n\n return { toast, dismiss, dismissAll };\n}\n","\"use client\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport { cloneElement, type ReactElement, type ReactNode, useCallback, useEffect, useLayoutEffect, useRef, useState } from \"react\";\nimport { useTooltip, useTooltipTrigger } from \"react-aria\";\nimport { createPortal } from \"react-dom\";\nimport { useTooltipTriggerState } from \"react-stately\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface TooltipProps {\n content: ReactNode;\n position?: \"top\" | \"bottom\" | \"left\" | \"right\";\n delay?: number;\n offset?: number;\n children: ReactElement;\n className?: string;\n}\n\ninterface Coords {\n top: number;\n left: number;\n}\n\nfunction computePosition(rect: DOMRect, tipRect: DOMRect, position: NonNullable<TooltipProps[\"position\"]>, offset: number): Coords {\n const cx = rect.left + rect.width / 2;\n const cy = rect.top + rect.height / 2;\n switch (position) {\n case \"top\":\n return { top: rect.top - tipRect.height - offset, left: cx - tipRect.width / 2 };\n case \"bottom\":\n return { top: rect.bottom + offset, left: cx - tipRect.width / 2 };\n case \"left\":\n return { top: cy - tipRect.height / 2, left: rect.left - tipRect.width - offset };\n case \"right\":\n return { top: cy - tipRect.height / 2, left: rect.right + offset };\n }\n}\n\nconst animVariants: Record<NonNullable<TooltipProps[\"position\"]>, { initial: any; animate: any }> = {\n top: { initial: { opacity: 0, y: 4 }, animate: { opacity: 1, y: 0 } },\n bottom: { initial: { opacity: 0, y: -4 }, animate: { opacity: 1, y: 0 } },\n left: { initial: { opacity: 0, x: 4 }, animate: { opacity: 1, x: 0 } },\n right: { initial: { opacity: 0, x: -4 }, animate: { opacity: 1, x: 0 } },\n};\n\nfunction TooltipContent({\n state,\n content,\n position = \"top\",\n triggerRef,\n className,\n offset,\n}: {\n state: ReturnType<typeof useTooltipTriggerState>;\n content: ReactNode;\n position: NonNullable<TooltipProps[\"position\"]>;\n triggerRef: React.RefObject<HTMLElement | null>;\n className?: string;\n offset: number;\n}) {\n const { tooltipProps } = useTooltip({ isOpen: state.isOpen }, state);\n const tipRef = useRef<HTMLDivElement | null>(null);\n const [coords, setCoords] = useState<Coords | null>(null);\n\n const reposition = useCallback(() => {\n if (!triggerRef.current || !tipRef.current) return;\n const trigRect = triggerRef.current.getBoundingClientRect();\n const tipRect = tipRef.current.getBoundingClientRect();\n setCoords(computePosition(trigRect, tipRect, position, offset));\n }, [triggerRef, position, offset]);\n\n // Initial mount has zero size — re-measure next frame for accurate placement.\n useLayoutEffect(() => {\n if (!state.isOpen) return;\n reposition();\n const id = requestAnimationFrame(reposition);\n return () => cancelAnimationFrame(id);\n }, [state.isOpen, reposition]);\n\n useEffect(() => {\n if (!state.isOpen) return;\n const handler = () => reposition();\n window.addEventListener(\"scroll\", handler, true);\n window.addEventListener(\"resize\", handler);\n return () => {\n window.removeEventListener(\"scroll\", handler, true);\n window.removeEventListener(\"resize\", handler);\n };\n }, [state.isOpen, reposition]);\n\n const variants = animVariants[position];\n const { onDrag, onDragStart, onDragEnd, onAnimationStart, ...safeTipProps } = tooltipProps as any;\n\n const portalContent = (\n <AnimatePresence>\n {state.isOpen && (\n // Outer wrapper owns positioning. No transform.\n <div\n className=\"ods-tooltip__wrapper\"\n style={{\n position: \"fixed\",\n zIndex: 1500,\n top: coords?.top ?? -9999,\n left: coords?.left ?? -9999,\n visibility: coords ? \"visible\" : \"hidden\",\n pointerEvents: \"none\",\n }}\n >\n {/* Inner motion div owns the entrance animation. */}\n <motion.div\n ref={tipRef}\n {...safeTipProps}\n role=\"tooltip\"\n data-position={position}\n className={cn(\"ods-tooltip\", className)}\n initial={variants.initial}\n animate={variants.animate}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.15, ease: \"easeOut\" }}\n >\n {content}\n <span className=\"ods-tooltip__arrow\" aria-hidden=\"true\" />\n </motion.div>\n </div>\n )}\n </AnimatePresence>\n );\n\n if (typeof document === \"undefined\") return null;\n return createPortal(portalContent, document.body);\n}\n\nexport function Tooltip({\n content,\n position = \"top\",\n delay = 200,\n offset = 8,\n children,\n className,\n}: TooltipProps) {\n const triggerRef = useRef<HTMLElement>(null);\n const state = useTooltipTriggerState({ delay });\n const { triggerProps } = useTooltipTrigger({ delay }, state, triggerRef);\n\n return (\n <>\n {cloneElement(children, {\n ...triggerProps,\n ref: triggerRef,\n } as any)}\n <TooltipContent\n state={state}\n content={content}\n position={position}\n triggerRef={triggerRef}\n offset={offset}\n className={className}\n />\n </>\n );\n}\n","\"use client\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface TopBarBreadcrumb {\n label: string;\n href?: string;\n}\n\nexport interface TopBarProps extends Omit<HTMLAttributes<HTMLElement>, \"title\"> {\n title?: string;\n breadcrumbs?: TopBarBreadcrumb[];\n actions?: ReactNode;\n searchPlaceholder?: string;\n onSearch?: (value: string) => void;\n children?: ReactNode;\n className?: string;\n}\n\nexport function TopBar({\n title,\n breadcrumbs,\n actions,\n searchPlaceholder = \"Search...\",\n onSearch,\n children,\n className,\n ...props\n}: TopBarProps) {\n return (\n <header {...props} className={cn('ods-topbar', className)}>\n <div className={'ods-topbar__left'}>\n {breadcrumbs && breadcrumbs.length > 0 && (\n <nav className={'ods-topbar__breadcrumbs'} aria-label=\"Breadcrumb\">\n <ol>\n {breadcrumbs.map((crumb, idx) => (\n <li key={idx} className={'ods-topbar__crumb'}>\n {idx > 0 && (\n <span className={'ods-topbar__separator'} aria-hidden=\"true\">\n /\n </span>\n )}\n {crumb.href ? (\n <a href={crumb.href}>{crumb.label}</a>\n ) : (\n <span aria-current={idx === breadcrumbs.length - 1 ? \"page\" : undefined}>\n {crumb.label}\n </span>\n )}\n </li>\n ))}\n </ol>\n </nav>\n )}\n {title && <h1 className={'ods-topbar__title'}>{title}</h1>}\n </div>\n\n {children && <div className={'ods-topbar__center'}>{children}</div>}\n\n <div className={'ods-topbar__right'}>\n {onSearch && (\n <div className={'ods-topbar__search'}>\n <svg\n className={'ods-topbar__search-icon'}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M8 4a4 4 0 100 8 4 4 0 000-8zM2 8a6 6 0 1110.89 3.476l4.817 4.817a1 1 0 01-1.414 1.414l-4.816-4.816A6 6 0 012 8z\"\n clipRule=\"evenodd\"\n />\n </svg>\n <input\n type=\"search\"\n placeholder={searchPlaceholder}\n onChange={(e) => onSearch(e.target.value)}\n className={'ods-topbar__search-input'}\n aria-label={searchPlaceholder}\n />\n </div>\n )}\n {actions && <div className={'ods-topbar__actions'}>{actions}</div>}\n </div>\n </header>\n );\n}\n","import type { DeepPartial, OdsConfig } from \"@octaviaflow/config\";\nimport { generateCssVars, resolveConfig } from \"@octaviaflow/config\";\nimport { createContext, type ReactNode, useContext, useEffect, useMemo } from \"react\";\nimport { OverlayProvider } from \"react-aria\";\nimport { odsMotion } from \"../utils/motion\";\n\ntype OdsContextValue = {\n config: OdsConfig;\n};\n\nconst OdsContext = createContext<OdsContextValue | null>(null);\n\ntype OdsProviderProps = {\n config?: DeepPartial<OdsConfig>;\n children: ReactNode;\n};\n\nexport function OdsProvider({ config: userConfig, children }: OdsProviderProps) {\n const resolved = useMemo(() => resolveConfig(userConfig), [userConfig]);\n\n useEffect(() => {\n const cssVarsBlock = generateCssVars(resolved);\n // Extract individual declarations from the :root { ... } block\n const match = cssVarsBlock.match(/:root\\s*\\{([\\s\\S]*)\\}/);\n if (match) {\n const declarations = match[1].trim().split(\"\\n\");\n for (const decl of declarations) {\n const trimmed = decl.trim().replace(/;$/, \"\");\n const colonIndex = trimmed.indexOf(\":\");\n if (colonIndex > -1) {\n const prop = trimmed.slice(0, colonIndex).trim();\n const value = trimmed.slice(colonIndex + 1).trim();\n document.documentElement.style.setProperty(prop, value);\n }\n }\n }\n }, [resolved]);\n\n const contextValue = useMemo(() => ({ config: resolved }), [resolved]);\n\n return (\n <OdsContext.Provider value={contextValue}>\n <OverlayProvider>{children}</OverlayProvider>\n </OdsContext.Provider>\n );\n}\n\nexport function useOds(): OdsConfig {\n const ctx = useContext(OdsContext);\n if (!ctx) {\n throw new Error(\"useOds must be used within an OdsProvider\");\n }\n return ctx.config;\n}\n\ntype MotionPreset = Record<string, unknown>;\ntype MotionPresets = Record<string, MotionPreset>;\n\nconst emptyMotion: MotionPresets = {\n fadeIn: {},\n scaleIn: {},\n slideRight: {},\n slideUp: {},\n tap: {},\n hover: {},\n};\n\nexport function useOdsMotion(): MotionPresets {\n const config = useOds();\n\n return useMemo(() => {\n if (!config.motion.enabled) {\n return emptyMotion;\n }\n\n if (config.motion.reducedMotion === \"always\") {\n return emptyMotion;\n }\n\n if (\n config.motion.reducedMotion === \"respect\" &&\n typeof window !== \"undefined\" &&\n window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches\n ) {\n return emptyMotion;\n }\n\n return odsMotion as unknown as MotionPresets;\n }, [config.motion.enabled, config.motion.reducedMotion]);\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface PageHeaderBreadcrumb {\n label: ReactNode;\n href?: string;\n onClick?: () => void;\n}\n\nexport interface PageHeaderProps {\n title: ReactNode;\n description?: ReactNode;\n breadcrumbs?: PageHeaderBreadcrumb[];\n actions?: ReactNode;\n meta?: ReactNode;\n className?: string;\n}\n\nexport function PageHeader({\n title,\n description,\n breadcrumbs,\n actions,\n meta,\n className,\n}: PageHeaderProps) {\n return (\n <header className={cn(\"ods-page-header\", className)}>\n <div className=\"ods-page-header__main\">\n {breadcrumbs && breadcrumbs.length > 0 && (\n <nav className=\"ods-page-header__crumbs\" aria-label=\"Breadcrumb\">\n {breadcrumbs.map((c, i) => (\n <span key={i} className=\"ods-page-header__crumb\">\n {c.href ? (\n <a href={c.href} onClick={c.onClick}>{c.label}</a>\n ) : c.onClick ? (\n <button type=\"button\" onClick={c.onClick}>{c.label}</button>\n ) : (\n <span>{c.label}</span>\n )}\n {i < breadcrumbs.length - 1 && (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"m4.5 3 3 3-3 3\" stroke=\"currentColor\" strokeWidth=\"1.4\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n )}\n </span>\n ))}\n </nav>\n )}\n <h1 className=\"ods-page-header__title\">{title}</h1>\n {description && <p className=\"ods-page-header__description\">{description}</p>}\n {meta && <div className=\"ods-page-header__meta\">{meta}</div>}\n </div>\n {actions && <div className=\"ods-page-header__actions\">{actions}</div>}\n </header>\n );\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface PricingCardProps {\n name: ReactNode;\n description?: ReactNode;\n price: ReactNode;\n pricePeriod?: ReactNode;\n features: ReactNode[];\n badge?: ReactNode;\n highlighted?: boolean;\n cta?: ReactNode;\n className?: string;\n}\n\nexport function PricingCard({\n name, description, price, pricePeriod = \"/month\",\n features, badge, highlighted = false, cta, className,\n}: PricingCardProps) {\n return (\n <div className={cn(\"ods-pricing\", highlighted && \"ods-pricing--highlighted\", className)}>\n <div className=\"ods-pricing__head\">\n {badge && <span className=\"ods-pricing__badge\">{badge}</span>}\n <h3 className=\"ods-pricing__name\">{name}</h3>\n {description && <p className=\"ods-pricing__desc\">{description}</p>}\n </div>\n <div className=\"ods-pricing__price\">\n <span className=\"ods-pricing__amount\">{price}</span>\n {pricePeriod && <span className=\"ods-pricing__period\">{pricePeriod}</span>}\n </div>\n <hr className=\"ods-pricing__sep\" />\n <ul className=\"ods-pricing__features\">\n {features.map((f, i) => (\n <li key={i} className=\"ods-pricing__feature\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"m3 8.5 3 3 7-7\" stroke=\"#16a34a\" strokeWidth=\"1.7\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n <span>{f}</span>\n </li>\n ))}\n </ul>\n {cta && <div className=\"ods-pricing__cta\">{cta}</div>}\n </div>\n );\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface ProductCardProps {\n image?: ReactNode;\n tag?: ReactNode;\n name: ReactNode;\n description?: ReactNode;\n price: ReactNode;\n originalPrice?: ReactNode;\n action?: ReactNode;\n className?: string;\n}\n\nexport function ProductCard({ image, tag, name, description, price, originalPrice, action, className }: ProductCardProps) {\n return (\n <div className={cn(\"ods-product-card\", className)}>\n <div className=\"ods-product-card__image\">{image}</div>\n {tag && <span className=\"ods-product-card__tag\">{tag}</span>}\n <div className=\"ods-product-card__name\">{name}</div>\n {description && <div className=\"ods-product-card__desc\">{description}</div>}\n <div className=\"ods-product-card__footer\">\n <div className=\"ods-product-card__price-group\">\n <span className=\"ods-product-card__price\">{price}</span>\n {originalPrice && <span className=\"ods-product-card__strike\">{originalPrice}</span>}\n </div>\n {action && <div className=\"ods-product-card__action\">{action}</div>}\n </div>\n </div>\n );\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface ProgressRingProps {\n value: number; // 0–100\n max?: number;\n size?: number; // px diameter\n strokeWidth?: number;\n variant?: \"primary\" | \"success\" | \"warning\" | \"error\" | \"neutral\";\n trackColor?: string;\n fillColor?: string;\n label?: ReactNode; // override default centered \"{value}%\" label\n showValue?: boolean;\n indeterminate?: boolean;\n className?: string;\n}\n\nconst VARIANT_COLORS: Record<NonNullable<ProgressRingProps[\"variant\"]>, string> = {\n primary: \"#6c5ce7\",\n success: \"#16a34a\",\n warning: \"#d97706\",\n error: \"#dc2626\",\n neutral: \"#6b7280\",\n};\n\nexport function ProgressRing({\n value,\n max = 100,\n size = 120,\n strokeWidth = 10,\n variant = \"primary\",\n trackColor = \"#f3f1ff\",\n fillColor,\n label,\n showValue = true,\n indeterminate = false,\n className,\n}: ProgressRingProps) {\n const r = (size - strokeWidth) / 2;\n const c = 2 * Math.PI * r;\n const pct = Math.max(0, Math.min(1, value / max));\n const dashOffset = c * (1 - pct);\n const stroke = fillColor ?? VARIANT_COLORS[variant];\n\n return (\n <div\n className={cn(\"ods-progress-ring\", indeterminate && \"ods-progress-ring--indeterminate\", className)}\n style={{ width: size, height: size }}\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={max}\n aria-valuenow={indeterminate ? undefined : value}\n >\n <svg className=\"ods-progress-ring__svg\" width={size} height={size}>\n <circle\n className=\"ods-progress-ring__track\"\n cx={size / 2}\n cy={size / 2}\n r={r}\n fill=\"none\"\n stroke={trackColor}\n strokeWidth={strokeWidth}\n />\n <circle\n className=\"ods-progress-ring__fill\"\n cx={size / 2}\n cy={size / 2}\n r={r}\n fill=\"none\"\n stroke={stroke}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeDasharray={c}\n strokeDashoffset={indeterminate ? c * 0.75 : dashOffset}\n transform={`rotate(-90 ${size / 2} ${size / 2})`}\n />\n </svg>\n {!indeterminate && (label || showValue) && (\n <div className=\"ods-progress-ring__center\">\n {label ?? <span className=\"ods-progress-ring__value\">{Math.round(pct * 100)}%</span>}\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface SettingsRowProps {\n title: ReactNode;\n description?: ReactNode;\n icon?: ReactNode;\n control?: ReactNode;\n align?: \"center\" | \"start\";\n className?: string;\n}\n\nexport function SettingsRow({\n title,\n description,\n icon,\n control,\n align = \"center\",\n className,\n}: SettingsRowProps) {\n return (\n <div className={cn(\"ods-settings-row\", `ods-settings-row--${align}`, className)}>\n {icon && <span className=\"ods-settings-row__icon\" aria-hidden=\"true\">{icon}</span>}\n <div className=\"ods-settings-row__body\">\n <div className=\"ods-settings-row__title\">{title}</div>\n {description && <div className=\"ods-settings-row__desc\">{description}</div>}\n </div>\n {control && <div className=\"ods-settings-row__control\">{control}</div>}\n </div>\n );\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface TestimonialCardProps {\n quote: ReactNode;\n author: ReactNode;\n role?: ReactNode;\n avatar?: ReactNode;\n initial?: ReactNode;\n rating?: number;\n className?: string;\n}\n\nexport function TestimonialCard({ quote, author, role, avatar, initial, rating, className }: TestimonialCardProps) {\n return (\n <figure className={cn(\"ods-testimonial\", className)}>\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\" className=\"ods-testimonial__quote\" aria-hidden=\"true\">\n <path d=\"M9 20H6c-1 0-1.5-.5-1.5-1.5v-3C4.5 11 7 8 11 8v3c-2 0-3 1.5-3 3v1h1v5zm14 0h-3c-1 0-1.5-.5-1.5-1.5v-3C18.5 11 21 8 25 8v3c-2 0-3 1.5-3 3v1h1v5z\" fill=\"currentColor\" />\n </svg>\n <blockquote className=\"ods-testimonial__text\">{quote}</blockquote>\n {typeof rating === \"number\" && (\n <div className=\"ods-testimonial__rating\" aria-label={`${rating} out of 5 stars`}>\n {Array.from({ length: 5 }).map((_, i) => (\n <span key={i} className={cn(\"ods-testimonial__star\", i < rating && \"ods-testimonial__star--on\")}>★</span>\n ))}\n </div>\n )}\n <figcaption className=\"ods-testimonial__author\">\n <span className=\"ods-testimonial__avatar\">\n {avatar ?? <span>{initial ?? (typeof author === \"string\" ? author.charAt(0).toUpperCase() : \"?\")}</span>}\n </span>\n <span className=\"ods-testimonial__author-info\">\n <span className=\"ods-testimonial__author-name\">{author}</span>\n {role && <span className=\"ods-testimonial__author-role\">{role}</span>}\n </span>\n </figcaption>\n </figure>\n );\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface UserCardStat {\n label: ReactNode;\n value: ReactNode;\n}\n\nexport interface UserCardProps {\n name: ReactNode;\n role?: ReactNode;\n avatar?: ReactNode;\n initial?: ReactNode;\n stats?: UserCardStat[];\n action?: ReactNode;\n className?: string;\n}\n\nexport function UserCard({ name, role, avatar, initial, stats, action, className }: UserCardProps) {\n return (\n <div className={cn(\"ods-user-card\", className)}>\n <div className=\"ods-user-card__avatar\">\n {avatar ?? <span>{initial ?? (typeof name === \"string\" ? name.charAt(0).toUpperCase() : \"?\")}</span>}\n </div>\n <div className=\"ods-user-card__name\">{name}</div>\n {role && <div className=\"ods-user-card__role\">{role}</div>}\n {stats && stats.length > 0 && (\n <div className=\"ods-user-card__stats\">\n {stats.map((s, i) => (\n <div key={i} className=\"ods-user-card__stat\">\n <div className=\"ods-user-card__stat-value\">{s.value}</div>\n <div className=\"ods-user-card__stat-label\">{s.label}</div>\n </div>\n ))}\n </div>\n )}\n {action && <div className=\"ods-user-card__action\">{action}</div>}\n </div>\n );\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface KanbanCardProps {\n title: ReactNode;\n tag?: ReactNode;\n date?: ReactNode;\n comments?: number;\n assignee?: ReactNode;\n priority?: \"low\" | \"medium\" | \"high\";\n onClick?: () => void;\n className?: string;\n}\n\nexport function KanbanCard({ title, tag, date, comments, assignee, priority, onClick, className }: KanbanCardProps) {\n return (\n <div\n role={onClick ? \"button\" : undefined}\n tabIndex={onClick ? 0 : undefined}\n onClick={onClick}\n className={cn(\n \"ods-kanban-card\",\n priority && `ods-kanban-card--${priority}`,\n onClick && \"ods-kanban-card--interactive\",\n className,\n )}\n >\n {tag && (\n <div className=\"ods-kanban-card__head\">\n <span className=\"ods-kanban-card__tag\">{tag}</span>\n <button type=\"button\" className=\"ods-kanban-card__more\" aria-label=\"More options\" onClick={(e) => e.stopPropagation()}>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"3\" cy=\"7\" r=\"1.2\" fill=\"currentColor\" />\n <circle cx=\"7\" cy=\"7\" r=\"1.2\" fill=\"currentColor\" />\n <circle cx=\"11\" cy=\"7\" r=\"1.2\" fill=\"currentColor\" />\n </svg>\n </button>\n </div>\n )}\n <div className=\"ods-kanban-card__title\">{title}</div>\n <div className=\"ods-kanban-card__footer\">\n <div className=\"ods-kanban-card__meta\">\n {date && (\n <span className=\"ods-kanban-card__date\">\n <svg width=\"11\" height=\"11\" viewBox=\"0 0 11 11\" fill=\"none\" aria-hidden=\"true\">\n <rect x=\"1.5\" y=\"2.5\" width=\"8\" height=\"7\" rx=\"1\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <path d=\"M3.5 1.5v2M7.5 1.5v2M1.5 4.5h8\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" />\n </svg>\n {date}\n </span>\n )}\n {typeof comments === \"number\" && (\n <span className=\"ods-kanban-card__comments\">\n <svg width=\"11\" height=\"11\" viewBox=\"0 0 11 11\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M2 3a1 1 0 0 1 1-1h5a1 1 0 0 1 1 1v3a1 1 0 0 1-1 1H6l-2 2v-2H3a1 1 0 0 1-1-1V3z\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n </svg>\n {comments}\n </span>\n )}\n </div>\n {assignee && <div className=\"ods-kanban-card__assignee\">{assignee}</div>}\n </div>\n </div>\n );\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface FormSectionProps {\n title?: ReactNode;\n description?: ReactNode;\n children: ReactNode;\n footer?: ReactNode;\n divided?: boolean;\n className?: string;\n}\n\nexport function FormSection({\n title,\n description,\n children,\n footer,\n divided = true,\n className,\n}: FormSectionProps) {\n return (\n <section className={cn(\"ods-form-section\", divided && \"ods-form-section--divided\", className)}>\n {(title || description) && (\n <header className=\"ods-form-section__head\">\n {title && <h3 className=\"ods-form-section__title\">{title}</h3>}\n {description && <p className=\"ods-form-section__desc\">{description}</p>}\n </header>\n )}\n <div className=\"ods-form-section__body\">{children}</div>\n {footer && <footer className=\"ods-form-section__footer\">{footer}</footer>}\n </section>\n );\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface ToolbarProps {\n children: ReactNode;\n className?: string;\n}\n\nexport function Toolbar({ children, className }: ToolbarProps) {\n return (\n <div role=\"toolbar\" className={cn(\"ods-toolbar\", className)}>\n {children}\n </div>\n );\n}\n\nexport interface ToolbarButtonProps {\n icon?: ReactNode;\n label?: ReactNode;\n active?: boolean;\n disabled?: boolean;\n onClick?: () => void;\n ariaLabel?: string;\n className?: string;\n children?: ReactNode;\n}\n\nexport function ToolbarButton({\n icon,\n label,\n active = false,\n disabled = false,\n onClick,\n ariaLabel,\n className,\n children,\n}: ToolbarButtonProps) {\n return (\n <button\n type=\"button\"\n className={cn(\n \"ods-toolbar__btn\",\n active && \"ods-toolbar__btn--active\",\n className,\n )}\n onClick={onClick}\n disabled={disabled}\n aria-pressed={active}\n aria-label={ariaLabel ?? (typeof label === \"string\" ? label : undefined)}\n >\n {icon && <span className=\"ods-toolbar__btn-icon\" aria-hidden=\"true\">{icon}</span>}\n {label && <span className=\"ods-toolbar__btn-label\">{label}</span>}\n {children}\n </button>\n );\n}\n\nexport function ToolbarDivider() {\n return <span className=\"ods-toolbar__divider\" aria-hidden=\"true\" />;\n}\n\nexport function ToolbarSpacer() {\n return <span className=\"ods-toolbar__spacer\" />;\n}\n"],"mappings":"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","names":["import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_react_aria","import_jsx_runtime","import_framer_motion","import_react","import_react_aria","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_framer_motion","import_jsx_runtime","import_react","import_react_aria","$1CcWn$react","$1CcWn$useState","$1CcWn$useRef","$1CcWn$useEffect","$1CcWn$useReducer","$1CcWn$useCallback","value","$8AuPP$createContext","$8AuPP$useMemo","$8AuPP$useContext","name","$8AuPP$useState","$8AuPP$useRef","$8AuPP$useEffect","value","a","a","$7w3VE$useRef","$7w3VE$useState","$7w3VE$useMemo","$7w3VE$useEffect","$jO8i1$react","items","node","$emYU7$useMemo","$3yt54$useMemo","$3yt54$useCallback","$3yt54$useRef","$3yt54$useEffect","$kE40A$useCallback","$dJmKC$react","$jhfZc$useMemo","$aoDK0$useState","focusStrategy","$6Hs9a$useMemo","$6Hs9a$useState","$5t5rb$useState","$5t5rb$useMemo","value","focusStrategy","$eOo4G$useRef","$eOo4G$useEffect","$dAajM$useState","$auOuY$useMemo","$auOuY$useRef","$auOuY$useEffect","$aXIpm$useMemo","$aXIpm$useCallback","$aXIpm$useEffect","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_react_dom","import_jsx_runtime","computePosition","import_framer_motion","import_react","import_react_dom","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_framer_motion","import_react","import_react_aria","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","format","import_jsx_runtime","import_jsx_runtime","import_framer_motion","import_react","import_react_aria","import_react_dom","import_jsx_runtime","onDrag","onDragStart","onDragEnd","onAnimationStart","import_jsx_runtime","import_framer_motion","import_react","import_react_aria","import_react_dom","import_jsx_runtime","import_jsx_runtime","import_framer_motion","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_framer_motion","import_framer_motion","import_react","import_jsx_runtime","FlowNode","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","pad","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_framer_motion","import_react","import_react_dom","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_react_aria","import_react","import_react_aria","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_framer_motion","import_react","import_react_aria","import_react_dom","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_framer_motion","import_react","import_react_aria","import_react_dom","import_jsx_runtime","slideVariants","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","pad","import_jsx_runtime","import_jsx_runtime","import_react","import_react_aria","import_jsx_runtime","import_react","import_jsx_runtime","import_framer_motion","import_react","import_react_aria","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_react_aria","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_framer_motion","import_react","import_react_dom","import_jsx_runtime","idCounter","import_framer_motion","import_react","import_react_aria","import_react_dom","import_jsx_runtime","computePosition","import_jsx_runtime","import_react","import_react_aria","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/components/ActionDrawer/ActionDrawer.tsx","../src/utils/cn.ts","../src/components/AgentCard/AgentCard.tsx","../src/components/AuthCard/AuthCard.tsx","../src/components/Avatar/Avatar.tsx","../src/components/Badge/Badge.tsx","../src/components/Banner/Banner.tsx","../src/components/BarChart/BarChart.tsx","../src/components/BlogCard/BlogCard.tsx","../src/components/Breadcrumb/Breadcrumb.tsx","../src/components/Button/Button.tsx","../src/components/Calendar/Calendar.tsx","../src/components/Callout/Callout.tsx","../src/components/Card/Card.tsx","../src/components/ChatBubble/ChatBubble.tsx","../src/components/Checkbox/Checkbox.tsx","../../../node_modules/react-stately/dist/private/utils/packages/react-stately/src/utils/useControlledState.ts","../../../node_modules/react-stately/dist/private/form/packages/react-stately/src/form/useFormValidationState.ts","../../../node_modules/react-stately/dist/private/collections/packages/react-stately/src/collections/getChildNodes.ts","../../../node_modules/react-stately/dist/private/list/packages/react-stately/src/list/ListCollection.ts","../../../node_modules/react-stately/dist/private/selection/packages/react-stately/src/selection/Selection.ts","../../../node_modules/react-stately/dist/private/selection/packages/react-stately/src/selection/useMultipleSelectionState.ts","../../../node_modules/react-stately/dist/private/selection/packages/react-stately/src/selection/SelectionManager.ts","../../../node_modules/react-stately/dist/private/collections/packages/react-stately/src/collections/CollectionBuilder.ts","../../../node_modules/react-stately/dist/private/collections/packages/react-stately/src/collections/useCollection.ts","../../../node_modules/react-stately/dist/private/list/packages/react-stately/src/list/useListState.ts","../../../node_modules/react-stately/dist/private/overlays/packages/react-stately/src/overlays/useOverlayTriggerState.ts","../../../node_modules/react-stately/dist/private/collections/packages/react-stately/src/collections/Item.ts","../../../node_modules/react-stately/dist/private/list/packages/react-stately/src/list/useSingleSelectListState.ts","../../../node_modules/react-stately/dist/private/menu/packages/react-stately/src/menu/useMenuTriggerState.ts","../../../node_modules/react-stately/dist/private/radio/packages/react-stately/src/radio/useRadioGroupState.ts","../../../node_modules/react-stately/dist/private/select/packages/react-stately/src/select/useSelectState.ts","../../../node_modules/react-stately/dist/private/tabs/packages/react-stately/src/tabs/useTabListState.ts","../../../node_modules/react-stately/dist/private/toggle/packages/react-stately/src/toggle/useToggleState.ts","../../../node_modules/react-stately/dist/private/tooltip/packages/react-stately/src/tooltip/useTooltipTriggerState.ts","../../../node_modules/react-stately/dist/private/tree/packages/react-stately/src/tree/TreeCollection.ts","../../../node_modules/react-stately/dist/private/tree/packages/react-stately/src/tree/useTreeState.ts","../src/components/Chip/Chip.tsx","../src/components/ChoiceCard/ChoiceCard.tsx","../src/components/CodeEditor/CodeEditor.tsx","../src/components/ColorPicker/ColorPicker.tsx","../src/components/ConditionBuilder/ConditionBuilder.tsx","../src/components/ConfigPanel/ConfigPanel.tsx","../src/components/DataMapper/DataMapper.tsx","../src/components/DataTable/DataTable.tsx","../src/components/DatePicker/DatePicker.tsx","../src/components/DescriptionList/DescriptionList.tsx","../src/components/Dialog/Dialog.tsx","../src/utils/motion.ts","../src/components/DonutChart/DonutChart.tsx","../src/components/Drawer/Drawer.tsx","../src/components/DropdownMenu/DropdownMenu.tsx","../src/components/EmptyState/EmptyState.tsx","../src/components/ExecutionConsole/ExecutionConsole.tsx","../src/components/FeatureCard/FeatureCard.tsx","../src/components/FileDropzone/FileDropzone.tsx","../src/utils/sanitizeUrl.ts","../src/components/FlowCanvas/FlowCanvas.tsx","../src/components/FlowEdge/FlowEdge.tsx","../src/components/FlowNode/FlowNode.tsx","../src/components/FlowMinimap/FlowMinimap.tsx","../src/components/FlowToolbar/FlowToolbar.tsx","../src/components/FormSection/FormSection.tsx","../src/components/HoverCard/HoverCard.tsx","../src/components/IconCard/IconCard.tsx","../src/components/Input/Input.tsx","../src/components/JsonViewer/JsonViewer.tsx","../src/components/KanbanCard/KanbanCard.tsx","../src/components/Kbd/Kbd.tsx","../src/components/LineChart/LineChart.tsx","../src/components/LinkButton/LinkButton.tsx","../src/components/MonacoEditor/MonacoEditor.tsx","../src/components/MonacoEditor/octaviaflowTheme.ts","../src/components/MonacoEditor/MonacoDiffEditor.tsx","../src/components/MultiSelect/MultiSelect.tsx","../src/components/NumberInput/NumberInput.tsx","../src/components/OTPInput/OTPInput.tsx","../src/components/PageHeader/PageHeader.tsx","../src/components/PasswordInput/PasswordInput.tsx","../src/components/PhoneInput/PhoneInput.tsx","../src/components/Popover/Popover.tsx","../src/components/PricingCard/PricingCard.tsx","../src/components/ProductCard/ProductCard.tsx","../src/components/ProgressRing/ProgressRing.tsx","../src/components/PromptInput/PromptInput.tsx","../src/components/Quote/Quote.tsx","../src/components/Radio/Radio.tsx","../src/components/Radio/RadioGroup.tsx","../src/components/RangeSlider/RangeSlider.tsx","../src/components/Rating/Rating.tsx","../src/components/Resizable/Resizable.tsx","../src/components/Ribbon/Ribbon.tsx","../src/components/Select/Select.tsx","../src/components/SettingsRow/SettingsRow.tsx","../src/components/Sheet/Sheet.tsx","../src/components/Sidebar/Sidebar.tsx","../src/components/Skeleton/Skeleton.tsx","../src/components/SlideoutPanel/SlideoutPanel.tsx","../src/components/Slider/Slider.tsx","../src/components/SocialButton/SocialButton.tsx","../src/components/Sortable/Sortable.tsx","../src/components/Sparkline/Sparkline.tsx","../src/components/Spinner/Spinner.tsx","../src/components/Stat/Stat.tsx","../src/components/Switch/Switch.tsx","../src/components/Table/Table.tsx","../src/components/Tabs/Tabs.tsx","../src/components/TagsInput/TagsInput.tsx","../src/components/TestimonialCard/TestimonialCard.tsx","../src/components/Textarea/Textarea.tsx","../src/components/Timeline/Timeline.tsx","../src/components/TimePicker/TimePicker.tsx","../src/components/TimezonePicker/TimezonePicker.tsx","../src/components/Toast/Toast.tsx","../src/components/Toggle/Toggle.tsx","../src/components/Toolbar/Toolbar.tsx","../src/components/ToolCard/ToolCard.tsx","../src/components/Tooltip/Tooltip.tsx","../src/components/TopBar/TopBar.tsx","../src/components/TraceStep/TraceStep.tsx","../src/components/UserCard/UserCard.tsx","../src/components/WorkflowEditor/WorkflowEditor.tsx","../src/hooks/useWorkflow.ts","../src/workflow/types.ts","../src/workflow/validator.ts","../src/components/XmlViewer/XmlViewer.tsx","../src/components/YamlViewer/YamlViewer.tsx","../src/provider/OdsProvider.tsx","../src/workflow/configStatus.ts","../src/workflow/layout.ts"],"sourcesContent":["// Provider\n\nexport { ActionDrawer, type ActionDrawerProps } from \"./components/ActionDrawer\";\nexport { AgentCard, type AgentCardProps, type AgentStatus } from \"./components/AgentCard\";\nexport {\n AuthBadge,\n type AuthBadgeProps,\n type AuthBadgeTone,\n AuthCard,\n type AuthCardProps,\n AuthDivider,\n type AuthDividerProps,\n AuthSection,\n type AuthSectionProps,\n type AuthTab,\n AuthTabs,\n type AuthTabsProps,\n} from \"./components/AuthCard\";\nexport { Avatar, type AvatarProps, AvatarStack, type AvatarStackProps } from \"./components/Avatar\";\nexport { Badge, type BadgeProps } from \"./components/Badge\";\nexport { Banner, type BannerProps } from \"./components/Banner\";\nexport { BarChart, type BarChartProps, type BarDatum } from \"./components/BarChart\";\nexport { BlogCard, type BlogCardProps } from \"./components/BlogCard\";\nexport { Breadcrumb, type BreadcrumbProps } from \"./components/Breadcrumb\";\n// ── Phase 1: Foundation ──\nexport { Button, type ButtonProps } from \"./components/Button\";\n// ── Phase 2: Layout & Navigation ──\nexport { Calendar, type CalendarProps, type DateRange } from \"./components/Calendar\";\nexport { Callout, type CalloutProps } from \"./components/Callout\";\nexport { Card, type CardProps } from \"./components/Card\";\nexport { ChatBubble, type ChatBubbleProps } from \"./components/ChatBubble\";\nexport { Checkbox, type CheckboxProps } from \"./components/Checkbox\";\nexport { Chip, type ChipProps } from \"./components/Chip\";\nexport { ChoiceCard, type ChoiceCardProps } from \"./components/ChoiceCard\";\nexport {\n CodeEditor,\n type CodeEditorProps,\n type CodeEditorLanguage,\n} from \"./components/CodeEditor\";\nexport { ColorPicker, type ColorPickerProps } from \"./components/ColorPicker\";\nexport { ConditionBuilder, type ConditionBuilderProps } from \"./components/ConditionBuilder\";\nexport { ConfigPanel, type ConfigPanelProps } from \"./components/ConfigPanel\";\nexport { DataMapper, type DataMapperProps } from \"./components/DataMapper\";\nexport {\n DataTable,\n type DataTableAlign,\n type DataTableBulkAction,\n type DataTableColumn,\n type DataTableDensity,\n type DataTableFilter,\n type DataTablePagination,\n type DataTableProps,\n type DataTableRowAction,\n type DataTableSortDir,\n} from \"./components/DataTable\";\nexport { DatePicker, type DatePickerProps } from \"./components/DatePicker\";\nexport {\n DescriptionList,\n type DescriptionListItem,\n type DescriptionListProps,\n} from \"./components/DescriptionList\";\nexport { Dialog, type DialogProps } from \"./components/Dialog\";\nexport { DonutChart, type DonutChartProps, type DonutSegment } from \"./components/DonutChart\";\nexport { Drawer, type DrawerProps } from \"./components/Drawer\";\nexport { DropdownMenu, type DropdownMenuProps } from \"./components/DropdownMenu\";\nexport { EmptyState, type EmptyStateProps } from \"./components/EmptyState\";\nexport { ExecutionConsole, type ExecutionConsoleProps } from \"./components/ExecutionConsole\";\nexport { FeatureCard, type FeatureCardProps } from \"./components/FeatureCard\";\nexport {\n FileDropzone,\n type FileDropzoneFile,\n type FileDropzoneProps,\n} from \"./components/FileDropzone\";\n// ── Phase 4: Workflow ──\nexport { FlowCanvas, type FlowCanvasProps } from \"./components/FlowCanvas\";\nexport { FlowEdge, type FlowEdgeProps } from \"./components/FlowEdge\";\nexport { FlowMinimap, type FlowMinimapProps } from \"./components/FlowMinimap\";\nexport { FlowNode, type FlowNodeProps } from \"./components/FlowNode\";\nexport {\n FlowToolbar,\n FlowToolbarButton,\n type FlowToolbarButtonProps,\n FlowToolbarDivider,\n type FlowToolbarDividerProps,\n FlowToolbarIcons,\n type FlowToolbarProps,\n FlowToolbarZoom,\n type FlowToolbarZoomProps,\n} from \"./components/FlowToolbar\";\nexport { FormSection, type FormSectionProps } from \"./components/FormSection\";\nexport { HoverCard, type HoverCardPlacement, type HoverCardProps } from \"./components/HoverCard\";\nexport { IconCard, type IconCardProps } from \"./components/IconCard\";\nexport { Input, type InputProps } from \"./components/Input\";\nexport { JsonViewer, type JsonViewerProps } from \"./components/JsonViewer\";\nexport { KanbanCard, type KanbanCardProps } from \"./components/KanbanCard\";\nexport { Kbd, KbdGroup, type KbdGroupProps, type KbdProps } from \"./components/Kbd\";\nexport { LineChart, type LineChartProps, type LinePoint } from \"./components/LineChart\";\nexport { LinkButton, type LinkButtonProps } from \"./components/LinkButton\";\nexport {\n MonacoDiffEditor,\n type MonacoDiffEditorProps,\n MonacoEditor,\n type MonacoEditorProps,\n type MonacoLanguage,\n type MonacoMarker,\n OCTAVIAFLOW_LIGHT,\n OCTAVIAFLOW_THEME_ID,\n} from \"./components/MonacoEditor\";\nexport {\n MultiSelect,\n type MultiSelectOption,\n type MultiSelectProps,\n} from \"./components/MultiSelect\";\nexport { NumberInput, type NumberInputProps } from \"./components/NumberInput\";\nexport { OTPInput, type OTPInputProps } from \"./components/OTPInput\";\nexport {\n PageHeader,\n type PageHeaderBreadcrumb,\n type PageHeaderProps,\n} from \"./components/PageHeader\";\nexport { PasswordInput, type PasswordInputProps } from \"./components/PasswordInput\";\nexport { type CountryOption, PhoneInput, type PhoneInputProps } from \"./components/PhoneInput\";\nexport { Popover, type PopoverPlacement, type PopoverProps } from \"./components/Popover\";\nexport { PricingCard, type PricingCardProps } from \"./components/PricingCard\";\nexport { ProductCard, type ProductCardProps } from \"./components/ProductCard\";\nexport { ProgressRing, type ProgressRingProps } from \"./components/ProgressRing\";\nexport {\n PromptInput,\n type PromptInputAttachment,\n type PromptInputProps,\n type PromptInputQuickAction,\n type PromptInputSuggestion,\n} from \"./components/PromptInput\";\nexport { Quote, type QuoteProps } from \"./components/Quote\";\nexport { Radio, RadioGroup, type RadioProps } from \"./components/Radio\";\nexport { RangeSlider, type RangeSliderProps } from \"./components/RangeSlider\";\nexport { Rating, type RatingProps } from \"./components/Rating\";\nexport {\n Resizable,\n ResizablePanel,\n type ResizableDirection,\n type ResizablePanelProps,\n type ResizableProps,\n} from \"./components/Resizable\";\nexport { Ribbon, type RibbonProps } from \"./components/Ribbon\";\nexport { Select, type SelectOption, type SelectProps } from \"./components/Select\";\nexport { SettingsRow, type SettingsRowProps } from \"./components/SettingsRow\";\nexport { Sheet, type SheetProps, type SheetSide } from \"./components/Sheet\";\nexport { Sidebar, type SidebarProps } from \"./components/Sidebar\";\nexport { Skeleton, type SkeletonProps } from \"./components/Skeleton\";\nexport { SlideoutPanel, type SlideoutPanelProps } from \"./components/SlideoutPanel\";\nexport { Slider, type SliderProps } from \"./components/Slider\";\nexport {\n SocialButton,\n type SocialButtonProps,\n type SocialProvider,\n} from \"./components/SocialButton\";\nexport {\n DragHandle,\n type DragHandleProps,\n Sortable,\n type SortableDragProps,\n type SortableItem,\n type SortableProps,\n} from \"./components/Sortable\";\nexport { Sparkline, type SparklineProps } from \"./components/Sparkline\";\nexport { Spinner, type SpinnerProps } from \"./components/Spinner\";\nexport { Stat, type StatProps } from \"./components/Stat\";\nexport { Switch, type SwitchProps } from \"./components/Switch\";\n// ── Phase 3: Data ──\nexport { Table, type TableProps } from \"./components/Table\";\nexport { Tabs, type TabsProps } from \"./components/Tabs\";\nexport { TagsInput, type TagsInputProps } from \"./components/TagsInput\";\nexport { TestimonialCard, type TestimonialCardProps } from \"./components/TestimonialCard\";\nexport { Textarea, type TextareaProps } from \"./components/Textarea\";\nexport {\n Timeline,\n type TimelineItem,\n type TimelineProps,\n type TimelineStatus,\n} from \"./components/Timeline\";\nexport { TimePicker, type TimePickerProps, type TimeValue } from \"./components/TimePicker\";\nexport {\n type TimezoneOption,\n TimezonePicker,\n type TimezonePickerProps,\n} from \"./components/TimezonePicker\";\nexport { ToastProvider, useToast } from \"./components/Toast\";\nexport { Toggle, type ToggleOption, type ToggleProps } from \"./components/Toggle\";\nexport {\n Toolbar,\n ToolbarButton,\n type ToolbarButtonProps,\n ToolbarDivider,\n type ToolbarProps,\n ToolbarSpacer,\n} from \"./components/Toolbar\";\nexport { ToolCard, type ToolCardProps, type ToolCategory } from \"./components/ToolCard\";\nexport { Tooltip, type TooltipProps } from \"./components/Tooltip\";\nexport { TopBar, type TopBarProps } from \"./components/TopBar\";\nexport {\n TraceStep,\n type TraceStepKind,\n type TraceStepProps,\n type TraceStepStatus,\n} from \"./components/TraceStep\";\nexport { UserCard, type UserCardProps, type UserCardStat } from \"./components/UserCard\";\nexport { WorkflowEditor, type WorkflowEditorProps } from \"./components/WorkflowEditor\";\nexport { XmlViewer, type XmlViewerProps } from \"./components/XmlViewer\";\nexport { YamlViewer, type YamlViewerProps } from \"./components/YamlViewer\";\nexport { type UseWorkflowOptions, type UseWorkflowReturn, useWorkflow } from \"./hooks/useWorkflow\";\nexport { OdsProvider, useOds, useOdsMotion } from \"./provider/OdsProvider\";\n// Utilities\nexport { cn } from \"./utils/cn\";\nexport { odsMotion } from \"./utils/motion\";\nexport { sanitizeHref, sanitizeImageUrl } from \"./utils/sanitizeUrl\";\nexport {\n type ConfigStatusResult,\n type FieldConditional,\n type FieldSchema,\n getNodeConfigStatus,\n} from \"./workflow/configStatus\";\nexport {\n applyHorizontalLayout,\n applyLayout,\n applyVerticalLayout,\n type LayoutOptions as WorkflowLayoutOptions,\n type LayoutResult as WorkflowLayoutResult,\n} from \"./workflow/layout\";\nexport * as Workflow from \"./workflow/types\";\nexport {\n getEdgeValidationStatus,\n getNodeValidationStatus,\n validateEdge,\n validateNode,\n validateWorkflow,\n wouldCreateCycle,\n} from \"./workflow/validator\";\n","\"use client\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport { type ReactNode, useMemo, useRef } from \"react\";\nimport { useTextField } from \"react-aria\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface ActionItem {\n type: string;\n label: string;\n description?: string;\n icon?: ReactNode;\n category: string;\n}\n\nexport interface ActionDrawerProps {\n open?: boolean;\n onToggle?: () => void;\n actions?: ActionItem[];\n searchValue?: string;\n onSearchChange?: (value: string) => void;\n onActionDrag?: (type: string) => void;\n className?: string;\n}\n\nexport function ActionDrawer({\n open = true,\n onToggle,\n actions = [],\n searchValue = \"\",\n onSearchChange,\n onActionDrag,\n className,\n}: ActionDrawerProps) {\n const inputRef = useRef<HTMLInputElement>(null);\n const { inputProps } = useTextField(\n {\n label: \"Search actions\",\n value: searchValue,\n onChange: onSearchChange,\n },\n inputRef,\n );\n\n const filteredActions = useMemo(() => {\n if (!searchValue) return actions;\n const q = searchValue.toLowerCase();\n return actions.filter(\n (a) =>\n a.label.toLowerCase().includes(q) ||\n a.category.toLowerCase().includes(q) ||\n a.description?.toLowerCase().includes(q),\n );\n }, [actions, searchValue]);\n\n const groupedActions = useMemo(() => {\n const groups: Record<string, ActionItem[]> = {};\n for (const action of filteredActions) {\n if (!groups[action.category]) groups[action.category] = [];\n groups[action.category].push(action);\n }\n return groups;\n }, [filteredActions]);\n\n return (\n <AnimatePresence>\n {open && (\n <motion.div\n className={cn(\"ods-action-drawer\", className)}\n initial={{ x: -240, opacity: 0 }}\n animate={{ x: 0, opacity: 1 }}\n exit={{ x: -240, opacity: 0 }}\n transition={{ type: \"spring\", stiffness: 300, damping: 30 }}\n data-testid=\"action-drawer\"\n >\n <div className={\"ods-action-drawer__header\"}>\n <span className={\"ods-action-drawer__title\"}>Actions</span>\n <button\n className={\"ods-action-drawer__toggle\"}\n onClick={onToggle}\n aria-label=\"Close action drawer\"\n data-testid=\"action-drawer-toggle\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M11 3L6 8l5 5\" stroke=\"currentColor\" strokeWidth=\"2\" fill=\"none\" />\n </svg>\n </button>\n </div>\n\n <div className={\"ods-action-drawer__search\"}>\n <input\n {...inputProps}\n ref={inputRef}\n className={\"ods-action-drawer__input\"}\n placeholder=\"Search actions...\"\n data-testid=\"action-drawer-search\"\n />\n </div>\n\n <div className={\"ods-action-drawer__list\"} data-testid=\"action-drawer-list\">\n {Object.entries(groupedActions).map(([category, items]) => (\n <div key={category} className={\"ods-action-drawer__group\"}>\n <div className={\"ods-action-drawer__category\"}>{category}</div>\n {items.map((action) => (\n <div\n key={action.type}\n className={\"ods-action-drawer__item\"}\n draggable\n onDragStart={() => onActionDrag?.(action.type)}\n data-testid={`action-item-${action.type}`}\n role=\"button\"\n tabIndex={0}\n >\n {action.icon && (\n <div className={\"ods-action-drawer__item-icon\"}>{action.icon}</div>\n )}\n <div className={\"ods-action-drawer__item-info\"}>\n <div className={\"ods-action-drawer__item-label\"}>{action.label}</div>\n {action.description && (\n <div className={\"ods-action-drawer__item-desc\"}>{action.description}</div>\n )}\n </div>\n </div>\n ))}\n </div>\n ))}\n\n {filteredActions.length === 0 && (\n <div className={\"ods-action-drawer__empty\"} data-testid=\"action-drawer-empty\">\n No actions found\n </div>\n )}\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n );\n}\n","import { type ClassValue, clsx } from \"clsx\";\n\nexport function cn(...inputs: ClassValue[]): string {\n return clsx(inputs);\n}\n","\"use client\";\nimport { type ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport type AgentStatus = \"idle\" | \"running\" | \"failed\" | \"paused\" | \"draft\";\n\nexport interface AgentCardProps {\n name: ReactNode;\n /** Optional role / one-line description. */\n role?: ReactNode;\n /** Avatar / glyph for the agent. Defaults to initial of `name`. */\n avatar?: ReactNode;\n /** Model identifier (e.g. \"claude-opus-4-7\", \"gpt-4o\"). */\n model?: string;\n /** Status pill on the right. */\n status?: AgentStatus;\n /** Tool count badge. */\n toolCount?: number;\n /** Hover affordance. */\n interactive?: boolean;\n /** Actions slot (right side under status). */\n actions?: ReactNode;\n /** Stats slot at the bottom (e.g. runs / success rate). */\n stats?: ReactNode;\n onClick?: () => void;\n className?: string;\n}\n\nconst STATUS_LABEL: Record<AgentStatus, string> = {\n idle: \"Idle\",\n running: \"Running\",\n failed: \"Failed\",\n paused: \"Paused\",\n draft: \"Draft\",\n};\n\nexport function AgentCard({\n name,\n role,\n avatar,\n model,\n status = \"idle\",\n toolCount,\n interactive,\n actions,\n stats,\n onClick,\n className,\n}: AgentCardProps) {\n const initial = typeof name === \"string\" ? name.charAt(0).toUpperCase() : \"A\";\n return (\n <div\n className={cn(\n \"ods-agent-card\",\n interactive && \"ods-agent-card--interactive\",\n className,\n )}\n onClick={onClick}\n role={onClick ? \"button\" : undefined}\n tabIndex={onClick ? 0 : undefined}\n >\n <div className=\"ods-agent-card__head\">\n <span className=\"ods-agent-card__avatar\" aria-hidden=\"true\">\n {avatar ?? <span>{initial}</span>}\n </span>\n <span className=\"ods-agent-card__id\">\n <span className=\"ods-agent-card__name\">{name}</span>\n {role && <span className=\"ods-agent-card__role\">{role}</span>}\n </span>\n <span\n className={cn(\n \"ods-agent-card__status\",\n `ods-agent-card__status--${status}`,\n )}\n >\n <span className=\"ods-agent-card__status-dot\" aria-hidden=\"true\" />\n {STATUS_LABEL[status]}\n </span>\n </div>\n\n <div className=\"ods-agent-card__meta\">\n {model && (\n <span className=\"ods-agent-card__model\" title={model}>\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M5 1.5 8.5 3.5v3L5 8.5 1.5 6.5v-3z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.2\"\n strokeLinejoin=\"round\"\n />\n </svg>\n {model}\n </span>\n )}\n {toolCount != null && (\n <span className=\"ods-agent-card__tools\">\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M3.5 1h3v3l2 3h-3v3l-1.5 2L3.5 9V7h-3l2-3V1z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.1\"\n strokeLinejoin=\"round\"\n />\n </svg>\n <span>{toolCount}</span> tool{toolCount === 1 ? \"\" : \"s\"}\n </span>\n )}\n </div>\n\n {stats && <div className=\"ods-agent-card__stats\">{stats}</div>}\n {actions && <div className=\"ods-agent-card__actions\">{actions}</div>}\n </div>\n );\n}\n","\"use client\";\nimport { type ReactNode, useState } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface AuthCardProps {\n logo?: ReactNode;\n title: ReactNode;\n description?: ReactNode;\n /** Small badge rendered next to the title (e.g. \"Organization\"). */\n scope?: ReactNode;\n children: ReactNode;\n divider?: ReactNode;\n footer?: ReactNode;\n className?: string;\n}\n\nexport function AuthCard({\n logo,\n title,\n description,\n scope,\n children,\n divider,\n footer,\n className,\n}: AuthCardProps) {\n return (\n <div className={cn(\"ods-auth-card\", className)}>\n {logo && <div className=\"ods-auth-card__logo\">{logo}</div>}\n <div className=\"ods-auth-card__head\">\n <div className=\"ods-auth-card__title-row\">\n <h1 className=\"ods-auth-card__title\">{title}</h1>\n {scope && <span className=\"ods-auth-card__scope\">{scope}</span>}\n </div>\n {description && <p className=\"ods-auth-card__desc\">{description}</p>}\n </div>\n <div className=\"ods-auth-card__body\">{children}</div>\n {divider && <div className=\"ods-auth-card__divider\">{divider}</div>}\n {footer && <div className=\"ods-auth-card__footer\">{footer}</div>}\n </div>\n );\n}\n\nexport interface AuthDividerProps {\n children?: ReactNode;\n className?: string;\n}\n\nexport function AuthDivider({ children = \"OR\", className }: AuthDividerProps) {\n return (\n <div className={cn(\"ods-auth-divider\", className)}>\n <span className=\"ods-auth-divider__line\" />\n <span className=\"ods-auth-divider__label\">{children}</span>\n <span className=\"ods-auth-divider__line\" />\n </div>\n );\n}\n\n// ─────────────────────────────────────────────\n// AuthSection — labelled group within the body\n// ─────────────────────────────────────────────\nexport interface AuthSectionProps {\n label?: ReactNode;\n description?: ReactNode;\n children: ReactNode;\n className?: string;\n}\n\nexport function AuthSection({ label, description, children, className }: AuthSectionProps) {\n return (\n <div className={cn(\"ods-auth-section\", className)}>\n {(label || description) && (\n <div className=\"ods-auth-section__head\">\n {label && <div className=\"ods-auth-section__label\">{label}</div>}\n {description && <div className=\"ods-auth-section__desc\">{description}</div>}\n </div>\n )}\n <div className=\"ods-auth-section__body\">{children}</div>\n </div>\n );\n}\n\n// ─────────────────────────────────────────────\n// AuthTabs — scope switcher (org / personal / developer)\n// ─────────────────────────────────────────────\nexport interface AuthTab {\n id: string;\n label: ReactNode;\n icon?: ReactNode;\n description?: ReactNode;\n content: ReactNode;\n}\n\nexport interface AuthTabsProps {\n tabs: AuthTab[];\n defaultTab?: string;\n value?: string;\n onChange?: (id: string) => void;\n className?: string;\n}\n\nexport function AuthTabs({ tabs, defaultTab, value, onChange, className }: AuthTabsProps) {\n const [internal, setInternal] = useState<string>(defaultTab ?? tabs[0]?.id ?? \"\");\n const active = value ?? internal;\n const select = (id: string) => {\n if (value === undefined) setInternal(id);\n onChange?.(id);\n };\n const activeTab = tabs.find((t) => t.id === active) ?? tabs[0];\n\n return (\n <div className={cn(\"ods-auth-tabs\", className)}>\n <div className=\"ods-auth-tabs__list\" role=\"tablist\">\n {tabs.map((t) => (\n <button\n key={t.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={t.id === active}\n className={cn(\"ods-auth-tabs__tab\", t.id === active && \"ods-auth-tabs__tab--active\")}\n onClick={() => select(t.id)}\n >\n {t.icon && <span className=\"ods-auth-tabs__icon\">{t.icon}</span>}\n <span className=\"ods-auth-tabs__label\">{t.label}</span>\n {t.description && <span className=\"ods-auth-tabs__desc\">{t.description}</span>}\n </button>\n ))}\n </div>\n {activeTab && <div className=\"ods-auth-tabs__panel\">{activeTab.content}</div>}\n </div>\n );\n}\n\n// ─────────────────────────────────────────────\n// AuthBadge — scope pill for the card head\n// ─────────────────────────────────────────────\nexport type AuthBadgeTone = \"neutral\" | \"org\" | \"personal\" | \"developer\";\n\nexport interface AuthBadgeProps {\n tone?: AuthBadgeTone;\n children: ReactNode;\n className?: string;\n}\n\nexport function AuthBadge({ tone = \"neutral\", children, className }: AuthBadgeProps) {\n return (\n <span className={cn(\"ods-auth-badge\", `ods-auth-badge--${tone}`, className)}>{children}</span>\n );\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface AvatarProps {\n src?: string;\n alt?: string;\n initials?: string;\n /** Seed for deterministic color. Falls back to initials/alt. */\n seed?: string;\n size?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n status?: \"online\" | \"offline\" | \"busy\" | \"away\";\n className?: string;\n}\n\n// 12 accessible gradient pairs — stable across reloads via seeded hash + localStorage.\nconst GRADIENTS: Array<[string, string]> = [\n [\"#6366f1\", \"#8b5cf6\"],\n [\"#ec4899\", \"#f43f5e\"],\n [\"#06b6d4\", \"#3b82f6\"],\n [\"#10b981\", \"#059669\"],\n [\"#f59e0b\", \"#f97316\"],\n [\"#8b5cf6\", \"#d946ef\"],\n [\"#14b8a6\", \"#06b6d4\"],\n [\"#f43f5e\", \"#ec4899\"],\n [\"#3b82f6\", \"#6366f1\"],\n [\"#0ea5e9\", \"#14b8a6\"],\n [\"#a855f7\", \"#7c3aed\"],\n [\"#ef4444\", \"#f59e0b\"],\n];\n\nconst STORAGE_KEY = \"ods:avatar-colors\";\n\nfunction djb2(str: string): number {\n let h = 5381;\n for (let i = 0; i < str.length; i++) h = (h << 5) + h + str.charCodeAt(i);\n return h >>> 0;\n}\n\nfunction loadCache(): Record<string, number> {\n if (typeof window === \"undefined\") return {};\n try {\n const raw = window.localStorage.getItem(STORAGE_KEY);\n return raw ? JSON.parse(raw) : {};\n } catch {\n return {};\n }\n}\n\nfunction saveCache(cache: Record<string, number>) {\n if (typeof window === \"undefined\") return;\n try {\n window.localStorage.setItem(STORAGE_KEY, JSON.stringify(cache));\n } catch {\n /* noop */\n }\n}\n\nfunction gradientFor(seed: string): [string, string] {\n const cache = loadCache();\n let idx = cache[seed];\n if (idx === undefined) {\n idx = djb2(seed) % GRADIENTS.length;\n cache[seed] = idx;\n saveCache(cache);\n }\n return GRADIENTS[idx];\n}\n\nexport function Avatar({\n src,\n alt = \"\",\n initials,\n seed,\n size = \"md\",\n status,\n className,\n}: AvatarProps) {\n const resolvedSeed = seed ?? initials ?? alt ?? \"?\";\n const [a, b] = !src ? gradientFor(resolvedSeed) : [\"\", \"\"];\n const bgStyle = !src\n ? { background: `linear-gradient(135deg, ${a} 0%, ${b} 100%)`, color: \"#ffffff\" }\n : undefined;\n\n return (\n <div\n className={cn(\"ods-avatar\", `ods-avatar--${size}`, className)}\n role=\"img\"\n aria-label={alt || initials || \"avatar\"}\n >\n <span className=\"ods-avatar__inner\">\n {src ? (\n <img src={src} alt={alt} className=\"ods-avatar__image\" />\n ) : (\n <span className=\"ods-avatar__initials\" style={bgStyle}>\n {initials || \"?\"}\n </span>\n )}\n </span>\n {status && (\n <span\n className={cn(\"ods-avatar__status\", `ods-avatar__status--${status}`)}\n aria-label={status}\n />\n )}\n </div>\n );\n}\n\nexport interface AvatarStackProps {\n children: ReactNode;\n className?: string;\n /** Max avatars to show; rest collapse into \"+N\". */\n max?: number;\n}\n\nexport function AvatarStack({ children, className, max }: AvatarStackProps) {\n const arr = Array.isArray(children) ? children : [children];\n const items = max && arr.length > max ? arr.slice(0, max) : arr;\n const overflow = max && arr.length > max ? arr.length - max : 0;\n return (\n <div className={cn(\"ods-avatar-stack\", className)}>\n {items}\n {overflow > 0 && (\n <div\n className=\"ods-avatar ods-avatar--md ods-avatar-stack__overflow\"\n role=\"img\"\n aria-label={`+${overflow} more`}\n >\n <span className=\"ods-avatar__inner\">\n <span className=\"ods-avatar__initials\">+{overflow}</span>\n </span>\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface BadgeProps {\n variant?: \"success\" | \"warning\" | \"error\" | \"info\" | \"neutral\";\n size?: \"sm\" | \"md\";\n dot?: boolean;\n closeable?: boolean;\n onClose?: () => void;\n outlined?: boolean;\n children: ReactNode;\n className?: string;\n}\n\nexport function Badge({\n variant = \"neutral\",\n size = \"md\",\n dot = false,\n closeable = false,\n onClose,\n outlined = false,\n children,\n className,\n}: BadgeProps) {\n return (\n <span\n className={cn(\n \"ods-badge\",\n `ods-badge--${variant}`,\n `ods-badge--${size}`,\n outlined && \"ods-badge--outlined\",\n className,\n )}\n >\n {dot && <span className={\"ods-badge__dot\"} aria-hidden=\"true\" />}\n <span className={\"ods-badge__text\"}>{children}</span>\n {closeable && (\n <button type=\"button\" className={\"ods-badge__close\"} onClick={onClose} aria-label=\"Remove\">\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M4 4L10 10M10 4L4 10\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n )}\n </span>\n );\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface BannerProps {\n variant?: \"info\" | \"success\" | \"warning\" | \"error\" | \"promo\";\n icon?: ReactNode;\n title?: ReactNode;\n description?: ReactNode;\n action?: ReactNode;\n dismissible?: boolean;\n onDismiss?: () => void;\n children?: ReactNode;\n className?: string;\n}\n\nexport function Banner({\n variant = \"info\",\n icon,\n title,\n description,\n action,\n dismissible = false,\n onDismiss,\n children,\n className,\n}: BannerProps) {\n return (\n <div role=\"status\" className={cn(\"ods-banner\", `ods-banner--${variant}`, className)}>\n {icon && (\n <span className=\"ods-banner__icon\" aria-hidden=\"true\">\n {icon}\n </span>\n )}\n <div className=\"ods-banner__body\">\n {title && <div className=\"ods-banner__title\">{title}</div>}\n {description && <div className=\"ods-banner__description\">{description}</div>}\n {children}\n </div>\n {action && <div className=\"ods-banner__action\">{action}</div>}\n {dismissible && (\n <button\n type=\"button\"\n className=\"ods-banner__dismiss\"\n onClick={onDismiss}\n aria-label=\"Dismiss\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M4 4L12 12M12 4L4 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n )}\n </div>\n );\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface BarDatum {\n label: ReactNode;\n value: number;\n highlighted?: boolean;\n}\n\nexport interface BarChartProps {\n data: BarDatum[];\n height?: number;\n color?: string;\n highlightColor?: string;\n title?: ReactNode;\n total?: ReactNode;\n className?: string;\n}\n\nexport function BarChart({\n data,\n height = 120,\n color = \"#c4b5fe\",\n highlightColor,\n title,\n total,\n className,\n}: BarChartProps) {\n const max = Math.max(1, ...data.map((d) => d.value));\n const hiColor = highlightColor ?? \"linear-gradient(180deg, #8b5cf6 0%, #5b4bd1 100%)\";\n\n return (\n <div className={cn(\"ods-bar-chart\", className)}>\n {(title || total) && (\n <div className=\"ods-bar-chart__head\">\n {title && <div className=\"ods-bar-chart__title\">{title}</div>}\n {total && <div className=\"ods-bar-chart__total\">{total}</div>}\n </div>\n )}\n <div className=\"ods-bar-chart__bars\" style={{ height }}>\n {data.map((d, i) => {\n const h = (d.value / max) * (height - 8);\n return (\n <div\n key={i}\n className={cn(\"ods-bar-chart__col\", d.highlighted && \"ods-bar-chart__col--hi\")}\n >\n <div\n className=\"ods-bar-chart__bar\"\n style={{\n height: Math.max(4, h),\n background: d.highlighted ? hiColor : color,\n }}\n aria-label={`${d.label}: ${d.value}`}\n />\n </div>\n );\n })}\n </div>\n <div className=\"ods-bar-chart__labels\">\n {data.map((d, i) => (\n <span\n key={i}\n className={cn(\"ods-bar-chart__label\", d.highlighted && \"ods-bar-chart__label--hi\")}\n >\n {d.label}\n </span>\n ))}\n </div>\n </div>\n );\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface BlogCardProps {\n cover?: ReactNode;\n category?: ReactNode;\n meta?: ReactNode;\n title: ReactNode;\n description?: ReactNode;\n href?: string;\n onClick?: () => void;\n className?: string;\n}\n\nexport function BlogCard({\n cover,\n category,\n meta,\n title,\n description,\n href,\n onClick,\n className,\n}: BlogCardProps) {\n const interactive = Boolean(href || onClick);\n const Comp = href ? \"a\" : \"div\";\n return (\n <Comp\n href={href}\n onClick={onClick as any}\n className={cn(\"ods-blog-card\", interactive && \"ods-blog-card--interactive\", className)}\n >\n <div className=\"ods-blog-card__cover\">{cover}</div>\n <div className=\"ods-blog-card__body\">\n <div className=\"ods-blog-card__meta\">\n {category && <span className=\"ods-blog-card__category\">{category}</span>}\n {meta && <span className=\"ods-blog-card__date\">{meta}</span>}\n </div>\n <div className=\"ods-blog-card__title\">{title}</div>\n {description && <div className=\"ods-blog-card__desc\">{description}</div>}\n </div>\n </Comp>\n );\n}\n","\"use client\";\nimport { type ReactNode, useRef } from \"react\";\nimport { useBreadcrumbItem, useBreadcrumbs } from \"react-aria\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface BreadcrumbItemData {\n label: string;\n href?: string;\n icon?: ReactNode;\n}\n\nexport interface BreadcrumbProps {\n items: BreadcrumbItemData[];\n separator?: ReactNode;\n className?: string;\n}\n\nfunction BreadcrumbItem({ item, isCurrent }: { item: BreadcrumbItemData; isCurrent: boolean }) {\n const ref = useRef<HTMLElement>(null);\n const { itemProps } = useBreadcrumbItem(\n { children: item.label, isCurrent, elementType: item.href ? \"a\" : \"span\" },\n ref,\n );\n\n const content = (\n <>\n {item.icon && <span className={\"ods-breadcrumb__icon\"}>{item.icon}</span>}\n <span>{item.label}</span>\n </>\n );\n\n if (item.href && !isCurrent) {\n return (\n <a\n {...itemProps}\n ref={ref as any}\n href={item.href}\n className={cn(\"ods-breadcrumb__link\", isCurrent && \"ods-breadcrumb__link--current\")}\n >\n {content}\n </a>\n );\n }\n\n return (\n <span\n {...itemProps}\n ref={ref as any}\n className={cn(\"ods-breadcrumb__link\", isCurrent && \"ods-breadcrumb__link--current\")}\n >\n {content}\n </span>\n );\n}\n\nexport function Breadcrumb({\n items,\n separator = (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path\n fillRule=\"evenodd\"\n d=\"M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z\"\n clipRule=\"evenodd\"\n />\n </svg>\n ),\n className,\n}: BreadcrumbProps) {\n const { navProps } = useBreadcrumbs({});\n\n return (\n <nav {...navProps} className={cn(\"ods-breadcrumb\", className)}>\n <ol className={\"ods-breadcrumb__list\"}>\n {items.map((item, idx) => {\n const isCurrent = idx === items.length - 1;\n return (\n <li key={idx} className={\"ods-breadcrumb__item\"}>\n {idx > 0 && (\n <span className={\"ods-breadcrumb__separator\"} aria-hidden=\"true\">\n {separator}\n </span>\n )}\n <BreadcrumbItem item={item} isCurrent={isCurrent} />\n </li>\n );\n })}\n </ol>\n </nav>\n );\n}\n","\"use client\";\nimport { motion } from \"framer-motion\";\nimport { type ButtonHTMLAttributes, type ReactNode, useRef } from \"react\";\nimport { useButton } from \"react-aria\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface ButtonProps\n extends Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n \"onDrag\" | \"onDragStart\" | \"onDragEnd\" | \"onAnimationStart\"\n > {\n variant?: \"primary\" | \"secondary\" | \"ghost\" | \"danger\" | \"icon\";\n size?: \"sm\" | \"md\" | \"lg\";\n loading?: boolean;\n leftIcon?: ReactNode;\n rightIcon?: ReactNode;\n fullWidth?: boolean;\n children?: ReactNode;\n}\n\nexport function Button({\n variant = \"primary\",\n size = \"md\",\n loading = false,\n disabled = false,\n leftIcon,\n rightIcon,\n fullWidth = false,\n className,\n children,\n ...props\n}: ButtonProps) {\n const ref = useRef<HTMLButtonElement>(null);\n const isDisabled = disabled || loading;\n\n const { buttonProps } = useButton({ isDisabled, onPress: props.onClick as any }, ref);\n\n // Strip Framer-conflicting props from React Aria output\n const { onDrag, onDragStart, onDragEnd, onAnimationStart, ...safeButtonProps } =\n buttonProps as any;\n\n return (\n <motion.button\n {...safeButtonProps}\n ref={ref}\n className={cn(\n \"ods-btn\",\n `ods-btn--${variant}`,\n `ods-btn--${size}`,\n loading && \"ods-btn--loading\",\n fullWidth && \"ods-btn--full\",\n className,\n )}\n data-loading={loading || undefined}\n whileTap={isDisabled ? undefined : { scale: 0.97 }}\n transition={{ duration: 0.1 }}\n >\n {/* Content layer — hidden behind spinner when loading */}\n <span className=\"ods-btn__content\" aria-hidden={loading}>\n {leftIcon && <span className=\"ods-btn__icon ods-btn__icon--left\">{leftIcon}</span>}\n {children && <span className=\"ods-btn__label\">{children}</span>}\n {rightIcon && <span className=\"ods-btn__icon ods-btn__icon--right\">{rightIcon}</span>}\n </span>\n {/* Spinner overlay — absolutely positioned, replaces content when loading */}\n {loading && (\n <span className=\"ods-btn__spinner\" role=\"status\" aria-label=\"Loading\">\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeDasharray=\"32\"\n strokeDashoffset=\"12\"\n />\n </svg>\n </span>\n )}\n </motion.button>\n );\n}\n","\"use client\";\nimport { useMemo, useState } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport type DateRange = { start: Date | null; end: Date | null };\n\nexport interface CalendarProps {\n mode?: \"single\" | \"range\";\n value?: Date | DateRange | null;\n onChange?: (value: Date | DateRange | null) => void;\n month?: Date; // controlled visible month (1st of month)\n onMonthChange?: (month: Date) => void;\n minDate?: Date;\n maxDate?: Date;\n weekStartsOn?: 0 | 1; // 0 = Sun, 1 = Mon\n className?: string;\n}\n\nconst MONTHS = [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n];\n\nconst sameDay = (a: Date | null, b: Date | null) =>\n !!a &&\n !!b &&\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate();\n\nconst startOfMonth = (d: Date) => new Date(d.getFullYear(), d.getMonth(), 1);\nconst addMonths = (d: Date, n: number) => new Date(d.getFullYear(), d.getMonth() + n, 1);\nconst isBefore = (a: Date, b: Date) => a.getTime() < b.getTime();\n\nexport function Calendar({\n mode = \"single\",\n value = null,\n onChange,\n month,\n onMonthChange,\n minDate,\n maxDate,\n weekStartsOn = 0,\n className,\n}: CalendarProps) {\n const [internalMonth, setInternalMonth] = useState(() => startOfMonth(month ?? new Date()));\n const visibleMonth = month ?? internalMonth;\n const setMonth = (d: Date) => {\n onMonthChange ? onMonthChange(d) : setInternalMonth(d);\n };\n\n const today = new Date();\n const single = mode === \"single\" ? (value as Date | null) : null;\n const range =\n mode === \"range\"\n ? ((value as DateRange | null) ?? { start: null, end: null })\n : { start: null, end: null };\n\n const dayNames = useMemo(() => {\n const all = [\"S\", \"M\", \"T\", \"W\", \"T\", \"F\", \"S\"];\n return weekStartsOn === 1 ? [...all.slice(1), all[0]] : all;\n }, [weekStartsOn]);\n\n // Build 6×7 grid for the visible month\n const cells = useMemo(() => {\n const first = startOfMonth(visibleMonth);\n const startWeekday = first.getDay();\n const offset = (startWeekday - weekStartsOn + 7) % 7;\n const start = new Date(first);\n start.setDate(start.getDate() - offset);\n const out: { date: Date; outside: boolean }[] = [];\n for (let i = 0; i < 42; i++) {\n const d = new Date(start);\n d.setDate(start.getDate() + i);\n out.push({ date: d, outside: d.getMonth() !== visibleMonth.getMonth() });\n }\n return out;\n }, [visibleMonth, weekStartsOn]);\n\n const isDisabled = (d: Date) =>\n (minDate &&\n isBefore(d, new Date(minDate.getFullYear(), minDate.getMonth(), minDate.getDate()))) ||\n (maxDate &&\n isBefore(new Date(maxDate.getFullYear(), maxDate.getMonth(), maxDate.getDate()), d));\n\n const inRange = (d: Date) => range.start && range.end && d >= range.start && d <= range.end;\n\n const handleSelect = (d: Date) => {\n if (isDisabled(d)) return;\n if (mode === \"single\") {\n onChange?.(d);\n return;\n }\n if (!range.start || (range.start && range.end)) {\n onChange?.({ start: d, end: null });\n } else if (isBefore(d, range.start)) {\n onChange?.({ start: d, end: range.start });\n } else {\n onChange?.({ start: range.start, end: d });\n }\n };\n\n return (\n <div className={cn(\"ods-calendar\", className)}>\n <div className=\"ods-calendar__head\">\n <button\n type=\"button\"\n className=\"ods-calendar__nav\"\n onClick={() => setMonth(addMonths(visibleMonth, -1))}\n aria-label=\"Previous month\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M9 3 5 7l4 4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n <div className=\"ods-calendar__title\" aria-live=\"polite\">\n {MONTHS[visibleMonth.getMonth()]} {visibleMonth.getFullYear()}\n </div>\n <button\n type=\"button\"\n className=\"ods-calendar__nav\"\n onClick={() => setMonth(addMonths(visibleMonth, 1))}\n aria-label=\"Next month\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M5 3l4 4-4 4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n </div>\n <div className=\"ods-calendar__dow\">\n {dayNames.map((n, i) => (\n <span key={i} className=\"ods-calendar__dow-cell\">\n {n}\n </span>\n ))}\n </div>\n <div className=\"ods-calendar__grid\" role=\"grid\">\n {cells.map(({ date, outside }, i) => {\n const isToday = sameDay(date, today);\n const isSelected =\n mode === \"single\"\n ? sameDay(date, single)\n : sameDay(date, range.start) || sameDay(date, range.end);\n const isStart = sameDay(date, range.start);\n const isEnd = sameDay(date, range.end);\n const inside = inRange(date);\n const disabled = !!isDisabled(date);\n return (\n <button\n key={i}\n type=\"button\"\n role=\"gridcell\"\n disabled={disabled}\n onClick={() => handleSelect(date)}\n className={cn(\n \"ods-calendar__cell\",\n outside && \"ods-calendar__cell--outside\",\n isToday && \"ods-calendar__cell--today\",\n isSelected && \"ods-calendar__cell--selected\",\n inside && !isSelected && \"ods-calendar__cell--inrange\",\n isStart && \"ods-calendar__cell--start\",\n isEnd && \"ods-calendar__cell--end\",\n disabled && \"ods-calendar__cell--disabled\",\n )}\n aria-selected={isSelected}\n aria-current={isToday ? \"date\" : undefined}\n >\n {date.getDate()}\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface CalloutProps {\n variant?: \"tip\" | \"info\" | \"warning\" | \"danger\" | \"success\";\n title?: ReactNode;\n icon?: ReactNode;\n children: ReactNode;\n className?: string;\n}\n\nexport function Callout({ variant = \"tip\", title, icon, children, className }: CalloutProps) {\n return (\n <div className={cn(\"ods-callout\", `ods-callout--${variant}`, className)}>\n {icon && (\n <span className=\"ods-callout__icon\" aria-hidden=\"true\">\n {icon}\n </span>\n )}\n <div className=\"ods-callout__body\">\n {title && <div className=\"ods-callout__title\">{title}</div>}\n <div className=\"ods-callout__content\">{children}</div>\n </div>\n </div>\n );\n}\n","\"use client\";\nimport { motion } from \"framer-motion\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface CardProps\n extends Omit<\n HTMLAttributes<HTMLDivElement>,\n \"onDrag\" | \"onDragStart\" | \"onDragEnd\" | \"onAnimationStart\"\n > {\n variant?: \"default\" | \"glass\" | \"elevated\" | \"selected\" | \"outlined\";\n padding?: \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n radius?: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\";\n hoverable?: boolean;\n children: ReactNode;\n className?: string;\n}\n\nexport function Card({\n variant = \"default\",\n padding = \"md\",\n radius = \"xl\",\n hoverable = false,\n onClick,\n children,\n className,\n ...props\n}: CardProps) {\n const { onDrag, onDragStart, onDragEnd, onAnimationStart, ...safeProps } = props as any;\n const isInteractive = Boolean(onClick);\n\n return (\n <motion.div\n {...safeProps}\n onClick={onClick}\n className={cn(\n \"ods-card\",\n `ods-card--${variant}`,\n `ods-card--pad-${padding}`,\n `ods-card--radius-${radius}`,\n (hoverable || isInteractive) && \"ods-card--hoverable\",\n isInteractive && \"ods-card--clickable\",\n className,\n )}\n whileHover={\n hoverable || isInteractive ? { y: -2, transition: { duration: 0.15 } } : undefined\n }\n whileTap={isInteractive ? { scale: 0.99 } : undefined}\n role={isInteractive ? \"button\" : undefined}\n tabIndex={isInteractive ? 0 : undefined}\n >\n {children}\n </motion.div>\n );\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface ChatBubbleProps {\n variant?: \"user\" | \"bot\" | \"system\";\n author?: ReactNode;\n timestamp?: ReactNode;\n avatar?: ReactNode;\n initial?: ReactNode;\n hideAvatar?: boolean;\n children: ReactNode;\n className?: string;\n}\n\nexport function ChatBubble({\n variant = \"bot\",\n author,\n timestamp,\n avatar,\n initial,\n hideAvatar = false,\n children,\n className,\n}: ChatBubbleProps) {\n const isUser = variant === \"user\";\n return (\n <div className={cn(\"ods-chat\", `ods-chat--${variant}`, className)}>\n {!hideAvatar && (\n <div className=\"ods-chat__avatar\" aria-hidden=\"true\">\n {avatar ?? (\n <span>\n {initial ??\n (typeof author === \"string\" ? author.charAt(0).toUpperCase() : isUser ? \"U\" : \"AI\")}\n </span>\n )}\n </div>\n )}\n <div className=\"ods-chat__bubble\">\n <div className=\"ods-chat__body\">{children}</div>\n {(author || timestamp) && (\n <div className=\"ods-chat__meta\">\n {author && <span className=\"ods-chat__author\">{author}</span>}\n {timestamp && <span className=\"ods-chat__time\">{timestamp}</span>}\n </div>\n )}\n </div>\n </div>\n );\n}\n","\"use client\";\nimport { type InputHTMLAttributes, type ReactNode, useRef } from \"react\";\nimport { useCheckbox } from \"react-aria\";\nimport { useToggleState } from \"react-stately\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface CheckboxProps\n extends Omit<InputHTMLAttributes<HTMLInputElement>, \"onChange\" | \"size\"> {\n checked?: boolean;\n defaultChecked?: boolean;\n onChange?: (isSelected: boolean) => void;\n indeterminate?: boolean;\n disabled?: boolean;\n label?: string | ReactNode;\n size?: \"sm\" | \"md\";\n className?: string;\n}\n\nexport function Checkbox({\n checked,\n defaultChecked,\n onChange,\n indeterminate = false,\n disabled = false,\n label,\n size = \"md\",\n className,\n ...props\n}: CheckboxProps) {\n const ref = useRef<HTMLInputElement>(null);\n\n const state = useToggleState({\n isSelected: checked,\n defaultSelected: defaultChecked,\n onChange,\n });\n\n const { inputProps } = useCheckbox(\n {\n isSelected: state.isSelected,\n isIndeterminate: indeterminate,\n isDisabled: disabled,\n onChange,\n \"aria-label\": typeof label === \"string\" ? label : undefined,\n },\n state,\n ref,\n );\n\n const isChecked = state.isSelected;\n\n return (\n <label\n className={cn(\n \"ods-checkbox\",\n `ods-checkbox--${size}`,\n disabled && \"ods-checkbox--disabled\",\n className,\n )}\n >\n <input {...inputProps} ref={ref} className={\"ods-checkbox__input\"} />\n <div\n className={cn(\n \"ods-checkbox__box\",\n isChecked && !indeterminate && \"ods-checkbox__box--checked\",\n indeterminate && \"ods-checkbox__box--indeterminate\",\n )}\n aria-hidden=\"true\"\n >\n {indeterminate ? (\n <svg\n className={\"ods-checkbox__dash\"}\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <line\n x1=\"2\"\n y1=\"6\"\n x2=\"10\"\n y2=\"6\"\n stroke=\"white\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n ) : (\n <svg\n className={cn(\n \"ods-checkbox__checkmark\",\n isChecked && \"ods-checkbox__checkmark--checked\",\n )}\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M2 6L5 9L10 3\"\n stroke=\"white\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </div>\n {label && <span className={\"ods-checkbox__label\"}>{label}</span>}\n </label>\n );\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport React, {SetStateAction, useCallback, useEffect, useReducer, useRef, useState} from 'react';\n\n// Use the earliest effect possible to reset the ref below.\nconst useEarlyEffect: typeof React.useLayoutEffect = typeof document !== 'undefined'\n ? React['useInsertionEffect'] ?? React.useLayoutEffect\n : () => {};\n\nexport function useControlledState<T, C = T>(value: Exclude<T, undefined>, defaultValue: Exclude<T, undefined> | undefined, onChange?: (v: C, ...args: any[]) => void): [T, (value: SetStateAction<T>, ...args: any[]) => void];\nexport function useControlledState<T, C = T>(value: Exclude<T, undefined> | undefined, defaultValue: Exclude<T, undefined>, onChange?: (v: C, ...args: any[]) => void): [T, (value: SetStateAction<T>, ...args: any[]) => void];\nexport function useControlledState<T, C = T>(value: T, defaultValue: T, onChange?: (v: C, ...args: any[]) => void): [T, (value: SetStateAction<T>, ...args: any[]) => void] {\n // Store the value in both state and a ref. The state value will only be used when uncontrolled.\n // The ref is used to track the most current value, which is passed to the function setState callback.\n let [stateValue, setStateValue] = useState(value || defaultValue);\n let valueRef = useRef(stateValue);\n\n let isControlledRef = useRef(value !== undefined);\n let isControlled = value !== undefined;\n useEffect(() => {\n let wasControlled = isControlledRef.current;\n if (wasControlled !== isControlled && process.env.NODE_ENV !== 'production') {\n console.warn(`WARN: A component changed from ${wasControlled ? 'controlled' : 'uncontrolled'} to ${isControlled ? 'controlled' : 'uncontrolled'}.`);\n }\n isControlledRef.current = isControlled;\n }, [isControlled]);\n\n // After each render, update the ref to the current value.\n // This ensures that the setState callback argument is reset.\n // Note: the effect should not have any dependencies so that controlled values always reset.\n let currentValue = isControlled ? value : stateValue;\n useEarlyEffect(() => {\n valueRef.current = currentValue;\n });\n\n let [, forceUpdate] = useReducer(() => ({}), {});\n let setValue = useCallback((value: SetStateAction<T>, ...args: any[]) => {\n // @ts-ignore - TS doesn't know that T cannot be a function.\n let newValue = typeof value === 'function' ? value(valueRef.current) : value;\n if (!Object.is(valueRef.current, newValue)) {\n // Update the ref so that the next setState callback has the most recent value.\n valueRef.current = newValue;\n\n setStateValue(newValue);\n\n // Always trigger a re-render, even when controlled, so that the layout effect above runs to reset the value.\n forceUpdate();\n\n // Trigger onChange. Note that if setState is called multiple times in a single event,\n // onChange will be called for each one instead of only once.\n onChange?.(newValue, ...args);\n }\n }, [onChange]);\n\n return [currentValue, setValue];\n}\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {Context, createContext, useContext, useEffect, useMemo, useRef, useState} from 'react';\nimport {Validation, ValidationErrors, ValidationFunction, ValidationResult} from '@react-types/shared';\n\nexport const VALID_VALIDITY_STATE: ValidityState = {\n badInput: false,\n customError: false,\n patternMismatch: false,\n rangeOverflow: false,\n rangeUnderflow: false,\n stepMismatch: false,\n tooLong: false,\n tooShort: false,\n typeMismatch: false,\n valueMissing: false,\n valid: true\n};\n\nconst CUSTOM_VALIDITY_STATE: ValidityState = {\n ...VALID_VALIDITY_STATE,\n customError: true,\n valid: false\n};\n\nexport const DEFAULT_VALIDATION_RESULT: ValidationResult = {\n isInvalid: false,\n validationDetails: VALID_VALIDITY_STATE,\n validationErrors: []\n};\n\nexport const FormValidationContext: Context<ValidationErrors> = createContext<ValidationErrors>({});\n\n// Private props that we pass from useFormValidationState to children.\n// Ideally we'd use a Symbol for this, but React doesn't support them: https://github.com/facebook/react/issues/7552\n// This needs to be stable across server and client module evaluation for SSR hydration.\nexport const privateValidationStateProp: string = '__reactAriaFormValidationState';\n\ninterface FormValidationProps<T> extends Validation<T> {\n builtinValidation?: ValidationResult,\n name?: string | string[],\n value: T | null\n}\n\nexport interface FormValidationState {\n /** Realtime validation results, updated as the user edits the value. */\n realtimeValidation: ValidationResult,\n /** Currently displayed validation results, updated when the user commits their changes. */\n displayValidation: ValidationResult,\n /** Updates the current validation result. Not displayed to the user until `commitValidation` is called. */\n updateValidation(result: ValidationResult): void,\n /** Resets the displayed validation state to valid when the user resets the form. */\n resetValidation(): void,\n /** Commits the realtime validation so it is displayed to the user. */\n commitValidation(): void\n}\n\nexport function useFormValidationState<T>(props: FormValidationProps<T>): FormValidationState {\n // Private prop for parent components to pass state to children.\n if (props[privateValidationStateProp]) {\n let {realtimeValidation, displayValidation, updateValidation, resetValidation, commitValidation} = props[privateValidationStateProp] as FormValidationState;\n return {realtimeValidation, displayValidation, updateValidation, resetValidation, commitValidation};\n }\n\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return useFormValidationStateImpl(props);\n}\n\nfunction useFormValidationStateImpl<T>(props: FormValidationProps<T>): FormValidationState {\n let {isInvalid, validationState, name, value, builtinValidation, validate, validationBehavior = 'aria'} = props;\n\n // backward compatibility.\n if (validationState) {\n isInvalid ||= validationState === 'invalid';\n }\n\n // If the isInvalid prop is controlled, update validation result in realtime.\n let controlledError: ValidationResult | null = isInvalid !== undefined ? {\n isInvalid,\n validationErrors: [],\n validationDetails: CUSTOM_VALIDITY_STATE\n } : null;\n\n // Perform custom client side validation.\n let clientError: ValidationResult | null = useMemo(() => {\n if (!validate || value == null) {\n return null;\n }\n let validateErrors = runValidate(validate, value);\n return getValidationResult(validateErrors);\n }, [validate, value]);\n\n if (builtinValidation?.validationDetails.valid) {\n builtinValidation = undefined;\n }\n\n // Get relevant server errors from the form.\n let serverErrors = useContext(FormValidationContext);\n let serverErrorMessages = useMemo(() => {\n if (name) {\n return Array.isArray(name) ? name.flatMap(name => asArray(serverErrors[name])) : asArray(serverErrors[name]);\n }\n return [];\n }, [serverErrors, name]);\n\n // Show server errors when the form gets a new value, and clear when the user changes the value.\n let [lastServerErrors, setLastServerErrors] = useState(serverErrors);\n let [isServerErrorCleared, setServerErrorCleared] = useState(false);\n if (serverErrors !== lastServerErrors) {\n setLastServerErrors(serverErrors);\n setServerErrorCleared(false);\n }\n\n let serverError: ValidationResult | null = useMemo(() =>\n getValidationResult(isServerErrorCleared ? [] : serverErrorMessages),\n [isServerErrorCleared, serverErrorMessages]\n );\n\n // Track the next validation state in a ref until commitValidation is called.\n let nextValidation = useRef(DEFAULT_VALIDATION_RESULT);\n let [currentValidity, setCurrentValidity] = useState(DEFAULT_VALIDATION_RESULT);\n\n let lastError = useRef(DEFAULT_VALIDATION_RESULT);\n let commitValidation = () => {\n if (!commitQueued) {\n return;\n }\n\n setCommitQueued(false);\n let error = clientError || builtinValidation || nextValidation.current;\n if (!isEqualValidation(error, lastError.current)) {\n lastError.current = error;\n setCurrentValidity(error);\n }\n };\n\n let [commitQueued, setCommitQueued] = useState(false);\n useEffect(commitValidation);\n\n // realtimeValidation is used to update the native input element's state based on custom validation logic.\n // displayValidation is the currently displayed validation state that the user sees (e.g. on input change/form submit).\n // With validationBehavior=\"aria\", all errors are displayed in realtime rather than on submit.\n let realtimeValidation = controlledError || serverError || clientError || builtinValidation || DEFAULT_VALIDATION_RESULT;\n let displayValidation = validationBehavior === 'native'\n ? controlledError || serverError || currentValidity\n : controlledError || serverError || clientError || builtinValidation || currentValidity;\n\n return {\n realtimeValidation,\n displayValidation,\n updateValidation(value) {\n // If validationBehavior is 'aria', update in realtime. Otherwise, store in a ref until commit.\n if (validationBehavior === 'aria' && !isEqualValidation(currentValidity, value)) {\n setCurrentValidity(value);\n } else {\n nextValidation.current = value;\n }\n },\n resetValidation() {\n // Update the currently displayed validation state to valid on form reset,\n // even if the native validity says it isn't. It'll show again on the next form submit.\n let error = DEFAULT_VALIDATION_RESULT;\n if (!isEqualValidation(error, lastError.current)) {\n lastError.current = error;\n setCurrentValidity(error);\n }\n\n // Do not commit validation after the next render. This avoids a condition where\n // useSelect calls commitValidation inside an onReset handler.\n if (validationBehavior === 'native') {\n setCommitQueued(false);\n }\n\n setServerErrorCleared(true);\n },\n commitValidation() {\n // Commit validation state so the user sees it on blur/change/submit. Also clear any server errors.\n // Wait until after the next render to commit so that the latest value has been validated.\n if (validationBehavior === 'native') {\n setCommitQueued(true);\n }\n setServerErrorCleared(true);\n }\n };\n}\n\nfunction asArray<T>(v: T | T[]): T[] {\n if (!v) {\n return [];\n }\n\n return Array.isArray(v) ? v : [v];\n}\n\nfunction runValidate<T>(validate: ValidationFunction<T>, value: T): string[] {\n if (typeof validate === 'function') {\n let e = validate(value);\n if (e && typeof e !== 'boolean') {\n return asArray(e);\n }\n }\n\n return [];\n}\n\nfunction getValidationResult(errors: string[]): ValidationResult | null {\n return errors.length ? {\n isInvalid: true,\n validationErrors: errors,\n validationDetails: CUSTOM_VALIDITY_STATE\n } : null;\n}\n\nfunction isEqualValidation(a: ValidationResult | null, b: ValidationResult | null): boolean {\n if (a === b) {\n return true;\n }\n\n return !!a && !!b\n && a.isInvalid === b.isInvalid\n && a.validationErrors.length === b.validationErrors.length\n && a.validationErrors.every((a, i) => a === b.validationErrors[i])\n && Object.entries(a.validationDetails).every(([k, v]) => b.validationDetails[k] === v);\n}\n\nexport function mergeValidation(...results: ValidationResult[]): ValidationResult {\n let errors = new Set<string>();\n let isInvalid = false;\n let validationDetails = {\n ...VALID_VALIDITY_STATE\n };\n\n for (let v of results) {\n for (let e of v.validationErrors) {\n errors.add(e);\n }\n\n // Only these properties apply for checkboxes.\n isInvalid ||= v.isInvalid;\n for (let key in validationDetails) {\n validationDetails[key] ||= v.validationDetails[key];\n }\n }\n\n validationDetails.valid = !isInvalid;\n return {\n isInvalid,\n validationErrors: [...errors],\n validationDetails\n };\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport type {Collection, Node} from '@react-types/shared';\n\nexport function getChildNodes<T>(node: Node<T>, collection: Collection<Node<T>>): Iterable<Node<T>> {\n // New API: call collection.getChildren with the node key.\n if (typeof collection.getChildren === 'function') {\n return collection.getChildren(node.key);\n }\n\n // Old API: access childNodes directly.\n return node.childNodes;\n}\n\nexport function getFirstItem<T>(iterable: Iterable<T>): T | undefined {\n return getNthItem(iterable, 0);\n}\n\nexport function getNthItem<T>(iterable: Iterable<T>, index: number): T | undefined {\n if (index < 0) {\n return undefined;\n }\n\n let i = 0;\n for (let item of iterable) {\n if (i === index) {\n return item;\n }\n\n i++;\n }\n}\n\nexport function getLastItem<T>(iterable: Iterable<T>): T | undefined {\n let lastItem: T | undefined = undefined;\n for (let value of iterable) {\n lastItem = value;\n }\n\n return lastItem;\n}\n\nexport function compareNodeOrder<T>(collection: Collection<Node<T>>, a: Node<T>, b: Node<T>): number {\n // If the two nodes have the same parent, compare their indices.\n if (a.parentKey === b.parentKey) {\n return a.index - b.index;\n }\n\n // Otherwise, collect all of the ancestors from each node, and find the first one that doesn't match starting from the root.\n // Include the base nodes in case we are comparing nodes of different levels so that we can compare the higher node to the lower level node's\n // ancestor of the same level\n let aAncestors = [...getAncestors(collection, a), a];\n let bAncestors = [...getAncestors(collection, b), b];\n let firstNonMatchingAncestor = aAncestors.slice(0, bAncestors.length).findIndex((a, i) => a !== bAncestors[i]);\n if (firstNonMatchingAncestor !== -1) {\n // Compare the indices of two children within the common ancestor.\n a = aAncestors[firstNonMatchingAncestor];\n b = bAncestors[firstNonMatchingAncestor];\n return a.index - b.index;\n }\n\n // If there isn't a non matching ancestor, we might be in a case where one of the nodes is the ancestor of the other.\n if (aAncestors.findIndex(node => node === b) >= 0) {\n return 1;\n } else if (bAncestors.findIndex(node => node === a) >= 0) {\n return -1;\n }\n\n // 🤷\n return -1;\n}\n\nfunction getAncestors<T>(collection: Collection<Node<T>>, node: Node<T>): Node<T>[] {\n let parents: Node<T>[] = [];\n\n let currNode: Node<T> | null = node;\n while (currNode?.parentKey != null) {\n currNode = collection.getItem(currNode.parentKey);\n if (currNode) {\n parents.unshift(currNode);\n }\n }\n\n return parents;\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {Collection, Key, Node} from '@react-types/shared';\n\nexport class ListCollection<T> implements Collection<Node<T>> {\n private keyMap: Map<Key, Node<T>> = new Map();\n private iterable: Iterable<Node<T>>;\n private firstKey: Key | null = null;\n private lastKey: Key | null = null;\n private _size: number;\n\n constructor(nodes: Iterable<Node<T>>) {\n this.iterable = nodes;\n\n let visit = (node: Node<T>) => {\n this.keyMap.set(node.key, node);\n\n if (node.childNodes && node.type === 'section') {\n for (let child of node.childNodes) {\n visit(child);\n }\n }\n };\n\n for (let node of nodes) {\n visit(node);\n }\n\n let last: Node<T> | null = null;\n let index = 0;\n let size = 0;\n for (let [key, node] of this.keyMap) {\n if (last) {\n last.nextKey = key;\n node.prevKey = last.key;\n } else {\n this.firstKey = key;\n node.prevKey = undefined;\n }\n\n if (node.type === 'item') {\n node.index = index++;\n }\n\n // Only count sections and items when determining size so that\n // loaders and separators in RAC/S2 don't influence the emptyState determination\n if (node.type === 'section' || node.type === 'item') {\n size++;\n }\n\n last = node;\n\n // Set nextKey as undefined since this might be the last node\n // If it isn't the last node, last.nextKey will properly set at start of new loop\n last.nextKey = undefined;\n }\n this._size = size;\n this.lastKey = last?.key ?? null;\n }\n\n *[Symbol.iterator](): IterableIterator<Node<T>> {\n yield* this.iterable;\n }\n\n get size(): number {\n return this._size;\n }\n\n getKeys(): IterableIterator<Key> {\n return this.keyMap.keys();\n }\n\n getKeyBefore(key: Key): Key | null {\n let node = this.keyMap.get(key);\n return node ? node.prevKey ?? null : null;\n }\n\n getKeyAfter(key: Key): Key | null {\n let node = this.keyMap.get(key);\n return node ? node.nextKey ?? null : null;\n }\n\n getFirstKey(): Key | null {\n return this.firstKey;\n }\n\n getLastKey(): Key | null {\n return this.lastKey;\n }\n\n getItem(key: Key): Node<T> | null {\n return this.keyMap.get(key) ?? null;\n }\n\n at(idx: number): Node<T> | null {\n const keys = [...this.getKeys()];\n return this.getItem(keys[idx]);\n }\n\n getChildren(key: Key): Iterable<Node<T>> {\n let node = this.keyMap.get(key);\n return node?.childNodes || [];\n }\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {Key} from '@react-types/shared';\n\n/**\n * A Selection is a special Set containing Keys, which also has an anchor\n * and current selected key for use when range selecting.\n */\nexport class Selection extends Set<Key> {\n anchorKey: Key | null;\n currentKey: Key | null;\n\n constructor(keys?: Iterable<Key> | Selection, anchorKey?: Key | null, currentKey?: Key | null) {\n super(keys);\n if (keys instanceof Selection) {\n this.anchorKey = anchorKey ?? keys.anchorKey;\n this.currentKey = currentKey ?? keys.currentKey;\n } else {\n this.anchorKey = anchorKey ?? null;\n this.currentKey = currentKey ?? null;\n }\n }\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {DisabledBehavior, FocusStrategy, Key, MultipleSelection, SelectionBehavior, SelectionMode} from '@react-types/shared';\nimport {MultipleSelectionState} from './types';\nimport {Selection} from './Selection';\nimport {useControlledState} from '../utils/useControlledState';\nimport {useEffect, useMemo, useRef, useState} from 'react';\n\nfunction equalSets(setA, setB) {\n if (setA.size !== setB.size) {\n return false;\n }\n\n for (let item of setA) {\n if (!setB.has(item)) {\n return false;\n }\n }\n\n return true;\n}\n\nexport interface MultipleSelectionStateProps extends MultipleSelection {\n /**\n * How multiple selection should behave in the collection.\n * @default 'toggle'\n */\n selectionBehavior?: SelectionBehavior,\n /** Whether onSelectionChange should fire even if the new set of keys is the same as the last. */\n allowDuplicateSelectionEvents?: boolean,\n /**\n * Whether `disabledKeys` applies to all interactions, or only selection.\n * @default 'all'\n */\n disabledBehavior?: DisabledBehavior\n}\n\n/**\n * Manages state for multiple selection and focus in a collection.\n */\nexport function useMultipleSelectionState(props: MultipleSelectionStateProps): MultipleSelectionState {\n let {\n selectionMode = 'none' as SelectionMode,\n disallowEmptySelection = false,\n allowDuplicateSelectionEvents,\n selectionBehavior: selectionBehaviorProp = 'toggle',\n disabledBehavior = 'all'\n } = props;\n\n // We want synchronous updates to `isFocused` and `focusedKey` after their setters are called.\n // But we also need to trigger a react re-render. So, we have both a ref (sync) and state (async).\n let isFocusedRef = useRef(false);\n let [, setFocused] = useState(false);\n let focusedKeyRef = useRef<Key | null>(null);\n let childFocusStrategyRef = useRef<FocusStrategy | null>(null);\n let [, setFocusedKey] = useState<Key | null>(null);\n let selectedKeysProp = useMemo(() => convertSelection(props.selectedKeys), [props.selectedKeys]);\n let defaultSelectedKeys = useMemo(() => convertSelection(props.defaultSelectedKeys, new Selection()), [props.defaultSelectedKeys]);\n let [selectedKeys, setSelectedKeys] = useControlledState(\n selectedKeysProp,\n defaultSelectedKeys!,\n props.onSelectionChange\n );\n let disabledKeysProp = useMemo(() =>\n props.disabledKeys ? new Set(props.disabledKeys) : new Set<Key>()\n , [props.disabledKeys]);\n let [selectionBehavior, setSelectionBehavior] = useState(selectionBehaviorProp);\n\n // If the selectionBehavior prop is set to replace, but the current state is toggle (e.g. due to long press\n // to enter selection mode on touch), and the selection becomes empty, reset the selection behavior.\n if (selectionBehaviorProp === 'replace' && selectionBehavior === 'toggle' && typeof selectedKeys === 'object' && selectedKeys.size === 0) {\n setSelectionBehavior('replace');\n }\n\n // If the selectionBehavior prop changes, update the state as well.\n let lastSelectionBehavior = useRef(selectionBehaviorProp);\n useEffect(() => {\n if (selectionBehaviorProp !== lastSelectionBehavior.current) {\n setSelectionBehavior(selectionBehaviorProp);\n lastSelectionBehavior.current = selectionBehaviorProp;\n }\n }, [selectionBehaviorProp]);\n\n return {\n selectionMode,\n disallowEmptySelection,\n selectionBehavior,\n setSelectionBehavior,\n get isFocused() {\n return isFocusedRef.current;\n },\n setFocused(f) {\n isFocusedRef.current = f;\n setFocused(f);\n },\n get focusedKey() {\n return focusedKeyRef.current;\n },\n get childFocusStrategy() {\n return childFocusStrategyRef.current;\n },\n setFocusedKey(k, childFocusStrategy = 'first') {\n focusedKeyRef.current = k;\n childFocusStrategyRef.current = childFocusStrategy;\n setFocusedKey(k);\n },\n selectedKeys,\n setSelectedKeys(keys) {\n if (allowDuplicateSelectionEvents || !equalSets(keys, selectedKeys)) {\n setSelectedKeys(keys);\n }\n },\n disabledKeys: disabledKeysProp,\n disabledBehavior\n };\n}\n\nfunction convertSelection(selection: 'all' | Iterable<Key> | null | undefined, defaultValue?: Selection): 'all' | Set<Key> | undefined {\n if (!selection) {\n return defaultValue;\n }\n\n return selection === 'all'\n ? 'all'\n : new Selection(selection);\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {\n Collection, DisabledBehavior,\n FocusStrategy,\n Selection as ISelection,\n Key,\n LayoutDelegate,\n LongPressEvent,\n Node,\n PressEvent,\n SelectionBehavior,\n SelectionMode\n} from '@react-types/shared';\nimport {compareNodeOrder, getChildNodes, getFirstItem} from '../collections/getChildNodes';\nimport {MultipleSelectionManager, MultipleSelectionState} from './types';\nimport {Selection} from './Selection';\n\ninterface SelectionManagerOptions {\n allowsCellSelection?: boolean,\n layoutDelegate?: LayoutDelegate,\n fullCollection?: Collection<Node<unknown>>\n}\n\n/**\n * An interface for reading and updating multiple selection state.\n */\nexport class SelectionManager implements MultipleSelectionManager {\n collection: Collection<Node<unknown>>;\n private state: MultipleSelectionState;\n private allowsCellSelection: boolean;\n private _isSelectAll: boolean | null;\n private layoutDelegate: LayoutDelegate | null;\n private fullCollection: Collection<Node<unknown>> | null;\n\n constructor(collection: Collection<Node<unknown>>, state: MultipleSelectionState, options?: SelectionManagerOptions) {\n this.collection = collection;\n this.state = state;\n this.allowsCellSelection = options?.allowsCellSelection ?? false;\n this._isSelectAll = null;\n this.layoutDelegate = options?.layoutDelegate || null;\n this.fullCollection = options?.fullCollection || null;\n }\n\n /**\n * The type of selection that is allowed in the collection.\n */\n get selectionMode(): SelectionMode {\n return this.state.selectionMode;\n }\n\n /**\n * Whether the collection allows empty selection.\n */\n get disallowEmptySelection(): boolean {\n return this.state.disallowEmptySelection;\n }\n\n /**\n * The selection behavior for the collection.\n */\n get selectionBehavior(): SelectionBehavior {\n return this.state.selectionBehavior;\n }\n\n /**\n * Sets the selection behavior for the collection.\n */\n setSelectionBehavior(selectionBehavior: SelectionBehavior): void {\n this.state.setSelectionBehavior(selectionBehavior);\n }\n\n /**\n * Whether the collection is currently focused.\n */\n get isFocused(): boolean {\n return this.state.isFocused;\n }\n\n /**\n * Sets whether the collection is focused.\n */\n setFocused(isFocused: boolean): void {\n this.state.setFocused(isFocused);\n }\n\n /**\n * The current focused key in the collection.\n */\n get focusedKey(): Key | null {\n return this.state.focusedKey;\n }\n\n /** Whether the first or last child of the focused key should receive focus. */\n get childFocusStrategy(): FocusStrategy | null {\n return this.state.childFocusStrategy;\n }\n\n /**\n * Sets the focused key.\n */\n setFocusedKey(key: Key | null, childFocusStrategy?: FocusStrategy): void {\n if (key == null || this.collection.getItem(key)) {\n this.state.setFocusedKey(key, childFocusStrategy);\n }\n }\n\n /**\n * The currently selected keys in the collection.\n */\n get selectedKeys(): Set<Key> {\n return this.state.selectedKeys === 'all'\n ? new Set(this.getSelectAllKeys())\n : this.state.selectedKeys;\n }\n\n /**\n * The raw selection value for the collection.\n * Either 'all' for select all, or a set of keys.\n */\n get rawSelection(): ISelection {\n return this.state.selectedKeys;\n }\n\n /**\n * Returns whether a key is selected.\n */\n isSelected(key: Key): boolean {\n if (this.state.selectionMode === 'none') {\n return false;\n }\n\n let mappedKey = this.getKey(key);\n if (mappedKey == null) {\n return false;\n }\n return this.state.selectedKeys === 'all'\n ? this.canSelectItem(mappedKey)\n : this.state.selectedKeys.has(mappedKey);\n }\n\n /**\n * Whether the selection is empty.\n */\n get isEmpty(): boolean {\n return this.state.selectedKeys !== 'all' && this.state.selectedKeys.size === 0;\n }\n\n /**\n * Whether all items in the collection are selected.\n */\n get isSelectAll(): boolean {\n if (this.isEmpty) {\n return false;\n }\n\n if (this.state.selectedKeys === 'all') {\n return true;\n }\n\n if (this._isSelectAll != null) {\n return this._isSelectAll;\n }\n\n let allKeys = this.getSelectAllKeys();\n let selectedKeys = this.state.selectedKeys;\n this._isSelectAll = allKeys.every(k => selectedKeys.has(k));\n return this._isSelectAll;\n }\n\n get firstSelectedKey(): Key | null {\n let first: Node<unknown> | null = null;\n for (let key of this.state.selectedKeys) {\n let item = this.collection.getItem(key);\n if (!first || (item && compareNodeOrder(this.collection, item, first) < 0)) {\n first = item;\n }\n }\n\n return first?.key ?? null;\n }\n\n get lastSelectedKey(): Key | null {\n let last: Node<unknown> | null = null;\n for (let key of this.state.selectedKeys) {\n let item = this.collection.getItem(key);\n if (!last || (item && compareNodeOrder(this.collection, item, last) > 0)) {\n last = item;\n }\n }\n\n return last?.key ?? null;\n }\n\n get disabledKeys(): Set<Key> {\n return this.state.disabledKeys;\n }\n\n get disabledBehavior(): DisabledBehavior {\n return this.state.disabledBehavior;\n }\n\n /**\n * Extends the selection to the given key.\n */\n extendSelection(toKey: Key): void {\n if (this.selectionMode === 'none') {\n return;\n }\n\n if (this.selectionMode === 'single') {\n this.replaceSelection(toKey);\n return;\n }\n\n let mappedToKey = this.getKey(toKey);\n if (mappedToKey == null) {\n return;\n }\n\n let selection: Selection;\n\n // Only select the one key if coming from a select all.\n if (this.state.selectedKeys === 'all') {\n selection = new Selection([mappedToKey], mappedToKey, mappedToKey);\n } else {\n let selectedKeys = this.state.selectedKeys as Selection;\n let anchorKey = selectedKeys.anchorKey ?? mappedToKey;\n selection = new Selection(selectedKeys, anchorKey, mappedToKey);\n for (let key of this.getKeyRange(anchorKey, selectedKeys.currentKey ?? mappedToKey)) {\n selection.delete(key);\n }\n\n for (let key of this.getKeyRange(mappedToKey, anchorKey)) {\n if (this.canSelectItem(key)) {\n selection.add(key);\n }\n }\n }\n\n this.state.setSelectedKeys(selection);\n }\n\n private getKeyRange(from: Key, to: Key) {\n let fromItem = this.collection.getItem(from);\n let toItem = this.collection.getItem(to);\n if (fromItem && toItem) {\n if (compareNodeOrder(this.collection, fromItem, toItem) <= 0) {\n return this.getKeyRangeInternal(from, to);\n }\n\n return this.getKeyRangeInternal(to, from);\n }\n\n return [];\n }\n\n private getKeyRangeInternal(from: Key, to: Key) {\n if (this.layoutDelegate?.getKeyRange) {\n return this.layoutDelegate.getKeyRange(from, to);\n }\n\n let keys: Key[] = [];\n let key: Key | null = from;\n while (key != null) {\n let item = this.collection.getItem(key);\n if (item && (item.type === 'item' || (item.type === 'cell' && this.allowsCellSelection))) {\n keys.push(key);\n }\n\n if (key === to) {\n return keys;\n }\n\n key = this.collection.getKeyAfter(key);\n }\n\n return [];\n }\n\n private getKey(key: Key) {\n let item = this.collection.getItem(key);\n if (!item) {\n // ¯\\_(ツ)_/¯\n return key;\n }\n\n // If cell selection is allowed, just return the key.\n if (item.type === 'cell' && this.allowsCellSelection) {\n return key;\n }\n\n // Find a parent item to select\n while (item && item.type !== 'item' && item.parentKey != null) {\n item = this.collection.getItem(item.parentKey);\n }\n\n if (!item || item.type !== 'item') {\n return null;\n }\n\n return item.key;\n }\n\n /**\n * Toggles whether the given key is selected.\n */\n toggleSelection(key: Key): void {\n if (this.selectionMode === 'none') {\n return;\n }\n\n if (this.selectionMode === 'single' && !this.isSelected(key)) {\n this.replaceSelection(key);\n return;\n }\n\n let mappedKey = this.getKey(key);\n if (mappedKey == null) {\n return;\n }\n\n let keys = new Selection(this.state.selectedKeys === 'all' ? this.getSelectAllKeys() : this.state.selectedKeys);\n if (keys.has(mappedKey)) {\n keys.delete(mappedKey);\n // TODO: move anchor to last selected key...\n // Does `current` need to move here too?\n } else if (this.canSelectItem(mappedKey)) {\n keys.add(mappedKey);\n keys.anchorKey = mappedKey;\n keys.currentKey = mappedKey;\n }\n\n if (this.disallowEmptySelection && keys.size === 0) {\n return;\n }\n\n this.state.setSelectedKeys(keys);\n }\n\n /**\n * Replaces the selection with only the given key.\n */\n replaceSelection(key: Key): void {\n if (this.selectionMode === 'none') {\n return;\n }\n\n let mappedKey = this.getKey(key);\n if (mappedKey == null) {\n return;\n }\n\n let selection = this.canSelectItem(mappedKey)\n ? new Selection([mappedKey], mappedKey, mappedKey)\n : new Selection();\n\n this.state.setSelectedKeys(selection);\n }\n\n /**\n * Replaces the selection with the given keys.\n */\n setSelectedKeys(keys: Iterable<Key>): void {\n if (this.selectionMode === 'none') {\n return;\n }\n\n let selection = new Selection();\n for (let key of keys) {\n let mappedKey = this.getKey(key);\n if (mappedKey != null) {\n selection.add(mappedKey);\n if (this.selectionMode === 'single') {\n break;\n }\n }\n }\n\n this.state.setSelectedKeys(selection);\n }\n\n private getSelectAllKeys() {\n // Use the full (unfiltered) collection when available so that materializing\n // the 'all' selection includes items that are currently filtered out (e.g. by Autocomplete).\n let collection = this.fullCollection ?? this.collection;\n let keys: Key[] = [];\n let addKeys = (key: Key | null) => {\n while (key != null) {\n if (this.canSelectItemIn(key, collection)) {\n let item = collection.getItem(key);\n if (item?.type === 'item') {\n keys.push(key);\n }\n\n // Add child keys. If cell selection is allowed, then include item children too.\n if (item?.hasChildNodes && (this.allowsCellSelection || item.type !== 'item')) {\n addKeys(getFirstItem(getChildNodes(item, collection))?.key ?? null);\n }\n }\n\n key = collection.getKeyAfter(key);\n }\n };\n\n addKeys(collection.getFirstKey());\n return keys;\n }\n\n /**\n * Selects all items in the collection.\n */\n selectAll(): void {\n if (!this.isSelectAll && this.selectionMode === 'multiple') {\n this.state.setSelectedKeys('all');\n }\n }\n\n /**\n * Removes all keys from the selection.\n */\n clearSelection(): void {\n if (!this.disallowEmptySelection && (this.state.selectedKeys === 'all' || this.state.selectedKeys.size > 0)) {\n this.state.setSelectedKeys(new Selection());\n }\n }\n\n /**\n * Toggles between select all and an empty selection.\n */\n toggleSelectAll(): void {\n if (this.isSelectAll) {\n this.clearSelection();\n } else {\n this.selectAll();\n }\n }\n\n select(key: Key, e?: PressEvent | LongPressEvent | PointerEvent): void {\n if (this.selectionMode === 'none') {\n return;\n }\n\n if (this.selectionMode === 'single') {\n if (this.isSelected(key) && !this.disallowEmptySelection) {\n this.toggleSelection(key);\n } else {\n this.replaceSelection(key);\n }\n } else if (this.selectionBehavior === 'toggle' || (e && (e.pointerType === 'touch' || e.pointerType === 'virtual'))) {\n // if touch or virtual (VO) then we just want to toggle, otherwise it's impossible to multi select because they don't have modifier keys\n this.toggleSelection(key);\n } else {\n this.replaceSelection(key);\n }\n }\n\n /**\n * Returns whether the current selection is equal to the given selection.\n */\n isSelectionEqual(selection: Set<Key>): boolean {\n if (selection === this.state.selectedKeys) {\n return true;\n }\n\n // Check if the set of keys match.\n let selectedKeys = this.selectedKeys;\n if (selection.size !== selectedKeys.size) {\n return false;\n }\n\n for (let key of selection) {\n if (!selectedKeys.has(key)) {\n return false;\n }\n }\n\n for (let key of selectedKeys) {\n if (!selection.has(key)) {\n return false;\n }\n }\n\n return true;\n }\n\n canSelectItem(key: Key): boolean {\n return this.canSelectItemIn(key, this.collection);\n }\n\n private canSelectItemIn(key: Key, collection: Collection<Node<unknown>>): boolean {\n if (this.state.selectionMode === 'none' || this.state.disabledKeys.has(key)) {\n return false;\n }\n\n let item = collection.getItem(key);\n if (!item || item?.props?.isDisabled || (item.type === 'cell' && !this.allowsCellSelection)) {\n return false;\n }\n\n return true;\n }\n\n isDisabled(key: Key): boolean {\n return this.state.disabledBehavior === 'all' && (this.state.disabledKeys.has(key) || !!this.collection.getItem(key)?.props?.isDisabled);\n }\n\n isLink(key: Key): boolean {\n return !!this.collection.getItem(key)?.props?.href;\n }\n\n getItemProps(key: Key): any {\n return this.collection.getItem(key)?.props;\n }\n\n withCollection(collection: Collection<Node<unknown>>): SelectionManager {\n return new SelectionManager(collection, this.state, {\n allowsCellSelection: this.allowsCellSelection,\n layoutDelegate: this.layoutDelegate || undefined,\n fullCollection: this.fullCollection ?? this.collection\n });\n }\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {CollectionBase, CollectionElement, Key, Node} from '@react-types/shared';\nimport {PartialNode} from './types';\nimport React, {ReactElement} from 'react';\n\ninterface CollectionBuilderState {\n renderer?: (value: any) => ReactElement | null\n}\n\ninterface CollectReactElement<T> extends ReactElement {\n getCollectionNode(props: any, context: any): Generator<PartialNode<T>, void, Node<T>[]>\n}\n\nexport class CollectionBuilder<T extends object> {\n private context?: unknown;\n private cache: WeakMap<T, Node<T>> = new WeakMap();\n\n build(props: Partial<CollectionBase<T>>, context?: unknown): Iterable<Node<T>> {\n this.context = context;\n return iterable(() => this.iterateCollection(props));\n }\n\n private *iterateCollection(props: Partial<CollectionBase<T>>): Generator<Node<T>> {\n let {children, items} = props;\n\n if (React.isValidElement<{children: CollectionElement<T>}>(children) && children.type === React.Fragment) {\n yield* this.iterateCollection({\n children: children.props.children,\n items\n });\n } else if (typeof children === 'function') {\n if (!items) {\n throw new Error('props.children was a function but props.items is missing');\n }\n\n let index = 0;\n for (let item of items) {\n yield* this.getFullNode({\n value: item,\n index\n }, {renderer: children});\n index++;\n }\n } else {\n let items: CollectionElement<T>[] = [];\n React.Children.forEach(children, child => {\n if (child) {\n items.push(child);\n }\n });\n\n let index = 0;\n for (let item of items) {\n let nodes = this.getFullNode({\n element: item,\n index: index\n }, {});\n\n for (let node of nodes) {\n index++;\n yield node;\n }\n }\n }\n }\n\n private getKey(item: NonNullable<CollectionElement<T>>, partialNode: PartialNode<T>, state: CollectionBuilderState, parentKey?: Key | null): Key {\n if (item.key != null) {\n return item.key;\n }\n\n if (partialNode.type === 'cell' && partialNode.key != null) {\n return `${parentKey}${partialNode.key}`;\n }\n\n let v = partialNode.value as any;\n if (v != null) {\n let key = v.key ?? v.id;\n if (key == null) {\n throw new Error('No key found for item');\n }\n\n return key;\n }\n\n return parentKey ? `${parentKey}.${partialNode.index}` : `$.${partialNode.index}`;\n }\n\n private getChildState(state: CollectionBuilderState, partialNode: PartialNode<T>) {\n return {\n renderer: partialNode.renderer || state.renderer\n };\n }\n\n private *getFullNode(partialNode: PartialNode<T> & {index: number}, state: CollectionBuilderState, parentKey?: Key | null, parentNode?: Node<T>): Generator<Node<T>> {\n if (React.isValidElement<{children: CollectionElement<T>}>(partialNode.element) && partialNode.element.type === React.Fragment) {\n let children: CollectionElement<T>[] = [];\n\n React.Children.forEach(partialNode.element.props.children, child => {\n children.push(child);\n });\n\n let index = partialNode.index ?? 0;\n\n for (const child of children) {\n yield* this.getFullNode({\n element: child,\n index: index++\n }, state, parentKey, parentNode);\n }\n\n return;\n }\n\n // If there's a value instead of an element on the node, and a parent renderer function is available,\n // use it to render an element for the value.\n let element = partialNode.element;\n if (!element && partialNode.value && state && state.renderer) {\n let cached = this.cache.get(partialNode.value);\n if (cached && (!cached.shouldInvalidate || !cached.shouldInvalidate(this.context))) {\n cached.index = partialNode.index;\n cached.parentKey = parentNode ? parentNode.key : null;\n yield cached;\n return;\n }\n\n element = state.renderer(partialNode.value);\n }\n\n // If there's an element with a getCollectionNode function on its type, then it's a supported component.\n // Call this function to get a partial node, and recursively build a full node from there.\n if (React.isValidElement(element)) {\n let type = element.type as unknown as CollectReactElement<T>;\n if (typeof type !== 'function' && typeof type.getCollectionNode !== 'function') {\n let name = element.type;\n throw new Error(`Unknown element <${name}> in collection.`);\n }\n\n let childNodes = type.getCollectionNode(element.props, this.context) as Generator<PartialNode<T>, void, Node<T>[]>;\n let index = partialNode.index ?? 0;\n let result = childNodes.next();\n while (!result.done && result.value) {\n let childNode = result.value;\n\n partialNode.index = index;\n\n let nodeKey = childNode.key ?? null;\n if (nodeKey == null) {\n nodeKey = childNode.element ? null : this.getKey(element as NonNullable<CollectionElement<T>>, partialNode, state, parentKey);\n }\n\n let nodes = this.getFullNode({\n ...childNode,\n key: nodeKey,\n index,\n wrapper: compose(partialNode.wrapper, childNode.wrapper)\n }, this.getChildState(state, childNode), parentKey ? `${parentKey}${element.key}` : element.key, parentNode);\n\n let children = [...nodes];\n for (let node of children) {\n // Cache the node based on its value\n node.value = childNode.value ?? partialNode.value ?? null;\n if (node.value) {\n this.cache.set(node.value, node);\n }\n\n // The partial node may have specified a type for the child in order to specify a constraint.\n // Verify that the full node that was built recursively matches this type.\n if (partialNode.type && node.type !== partialNode.type) {\n throw new Error(`Unsupported type <${capitalize(node.type)}> in <${capitalize(parentNode?.type ?? 'unknown parent type')}>. Only <${capitalize(partialNode.type)}> is supported.`);\n }\n\n index++;\n yield node;\n }\n\n result = childNodes.next(children);\n }\n\n return;\n }\n\n // Ignore invalid elements\n if (partialNode.key == null || partialNode.type == null) {\n return;\n }\n\n // Create full node\n let builder = this;\n let node: Node<T> = {\n type: partialNode.type,\n props: partialNode.props,\n key: partialNode.key,\n parentKey: parentNode ? parentNode.key : null,\n value: partialNode.value ?? null,\n level: (parentNode?.level ?? 0) + (parentNode?.type === 'item' ? 1 : 0),\n index: partialNode.index,\n rendered: partialNode.rendered,\n textValue: partialNode.textValue ?? '',\n 'aria-label': partialNode['aria-label'],\n wrapper: partialNode.wrapper,\n shouldInvalidate: partialNode.shouldInvalidate,\n hasChildNodes: partialNode.hasChildNodes || false,\n childNodes: iterable(function *() {\n if (!partialNode.hasChildNodes || !partialNode.childNodes) {\n return;\n }\n\n let index = 0;\n for (let child of partialNode.childNodes()) {\n // Ensure child keys are globally unique by prepending the parent node's key\n if (child.key != null) {\n // TODO: Remove this line entirely and enforce that users always provide unique keys.\n // Currently this line will have issues when a parent has a key `a` and a child with key `bc`\n // but another parent has key `ab` and its child has a key `c`. The combined keys would result in both\n // children having a key of `abc`.\n child.key = `${node.key}${child.key}`;\n }\n\n let nodes = builder.getFullNode({...child, index}, builder.getChildState(state, child), node.key, node);\n for (let node of nodes) {\n index++;\n yield node;\n }\n }\n })\n };\n\n yield node;\n }\n}\n\n// Wraps an iterator function as an iterable object, and caches the results.\nfunction iterable<T>(iterator: () => IterableIterator<Node<T>>): Iterable<Node<T>> {\n let cache: Array<Node<T>> = [];\n let iterable: null | IterableIterator<Node<T>> = null;\n return {\n *[Symbol.iterator]() {\n for (let item of cache) {\n yield item;\n }\n\n if (!iterable) {\n iterable = iterator();\n }\n\n for (let item of iterable) {\n cache.push(item);\n yield item;\n }\n }\n };\n}\n\ntype Wrapper = (element: ReactElement) => ReactElement;\nfunction compose(outer: Wrapper | void, inner: Wrapper | void): Wrapper | undefined {\n if (outer && inner) {\n return (element) => outer(inner(element));\n }\n\n if (outer) {\n return outer;\n }\n\n if (inner) {\n return inner;\n }\n}\n\nfunction capitalize(str: string) {\n return str[0].toUpperCase() + str.slice(1);\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {Collection, CollectionStateBase, Node} from '@react-types/shared';\nimport {CollectionBuilder} from './CollectionBuilder';\nimport {ReactElement, useMemo} from 'react';\n\ninterface CollectionOptions<T, C extends Collection<Node<T>>> extends Omit<CollectionStateBase<T, C>, 'children'> {\n children?: ReactElement<any> | null | (ReactElement<any> | null)[] | ((item: T) => ReactElement<any> | null)\n}\n\ntype CollectionFactory<T, C extends Collection<Node<T>>> = (node: Iterable<Node<T>>) => C;\n\nexport function useCollection<T extends object, C extends Collection<Node<T>> = Collection<Node<T>>>(props: CollectionOptions<T, C>, factory: CollectionFactory<T, C>, context?: unknown): C {\n let builder = useMemo(() => new CollectionBuilder<T>(), []);\n let {children, items, collection} = props;\n let result = useMemo(() => {\n if (collection) {\n return collection;\n }\n let nodes = builder.build({children, items}, context);\n return factory(nodes);\n }, [builder, children, items, collection, context, factory]);\n return result;\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {Collection, CollectionStateBase, Key, LayoutDelegate, Node} from '@react-types/shared';\nimport {ListCollection} from './ListCollection';\nimport {MultipleSelectionStateProps, useMultipleSelectionState} from '../selection/useMultipleSelectionState';\nimport {SelectionManager} from '../selection/SelectionManager';\nimport {useCallback, useEffect, useMemo, useRef} from 'react';\nimport {useCollection} from '../collections/useCollection';\n\nexport interface ListProps<T> extends CollectionStateBase<T>, MultipleSelectionStateProps {\n /** Filter function to generate a filtered list of nodes. */\n filter?: (nodes: Iterable<Node<T>>) => Iterable<Node<T>>,\n /** @private */\n suppressTextValueWarning?: boolean,\n /**\n * A delegate object that provides layout information for items in the collection.\n * This can be used to override the behavior of shift selection.\n */\n layoutDelegate?: LayoutDelegate\n}\n\nexport interface ListState<T> {\n /** A collection of items in the list. */\n collection: Collection<Node<T>>,\n\n /** A set of items that are disabled. */\n disabledKeys: Set<Key>,\n\n /** A selection manager to read and update multiple selection state. */\n selectionManager: SelectionManager\n}\n\n/**\n * Provides state management for list-like components. Handles building a collection\n * of items from props, and manages multiple selection state.\n */\nexport function useListState<T extends object>(props: ListProps<T>): ListState<T> {\n let {filter, layoutDelegate} = props;\n\n let selectionState = useMultipleSelectionState(props);\n let disabledKeys = useMemo(() =>\n props.disabledKeys ? new Set(props.disabledKeys) : new Set<Key>()\n , [props.disabledKeys]);\n\n let factory = useCallback(nodes => filter ? new ListCollection(filter(nodes)) : new ListCollection(nodes as Iterable<Node<T>>), [filter]);\n let context = useMemo(() => ({suppressTextValueWarning: props.suppressTextValueWarning}), [props.suppressTextValueWarning]);\n\n let collection = useCollection(props, factory, context);\n\n let selectionManager = useMemo(() =>\n new SelectionManager(collection, selectionState, {layoutDelegate})\n , [collection, selectionState, layoutDelegate]\n );\n\n useFocusedKeyReset(collection, selectionManager);\n\n return {\n collection,\n disabledKeys,\n selectionManager\n };\n}\n\n/**\n * Filters a collection using the provided filter function and returns a new ListState.\n */\nexport function UNSTABLE_useFilteredListState<T extends object>(state: ListState<T>, filterFn: ((nodeValue: string, node: Node<T>) => boolean) | null | undefined): ListState<T> {\n let collection = useMemo(() => filterFn ? state.collection.filter!(filterFn) : state.collection, [state.collection, filterFn]);\n let selectionManager = state.selectionManager.withCollection(collection);\n useFocusedKeyReset(collection, selectionManager);\n return {\n collection,\n selectionManager,\n disabledKeys: state.disabledKeys\n };\n}\n\nfunction useFocusedKeyReset<T>(collection: Collection<Node<T>>, selectionManager: SelectionManager) {\n // Reset focused key if that item is deleted from the collection.\n const cachedCollection = useRef<Collection<Node<T>> | null>(null);\n useEffect(() => {\n if (selectionManager.focusedKey != null && !collection.getItem(selectionManager.focusedKey) && cachedCollection.current) {\n // Walk forward in the old collection to find the next key that still exists in the new collection.\n let key = cachedCollection.current.getKeyAfter(selectionManager.focusedKey);\n let nextFocusedKey: Key | null = null;\n while (key != null) {\n let node = collection.getItem(key);\n if (node && node.type === 'item' && !selectionManager.isDisabled(key)) {\n nextFocusedKey = key;\n break;\n }\n\n key = cachedCollection.current.getKeyAfter(key);\n }\n\n // If no such key exists, walk backward.\n if (nextFocusedKey == null) {\n key = cachedCollection.current.getKeyBefore(selectionManager.focusedKey);\n while (key != null) {\n let node = collection.getItem(key);\n if (node && node.type === 'item' && !selectionManager.isDisabled(key)) {\n nextFocusedKey = key;\n break;\n }\n\n key = cachedCollection.current.getKeyBefore(key);\n }\n }\n\n selectionManager.setFocusedKey(nextFocusedKey);\n }\n cachedCollection.current = collection;\n }, [collection, selectionManager]);\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {useCallback} from 'react';\nimport {useControlledState} from '../utils/useControlledState';\n\nexport interface OverlayTriggerProps {\n /** Whether the overlay is open by default (controlled). */\n isOpen?: boolean,\n /** Whether the overlay is open by default (uncontrolled). */\n defaultOpen?: boolean,\n /** Handler that is called when the overlay's open state changes. */\n onOpenChange?: (isOpen: boolean) => void\n}\n\nexport interface OverlayTriggerState {\n /** Whether the overlay is currently open. */\n readonly isOpen: boolean,\n /** Sets whether the overlay is open. */\n setOpen(isOpen: boolean): void,\n /** Opens the overlay. */\n open(): void,\n /** Closes the overlay. */\n close(): void,\n /** Toggles the overlay's visibility. */\n toggle(): void\n}\n\n/**\n * Manages state for an overlay trigger. Tracks whether the overlay is open, and provides\n * methods to toggle this state.\n */\nexport function useOverlayTriggerState(props: OverlayTriggerProps): OverlayTriggerState {\n let [isOpen, setOpen] = useControlledState(props.isOpen, props.defaultOpen || false, props.onOpenChange);\n\n const open = useCallback(() => {\n setOpen(true);\n }, [setOpen]);\n\n const close = useCallback(() => {\n setOpen(false);\n }, [setOpen]);\n\n const toggle = useCallback(() => {\n setOpen(!isOpen);\n }, [setOpen, isOpen]);\n\n return {\n isOpen,\n setOpen,\n open,\n close,\n toggle\n };\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {ItemElement, ItemProps} from '@react-types/shared';\nimport {PartialNode} from './types';\nimport React, {JSX, ReactElement} from 'react';\n\nfunction Item<T>(props: ItemProps<T>): ReactElement | null { // eslint-disable-line @typescript-eslint/no-unused-vars\n return null;\n}\n\nItem.getCollectionNode = function* getCollectionNode<T>(props: ItemProps<T>, context: any): Generator<PartialNode<T>> {\n let {childItems, title, children} = props;\n\n let rendered = props.title || props.children;\n let textValue = props.textValue || (typeof rendered === 'string' ? rendered : '') || props['aria-label'] || '';\n\n // suppressTextValueWarning is used in components like Tabs, which don't have type to select support.\n if (!textValue && !context?.suppressTextValueWarning && process.env.NODE_ENV !== 'production') {\n console.warn('<Item> with non-plain text contents is unsupported by type to select for accessibility. Please add a `textValue` prop.');\n }\n\n yield {\n type: 'item',\n props: props,\n rendered,\n textValue,\n 'aria-label': props['aria-label'],\n hasChildNodes: hasChildItems(props),\n *childNodes() {\n if (childItems) {\n for (let child of childItems) {\n yield {\n type: 'item',\n value: child\n };\n }\n } else if (title) {\n let items: PartialNode<T>[] = [];\n React.Children.forEach(children, child => {\n items.push({\n type: 'item',\n element: child as ItemElement<T>\n });\n });\n\n yield* items;\n }\n }\n };\n};\n\nfunction hasChildItems<T>(props: ItemProps<T>) {\n if (props.hasChildItems != null) {\n return props.hasChildItems;\n }\n\n if (props.childItems) {\n return true;\n }\n\n if (props.title && React.Children.count(props.children) > 0) {\n return true;\n }\n\n return false;\n}\n\n// We don't want getCollectionNode to show up in the type definition\nlet _Item = Item as <T>(props: ItemProps<T>) => JSX.Element;\nexport {_Item as Item};\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {CollectionStateBase, Key, Node, Selection, SingleSelection} from '@react-types/shared';\nimport {ListState, useListState} from './useListState';\nimport {useControlledState} from '../utils/useControlledState';\nimport {useMemo} from 'react';\n\nexport interface SingleSelectListProps<T> extends CollectionStateBase<T>, Omit<SingleSelection, 'disallowEmptySelection'> {\n /** Filter function to generate a filtered list of nodes. */\n filter?: (nodes: Iterable<Node<T>>) => Iterable<Node<T>>,\n /** @private */\n suppressTextValueWarning?: boolean\n}\n\nexport interface SingleSelectListState<T> extends ListState<T> {\n /** The key for the currently selected item. */\n readonly selectedKey: Key | null,\n\n /** Sets the selected key. */\n setSelectedKey(key: Key | null): void,\n\n /** The value of the currently selected item. */\n readonly selectedItem: Node<T> | null\n}\n\n/**\n * Provides state management for list-like components with single selection.\n * Handles building a collection of items from props, and manages selection state.\n */\nexport function useSingleSelectListState<T extends object>(props: SingleSelectListProps<T>): SingleSelectListState<T> {\n let [selectedKey, setSelectedKey] = useControlledState(props.selectedKey, props.defaultSelectedKey ?? null, props.onSelectionChange);\n let selectedKeys = useMemo(() => selectedKey != null ? [selectedKey] : [], [selectedKey]);\n let {collection, disabledKeys, selectionManager} = useListState({\n ...props,\n selectionMode: 'single',\n disallowEmptySelection: true,\n allowDuplicateSelectionEvents: true,\n selectedKeys,\n onSelectionChange: (keys: Selection) => {\n // impossible, but TS doesn't know that\n if (keys === 'all') {\n return;\n }\n let key = keys.values().next().value ?? null;\n\n // Always fire onSelectionChange, even if the key is the same\n // as the current key (useControlledState does not).\n if (key === selectedKey && props.onSelectionChange) {\n props.onSelectionChange(key);\n }\n\n setSelectedKey(key);\n }\n });\n\n let selectedItem = selectedKey != null\n ? collection.getItem(selectedKey)\n : null;\n\n return {\n collection,\n disabledKeys,\n selectionManager,\n selectedKey,\n setSelectedKey,\n selectedItem\n };\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {FocusStrategy, Key} from '@react-types/shared';\nimport {OverlayTriggerProps, OverlayTriggerState, useOverlayTriggerState} from '../overlays/useOverlayTriggerState';\nimport {useState} from 'react';\n\nexport type MenuTriggerType = 'press' | 'longPress';\n\nexport interface MenuTriggerProps extends OverlayTriggerProps {\n /**\n * How the menu is triggered.\n * @default 'press'\n */\n trigger?: MenuTriggerType\n}\n\nexport interface MenuTriggerState extends OverlayTriggerState {\n /** Controls which item will be auto focused when the menu opens. */\n readonly focusStrategy: FocusStrategy | null,\n\n /** Opens the menu. */\n open(focusStrategy?: FocusStrategy | null): void,\n\n /** Toggles the menu. */\n toggle(focusStrategy?: FocusStrategy | null): void\n}\n\nexport interface RootMenuTriggerState extends MenuTriggerState {\n /** Opens a specific submenu tied to a specific menu item at a specific level. */\n openSubmenu: (triggerKey: Key, level: number) => void,\n\n /** Closes a specific submenu tied to a specific menu item at a specific level. */\n closeSubmenu: (triggerKey: Key, level: number) => void,\n\n /** An array of open submenu trigger keys within the menu tree.\n * The index of key within array matches the submenu level in the tree.\n */\n expandedKeysStack: Key[],\n\n /** Closes the menu and all submenus in the menu tree. */\n close: () => void\n}\n\n/**\n * Manages state for a menu trigger. Tracks whether the menu is currently open,\n * and controls which item will receive focus when it opens. Also tracks the open submenus within\n * the menu tree via their trigger keys.\n */\nexport function useMenuTriggerState(props: MenuTriggerProps): RootMenuTriggerState {\n let overlayTriggerState = useOverlayTriggerState(props);\n let [focusStrategy, setFocusStrategy] = useState<FocusStrategy | null>(null);\n let [expandedKeysStack, setExpandedKeysStack] = useState<Key[]>([]);\n\n let closeAll = () => {\n setExpandedKeysStack([]);\n overlayTriggerState.close();\n };\n\n let openSubmenu = (triggerKey: Key, level: number) => {\n setExpandedKeysStack(oldStack => {\n if (level > oldStack.length) {\n return oldStack;\n }\n\n return [...oldStack.slice(0, level), triggerKey];\n });\n };\n\n let closeSubmenu = (triggerKey: Key, level: number) => {\n setExpandedKeysStack(oldStack => {\n let key = oldStack[level];\n if (key === triggerKey) {\n return oldStack.slice(0, level);\n } else {\n return oldStack;\n }\n });\n };\n\n return {\n focusStrategy,\n ...overlayTriggerState,\n open(focusStrategy: FocusStrategy | null = null) {\n setFocusStrategy(focusStrategy);\n overlayTriggerState.open();\n },\n toggle(focusStrategy: FocusStrategy | null = null) {\n setFocusStrategy(focusStrategy);\n overlayTriggerState.toggle();\n },\n close() {\n closeAll();\n },\n expandedKeysStack,\n openSubmenu,\n closeSubmenu\n };\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {FocusEvents, HelpTextProps, InputBase, InputDOMProps, LabelableProps, Orientation, Validation, ValidationState, ValueBase} from '@react-types/shared';\nimport {FormValidationState, useFormValidationState} from '../form/useFormValidationState';\nimport {useControlledState} from '../utils/useControlledState';\nimport {useMemo, useState} from 'react';\n\nexport interface RadioGroupProps extends ValueBase<string|null, string>, InputBase, Pick<InputDOMProps, 'name'>, Validation<string>, LabelableProps, HelpTextProps, FocusEvents {\n /**\n * The axis the Radio Button(s) should align with.\n * @default 'vertical'\n */\n orientation?: Orientation\n}\n\nexport interface RadioGroupState extends FormValidationState {\n /**\n * The name for the group, used for native form submission.\n * @deprecated\n * @private\n */\n readonly name: string,\n\n /** Whether the radio group is disabled. */\n readonly isDisabled: boolean,\n\n /** Whether the radio group is read only. */\n readonly isReadOnly: boolean,\n\n /** Whether the radio group is required. */\n readonly isRequired: boolean,\n\n /**\n * Whether the radio group is valid or invalid.\n * @deprecated Use `isInvalid` instead.\n */\n readonly validationState: ValidationState | null,\n\n /** Whether the radio group is invalid. */\n readonly isInvalid: boolean,\n\n /** The currently selected value. */\n readonly selectedValue: string | null,\n\n /** The default selected value. */\n readonly defaultSelectedValue: string | null,\n\n /** Sets the selected value. */\n setSelectedValue(value: string | null): void,\n\n /** The value of the last focused radio. */\n readonly lastFocusedValue: string | null,\n\n /** Sets the last focused value. */\n setLastFocusedValue(value: string | null): void\n}\n\nlet instance = Math.round(Math.random() * 10000000000);\nlet i = 0;\n\n/**\n * Provides state management for a radio group component. Provides a name for the group,\n * and manages selection and focus state.\n */\nexport function useRadioGroupState(props: RadioGroupProps): RadioGroupState {\n // Preserved here for backward compatibility. React Aria now generates the name instead of stately.\n let name = useMemo(() => props.name || `radio-group-${instance}-${++i}`, [props.name]);\n let [selectedValue, setSelected] = useControlledState(props.value, props.defaultValue ?? null, props.onChange);\n let [initialValue] = useState(selectedValue);\n let [lastFocusedValue, setLastFocusedValue] = useState<string | null>(null);\n\n let validation = useFormValidationState({\n ...props,\n value: selectedValue\n });\n\n let setSelectedValue = (value) => {\n if (!props.isReadOnly && !props.isDisabled) {\n setSelected(value);\n validation.commitValidation();\n }\n };\n\n let isInvalid = validation.displayValidation.isInvalid;\n\n return {\n ...validation,\n name,\n selectedValue: selectedValue,\n defaultSelectedValue: props.value !== undefined ? initialValue : props.defaultValue ?? null,\n setSelectedValue,\n lastFocusedValue,\n setLastFocusedValue,\n isDisabled: props.isDisabled || false,\n isReadOnly: props.isReadOnly || false,\n isRequired: props.isRequired || false,\n validationState: props.validationState || (isInvalid ? 'invalid' : null),\n isInvalid\n };\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {CollectionBase, CollectionStateBase, FocusableProps, FocusStrategy, HelpTextProps, InputBase, Key, LabelableProps, Node, Selection, TextInputBase, Validation, ValueBase} from '@react-types/shared';\nimport {FormValidationState, useFormValidationState} from '../form/useFormValidationState';\nimport {ListState, useListState} from '../list/useListState';\nimport {OverlayTriggerState, useOverlayTriggerState} from '../overlays/useOverlayTriggerState';\nimport {useControlledState} from '../utils/useControlledState';\nimport {useMemo, useState} from 'react';\n\nexport type SelectionMode = 'single' | 'multiple';\nexport type ValueType<M extends SelectionMode> = M extends 'single' ? Key | null : readonly Key[];\nexport type ChangeValueType<M extends SelectionMode> = M extends 'single' ? Key | null : Key[];\ntype ValidationType<M extends SelectionMode> = M extends 'single' ? Key : Key[];\n\nexport interface SelectProps<T, M extends SelectionMode = 'single'> extends CollectionBase<T>, Omit<InputBase, 'isReadOnly'>, ValueBase<ValueType<M>, ChangeValueType<M>>, Validation<ValidationType<M>>, HelpTextProps, LabelableProps, TextInputBase, FocusableProps {\n /**\n * Whether single or multiple selection is enabled.\n * @default 'single'\n */\n selectionMode?: M,\n /**\n * The currently selected key in the collection (controlled).\n * @deprecated\n */\n selectedKey?: Key | null,\n /**\n * The initial selected key in the collection (uncontrolled).\n * @deprecated\n */\n defaultSelectedKey?: Key | null,\n /**\n * Handler that is called when the selection changes.\n * @deprecated\n */\n onSelectionChange?: (key: Key | null) => void,\n /** Sets the open state of the menu. */\n isOpen?: boolean,\n /** Sets the default open state of the menu. */\n defaultOpen?: boolean,\n /** Method that is called when the open state of the menu changes. */\n onOpenChange?: (isOpen: boolean) => void,\n /** Whether the Select should close when an item is selected. Defaults to true if selectionMode is single, false otherwise. */\n shouldCloseOnSelect?: boolean,\n /** Whether the select should be allowed to be open when the collection is empty. */\n allowsEmptyCollection?: boolean\n}\n\nexport interface SelectStateOptions<T, M extends SelectionMode = 'single'> extends Omit<SelectProps<T, M>, 'children'>, CollectionStateBase<T> {}\n\nexport interface SelectState<T, M extends SelectionMode = 'single'> extends ListState<T>, OverlayTriggerState, FormValidationState {\n /**\n * The key for the first selected item.\n * @deprecated\n */\n readonly selectedKey: Key | null,\n\n /**\n * The default selected key.\n * @deprecated\n */\n readonly defaultSelectedKey: Key | null,\n\n /**\n * Sets the selected key.\n * @deprecated\n */\n setSelectedKey(key: Key | null): void,\n\n /** The current select value. */\n readonly value: ValueType<M>,\n\n /** The default select value. */\n readonly defaultValue: ValueType<M>,\n\n /** Sets the select value. */\n setValue(value: Key | readonly Key[] | null): void,\n\n /**\n * The value of the first selected item.\n * @deprecated\n */\n readonly selectedItem: Node<T> | null,\n\n /** The value of the selected items. */\n readonly selectedItems: Node<T>[],\n\n /** Whether the select is currently focused. */\n readonly isFocused: boolean,\n\n /** Sets whether the select is focused. */\n setFocused(isFocused: boolean): void,\n\n /** Controls which item will be auto focused when the menu opens. */\n readonly focusStrategy: FocusStrategy | null,\n\n /** Opens the menu. */\n open(focusStrategy?: FocusStrategy | null): void,\n\n /** Toggles the menu. */\n toggle(focusStrategy?: FocusStrategy | null): void\n}\n\n/**\n * Provides state management for a select component. Handles building a collection\n * of items from props, handles the open state for the popup menu, and manages\n * multiple selection state.\n */\nexport function useSelectState<T extends object, M extends SelectionMode = 'single'>(props: SelectStateOptions<T, M>): SelectState<T, M> {\n let {\n selectionMode = 'single' as M,\n shouldCloseOnSelect = selectionMode === 'single'\n } = props;\n let triggerState = useOverlayTriggerState(props);\n let [focusStrategy, setFocusStrategy] = useState<FocusStrategy | null>(null);\n let defaultValue = useMemo(() => {\n return props.defaultValue !== undefined ? props.defaultValue : (selectionMode === 'single' ? props.defaultSelectedKey ?? null : []) as ValueType<M>;\n }, [props.defaultValue, props.defaultSelectedKey, selectionMode]);\n let value = useMemo(() => {\n return props.value !== undefined ? props.value : (selectionMode === 'single' ? props.selectedKey : undefined) as ValueType<M>;\n }, [props.value, props.selectedKey, selectionMode]);\n let [controlledValue, setControlledValue] = useControlledState<Key | readonly Key[] | null>(value, defaultValue, props.onChange as any);\n // Only display the first selected item if in single selection mode but the value is an array.\n let displayValue = selectionMode === 'single' && Array.isArray(controlledValue) ? controlledValue[0] : controlledValue;\n let setValue = (value: Key | Key[] | null) => {\n if (selectionMode === 'single') {\n let key = Array.isArray(value) ? value[0] ?? null : value;\n setControlledValue(key);\n if (key !== displayValue) {\n props.onSelectionChange?.(key);\n }\n } else {\n let keys: Key[] = [];\n if (Array.isArray(value)) {\n keys = value;\n } else if (value != null) {\n keys = [value];\n }\n\n setControlledValue(keys);\n }\n };\n\n let listState = useListState({\n ...props,\n selectionMode,\n disallowEmptySelection: selectionMode === 'single',\n allowDuplicateSelectionEvents: true,\n selectedKeys: useMemo(() => convertValue(displayValue), [displayValue]),\n onSelectionChange: (keys: Selection) => {\n // impossible, but TS doesn't know that\n if (keys === 'all') {\n return;\n }\n\n if (selectionMode === 'single') {\n let key = keys.values().next().value ?? null;\n setValue(key);\n } else {\n setValue([...keys]);\n }\n if (shouldCloseOnSelect) {\n triggerState.close();\n }\n\n validationState.commitValidation();\n }\n });\n\n let selectedKey = listState.selectionManager.firstSelectedKey;\n let selectedItems = useMemo(() => {\n return [...listState.selectionManager.selectedKeys].map(key => listState.collection.getItem(key)).filter(item => item != null);\n }, [listState.selectionManager.selectedKeys, listState.collection]);\n\n let validationState = useFormValidationState({\n ...props,\n value: Array.isArray(displayValue) && displayValue.length === 0 ? null : displayValue as any\n });\n\n let [isFocused, setFocused] = useState(false);\n let [initialValue] = useState(displayValue);\n\n return {\n ...validationState,\n ...listState,\n ...triggerState,\n value: displayValue as ValueType<M>,\n defaultValue: defaultValue ?? initialValue as ValueType<M>,\n setValue,\n selectedKey,\n setSelectedKey: setValue,\n selectedItem: selectedItems[0] ?? null,\n selectedItems,\n defaultSelectedKey: props.defaultSelectedKey ?? (props.selectionMode === 'single' ? initialValue as Key : null),\n focusStrategy,\n open(focusStrategy: FocusStrategy | null = null) {\n // Don't open if the collection is empty.\n if (listState.collection.size !== 0 || props.allowsEmptyCollection) {\n setFocusStrategy(focusStrategy);\n triggerState.open();\n }\n },\n toggle(focusStrategy: FocusStrategy | null = null) {\n if (listState.collection.size !== 0 || props.allowsEmptyCollection) {\n setFocusStrategy(focusStrategy);\n triggerState.toggle();\n }\n },\n isFocused,\n setFocused\n };\n}\n\nfunction convertValue(value: Key | Key[] | null | undefined) {\n if (value === undefined) {\n return undefined;\n }\n if (value === null) {\n return [];\n }\n return Array.isArray(value) ? value : [value];\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {Collection, CollectionBase, CollectionStateBase, Key, Node, SingleSelection} from '@react-types/shared';\nimport {SingleSelectListState, useSingleSelectListState} from '../list/useSingleSelectListState';\nimport {useEffect, useRef} from 'react';\n\nexport interface TabListProps<T> extends CollectionBase<T>, Omit<SingleSelection, 'disallowEmptySelection' | 'selectedKey' | 'defaultSelectedKey' | 'onSelectionChange'> {\n /**\n * Whether the TabList is disabled.\n * Shows that a selection exists, but is not available in that circumstance.\n */\n isDisabled?: boolean,\n /** The currently selected key in the collection (controlled). */\n selectedKey?: Key,\n /** The initial selected keys in the collection (uncontrolled). */\n defaultSelectedKey?: Key,\n /** Handler that is called when the selection changes. */\n onSelectionChange?: (key: Key) => void\n}\n\nexport interface TabListStateOptions<T> extends Omit<TabListProps<T>, 'children'>, CollectionStateBase<T> {}\n\nexport interface TabListState<T> extends SingleSelectListState<T> {\n /** Whether the tab list is disabled. */\n isDisabled: boolean\n}\n\n/**\n * Provides state management for a Tabs component. Tabs include a TabList which tracks\n * which tab is currently selected and displays the content associated with that Tab in a TabPanel.\n */\nexport function useTabListState<T extends object>(props: TabListStateOptions<T>): TabListState<T> {\n let state = useSingleSelectListState<T>({\n ...props,\n onSelectionChange: props.onSelectionChange ? (key => {\n if (key != null) {\n props.onSelectionChange?.(key);\n }\n }) : undefined,\n suppressTextValueWarning: true,\n defaultSelectedKey: props.defaultSelectedKey ?? findDefaultSelectedKey(props.collection, props.disabledKeys ? new Set(props.disabledKeys) : new Set()) ?? undefined\n });\n\n let {\n selectionManager,\n collection,\n selectedKey: currentSelectedKey\n } = state;\n\n let lastSelectedKey = useRef(currentSelectedKey);\n useEffect(() => {\n // Ensure a tab is always selected (in case no selected key was specified or if selected item was deleted from collection)\n let selectedKey = currentSelectedKey;\n if (props.selectedKey == null && (selectionManager.isEmpty || selectedKey == null || !collection.getItem(selectedKey))) {\n selectedKey = findDefaultSelectedKey(collection, state.disabledKeys);\n if (selectedKey != null) {\n // directly set selection because replace/toggle selection won't consider disabled keys\n selectionManager.setSelectedKeys([selectedKey]);\n }\n }\n\n // If the tablist doesn't have focus and the selected key changes or if there isn't a focused key yet, change focused key to the selected key if it exists.\n if (selectedKey != null && selectionManager.focusedKey == null || (!selectionManager.isFocused && selectedKey !== lastSelectedKey.current)) {\n selectionManager.setFocusedKey(selectedKey);\n }\n lastSelectedKey.current = selectedKey;\n });\n\n return {\n ...state,\n isDisabled: props.isDisabled || false\n };\n}\n\nfunction findDefaultSelectedKey<T>(collection: Collection<Node<T>> | undefined, disabledKeys: Set<Key>) {\n let selectedKey: Key | null = null;\n if (collection) {\n selectedKey = collection.getFirstKey();\n // loop over tabs until we find one that isn't disabled and select that\n while (selectedKey != null && (disabledKeys.has(selectedKey) || collection.getItem(selectedKey)?.props?.isDisabled) && selectedKey !== collection.getLastKey()) {\n selectedKey = collection.getKeyAfter(selectedKey);\n }\n // if this check is true, then every item is disabled, it makes more sense to default to the first key than the last\n if (selectedKey != null && (disabledKeys.has(selectedKey) || collection.getItem(selectedKey)?.props?.isDisabled) && selectedKey === collection.getLastKey()) {\n selectedKey = collection.getFirstKey();\n }\n }\n\n return selectedKey;\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {FocusableProps, InputBase, Validation} from '@react-types/shared';\nimport {ReactNode, useState} from 'react';\nimport {useControlledState} from '../utils/useControlledState';\n\nexport interface ToggleStateOptions extends InputBase {\n /**\n * Whether the element should be selected (uncontrolled).\n */\n defaultSelected?: boolean,\n /**\n * Whether the element should be selected (controlled).\n */\n isSelected?: boolean,\n /**\n * Handler that is called when the element's selection state changes.\n */\n onChange?: (isSelected: boolean) => void\n}\n\nexport interface ToggleProps extends ToggleStateOptions, Validation<boolean>, FocusableProps {\n /**\n * The label for the element.\n */\n children?: ReactNode,\n /**\n * The value of the input element, used when submitting an HTML form. See [MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#htmlattrdefvalue).\n */\n value?: string\n}\n\nexport interface ToggleState {\n /** Whether the toggle is selected. */\n readonly isSelected: boolean,\n\n /** Whether the toggle is selected by default. */\n readonly defaultSelected: boolean,\n\n /** Updates selection state. */\n setSelected(isSelected: boolean): void,\n\n /** Toggle the selection state. */\n toggle(): void\n}\n\n/**\n * Provides state management for toggle components like checkboxes and switches.\n */\nexport function useToggleState(props: ToggleStateOptions = {}): ToggleState {\n let {isReadOnly} = props;\n\n // have to provide an empty function so useControlledState doesn't throw a fit\n // can't use useControlledState's prop calling because we need the event object from the change\n let [isSelected, setSelected] = useControlledState(props.isSelected, props.defaultSelected || false, props.onChange);\n let [initialValue] = useState(isSelected);\n\n function updateSelected(value) {\n if (!isReadOnly) {\n setSelected(value);\n }\n }\n\n function toggleState() {\n if (!isReadOnly) {\n setSelected(!isSelected);\n }\n }\n\n return {\n isSelected,\n defaultSelected: props.defaultSelected ?? initialValue,\n setSelected: updateSelected,\n toggle: toggleState\n };\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {OverlayTriggerProps, useOverlayTriggerState} from '../overlays/useOverlayTriggerState';\nimport {useEffect, useMemo, useRef} from 'react';\n\nexport interface TooltipTriggerProps extends OverlayTriggerProps {\n /**\n * Whether the tooltip should be disabled, independent from the trigger.\n */\n isDisabled?: boolean,\n\n /**\n * The delay time for the tooltip to show up. [See guidelines](https://spectrum.adobe.com/page/tooltip/#Immediate-or-delayed-appearance).\n * @default 1500\n */\n delay?: number,\n\n /**\n * The delay time for the tooltip to close. [See guidelines](https://spectrum.adobe.com/page/tooltip/#Warmup-and-cooldown).\n * @default 500\n */\n closeDelay?: number,\n\n /**\n * By default, opens for both focus and hover. Can be made to open only for focus.\n * @default 'hover'\n */\n trigger?: 'hover' | 'focus',\n\n /**\n * Whether the tooltip should close when the trigger is pressed.\n * @default true\n */\n shouldCloseOnPress?: boolean\n}\n\nconst TOOLTIP_DELAY = 1500; // this seems to be a 1.5 second delay, check with design\nconst TOOLTIP_COOLDOWN = 500;\n\nexport interface TooltipTriggerState {\n /** Whether the tooltip is currently showing. */\n isOpen: boolean,\n /**\n * Shows the tooltip. By default, the tooltip becomes visible after a delay\n * depending on a global warmup timer. The `immediate` option shows the\n * tooltip immediately instead.\n */\n open(immediate?: boolean): void,\n /** Hides the tooltip. */\n close(immediate?: boolean): void\n}\n\nlet tooltips = {};\nlet tooltipId = 0;\nlet globalWarmedUp = false;\nlet globalWarmUpTimeout: ReturnType<typeof setTimeout> | null = null;\nlet globalCooldownTimeout: ReturnType<typeof setTimeout> | null = null;\n\n/**\n * Manages state for a tooltip trigger. Tracks whether the tooltip is open, and provides\n * methods to toggle this state. Ensures only one tooltip is open at a time and controls\n * the delay for showing a tooltip.\n */\nexport function useTooltipTriggerState(props: TooltipTriggerProps = {}): TooltipTriggerState {\n let {delay = TOOLTIP_DELAY, closeDelay = TOOLTIP_COOLDOWN} = props;\n let {isOpen, open, close} = useOverlayTriggerState(props);\n let id = useMemo(() => `${++tooltipId}`, []);\n let closeTimeout = useRef<ReturnType<typeof setTimeout> | null>(null);\n let closeCallback = useRef<() => void>(close);\n\n let ensureTooltipEntry = () => {\n tooltips[id] = hideTooltip;\n };\n\n let closeOpenTooltips = () => {\n for (let hideTooltipId in tooltips) {\n if (hideTooltipId !== id) {\n tooltips[hideTooltipId](true);\n delete tooltips[hideTooltipId];\n }\n }\n };\n\n let showTooltip = () => {\n if (closeTimeout.current) {\n clearTimeout(closeTimeout.current);\n }\n closeTimeout.current = null;\n closeOpenTooltips();\n ensureTooltipEntry();\n globalWarmedUp = true;\n open();\n if (globalWarmUpTimeout) {\n clearTimeout(globalWarmUpTimeout);\n globalWarmUpTimeout = null;\n }\n if (globalCooldownTimeout) {\n clearTimeout(globalCooldownTimeout);\n globalCooldownTimeout = null;\n }\n };\n\n let hideTooltip = (immediate?: boolean) => {\n if (immediate || closeDelay <= 0) {\n if (closeTimeout.current) {\n clearTimeout(closeTimeout.current);\n }\n closeTimeout.current = null;\n closeCallback.current();\n } else if (!closeTimeout.current) {\n closeTimeout.current = setTimeout(() => {\n closeTimeout.current = null;\n closeCallback.current();\n }, closeDelay);\n }\n\n if (globalWarmUpTimeout) {\n clearTimeout(globalWarmUpTimeout);\n globalWarmUpTimeout = null;\n }\n if (globalWarmedUp) {\n if (globalCooldownTimeout) {\n clearTimeout(globalCooldownTimeout);\n }\n globalCooldownTimeout = setTimeout(() => {\n delete tooltips[id];\n globalCooldownTimeout = null;\n globalWarmedUp = false;\n }, Math.max(TOOLTIP_COOLDOWN, closeDelay));\n }\n };\n\n let warmupTooltip = () => {\n closeOpenTooltips();\n ensureTooltipEntry();\n if (!isOpen && !globalWarmedUp) {\n if (globalWarmUpTimeout) {\n clearTimeout(globalWarmUpTimeout);\n }\n\n globalWarmUpTimeout = setTimeout(() => {\n globalWarmUpTimeout = null;\n globalWarmedUp = true;\n showTooltip();\n }, delay);\n } else if (!isOpen) {\n showTooltip();\n }\n };\n\n useEffect(() => {\n closeCallback.current = close;\n }, [close]);\n\n\n useEffect(() => {\n return () => {\n if (closeTimeout.current) {\n clearTimeout(closeTimeout.current);\n }\n let tooltip = tooltips[id];\n if (tooltip) {\n delete tooltips[id];\n }\n };\n }, [id]);\n\n return {\n isOpen,\n open: (immediate) => {\n if (!immediate && delay > 0 && !closeTimeout.current) {\n warmupTooltip();\n } else {\n showTooltip();\n }\n },\n close: hideTooltip\n };\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {Collection, Key, Node} from '@react-types/shared';\n\nexport class TreeCollection<T> implements Collection<Node<T>> {\n private keyMap: Map<Key, Node<T>> = new Map();\n private iterable: Iterable<Node<T>>;\n private firstKey: Key | null = null;\n private lastKey: Key | null = null;\n\n constructor(nodes: Iterable<Node<T>>, {expandedKeys}: {expandedKeys?: Set<Key>} = {}) {\n this.iterable = nodes;\n expandedKeys = expandedKeys || new Set();\n\n let visit = (node: Node<T>) => {\n this.keyMap.set(node.key, node);\n\n if (node.childNodes && (node.type === 'section' || expandedKeys.has(node.key))) {\n for (let child of node.childNodes) {\n visit(child);\n }\n }\n };\n\n for (let node of nodes) {\n visit(node);\n }\n\n let last: Node<T> | null = null;\n let index = 0;\n for (let [key, node] of this.keyMap) {\n if (last) {\n last.nextKey = key;\n node.prevKey = last.key;\n } else {\n this.firstKey = key;\n node.prevKey = undefined;\n }\n\n if (node.type === 'item') {\n node.index = index++;\n }\n\n last = node;\n\n // Set nextKey as undefined since this might be the last node\n // If it isn't the last node, last.nextKey will properly set at start of new loop\n last.nextKey = undefined;\n }\n\n this.lastKey = last?.key ?? null;\n }\n\n *[Symbol.iterator](): IterableIterator<Node<T>> {\n yield* this.iterable;\n }\n\n get size(): number {\n return this.keyMap.size;\n }\n\n getKeys(): IterableIterator<Key> {\n return this.keyMap.keys();\n }\n\n getKeyBefore(key: Key): Key | null {\n let node = this.keyMap.get(key);\n return node ? node.prevKey ?? null : null;\n }\n\n getKeyAfter(key: Key): Key | null {\n let node = this.keyMap.get(key);\n return node ? node.nextKey ?? null : null;\n }\n\n getFirstKey(): Key | null {\n return this.firstKey;\n }\n\n getLastKey(): Key | null {\n return this.lastKey;\n }\n\n getItem(key: Key): Node<T> | null {\n return this.keyMap.get(key) ?? null;\n }\n\n at(idx: number): Node<T> | null {\n const keys = [...this.getKeys()];\n return this.getItem(keys[idx]);\n }\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {\n Collection,\n CollectionStateBase,\n DisabledBehavior,\n Expandable,\n Key,\n MultipleSelection,\n Node\n} from '@react-types/shared';\nimport {SelectionManager} from '../selection/SelectionManager';\nimport {TreeCollection} from './TreeCollection';\nimport {useCallback, useEffect, useMemo} from 'react';\nimport {useCollection} from '../collections/useCollection';\nimport {useControlledState} from '../utils/useControlledState';\nimport {useMultipleSelectionState} from '../selection/useMultipleSelectionState';\n\nexport interface TreeProps<T>\n extends CollectionStateBase<T>,\n Expandable,\n MultipleSelection {\n /** Whether `disabledKeys` applies to all interactions, or only selection. */\n disabledBehavior?: DisabledBehavior\n}\nexport interface TreeState<T> {\n /** A collection of items in the tree. */\n readonly collection: Collection<Node<T>>,\n\n /** A set of keys for items that are disabled. */\n readonly disabledKeys: Set<Key>,\n\n /** A set of keys for items that are expanded. */\n readonly expandedKeys: Set<Key>,\n\n /** Toggles the expanded state for an item by its key. */\n toggleKey(key: Key): void,\n\n /** Replaces the set of expanded keys. */\n setExpandedKeys(keys: Set<Key>): void,\n\n /** A selection manager to read and update multiple selection state. */\n readonly selectionManager: SelectionManager\n}\n\n/**\n * Provides state management for tree-like components. Handles building a collection\n * of items from props, item expanded state, and manages multiple selection state.\n */\nexport function useTreeState<T extends object>(props: TreeProps<T>): TreeState<T> {\n let {\n onExpandedChange\n } = props;\n\n let [expandedKeys, setExpandedKeys] = useControlledState(\n props.expandedKeys ? new Set(props.expandedKeys) : undefined,\n props.defaultExpandedKeys ? new Set(props.defaultExpandedKeys) : new Set(),\n onExpandedChange\n );\n\n let selectionState = useMultipleSelectionState(props);\n let disabledKeys = useMemo(() =>\n props.disabledKeys ? new Set(props.disabledKeys) : new Set<Key>()\n , [props.disabledKeys]);\n\n let tree = useCollection(props, useCallback(nodes => new TreeCollection(nodes, {expandedKeys}), [expandedKeys]), null);\n\n // Reset focused key if that item is deleted from the collection.\n useEffect(() => {\n if (selectionState.focusedKey != null && !tree.getItem(selectionState.focusedKey)) {\n selectionState.setFocusedKey(null);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [tree, selectionState.focusedKey]);\n\n let onToggle = (key: Key) => {\n setExpandedKeys(toggleKey(expandedKeys, key));\n };\n\n return {\n collection: tree,\n expandedKeys,\n disabledKeys,\n toggleKey: onToggle,\n setExpandedKeys,\n selectionManager: new SelectionManager(tree, selectionState)\n };\n}\n\nfunction toggleKey(set: Set<Key>, key: Key): Set<Key> {\n let res = new Set(set);\n if (res.has(key)) {\n res.delete(key);\n } else {\n res.add(key);\n }\n\n return res;\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface ChipProps {\n variant?: \"default\" | \"primary\" | \"success\" | \"warning\" | \"error\";\n size?: \"sm\" | \"md\";\n avatar?: ReactNode;\n icon?: ReactNode;\n removable?: boolean;\n onRemove?: () => void;\n onClick?: () => void;\n disabled?: boolean;\n children: ReactNode;\n className?: string;\n}\n\nexport function Chip({\n variant = \"default\",\n size = \"md\",\n avatar,\n icon,\n removable = false,\n onRemove,\n onClick,\n disabled = false,\n children,\n className,\n}: ChipProps) {\n const interactive = Boolean(onClick) && !disabled;\n return (\n <span\n className={cn(\n \"ods-chip\",\n `ods-chip--${variant}`,\n `ods-chip--${size}`,\n avatar && \"ods-chip--avatar\",\n interactive && \"ods-chip--interactive\",\n disabled && \"ods-chip--disabled\",\n className,\n )}\n onClick={interactive ? onClick : undefined}\n role={interactive ? \"button\" : undefined}\n tabIndex={interactive ? 0 : undefined}\n >\n {avatar && <span className=\"ods-chip__avatar\">{avatar}</span>}\n {icon && !avatar && (\n <span className=\"ods-chip__icon\" aria-hidden=\"true\">\n {icon}\n </span>\n )}\n <span className=\"ods-chip__label\">{children}</span>\n {removable && (\n <button\n type=\"button\"\n className=\"ods-chip__remove\"\n onClick={(e) => {\n e.stopPropagation();\n onRemove?.();\n }}\n aria-label=\"Remove\"\n disabled={disabled}\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M3 3L9 9M9 3L3 9\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n )}\n </span>\n );\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface ChoiceCardProps {\n icon?: ReactNode;\n title: ReactNode;\n description?: ReactNode;\n selected?: boolean;\n disabled?: boolean;\n badge?: ReactNode;\n onClick?: () => void;\n className?: string;\n}\n\nexport function ChoiceCard({\n icon,\n title,\n description,\n selected = false,\n disabled = false,\n badge,\n onClick,\n className,\n}: ChoiceCardProps) {\n return (\n <button\n type=\"button\"\n role=\"radio\"\n aria-checked={selected}\n disabled={disabled}\n onClick={onClick}\n className={cn(\n \"ods-choice-card\",\n selected && \"ods-choice-card--selected\",\n disabled && \"ods-choice-card--disabled\",\n className,\n )}\n >\n <div className=\"ods-choice-card__head\">\n {icon && <span className=\"ods-choice-card__icon\">{icon}</span>}\n {badge ? (\n <span className=\"ods-choice-card__badge\">{badge}</span>\n ) : (\n <span className={cn(\"ods-choice-card__check\", selected && \"ods-choice-card__check--on\")}>\n {selected && (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"m3 7.5 3 3 5-6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.7\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </span>\n )}\n </div>\n <div className=\"ods-choice-card__title\">{title}</div>\n {description && <div className=\"ods-choice-card__desc\">{description}</div>}\n </button>\n );\n}\n","\"use client\";\nimport { type ReactNode, useEffect, useMemo, useRef, useState } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport type CodeEditorLanguage = \"sql\" | \"json\" | \"javascript\" | \"typescript\" | \"yaml\" | \"plain\";\n\nexport interface CodeEditorProps {\n value: string;\n onChange?: (value: string) => void;\n language?: CodeEditorLanguage;\n /** Read-only mode. */\n readOnly?: boolean;\n /** Hide the gutter (line numbers). */\n showLineNumbers?: boolean;\n /** Highlight the active line. */\n highlightActiveLine?: boolean;\n /** Number of spaces a Tab inserts. */\n tabSize?: number;\n /** Minimum height in pixels. */\n minHeight?: number;\n /** Maximum height in pixels. */\n maxHeight?: number;\n placeholder?: string;\n ariaLabel?: string;\n /** Optional toolbar slot above the editor. */\n toolbar?: ReactNode;\n /** Status pill on the right side of the toolbar. */\n status?: ReactNode;\n className?: string;\n /** Show built-in Copy button. Default true. */\n showCopy?: boolean;\n /** Show built-in Format button (JSON only by default). */\n showFormat?: boolean;\n /** Word wrap (controlled). */\n wordWrap?: boolean;\n /** Show built-in word-wrap toggle. Default true (only when uncontrolled). */\n showWordWrapToggle?: boolean;\n /** Enable auto-pair brackets and quotes. Default true. */\n autoPair?: boolean;\n /** Show character/selection counter at bottom. Default true. */\n showCounter?: boolean;\n /** Enable Cmd+F search bar. Default true. */\n searchable?: boolean;\n}\n\nconst COMMENT_PREFIX: Record<CodeEditorLanguage, string> = {\n sql: \"-- \",\n json: \"// \",\n javascript: \"// \",\n typescript: \"// \",\n yaml: \"# \",\n plain: \"// \",\n};\n\nconst OPEN_PAIRS: Record<string, string> = {\n \"{\": \"}\",\n \"[\": \"]\",\n \"(\": \")\",\n '\"': '\"',\n \"'\": \"'\",\n \"`\": \"`\",\n};\nconst CLOSE_PAIRS = new Set(Object.values(OPEN_PAIRS));\n\nfunction tryFormat(value: string, language: CodeEditorLanguage): string | null {\n if (language === \"json\") {\n try {\n return JSON.stringify(JSON.parse(value), null, 2);\n } catch {\n return null;\n }\n }\n return null;\n}\n\nexport function CodeEditor({\n value,\n onChange,\n language = \"plain\",\n readOnly = false,\n showLineNumbers = true,\n highlightActiveLine = true,\n tabSize = 2,\n minHeight = 120,\n maxHeight,\n placeholder = \"Type code here…\",\n ariaLabel = \"Code editor\",\n toolbar,\n status,\n className,\n showCopy = true,\n showFormat,\n wordWrap: wordWrapProp,\n showWordWrapToggle = true,\n autoPair = true,\n showCounter = true,\n searchable = true,\n}: CodeEditorProps) {\n const taRef = useRef<HTMLTextAreaElement>(null);\n const gutterRef = useRef<HTMLDivElement>(null);\n const [activeLine, setActiveLine] = useState(1);\n const [copied, setCopied] = useState(false);\n const [internalWrap, setInternalWrap] = useState<boolean>(wordWrapProp ?? false);\n const wordWrap = wordWrapProp ?? internalWrap;\n const [selectionLen, setSelectionLen] = useState(0);\n const [selectionLines, setSelectionLines] = useState(0);\n const [findOpen, setFindOpen] = useState(false);\n const [findQuery, setFindQuery] = useState(\"\");\n const [findIndex, setFindIndex] = useState(0);\n const findInputRef = useRef<HTMLInputElement>(null);\n\n const lines = value.split(\"\\n\");\n const lineCount = lines.length;\n\n const matches = useMemo(() => {\n if (!findQuery) return [] as Array<{ start: number; end: number }>;\n const out: Array<{ start: number; end: number }> = [];\n const lower = value.toLowerCase();\n const q = findQuery.toLowerCase();\n let i = 0;\n while (i <= lower.length - q.length) {\n const idx = lower.indexOf(q, i);\n if (idx < 0) break;\n out.push({ start: idx, end: idx + q.length });\n i = idx + Math.max(1, q.length);\n }\n return out;\n }, [findQuery, value]);\n\n useEffect(() => {\n const ta = taRef.current;\n const gut = gutterRef.current;\n if (!ta || !gut) return;\n const onScroll = () => {\n gut.scrollTop = ta.scrollTop;\n };\n ta.addEventListener(\"scroll\", onScroll);\n return () => ta.removeEventListener(\"scroll\", onScroll);\n }, []);\n\n const updateSelection = () => {\n const ta = taRef.current;\n if (!ta) return;\n const start = ta.selectionStart;\n const end = ta.selectionEnd;\n const upTo = ta.value.slice(0, start);\n setActiveLine(upTo.split(\"\\n\").length);\n const selLen = end - start;\n setSelectionLen(selLen);\n if (selLen > 0) {\n const slice = ta.value.slice(start, end);\n setSelectionLines(slice.split(\"\\n\").length);\n } else {\n setSelectionLines(0);\n }\n };\n\n const setCaret = (start: number, end?: number) => {\n requestAnimationFrame(() => {\n const ta = taRef.current;\n if (!ta) return;\n ta.selectionStart = start;\n ta.selectionEnd = end ?? start;\n updateSelection();\n });\n };\n\n const replaceRange = (start: number, end: number, replacement: string, caretAt?: number) => {\n const next = value.slice(0, start) + replacement + value.slice(end);\n onChange?.(next);\n setCaret(caretAt ?? start + replacement.length);\n };\n\n const lineBounds = (text: string, caret: number) => {\n const before = text.lastIndexOf(\"\\n\", caret - 1);\n const after = text.indexOf(\"\\n\", caret);\n return {\n lineStart: before === -1 ? 0 : before + 1,\n lineEnd: after === -1 ? text.length : after,\n };\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n const ta = e.currentTarget;\n if (readOnly) return;\n const isMac = typeof navigator !== \"undefined\" && /Mac/.test(navigator.platform);\n const mod = isMac ? e.metaKey : e.ctrlKey;\n\n // Cmd+F → open find bar\n if (mod && (e.key === \"f\" || e.key === \"F\")) {\n if (!searchable) return;\n e.preventDefault();\n setFindOpen(true);\n requestAnimationFrame(() => findInputRef.current?.focus());\n return;\n }\n\n // Escape closes find\n if (e.key === \"Escape\" && findOpen) {\n e.preventDefault();\n setFindOpen(false);\n return;\n }\n\n // Cmd+/ → toggle comment for current line or selection\n if (mod && e.key === \"/\") {\n e.preventDefault();\n const prefix = COMMENT_PREFIX[language];\n const trimmedPrefix = prefix.trim();\n const start = ta.selectionStart;\n const end = ta.selectionEnd;\n const firstStart = lineBounds(value, start).lineStart;\n const lastEnd = lineBounds(value, end).lineEnd;\n const slice = value.slice(firstStart, lastEnd);\n const partLines = slice.split(\"\\n\");\n const allCommented = partLines.every(\n (l) => l.trim() === \"\" || l.trimStart().startsWith(trimmedPrefix),\n );\n const updated = partLines\n .map((l) => {\n if (l.trim() === \"\") return l;\n if (allCommented) {\n const idx = l.indexOf(trimmedPrefix);\n if (idx >= 0) return l.slice(0, idx) + l.slice(idx + prefix.length);\n return l;\n }\n const leading = l.match(/^\\s*/)?.[0] ?? \"\";\n return `${leading}${prefix}${l.slice(leading.length)}`;\n })\n .join(\"\\n\");\n const next = value.slice(0, firstStart) + updated + value.slice(lastEnd);\n onChange?.(next);\n const delta = updated.length - slice.length;\n setCaret(start + (allCommented ? -prefix.length : prefix.length), end + delta);\n return;\n }\n\n // Cmd+D → duplicate current line (or selection)\n if (mod && (e.key === \"d\" || e.key === \"D\")) {\n e.preventDefault();\n const start = ta.selectionStart;\n const end = ta.selectionEnd;\n if (start === end) {\n const { lineStart, lineEnd } = lineBounds(value, start);\n const line = value.slice(lineStart, lineEnd);\n const next = value.slice(0, lineEnd) + \"\\n\" + line + value.slice(lineEnd);\n onChange?.(next);\n setCaret(start + line.length + 1);\n } else {\n const slice = value.slice(start, end);\n const next = value.slice(0, end) + slice + value.slice(end);\n onChange?.(next);\n setCaret(end + slice.length);\n }\n return;\n }\n\n // Alt+ArrowUp/Down → move line up/down\n if (e.altKey && (e.key === \"ArrowUp\" || e.key === \"ArrowDown\")) {\n e.preventDefault();\n const direction = e.key === \"ArrowUp\" ? -1 : 1;\n const caret = ta.selectionStart;\n const linesArr = value.split(\"\\n\");\n let acc = 0;\n let lineIdx = 0;\n let lineStart = 0;\n for (let i = 0; i < linesArr.length; i++) {\n const lineLen = linesArr[i].length;\n if (caret <= acc + lineLen) {\n lineIdx = i;\n lineStart = acc;\n break;\n }\n acc += lineLen + 1;\n lineIdx = i;\n lineStart = acc;\n }\n const target = lineIdx + direction;\n if (target < 0 || target >= linesArr.length) return;\n const swap = linesArr[lineIdx];\n linesArr[lineIdx] = linesArr[target];\n linesArr[target] = swap;\n const next = linesArr.join(\"\\n\");\n onChange?.(next);\n let newStart = 0;\n for (let i = 0; i < target; i++) newStart += linesArr[i].length + 1;\n const col = caret - lineStart;\n setCaret(newStart + Math.min(col, linesArr[target].length));\n return;\n }\n\n // Tab → spaces (or indent block when multi-line selection)\n if (e.key === \"Tab\") {\n e.preventDefault();\n const start = ta.selectionStart;\n const end = ta.selectionEnd;\n if (start !== end && value.slice(start, end).includes(\"\\n\")) {\n const firstStart = lineBounds(value, start).lineStart;\n const lastEnd = lineBounds(value, end).lineEnd;\n const block = value.slice(firstStart, lastEnd);\n let updated: string;\n if (e.shiftKey) {\n updated = block\n .split(\"\\n\")\n .map((l) => l.replace(new RegExp(`^ {1,${tabSize}}`), \"\"))\n .join(\"\\n\");\n } else {\n const pad = \" \".repeat(tabSize);\n updated = block\n .split(\"\\n\")\n .map((l) => `${pad}${l}`)\n .join(\"\\n\");\n }\n const next = value.slice(0, firstStart) + updated + value.slice(lastEnd);\n onChange?.(next);\n setCaret(firstStart, firstStart + updated.length);\n return;\n }\n const spaces = \" \".repeat(tabSize);\n replaceRange(start, end, spaces);\n return;\n }\n\n // Enter → auto-indent (+ expanded block when between auto-pair)\n if (e.key === \"Enter\") {\n const start = ta.selectionStart;\n const before = value[start - 1];\n const after = value[start];\n const upTo = value.slice(0, start);\n const currentLine = upTo.split(\"\\n\").pop() ?? \"\";\n const indent = currentLine.match(/^\\s*/)?.[0] ?? \"\";\n\n if (autoPair && before && after && OPEN_PAIRS[before] === after) {\n e.preventDefault();\n const inner = `\\n${indent}${\" \".repeat(tabSize)}\\n${indent}`;\n const next = value.slice(0, start) + inner + value.slice(ta.selectionEnd);\n onChange?.(next);\n setCaret(start + 1 + indent.length + tabSize);\n return;\n }\n\n if (indent.length > 0) {\n e.preventDefault();\n const next = value.slice(0, start) + \"\\n\" + indent + value.slice(ta.selectionEnd);\n onChange?.(next);\n setCaret(start + 1 + indent.length);\n return;\n }\n }\n\n // Auto-pair: opening bracket/quote\n if (autoPair && !e.metaKey && !e.ctrlKey && !e.altKey && OPEN_PAIRS[e.key]) {\n const start = ta.selectionStart;\n const end = ta.selectionEnd;\n if (start !== end) {\n e.preventDefault();\n const selected = value.slice(start, end);\n const wrapped = `${e.key}${selected}${OPEN_PAIRS[e.key]}`;\n replaceRange(start, end, wrapped, end + 2);\n return;\n }\n const nextChar = value[start];\n // Skip pairing if we'd just stack identical quotes\n if ((e.key === '\"' || e.key === \"'\" || e.key === \"`\") && nextChar === e.key) {\n e.preventDefault();\n setCaret(start + 1);\n return;\n }\n e.preventDefault();\n const insert = `${e.key}${OPEN_PAIRS[e.key]}`;\n const next = value.slice(0, start) + insert + value.slice(start);\n onChange?.(next);\n setCaret(start + 1);\n return;\n }\n\n // Auto-skip closing bracket when next char already matches\n if (autoPair && CLOSE_PAIRS.has(e.key)) {\n const start = ta.selectionStart;\n if (start === ta.selectionEnd && value[start] === e.key) {\n e.preventDefault();\n setCaret(start + 1);\n return;\n }\n }\n\n // Backspace inside an empty pair → delete both\n if (autoPair && e.key === \"Backspace\") {\n const start = ta.selectionStart;\n if (start === ta.selectionEnd && start > 0) {\n const left = value[start - 1];\n const right = value[start];\n if (left && right && OPEN_PAIRS[left] === right) {\n e.preventDefault();\n const next = value.slice(0, start - 1) + value.slice(start + 1);\n onChange?.(next);\n setCaret(start - 1);\n return;\n }\n }\n }\n };\n\n const doFindNext = (dir: 1 | -1 = 1) => {\n if (matches.length === 0) return;\n const next = (findIndex + dir + matches.length) % matches.length;\n setFindIndex(next);\n const m = matches[next];\n setCaret(m.start, m.end);\n requestAnimationFrame(() => taRef.current?.focus());\n };\n\n const handleCopy = async () => {\n if (typeof navigator === \"undefined\") return;\n try {\n await navigator.clipboard.writeText(value);\n setCopied(true);\n setTimeout(() => setCopied(false), 1200);\n } catch {\n /* ignore */\n }\n };\n\n const handleFormat = () => {\n const formatted = tryFormat(value, language);\n if (formatted) onChange?.(formatted);\n };\n\n const showFormatBtn = (showFormat ?? language === \"json\") && !readOnly;\n const showWrapToggle = showWordWrapToggle && wordWrapProp === undefined;\n\n return (\n <div\n className={cn(\n \"ods-code-editor\",\n `ods-code-editor--${language}`,\n readOnly && \"ods-code-editor--readonly\",\n wordWrap && \"ods-code-editor--wrap\",\n className,\n )}\n >\n <div className=\"ods-code-editor__toolbar\">\n <div className=\"ods-code-editor__toolbar-left\">\n <span className=\"ods-code-editor__lang\">{language.toUpperCase()}</span>\n {toolbar}\n </div>\n <div className=\"ods-code-editor__toolbar-right\">\n <span className=\"ods-code-editor__lines\">\n {lineCount} line{lineCount === 1 ? \"\" : \"s\"}\n </span>\n {status && <span className=\"ods-code-editor__status\">{status}</span>}\n {showWrapToggle && (\n <button\n type=\"button\"\n className={cn(\n \"ods-code-editor__btn\",\n wordWrap && \"ods-code-editor__btn--active\",\n )}\n onClick={() => setInternalWrap((w) => !w)}\n aria-pressed={wordWrap}\n aria-label=\"Toggle word wrap\"\n title=\"Word wrap\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M2 3.5h10M2 7h7.5a2 2 0 1 1 0 4H8m0 0 1.5-1.5M8 11l1.5 1.5M2 10.5h3\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n )}\n {showFormatBtn && (\n <button\n type=\"button\"\n className=\"ods-code-editor__btn\"\n onClick={handleFormat}\n aria-label=\"Format\"\n title=\"Format (JSON)\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M2.5 4h9M4 7h7.5M5.5 10H11\" stroke=\"currentColor\" strokeWidth=\"1.3\" strokeLinecap=\"round\" />\n <path d=\"M2.5 7 3.5 6 2.5 5\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n )}\n {showCopy && (\n <button\n type=\"button\"\n className={cn(\n \"ods-code-editor__btn\",\n copied && \"ods-code-editor__btn--success\",\n )}\n onClick={handleCopy}\n aria-label=\"Copy\"\n title=\"Copy\"\n >\n {copied ? (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"m3 7 3 3 5-6\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n ) : (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <rect x=\"3\" y=\"3\" width=\"8\" height=\"8\" rx=\"1\" stroke=\"currentColor\" strokeWidth=\"1.3\" />\n <path d=\"M5 1.5h6V8\" stroke=\"currentColor\" strokeWidth=\"1.3\" strokeLinecap=\"round\" />\n </svg>\n )}\n </button>\n )}\n </div>\n </div>\n\n {findOpen && (\n <div className=\"ods-code-editor__find\" role=\"search\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"5\" cy=\"5\" r=\"3.5\" stroke=\"currentColor\" strokeWidth=\"1.3\" />\n <path d=\"M11 11 8.2 8.2\" stroke=\"currentColor\" strokeWidth=\"1.3\" strokeLinecap=\"round\" />\n </svg>\n <input\n ref={findInputRef}\n className=\"ods-code-editor__find-input\"\n type=\"text\"\n placeholder=\"Find…\"\n value={findQuery}\n onChange={(e) => {\n setFindQuery(e.target.value);\n setFindIndex(0);\n }}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n doFindNext(e.shiftKey ? -1 : 1);\n }\n if (e.key === \"Escape\") {\n e.preventDefault();\n setFindOpen(false);\n taRef.current?.focus();\n }\n }}\n />\n <span className=\"ods-code-editor__find-count\">\n {matches.length > 0 ? `${findIndex + 1} of ${matches.length}` : \"0\"}\n </span>\n <button\n type=\"button\"\n className=\"ods-code-editor__btn\"\n onClick={() => doFindNext(-1)}\n aria-label=\"Previous match\"\n disabled={matches.length === 0}\n >\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M3 6.5 5 4.5l2 2\" stroke=\"currentColor\" strokeWidth=\"1.4\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n <button\n type=\"button\"\n className=\"ods-code-editor__btn\"\n onClick={() => doFindNext(1)}\n aria-label=\"Next match\"\n disabled={matches.length === 0}\n >\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M3 3.5 5 5.5l2-2\" stroke=\"currentColor\" strokeWidth=\"1.4\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n <button\n type=\"button\"\n className=\"ods-code-editor__btn\"\n onClick={() => {\n setFindOpen(false);\n taRef.current?.focus();\n }}\n aria-label=\"Close find\"\n >\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"m3 3 4 4M7 3l-4 4\" stroke=\"currentColor\" strokeWidth=\"1.4\" strokeLinecap=\"round\" />\n </svg>\n </button>\n </div>\n )}\n\n <div className=\"ods-code-editor__body\" style={{ minHeight, maxHeight }}>\n {showLineNumbers && (\n <div ref={gutterRef} className=\"ods-code-editor__gutter\" aria-hidden=\"true\">\n {lines.map((_, i) => (\n <span\n key={i}\n className={cn(\n \"ods-code-editor__line-no\",\n highlightActiveLine && activeLine === i + 1 && \"ods-code-editor__line-no--active\",\n )}\n >\n {i + 1}\n </span>\n ))}\n </div>\n )}\n <textarea\n ref={taRef}\n className=\"ods-code-editor__textarea\"\n value={value}\n onChange={(e) => onChange?.(e.target.value)}\n onKeyDown={handleKeyDown}\n onKeyUp={updateSelection}\n onClick={updateSelection}\n onSelect={updateSelection}\n placeholder={placeholder}\n readOnly={readOnly}\n spellCheck={false}\n aria-label={ariaLabel}\n wrap={wordWrap ? \"soft\" : \"off\"}\n />\n </div>\n\n {showCounter && (\n <div className=\"ods-code-editor__footer\">\n <span className=\"ods-code-editor__pos\">\n Ln {activeLine}\n {selectionLen > 0 && (\n <>\n {\" \"}· {selectionLen} char{selectionLen === 1 ? \"\" : \"s\"}\n {selectionLines > 1 && ` · ${selectionLines} lines`}\n </>\n )}\n </span>\n <span className=\"ods-code-editor__shortcut-hint\">\n <kbd className=\"ods-code-editor__kbd\">⌘/</kbd> comment\n <span className=\"ods-code-editor__sep\">·</span>\n <kbd className=\"ods-code-editor__kbd\">⌘D</kbd> duplicate\n <span className=\"ods-code-editor__sep\">·</span>\n <kbd className=\"ods-code-editor__kbd\">⌥↑↓</kbd> move\n {searchable && (\n <>\n <span className=\"ods-code-editor__sep\">·</span>\n <kbd className=\"ods-code-editor__kbd\">⌘F</kbd> find\n </>\n )}\n </span>\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\nimport { type ChangeEvent, type ReactNode, useState } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface ColorPickerProps {\n label?: ReactNode;\n value: string;\n onChange?: (value: string) => void;\n swatches?: string[];\n showHex?: boolean;\n showPicker?: boolean;\n size?: \"sm\" | \"md\" | \"lg\";\n disabled?: boolean;\n className?: string;\n}\n\nconst DEFAULT_SWATCHES = [\n \"#ef4444\",\n \"#f59e0b\",\n \"#22c55e\",\n \"#0ea5e9\",\n \"#6366f1\",\n \"#8b5cf6\",\n \"#ec4899\",\n \"#1e1b4b\",\n];\n\nfunction isValidHex(v: string): boolean {\n return /^#([0-9a-f]{3}|[0-9a-f]{6})$/i.test(v);\n}\n\nexport function ColorPicker({\n label,\n value,\n onChange,\n swatches = DEFAULT_SWATCHES,\n showHex = true,\n showPicker = true,\n size = \"md\",\n disabled = false,\n className,\n}: ColorPickerProps) {\n const [hex, setHex] = useState(value);\n\n const commit = (v: string) => {\n setHex(v);\n if (isValidHex(v)) onChange?.(v);\n };\n\n const onHexChange = (e: ChangeEvent<HTMLInputElement>) => {\n let v = e.target.value;\n if (v && !v.startsWith(\"#\")) v = `#${v}`;\n commit(v);\n };\n\n const onNativeChange = (e: ChangeEvent<HTMLInputElement>) => {\n commit(e.target.value);\n };\n\n return (\n <div\n className={cn(\n \"ods-color\",\n `ods-color--${size}`,\n disabled && \"ods-color--disabled\",\n className,\n )}\n >\n {label && <label className=\"ods-color__label\">{label}</label>}\n <div className=\"ods-color__field\">\n <span className=\"ods-color__swatch\" style={{ background: value }} />\n {showHex && (\n <input\n type=\"text\"\n className=\"ods-color__hex\"\n value={hex.toUpperCase()}\n onChange={onHexChange}\n onBlur={() => (isValidHex(hex) ? null : setHex(value))}\n disabled={disabled}\n spellCheck={false}\n />\n )}\n {showPicker && (\n <label className=\"ods-color__pick\" aria-label=\"Open native color picker\">\n <input\n type=\"color\"\n value={isValidHex(value) ? value : \"#000000\"}\n onChange={onNativeChange}\n disabled={disabled}\n tabIndex={-1}\n />\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M3 11l8-8M9 1l4 4-2 2-4-4 2-2zM3 11v2h2\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </label>\n )}\n </div>\n {swatches.length > 0 && (\n <div className=\"ods-color__swatches\" role=\"radiogroup\" aria-label=\"Preset colors\">\n {swatches.map((c) => {\n const active = c.toLowerCase() === value.toLowerCase();\n return (\n <button\n key={c}\n type=\"button\"\n role=\"radio\"\n aria-checked={active}\n aria-label={c}\n className={cn(\"ods-color__sw\", active && \"ods-color__sw--active\")}\n style={{ background: c }}\n onClick={() => !disabled && commit(c)}\n disabled={disabled}\n />\n );\n })}\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\nimport {\n type KeyboardEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface ConditionField {\n value: string;\n label: string;\n icon?: ReactNode;\n description?: string;\n}\n\nexport interface ConditionOperator {\n value: string;\n label: string;\n symbol?: string; // e.g. \"=\", \"≠\", \">\", \"<=\"\n description?: string;\n}\n\nexport interface Condition {\n field: string;\n operator: string;\n value: string;\n}\n\nexport interface ConditionGroup {\n type: \"group\";\n joinOperator: \"AND\" | \"OR\";\n conditions: (Condition | ConditionGroup)[];\n}\n\nexport interface ConditionBuilderProps {\n conditions: Condition[];\n onChange: (conditions: Condition[]) => void;\n fields: ConditionField[];\n operators: ConditionOperator[];\n /** Auto-enables search above 8 options. Force on/off via boolean. */\n searchable?: boolean;\n allowGroups?: boolean;\n joinOperator?: \"AND\" | \"OR\";\n onJoinChange?: (join: \"AND\" | \"OR\") => void;\n className?: string;\n}\n\ninterface DropdownOption {\n value: string;\n label: string;\n icon?: ReactNode;\n symbol?: string;\n description?: string;\n}\n\ninterface OptionDropdownProps {\n value: string;\n options: DropdownOption[];\n onChange: (value: string) => void;\n placeholder?: string;\n searchable?: boolean | \"auto\";\n ariaLabel: string;\n minWidth?: number;\n}\n\nfunction OptionDropdown({\n value,\n options,\n onChange,\n placeholder = \"Select…\",\n searchable = \"auto\",\n ariaLabel,\n minWidth = 140,\n}: OptionDropdownProps) {\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState(\"\");\n const [activeIdx, setActiveIdx] = useState(0);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const listboxId = useId();\n\n const showSearch = searchable === true || (searchable === \"auto\" && options.length > 8);\n\n const selected = options.find((o) => o.value === value);\n\n const filtered = useMemo(() => {\n if (!showSearch || !query.trim()) return options;\n const q = query.trim().toLowerCase();\n return options.filter(\n (o) =>\n o.label.toLowerCase().includes(q) ||\n o.value.toLowerCase().includes(q) ||\n o.description?.toLowerCase().includes(q),\n );\n }, [options, query, showSearch]);\n\n // Reset active index when filter changes\n useEffect(() => {\n setActiveIdx(0);\n }, [query, open]);\n\n // Click outside closes\n useEffect(() => {\n if (!open) return;\n const onDoc = (e: MouseEvent) => {\n const t = e.target as Node;\n if (!triggerRef.current?.contains(t) && !panelRef.current?.contains(t)) {\n setOpen(false);\n setQuery(\"\");\n }\n };\n document.addEventListener(\"mousedown\", onDoc);\n return () => document.removeEventListener(\"mousedown\", onDoc);\n }, [open]);\n\n // Focus search input when opened with searchable\n useEffect(() => {\n if (open && showSearch) {\n requestAnimationFrame(() => inputRef.current?.focus());\n }\n }, [open, showSearch]);\n\n const select = (v: string) => {\n onChange(v);\n setOpen(false);\n setQuery(\"\");\n triggerRef.current?.focus();\n };\n\n const handleKey = (e: KeyboardEvent) => {\n if (!open) {\n if (e.key === \"Enter\" || e.key === \" \" || e.key === \"ArrowDown\") {\n e.preventDefault();\n setOpen(true);\n }\n return;\n }\n if (e.key === \"Escape\") {\n e.preventDefault();\n setOpen(false);\n setQuery(\"\");\n triggerRef.current?.focus();\n } else if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setActiveIdx((i) => Math.min(filtered.length - 1, i + 1));\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setActiveIdx((i) => Math.max(0, i - 1));\n } else if (e.key === \"Enter\") {\n e.preventDefault();\n const opt = filtered[activeIdx];\n if (opt) select(opt.value);\n } else if (e.key === \"Home\") {\n e.preventDefault();\n setActiveIdx(0);\n } else if (e.key === \"End\") {\n e.preventDefault();\n setActiveIdx(filtered.length - 1);\n }\n };\n\n return (\n <div className=\"ods-cb-dd\" style={{ minWidth }} onKeyDown={handleKey}>\n <button\n ref={triggerRef}\n type=\"button\"\n className={cn(\"ods-cb-dd__trigger\", open && \"ods-cb-dd__trigger--open\")}\n onClick={() => setOpen((o) => !o)}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-controls={open ? listboxId : undefined}\n aria-label={ariaLabel}\n >\n {selected?.icon && (\n <span className=\"ods-cb-dd__icon\" aria-hidden=\"true\">\n {selected.icon}\n </span>\n )}\n {selected?.symbol && <span className=\"ods-cb-dd__symbol\">{selected.symbol}</span>}\n <span className={cn(\"ods-cb-dd__label\", !selected && \"ods-cb-dd__label--placeholder\")}>\n {selected?.label ?? placeholder}\n </span>\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n aria-hidden=\"true\"\n className=\"ods-cb-dd__chev\"\n >\n <path\n d=\"M3 4.5 6 7.5 9 4.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n {open && (\n <div ref={panelRef} className=\"ods-cb-dd__panel\" role=\"presentation\">\n {showSearch && (\n <div className=\"ods-cb-dd__search\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"6\" cy=\"6\" r=\"4.5\" stroke=\"currentColor\" strokeWidth=\"1.4\" />\n <path\n d=\"m12 12-2.5-2.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n />\n </svg>\n <input\n ref={inputRef}\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder=\"Search…\"\n aria-label=\"Search options\"\n />\n </div>\n )}\n <ul id={listboxId} role=\"listbox\" aria-label={ariaLabel} className=\"ods-cb-dd__list\">\n {filtered.length === 0 && <li className=\"ods-cb-dd__empty\">No matches</li>}\n {filtered.map((opt, idx) => (\n <li key={opt.value}>\n <button\n type=\"button\"\n role=\"option\"\n aria-selected={opt.value === value}\n className={cn(\n \"ods-cb-dd__opt\",\n opt.value === value && \"ods-cb-dd__opt--selected\",\n idx === activeIdx && \"ods-cb-dd__opt--active\",\n )}\n onClick={() => select(opt.value)}\n onMouseEnter={() => setActiveIdx(idx)}\n >\n {opt.icon && (\n <span className=\"ods-cb-dd__opt-icon\" aria-hidden=\"true\">\n {opt.icon}\n </span>\n )}\n {opt.symbol && <span className=\"ods-cb-dd__opt-symbol\">{opt.symbol}</span>}\n <span className=\"ods-cb-dd__opt-text\">\n <span className=\"ods-cb-dd__opt-label\">{opt.label}</span>\n {opt.description && (\n <span className=\"ods-cb-dd__opt-desc\">{opt.description}</span>\n )}\n </span>\n {opt.value === value && (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n aria-hidden=\"true\"\n className=\"ods-cb-dd__opt-check\"\n >\n <path\n d=\"m3 7.5 3 3 5-6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.7\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </button>\n </li>\n ))}\n </ul>\n </div>\n )}\n </div>\n );\n}\n\nexport function ConditionBuilder({\n conditions,\n onChange,\n fields,\n operators,\n searchable,\n joinOperator = \"AND\",\n onJoinChange,\n className,\n}: ConditionBuilderProps) {\n const handleFieldChange = useCallback(\n (index: number, field: string) => {\n const next = [...conditions];\n next[index] = { ...next[index], field };\n onChange(next);\n },\n [conditions, onChange],\n );\n\n const handleOperatorChange = useCallback(\n (index: number, operator: string) => {\n const next = [...conditions];\n next[index] = { ...next[index], operator };\n onChange(next);\n },\n [conditions, onChange],\n );\n\n const handleValueChange = useCallback(\n (index: number, value: string) => {\n const next = [...conditions];\n next[index] = { ...next[index], value };\n onChange(next);\n },\n [conditions, onChange],\n );\n\n const handleRemove = useCallback(\n (index: number) => {\n onChange(conditions.filter((_, i) => i !== index));\n },\n [conditions, onChange],\n );\n\n const handleAdd = useCallback(() => {\n onChange([\n ...conditions,\n { field: fields[0]?.value ?? \"\", operator: operators[0]?.value ?? \"\", value: \"\" },\n ]);\n }, [conditions, onChange, fields, operators]);\n\n const handleJoinToggle = useCallback(() => {\n if (onJoinChange) onJoinChange(joinOperator === \"AND\" ? \"OR\" : \"AND\");\n }, [joinOperator, onJoinChange]);\n\n return (\n <div className={cn(\"ods-condition-builder\", className)}>\n {conditions.map((condition, index) => (\n <div key={index}>\n {index > 0 && (\n <div className=\"ods-condition-builder__join\">\n <button\n type=\"button\"\n className={cn(\n \"ods-condition-builder__join-btn\",\n onJoinChange && \"ods-condition-builder__join-btn--clickable\",\n )}\n onClick={onJoinChange ? handleJoinToggle : undefined}\n aria-label={`Join operator: ${joinOperator}.${onJoinChange ? \" Click to toggle.\" : \"\"}`}\n >\n {joinOperator}\n </button>\n </div>\n )}\n <div className=\"ods-condition-row\">\n <OptionDropdown\n ariaLabel=\"Field\"\n value={condition.field}\n options={fields}\n onChange={(v) => handleFieldChange(index, v)}\n searchable={typeof searchable === \"boolean\" ? searchable : \"auto\"}\n minWidth={160}\n />\n <OptionDropdown\n ariaLabel=\"Operator\"\n value={condition.operator}\n options={operators}\n onChange={(v) => handleOperatorChange(index, v)}\n searchable={typeof searchable === \"boolean\" ? searchable : \"auto\"}\n minWidth={140}\n />\n <input\n type=\"text\"\n className=\"ods-condition-row__value\"\n value={condition.value}\n onChange={(e) => handleValueChange(index, e.target.value)}\n placeholder=\"Value\"\n aria-label=\"Value\"\n />\n <button\n type=\"button\"\n className=\"ods-condition-row__remove\"\n onClick={() => handleRemove(index)}\n aria-label=\"Remove condition\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path\n fillRule=\"evenodd\"\n d=\"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </button>\n </div>\n </div>\n ))}\n <div className=\"ods-condition-builder__actions\">\n <button type=\"button\" className=\"ods-condition-builder__add\" onClick={handleAdd}>\n + Add condition\n </button>\n </div>\n </div>\n );\n}\n","\"use client\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport { type ReactNode, useRef } from \"react\";\nimport { useButton } from \"react-aria\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface ConfigPanelProps {\n open?: boolean;\n onClose?: () => void;\n title?: string;\n icon?: ReactNode;\n children?: ReactNode;\n onSave?: () => void;\n onCancel?: () => void;\n className?: string;\n}\n\nexport function ConfigPanel({\n open = false,\n onClose,\n title = \"Configure\",\n icon,\n children,\n onSave,\n onCancel,\n className,\n}: ConfigPanelProps) {\n const closeRef = useRef<HTMLButtonElement>(null);\n const saveRef = useRef<HTMLButtonElement>(null);\n const cancelRef = useRef<HTMLButtonElement>(null);\n\n const { buttonProps: closeProps } = useButton(\n { onPress: onClose, \"aria-label\": \"Close panel\" },\n closeRef,\n );\n const { buttonProps: saveProps } = useButton({ onPress: onSave }, saveRef);\n const { buttonProps: cancelProps } = useButton({ onPress: onCancel || onClose }, cancelRef);\n\n // Strip conflicting event props from react-aria before passing to DOM/motion\n const safeCloseProps = stripMotionConflicts(closeProps);\n const safeSaveProps = stripMotionConflicts(saveProps);\n const safeCancelProps = stripMotionConflicts(cancelProps);\n\n return (\n <AnimatePresence>\n {open && (\n <motion.div\n className={cn(\"ods-config-panel\", className)}\n initial={{ x: 320, opacity: 0 }}\n animate={{ x: 0, opacity: 1 }}\n exit={{ x: 320, opacity: 0 }}\n transition={{ type: \"spring\", stiffness: 300, damping: 30 }}\n data-testid=\"config-panel\"\n role=\"dialog\"\n aria-label={title}\n >\n {/* Header */}\n <div className={\"ods-config-panel__header\"}>\n <div className={\"ods-config-panel__header-left\"}>\n {icon && <div className={\"ods-config-panel__icon\"}>{icon}</div>}\n <h2 className={\"ods-config-panel__title\"}>{title}</h2>\n </div>\n <button\n {...safeCloseProps}\n ref={closeRef}\n className={\"ods-config-panel__close\"}\n data-testid=\"config-panel-close\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M4.646 4.646a.5.5 0 01.708 0L8 7.293l2.646-2.647a.5.5 0 01.708.708L8.707 8l2.647 2.646a.5.5 0 01-.708.708L8 8.707l-2.646 2.647a.5.5 0 01-.708-.708L7.293 8 4.646 5.354a.5.5 0 010-.708z\" />\n </svg>\n </button>\n </div>\n\n {/* Body */}\n <div className={\"ods-config-panel__body\"} data-testid=\"config-panel-body\">\n {children}\n </div>\n\n {/* Footer */}\n <div className={\"ods-config-panel__footer\"}>\n <button\n {...safeCancelProps}\n ref={cancelRef}\n className={cn(\"ods-config-panel__btn\", \"ods-config-panel__btn--cancel\")}\n data-testid=\"config-panel-cancel\"\n >\n Cancel\n </button>\n <button\n {...safeSaveProps}\n ref={saveRef}\n className={cn(\"ods-config-panel__btn\", \"ods-config-panel__btn--save\")}\n data-testid=\"config-panel-save\"\n >\n Save\n </button>\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n );\n}\n\n/** Strip event props that conflict with Framer Motion from React Aria's buttonProps */\nfunction stripMotionConflicts(props: Record<string, any>) {\n const { onDrag, onDragStart, onDragEnd, onAnimationStart, ...safe } = props;\n return safe;\n}\n","\"use client\";\nimport {\n type ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { cn } from \"../../utils/cn\";\n\n// ──────────────────────────────────────────────\n// Types\n// ──────────────────────────────────────────────\n\nexport interface DataMapperField {\n /** Stable key — also used as the inserted token path unless `path` is provided. */\n key: string;\n /** Display label. */\n label: string;\n /** Optional path inserted into the expression (e.g. \"address.city\"). Defaults to `key`. */\n path?: string;\n /** Field type — drives the type-pill color. */\n type?: string;\n /** API name annotation shown after the label. */\n apiName?: string;\n /** Mark as required (red asterisk). */\n required?: boolean;\n /** Nested fields. Objects/arrays expand \"For Each Record\" UI. */\n children?: DataMapperField[];\n /** Mark as an array (renders \"For Each Record\" toggle in target column). */\n isArray?: boolean;\n}\n\nexport interface DataMapping {\n /** Target field key. */\n target: string;\n /** Source expression (path, literal, or function call). */\n expression: string;\n}\n\nexport interface DataMapperFunction {\n /** Identifier used to insert the function — e.g. \"uppercase\". */\n key: string;\n /** Display label, e.g. \"Uppercase\". */\n label: string;\n /** Short description shown in the sidebar. */\n description?: string;\n /** Inserted snippet, e.g. \"uppercase(${1})\". Defaults to `${key}()`. */\n snippet?: string;\n /** Category for grouping in the sidebar. */\n category?: string;\n}\n\nexport type DataMapperDisplay = \"all\" | \"mapped\" | \"unmapped\" | \"required\";\n\nexport interface DataMapperProps {\n /** Header title. */\n title?: ReactNode;\n /** Target schema — every field shown as a row in the main grid. */\n targetFields: DataMapperField[];\n /** Source schema browsed in the side panel. */\n sourceFields?: DataMapperField[];\n /** Optional pre-built functions (uppercase, lowercase, concat, etc.). */\n functions?: DataMapperFunction[];\n /** Optional pre-defined variables. */\n variables?: DataMapperField[];\n /** Current mappings: array of `{ target, expression }`. */\n mappings: DataMapping[];\n onChange: (mappings: DataMapping[]) => void;\n /** Display filter (all/mapped/unmapped/required). */\n defaultDisplay?: DataMapperDisplay;\n /** Show Auto-match button. */\n showAutoMatch?: boolean;\n /** Show Save / Close buttons. */\n showSaveClose?: boolean;\n onSave?: () => void;\n onClose?: () => void;\n /** Sidebar starts open. */\n defaultSidebarOpen?: boolean;\n className?: string;\n}\n\n// ──────────────────────────────────────────────\n// Helpers\n// ──────────────────────────────────────────────\n\nconst TYPE_CLASSES: Record<string, string> = {\n string: \"string\",\n integer: \"integer\",\n int: \"integer\",\n number: \"integer\",\n datetime: \"datetime\",\n date: \"datetime\",\n timestamp: \"datetime\",\n boolean: \"boolean\",\n bool: \"boolean\",\n object: \"object\",\n array: \"object\",\n};\n\nfunction pathOf(f: DataMapperField): string {\n return f.path ?? f.key;\n}\n\nfunction flatten(\n fields: DataMapperField[],\n expanded: Set<string>,\n depth = 0,\n parentArray = false,\n): { field: DataMapperField; depth: number; isArrayItem: boolean }[] {\n const out: { field: DataMapperField; depth: number; isArrayItem: boolean }[] = [];\n for (const f of fields) {\n out.push({ field: f, depth, isArrayItem: parentArray });\n if (f.children && f.children.length > 0 && expanded.has(f.key)) {\n out.push(...flatten(f.children, expanded, depth + 1, !!f.isArray || f.type === \"array\"));\n }\n }\n return out;\n}\n\nfunction collectAll(fields: DataMapperField[]): DataMapperField[] {\n return fields.flatMap((f) => [f, ...(f.children ? collectAll(f.children) : [])]);\n}\n\n// ── Token markers ─────────────────────────────\n// Source field → {{path}} e.g. {{first_name}}\n// Variable → {{var:name}} e.g. {{var:tenant_id}}\n// Function call → uppercase(...) rendered as a function chip\nconst TOKEN_RE = /\\{\\{([^}]+)\\}\\}/g;\nconst FN_RE = /\\b([a-zA-Z_][a-zA-Z0-9_]*)\\(/g;\n\nfunction fieldToken(path: string): string {\n return `{{${path}}}`;\n}\nfunction variableToken(path: string): string {\n return `{{var:${path}}}`;\n}\n\nfunction autoMatchByName(\n source: DataMapperField[],\n target: DataMapperField[],\n): DataMapping[] {\n const src = collectAll(source);\n const out: DataMapping[] = [];\n const seen = new Set<string>();\n\n const visit = (fields: DataMapperField[]) => {\n for (const t of fields) {\n const match = src.find((s) => s.label.toLowerCase() === t.label.toLowerCase());\n if (match && !seen.has(t.key)) {\n out.push({ target: t.key, expression: fieldToken(pathOf(match)) });\n seen.add(t.key);\n }\n if (t.children) visit(t.children);\n }\n };\n visit(target);\n return out;\n}\n\nfunction findByPath(\n fields: DataMapperField[],\n path: string,\n): DataMapperField | undefined {\n for (const f of fields) {\n if (pathOf(f) === path || f.key === path) return f;\n if (f.children) {\n const found = findByPath(f.children, path);\n if (found) return found;\n }\n }\n return undefined;\n}\n\n// ── HTML helpers for the contentEditable expression editor ─────────────────\nfunction escapeHtml(s: string): string {\n return s\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\");\n}\nfunction escapeAttr(s: string): string {\n return escapeHtml(s).replace(/\"/g, \""\");\n}\n\nfunction chipHtml(\n inner: string,\n sourceFields: DataMapperField[],\n variables: DataMapperField[],\n): string {\n const isVar = inner.startsWith(\"var:\");\n const path = isVar ? inner.slice(4) : inner;\n const meta = isVar ? findByPath(variables, path) : findByPath(sourceFields, path);\n const label = meta?.label ?? path;\n const tone = isVar\n ? \"variable\"\n : meta?.type\n ? TYPE_TONE[meta.type.toLowerCase()] ?? \"default\"\n : \"default\";\n const glyph = isVar ? \"$\" : \"→\";\n return (\n `<span class=\"ods-data-mapper__expr-chip ods-data-mapper__expr-chip--${tone}\" ` +\n `contenteditable=\"false\" data-token=\"${escapeAttr(inner)}\">` +\n `<span class=\"ods-data-mapper__expr-chip-glyph\" aria-hidden=\"true\">${glyph}</span>` +\n `<span class=\"ods-data-mapper__expr-chip-label\">${escapeHtml(label)}</span>` +\n `</span>`\n );\n}\n\n/** Convert an expression string to HTML for contentEditable rendering. */\nfunction expressionToHtml(\n expression: string,\n sourceFields: DataMapperField[],\n variables: DataMapperField[],\n): string {\n let out = \"\";\n let lastIdx = 0;\n TOKEN_RE.lastIndex = 0;\n let m: RegExpExecArray | null;\n while ((m = TOKEN_RE.exec(expression)) !== null) {\n if (m.index > lastIdx) {\n out += escapeHtml(expression.slice(lastIdx, m.index));\n }\n out += chipHtml(m[1], sourceFields, variables);\n lastIdx = m.index + m[0].length;\n }\n if (lastIdx < expression.length) {\n out += escapeHtml(expression.slice(lastIdx));\n }\n return out;\n}\n\n/** Walk the contentEditable DOM and serialize back to the {{path}} string form. */\nfunction htmlToExpression(root: HTMLElement): string {\n let out = \"\";\n const walk = (node: Node) => {\n if (node.nodeType === Node.TEXT_NODE) {\n out += node.textContent ?? \"\";\n return;\n }\n if (node instanceof HTMLElement) {\n const token = node.dataset.token;\n if (token != null) {\n out += `{{${token}}}`;\n return;\n }\n // BR nodes → newline; otherwise recurse\n if (node.tagName === \"BR\") {\n out += \"\\n\";\n return;\n }\n node.childNodes.forEach(walk);\n }\n };\n root.childNodes.forEach(walk);\n return out;\n}\n\n/** Build a real DOM chip from a snippet for live insertion during drop / click. */\nfunction snippetToChipNode(\n snippet: string,\n sourceFields: DataMapperField[],\n variables: DataMapperField[],\n): DocumentFragment {\n const frag = document.createDocumentFragment();\n // Token-shaped snippets become chips; everything else becomes plain text.\n const tokenMatch = snippet.match(/^\\{\\{([^}]+)\\}\\}$/);\n if (tokenMatch) {\n const wrapper = document.createElement(\"template\");\n wrapper.innerHTML = chipHtml(tokenMatch[1], sourceFields, variables);\n frag.appendChild(wrapper.content);\n } else {\n frag.appendChild(document.createTextNode(snippet));\n }\n return frag;\n}\n\n/**\n * Render an expression string as a mixed sequence of chips + text:\n * \"{{first_name}} + ' ' + {{last_name}}\"\n * → [chip:First Name][ + ' ' + ][chip:Last Name]\n *\n * Function calls (foo(...)) inside the literal segments get a mono pill.\n */\nfunction renderExpressionSegments(\n expression: string,\n sourceFields: DataMapperField[],\n variables: DataMapperField[],\n onRemove?: (tokenIndex: number) => void,\n): ReactNode[] {\n const out: ReactNode[] = [];\n let lastIdx = 0;\n let tokenIdx = 0;\n let key = 0;\n // Reset regex state — TOKEN_RE has the /g flag so it carries state\n TOKEN_RE.lastIndex = 0;\n let m: RegExpExecArray | null;\n while ((m = TOKEN_RE.exec(expression)) !== null) {\n if (m.index > lastIdx) {\n out.push(\n ...renderLiteralSegment(expression.slice(lastIdx, m.index), key),\n );\n key += 4;\n }\n const raw = m[1].trim();\n const isVar = raw.startsWith(\"var:\");\n const path = isVar ? raw.slice(4) : raw;\n const meta = isVar ? findByPath(variables, path) : findByPath(sourceFields, path);\n const label = meta?.label ?? path;\n const tone = isVar ? \"variable\" : meta?.type ? TYPE_TONE[meta.type.toLowerCase()] ?? \"default\" : \"default\";\n const currentTokenIdx = tokenIdx;\n out.push(\n <span\n key={`tok-${key++}`}\n className={cn(\n \"ods-data-mapper__expr-chip\",\n `ods-data-mapper__expr-chip--${tone}`,\n )}\n title={isVar ? `Variable · ${path}` : `Source · ${path}`}\n >\n <span className=\"ods-data-mapper__expr-chip-glyph\" aria-hidden=\"true\">\n {isVar ? \"$\" : \"→\"}\n </span>\n <span className=\"ods-data-mapper__expr-chip-label\">{label}</span>\n {onRemove && (\n <button\n type=\"button\"\n className=\"ods-data-mapper__expr-chip-remove\"\n onClick={(e) => {\n e.stopPropagation();\n onRemove(currentTokenIdx);\n }}\n aria-label={`Remove ${label}`}\n title=\"Remove\"\n >\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M2 2l4 4M6 2l-4 4\" stroke=\"currentColor\" strokeWidth=\"1.4\" strokeLinecap=\"round\" />\n </svg>\n </button>\n )}\n </span>,\n );\n lastIdx = m.index + m[0].length;\n tokenIdx++;\n }\n if (lastIdx < expression.length) {\n out.push(...renderLiteralSegment(expression.slice(lastIdx), key));\n }\n return out;\n}\n\nconst TYPE_TONE: Record<string, string> = {\n string: \"string\",\n integer: \"integer\",\n int: \"integer\",\n number: \"integer\",\n datetime: \"datetime\",\n date: \"datetime\",\n timestamp: \"datetime\",\n boolean: \"boolean\",\n bool: \"boolean\",\n object: \"object\",\n array: \"object\",\n};\n\n// Split a literal segment so function calls show as their own mono pill too.\nfunction renderLiteralSegment(text: string, keyBase: number): ReactNode[] {\n const out: ReactNode[] = [];\n let lastIdx = 0;\n FN_RE.lastIndex = 0;\n let m: RegExpExecArray | null;\n while ((m = FN_RE.exec(text)) !== null) {\n // Find the matching closing paren\n const start = m.index;\n let depth = 1;\n let i = m.index + m[0].length;\n while (i < text.length && depth > 0) {\n if (text[i] === \"(\") depth++;\n else if (text[i] === \")\") depth--;\n i++;\n }\n if (depth !== 0) continue; // unbalanced — skip\n if (start > lastIdx) {\n out.push(\n <span key={`t-${keyBase}-${lastIdx}`} className=\"ods-data-mapper__expr-text\">\n {text.slice(lastIdx, start)}\n </span>,\n );\n }\n out.push(\n <span\n key={`fn-${keyBase}-${start}`}\n className=\"ods-data-mapper__expr-chip ods-data-mapper__expr-chip--function\"\n title=\"Function\"\n >\n <span className=\"ods-data-mapper__expr-chip-glyph\" aria-hidden=\"true\">ƒx</span>\n <span className=\"ods-data-mapper__expr-chip-label\">{text.slice(start, i)}</span>\n </span>,\n );\n lastIdx = i;\n FN_RE.lastIndex = i;\n }\n if (lastIdx < text.length) {\n out.push(\n <span key={`t-${keyBase}-tail`} className=\"ods-data-mapper__expr-text\">\n {text.slice(lastIdx)}\n </span>,\n );\n }\n return out;\n}\n\n// ──────────────────────────────────────────────\n// SVG glyphs\n// ──────────────────────────────────────────────\nconst SearchIcon = () => (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"5\" cy=\"5\" r=\"3.5\" stroke=\"currentColor\" strokeWidth=\"1.3\" />\n <path d=\"m10 10-2-2\" stroke=\"currentColor\" strokeWidth=\"1.3\" strokeLinecap=\"round\" />\n </svg>\n);\nconst FxIcon = () => (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M3 9V5.5C3 4 4 3 5.5 3M3 6.5h2.5M7 4l3 5M10 4l-3 5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\nconst SchemaIcon = () => (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <rect x=\"1.5\" y=\"2\" width=\"9\" height=\"2.5\" rx=\"0.5\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <rect x=\"1.5\" y=\"5.5\" width=\"9\" height=\"2.5\" rx=\"0.5\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <rect x=\"1.5\" y=\"9\" width=\"6\" height=\"1.5\" rx=\"0.5\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n </svg>\n);\nconst VarIcon = () => (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M3 4l1.5 4M4.5 4L3 8M7 4l-1 4M6 4h2M9 4v2.5c0 .5.4 1 1 1\"\n stroke=\"currentColor\"\n strokeWidth=\"1.2\"\n strokeLinecap=\"round\"\n />\n </svg>\n);\nconst ChevronRightIcon = () => (\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M3 2 5 4 3 6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\nconst ChevronDownIcon = () => (\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M2 3 4 5 6 3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\nconst TrashIcon = () => (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M2.5 3.5h7M4 3.5V2.5h4v1M3.5 3.5l.4 6.5h4.2l.4-6.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\nconst XIcon = () => (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M3 3l6 6M9 3l-6 6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n);\nconst ArrowRightIcon = () => (\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M1.5 5h7M6 2.5 8.5 5 6 7.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// ──────────────────────────────────────────────\n// Component\n// ──────────────────────────────────────────────\n\nexport function DataMapper({\n title = \"Mapping\",\n targetFields,\n sourceFields = [],\n functions = [],\n variables = [],\n mappings,\n onChange,\n defaultDisplay = \"all\",\n showAutoMatch = true,\n showSaveClose = false,\n onSave,\n onClose,\n defaultSidebarOpen = true,\n className,\n}: DataMapperProps) {\n const [selectedTarget, setSelectedTarget] = useState<string | null>(null);\n const [expandedTargets, setExpandedTargets] = useState<Set<string>>(new Set());\n const [expandedSource, setExpandedSource] = useState<Set<string>>(new Set());\n const [targetSearch, setTargetSearch] = useState(\"\");\n const [sourceSearch, setSourceSearch] = useState(\"\");\n const [display, setDisplay] = useState<DataMapperDisplay>(defaultDisplay);\n const [sidebarOpen, setSidebarOpen] = useState(defaultSidebarOpen);\n const [sidebarTab, setSidebarTab] = useState<\"schema\" | \"functions\" | \"variables\">(\"schema\");\n const editorRef = useRef<HTMLDivElement>(null);\n const rootRef = useRef<HTMLDivElement>(null);\n\n // Clicking outside the active editor exits edit mode.\n // Allowed \"inside\" zones: any row, the sidebar (so users can click/drag tokens in),\n // and the editor itself. Clicks on the toolbar, sub-toolbar, empty grid area,\n // or anywhere outside the mapper deselect.\n useEffect(() => {\n if (!selectedTarget) return;\n const handler = (e: MouseEvent) => {\n const root = rootRef.current;\n if (!root) return;\n const target = e.target as HTMLElement | null;\n if (!target) return;\n\n // Click outside the mapper entirely → deselect.\n if (!root.contains(target)) {\n setSelectedTarget(null);\n return;\n }\n // Inside the sidebar — user might be picking a token to insert. Keep selection.\n if (target.closest(\".ods-data-mapper__sidebar\")) return;\n // Inside a target row — its onClick handles selection (switch or stay).\n if (target.closest(\".ods-data-mapper__row\")) return;\n // Inside the active editor — keep selection.\n if (target.closest(\".ods-data-mapper__editor\")) return;\n\n // Otherwise (toolbar, sub-toolbar, empty grid bg, header) → deselect.\n setSelectedTarget(null);\n };\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, [selectedTarget]);\n\n // ── Mapping accessors ─────────────────────\n const expressionFor = useCallback(\n (target: string): string => mappings.find((m) => m.target === target)?.expression ?? \"\",\n [mappings],\n );\n\n const setExpression = useCallback(\n (target: string, expression: string) => {\n const trimmed = expression.trim();\n const existing = mappings.findIndex((m) => m.target === target);\n let next: DataMapping[];\n if (trimmed === \"\") {\n next = mappings.filter((m) => m.target !== target);\n } else if (existing >= 0) {\n next = mappings.map((m) => (m.target === target ? { ...m, expression } : m));\n } else {\n next = [...mappings, { target, expression }];\n }\n onChange(next);\n },\n [mappings, onChange],\n );\n\n // Insert a snippet at the current caret of the active editor, or append.\n // When the editor is focused, we MUTATE its DOM directly (rather than re-rendering\n // via React) so the caret position is preserved and chips slot in inline.\n const insertIntoExpression = useCallback(\n (snippet: string) => {\n if (!selectedTarget) return;\n const editor = editorRef.current;\n const current = expressionFor(selectedTarget);\n\n if (editor && document.activeElement === editor) {\n // Live insert via Selection API at the current caret.\n const sel = window.getSelection();\n if (sel && sel.rangeCount > 0 && editor.contains(sel.anchorNode)) {\n const range = sel.getRangeAt(0);\n range.deleteContents();\n const frag = snippetToChipNode(snippet, sourceFields, variables);\n // Capture the last inserted node so we can place the caret after it.\n const lastNode = frag.lastChild;\n range.insertNode(frag);\n if (lastNode) {\n range.setStartAfter(lastNode);\n range.setEndAfter(lastNode);\n sel.removeAllRanges();\n sel.addRange(range);\n }\n // Sync React state from the DOM we just mutated.\n setExpression(selectedTarget, htmlToExpression(editor));\n editor.focus();\n return;\n }\n }\n\n // Not focused — append (with \" + \" concat if there's existing content).\n const next = current\n ? `${current.trimEnd()} ${snippet.startsWith(\"{{\") ? \"+ \" : \"\"}${snippet}`\n : snippet;\n setExpression(selectedTarget, next);\n },\n [selectedTarget, expressionFor, setExpression, sourceFields, variables],\n );\n\n // Drop a source/function path onto a target row.\n // - If the row is currently being edited, splice the snippet at the caret (chip insertion).\n // - Otherwise, append with \" + \" for clean concatenation (e.g. first_name + \" \" + last_name).\n // - If the row is empty, just set the snippet.\n const dropOntoTarget = useCallback(\n (targetKey: string, snippet: string) => {\n setSelectedTarget(targetKey);\n const current = expressionFor(targetKey);\n const editor = editorRef.current;\n const editingThisRow =\n selectedTarget === targetKey && editor && document.activeElement === editor;\n if (editingThisRow) {\n // Insert at caret via Selection API (chip lands inline).\n insertIntoExpression(snippet);\n return;\n }\n if (!current.trim()) {\n setExpression(targetKey, snippet);\n } else {\n setExpression(targetKey, `${current.trimEnd()} + ${snippet}`);\n }\n },\n [selectedTarget, expressionFor, setExpression, insertIntoExpression],\n );\n\n // Remove a single chip token from a target's expression by its index in the regex match order.\n const removeTokenAt = useCallback(\n (targetKey: string, tokenIndex: number) => {\n const expr = expressionFor(targetKey);\n let i = 0;\n const next = expr.replace(TOKEN_RE, (whole) => {\n const skip = i === tokenIndex;\n i++;\n return skip ? \"\" : whole;\n });\n // Clean up dangling operators / double spaces left after removal\n const tidied = next\n .replace(/\\s*\\+\\s*\\+\\s*/g, \" + \")\n .replace(/^\\s*\\+\\s*/, \"\")\n .replace(/\\s*\\+\\s*$/, \"\")\n .replace(/\\s{2,}/g, \" \")\n .trim();\n setExpression(targetKey, tidied);\n },\n [expressionFor, setExpression],\n );\n\n // ── Drag-and-drop state ───────────────────\n const [dropTarget, setDropTarget] = useState<string | null>(null);\n\n // Extract token from a dataTransfer event\n const readDragSnippet = (e: React.DragEvent): string | null => {\n try {\n const json = e.dataTransfer.getData(\"application/x-ods-mapper\");\n if (json) {\n const parsed = JSON.parse(json) as { snippet?: string };\n if (parsed?.snippet) return parsed.snippet;\n }\n } catch {\n /* ignore */\n }\n const plain = e.dataTransfer.getData(\"text/plain\");\n return plain || null;\n };\n\n const beginDrag = (e: React.DragEvent, snippet: string) => {\n e.dataTransfer.effectAllowed = \"copy\";\n e.dataTransfer.setData(\n \"application/x-ods-mapper\",\n JSON.stringify({ snippet }),\n );\n e.dataTransfer.setData(\"text/plain\", snippet);\n };\n\n // ── Rows + filtering ──────────────────────\n const rows = useMemo(\n () => flatten(targetFields, expandedTargets),\n [targetFields, expandedTargets],\n );\n\n const filteredRows = useMemo(() => {\n const q = targetSearch.trim().toLowerCase();\n return rows.filter(({ field }) => {\n if (q) {\n const hay = `${field.label} ${field.apiName ?? \"\"} ${field.key}`.toLowerCase();\n if (!hay.includes(q)) return false;\n }\n const expr = expressionFor(field.key);\n if (display === \"mapped\" && !expr) return false;\n if (display === \"unmapped\" && expr) return false;\n if (display === \"required\" && !field.required) return false;\n return true;\n });\n }, [rows, targetSearch, display, expressionFor]);\n\n // ── Stats ─────────────────────────────────\n const totalTargets = useMemo(() => collectAll(targetFields).length, [targetFields]);\n const mappedCount = mappings.length;\n const requiredUnmapped = useMemo(() => {\n const all = collectAll(targetFields);\n return all.filter((f) => f.required && !mappings.some((m) => m.target === f.key)).length;\n }, [targetFields, mappings]);\n\n // ── Source rows for sidebar ───────────────\n const sourceRows = useMemo(() => {\n const flat = flatten(sourceFields, expandedSource);\n const q = sourceSearch.trim().toLowerCase();\n if (!q) return flat;\n return flat.filter(({ field }) =>\n `${field.label} ${field.apiName ?? \"\"} ${field.key}`.toLowerCase().includes(q),\n );\n }, [sourceFields, expandedSource, sourceSearch]);\n\n // ── Actions ───────────────────────────────\n const handleAutoMatch = () => {\n if (sourceFields.length === 0) return;\n const next = autoMatchByName(sourceFields, targetFields);\n if (next.length > 0) onChange(next);\n };\n\n const handleClearAll = () => onChange([]);\n\n const handleToggleTarget = (key: string) => {\n setExpandedTargets((s) => {\n const n = new Set(s);\n if (n.has(key)) n.delete(key);\n else n.add(key);\n return n;\n });\n };\n\n const handleToggleSource = (key: string) => {\n setExpandedSource((s) => {\n const n = new Set(s);\n if (n.has(key)) n.delete(key);\n else n.add(key);\n return n;\n });\n };\n\n // ── Render helpers ────────────────────────\n const renderTypePill = (type?: string) => {\n if (!type) return null;\n const tone = TYPE_CLASSES[type.toLowerCase()] ?? \"default\";\n return (\n <span className={cn(\"ods-data-mapper__type\", `ods-data-mapper__type--${tone}`)}>\n {type}\n </span>\n );\n };\n\n // ──────────────────────────────────────────\n return (\n <div\n ref={rootRef}\n className={cn(\n \"ods-data-mapper\",\n sidebarOpen && \"ods-data-mapper--sidebar-open\",\n className,\n )}\n >\n {/* ── Header / Toolbar ── */}\n <div className=\"ods-data-mapper__toolbar\">\n <div className=\"ods-data-mapper__toolbar-left\">\n <span className=\"ods-data-mapper__icon-badge\" aria-hidden=\"true\">\n <ArrowRightIcon />\n </span>\n <h3 className=\"ods-data-mapper__title\">{title}</h3>\n <div className=\"ods-data-mapper__stats\">\n <span className=\"ods-data-mapper__stat\">\n <span className=\"ods-data-mapper__stat-value\">{mappedCount}</span>\n <span className=\"ods-data-mapper__stat-label\">/ {totalTargets} mapped</span>\n </span>\n {requiredUnmapped > 0 && (\n <>\n <span className=\"ods-data-mapper__stat-sep\">·</span>\n <span className=\"ods-data-mapper__stat ods-data-mapper__stat--warn\">\n <span className=\"ods-data-mapper__stat-value\">{requiredUnmapped}</span>\n <span className=\"ods-data-mapper__stat-label\">required missing</span>\n </span>\n </>\n )}\n </div>\n </div>\n <div className=\"ods-data-mapper__toolbar-right\">\n {showAutoMatch && sourceFields.length > 0 && (\n <button\n type=\"button\"\n className=\"ods-data-mapper__action\"\n onClick={handleAutoMatch}\n title=\"Match fields by name\"\n >\n <FxIcon />\n <span>Auto-match</span>\n </button>\n )}\n {mappedCount > 0 && (\n <button\n type=\"button\"\n className=\"ods-data-mapper__action ods-data-mapper__action--ghost\"\n onClick={handleClearAll}\n title=\"Clear all mappings\"\n >\n Clear\n </button>\n )}\n {!sidebarOpen && (\n <button\n type=\"button\"\n className=\"ods-data-mapper__action\"\n onClick={() => setSidebarOpen(true)}\n aria-label=\"Open data stream\"\n >\n <SchemaIcon />\n <span>Data Stream</span>\n </button>\n )}\n </div>\n </div>\n\n {/* ── Sub-toolbar (filter + search) ── */}\n <div className=\"ods-data-mapper__subtoolbar\">\n <div className=\"ods-data-mapper__search\">\n <SearchIcon />\n <input\n type=\"text\"\n placeholder=\"Search target fields…\"\n value={targetSearch}\n onChange={(e) => setTargetSearch(e.target.value)}\n aria-label=\"Search target fields\"\n />\n </div>\n <div className=\"ods-data-mapper__display\">\n {([\"all\", \"mapped\", \"unmapped\", \"required\"] as DataMapperDisplay[]).map((d) => (\n <button\n key={d}\n type=\"button\"\n className={cn(\n \"ods-data-mapper__display-btn\",\n display === d && \"ods-data-mapper__display-btn--active\",\n )}\n onClick={() => setDisplay(d)}\n >\n {d.charAt(0).toUpperCase() + d.slice(1)}\n </button>\n ))}\n </div>\n </div>\n\n {/* ── Body: grid + sidebar ── */}\n <div className=\"ods-data-mapper__body\">\n <div className=\"ods-data-mapper__grid\">\n {/* Column headers */}\n <div className=\"ods-data-mapper__grid-head\" role=\"row\">\n <div className=\"ods-data-mapper__grid-head-cell\">Target field</div>\n <div className=\"ods-data-mapper__grid-head-cell\">Expression</div>\n </div>\n\n {filteredRows.length === 0 ? (\n <div className=\"ods-data-mapper__empty\">\n {targetSearch ? \"No matching target fields\" : \"No target fields\"}\n </div>\n ) : (\n filteredRows.map(({ field, depth, isArrayItem }) => {\n const isSelected = selectedTarget === field.key;\n const hasChildren = !!(field.children && field.children.length > 0);\n const isExpanded = expandedTargets.has(field.key);\n const expr = expressionFor(field.key);\n const isMapped = !!expr;\n\n return (\n <div\n key={field.key}\n className={cn(\n \"ods-data-mapper__row\",\n isSelected && \"ods-data-mapper__row--selected\",\n isMapped && \"ods-data-mapper__row--mapped\",\n dropTarget === field.key && \"ods-data-mapper__row--drop-target\",\n )}\n data-target-key={field.key}\n onDragEnter={(e) => {\n if (hasChildren) return;\n e.preventDefault();\n setDropTarget((prev) => (prev === field.key ? prev : field.key));\n }}\n onDragOver={(e) => {\n if (hasChildren) return;\n e.preventDefault();\n e.dataTransfer.dropEffect = \"copy\";\n // Keep the highlight latched even if a stray dragleave slipped through.\n if (dropTarget !== field.key) setDropTarget(field.key);\n }}\n onDragLeave={(e) => {\n if (hasChildren) return;\n // Standard HTML5 DnD pitfall: dragleave fires whenever the pointer\n // crosses ANY child boundary. We only want to clear when the pointer\n // actually leaves the row container — use relatedTarget to detect it.\n const next = e.relatedTarget as Node | null;\n if (next && e.currentTarget.contains(next)) return;\n setDropTarget((prev) => (prev === field.key ? null : prev));\n }}\n onDrop={(e) => {\n if (hasChildren) return;\n e.preventDefault();\n const snippet = readDragSnippet(e);\n setDropTarget(null);\n if (snippet) dropOntoTarget(field.key, snippet);\n }}\n >\n {/* TARGET CELL */}\n <div\n className=\"ods-data-mapper__cell ods-data-mapper__cell--target\"\n onClick={() => !hasChildren && setSelectedTarget(field.key)}\n >\n {depth > 0 && (\n <span className=\"ods-data-mapper__guides\" aria-hidden=\"true\">\n {Array.from({ length: depth }).map((_, i) => (\n <span\n key={i}\n className={cn(\n \"ods-data-mapper__guide\",\n i === depth - 1 && \"ods-data-mapper__guide--last\",\n )}\n />\n ))}\n </span>\n )}\n {hasChildren ? (\n <button\n type=\"button\"\n className={cn(\n \"ods-data-mapper__caret\",\n isExpanded && \"ods-data-mapper__caret--open\",\n )}\n onClick={(e) => {\n e.stopPropagation();\n handleToggleTarget(field.key);\n }}\n aria-label={isExpanded ? \"Collapse\" : \"Expand\"}\n aria-expanded={isExpanded}\n >\n {isExpanded ? <ChevronDownIcon /> : <ChevronRightIcon />}\n </button>\n ) : (\n <span className=\"ods-data-mapper__caret-spacer\" />\n )}\n\n <span className=\"ods-data-mapper__field-meta\">\n <span className=\"ods-data-mapper__field-label\">\n {field.label}\n {field.required && (\n <span className=\"ods-data-mapper__field-req\" aria-label=\"required\">\n *\n </span>\n )}\n </span>\n {field.apiName && (\n <span className=\"ods-data-mapper__field-api\">{field.apiName}</span>\n )}\n </span>\n {renderTypePill(field.type)}\n {(field.isArray || field.type === \"array\" || isArrayItem) && hasChildren && (\n <label\n className=\"ods-data-mapper__foreach\"\n onClick={(e) => e.stopPropagation()}\n >\n <input\n type=\"checkbox\"\n defaultChecked\n aria-label=\"For each record\"\n />\n <span>For each record</span>\n </label>\n )}\n </div>\n\n {/* EXPRESSION CELL */}\n <div\n className={cn(\n \"ods-data-mapper__cell\",\n \"ods-data-mapper__cell--expr\",\n isSelected && \"ods-data-mapper__cell--expr-editing\",\n )}\n onClick={() => !hasChildren && setSelectedTarget(field.key)}\n >\n {hasChildren ? (\n <span className=\"ods-data-mapper__expr-group\">\n Group · {field.children?.length ?? 0} sub-field\n {field.children?.length === 1 ? \"\" : \"s\"}\n </span>\n ) : isSelected ? (\n <div className=\"ods-data-mapper__editor\" onClick={(e) => e.stopPropagation()}>\n <ExpressionEditor\n editorRef={editorRef}\n value={expr}\n sourceFields={sourceFields}\n variables={variables}\n onChange={(v) => setExpression(field.key, v)}\n onEscape={() => setSelectedTarget(null)}\n onDropSnippet={(snippet) => dropOntoTarget(field.key, snippet)}\n readDragSnippet={readDragSnippet}\n />\n <div className=\"ods-data-mapper__editor-actions\">\n <button\n type=\"button\"\n className=\"ods-data-mapper__editor-fx\"\n onClick={() => {\n setSidebarOpen(true);\n setSidebarTab(\"functions\");\n }}\n aria-label=\"Insert function\"\n title=\"Functions\"\n >\n <FxIcon />\n </button>\n {expr && (\n <button\n type=\"button\"\n className=\"ods-data-mapper__editor-clear\"\n onClick={() => setExpression(field.key, \"\")}\n aria-label=\"Clear expression\"\n title=\"Clear\"\n >\n <TrashIcon />\n </button>\n )}\n </div>\n </div>\n ) : isMapped ? (\n <span className=\"ods-data-mapper__expr-render\" title={expr}>\n {renderExpressionSegments(\n expr,\n sourceFields,\n variables,\n (tokenIndex) => removeTokenAt(field.key, tokenIndex),\n )}\n </span>\n ) : (\n <span className=\"ods-data-mapper__expr-empty\">\n {dropTarget === field.key\n ? \"Drop to map\"\n : \"Drag a field here or click to edit\"}\n </span>\n )}\n </div>\n </div>\n );\n })\n )}\n </div>\n\n {/* SIDE PANEL — Data Stream / Functions / Variables */}\n {sidebarOpen && (\n <aside className=\"ods-data-mapper__sidebar\" aria-label=\"Data Stream\">\n <div className=\"ods-data-mapper__sidebar-head\">\n <div className=\"ods-data-mapper__sidebar-tabs\">\n <button\n type=\"button\"\n className={cn(\n \"ods-data-mapper__sidebar-tab\",\n sidebarTab === \"schema\" && \"ods-data-mapper__sidebar-tab--active\",\n )}\n onClick={() => setSidebarTab(\"schema\")}\n title=\"Source schema\"\n >\n <SchemaIcon />\n <span>Schema</span>\n </button>\n <button\n type=\"button\"\n className={cn(\n \"ods-data-mapper__sidebar-tab\",\n sidebarTab === \"functions\" && \"ods-data-mapper__sidebar-tab--active\",\n )}\n onClick={() => setSidebarTab(\"functions\")}\n title=\"Pre-built functions\"\n >\n <FxIcon />\n <span>Functions</span>\n </button>\n <button\n type=\"button\"\n className={cn(\n \"ods-data-mapper__sidebar-tab\",\n sidebarTab === \"variables\" && \"ods-data-mapper__sidebar-tab--active\",\n )}\n onClick={() => setSidebarTab(\"variables\")}\n title=\"Variables\"\n >\n <VarIcon />\n <span>Variables</span>\n </button>\n </div>\n <button\n type=\"button\"\n className=\"ods-data-mapper__sidebar-close\"\n onClick={() => setSidebarOpen(false)}\n aria-label=\"Close sidebar\"\n >\n <XIcon />\n </button>\n </div>\n\n <div className=\"ods-data-mapper__sidebar-search\">\n <SearchIcon />\n <input\n type=\"text\"\n placeholder={\n sidebarTab === \"schema\"\n ? \"Search schema…\"\n : sidebarTab === \"functions\"\n ? \"Search functions…\"\n : \"Search variables…\"\n }\n value={sourceSearch}\n onChange={(e) => setSourceSearch(e.target.value)}\n aria-label=\"Search sidebar\"\n />\n </div>\n\n <div className=\"ods-data-mapper__sidebar-list\">\n {sidebarTab === \"schema\" &&\n (sourceRows.length === 0 ? (\n <div className=\"ods-data-mapper__sidebar-empty\">\n {sourceSearch ? \"No matching fields\" : \"No source fields\"}\n </div>\n ) : (\n sourceRows.map(({ field, depth }) => {\n const hasChildren = !!(field.children && field.children.length > 0);\n const isExpanded = expandedSource.has(field.key);\n const snippet = fieldToken(pathOf(field));\n return (\n <button\n key={field.key}\n type=\"button\"\n className={cn(\n \"ods-data-mapper__sidebar-item\",\n !hasChildren && \"ods-data-mapper__sidebar-item--draggable\",\n )}\n draggable={!hasChildren}\n onDragStart={(e) => !hasChildren && beginDrag(e, snippet)}\n onClick={() => {\n if (hasChildren) handleToggleSource(field.key);\n else if (selectedTarget) insertIntoExpression(snippet);\n }}\n title={\n hasChildren\n ? undefined\n : selectedTarget\n ? `Drag to a target row, or click to insert into the selected row`\n : `Drag to a target row to map ${field.label}`\n }\n >\n {depth > 0 && (\n <span className=\"ods-data-mapper__guides\" aria-hidden=\"true\">\n {Array.from({ length: depth }).map((_, i) => (\n <span\n key={i}\n className={cn(\n \"ods-data-mapper__guide\",\n i === depth - 1 && \"ods-data-mapper__guide--last\",\n )}\n />\n ))}\n </span>\n )}\n {hasChildren ? (\n <span className=\"ods-data-mapper__sidebar-caret\">\n {isExpanded ? <ChevronDownIcon /> : <ChevronRightIcon />}\n </span>\n ) : (\n <span className=\"ods-data-mapper__sidebar-grip\" aria-hidden=\"true\">\n <svg width=\"8\" height=\"12\" viewBox=\"0 0 8 12\" fill=\"none\">\n <circle cx=\"2\" cy=\"3\" r=\"1\" fill=\"currentColor\" />\n <circle cx=\"6\" cy=\"3\" r=\"1\" fill=\"currentColor\" />\n <circle cx=\"2\" cy=\"6\" r=\"1\" fill=\"currentColor\" />\n <circle cx=\"6\" cy=\"6\" r=\"1\" fill=\"currentColor\" />\n <circle cx=\"2\" cy=\"9\" r=\"1\" fill=\"currentColor\" />\n <circle cx=\"6\" cy=\"9\" r=\"1\" fill=\"currentColor\" />\n </svg>\n </span>\n )}\n <span className=\"ods-data-mapper__sidebar-item-label\">{field.label}</span>\n {renderTypePill(field.type)}\n </button>\n );\n })\n ))}\n\n {sidebarTab === \"functions\" &&\n (() => {\n const q = sourceSearch.trim().toLowerCase();\n const list = q\n ? functions.filter(\n (f) =>\n f.label.toLowerCase().includes(q) || f.key.toLowerCase().includes(q),\n )\n : functions;\n if (list.length === 0) {\n return (\n <div className=\"ods-data-mapper__sidebar-empty\">\n {q ? \"No matching functions\" : \"No functions\"}\n </div>\n );\n }\n const grouped = list.reduce<Record<string, DataMapperFunction[]>>(\n (acc, f) => {\n const cat = f.category ?? \"General\";\n (acc[cat] ??= []).push(f);\n return acc;\n },\n {},\n );\n return Object.entries(grouped).map(([cat, items]) => (\n <div key={cat} className=\"ods-data-mapper__sidebar-group\">\n <div className=\"ods-data-mapper__sidebar-group-label\">{cat}</div>\n {items.map((f) => {\n const snippet = f.snippet ?? `${f.key}()`;\n return (\n <button\n key={f.key}\n type=\"button\"\n className=\"ods-data-mapper__sidebar-fn ods-data-mapper__sidebar-item--draggable\"\n draggable\n onDragStart={(e) => beginDrag(e, snippet)}\n onClick={() => selectedTarget && insertIntoExpression(snippet)}\n title={\n selectedTarget\n ? f.description\n : `Drag onto a target row to insert ${f.label}`\n }\n >\n <FxIcon />\n <span className=\"ods-data-mapper__sidebar-fn-text\">\n <span className=\"ods-data-mapper__sidebar-fn-name\">{f.label}</span>\n {f.description && (\n <span className=\"ods-data-mapper__sidebar-fn-desc\">\n {f.description}\n </span>\n )}\n </span>\n </button>\n );\n })}\n </div>\n ));\n })()}\n\n {sidebarTab === \"variables\" &&\n (() => {\n const q = sourceSearch.trim().toLowerCase();\n const list = q\n ? variables.filter((v) => v.label.toLowerCase().includes(q))\n : variables;\n if (list.length === 0) {\n return (\n <div className=\"ods-data-mapper__sidebar-empty\">\n {q ? \"No matching variables\" : \"No variables defined\"}\n </div>\n );\n }\n return list.map((v) => {\n const snippet = variableToken(pathOf(v));\n return (\n <button\n key={v.key}\n type=\"button\"\n className=\"ods-data-mapper__sidebar-item ods-data-mapper__sidebar-item--draggable\"\n draggable\n onDragStart={(e) => beginDrag(e, snippet)}\n onClick={() => selectedTarget && insertIntoExpression(snippet)}\n title={\n selectedTarget\n ? `Click or drag to insert ${v.label}`\n : `Drag onto a target row to insert ${v.label}`\n }\n >\n <span className=\"ods-data-mapper__sidebar-grip\" aria-hidden=\"true\">\n <svg width=\"8\" height=\"12\" viewBox=\"0 0 8 12\" fill=\"none\">\n <circle cx=\"2\" cy=\"3\" r=\"1\" fill=\"currentColor\" />\n <circle cx=\"6\" cy=\"3\" r=\"1\" fill=\"currentColor\" />\n <circle cx=\"2\" cy=\"6\" r=\"1\" fill=\"currentColor\" />\n <circle cx=\"6\" cy=\"6\" r=\"1\" fill=\"currentColor\" />\n <circle cx=\"2\" cy=\"9\" r=\"1\" fill=\"currentColor\" />\n <circle cx=\"6\" cy=\"9\" r=\"1\" fill=\"currentColor\" />\n </svg>\n </span>\n <span className=\"ods-data-mapper__sidebar-item-label\">{v.label}</span>\n {renderTypePill(v.type)}\n </button>\n );\n });\n })()}\n </div>\n\n {!selectedTarget && (\n <div className=\"ods-data-mapper__sidebar-hint\">\n Select a target field to insert\n </div>\n )}\n </aside>\n )}\n </div>\n\n {/* ── Footer (Save / Cancel) ── */}\n {showSaveClose && (\n <div className=\"ods-data-mapper__footer\">\n <div className=\"ods-data-mapper__footer-status\">\n {requiredUnmapped > 0 ? (\n <span className=\"ods-data-mapper__footer-warn\">\n <span className=\"ods-data-mapper__footer-warn-dot\" aria-hidden=\"true\" />\n {requiredUnmapped} required field{requiredUnmapped === 1 ? \"\" : \"s\"} unmapped\n </span>\n ) : mappedCount > 0 ? (\n <span className=\"ods-data-mapper__footer-ok\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"m3 6 2 2 4-5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n {mappedCount} of {totalTargets} mapped\n </span>\n ) : (\n <span className=\"ods-data-mapper__footer-muted\">\n Drag a source field onto a target row to begin mapping.\n </span>\n )}\n </div>\n <div className=\"ods-data-mapper__footer-actions\">\n <button\n type=\"button\"\n className=\"ods-data-mapper__action ods-data-mapper__action--ghost\"\n onClick={onClose}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"ods-data-mapper__action ods-data-mapper__action--primary\"\n onClick={onSave}\n disabled={requiredUnmapped > 0}\n title={\n requiredUnmapped > 0\n ? `${requiredUnmapped} required field(s) still unmapped`\n : `Save ${mappedCount} mapping${mappedCount === 1 ? \"\" : \"s\"}`\n }\n >\n Save mapping{mappedCount === 1 ? \"\" : \"s\"}\n {mappedCount > 0 && (\n <span className=\"ods-data-mapper__footer-count\">{mappedCount}</span>\n )}\n </button>\n </div>\n </div>\n )}\n </div>\n );\n}\n\n// ──────────────────────────────────────────────\n// ExpressionEditor — contentEditable rich input\n// ──────────────────────────────────────────────\n// Renders {{path}} markers as inline chips. Drop a source/variable from the\n// sidebar at any caret position to insert a chip. Backspace adjacent to a chip\n// deletes the whole chip atomically (no half-token cruft). Esc cancels editing.\n// React owns the canonical expression string; the DOM is the visual surface.\n\ninterface ExpressionEditorProps {\n value: string;\n sourceFields: DataMapperField[];\n variables: DataMapperField[];\n onChange: (next: string) => void;\n onEscape: () => void;\n onDropSnippet: (snippet: string) => void;\n readDragSnippet: (e: React.DragEvent) => string | null;\n editorRef: React.RefObject<HTMLDivElement | null>;\n}\n\nfunction ExpressionEditor({\n value,\n sourceFields,\n variables,\n onChange,\n onEscape,\n onDropSnippet,\n readDragSnippet,\n editorRef,\n}: ExpressionEditorProps) {\n // Track the most recent value we emitted so we don't re-render the DOM\n // (and lose the caret) while the user is typing.\n const lastEmittedRef = useRef<string>(value);\n const isMountedRef = useRef(false);\n\n // Mount: paint initial HTML + focus + caret at end.\n useEffect(() => {\n const el = editorRef.current;\n if (!el || isMountedRef.current) return;\n isMountedRef.current = true;\n el.innerHTML = expressionToHtml(value, sourceFields, variables);\n lastEmittedRef.current = value;\n // Place caret at end and focus.\n const range = document.createRange();\n range.selectNodeContents(el);\n range.collapse(false);\n const sel = window.getSelection();\n sel?.removeAllRanges();\n sel?.addRange(range);\n el.focus();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // External value changes (e.g. chip × remove, sidebar click insertion that bypasses caret,\n // auto-match) need to re-paint the DOM — but ONLY if the change didn't originate from us.\n useEffect(() => {\n const el = editorRef.current;\n if (!el || !isMountedRef.current) return;\n if (value === lastEmittedRef.current) return;\n // Preserve caret position when possible by remembering its character offset.\n const offset = captureCaretOffset(el);\n el.innerHTML = expressionToHtml(value, sourceFields, variables);\n lastEmittedRef.current = value;\n if (offset != null) restoreCaretOffset(el, offset);\n }, [value, sourceFields, variables, editorRef]);\n\n const emit = useCallback(() => {\n const el = editorRef.current;\n if (!el) return;\n const next = htmlToExpression(el);\n lastEmittedRef.current = next;\n onChange(next);\n }, [editorRef, onChange]);\n\n const handleInput = () => emit();\n\n const handlePaste = (e: React.ClipboardEvent<HTMLDivElement>) => {\n // Strip HTML — paste only plain text. Avoids dragging arbitrary markup into the editor.\n e.preventDefault();\n const text = e.clipboardData.getData(\"text/plain\");\n if (!text) return;\n insertPlainTextAtCaret(text);\n emit();\n };\n\n const handleDrop = (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n // Prevent the row's onDrop from firing again — without this, the drop is\n // handled twice (once here, once when bubbling up to the row) which\n // double-inserts the snippet (\"... + last_name + last_name\").\n e.stopPropagation();\n const snippet = readDragSnippet(e);\n if (!snippet) return;\n // Move caret to drop point, then insert via the standard insert path.\n placeCaretFromPoint(e.clientX, e.clientY, editorRef.current);\n onDropSnippet(snippet);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key === \"Escape\") {\n e.preventDefault();\n onEscape();\n return;\n }\n\n // Backspace / Delete adjacent to a chip → delete the whole chip atomically.\n if (e.key === \"Backspace\" || e.key === \"Delete\") {\n const sel = window.getSelection();\n if (!sel || sel.rangeCount === 0) return;\n const range = sel.getRangeAt(0);\n if (!range.collapsed) return; // text selection — let default handle it\n\n const target = e.key === \"Backspace\"\n ? findChipBefore(range)\n : findChipAfter(range);\n if (target) {\n e.preventDefault();\n target.remove();\n // Sync state immediately\n emit();\n }\n }\n\n // Enter — keep it on a single line by default (most expressions are one line).\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n onEscape();\n }\n };\n\n const isEmpty = !value;\n\n return (\n <div\n ref={editorRef}\n role=\"textbox\"\n contentEditable\n suppressContentEditableWarning\n aria-multiline=\"false\"\n aria-label=\"Expression editor\"\n className={cn(\n \"ods-data-mapper__editor-input\",\n isEmpty && \"ods-data-mapper__editor-input--empty\",\n )}\n data-placeholder='Type an expression, drag a source field, or use \" \" for custom text…'\n spellCheck={false}\n onInput={handleInput}\n onPaste={handlePaste}\n onDragOver={(e) => {\n e.preventDefault();\n e.dataTransfer.dropEffect = \"copy\";\n }}\n onDrop={handleDrop}\n onKeyDown={handleKeyDown}\n />\n );\n}\n\n// ── Caret + chip-adjacency helpers ────────────────────────────────────────\n\n/** Find a chip span immediately before the caret position (Backspace target). */\nfunction findChipBefore(range: Range): HTMLElement | null {\n const node = range.startContainer;\n const offset = range.startOffset;\n if (node.nodeType === Node.ELEMENT_NODE) {\n // Caret sits between children at index `offset`. Previous sibling is what gets deleted.\n const before = (node as HTMLElement).childNodes[offset - 1] as HTMLElement | undefined;\n return isChip(before) ? before : null;\n }\n if (node.nodeType === Node.TEXT_NODE && offset === 0) {\n const prev = node.previousSibling as HTMLElement | null;\n return isChip(prev) ? prev : null;\n }\n return null;\n}\n\n/** Find a chip span immediately after the caret position (Delete target). */\nfunction findChipAfter(range: Range): HTMLElement | null {\n const node = range.startContainer;\n const offset = range.startOffset;\n if (node.nodeType === Node.ELEMENT_NODE) {\n const after = (node as HTMLElement).childNodes[offset] as HTMLElement | undefined;\n return isChip(after) ? after : null;\n }\n if (node.nodeType === Node.TEXT_NODE && offset === (node.textContent?.length ?? 0)) {\n const next = node.nextSibling as HTMLElement | null;\n return isChip(next) ? next : null;\n }\n return null;\n}\n\nfunction isChip(node: Node | undefined | null): node is HTMLElement {\n return (\n !!node &&\n node.nodeType === Node.ELEMENT_NODE &&\n (node as HTMLElement).classList?.contains(\"ods-data-mapper__expr-chip\")\n );\n}\n\n/** Capture a logical caret offset (in plain-text characters) for restoration after re-render. */\nfunction captureCaretOffset(root: HTMLElement): number | null {\n const sel = window.getSelection();\n if (!sel || sel.rangeCount === 0) return null;\n const range = sel.getRangeAt(0);\n if (!root.contains(range.startContainer)) return null;\n const pre = range.cloneRange();\n pre.selectNodeContents(root);\n pre.setEnd(range.startContainer, range.startOffset);\n // Walk pre's content and count characters, treating each chip as 1 unit.\n const tmp = document.createElement(\"div\");\n tmp.appendChild(pre.cloneContents());\n return measureLogicalLength(tmp);\n}\n\nfunction restoreCaretOffset(root: HTMLElement, offset: number) {\n const sel = window.getSelection();\n if (!sel) return;\n let remaining = offset;\n let placed = false;\n const walk = (node: Node) => {\n if (placed) return;\n if (node.nodeType === Node.TEXT_NODE) {\n const len = node.textContent?.length ?? 0;\n if (remaining <= len) {\n const range = document.createRange();\n range.setStart(node, remaining);\n range.collapse(true);\n sel.removeAllRanges();\n sel.addRange(range);\n placed = true;\n return;\n }\n remaining -= len;\n } else if (node instanceof HTMLElement) {\n if (node.dataset.token != null) {\n // Chip counts as 1 logical character\n if (remaining <= 1) {\n const range = document.createRange();\n range.setStartAfter(node);\n range.collapse(true);\n sel.removeAllRanges();\n sel.addRange(range);\n placed = true;\n return;\n }\n remaining -= 1;\n } else {\n node.childNodes.forEach(walk);\n }\n }\n };\n root.childNodes.forEach(walk);\n if (!placed) {\n // Caret was past the end — place at end\n const range = document.createRange();\n range.selectNodeContents(root);\n range.collapse(false);\n sel.removeAllRanges();\n sel.addRange(range);\n }\n}\n\nfunction measureLogicalLength(root: HTMLElement): number {\n let len = 0;\n const walk = (node: Node) => {\n if (node.nodeType === Node.TEXT_NODE) {\n len += node.textContent?.length ?? 0;\n } else if (node instanceof HTMLElement) {\n if (node.dataset.token != null) {\n len += 1;\n } else {\n node.childNodes.forEach(walk);\n }\n }\n };\n root.childNodes.forEach(walk);\n return len;\n}\n\nfunction placeCaretFromPoint(x: number, y: number, _root: HTMLElement | null) {\n if (!_root) return;\n // Webkit:\n const wkRange = (document as any).caretRangeFromPoint?.(x, y) as Range | undefined;\n if (wkRange && _root.contains(wkRange.startContainer)) {\n const sel = window.getSelection();\n sel?.removeAllRanges();\n sel?.addRange(wkRange);\n return;\n }\n // Firefox:\n const ffPos = (document as any).caretPositionFromPoint?.(x, y);\n if (ffPos && _root.contains(ffPos.offsetNode)) {\n const range = document.createRange();\n range.setStart(ffPos.offsetNode, ffPos.offset);\n range.collapse(true);\n const sel = window.getSelection();\n sel?.removeAllRanges();\n sel?.addRange(range);\n return;\n }\n // Fallback: caret at end\n const range = document.createRange();\n range.selectNodeContents(_root);\n range.collapse(false);\n const sel = window.getSelection();\n sel?.removeAllRanges();\n sel?.addRange(range);\n}\n\nfunction insertPlainTextAtCaret(text: string) {\n const sel = window.getSelection();\n if (!sel || sel.rangeCount === 0) return;\n const range = sel.getRangeAt(0);\n range.deleteContents();\n const node = document.createTextNode(text);\n range.insertNode(node);\n range.setStartAfter(node);\n range.setEndAfter(node);\n sel.removeAllRanges();\n sel.addRange(range);\n}\n","\"use client\";\nimport {\n type ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { cn } from \"../../utils/cn\";\n\n// ──────────────────────────────────────────────\n// Types\n// ──────────────────────────────────────────────\n\nexport type DataTableAlign = \"left\" | \"center\" | \"right\";\nexport type DataTableDensity = \"compact\" | \"default\" | \"comfortable\";\nexport type DataTableSortDir = \"asc\" | \"desc\";\n\nexport interface DataTableColumn<T = any> {\n /** Unique key — also used as the field accessor unless `accessor` is provided. */\n key: string;\n /** Header cell content. */\n header: ReactNode;\n /** Accessor — function or property name. Defaults to row[key]. */\n accessor?: ((row: T) => any) | keyof T;\n /** Custom render. Receives `(value, row, index)`. */\n render?: (value: any, row: T, index: number) => ReactNode;\n /** Sortable column. */\n sortable?: boolean;\n /** Header + cell alignment. Numeric cells should be right-aligned. */\n align?: DataTableAlign;\n /** Mono / tabular numerics. Auto-enables for numeric/id/duration/cost types. */\n numeric?: boolean;\n /** Default visibility (true). Use the column-settings menu to toggle at runtime. */\n visible?: boolean;\n /** Fixed width in px or any CSS length. */\n width?: string | number;\n /** Min-width for resize / shrink behavior. */\n minWidth?: number;\n /** Optional cell-level className. */\n cellClassName?: string;\n}\n\nexport interface DataTableFilter<T = any> {\n key: string;\n label: ReactNode;\n options: { value: string; label: ReactNode }[];\n /** Apply the filter on a row. Defaults to row[key] === value. */\n apply?: (row: T, value: string) => boolean;\n}\n\nexport interface DataTableRowAction<T = any> {\n label: ReactNode;\n icon?: ReactNode;\n danger?: boolean;\n disabled?: (row: T) => boolean;\n onClick: (row: T, index: number) => void;\n}\n\nexport interface DataTableBulkAction<T = any> {\n label: ReactNode;\n icon?: ReactNode;\n danger?: boolean;\n onClick: (selectedRows: T[], selectedIndexes: number[]) => void;\n}\n\nexport interface DataTablePagination {\n pageSize?: number;\n pageSizes?: number[];\n /** Controlled page (1-indexed). If omitted, internal state. */\n page?: number;\n onPageChange?: (page: number) => void;\n /** When false, server-side pagination (don't slice client data). */\n clientSide?: boolean;\n /** Total rows when server-side. */\n totalRows?: number;\n}\n\nexport interface DataTableProps<T extends Record<string, any> = Record<string, any>> {\n /** Title rendered in the toolbar. */\n title?: ReactNode;\n /** Subtitle / description shown under the title. */\n description?: ReactNode;\n /** Show row count in the toolbar. */\n showCount?: boolean;\n /** Column definitions. */\n columns: DataTableColumn<T>[];\n /** Row data. */\n data: T[];\n /** Stable id getter for each row. Defaults to array index. */\n getRowId?: (row: T, index: number) => string;\n\n // ── Search ─────────────────────────────────\n search?: boolean;\n searchPlaceholder?: string;\n /** Custom search predicate. Defaults to substring across all visible columns. */\n searchPredicate?: (row: T, query: string) => boolean;\n /** Controlled search value. */\n searchValue?: string;\n onSearchChange?: (q: string) => void;\n\n // ── Sort ───────────────────────────────────\n sortKey?: string;\n sortDirection?: DataTableSortDir;\n onSortChange?: (key: string, direction: DataTableSortDir) => void;\n\n // ── Filter chips ───────────────────────────\n filters?: DataTableFilter<T>[];\n\n // ── Selection ──────────────────────────────\n selectable?: boolean;\n selectedIds?: Set<string>;\n onSelectionChange?: (selected: Set<string>) => void;\n\n // ── Bulk + row actions ─────────────────────\n bulkActions?: DataTableBulkAction<T>[];\n rowActions?: DataTableRowAction<T>[];\n\n // ── Expansion ──────────────────────────────\n expandable?: boolean;\n renderExpanded?: (row: T, index: number) => ReactNode;\n\n // ── Pagination ─────────────────────────────\n pagination?: DataTablePagination | true;\n\n // ── Density ────────────────────────────────\n density?: DataTableDensity;\n showDensityToggle?: boolean;\n showColumnSettings?: boolean;\n\n // ── State ──────────────────────────────────\n loading?: boolean;\n error?: ReactNode;\n emptyTitle?: ReactNode;\n emptyDescription?: ReactNode;\n emptyAction?: ReactNode;\n\n // ── Toolbar slots ──────────────────────────\n /** Custom buttons rendered at the right of the toolbar (e.g. \"+ New\"). */\n toolbarActions?: ReactNode;\n\n // ── Row interaction ────────────────────────\n onRowClick?: (row: T, index: number) => void;\n /** Make rows look interactive (hover bg + cursor pointer). */\n rowClickable?: boolean;\n\n className?: string;\n}\n\n// ──────────────────────────────────────────────\n// Utility — read a value via accessor\n// ──────────────────────────────────────────────\nfunction readValue<T>(row: T, col: DataTableColumn<T>): any {\n if (typeof col.accessor === \"function\") return (col.accessor as (r: T) => any)(row);\n const k = (col.accessor as keyof T) ?? (col.key as keyof T);\n return (row as any)[k];\n}\n\n// ──────────────────────────────────────────────\n// SVG glyphs (consistent stroke style)\n// ──────────────────────────────────────────────\nconst SearchIcon = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"6\" cy=\"6\" r=\"4.5\" stroke=\"currentColor\" strokeWidth=\"1.4\" />\n <path d=\"m12 12-2.5-2.5\" stroke=\"currentColor\" strokeWidth=\"1.4\" strokeLinecap=\"round\" />\n </svg>\n);\nconst ChevronDown = (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M3 4.5 6 7.5 9 4.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\nconst ChevronLeft = (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M7.5 3 4.5 6 7.5 9\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\nconst ChevronRight = (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M4.5 3 7.5 6 4.5 9\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\nconst SortAsc = (\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M5 2v6M3 4l2-2 2 2\"\n stroke=\"currentColor\"\n strokeWidth=\"1.3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\nconst SortDesc = (\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M5 8V2M3 6l2 2 2-2\"\n stroke=\"currentColor\"\n strokeWidth=\"1.3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\nconst SortIdle = (\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M5 1.5v7M3 3l2-2 2 2M3 7l2 2 2-2\"\n stroke=\"currentColor\"\n strokeWidth=\"1.2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n opacity=\"0.5\"\n />\n </svg>\n);\nconst FilterIcon = (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M1.5 2.5h9l-3.5 4v3.5l-2-1V6.5z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.3\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\nconst ColumnsIcon = (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <rect x=\"1.5\" y=\"2\" width=\"9\" height=\"8\" stroke=\"currentColor\" strokeWidth=\"1.3\" rx=\"1\" />\n <path d=\"M4.5 2v8M7.5 2v8\" stroke=\"currentColor\" strokeWidth=\"1.3\" />\n </svg>\n);\nconst DensityIcon = (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M2 3h8M2 6h8M2 9h8\"\n stroke=\"currentColor\"\n strokeWidth=\"1.3\"\n strokeLinecap=\"round\"\n />\n </svg>\n);\nconst MoreHIcon = () => (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"3\" cy=\"6\" r=\"1\" fill=\"currentColor\" />\n <circle cx=\"6\" cy=\"6\" r=\"1\" fill=\"currentColor\" />\n <circle cx=\"9\" cy=\"6\" r=\"1\" fill=\"currentColor\" />\n </svg>\n);\nconst XIcon = () => (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M3 3l6 6M9 3l-6 6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n);\n\n// ──────────────────────────────────────────────\n// DataTable\n// ──────────────────────────────────────────────\n\nexport function DataTable<T extends Record<string, any> = Record<string, any>>(\n props: DataTableProps<T>,\n) {\n const {\n title,\n description,\n showCount = true,\n columns,\n data,\n getRowId,\n search = false,\n searchPlaceholder = \"Search…\",\n searchPredicate,\n searchValue,\n onSearchChange,\n sortKey: sortKeyProp,\n sortDirection: sortDirProp,\n onSortChange,\n filters,\n selectable = false,\n selectedIds: selectedIdsProp,\n onSelectionChange,\n bulkActions,\n rowActions,\n expandable = false,\n renderExpanded,\n pagination,\n density: densityProp = \"default\",\n showDensityToggle = true,\n showColumnSettings = true,\n loading = false,\n error,\n emptyTitle = \"No data\",\n emptyDescription,\n emptyAction,\n toolbarActions,\n onRowClick,\n rowClickable,\n className,\n } = props;\n\n // ── Internal state ────────────────────────\n const [internalSearch, setInternalSearch] = useState(\"\");\n const q = (searchValue ?? internalSearch).trim();\n const setSearch = (v: string) => {\n onSearchChange?.(v);\n if (searchValue === undefined) setInternalSearch(v);\n };\n\n const [internalSortKey, setInternalSortKey] = useState<string | undefined>();\n const [internalSortDir, setInternalSortDir] = useState<DataTableSortDir>(\"asc\");\n const sortKey = sortKeyProp ?? internalSortKey;\n const sortDir = sortDirProp ?? internalSortDir;\n\n const [internalSelected, setInternalSelected] = useState<Set<string>>(new Set());\n const selectedIds = selectedIdsProp ?? internalSelected;\n const setSelectedIds = (next: Set<string>) => {\n onSelectionChange?.(next);\n if (selectedIdsProp === undefined) setInternalSelected(next);\n };\n\n const [filterValues, setFilterValues] = useState<Record<string, string>>({});\n const [openFilter, setOpenFilter] = useState<string | null>(null);\n\n const [density, setDensity] = useState<DataTableDensity>(densityProp);\n const [densityOpen, setDensityOpen] = useState(false);\n useEffect(() => setDensity(densityProp), [densityProp]);\n\n const [hiddenCols, setHiddenCols] = useState<Set<string>>(\n () => new Set(columns.filter((c) => c.visible === false).map((c) => c.key)),\n );\n const [colSettingsOpen, setColSettingsOpen] = useState(false);\n\n const [expandedIds, setExpandedIds] = useState<Set<string>>(new Set());\n\n // Pagination\n const pgCfg: DataTablePagination | null =\n pagination === true ? { pageSize: 10 } : (pagination ?? null);\n const pageSizes = pgCfg?.pageSizes ?? [10, 25, 50, 100];\n const [internalPage, setInternalPage] = useState(1);\n const [internalPageSize, setInternalPageSize] = useState(pgCfg?.pageSize ?? 10);\n const page = pgCfg?.page ?? internalPage;\n const pageSize = pgCfg?.pageSize ?? internalPageSize;\n const setPage = (p: number) => {\n pgCfg?.onPageChange?.(p);\n if (pgCfg?.page === undefined) setInternalPage(p);\n };\n\n // ── Row id helper ─────────────────────────\n const idOf = useCallback(\n (row: T, idx: number) => (getRowId ? getRowId(row, idx) : String(idx)),\n [getRowId],\n );\n\n // ── Visible columns ───────────────────────\n const visibleCols = useMemo(\n () => columns.filter((c) => !hiddenCols.has(c.key)),\n [columns, hiddenCols],\n );\n\n // ── Search + filter + sort (client-side) ─\n const processed = useMemo(() => {\n let rows = data;\n\n if (q) {\n if (searchPredicate) {\n rows = rows.filter((r) => searchPredicate(r, q));\n } else {\n const lower = q.toLowerCase();\n rows = rows.filter((r) =>\n visibleCols.some((c) => {\n const v = readValue(r, c);\n return v != null && String(v).toLowerCase().includes(lower);\n }),\n );\n }\n }\n\n if (filters) {\n for (const f of filters) {\n const value = filterValues[f.key];\n if (!value) continue;\n rows = rows.filter((r) =>\n f.apply\n ? f.apply(r, value)\n : String((r as any)[f.key] ?? \"\") === value,\n );\n }\n }\n\n if (sortKey) {\n const col = columns.find((c) => c.key === sortKey);\n if (col) {\n const sorted = [...rows];\n sorted.sort((a, b) => {\n const va = readValue(a, col);\n const vb = readValue(b, col);\n if (va == null && vb == null) return 0;\n if (va == null) return 1;\n if (vb == null) return -1;\n if (typeof va === \"number\" && typeof vb === \"number\") return va - vb;\n return String(va).localeCompare(String(vb));\n });\n if (sortDir === \"desc\") sorted.reverse();\n rows = sorted;\n }\n }\n\n return rows;\n }, [data, q, searchPredicate, filters, filterValues, sortKey, sortDir, columns, visibleCols]);\n\n const totalRows = pgCfg?.totalRows ?? processed.length;\n const totalPages = pgCfg ? Math.max(1, Math.ceil(totalRows / pageSize)) : 1;\n const pageRows = useMemo(() => {\n if (!pgCfg || pgCfg.clientSide === false) return processed;\n const start = (page - 1) * pageSize;\n return processed.slice(start, start + pageSize);\n }, [pgCfg, processed, page, pageSize]);\n\n // Reset page on filter/search change\n useEffect(() => {\n setPage(1);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [q, JSON.stringify(filterValues), sortKey, sortDir]);\n\n // ── Sort handler ──────────────────────────\n const handleSort = (key: string) => {\n const col = columns.find((c) => c.key === key);\n if (!col?.sortable) return;\n const next: DataTableSortDir = sortKey === key && sortDir === \"asc\" ? \"desc\" : \"asc\";\n onSortChange?.(key, next);\n if (sortKeyProp === undefined) setInternalSortKey(key);\n if (sortDirProp === undefined) setInternalSortDir(next);\n };\n\n // ── Selection helpers ─────────────────────\n const pageIds = useMemo(() => pageRows.map((r, i) => idOf(r, i)), [pageRows, idOf]);\n const allSelected = pageIds.length > 0 && pageIds.every((id) => selectedIds.has(id));\n const someSelected = !allSelected && pageIds.some((id) => selectedIds.has(id));\n const toggleAll = () => {\n const next = new Set(selectedIds);\n if (allSelected) {\n for (const id of pageIds) next.delete(id);\n } else {\n for (const id of pageIds) next.add(id);\n }\n setSelectedIds(next);\n };\n const toggleRow = (id: string) => {\n const next = new Set(selectedIds);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n setSelectedIds(next);\n };\n const clearSelection = () => setSelectedIds(new Set());\n\n const selectedRows = useMemo(\n () =>\n data\n .map((r, i) => ({ row: r, id: idOf(r, i), idx: i }))\n .filter((e) => selectedIds.has(e.id)),\n [data, idOf, selectedIds],\n );\n const selectedCount = selectedRows.length;\n\n // ── Layout ────────────────────────────────\n const showBulkBar = selectable && selectedCount > 0;\n const wrapperClass = cn(\n \"ods-datatable\",\n `ods-datatable--${density}`,\n className,\n );\n\n return (\n <div className={wrapperClass} role=\"region\" aria-label=\"Data table\">\n {/* ── Toolbar / Bulk bar ── */}\n <div className=\"ods-datatable__toolbar\">\n {showBulkBar ? (\n <>\n <div className=\"ods-datatable__bulk-summary\">\n <span className=\"ods-datatable__bulk-count\">{selectedCount}</span>\n <span>selected</span>\n <button\n type=\"button\"\n className=\"ods-datatable__bulk-clear\"\n onClick={clearSelection}\n aria-label=\"Clear selection\"\n >\n <XIcon />\n </button>\n </div>\n <div className=\"ods-datatable__bulk-actions\">\n {bulkActions?.map((a, i) => (\n <button\n key={i}\n type=\"button\"\n className={cn(\n \"ods-datatable__bulk-action\",\n a.danger && \"ods-datatable__bulk-action--danger\",\n )}\n onClick={() =>\n a.onClick(\n selectedRows.map((s) => s.row),\n selectedRows.map((s) => s.idx),\n )\n }\n >\n {a.icon && <span className=\"ods-datatable__bulk-action-icon\">{a.icon}</span>}\n <span>{a.label}</span>\n </button>\n ))}\n </div>\n </>\n ) : (\n <>\n <div className=\"ods-datatable__title-block\">\n {title && (\n <h2 className=\"ods-datatable__title\">\n {title}\n {showCount && (\n <span className=\"ods-datatable__count\">{totalRows}</span>\n )}\n </h2>\n )}\n {description && (\n <p className=\"ods-datatable__description\">{description}</p>\n )}\n </div>\n <div className=\"ods-datatable__toolbar-actions\">\n {search && (\n <div className=\"ods-datatable__search\">\n <span className=\"ods-datatable__search-icon\" aria-hidden=\"true\">\n <SearchIcon />\n </span>\n <input\n type=\"text\"\n className=\"ods-datatable__search-input\"\n placeholder={searchPlaceholder}\n value={searchValue ?? internalSearch}\n onChange={(e) => setSearch(e.target.value)}\n aria-label=\"Search\"\n />\n {q && (\n <button\n type=\"button\"\n className=\"ods-datatable__search-clear\"\n onClick={() => setSearch(\"\")}\n aria-label=\"Clear search\"\n >\n <XIcon />\n </button>\n )}\n </div>\n )}\n\n {filters?.map((f) => {\n const value = filterValues[f.key];\n const active = !!value;\n const label = active\n ? f.options.find((o) => o.value === value)?.label ?? value\n : f.label;\n return (\n <div key={f.key} className=\"ods-datatable__filter\">\n <button\n type=\"button\"\n className={cn(\n \"ods-datatable__filter-trigger\",\n active && \"ods-datatable__filter-trigger--active\",\n )}\n onClick={() => setOpenFilter((s) => (s === f.key ? null : f.key))}\n aria-haspopup=\"listbox\"\n aria-expanded={openFilter === f.key}\n >\n <span className=\"ods-datatable__filter-icon\" aria-hidden=\"true\">\n {FilterIcon}\n </span>\n <span>{label}</span>\n {ChevronDown}\n </button>\n {openFilter === f.key && (\n <ul className=\"ods-datatable__menu\" role=\"listbox\">\n <li>\n <button\n type=\"button\"\n className={cn(\n \"ods-datatable__menu-item\",\n !active && \"ods-datatable__menu-item--active\",\n )}\n onClick={() => {\n const next = { ...filterValues };\n delete next[f.key];\n setFilterValues(next);\n setOpenFilter(null);\n }}\n >\n All\n </button>\n </li>\n {f.options.map((opt) => (\n <li key={opt.value}>\n <button\n type=\"button\"\n className={cn(\n \"ods-datatable__menu-item\",\n value === opt.value && \"ods-datatable__menu-item--active\",\n )}\n onClick={() => {\n setFilterValues({ ...filterValues, [f.key]: opt.value });\n setOpenFilter(null);\n }}\n >\n {opt.label}\n </button>\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n })}\n\n {showDensityToggle && (\n <div className=\"ods-datatable__filter\">\n <button\n type=\"button\"\n className=\"ods-datatable__icon-btn\"\n onClick={() => setDensityOpen((s) => !s)}\n aria-label=\"Row density\"\n aria-haspopup=\"listbox\"\n aria-expanded={densityOpen}\n >\n {DensityIcon}\n </button>\n {densityOpen && (\n <ul className=\"ods-datatable__menu ods-datatable__menu--align-end\" role=\"listbox\">\n {([\"compact\", \"default\", \"comfortable\"] as DataTableDensity[]).map((d) => (\n <li key={d}>\n <button\n type=\"button\"\n className={cn(\n \"ods-datatable__menu-item\",\n density === d && \"ods-datatable__menu-item--active\",\n )}\n onClick={() => {\n setDensity(d);\n setDensityOpen(false);\n }}\n >\n {d.charAt(0).toUpperCase() + d.slice(1)}\n </button>\n </li>\n ))}\n </ul>\n )}\n </div>\n )}\n\n {showColumnSettings && (\n <div className=\"ods-datatable__filter\">\n <button\n type=\"button\"\n className=\"ods-datatable__icon-btn\"\n onClick={() => setColSettingsOpen((s) => !s)}\n aria-label=\"Column visibility\"\n aria-haspopup=\"listbox\"\n aria-expanded={colSettingsOpen}\n >\n {ColumnsIcon}\n </button>\n {colSettingsOpen && (\n <ul className=\"ods-datatable__menu ods-datatable__menu--align-end\" role=\"listbox\">\n {columns.map((c) => (\n <li key={c.key}>\n <label className=\"ods-datatable__menu-checkbox\">\n <input\n type=\"checkbox\"\n checked={!hiddenCols.has(c.key)}\n onChange={() => {\n const next = new Set(hiddenCols);\n if (next.has(c.key)) next.delete(c.key);\n else next.add(c.key);\n setHiddenCols(next);\n }}\n />\n <span>{c.header}</span>\n </label>\n </li>\n ))}\n </ul>\n )}\n </div>\n )}\n\n {toolbarActions && (\n <div className=\"ods-datatable__toolbar-custom\">{toolbarActions}</div>\n )}\n </div>\n </>\n )}\n </div>\n\n {/* ── Table ── */}\n <div className=\"ods-datatable__scroll\">\n <table className=\"ods-datatable__table\">\n <thead className=\"ods-datatable__thead\">\n <tr>\n {selectable && (\n <th className=\"ods-datatable__th ods-datatable__th--checkbox\" scope=\"col\">\n <input\n type=\"checkbox\"\n aria-label=\"Select all rows on this page\"\n checked={allSelected}\n ref={(el) => {\n if (el) el.indeterminate = someSelected;\n }}\n onChange={toggleAll}\n />\n </th>\n )}\n {expandable && (\n <th className=\"ods-datatable__th ods-datatable__th--expand\" scope=\"col\" aria-hidden=\"true\" />\n )}\n {visibleCols.map((col) => {\n const isSorted = sortKey === col.key;\n return (\n <th\n key={col.key}\n scope=\"col\"\n className={cn(\n \"ods-datatable__th\",\n col.sortable && \"ods-datatable__th--sortable\",\n col.numeric && \"ods-datatable__th--numeric\",\n col.align && `ods-datatable__th--align-${col.align}`,\n )}\n style={col.width ? { width: col.width } : col.minWidth ? { minWidth: col.minWidth } : undefined}\n aria-sort={\n isSorted ? (sortDir === \"asc\" ? \"ascending\" : \"descending\") : undefined\n }\n onClick={col.sortable ? () => handleSort(col.key) : undefined}\n >\n <span className=\"ods-datatable__th-content\">\n <span className=\"ods-datatable__th-label\">{col.header}</span>\n {col.sortable && (\n <span className=\"ods-datatable__sort-icon\" aria-hidden=\"true\">\n {isSorted ? (sortDir === \"asc\" ? SortAsc : SortDesc) : SortIdle}\n </span>\n )}\n </span>\n </th>\n );\n })}\n {rowActions && rowActions.length > 0 && (\n <th className=\"ods-datatable__th ods-datatable__th--actions\" scope=\"col\" aria-label=\"Actions\" />\n )}\n </tr>\n </thead>\n <tbody className=\"ods-datatable__tbody\">\n {loading && (\n <tr>\n <td\n colSpan={\n visibleCols.length +\n (selectable ? 1 : 0) +\n (expandable ? 1 : 0) +\n (rowActions ? 1 : 0)\n }\n className=\"ods-datatable__loading\"\n >\n <span className=\"ods-datatable__loading-bar\" />\n </td>\n </tr>\n )}\n {!loading && error && (\n <tr>\n <td\n colSpan={\n visibleCols.length +\n (selectable ? 1 : 0) +\n (expandable ? 1 : 0) +\n (rowActions ? 1 : 0)\n }\n className=\"ods-datatable__error\"\n >\n {error}\n </td>\n </tr>\n )}\n {!loading && !error && pageRows.length === 0 && (\n <tr>\n <td\n colSpan={\n visibleCols.length +\n (selectable ? 1 : 0) +\n (expandable ? 1 : 0) +\n (rowActions ? 1 : 0)\n }\n className=\"ods-datatable__empty\"\n >\n <div className=\"ods-datatable__empty-title\">{emptyTitle}</div>\n {emptyDescription && (\n <div className=\"ods-datatable__empty-desc\">{emptyDescription}</div>\n )}\n {emptyAction && <div className=\"ods-datatable__empty-action\">{emptyAction}</div>}\n </td>\n </tr>\n )}\n {!loading &&\n !error &&\n pageRows.map((row, idx) => {\n const id = idOf(row, idx);\n const isSelected = selectedIds.has(id);\n const isExpanded = expandedIds.has(id);\n return (\n <Row\n key={id}\n row={row}\n rowId={id}\n rowIndex={idx}\n visibleCols={visibleCols}\n selectable={selectable}\n selected={isSelected}\n onToggleSelect={() => toggleRow(id)}\n expandable={expandable}\n expanded={isExpanded}\n onToggleExpand={() => {\n const next = new Set(expandedIds);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n setExpandedIds(next);\n }}\n renderExpanded={renderExpanded}\n totalCols={\n visibleCols.length +\n (selectable ? 1 : 0) +\n (expandable ? 1 : 0) +\n (rowActions ? 1 : 0)\n }\n rowActions={rowActions}\n onRowClick={onRowClick}\n clickable={!!onRowClick || !!rowClickable}\n />\n );\n })}\n </tbody>\n </table>\n </div>\n\n {/* ── Pagination ── */}\n {pgCfg && totalRows > 0 && (\n <div className=\"ods-datatable__footer\">\n <div className=\"ods-datatable__footer-summary\">\n Showing\n <span className=\"ods-datatable__footer-range\">\n {(page - 1) * pageSize + 1}–{Math.min(page * pageSize, totalRows)}\n </span>\n of\n <span className=\"ods-datatable__footer-total\">{totalRows}</span>\n </div>\n <div className=\"ods-datatable__footer-pagesize\">\n <span>Rows</span>\n <select\n className=\"ods-datatable__pagesize-select\"\n value={pageSize}\n onChange={(e) => {\n const n = Number(e.target.value);\n setInternalPageSize(n);\n setPage(1);\n }}\n aria-label=\"Rows per page\"\n >\n {pageSizes.map((n) => (\n <option key={n} value={n}>\n {n}\n </option>\n ))}\n </select>\n </div>\n <div className=\"ods-datatable__footer-nav\">\n <button\n type=\"button\"\n className=\"ods-datatable__page-btn\"\n disabled={page <= 1}\n onClick={() => setPage(page - 1)}\n aria-label=\"Previous page\"\n >\n {ChevronLeft}\n </button>\n <span className=\"ods-datatable__page-pos\">\n <span>{page}</span>\n <span className=\"ods-datatable__page-sep\">/</span>\n <span>{totalPages}</span>\n </span>\n <button\n type=\"button\"\n className=\"ods-datatable__page-btn\"\n disabled={page >= totalPages}\n onClick={() => setPage(page + 1)}\n aria-label=\"Next page\"\n >\n {ChevronRight}\n </button>\n </div>\n </div>\n )}\n </div>\n );\n}\n\n// ──────────────────────────────────────────────\n// Row\n// ──────────────────────────────────────────────\n\nfunction Row<T extends Record<string, any>>({\n row,\n rowId,\n rowIndex,\n visibleCols,\n selectable,\n selected,\n onToggleSelect,\n expandable,\n expanded,\n onToggleExpand,\n renderExpanded,\n totalCols,\n rowActions,\n onRowClick,\n clickable,\n}: {\n row: T;\n rowId: string;\n rowIndex: number;\n visibleCols: DataTableColumn<T>[];\n selectable: boolean;\n selected: boolean;\n onToggleSelect: () => void;\n expandable: boolean;\n expanded: boolean;\n onToggleExpand: () => void;\n renderExpanded?: (row: T, index: number) => ReactNode;\n totalCols: number;\n rowActions?: DataTableRowAction<T>[];\n onRowClick?: (row: T, idx: number) => void;\n clickable: boolean;\n}) {\n const [menuOpen, setMenuOpen] = useState(false);\n const menuRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!menuOpen) return;\n const close = (e: MouseEvent) => {\n if (!menuRef.current?.contains(e.target as Node)) setMenuOpen(false);\n };\n document.addEventListener(\"mousedown\", close);\n return () => document.removeEventListener(\"mousedown\", close);\n }, [menuOpen]);\n\n return (\n <>\n <tr\n className={cn(\n \"ods-datatable__row\",\n selected && \"ods-datatable__row--selected\",\n clickable && \"ods-datatable__row--clickable\",\n )}\n onClick={onRowClick ? () => onRowClick(row, rowIndex) : undefined}\n data-row-id={rowId}\n >\n {selectable && (\n <td\n className=\"ods-datatable__td ods-datatable__td--checkbox\"\n onClick={(e) => e.stopPropagation()}\n >\n <input\n type=\"checkbox\"\n checked={selected}\n onChange={onToggleSelect}\n aria-label={`Select row ${rowIndex + 1}`}\n />\n </td>\n )}\n {expandable && (\n <td\n className=\"ods-datatable__td ods-datatable__td--expand\"\n onClick={(e) => e.stopPropagation()}\n >\n <button\n type=\"button\"\n className={cn(\n \"ods-datatable__expand-btn\",\n expanded && \"ods-datatable__expand-btn--open\",\n )}\n onClick={onToggleExpand}\n aria-label={expanded ? \"Collapse row\" : \"Expand row\"}\n aria-expanded={expanded}\n >\n <ChevronRightSmall />\n </button>\n </td>\n )}\n {visibleCols.map((col) => {\n const v = readValue(row, col);\n return (\n <td\n key={col.key}\n className={cn(\n \"ods-datatable__td\",\n col.numeric && \"ods-datatable__td--numeric\",\n col.align && `ods-datatable__td--align-${col.align}`,\n col.cellClassName,\n )}\n >\n {col.render ? col.render(v, row, rowIndex) : v}\n </td>\n );\n })}\n {rowActions && rowActions.length > 0 && (\n <td\n className=\"ods-datatable__td ods-datatable__td--actions\"\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"ods-datatable__row-actions\" ref={menuRef}>\n <button\n type=\"button\"\n className=\"ods-datatable__row-actions-trigger\"\n onClick={() => setMenuOpen((s) => !s)}\n aria-haspopup=\"menu\"\n aria-expanded={menuOpen}\n aria-label=\"Row actions\"\n >\n <MoreHIcon />\n </button>\n {menuOpen && (\n <ul className=\"ods-datatable__menu ods-datatable__menu--align-end\" role=\"menu\">\n {rowActions.map((a, i) => {\n const disabled = a.disabled?.(row);\n return (\n <li key={i}>\n <button\n type=\"button\"\n role=\"menuitem\"\n className={cn(\n \"ods-datatable__menu-item\",\n a.danger && \"ods-datatable__menu-item--danger\",\n disabled && \"ods-datatable__menu-item--disabled\",\n )}\n disabled={!!disabled}\n onClick={() => {\n a.onClick(row, rowIndex);\n setMenuOpen(false);\n }}\n >\n {a.icon && (\n <span className=\"ods-datatable__menu-item-icon\">{a.icon}</span>\n )}\n <span>{a.label}</span>\n </button>\n </li>\n );\n })}\n </ul>\n )}\n </div>\n </td>\n )}\n </tr>\n {expandable && expanded && renderExpanded && (\n <tr className=\"ods-datatable__row-expanded\">\n <td colSpan={totalCols} className=\"ods-datatable__td-expanded\">\n {renderExpanded(row, rowIndex)}\n </td>\n </tr>\n )}\n </>\n );\n}\n\nfunction ChevronRightSmall() {\n return (\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M4 2 6.5 5 4 8\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n","\"use client\";\nimport { type ReactNode, useEffect, useRef, useState } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { Calendar } from \"../Calendar\";\n\nexport interface DatePickerProps {\n label?: ReactNode;\n value: Date | null;\n onChange?: (value: Date | null) => void;\n placeholder?: string;\n format?: (d: Date) => string;\n size?: \"sm\" | \"md\" | \"lg\";\n disabled?: boolean;\n error?: ReactNode;\n helperText?: ReactNode;\n minDate?: Date;\n maxDate?: Date;\n className?: string;\n}\n\nconst defaultFormat = (d: Date) =>\n d.toLocaleDateString(undefined, { month: \"short\", day: \"numeric\", year: \"numeric\" });\n\nexport function DatePicker({\n label,\n value,\n onChange,\n placeholder = \"Select date\",\n format = defaultFormat,\n size = \"md\",\n disabled = false,\n error,\n helperText,\n minDate,\n maxDate,\n className,\n}: DatePickerProps) {\n const [open, setOpen] = useState(false);\n const wrapRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!open) return;\n const onDoc = (e: MouseEvent) => {\n if (!wrapRef.current?.contains(e.target as Node)) setOpen(false);\n };\n document.addEventListener(\"mousedown\", onDoc);\n return () => document.removeEventListener(\"mousedown\", onDoc);\n }, [open]);\n\n return (\n <div\n ref={wrapRef}\n className={cn(\n \"ods-datepicker\",\n `ods-datepicker--${size}`,\n disabled && \"ods-datepicker--disabled\",\n error && \"ods-datepicker--error\",\n className,\n )}\n >\n {label && <label className=\"ods-datepicker__label\">{label}</label>}\n <button\n type=\"button\"\n className=\"ods-datepicker__trigger\"\n onClick={() => !disabled && setOpen((o) => !o)}\n disabled={disabled}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <rect\n x=\"2\"\n y=\"3.5\"\n width=\"12\"\n height=\"10\"\n rx=\"1.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <path\n d=\"M5 2v3M11 2v3M2 6.5h12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n <span\n className={cn(\"ods-datepicker__value\", !value && \"ods-datepicker__value--placeholder\")}\n >\n {value ? format(value) : placeholder}\n </span>\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n aria-hidden=\"true\"\n className=\"ods-datepicker__chev\"\n >\n <path\n d=\"M3 4.5 6 7.5 9 4.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n {open && (\n <div className=\"ods-datepicker__popover\" role=\"dialog\">\n <Calendar\n mode=\"single\"\n value={value}\n onChange={(d) => {\n onChange?.(d as Date);\n setOpen(false);\n }}\n minDate={minDate}\n maxDate={maxDate}\n />\n </div>\n )}\n {error ? (\n <div className=\"ods-datepicker__hint ods-datepicker__hint--error\">{error}</div>\n ) : helperText ? (\n <div className=\"ods-datepicker__hint\">{helperText}</div>\n ) : null}\n </div>\n );\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface DescriptionListItem {\n label: ReactNode;\n value: ReactNode;\n key?: string | number;\n}\n\nexport interface DescriptionListProps {\n items: DescriptionListItem[];\n layout?: \"row\" | \"stacked\";\n divided?: boolean;\n size?: \"sm\" | \"md\";\n labelWidth?: number | string;\n className?: string;\n}\n\nexport function DescriptionList({\n items,\n layout = \"row\",\n divided = true,\n size = \"md\",\n labelWidth = 120,\n className,\n}: DescriptionListProps) {\n return (\n <dl\n className={cn(\n \"ods-dl\",\n `ods-dl--${layout}`,\n `ods-dl--${size}`,\n divided && \"ods-dl--divided\",\n className,\n )}\n >\n {items.map((item, i) => (\n <div className=\"ods-dl__row\" key={item.key ?? i}>\n <dt\n className=\"ods-dl__label\"\n style={layout === \"row\" ? { width: labelWidth } : undefined}\n >\n {item.label}\n </dt>\n <dd className=\"ods-dl__value\">{item.value}</dd>\n </div>\n ))}\n </dl>\n );\n}\n","\"use client\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport { type ReactNode, useRef } from \"react\";\nimport { FocusScope, useDialog, useModal, useOverlay } from \"react-aria\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"../../utils/cn\";\nimport { odsMotion } from \"../../utils/motion\";\n\nexport interface DialogProps {\n open: boolean;\n onClose: () => void;\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\";\n title?: ReactNode;\n description?: ReactNode;\n closeOnOverlayClick?: boolean;\n closeOnEsc?: boolean;\n children?: ReactNode;\n footer?: ReactNode;\n className?: string;\n}\n\nfunction DialogContent({\n open,\n onClose,\n size = \"md\",\n title,\n description,\n closeOnOverlayClick = true,\n closeOnEsc = true,\n children,\n footer,\n className,\n}: DialogProps) {\n const overlayRef = useRef<HTMLDivElement>(null);\n const dialogRef = useRef<HTMLDivElement>(null);\n\n const { overlayProps, underlayProps } = useOverlay(\n {\n isOpen: open,\n onClose,\n isDismissable: closeOnOverlayClick,\n isKeyboardDismissDisabled: !closeOnEsc,\n },\n overlayRef,\n );\n\n const { modalProps } = useModal();\n const { dialogProps, titleProps } = useDialog({}, dialogRef);\n\n // Destructure conflicting motion props\n const { onDrag, onDragStart, onDragEnd, onAnimationStart, ...safeOverlayProps } =\n overlayProps as any;\n\n return (\n <AnimatePresence>\n {open && (\n <motion.div\n className={\"ods-dialog\"}\n {...(() => {\n const { onDrag, onDragStart, onDragEnd, onAnimationStart, ...safe } =\n underlayProps as any;\n return safe;\n })()}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.15 }}\n data-testid=\"dialog-overlay\"\n >\n <FocusScope contain restoreFocus autoFocus>\n <motion.div\n {...safeOverlayProps}\n {...modalProps}\n {...dialogProps}\n ref={(node) => {\n (overlayRef as any).current = node;\n (dialogRef as any).current = node;\n }}\n className={cn(\"ods-dialog__card\", `ods-dialog__card--${size}`, className)}\n initial={odsMotion.scaleIn.initial}\n animate={odsMotion.scaleIn.animate}\n exit={odsMotion.scaleIn.exit}\n transition={odsMotion.scaleIn.transition}\n >\n {title && (\n <div className={\"ods-dialog__header\"}>\n <h2 {...titleProps} className={\"ods-dialog__title\"}>\n {title}\n </h2>\n {description && <p className={\"ods-dialog__description\"}>{description}</p>}\n <button\n className={\"ods-dialog__close\"}\n onClick={onClose}\n aria-label=\"Close dialog\"\n type=\"button\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path d=\"M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z\" />\n </svg>\n </button>\n </div>\n )}\n <div className={\"ods-dialog__body\"}>{children}</div>\n {footer && <div className={\"ods-dialog__footer\"}>{footer}</div>}\n </motion.div>\n </FocusScope>\n </motion.div>\n )}\n </AnimatePresence>\n );\n}\n\nexport function Dialog(props: DialogProps) {\n if (typeof document === \"undefined\") return null;\n return createPortal(<DialogContent {...props} />, document.body);\n}\n","// Motion presets matching v3 prototype — fast, subtle, not sluggish\nexport const odsMotion = {\n // Instant fade (100ms) — tooltips, badges\n fadeIn: {\n initial: { opacity: 0 },\n animate: { opacity: 1 },\n exit: { opacity: 0 },\n transition: { duration: 0.1 },\n },\n // Quick scale (120ms) — dropdowns, popovers\n scaleIn: {\n initial: { opacity: 0, scale: 0.97 },\n animate: { opacity: 1, scale: 1 },\n exit: { opacity: 0, scale: 0.97 },\n transition: { duration: 0.12, ease: [0.4, 0, 0.2, 1] },\n },\n // Slide panel (150ms) — config panels, slideouts\n slideRight: {\n initial: { x: \"100%\" },\n animate: { x: 0 },\n exit: { x: \"100%\" },\n transition: { duration: 0.15, ease: [0.4, 0, 0.2, 1] },\n },\n // Slide up (120ms) — toasts, modals\n slideUp: {\n initial: { opacity: 0, y: 8 },\n animate: { opacity: 1, y: 0 },\n exit: { opacity: 0, y: 8 },\n transition: { duration: 0.12, ease: [0.4, 0, 0.2, 1] },\n },\n // Tap feedback — buttons\n tap: { whileTap: { scale: 0.97 } },\n // Hover lift — cards (subtle, 1px not 2px)\n hover: { whileHover: { y: -1 } },\n};\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface DonutSegment {\n label: ReactNode;\n value: number;\n color: string;\n}\n\nexport interface DonutChartProps {\n data: DonutSegment[];\n size?: number;\n strokeWidth?: number;\n title?: ReactNode;\n centerLabel?: ReactNode; // overrides default \"total\"\n showLegend?: boolean;\n className?: string;\n}\n\nexport function DonutChart({\n data,\n size = 160,\n strokeWidth = 22,\n title,\n centerLabel,\n showLegend = true,\n className,\n}: DonutChartProps) {\n const total = data.reduce((s, d) => s + d.value, 0) || 1;\n const r = (size - strokeWidth) / 2;\n const c = 2 * Math.PI * r;\n\n let offset = 0;\n const segs = data.map((d) => {\n const len = (d.value / total) * c;\n const seg = { ...d, dash: `${len} ${c - len}`, dashoffset: -offset };\n offset += len;\n return seg;\n });\n\n return (\n <div className={cn(\"ods-donut\", className)}>\n {title && <div className=\"ods-donut__title\">{title}</div>}\n <div className=\"ods-donut__ring\" style={{ width: size, height: size }}>\n <svg width={size} height={size}>\n <circle\n cx={size / 2}\n cy={size / 2}\n r={r}\n fill=\"none\"\n stroke=\"#f3f1ff\"\n strokeWidth={strokeWidth}\n />\n <g transform={`rotate(-90 ${size / 2} ${size / 2})`}>\n {segs.map((s, i) => (\n <circle\n key={i}\n cx={size / 2}\n cy={size / 2}\n r={r}\n fill=\"none\"\n stroke={s.color}\n strokeWidth={strokeWidth}\n strokeDasharray={s.dash}\n strokeDashoffset={s.dashoffset}\n strokeLinecap=\"butt\"\n />\n ))}\n </g>\n </svg>\n <div className=\"ods-donut__center\">\n {centerLabel ?? (\n <>\n <div className=\"ods-donut__value\">{total}</div>\n <div className=\"ods-donut__small\">total</div>\n </>\n )}\n </div>\n </div>\n {showLegend && (\n <ul className=\"ods-donut__legend\">\n {data.map((d, i) => (\n <li key={i} className=\"ods-donut__legend-item\">\n <span className=\"ods-donut__dot\" style={{ background: d.color }} />\n <span className=\"ods-donut__legend-label\">{d.label}</span>\n <span className=\"ods-donut__legend-pct\">{Math.round((d.value / total) * 100)}%</span>\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface DrawerProps {\n title?: ReactNode;\n subtitle?: ReactNode;\n onClose?: () => void;\n children?: ReactNode;\n footer?: ReactNode;\n width?: number | string;\n height?: number | string;\n className?: string;\n}\n\n/**\n * Inline drawer / detail panel — not a portaled overlay.\n * Use SlideoutPanel for overlay+focus-trap UX.\n */\nexport function Drawer({\n title,\n subtitle,\n onClose,\n children,\n footer,\n width = 420,\n height = \"100%\",\n className,\n}: DrawerProps) {\n return (\n <aside\n className={cn(\"ods-drawer\", className)}\n style={{ width, height }}\n aria-label={typeof title === \"string\" ? title : undefined}\n >\n {(title || subtitle || onClose) && (\n <header className=\"ods-drawer__head\">\n <div className=\"ods-drawer__titles\">\n {title && <h3 className=\"ods-drawer__title\">{title}</h3>}\n {subtitle && <p className=\"ods-drawer__subtitle\">{subtitle}</p>}\n </div>\n {onClose && (\n <button\n type=\"button\"\n className=\"ods-drawer__close\"\n onClick={onClose}\n aria-label=\"Close\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M4 4l8 8M12 4l-8 8\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n )}\n </header>\n )}\n <div className=\"ods-drawer__body\">{children}</div>\n {footer && <footer className=\"ods-drawer__footer\">{footer}</footer>}\n </aside>\n );\n}\n","\"use client\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport { type ReactNode, useRef } from \"react\";\nimport { useButton, useMenu, useMenuItem, useMenuTrigger } from \"react-aria\";\nimport { createPortal } from \"react-dom\";\nimport { Item, useMenuTriggerState, useTreeState } from \"react-stately\";\nimport { cn } from \"../../utils/cn\";\nimport { odsMotion } from \"../../utils/motion\";\n\nexport interface DropdownMenuItem {\n label: string;\n icon?: ReactNode;\n onClick?: () => void;\n danger?: boolean;\n disabled?: boolean;\n separator?: boolean;\n}\n\nexport interface DropdownMenuProps {\n trigger: ReactNode;\n items: DropdownMenuItem[];\n align?: \"start\" | \"end\";\n className?: string;\n}\n\nfunction MenuItemComponent({ item, state, onAction }: any) {\n const ref = useRef<HTMLLIElement>(null);\n const { menuItemProps } = useMenuItem({ key: item.key, onAction }, state, ref);\n\n const menuItem = item.value as DropdownMenuItem;\n const isDisabled = state.disabledKeys.has(item.key);\n\n return (\n <li\n {...menuItemProps}\n ref={ref}\n className={cn(\n \"ods-dropdown__item\",\n menuItem.danger && \"ods-dropdown__item--danger\",\n isDisabled && \"ods-dropdown__item--disabled\",\n )}\n >\n {menuItem.icon && <span className={\"ods-dropdown__icon\"}>{menuItem.icon}</span>}\n <span>{menuItem.label}</span>\n </li>\n );\n}\n\nfunction MenuPopup({\n state,\n menuItems,\n triggerRef,\n align,\n className,\n}: {\n state: ReturnType<typeof useMenuTriggerState>;\n menuItems: DropdownMenuItem[];\n triggerRef: React.RefObject<HTMLButtonElement | null>;\n align: \"start\" | \"end\";\n className?: string;\n}) {\n const menuRef = useRef<HTMLUListElement>(null);\n\n // Build items for react-stately, filtering separators\n const nonSepItems = menuItems.filter((i) => !i.separator);\n const children = nonSepItems.map((item, idx) => (\n <Item key={idx} textValue={item.label}>\n {item.label}\n </Item>\n ));\n\n const treeState = useTreeState({\n children,\n selectionMode: \"none\",\n disabledKeys: nonSepItems\n .map((item, idx) => (item.disabled ? String(idx) : null))\n .filter(Boolean) as string[],\n });\n\n const { menuProps } = useMenu({}, treeState, menuRef);\n\n const onAction = (key: any) => {\n const idx = Number(key);\n nonSepItems[idx]?.onClick?.();\n state.close();\n };\n\n const getStyle = (): React.CSSProperties => {\n if (!triggerRef.current) return {};\n const rect = triggerRef.current.getBoundingClientRect();\n const style: React.CSSProperties = {\n position: \"fixed\",\n zIndex: 1200,\n top: rect.bottom + 4,\n };\n\n if (align === \"end\") {\n style.right = window.innerWidth - rect.right;\n } else {\n style.left = rect.left;\n }\n\n return style;\n };\n\n // Build the full list with separators\n let nonSepIdx = 0;\n const renderedItems: ReactNode[] = [];\n\n menuItems.forEach((menuItem, rawIdx) => {\n if (menuItem.separator) {\n renderedItems.push(<li key={`sep-${rawIdx}`} className={\"ods-dropdown__separator\"} />);\n } else {\n const treeItem = [...treeState.collection][nonSepIdx];\n if (treeItem) {\n renderedItems.push(\n <MenuItemComponent\n key={treeItem.key}\n item={{ ...treeItem, value: menuItem }}\n state={treeState}\n onAction={onAction}\n />,\n );\n }\n nonSepIdx++;\n }\n });\n\n const portalContent = (\n <AnimatePresence>\n {state.isOpen && (\n <motion.ul\n {...(() => {\n const { onDrag, onDragStart, onDragEnd, onAnimationStart, ...safe } = menuProps as any;\n return safe;\n })()}\n ref={menuRef}\n className={cn(\"ods-dropdown\", className)}\n style={getStyle()}\n initial={odsMotion.scaleIn.initial}\n animate={odsMotion.scaleIn.animate}\n exit={odsMotion.scaleIn.exit}\n transition={odsMotion.scaleIn.transition as any}\n >\n {renderedItems}\n </motion.ul>\n )}\n </AnimatePresence>\n );\n\n if (typeof document !== \"undefined\") {\n return createPortal(portalContent, document.body);\n }\n\n return null;\n}\n\nexport function DropdownMenu({ trigger, items, align = \"start\", className }: DropdownMenuProps) {\n const triggerRef = useRef<HTMLButtonElement>(null);\n const state = useMenuTriggerState({});\n const { menuTriggerProps } = useMenuTrigger({}, state, triggerRef);\n const { buttonProps } = useButton(menuTriggerProps, triggerRef);\n\n // Remove motion-conflicting props\n const { onDrag, onDragStart, onDragEnd, onAnimationStart, ...safeTriggerProps } =\n buttonProps as any;\n\n return (\n <>\n <button {...safeTriggerProps} ref={triggerRef} className={\"ods-dropdown__trigger\"}>\n {trigger}\n </button>\n <MenuPopup\n state={state}\n menuItems={items}\n triggerRef={triggerRef}\n align={align}\n className={className}\n />\n </>\n );\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface EmptyStateProps {\n icon?: ReactNode;\n title: string;\n description?: string;\n action?: ReactNode;\n className?: string;\n}\n\nexport function EmptyState({ icon, title, description, action, className }: EmptyStateProps) {\n return (\n <div className={cn(\"ods-empty-state\", className)}>\n {icon && (\n <div className={\"ods-empty-state__icon\"} aria-hidden=\"true\">\n {icon}\n </div>\n )}\n <h3 className={\"ods-empty-state__title\"}>{title}</h3>\n {description && <p className={\"ods-empty-state__description\"}>{description}</p>}\n {action && <div className={\"ods-empty-state__action\"}>{action}</div>}\n </div>\n );\n}\n","\"use client\";\nimport { motion } from \"framer-motion\";\nimport { type ReactNode, useEffect, useRef } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport type LogLevel = \"info\" | \"warn\" | \"error\" | \"debug\" | \"success\";\n\nexport interface LogEntry {\n timestamp: string;\n level: LogLevel;\n message: string;\n}\n\nexport interface ExecutionConsoleProps {\n open?: boolean;\n onToggle?: () => void;\n logs?: LogEntry[];\n running?: boolean;\n /** Handler for the built-in Stop button — only rendered when `running` is true. */\n onStop?: () => void;\n /** Handler for the built-in Clear button. */\n onClear?: () => void;\n /** Handler for the built-in Copy button — copies log text to the clipboard. */\n onCopy?: () => void;\n /** Extra toolbar content rendered in the top-right, after the built-in actions. */\n toolbar?: ReactNode;\n className?: string;\n}\n\n// ── Inline icons (lucide-compatible) ─────────────────────────────────────────\nconst iconProps = {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\" as const,\n strokeLinejoin: \"round\" as const,\n \"aria-hidden\": true,\n};\nconst StopIcon = () => (\n <svg {...iconProps} width={14} height={14}>\n <rect x=\"6\" y=\"6\" width=\"12\" height=\"12\" rx=\"1\" />\n </svg>\n);\nconst CopyIcon = () => (\n <svg {...iconProps} width={14} height={14}>\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\n </svg>\n);\nconst TrashIcon = () => (\n <svg {...iconProps} width={14} height={14}>\n <polyline points=\"3 6 5 6 21 6\" />\n <path d=\"M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6\" />\n <path d=\"M10 11v6M14 11v6\" />\n <path d=\"M9 6V4a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2v2\" />\n </svg>\n);\n\nconst COLLAPSED_HEIGHT = 36;\nconst EXPANDED_HEIGHT = 220;\n\nexport function ExecutionConsole({\n open = false,\n onToggle,\n logs = [],\n running = false,\n onStop,\n onClear,\n onCopy,\n toolbar,\n className,\n}: ExecutionConsoleProps) {\n const logEndRef = useRef<HTMLDivElement>(null);\n\n const handleCopy = () => {\n if (onCopy) {\n onCopy();\n return;\n }\n if (typeof navigator !== \"undefined\" && navigator.clipboard) {\n const text = logs\n .map((l) => `${l.timestamp} ${l.level.toUpperCase()} ${l.message}`)\n .join(\"\\n\");\n void navigator.clipboard.writeText(text);\n }\n };\n\n useEffect(() => {\n if (open && logEndRef.current) {\n logEndRef.current.scrollIntoView?.({ behavior: \"smooth\" });\n }\n }, [open]);\n\n return (\n <motion.div\n className={cn(\"ods-console\", className)}\n animate={{ height: open ? EXPANDED_HEIGHT : COLLAPSED_HEIGHT }}\n transition={{ type: \"spring\", stiffness: 300, damping: 30 }}\n data-testid=\"execution-console\"\n >\n {/* Mini bar / header */}\n <div className={\"ods-console__bar\"} data-testid=\"console-bar\">\n <button\n className={\"ods-console__toggle\"}\n onClick={onToggle}\n aria-label={open ? \"Collapse console\" : \"Expand console\"}\n data-testid=\"console-toggle\"\n >\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"currentColor\"\n style={{\n transform: open ? \"rotate(180deg)\" : \"rotate(0deg)\",\n transition: \"transform 0.2s\",\n }}\n >\n <path\n d=\"M3 9l4-4 4 4\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n fill=\"none\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n <span className={\"ods-console__label\"}>\n Console\n {running && (\n <span className=\"ods-console__status\" data-testid=\"console-running\">\n <span className=\"ods-console__status-dot\" aria-hidden=\"true\" />\n <span className=\"ods-console__status-text\">Running…</span>\n </span>\n )}\n </span>\n <span className={\"ods-console__count\"} data-testid=\"console-count\">\n {logs.length} {logs.length === 1 ? \"entry\" : \"entries\"}\n </span>\n <div className={\"ods-console__actions\"} role=\"toolbar\" aria-label=\"Console actions\">\n {running && onStop && (\n <button\n type=\"button\"\n className={cn(\"ods-console__action\", \"ods-console__action--stop\")}\n onClick={onStop}\n aria-label=\"Stop execution\"\n title=\"Stop\"\n data-testid=\"console-stop\"\n >\n <StopIcon />\n </button>\n )}\n {logs.length > 0 && (\n <button\n type=\"button\"\n className={\"ods-console__action\"}\n onClick={handleCopy}\n aria-label=\"Copy logs\"\n title=\"Copy logs\"\n data-testid=\"console-copy\"\n >\n <CopyIcon />\n </button>\n )}\n {onClear && (\n <button\n type=\"button\"\n className={\"ods-console__action\"}\n onClick={onClear}\n aria-label=\"Clear console\"\n title=\"Clear\"\n data-testid=\"console-clear\"\n >\n <TrashIcon />\n </button>\n )}\n {toolbar && (\n <>\n <span className=\"ods-console__action-separator\" aria-hidden=\"true\" />\n {toolbar}\n </>\n )}\n </div>\n </div>\n\n {/* Log area */}\n {open && (\n <div className={\"ods-console__logs\"} data-testid=\"console-logs\">\n {logs.length === 0 && (\n <div className={\"ods-console__empty\"} data-testid=\"console-empty\">\n No log entries\n </div>\n )}\n {logs.map((log, i) => (\n <div\n key={i}\n className={cn(\"ods-console__line\", `ods-console__line--${log.level}`)}\n data-testid=\"console-log-line\"\n >\n <span className={\"ods-console__timestamp\"}>{log.timestamp}</span>\n <span className={cn(\"ods-console__level\", `ods-console__level--${log.level}`)}>\n {log.level.toUpperCase()}\n </span>\n <span className={\"ods-console__message\"}>{log.message}</span>\n </div>\n ))}\n <div ref={logEndRef} />\n </div>\n )}\n </motion.div>\n );\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface FeatureCardProps {\n icon: ReactNode;\n title: ReactNode;\n description?: ReactNode;\n link?: { label: ReactNode; href?: string; onClick?: () => void };\n variant?: \"default\" | \"primary\" | \"success\" | \"warning\" | \"error\";\n className?: string;\n}\n\nexport function FeatureCard({\n icon,\n title,\n description,\n link,\n variant = \"primary\",\n className,\n}: FeatureCardProps) {\n const Comp = link?.href ? \"a\" : \"button\";\n return (\n <div className={cn(\"ods-feature-card\", `ods-feature-card--${variant}`, className)}>\n <span className=\"ods-feature-card__icon\" aria-hidden=\"true\">\n {icon}\n </span>\n <div className=\"ods-feature-card__title\">{title}</div>\n {description && <div className=\"ods-feature-card__desc\">{description}</div>}\n {link && (\n <Comp\n href={link.href}\n onClick={link.onClick as any}\n type={link.href ? undefined : \"button\"}\n className=\"ods-feature-card__link\"\n >\n <span>{link.label}</span>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M3 7h8m-3-3l3 3-3 3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.7\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </Comp>\n )}\n </div>\n );\n}\n","\"use client\";\nimport {\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n} from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { sanitizeImageUrl } from \"../../utils/sanitizeUrl\";\n\nexport interface FileDropzoneFile {\n id: string;\n file: File;\n /** Upload progress 0–100. */\n progress?: number;\n /** Lifecycle status. */\n status?: \"queued\" | \"uploading\" | \"done\" | \"error\";\n /** Per-file error message. */\n error?: string;\n /** Optional preview URL (auto-generated for images if not provided). */\n previewUrl?: string;\n}\n\nexport interface FileDropzoneProps {\n /** Trigger when files are dropped or selected. */\n onFiles?: (files: File[]) => void;\n /** Managed list of files to show inline. */\n files?: FileDropzoneFile[];\n /** Remove a file from the managed list. */\n onRemove?: (id: string) => void;\n /** Retry a failed file. */\n onRetry?: (id: string) => void;\n /** Allowed file types — same syntax as `<input accept>`. */\n accept?: string;\n /** Allow multiple file selection. */\n multiple?: boolean;\n /** Maximum file size in bytes. */\n maxSize?: number;\n /** Maximum total files. */\n maxFiles?: number;\n /** Disabled state. */\n disabled?: boolean;\n /** Title shown in the empty state. */\n title?: ReactNode;\n /** Subtitle/hint shown below title. */\n hint?: ReactNode;\n /** Custom icon. */\n icon?: ReactNode;\n /** Show \"Browse files\" button. */\n showBrowse?: boolean;\n /** Accept clipboard paste (Cmd+V) when the dropzone is focused. */\n pasteEnabled?: boolean;\n /** Compact variant. */\n compact?: boolean;\n className?: string;\n}\n\nconst UPLOAD_ICON = (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M10 3v9M6 7l4-4 4 4M3 15h14\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nconst SPIN_ICON = (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"6\" cy=\"6\" r=\"4\" stroke=\"currentColor\" strokeWidth=\"1.4\" strokeDasharray=\"4 18\" strokeLinecap=\"round\" />\n </svg>\n);\n\nconst CHECK_ICON = (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"m3 6 2 2 4-4\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nconst ERROR_ICON = (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"6\" cy=\"6\" r=\"5\" stroke=\"currentColor\" strokeWidth=\"1.3\" />\n <path d=\"M6 3.5v3M6 8.2v.3\" stroke=\"currentColor\" strokeWidth=\"1.4\" strokeLinecap=\"round\" />\n </svg>\n);\n\nconst RETRY_ICON = (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M9.5 4.5A4 4 0 1 0 10 7M10 2v3H7\" stroke=\"currentColor\" strokeWidth=\"1.3\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nconst fmtSize = (size: number) => {\n if (size < 1024) return `${size} B`;\n const kb = size / 1024;\n if (kb < 1024) return `${kb.toFixed(1)} KB`;\n return `${(kb / 1024).toFixed(1)} MB`;\n};\n\nfunction iconForFile(file: File): ReactNode {\n const type = file.type;\n const name = file.name.toLowerCase();\n if (type.startsWith(\"image/\")) {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <rect x=\"2\" y=\"2\" width=\"12\" height=\"12\" rx=\"1.5\" stroke=\"currentColor\" strokeWidth=\"1.3\" />\n <circle cx=\"6\" cy=\"6\" r=\"1.2\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <path d=\"m2 11 3-3 3 3 2-2 4 4\" stroke=\"currentColor\" strokeWidth=\"1.3\" strokeLinejoin=\"round\" />\n </svg>\n );\n }\n if (type === \"application/pdf\" || name.endsWith(\".pdf\")) {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M3.5 2h6L13 5.5V14H3.5z\" stroke=\"currentColor\" strokeWidth=\"1.3\" strokeLinejoin=\"round\" />\n <path d=\"M9.5 2v3.5H13\" stroke=\"currentColor\" strokeWidth=\"1.3\" />\n <text x=\"5.5\" y=\"11.5\" fontFamily=\"ui-monospace, monospace\" fontSize=\"3.4\" fontWeight=\"700\" fill=\"currentColor\">PDF</text>\n </svg>\n );\n }\n if (type.startsWith(\"text/\") || /\\.(csv|tsv|json|xml|yml|yaml|md|txt)$/.test(name)) {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M3.5 2h6L13 5.5V14H3.5z\" stroke=\"currentColor\" strokeWidth=\"1.3\" strokeLinejoin=\"round\" />\n <path d=\"M9.5 2v3.5H13M5.5 8h5M5.5 10.5h5M5.5 12.5h3\" stroke=\"currentColor\" strokeWidth=\"1.3\" strokeLinecap=\"round\" />\n </svg>\n );\n }\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M3.5 2h6L13 5.5V14H3.5z\" stroke=\"currentColor\" strokeWidth=\"1.3\" strokeLinejoin=\"round\" />\n <path d=\"M9.5 2v3.5H13\" stroke=\"currentColor\" strokeWidth=\"1.3\" />\n </svg>\n );\n}\n\nexport function FileDropzone({\n onFiles,\n files,\n onRemove,\n onRetry,\n accept,\n multiple = false,\n maxSize,\n maxFiles,\n disabled = false,\n title = \"Drop files here\",\n hint = \"or click to browse\",\n icon = UPLOAD_ICON,\n showBrowse = true,\n pasteEnabled = true,\n compact = false,\n className,\n}: FileDropzoneProps) {\n const inputRef = useRef<HTMLInputElement>(null);\n const dropzoneRef = useRef<HTMLDivElement>(null);\n const inputId = useId();\n const [isOver, setOver] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [autoPreviews, setAutoPreviews] = useState<Record<string, string>>({});\n\n const validate = useCallback(\n (list: File[]): { ok: File[]; error: string | null } => {\n if (maxFiles && list.length > maxFiles) {\n return { ok: [], error: `Too many files — max ${maxFiles}` };\n }\n if (maxSize) {\n const big = list.find((f) => f.size > maxSize);\n if (big) {\n return { ok: [], error: `\"${big.name}\" exceeds max size (${fmtSize(maxSize)})` };\n }\n }\n if (accept) {\n const accepted = accept.split(\",\").map((s) => s.trim().toLowerCase());\n const filtered = list.filter((f) => {\n const ext = f.name.toLowerCase().slice(f.name.lastIndexOf(\".\"));\n const type = f.type.toLowerCase();\n return accepted.some(\n (a) =>\n a === ext ||\n a === type ||\n (a.endsWith(\"/*\") && type.startsWith(a.slice(0, -1))),\n );\n });\n if (filtered.length === 0) {\n return { ok: [], error: \"File type not accepted\" };\n }\n return { ok: filtered, error: null };\n }\n return { ok: list, error: null };\n },\n [accept, maxFiles, maxSize],\n );\n\n const handleFiles = useCallback(\n (incoming: File[]) => {\n if (disabled) return;\n const { ok, error } = validate(incoming);\n setError(error);\n if (ok.length > 0) onFiles?.(ok);\n },\n [disabled, onFiles, validate],\n );\n\n // Generate image previews for managed files\n useEffect(() => {\n if (!files) return;\n const next: Record<string, string> = {};\n const created: string[] = [];\n for (const f of files) {\n if (f.previewUrl) continue;\n if (f.file.type.startsWith(\"image/\") && !autoPreviews[f.id]) {\n const url = URL.createObjectURL(f.file);\n next[f.id] = url;\n created.push(url);\n }\n }\n if (Object.keys(next).length > 0) setAutoPreviews((p) => ({ ...p, ...next }));\n return () => {\n created.forEach((u) => URL.revokeObjectURL(u));\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [files]);\n\n // Clipboard paste — capture pastes when dropzone is focused (or contains focus)\n useEffect(() => {\n if (!pasteEnabled || disabled) return;\n const onPaste = (e: ClipboardEvent) => {\n const active = document.activeElement;\n const el = dropzoneRef.current;\n if (!el) return;\n if (active !== el && !el.contains(active as Node | null)) return;\n const items = e.clipboardData?.items;\n if (!items) return;\n const out: File[] = [];\n for (const it of Array.from(items)) {\n if (it.kind === \"file\") {\n const f = it.getAsFile();\n if (f) out.push(f);\n }\n }\n if (out.length === 0) return;\n e.preventDefault();\n handleFiles(out);\n };\n document.addEventListener(\"paste\", onPaste);\n return () => document.removeEventListener(\"paste\", onPaste);\n }, [pasteEnabled, disabled, handleFiles]);\n\n const showInternalList = files !== undefined;\n const itemCount = files?.length ?? 0;\n\n return (\n <div\n className={cn(\n \"ods-file-dropzone-wrap\",\n compact && \"ods-file-dropzone-wrap--compact\",\n className,\n )}\n >\n <div\n ref={dropzoneRef}\n className={cn(\n \"ods-file-dropzone\",\n isOver && \"ods-file-dropzone--over\",\n error && \"ods-file-dropzone--error\",\n disabled && \"ods-file-dropzone--disabled\",\n compact && \"ods-file-dropzone--compact\",\n showInternalList && itemCount > 0 && \"ods-file-dropzone--has-files\",\n )}\n onDragEnter={(e) => {\n if (disabled) return;\n e.preventDefault();\n setOver(true);\n }}\n onDragOver={(e) => {\n if (disabled) return;\n e.preventDefault();\n e.dataTransfer.dropEffect = \"copy\";\n }}\n onDragLeave={(e) => {\n if (disabled) return;\n const next = e.relatedTarget as Node | null;\n if (next && e.currentTarget.contains(next)) return;\n setOver(false);\n }}\n onDrop={(e) => {\n if (disabled) return;\n e.preventDefault();\n setOver(false);\n const list = Array.from(e.dataTransfer.files);\n if (list.length > 0) handleFiles(list);\n }}\n onClick={() => {\n if (!disabled) inputRef.current?.click();\n }}\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-label={typeof title === \"string\" ? title : \"File upload\"}\n aria-describedby={`${inputId}-hint`}\n onKeyDown={(e) => {\n if (disabled) return;\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n inputRef.current?.click();\n }\n }}\n >\n <input\n ref={inputRef}\n id={inputId}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n className=\"ods-file-dropzone__input\"\n onChange={(e) => {\n const list = Array.from(e.target.files ?? []);\n if (list.length > 0) handleFiles(list);\n e.target.value = \"\";\n }}\n />\n <span className=\"ods-file-dropzone__icon\" aria-hidden=\"true\">\n {isOver ? (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 22 22\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M11 3v12M6 9l5-5 5 5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n ) : (\n icon\n )}\n </span>\n <span className=\"ods-file-dropzone__title\">\n {isOver\n ? showInternalList && itemCount > 0\n ? \"Drop to add more\"\n : \"Drop to upload\"\n : title}\n </span>\n {hint && (\n <span id={`${inputId}-hint`} className=\"ods-file-dropzone__hint\">\n {isOver ? \"Release to add files\" : hint}\n </span>\n )}\n {!isOver && (\n <div className=\"ods-file-dropzone__cta-row\">\n {showBrowse && <span className=\"ods-file-dropzone__cta\">Browse files</span>}\n {pasteEnabled && (\n <span className=\"ods-file-dropzone__kbd-hint\">\n or <kbd className=\"ods-file-dropzone__kbd\">⌘V</kbd> paste\n </span>\n )}\n </div>\n )}\n {error && <span className=\"ods-file-dropzone__error\">{error}</span>}\n </div>\n\n {showInternalList && files && files.length > 0 && (\n <div className=\"ods-file-dropzone__list-wrap\">\n <div className=\"ods-file-dropzone__list-head\">\n <span className=\"ods-file-dropzone__list-title\">\n {files.length} file{files.length === 1 ? \"\" : \"s\"}\n </span>\n {files.some((f) => f.status === \"uploading\") && (\n <span className=\"ods-file-dropzone__list-status\">\n {files.filter((f) => f.status === \"done\").length} of {files.length} uploaded\n </span>\n )}\n </div>\n <ul className=\"ods-file-dropzone__list\" aria-label=\"Selected files\">\n {files.map((f) => {\n const isImage = f.file.type.startsWith(\"image/\");\n // autoPreviews values are blob: URLs we created ourselves — safe.\n // Consumer-supplied previewUrl runs through the protocol allowlist.\n const preview = f.previewUrl\n ? sanitizeImageUrl(f.previewUrl)\n : autoPreviews[f.id];\n const pct = f.progress ?? 0;\n const status = f.status ?? \"queued\";\n return (\n <li\n key={f.id}\n className={cn(\n \"ods-file-dropzone__item\",\n `ods-file-dropzone__item--${status}`,\n )}\n >\n <span className=\"ods-file-dropzone__item-thumb\" aria-hidden=\"true\">\n {isImage && preview ? <img src={preview} alt=\"\" /> : iconForFile(f.file)}\n </span>\n <div className=\"ods-file-dropzone__item-body\">\n <div className=\"ods-file-dropzone__item-head\">\n <span className=\"ods-file-dropzone__item-name\" title={f.file.name}>\n {f.file.name}\n </span>\n <span className=\"ods-file-dropzone__item-size\">{fmtSize(f.file.size)}</span>\n </div>\n {status === \"uploading\" && (\n <div className=\"ods-file-dropzone__progress\" aria-hidden=\"true\">\n <div\n className=\"ods-file-dropzone__progress-fill\"\n style={{ width: `${Math.max(0, Math.min(100, pct))}%` }}\n />\n </div>\n )}\n {status === \"error\" && f.error && (\n <span className=\"ods-file-dropzone__item-error\">{f.error}</span>\n )}\n </div>\n <div className=\"ods-file-dropzone__item-actions\">\n {status === \"uploading\" && (\n <span\n className=\"ods-file-dropzone__item-status ods-file-dropzone__item-status--uploading\"\n aria-label={`${pct}%`}\n >\n <span className=\"ods-file-dropzone__spin\">{SPIN_ICON}</span>\n <span>{pct}%</span>\n </span>\n )}\n {status === \"done\" && (\n <span\n className=\"ods-file-dropzone__item-status ods-file-dropzone__item-status--done\"\n aria-label=\"Uploaded\"\n >\n {CHECK_ICON}\n </span>\n )}\n {status === \"error\" && (\n <>\n <span\n className=\"ods-file-dropzone__item-status ods-file-dropzone__item-status--error\"\n aria-label=\"Error\"\n >\n {ERROR_ICON}\n </span>\n {onRetry && (\n <button\n type=\"button\"\n className=\"ods-file-dropzone__item-btn\"\n onClick={() => onRetry(f.id)}\n aria-label={`Retry ${f.file.name}`}\n >\n {RETRY_ICON}\n </button>\n )}\n </>\n )}\n {onRemove && status !== \"uploading\" && (\n <button\n type=\"button\"\n className=\"ods-file-dropzone__item-btn\"\n onClick={() => onRemove(f.id)}\n aria-label={`Remove ${f.file.name}`}\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"m3 3 6 6M9 3l-6 6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n )}\n </div>\n </li>\n );\n })}\n </ul>\n </div>\n )}\n </div>\n );\n}\n","/**\n * URL sanitization for component-level defense-in-depth.\n *\n * These helpers run a protocol/MIME allowlist on consumer-supplied URLs\n * before they reach attributes that can execute code (most commonly `<img src>`,\n * `<a href>`, or CSS `url()`). They return the URL unchanged when safe, or\n * `undefined` when the input fails the check — callers should fall back to a\n * safe default (e.g. a generic icon).\n *\n * What we reject:\n * - `javascript:` / `vbscript:` / `data:text/*` — script execution surfaces\n * - `file:` — local filesystem access from web context\n * - URLs with embedded control characters (CR/LF/TAB) that some parsers strip\n *\n * What we allow (image context):\n * - `https:` / `http:` — standard remote\n * - `blob:` — produced by `URL.createObjectURL`\n * - `data:image/png` — inline raster image\n * - `data:image/jpeg|jpg` — inline raster image\n * - `data:image/gif` — inline raster image\n * - `data:image/webp` — inline raster image\n * - `data:image/svg+xml` — SVG rendered via `<img>` cannot execute scripts\n *\n * What we allow (href context):\n * - `https:` / `http:` / `mailto:` / `tel:`\n */\n\nconst SAFE_IMG_PROTOCOLS = new Set([\"https:\", \"http:\", \"blob:\"]);\nconst SAFE_HREF_PROTOCOLS = new Set([\n \"https:\",\n \"http:\",\n \"mailto:\",\n \"tel:\",\n]);\n\nconst SAFE_IMG_DATA_MIMES = new Set([\n \"image/png\",\n \"image/jpeg\",\n \"image/jpg\",\n \"image/gif\",\n \"image/webp\",\n \"image/svg+xml\",\n \"image/avif\",\n \"image/bmp\",\n \"image/x-icon\",\n]);\n\n// Control chars (TAB / LF / CR / NUL etc.) — some URL parsers strip these,\n// which is how `java\\nscript:` historically bypassed naive allowlists.\nconst CONTROL_CHARS = /[\u0000-\u001f]/;\n\n/**\n * Returns the URL if it is safe to use as an image source, otherwise undefined.\n * The caller should render an icon fallback when undefined is returned.\n */\nexport function sanitizeImageUrl(url: string | undefined | null): string | undefined {\n if (!url) return undefined;\n const trimmed = String(url).trim();\n if (trimmed === \"\") return undefined;\n if (CONTROL_CHARS.test(trimmed)) return undefined;\n\n // Relative URLs (no protocol) are safe — they resolve against the document origin.\n // Match: starts with \"/\", \"./\", \"../\", or just a filename without \":\".\n if (\n trimmed.startsWith(\"/\") ||\n trimmed.startsWith(\"./\") ||\n trimmed.startsWith(\"../\") ||\n !trimmed.includes(\":\")\n ) {\n // Reject protocol-relative URLs like \"//evil.com\" — they inherit the page's scheme\n // but route to a third-party host. Keep them allowlisted explicitly if needed.\n if (trimmed.startsWith(\"//\")) return undefined;\n return trimmed;\n }\n\n // Parse via URL — handles percent-encoded protocols, unicode, etc.\n let parsed: URL;\n try {\n // Need a base for relative-ish inputs (shouldn't hit since we returned above,\n // but URL constructor is strict)\n parsed = new URL(trimmed, \"https://invalid.local\");\n } catch {\n return undefined;\n }\n\n const proto = parsed.protocol.toLowerCase();\n\n if (proto === \"data:\") {\n // Pull MIME from \"data:<mime>[;base64],<payload>\"\n const match = /^data:([^;,]+)/i.exec(trimmed);\n const mime = match?.[1]?.toLowerCase().trim();\n if (mime && SAFE_IMG_DATA_MIMES.has(mime)) return trimmed;\n return undefined;\n }\n\n if (SAFE_IMG_PROTOCOLS.has(proto)) return trimmed;\n return undefined;\n}\n\n/**\n * Returns the URL if it is safe to use as a hyperlink target, otherwise undefined.\n */\nexport function sanitizeHref(url: string | undefined | null): string | undefined {\n if (!url) return undefined;\n const trimmed = String(url).trim();\n if (trimmed === \"\") return undefined;\n if (CONTROL_CHARS.test(trimmed)) return undefined;\n\n // Relative URLs are safe.\n if (\n trimmed.startsWith(\"/\") ||\n trimmed.startsWith(\"./\") ||\n trimmed.startsWith(\"../\") ||\n trimmed.startsWith(\"#\") ||\n (!trimmed.includes(\":\") && !trimmed.startsWith(\"//\"))\n ) {\n if (trimmed.startsWith(\"//\")) return undefined;\n return trimmed;\n }\n\n let parsed: URL;\n try {\n parsed = new URL(trimmed, \"https://invalid.local\");\n } catch {\n return undefined;\n }\n\n const proto = parsed.protocol.toLowerCase();\n if (SAFE_HREF_PROTOCOLS.has(proto)) return trimmed;\n return undefined;\n}\n","\"use client\";\n\nimport { AnimatePresence } from \"framer-motion\";\nimport { type ComponentPropsWithoutRef, type ReactNode, useCallback, useRef } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport type { CanvasViewport, WorkflowEdge, WorkflowNode } from \"../../workflow/types\";\nimport { FlowEdge } from \"../FlowEdge/FlowEdge\";\nimport { FlowNode, type FlowNodeProps } from \"../FlowNode/FlowNode\";\n\nexport interface FlowCanvasProps extends Omit<ComponentPropsWithoutRef<\"div\">, \"children\"> {\n nodes: WorkflowNode[];\n edges: WorkflowEdge[];\n viewport: CanvasViewport;\n connectingFrom?: FlowNodeProps[\"connectingFrom\"];\n\n // Viewport\n onViewportChange?: (viewport: Partial<CanvasViewport>) => void;\n minZoom?: number;\n maxZoom?: number;\n\n // Selection\n onNodeSelect?: (id: string) => void;\n onEdgeSelect?: (id: string) => void;\n onDeselectAll?: () => void;\n\n // Node interactions\n onNodePositionChange?: (id: string, position: { x: number; y: number }) => void;\n onNodeDelete?: (id: string) => void;\n onNodesDelete?: (ids: string[]) => void;\n\n // Edge interactions\n onEdgeDelete?: (id: string) => void;\n\n // Connecting\n onStartConnecting?: FlowNodeProps[\"onStartConnecting\"];\n onEndConnecting?: FlowNodeProps[\"onEndConnecting\"];\n validateConnection?: FlowNodeProps[\"validateConnection\"];\n\n selectedNodeId?: string;\n children?: ReactNode;\n emptyState?: ReactNode;\n\n gridSize?: number;\n showGrid?: boolean;\n isLockMode?: boolean;\n height?: number | string;\n width?: number | string;\n}\n\n/**\n * FlowCanvas - Canvas for workflow editor\n *\n * TODO: This is a stub implementation. Full feature set from octaviaflow-ui needs to be ported:\n * - Pan and zoom controls\n * - Grid background\n * - Touch gestures\n * - Keyboard shortcuts\n * - Execution console\n * - History panel\n * - Validation panel\n * - Debug panel\n * - Layout algorithms\n * - SSE streaming\n *\n * See: octaviaflow-ui/src/components/WorkFlowCanvas for full implementation\n */\nexport function FlowCanvas({\n nodes,\n edges,\n viewport,\n connectingFrom,\n onViewportChange,\n minZoom = 0.25,\n maxZoom = 2,\n onNodeSelect,\n onEdgeSelect,\n onDeselectAll,\n onNodePositionChange,\n onNodeDelete,\n onNodesDelete,\n onEdgeDelete,\n onStartConnecting,\n onEndConnecting,\n validateConnection,\n selectedNodeId,\n children,\n emptyState,\n gridSize = 20,\n showGrid = true,\n isLockMode = false,\n height = \"100%\",\n width = \"100%\",\n className,\n ...props\n}: FlowCanvasProps) {\n const canvasRef = useRef<HTMLDivElement>(null);\n const isEmpty = nodes.length === 0 && edges.length === 0;\n\n const handleCanvasClick = useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n const target = e.target as HTMLElement;\n if (target === canvasRef.current) {\n onDeselectAll?.();\n }\n },\n [onDeselectAll],\n );\n\n return (\n <div\n ref={canvasRef}\n className={cn(\"ods-flow-canvas\", className)}\n style={{ width, height }}\n onClick={handleCanvasClick}\n role=\"application\"\n aria-label=\"Workflow canvas\"\n {...props}\n >\n {/* Grid background */}\n {showGrid && (\n <div\n className=\"ods-flow-canvas__grid\"\n style={{\n backgroundSize: `${gridSize}px ${gridSize}px`,\n }}\n />\n )}\n\n {/* Viewport content */}\n <div\n className=\"ods-flow-canvas__viewport\"\n style={{\n transform: `translate(${viewport.x}px, ${viewport.y}px) scale(${viewport.zoom})`,\n transformOrigin: \"0 0\",\n }}\n >\n {/* Edges layer */}\n <svg\n className=\"ods-flow-canvas__edges\"\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n width: \"100%\",\n height: \"100%\",\n pointerEvents: \"none\",\n overflow: \"visible\",\n }}\n >\n <g style={{ pointerEvents: \"auto\" }}>\n {edges.map((edge) => (\n <FlowEdge\n key={edge.id}\n edge={edge}\n nodes={nodes}\n onSelect={onEdgeSelect}\n onDelete={onEdgeDelete}\n />\n ))}\n </g>\n </svg>\n\n {/* Nodes layer */}\n <AnimatePresence>\n {nodes.map((node) => (\n <FlowNode\n key={node.id}\n node={node}\n viewport={viewport}\n connectingFrom={connectingFrom}\n isLockMode={isLockMode}\n isConfigOpen={selectedNodeId === node.id}\n onSelect={onNodeSelect}\n onDelete={onNodeDelete}\n onPositionChange={onNodePositionChange}\n onStartConnecting={onStartConnecting}\n onEndConnecting={onEndConnecting}\n validateConnection={validateConnection}\n />\n ))}\n </AnimatePresence>\n </div>\n\n {/* Empty state */}\n {isEmpty && emptyState && <div className=\"ods-flow-canvas__empty\">{emptyState}</div>}\n\n {/* Chrome slot (toolbar, drawer, panels) */}\n {children}\n </div>\n );\n}\n","\"use client\";\n\nimport type { ComponentPropsWithoutRef } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport type { WorkflowEdge as WorkflowEdgeType, WorkflowNode } from \"../../workflow/types\";\n\nexport interface FlowEdgeProps extends Omit<ComponentPropsWithoutRef<\"g\">, \"id\" | \"onSelect\"> {\n edge: WorkflowEdgeType;\n nodes?: WorkflowNode[];\n onSelect?: (id: string) => void;\n onDelete?: (id: string) => void;\n}\n\n/**\n * FlowEdge - Connection line between workflow nodes\n *\n * TODO: This is a stub implementation. Full feature set from octaviaflow-ui needs to be ported:\n * - Bezier curve calculations\n * - Selection handling\n * - Delete button\n * - Hover states\n * - Port-aware positioning\n *\n * See: octaviaflow-ui/src/components/WorkflowEdge for full implementation\n */\nexport function FlowEdge({ edge, nodes = [], onSelect, className, ...props }: FlowEdgeProps) {\n // Simple straight line for stub - TODO: implement bezier curves\n const sourceNode = nodes.find((n) => n.id === edge.source);\n const targetNode = nodes.find((n) => n.id === edge.target);\n\n if (!sourceNode || !targetNode) {\n return null;\n }\n\n const startX = sourceNode.position.x + 184; // half of node width (368/2)\n const startY = sourceNode.position.y + 108; // node height\n const endX = targetNode.position.x + 184;\n const endY = targetNode.position.y;\n\n const path = `M ${startX},${startY} L ${endX},${endY}`;\n\n return (\n <g className={cn(\"ods-flow-edge\", className)} onClick={() => onSelect?.(edge.id)} {...props}>\n {/* Invisible hitbox for easier clicking */}\n <path\n d={path}\n className=\"ods-flow-edge__hitbox\"\n stroke=\"transparent\"\n strokeWidth={20}\n fill=\"none\"\n />\n\n {/* Visible path */}\n <path\n d={path}\n className={cn(\"ods-flow-edge__path\", edge.selected && \"ods-flow-edge__path--selected\")}\n stroke=\"#8b8ca0\"\n strokeWidth={2}\n fill=\"none\"\n />\n </g>\n );\n}\n","\"use client\";\n\nimport { motion } from \"framer-motion\";\nimport {\n type CSSProperties,\n forwardRef,\n type MouseEvent as ReactMouseEvent,\n type ReactNode,\n type TouchEvent as ReactTouchEvent,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport type { ConfigStatusResult } from \"../../workflow/configStatus\";\nimport type {\n WorkflowEdge as WorkflowEdgeType,\n WorkflowNode as WorkflowNodeType,\n} from \"../../workflow/types\";\n\nconst DEFAULT_NODE_WIDTH = 368;\nconst DRAG_THRESHOLD_PX = 5;\n\nexport interface FlowNodeIconSlots {\n statusValid?: ReactNode;\n statusWarning?: ReactNode;\n statusError?: ReactNode;\n statusUnconfigured?: ReactNode;\n delete?: ReactNode;\n running?: ReactNode;\n trigger?: ReactNode;\n action?: ReactNode;\n}\n\nexport interface FlowNodeProps {\n node: WorkflowNodeType;\n className?: string;\n style?: CSSProperties;\n /** Canvas viewport — used to scale drag deltas. */\n viewport?: { zoom: number; x: number; y: number };\n isLockMode?: boolean;\n isConfigOpen?: boolean;\n /** Pre-computed config status (from `getNodeConfigStatus`). */\n configStatus?: ConfigStatusResult;\n /** Edges, used to highlight ports whose incoming/outgoing edge is selected. */\n edges?: WorkflowEdgeType[];\n /** Shared connection-in-progress state, passed down from the canvas. */\n connectingFrom?: {\n nodeId: string;\n portId: string;\n portType: \"input\" | \"output\";\n } | null;\n /** Slot overrides for the handful of internal icons. */\n icons?: FlowNodeIconSlots;\n\n onSelect?: (id: string) => void;\n onDelete?: (id: string) => void;\n onPositionChange?: (id: string, position: { x: number; y: number }) => void;\n onStartConnecting?: (nodeId: string, portId: string, portType: \"input\" | \"output\") => void;\n onEndConnecting?: (\n target: { nodeId: string; portId: string; portType: \"input\" | \"output\" } | null,\n ) => void;\n validateConnection?: (\n targetNodeId: string,\n targetPortId: string,\n targetPortType: \"input\" | \"output\",\n ) => { valid: boolean; reason?: string };\n}\n\n// ── Inline default icons ─────────────────────────────────────────────────────\n// Kept lucide-compatible (24x24 viewBox, stroke-based) for visual harmony with\n// the rest of the design system. Consumers may override via the `icons` prop.\n\nconst iconBaseProps = {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\" as const,\n strokeLinejoin: \"round\" as const,\n};\n\nconst CheckCircleSvg = ({ size = 16 }: { size?: number }) => (\n <svg {...iconBaseProps} width={size} height={size} aria-hidden=\"true\">\n <path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\" />\n <polyline points=\"22 4 12 14.01 9 11.01\" />\n </svg>\n);\nconst AlertTriangleSvg = ({ size = 16 }: { size?: number }) => (\n <svg {...iconBaseProps} width={size} height={size} aria-hidden=\"true\">\n <path d=\"M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0Z\" />\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\" />\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\n </svg>\n);\nconst XCircleSvg = ({ size = 16 }: { size?: number }) => (\n <svg {...iconBaseProps} width={size} height={size} aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\" />\n <line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\" />\n </svg>\n);\nconst CircleDashedSvg = ({ size = 16 }: { size?: number }) => (\n <svg {...iconBaseProps} width={size} height={size} aria-hidden=\"true\" strokeDasharray=\"3 3\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n </svg>\n);\nconst TrashSvg = ({ size = 16 }: { size?: number }) => (\n <svg {...iconBaseProps} width={size} height={size} aria-hidden=\"true\">\n <polyline points=\"3 6 5 6 21 6\" />\n <path d=\"M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6\" />\n <path d=\"M10 11v6M14 11v6\" />\n <path d=\"M9 6V4a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2v2\" />\n </svg>\n);\nconst LoaderSvg = ({ size = 24 }: { size?: number }) => (\n <svg {...iconBaseProps} width={size} height={size} aria-hidden=\"true\">\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\n </svg>\n);\nconst PlaySvg = ({ size = 14 }: { size?: number }) => (\n <svg {...iconBaseProps} width={size} height={size} aria-hidden=\"true\">\n <polygon points=\"5 3 19 12 5 21 5 3\" />\n </svg>\n);\nconst LinkSvg = ({ size = 14 }: { size?: number }) => (\n <svg {...iconBaseProps} width={size} height={size} aria-hidden=\"true\">\n <path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" />\n <path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" />\n </svg>\n);\n\nfunction resolveIcon(slot: ReactNode | undefined, fallback: ReactNode): ReactNode {\n return slot !== undefined ? slot : fallback;\n}\n\n// ── Component ────────────────────────────────────────────────────────────────\nexport const FlowNode = forwardRef<HTMLDivElement, FlowNodeProps>(function FlowNode(\n {\n node,\n viewport,\n isLockMode = false,\n isConfigOpen = false,\n configStatus,\n edges = [],\n connectingFrom = null,\n icons,\n onSelect,\n onDelete,\n onPositionChange,\n onStartConnecting,\n onEndConnecting,\n validateConnection,\n className,\n style,\n },\n ref,\n) {\n const [isDragging, setIsDragging] = useState(false);\n const [wasDragged, setWasDragged] = useState(false);\n const dragStartRef = useRef<{ x: number; y: number } | null>(null);\n const zoom = viewport?.zoom ?? 1;\n\n // ── Selection / click ──\n const handleClick = useCallback(\n (e: ReactMouseEvent<HTMLDivElement>) => {\n e.stopPropagation();\n if (wasDragged) {\n setWasDragged(false);\n return;\n }\n onSelect?.(node.id);\n },\n [node.id, onSelect, wasDragged],\n );\n\n const handleDelete = useCallback(\n (e: ReactMouseEvent<HTMLButtonElement>) => {\n e.stopPropagation();\n if (isLockMode) return;\n onDelete?.(node.id);\n },\n [node.id, onDelete, isLockMode],\n );\n\n // ── Drag (mouse) ──\n const handleMouseDown = useCallback(\n (e: ReactMouseEvent<HTMLDivElement>) => {\n if (isLockMode) return;\n const target = e.target as HTMLElement;\n if (\n target.closest('[data-flow-node-no-drag=\"true\"]') ||\n target.closest(\".ods-flow-node__delete-btn\") ||\n target.closest(\".ods-flow-node__port\")\n ) {\n return;\n }\n e.stopPropagation();\n setIsDragging(true);\n dragStartRef.current = { x: e.clientX, y: e.clientY };\n },\n [isLockMode],\n );\n\n const handleTouchStart = useCallback(\n (e: ReactTouchEvent<HTMLDivElement>) => {\n if (isLockMode) return;\n if (e.touches.length !== 1) return;\n const target = e.target as HTMLElement;\n if (\n target.closest('[data-flow-node-no-drag=\"true\"]') ||\n target.closest(\".ods-flow-node__delete-btn\") ||\n target.closest(\".ods-flow-node__port\")\n ) {\n return;\n }\n e.stopPropagation();\n setIsDragging(true);\n dragStartRef.current = {\n x: e.touches[0].clientX,\n y: e.touches[0].clientY,\n };\n },\n [isLockMode],\n );\n\n useEffect(() => {\n if (!isDragging) return;\n\n const applyDelta = (clientX: number, clientY: number) => {\n const start = dragStartRef.current;\n if (!start) return;\n const deltaX = (clientX - start.x) / zoom;\n const deltaY = (clientY - start.y) / zoom;\n if (Math.abs(deltaX) > DRAG_THRESHOLD_PX || Math.abs(deltaY) > DRAG_THRESHOLD_PX) {\n setWasDragged(true);\n }\n onPositionChange?.(node.id, {\n x: node.position.x + deltaX,\n y: node.position.y + deltaY,\n });\n dragStartRef.current = { x: clientX, y: clientY };\n };\n\n const onMouseMove = (e: MouseEvent) => applyDelta(e.clientX, e.clientY);\n const onMouseUp = () => {\n setIsDragging(false);\n dragStartRef.current = null;\n // small delay so the trailing click can be suppressed\n window.setTimeout(() => setWasDragged(false), 100);\n };\n const onTouchMove = (e: TouchEvent) => {\n if (e.touches.length !== 1) return;\n e.preventDefault();\n applyDelta(e.touches[0].clientX, e.touches[0].clientY);\n };\n const onTouchEnd = () => {\n setIsDragging(false);\n dragStartRef.current = null;\n window.setTimeout(() => setWasDragged(false), 100);\n };\n\n document.addEventListener(\"mousemove\", onMouseMove);\n document.addEventListener(\"mouseup\", onMouseUp);\n document.addEventListener(\"touchmove\", onTouchMove, { passive: false });\n document.addEventListener(\"touchend\", onTouchEnd);\n document.addEventListener(\"touchcancel\", onTouchEnd);\n return () => {\n document.removeEventListener(\"mousemove\", onMouseMove);\n document.removeEventListener(\"mouseup\", onMouseUp);\n document.removeEventListener(\"touchmove\", onTouchMove);\n document.removeEventListener(\"touchend\", onTouchEnd);\n document.removeEventListener(\"touchcancel\", onTouchEnd);\n };\n }, [isDragging, zoom, node.id, node.position.x, node.position.y, onPositionChange]);\n\n // ── Ports: connection-state helpers ──\n const handlePortMouseDown = useCallback(\n (e: ReactMouseEvent, portId: string, portType: \"input\" | \"output\") => {\n e.stopPropagation();\n if (isLockMode) return;\n if (!connectingFrom) {\n onStartConnecting?.(node.id, portId, portType);\n }\n },\n [connectingFrom, isLockMode, node.id, onStartConnecting],\n );\n\n const handlePortMouseUp = useCallback(\n (e: ReactMouseEvent, portId: string, portType: \"input\" | \"output\") => {\n e.stopPropagation();\n if (isLockMode) return;\n if (!connectingFrom) return;\n onEndConnecting?.({ nodeId: node.id, portId, portType });\n },\n [connectingFrom, isLockMode, node.id, onEndConnecting],\n );\n\n const isPortEdgeSelected = useCallback(\n (portId: string, portType: \"input\" | \"output\") =>\n edges.some(\n (edge) =>\n edge.selected &&\n (portType === \"input\"\n ? edge.target === node.id && edge.targetPort === portId\n : edge.source === node.id && edge.sourcePort === portId),\n ),\n [edges, node.id],\n );\n\n // ── Config status (falls back to simple node.configStatus enum) ──\n const statusValue = configStatus?.status ?? node.configStatus;\n const statusTitle = (() => {\n if (!statusValue || statusValue === \"hidden\") return undefined;\n if (statusValue === \"valid\") return \"Configured\";\n if (statusValue === \"warning\") {\n return configStatus?.missingRequired?.length\n ? `Missing required: ${configStatus.missingRequired.join(\", \")}`\n : \"Incomplete configuration\";\n }\n if (statusValue === \"error\") {\n const total = configStatus?.requiredTotal;\n return total\n ? `Not configured (${total} required field${total !== 1 ? \"s\" : \"\"})`\n : \"Not configured\";\n }\n return \"Unknown action\";\n })();\n\n const statusIcon: ReactNode = (() => {\n switch (statusValue) {\n case \"valid\":\n return resolveIcon(icons?.statusValid, <CheckCircleSvg />);\n case \"warning\":\n return resolveIcon(icons?.statusWarning, <AlertTriangleSvg />);\n case \"error\":\n return resolveIcon(icons?.statusError, <XCircleSvg />);\n case \"unconfigured\":\n return resolveIcon(icons?.statusUnconfigured, <CircleDashedSvg />);\n default:\n return null;\n }\n })();\n\n const nodeStyle: CSSProperties = {\n left: node.position.x,\n top: node.position.y,\n cursor: isDragging ? \"grabbing\" : \"grab\",\n WebkitFontSmoothing: \"antialiased\",\n MozOsxFontSmoothing: \"grayscale\",\n textRendering: \"geometricPrecision\",\n willChange: \"transform\",\n backfaceVisibility: \"hidden\",\n perspective: \"1000px\",\n ...style,\n };\n\n const outputIsBranching = node.ports.output.length > 1;\n const subtitle = node.type === \"trigger\" ? \"Start\" : \"Action\";\n const triggerDescription =\n typeof node.config?.description === \"string\" ? node.config.description : \"Manually Triggered\";\n const actionName =\n node.type === \"action\" && typeof node.config?.name === \"string\" ? node.config.name : null;\n\n return (\n <motion.div\n ref={ref}\n data-node-id={node.id}\n className={cn(\n \"ods-flow-node\",\n `ods-flow-node--${node.type}`,\n node.selected && \"ods-flow-node--selected\",\n isDragging && \"ods-flow-node--dragging\",\n isConfigOpen && \"ods-flow-node--config-open\",\n className,\n )}\n style={nodeStyle}\n onClick={handleClick}\n onMouseDown={handleMouseDown}\n onTouchStart={handleTouchStart}\n initial={{ scale: 0.8, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n exit={{ scale: 0.8, opacity: 0 }}\n transition={{ type: \"spring\", stiffness: 300, damping: 25 }}\n >\n {/* Config status indicator */}\n {statusIcon && statusValue !== \"hidden\" && (\n <div\n className={cn(\n \"ods-flow-node__status\",\n statusValue && `ods-flow-node__status--${statusValue}`,\n )}\n title={statusTitle}\n data-flow-node-no-drag=\"true\"\n >\n {statusIcon}\n </div>\n )}\n\n {/* Header band */}\n <div className=\"ods-flow-node__header\">\n <div className=\"ods-flow-node__header-left\">\n {node.icon ? <div className=\"ods-flow-node__icon\">{node.icon as ReactNode}</div> : null}\n <div className=\"ods-flow-node__title\">\n <div className=\"ods-flow-node__label\">{node.label}</div>\n </div>\n </div>\n </div>\n\n {/* Body */}\n <div className=\"ods-flow-node__body\">\n <div className=\"ods-flow-node__content\">\n {node.icon ? (\n <div className=\"ods-flow-node__content-icon\">{node.icon as ReactNode}</div>\n ) : null}\n <div className=\"ods-flow-node__content-text\">\n <div className=\"ods-flow-node__content-title\">{node.label}</div>\n <div className=\"ods-flow-node__content-subtitle\">{subtitle}</div>\n\n {node.type === \"trigger\" && (\n <div className=\"ods-flow-node__content-info\">\n {resolveIcon(icons?.trigger, <PlaySvg />)}\n <span>{triggerDescription}</span>\n </div>\n )}\n {actionName && (\n <div className=\"ods-flow-node__content-info\">\n {resolveIcon(icons?.action, <LinkSvg />)}\n <span>{actionName}</span>\n </div>\n )}\n </div>\n </div>\n\n {node.description && (\n <div className=\"ods-flow-node__description\">\n {node.description.length > 50\n ? `${node.description.substring(0, 50)}...`\n : node.description}\n </div>\n )}\n\n {!isLockMode && onDelete && (\n <button\n type=\"button\"\n className=\"ods-flow-node__delete-btn\"\n data-flow-node-no-drag=\"true\"\n onClick={handleDelete}\n title=\"Delete node\"\n aria-label={`Delete ${node.label}`}\n >\n {resolveIcon(icons?.delete, <TrashSvg />)}\n </button>\n )}\n </div>\n\n {/* Input ports */}\n {node.ports.input.length > 0 && (\n <div className=\"ods-flow-node__ports ods-flow-node__ports--input\">\n {node.ports.input.map((port) => {\n const validation = connectingFrom\n ? (validateConnection?.(node.id, port.id, \"input\") ?? { valid: true })\n : { valid: true };\n const isConnectingPort =\n connectingFrom?.nodeId === node.id && connectingFrom?.portId === port.id;\n const showConnectable =\n !!connectingFrom && connectingFrom.portType === \"output\" && validation.valid;\n const showInvalid = !!connectingFrom && !validation.valid;\n const edgeSelected = isPortEdgeSelected(port.id, \"input\");\n\n return (\n <div\n key={port.id}\n className={cn(\n \"ods-flow-node__port\",\n port.connected && \"ods-flow-node__port--connected\",\n isConnectingPort && \"ods-flow-node__port--connecting\",\n showConnectable && \"ods-flow-node__port--connectable\",\n showInvalid && \"ods-flow-node__port--invalid\",\n edgeSelected && \"ods-flow-node__port--edge-selected\",\n )}\n data-port-id={port.id}\n data-port-type=\"input\"\n title={showInvalid ? validation.reason : port.id}\n onMouseDown={(e) => handlePortMouseDown(e, port.id, \"input\")}\n onMouseUp={(e) => handlePortMouseUp(e, port.id, \"input\")}\n >\n <div className=\"ods-flow-node__port-dot\" />\n </div>\n );\n })}\n </div>\n )}\n\n {/* Output ports */}\n {node.ports.output.length > 0 && (\n <div\n className={cn(\n \"ods-flow-node__ports\",\n \"ods-flow-node__ports--output\",\n outputIsBranching && \"ods-flow-node__ports--branching\",\n )}\n >\n {node.ports.output.map((port) => {\n const validation = connectingFrom\n ? (validateConnection?.(node.id, port.id, \"output\") ?? { valid: true })\n : { valid: true };\n const isConnectingPort =\n connectingFrom?.nodeId === node.id && connectingFrom?.portId === port.id;\n const showConnectable =\n !!connectingFrom && connectingFrom.portType === \"input\" && validation.valid;\n const showInvalid = !!connectingFrom && !validation.valid;\n const edgeSelected = isPortEdgeSelected(port.id, \"output\");\n\n return (\n <div\n key={port.id}\n className={cn(\n \"ods-flow-node__port\",\n port.connected && \"ods-flow-node__port--connected\",\n isConnectingPort && \"ods-flow-node__port--connecting\",\n showConnectable && \"ods-flow-node__port--connectable\",\n showInvalid && \"ods-flow-node__port--invalid\",\n edgeSelected && \"ods-flow-node__port--edge-selected\",\n port.label && \"ods-flow-node__port--labeled\",\n )}\n data-port-id={port.id}\n data-port-type=\"output\"\n title={showInvalid ? validation.reason : port.label || port.id}\n onMouseDown={(e) => handlePortMouseDown(e, port.id, \"output\")}\n onMouseUp={(e) => handlePortMouseUp(e, port.id, \"output\")}\n >\n {port.label && <span className=\"ods-flow-node__port-label\">{port.label}</span>}\n <div className=\"ods-flow-node__port-dot\" />\n </div>\n );\n })}\n </div>\n )}\n\n {/* Execution overlay */}\n {node.status === \"running\" && (\n <motion.div\n className=\"ods-flow-node__running-overlay\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n data-flow-node-no-drag=\"true\"\n >\n {resolveIcon(icons?.running, <LoaderSvg />)}\n </motion.div>\n )}\n </motion.div>\n );\n});\n\nFlowNode.displayName = \"FlowNode\";\n\n// Export node width constant for consumers that need to lay out nodes or edges.\nexport const FLOW_NODE_WIDTH = DEFAULT_NODE_WIDTH;\n","\"use client\";\nimport { type MouseEvent, useCallback, useMemo } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface FlowMinimapNode {\n id: string;\n x: number;\n y: number;\n width: number;\n height: number;\n color?: string;\n}\n\nexport interface FlowMinimapEdge {\n from: { x: number; y: number };\n to: { x: number; y: number };\n}\n\nexport interface FlowMinimapViewportRect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface FlowMinimapProps {\n nodes?: FlowMinimapNode[];\n edges?: FlowMinimapEdge[];\n viewportRect?: FlowMinimapViewportRect;\n totalWidth?: number;\n totalHeight?: number;\n onViewportChange?: (x: number, y: number) => void;\n className?: string;\n}\n\nconst MINIMAP_WIDTH = 140;\nconst MINIMAP_HEIGHT = 100;\n\nexport function FlowMinimap({\n nodes = [],\n edges = [],\n viewportRect,\n totalWidth = 2000,\n totalHeight = 1500,\n onViewportChange,\n className,\n}: FlowMinimapProps) {\n const scaleX = MINIMAP_WIDTH / totalWidth;\n const scaleY = MINIMAP_HEIGHT / totalHeight;\n\n const scaledNodes = useMemo(\n () =>\n nodes.map((n) => ({\n ...n,\n sx: n.x * scaleX,\n sy: n.y * scaleY,\n sw: Math.max(n.width * scaleX, 4),\n sh: Math.max(n.height * scaleY, 3),\n })),\n [nodes, scaleX, scaleY],\n );\n\n const scaledEdges = useMemo(\n () =>\n edges.map((e) => ({\n x1: e.from.x * scaleX,\n y1: e.from.y * scaleY,\n x2: e.to.x * scaleX,\n y2: e.to.y * scaleY,\n })),\n [edges, scaleX, scaleY],\n );\n\n const scaledViewport = useMemo(() => {\n if (!viewportRect) return null;\n return {\n x: viewportRect.x * scaleX,\n y: viewportRect.y * scaleY,\n width: viewportRect.width * scaleX,\n height: viewportRect.height * scaleY,\n };\n }, [viewportRect, scaleX, scaleY]);\n\n const handleClick = useCallback(\n (e: MouseEvent<SVGSVGElement>) => {\n if (!onViewportChange) return;\n const rect = e.currentTarget.getBoundingClientRect();\n const clickX = e.clientX - rect.left;\n const clickY = e.clientY - rect.top;\n const worldX = clickX / scaleX;\n const worldY = clickY / scaleY;\n onViewportChange(worldX, worldY);\n },\n [onViewportChange, scaleX, scaleY],\n );\n\n return (\n <div className={cn(\"ods-flow-minimap\", className)} data-testid=\"flow-minimap\">\n <svg\n width={MINIMAP_WIDTH}\n height={MINIMAP_HEIGHT}\n viewBox={`0 0 ${MINIMAP_WIDTH} ${MINIMAP_HEIGHT}`}\n onClick={handleClick}\n data-testid=\"flow-minimap-svg\"\n >\n {/* Edges */}\n {scaledEdges.map((e, i) => (\n <line\n key={i}\n x1={e.x1}\n y1={e.y1}\n x2={e.x2}\n y2={e.y2}\n className={\"ods-flow-minimap__edge\"}\n />\n ))}\n\n {/* Nodes */}\n {scaledNodes.map((n) => (\n <rect\n key={n.id}\n x={n.sx}\n y={n.sy}\n width={n.sw}\n height={n.sh}\n rx={1}\n fill={n.color || \"var(--ods-color-brand-500, #3b5bff)\"}\n className={\"ods-flow-minimap__node\"}\n data-testid={`minimap-node-${n.id}`}\n />\n ))}\n\n {/* Viewport rectangle */}\n {scaledViewport && (\n <rect\n x={scaledViewport.x}\n y={scaledViewport.y}\n width={scaledViewport.width}\n height={scaledViewport.height}\n className={\"ods-flow-minimap__viewport\"}\n data-testid=\"minimap-viewport\"\n />\n )}\n </svg>\n </div>\n );\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface FlowToolbarProps {\n children?: ReactNode;\n /** \"left\" / \"right\" pin to side and stack vertically; \"top\" / \"bottom\" stack horizontally. */\n placement?: \"left\" | \"top\" | \"right\" | \"bottom\";\n className?: string;\n}\n\nexport function FlowToolbar({ children, placement = \"left\", className }: FlowToolbarProps) {\n return (\n <div\n className={cn(\"ods-flow-toolbar\", `ods-flow-toolbar--${placement}`, className)}\n role=\"toolbar\"\n aria-label=\"Canvas toolbar\"\n >\n {children}\n </div>\n );\n}\n\nexport interface FlowToolbarButtonProps {\n icon: ReactNode;\n label: string;\n onClick?: () => void;\n active?: boolean;\n disabled?: boolean;\n danger?: boolean;\n /** Optional keyboard shortcut hint — shown in the tooltip. */\n shortcut?: string;\n /** When provided, acts as the hover-tooltip text. Defaults to `label`. */\n tooltip?: string;\n className?: string;\n}\n\nexport function FlowToolbarButton({\n icon,\n label,\n onClick,\n active = false,\n disabled = false,\n danger = false,\n shortcut,\n tooltip,\n className,\n}: FlowToolbarButtonProps) {\n const hoverLabel = tooltip ?? label;\n const title = shortcut ? `${hoverLabel} (${shortcut})` : hoverLabel;\n return (\n <span className=\"ods-flow-toolbar__btn-wrapper\" data-tooltip={title}>\n <button\n type=\"button\"\n className={cn(\n \"ods-flow-toolbar__btn\",\n active && \"ods-flow-toolbar__btn--active\",\n danger && \"ods-flow-toolbar__btn--danger\",\n className,\n )}\n onClick={onClick}\n disabled={disabled}\n aria-label={label}\n aria-pressed={active}\n title={title}\n >\n <span className=\"ods-flow-toolbar__btn-icon\">{icon}</span>\n </button>\n </span>\n );\n}\n\nexport interface FlowToolbarDividerProps {\n className?: string;\n}\n\nexport function FlowToolbarDivider({ className }: FlowToolbarDividerProps) {\n return <span className={cn(\"ods-flow-toolbar__divider\", className)} aria-hidden=\"true\" />;\n}\n\nexport interface FlowToolbarZoomProps {\n zoom: number;\n onZoomIn?: () => void;\n onZoomOut?: () => void;\n onFit?: () => void;\n onReset?: () => void;\n className?: string;\n}\n\n// ── Shared icon set — kept simple lucide-style, stroke-based ─────────────────\nconst SVG_BASE = {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\" as const,\n strokeLinejoin: \"round\" as const,\n \"aria-hidden\": true,\n};\nconst mkIcon = (children: ReactNode) => (\n <svg {...SVG_BASE} width=\"16\" height=\"16\">\n {children}\n </svg>\n);\n\nexport const FlowToolbarIcons = {\n save: mkIcon(\n <>\n <path d=\"M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z\" />\n <polyline points=\"17 21 17 13 7 13 7 21\" />\n <polyline points=\"7 3 7 8 15 8\" />\n </>,\n ),\n run: mkIcon(<polygon points=\"6 4 20 12 6 20 6 4\" fill=\"currentColor\" stroke=\"none\" />),\n stop: mkIcon(<rect x=\"6\" y=\"6\" width=\"12\" height=\"12\" rx=\"1\" />),\n lock: mkIcon(\n <>\n <rect x=\"4\" y=\"11\" width=\"16\" height=\"10\" rx=\"2\" />\n <path d=\"M8 11V7a4 4 0 0 1 8 0v4\" />\n </>,\n ),\n unlock: mkIcon(\n <>\n <rect x=\"4\" y=\"11\" width=\"16\" height=\"10\" rx=\"2\" />\n <path d=\"M8 11V7a4 4 0 0 1 8 0\" />\n </>,\n ),\n reset: mkIcon(\n <>\n <polyline points=\"1 4 1 10 7 10\" />\n <path d=\"M3.51 15a9 9 0 1 0 2.13-9.36L1 10\" />\n </>,\n ),\n undo: mkIcon(\n <>\n <path d=\"M3 7v6h6\" />\n <path d=\"M21 17a9 9 0 0 0-9-9 9 9 0 0 0-7.07 3.43L3 13\" />\n </>,\n ),\n redo: mkIcon(\n <>\n <path d=\"M21 7v6h-6\" />\n <path d=\"M3 17a9 9 0 0 1 9-9 9 9 0 0 1 7.07 3.43L21 13\" />\n </>,\n ),\n drawerOpen: mkIcon(\n <>\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" />\n <line x1=\"9\" y1=\"3\" x2=\"9\" y2=\"21\" />\n <polyline points=\"13 9 16 12 13 15\" />\n </>,\n ),\n drawerClose: mkIcon(\n <>\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" />\n <line x1=\"9\" y1=\"3\" x2=\"9\" y2=\"21\" />\n <polyline points=\"16 9 13 12 16 15\" />\n </>,\n ),\n settings: mkIcon(\n <>\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n <path d=\"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 2.83-2.83l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z\" />\n </>,\n ),\n history: mkIcon(\n <>\n <path d=\"M22 12A10 10 0 1 1 12 2\" />\n <polyline points=\"22 2 22 8 16 8\" />\n <polyline points=\"12 7 12 12 15 15\" />\n </>,\n ),\n debug: mkIcon(\n <>\n <polyline points=\"4 17 10 11 4 5\" />\n <line x1=\"12\" y1=\"19\" x2=\"20\" y2=\"19\" />\n </>,\n ),\n zoomIn: mkIcon(\n <>\n <circle cx=\"11\" cy=\"11\" r=\"7\" />\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\n <line x1=\"11\" y1=\"8\" x2=\"11\" y2=\"14\" />\n <line x1=\"8\" y1=\"11\" x2=\"14\" y2=\"11\" />\n </>,\n ),\n zoomOut: mkIcon(\n <>\n <circle cx=\"11\" cy=\"11\" r=\"7\" />\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\n <line x1=\"8\" y1=\"11\" x2=\"14\" y2=\"11\" />\n </>,\n ),\n zoomReset: mkIcon(\n <>\n <circle cx=\"11\" cy=\"11\" r=\"7\" />\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\n <polyline points=\"8 9 8 13 12 13\" />\n <path d=\"M14 8a4 4 0 0 1 0 6\" />\n </>,\n ),\n fit: mkIcon(\n <>\n <path d=\"M3 7V5a2 2 0 0 1 2-2h2\" />\n <path d=\"M17 3h2a2 2 0 0 1 2 2v2\" />\n <path d=\"M21 17v2a2 2 0 0 1-2 2h-2\" />\n <path d=\"M7 21H5a2 2 0 0 1-2-2v-2\" />\n </>,\n ),\n};\n\nexport function FlowToolbarZoom({\n zoom,\n onZoomIn,\n onZoomOut,\n onFit,\n onReset,\n className,\n}: FlowToolbarZoomProps) {\n return (\n <div className={cn(\"ods-flow-toolbar__zoom\", className)}>\n <FlowToolbarButton\n icon={FlowToolbarIcons.zoomIn}\n label=\"Zoom in\"\n onClick={onZoomIn}\n shortcut=\"⌘+\"\n />\n <FlowToolbarButton\n icon={FlowToolbarIcons.zoomOut}\n label=\"Zoom out\"\n onClick={onZoomOut}\n shortcut=\"⌘−\"\n />\n {onReset && (\n <FlowToolbarButton\n icon={FlowToolbarIcons.zoomReset}\n label=\"Reset zoom\"\n tooltip=\"Reset zoom to 100%\"\n onClick={onReset}\n shortcut=\"⌘0\"\n />\n )}\n {onFit && (\n <FlowToolbarButton\n icon={FlowToolbarIcons.fit}\n label=\"Fit to view\"\n onClick={onFit}\n shortcut=\"⌘.\"\n />\n )}\n <div\n className=\"ods-flow-toolbar__zoom-label\"\n aria-label={`Current zoom ${Math.round(zoom * 100)} percent`}\n title=\"Current zoom\"\n >\n {Math.round(zoom * 100)}%\n </div>\n </div>\n );\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface FormSectionProps {\n title?: ReactNode;\n description?: ReactNode;\n children: ReactNode;\n footer?: ReactNode;\n divided?: boolean;\n className?: string;\n}\n\nexport function FormSection({\n title,\n description,\n children,\n footer,\n divided = true,\n className,\n}: FormSectionProps) {\n return (\n <section className={cn(\"ods-form-section\", divided && \"ods-form-section--divided\", className)}>\n {(title || description) && (\n <header className=\"ods-form-section__head\">\n {title && <h3 className=\"ods-form-section__title\">{title}</h3>}\n {description && <p className=\"ods-form-section__desc\">{description}</p>}\n </header>\n )}\n <div className=\"ods-form-section__body\">{children}</div>\n {footer && <footer className=\"ods-form-section__footer\">{footer}</footer>}\n </section>\n );\n}\n","\"use client\";\nimport { type ReactNode, useCallback, useEffect, useLayoutEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"../../utils/cn\";\n\nexport type HoverCardPlacement = \"top\" | \"bottom\" | \"left\" | \"right\";\n\nexport interface HoverCardProps {\n content: ReactNode;\n placement?: HoverCardPlacement;\n offset?: number;\n openDelay?: number; // ms before it opens on hover\n closeDelay?: number; // ms before it closes when mouse leaves\n children: ReactNode;\n className?: string;\n}\n\ninterface Coords {\n top: number;\n left: number;\n}\n\nfunction computePosition(\n rect: DOMRect,\n panelRect: DOMRect,\n placement: HoverCardPlacement,\n offset: number,\n): Coords {\n const cx = rect.left + rect.width / 2;\n const cy = rect.top + rect.height / 2;\n switch (placement) {\n case \"top\":\n return { top: rect.top - panelRect.height - offset, left: cx - panelRect.width / 2 };\n case \"bottom\":\n return { top: rect.bottom + offset, left: cx - panelRect.width / 2 };\n case \"left\":\n return { top: cy - panelRect.height / 2, left: rect.left - panelRect.width - offset };\n case \"right\":\n return { top: cy - panelRect.height / 2, left: rect.right + offset };\n }\n}\n\nexport function HoverCard({\n content,\n placement = \"bottom\",\n offset = 8,\n openDelay = 300,\n closeDelay = 180,\n children,\n className,\n}: HoverCardProps) {\n const [open, setOpen] = useState(false);\n const triggerRef = useRef<HTMLSpanElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const openTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const closeTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const [coords, setCoords] = useState<Coords | null>(null);\n\n const clearTimers = () => {\n if (openTimer.current) {\n clearTimeout(openTimer.current);\n openTimer.current = null;\n }\n if (closeTimer.current) {\n clearTimeout(closeTimer.current);\n closeTimer.current = null;\n }\n };\n useEffect(() => () => clearTimers(), []);\n\n const show = () => {\n clearTimers();\n openTimer.current = setTimeout(() => setOpen(true), openDelay);\n };\n const hide = () => {\n clearTimers();\n closeTimer.current = setTimeout(() => setOpen(false), closeDelay);\n };\n\n const reposition = useCallback(() => {\n if (!triggerRef.current || !panelRef.current) return;\n const trigRect = triggerRef.current.getBoundingClientRect();\n const panelRect = panelRef.current.getBoundingClientRect();\n setCoords(computePosition(trigRect, panelRect, placement, offset));\n }, [placement, offset]);\n\n useLayoutEffect(() => {\n if (!open) return;\n reposition();\n const id = requestAnimationFrame(reposition);\n return () => cancelAnimationFrame(id);\n }, [open, reposition]);\n\n useEffect(() => {\n if (!open) return;\n const h = () => reposition();\n window.addEventListener(\"scroll\", h, true);\n window.addEventListener(\"resize\", h);\n return () => {\n window.removeEventListener(\"scroll\", h, true);\n window.removeEventListener(\"resize\", h);\n };\n }, [open, reposition]);\n\n // Wrapper span anchors the hover card — works even if the child component\n // (e.g. our Button) doesn't forward refs.\n const triggerEl = (\n <span\n ref={triggerRef}\n className=\"ods-hover-card__anchor\"\n onMouseEnter={show}\n onMouseLeave={hide}\n onFocusCapture={show}\n onBlurCapture={hide}\n >\n {children}\n </span>\n );\n\n const portal =\n typeof document !== \"undefined\" && open\n ? createPortal(\n <div\n ref={panelRef}\n role=\"tooltip\"\n data-placement={placement}\n className={cn(\"ods-hover-card\", className)}\n onMouseEnter={show}\n onMouseLeave={hide}\n style={{\n position: \"fixed\",\n zIndex: 1000,\n top: coords?.top ?? -9999,\n left: coords?.left ?? -9999,\n visibility: coords ? \"visible\" : \"hidden\",\n }}\n >\n {content}\n </div>,\n document.body,\n )\n : null;\n\n return (\n <>\n {triggerEl}\n {portal}\n </>\n );\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface IconCardProps {\n variant?: \"default\" | \"primary\" | \"success\" | \"warning\" | \"error\";\n icon: ReactNode;\n title: ReactNode;\n description?: ReactNode;\n action?: ReactNode;\n onClick?: () => void;\n className?: string;\n}\n\nexport function IconCard({\n variant = \"default\",\n icon,\n title,\n description,\n action,\n onClick,\n className,\n}: IconCardProps) {\n const interactive = Boolean(onClick);\n return (\n <div\n className={cn(\n \"ods-icon-card\",\n `ods-icon-card--${variant}`,\n interactive && \"ods-icon-card--interactive\",\n className,\n )}\n onClick={onClick}\n role={interactive ? \"button\" : undefined}\n tabIndex={interactive ? 0 : undefined}\n >\n <span className=\"ods-icon-card__icon\" aria-hidden=\"true\">\n {icon}\n </span>\n <div className=\"ods-icon-card__body\">\n <div className=\"ods-icon-card__title\">{title}</div>\n {description && <div className=\"ods-icon-card__description\">{description}</div>}\n </div>\n {action && <div className=\"ods-icon-card__action\">{action}</div>}\n </div>\n );\n}\n","\"use client\";\nimport {\n type InputHTMLAttributes,\n type MouseEvent,\n type ReactNode,\n forwardRef,\n useId,\n useImperativeHandle,\n useRef,\n} from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface InputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, \"size\"> {\n type?: \"text\" | \"email\" | \"password\" | \"search\" | \"number\" | \"tel\" | \"url\";\n size?: \"sm\" | \"md\" | \"lg\";\n error?: boolean;\n errorMessage?: string;\n label?: ReactNode;\n helperText?: ReactNode;\n leftIcon?: ReactNode;\n rightIcon?: ReactNode;\n /**\n * Show a clear button on the right while the input has a value.\n * Auto-enabled when `type=\"search\"`; explicitly toggle for other types.\n */\n clearable?: boolean;\n onClear?: () => void;\n /**\n * Right-side keyboard shortcut hint (e.g. \"⌘K\"). Rendered as a kbd-style chip.\n * Hidden while a clear button is showing (clear takes precedence).\n */\n shortcutHint?: ReactNode;\n}\n\nconst CLEAR_GLYPH = (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"m3 3 6 6M9 3l-6 6\" stroke=\"currentColor\" strokeWidth=\"1.4\" strokeLinecap=\"round\" />\n </svg>\n);\n\nexport const Input = forwardRef<HTMLInputElement, InputProps>(\n (\n {\n type = \"text\",\n size = \"md\",\n error = false,\n errorMessage,\n label,\n helperText,\n leftIcon,\n rightIcon,\n clearable,\n onClear,\n shortcutHint,\n disabled = false,\n id,\n className,\n value,\n defaultValue,\n onChange,\n ...props\n },\n forwardedRef,\n ) => {\n const innerRef = useRef<HTMLInputElement>(null);\n useImperativeHandle(forwardedRef, () => innerRef.current as HTMLInputElement);\n\n const reactId = useId();\n const inputId = id ?? `${reactId}-input`;\n const errorId = `${reactId}-err`;\n const helperId = `${reactId}-help`;\n\n const isControlled = value !== undefined;\n const isClearable = (clearable ?? type === \"search\") && !disabled;\n const isSearch = type === \"search\";\n\n const currentValue = isControlled\n ? String(value ?? \"\")\n : (innerRef.current?.value ?? String(defaultValue ?? \"\"));\n const showClear = isClearable && currentValue.length > 0;\n\n const handleClear = (e: MouseEvent<HTMLButtonElement>) => {\n e.preventDefault();\n e.stopPropagation();\n const el = innerRef.current;\n if (el && !isControlled) {\n const setter = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, \"value\")?.set;\n setter?.call(el, \"\");\n el.dispatchEvent(new Event(\"input\", { bubbles: true }));\n }\n onClear?.();\n el?.focus();\n };\n\n const describedBy = error && errorMessage ? errorId : helperText ? helperId : undefined;\n\n return (\n <div\n className={cn(\n \"ods-input\",\n `ods-input--${size}`,\n error && \"ods-input--error\",\n disabled && \"ods-input--disabled\",\n isSearch && \"ods-input--search\",\n className,\n )}\n >\n {label && (\n <label htmlFor={inputId} className=\"ods-input__label\">\n {label}\n </label>\n )}\n <div className=\"ods-input__wrapper\">\n {leftIcon && (\n <span className=\"ods-input__icon--left\" aria-hidden=\"true\">\n {leftIcon}\n </span>\n )}\n <input\n {...props}\n id={inputId}\n ref={innerRef}\n type={type}\n disabled={disabled}\n value={value}\n defaultValue={defaultValue}\n onChange={onChange}\n className={cn(\n \"ods-input__field\",\n leftIcon && \"ods-input__field--with-left-icon\",\n (rightIcon || showClear || shortcutHint) && \"ods-input__field--with-right-icon\",\n showClear && shortcutHint && \"ods-input__field--with-right-actions\",\n )}\n aria-invalid={error || undefined}\n aria-describedby={describedBy}\n />\n <span className=\"ods-input__right\">\n {showClear && (\n <button\n type=\"button\"\n className=\"ods-input__clear\"\n onClick={handleClear}\n aria-label=\"Clear\"\n tabIndex={-1}\n >\n {CLEAR_GLYPH}\n </button>\n )}\n {shortcutHint && !showClear && (\n <span className=\"ods-input__kbd\" aria-hidden=\"true\">\n {shortcutHint}\n </span>\n )}\n {rightIcon && !showClear && !shortcutHint && (\n <span className=\"ods-input__icon--right\" aria-hidden=\"true\">\n {rightIcon}\n </span>\n )}\n </span>\n </div>\n {error && errorMessage && (\n <div id={errorId} className=\"ods-input__error-message\" role=\"alert\">\n {errorMessage}\n </div>\n )}\n {!error && helperText && (\n <div id={helperId} className=\"ods-input__helper\">\n {helperText}\n </div>\n )}\n </div>\n );\n },\n);\n\nInput.displayName = \"Input\";\n","\"use client\";\nimport { type ReactNode, useMemo, useState } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface JsonViewerProps {\n data: unknown;\n /** Initially expand to N levels deep. Default 2. */\n defaultExpandDepth?: number;\n /** Show array indexes. Default true. */\n showIndexes?: boolean;\n /** Show a copy button on hover for each leaf value. */\n copyable?: boolean;\n /** Optional title. */\n title?: ReactNode;\n /** Optional status pill next to title. */\n status?: ReactNode;\n /** Limit each string value display length. */\n truncateAt?: number;\n className?: string;\n}\n\nconst VARIANT: Record<string, string> = {\n string: \"string\",\n number: \"number\",\n boolean: \"boolean\",\n null: \"null\",\n};\n\n/**\n * Read-only JSON tree viewer with collapsible nodes, type-tinted values,\n * mono font for keys, and optional copy buttons on leaves.\n */\nexport function JsonViewer({\n data,\n defaultExpandDepth = 2,\n showIndexes = true,\n copyable = false,\n title,\n status,\n truncateAt = 200,\n className,\n}: JsonViewerProps) {\n return (\n <div className={cn(\"ods-json-viewer\", className)}>\n {(title || status) && (\n <div className=\"ods-json-viewer__head\">\n {title && <span className=\"ods-json-viewer__title\">{title}</span>}\n {status && <span className=\"ods-json-viewer__status\">{status}</span>}\n </div>\n )}\n <div className=\"ods-json-viewer__body\">\n <JsonNode\n value={data}\n depth={0}\n defaultExpandDepth={defaultExpandDepth}\n showIndexes={showIndexes}\n copyable={copyable}\n truncateAt={truncateAt}\n />\n </div>\n </div>\n );\n}\n\nfunction JsonNode({\n name,\n value,\n depth,\n defaultExpandDepth,\n showIndexes,\n copyable,\n truncateAt,\n isLast = true,\n}: {\n name?: string | number;\n value: unknown;\n depth: number;\n defaultExpandDepth: number;\n showIndexes: boolean;\n copyable: boolean;\n truncateAt: number;\n isLast?: boolean;\n}) {\n const [open, setOpen] = useState(depth < defaultExpandDepth);\n\n const isObject = value !== null && typeof value === \"object\" && !Array.isArray(value);\n const isArray = Array.isArray(value);\n const isContainer = isObject || isArray;\n\n const renderKey = useMemo(() => {\n if (name === undefined) return null;\n if (typeof name === \"number\") {\n return showIndexes ? (\n <span className=\"ods-json-viewer__key ods-json-viewer__key--index\">{name}</span>\n ) : null;\n }\n return <span className=\"ods-json-viewer__key\">{`\"${name}\"`}</span>;\n }, [name, showIndexes]);\n\n if (!isContainer) {\n return (\n <div className=\"ods-json-viewer__row\" style={{ paddingLeft: depth * 14 }}>\n <span className=\"ods-json-viewer__caret-spacer\" />\n {renderKey}\n {renderKey != null && <span className=\"ods-json-viewer__colon\">:</span>}\n <Leaf value={value} truncateAt={truncateAt} copyable={copyable} />\n {!isLast && <span className=\"ods-json-viewer__comma\">,</span>}\n </div>\n );\n }\n\n const entries = isArray\n ? (value as unknown[]).map((v, i) => [i, v] as const)\n : Object.entries(value as Record<string, unknown>);\n\n const openBracket = isArray ? \"[\" : \"{\";\n const closeBracket = isArray ? \"]\" : \"}\";\n\n return (\n <div>\n <div\n className=\"ods-json-viewer__row ods-json-viewer__row--container\"\n style={{ paddingLeft: depth * 14 }}\n onClick={() => setOpen((o) => !o)}\n >\n <button\n type=\"button\"\n className={cn(\"ods-json-viewer__caret\", open && \"ods-json-viewer__caret--open\")}\n aria-expanded={open}\n aria-label={open ? \"Collapse\" : \"Expand\"}\n onClick={(e) => {\n e.stopPropagation();\n setOpen((o) => !o);\n }}\n >\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M3 2 5 4 3 6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n {renderKey}\n {renderKey != null && <span className=\"ods-json-viewer__colon\">:</span>}\n <span className=\"ods-json-viewer__bracket\">{openBracket}</span>\n {!open && (\n <>\n <span className=\"ods-json-viewer__preview\">\n {isArray\n ? entries.length === 0\n ? \"\"\n : `${entries.length} item${entries.length === 1 ? \"\" : \"s\"}`\n : entries.length === 0\n ? \"\"\n : `${entries.length} key${entries.length === 1 ? \"\" : \"s\"}`}\n </span>\n <span className=\"ods-json-viewer__bracket\">{closeBracket}</span>\n </>\n )}\n {!isLast && !open && <span className=\"ods-json-viewer__comma\">,</span>}\n </div>\n {open && (\n <>\n {entries.map(([k, v], i) => (\n <JsonNode\n key={String(k)}\n name={isArray ? (k as number) : (k as string)}\n value={v}\n depth={depth + 1}\n defaultExpandDepth={defaultExpandDepth}\n showIndexes={showIndexes}\n copyable={copyable}\n truncateAt={truncateAt}\n isLast={i === entries.length - 1}\n />\n ))}\n <div\n className=\"ods-json-viewer__row ods-json-viewer__row--close\"\n style={{ paddingLeft: depth * 14 }}\n >\n <span className=\"ods-json-viewer__caret-spacer\" />\n <span className=\"ods-json-viewer__bracket\">{closeBracket}</span>\n {!isLast && <span className=\"ods-json-viewer__comma\">,</span>}\n </div>\n </>\n )}\n </div>\n );\n}\n\nfunction Leaf({\n value,\n truncateAt,\n copyable,\n}: {\n value: unknown;\n truncateAt: number;\n copyable: boolean;\n}) {\n let display: string;\n let variant: string;\n if (value === null) {\n display = \"null\";\n variant = \"null\";\n } else if (typeof value === \"string\") {\n const t = value.length > truncateAt ? `${value.slice(0, truncateAt)}…` : value;\n display = `\"${t}\"`;\n variant = \"string\";\n } else if (typeof value === \"number\") {\n display = String(value);\n variant = \"number\";\n } else if (typeof value === \"boolean\") {\n display = String(value);\n variant = \"boolean\";\n } else {\n display = String(value);\n variant = \"string\";\n }\n\n const handleCopy = () => {\n if (!copyable || typeof navigator === \"undefined\") return;\n try {\n navigator.clipboard.writeText(\n typeof value === \"string\" ? value : JSON.stringify(value),\n );\n } catch {\n /* ignore */\n }\n };\n\n return (\n <span className={cn(\"ods-json-viewer__value\", `ods-json-viewer__value--${VARIANT[variant]}`)}>\n <span>{display}</span>\n {copyable && (\n <button\n type=\"button\"\n className=\"ods-json-viewer__copy\"\n onClick={(e) => {\n e.stopPropagation();\n handleCopy();\n }}\n aria-label=\"Copy value\"\n >\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" aria-hidden=\"true\">\n <rect x=\"2\" y=\"2\" width=\"6\" height=\"6\" rx=\"1\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <path d=\"M3.5 0.5h5v5\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" />\n </svg>\n </button>\n )}\n </span>\n );\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface KanbanCardProps {\n title: ReactNode;\n tag?: ReactNode;\n date?: ReactNode;\n comments?: number;\n assignee?: ReactNode;\n priority?: \"low\" | \"medium\" | \"high\";\n onClick?: () => void;\n className?: string;\n}\n\nexport function KanbanCard({\n title,\n tag,\n date,\n comments,\n assignee,\n priority,\n onClick,\n className,\n}: KanbanCardProps) {\n return (\n <div\n role={onClick ? \"button\" : undefined}\n tabIndex={onClick ? 0 : undefined}\n onClick={onClick}\n className={cn(\n \"ods-kanban-card\",\n priority && `ods-kanban-card--${priority}`,\n onClick && \"ods-kanban-card--interactive\",\n className,\n )}\n >\n {tag && (\n <div className=\"ods-kanban-card__head\">\n <span className=\"ods-kanban-card__tag\">{tag}</span>\n <button\n type=\"button\"\n className=\"ods-kanban-card__more\"\n aria-label=\"More options\"\n onClick={(e) => e.stopPropagation()}\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"3\" cy=\"7\" r=\"1.2\" fill=\"currentColor\" />\n <circle cx=\"7\" cy=\"7\" r=\"1.2\" fill=\"currentColor\" />\n <circle cx=\"11\" cy=\"7\" r=\"1.2\" fill=\"currentColor\" />\n </svg>\n </button>\n </div>\n )}\n <div className=\"ods-kanban-card__title\">{title}</div>\n <div className=\"ods-kanban-card__footer\">\n <div className=\"ods-kanban-card__meta\">\n {date && (\n <span className=\"ods-kanban-card__date\">\n <svg width=\"11\" height=\"11\" viewBox=\"0 0 11 11\" fill=\"none\" aria-hidden=\"true\">\n <rect\n x=\"1.5\"\n y=\"2.5\"\n width=\"8\"\n height=\"7\"\n rx=\"1\"\n stroke=\"currentColor\"\n strokeWidth=\"1.2\"\n />\n <path\n d=\"M3.5 1.5v2M7.5 1.5v2M1.5 4.5h8\"\n stroke=\"currentColor\"\n strokeWidth=\"1.2\"\n strokeLinecap=\"round\"\n />\n </svg>\n {date}\n </span>\n )}\n {typeof comments === \"number\" && (\n <span className=\"ods-kanban-card__comments\">\n <svg width=\"11\" height=\"11\" viewBox=\"0 0 11 11\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M2 3a1 1 0 0 1 1-1h5a1 1 0 0 1 1 1v3a1 1 0 0 1-1 1H6l-2 2v-2H3a1 1 0 0 1-1-1V3z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.2\"\n />\n </svg>\n {comments}\n </span>\n )}\n </div>\n {assignee && <div className=\"ods-kanban-card__assignee\">{assignee}</div>}\n </div>\n </div>\n );\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface KbdProps {\n size?: \"sm\" | \"md\";\n children: ReactNode;\n className?: string;\n}\n\nexport function Kbd({ size = \"md\", children, className }: KbdProps) {\n return <kbd className={cn(\"ods-kbd\", `ods-kbd--${size}`, className)}>{children}</kbd>;\n}\n\nexport interface KbdGroupProps {\n size?: \"sm\" | \"md\";\n separator?: ReactNode;\n keys: ReactNode[];\n className?: string;\n}\n\nexport function KbdGroup({ size = \"md\", separator = \"+\", keys, className }: KbdGroupProps) {\n return (\n <span className={cn(\"ods-kbd-group\", className)}>\n {keys.map((k, i) => (\n <span key={i} className=\"ods-kbd-group__item\">\n <Kbd size={size}>{k}</Kbd>\n {i < keys.length - 1 && (\n <span className=\"ods-kbd-group__sep\" aria-hidden=\"true\">\n {separator}\n </span>\n )}\n </span>\n ))}\n </span>\n );\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface LinePoint {\n x: number | string;\n y: number;\n}\n\nexport interface LineChartProps {\n data: LinePoint[];\n height?: number;\n stroke?: string;\n fill?: string; // area fill under line\n title?: ReactNode;\n total?: ReactNode;\n smooth?: boolean;\n className?: string;\n}\n\nfunction buildPath(points: [number, number][], smooth: boolean): string {\n if (points.length === 0) return \"\";\n if (!smooth) {\n return points.map(([x, y], i) => `${i === 0 ? \"M\" : \"L\"}${x},${y}`).join(\" \");\n }\n // Simple Catmull-Rom → Bezier smoothing\n let d = `M${points[0][0]},${points[0][1]}`;\n for (let i = 0; i < points.length - 1; i++) {\n const [x0, y0] = points[Math.max(0, i - 1)];\n const [x1, y1] = points[i];\n const [x2, y2] = points[i + 1];\n const [x3, y3] = points[Math.min(points.length - 1, i + 2)];\n const cp1x = x1 + (x2 - x0) / 6;\n const cp1y = y1 + (y2 - y0) / 6;\n const cp2x = x2 - (x3 - x1) / 6;\n const cp2y = y2 - (y3 - y1) / 6;\n d += ` C${cp1x},${cp1y} ${cp2x},${cp2y} ${x2},${y2}`;\n }\n return d;\n}\n\nexport function LineChart({\n data,\n height = 120,\n stroke = \"#6c5ce7\",\n fill,\n title,\n total,\n smooth = true,\n className,\n}: LineChartProps) {\n const W = 360;\n const H = 100;\n const pad = 6;\n const ys = data.map((d) => d.y);\n const min = Math.min(...ys);\n const max = Math.max(...ys);\n const range = Math.max(1, max - min);\n const stepX = (W - pad * 2) / Math.max(1, data.length - 1);\n\n const pts: [number, number][] = data.map((d, i) => [\n pad + i * stepX,\n pad + (1 - (d.y - min) / range) * (H - pad * 2),\n ]);\n\n const path = buildPath(pts, smooth);\n const areaPath =\n fill && pts.length\n ? `${path} L${pts[pts.length - 1][0]},${H - pad} L${pts[0][0]},${H - pad} Z`\n : null;\n\n return (\n <div className={cn(\"ods-line-chart\", className)}>\n {(title || total) && (\n <div className=\"ods-line-chart__head\">\n {title && <div className=\"ods-line-chart__title\">{title}</div>}\n {total && <div className=\"ods-line-chart__total\">{total}</div>}\n </div>\n )}\n <svg\n className=\"ods-line-chart__svg\"\n viewBox={`0 0 ${W} ${H}`}\n preserveAspectRatio=\"none\"\n style={{ height }}\n >\n {areaPath && <path d={areaPath} fill={fill} />}\n <path\n d={path}\n fill=\"none\"\n stroke={stroke}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </div>\n );\n}\n","\"use client\";\nimport type { AnchorHTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface LinkButtonProps extends AnchorHTMLAttributes<HTMLAnchorElement> {\n variant?: \"primary\" | \"neutral\" | \"danger\";\n size?: \"sm\" | \"md\" | \"lg\";\n underline?: boolean;\n leftIcon?: ReactNode;\n rightIcon?: ReactNode;\n children: ReactNode;\n}\n\nexport function LinkButton({\n variant = \"primary\",\n size = \"md\",\n underline = false,\n leftIcon,\n rightIcon,\n className,\n children,\n ...props\n}: LinkButtonProps) {\n return (\n <a\n {...props}\n className={cn(\n \"ods-link-btn\",\n `ods-link-btn--${variant}`,\n `ods-link-btn--${size}`,\n underline && \"ods-link-btn--underline\",\n className,\n )}\n >\n {leftIcon && (\n <span className=\"ods-link-btn__icon ods-link-btn__icon--left\" aria-hidden=\"true\">\n {leftIcon}\n </span>\n )}\n <span className=\"ods-link-btn__label\">{children}</span>\n {rightIcon && (\n <span className=\"ods-link-btn__icon ods-link-btn__icon--right\" aria-hidden=\"true\">\n {rightIcon}\n </span>\n )}\n </a>\n );\n}\n","\"use client\";\nimport { Editor, type Monaco, type OnMount } from \"@monaco-editor/react\";\nimport type { editor } from \"monaco-editor\";\nimport {\n type CSSProperties,\n type ReactNode,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { OCTAVIAFLOW_LIGHT, OCTAVIAFLOW_THEME_ID } from \"./octaviaflowTheme\";\n\nexport type MonacoLanguage =\n | \"sql\"\n | \"json\"\n | \"javascript\"\n | \"typescript\"\n | \"tsx\"\n | \"yaml\"\n | \"xml\"\n | \"html\"\n | \"css\"\n | \"scss\"\n | \"markdown\"\n | \"python\"\n | \"go\"\n | \"rust\"\n | \"java\"\n | \"csharp\"\n | \"shell\"\n | \"plaintext\";\n\nexport interface MonacoMarker {\n /** 1-based line number. */\n line: number;\n /** 1-based column. */\n column?: number;\n /** 1-based end line. Defaults to `line`. */\n endLine?: number;\n /** 1-based end column. */\n endColumn?: number;\n severity?: \"error\" | \"warning\" | \"info\" | \"hint\";\n message: string;\n /** Optional source label, e.g. \"json-schema\". */\n source?: string;\n}\n\nexport interface MonacoEditorProps {\n value: string;\n onChange?: (value: string) => void;\n language?: MonacoLanguage;\n /** Read-only mode. */\n readOnly?: boolean;\n /** Editor height — number (px) or any CSS length. Default 320. */\n height?: number | string;\n /** Min height when auto-sizing is disabled. */\n minHeight?: number;\n /** Custom toolbar slot above the editor. */\n toolbar?: ReactNode;\n /** Status pill on the right side of the toolbar. */\n status?: ReactNode;\n /** Hide the toolbar entirely. */\n hideToolbar?: boolean;\n /** Hide the footer (cursor pos + shortcut hints). */\n hideFooter?: boolean;\n /** Show built-in Copy button. */\n showCopy?: boolean;\n /** Show built-in Format button. Uses Monaco's `editor.action.formatDocument`. */\n showFormat?: boolean;\n /** Show built-in word-wrap toggle. */\n showWordWrapToggle?: boolean;\n /** Show built-in minimap toggle. */\n showMinimapToggle?: boolean;\n /** Initial word wrap. Default false. */\n wordWrap?: boolean;\n /** Initial minimap state. Default false (off — Linear-tight). */\n minimap?: boolean;\n /** Show line numbers. Default true. */\n showLineNumbers?: boolean;\n /** Diagnostic markers (errors, warnings, info, hints). */\n markers?: MonacoMarker[];\n /** Pass-through Monaco editor options. Merged after the defaults. */\n options?: editor.IStandaloneEditorConstructionOptions;\n /** Called once Monaco has mounted with the editor + monaco namespace. */\n onMount?: OnMount;\n /** Style attribute for the wrapper. */\n style?: CSSProperties;\n className?: string;\n ariaLabel?: string;\n /** Theme override. Defaults to \"octaviaflow-light\". */\n theme?: string;\n}\n\nconst MARKER_SEVERITY: Record<\n Required<MonacoMarker>[\"severity\"],\n number\n> = {\n hint: 1,\n info: 2,\n warning: 4,\n error: 8,\n};\n\nexport function MonacoEditor({\n value,\n onChange,\n language = \"plaintext\",\n readOnly = false,\n height = 320,\n minHeight = 120,\n toolbar,\n status,\n hideToolbar = false,\n hideFooter = false,\n showCopy = true,\n showFormat = true,\n showWordWrapToggle = true,\n showMinimapToggle = true,\n wordWrap: wordWrapProp,\n minimap: minimapProp,\n showLineNumbers = true,\n markers,\n options,\n onMount,\n style,\n className,\n ariaLabel = \"Code editor\",\n theme,\n}: MonacoEditorProps) {\n const editorRef = useRef<editor.IStandaloneCodeEditor | null>(null);\n const monacoRef = useRef<Monaco | null>(null);\n\n const [wordWrap, setWordWrap] = useState<boolean>(wordWrapProp ?? false);\n const [minimap, setMinimap] = useState<boolean>(minimapProp ?? false);\n const [copied, setCopied] = useState(false);\n const [cursor, setCursor] = useState({ line: 1, column: 1 });\n const [selection, setSelection] = useState({ chars: 0, lines: 0 });\n const [lineCount, setLineCount] = useState(value.split(\"\\n\").length);\n\n // Keep prop-driven state in sync if controlled\n useEffect(() => {\n if (wordWrapProp !== undefined) setWordWrap(wordWrapProp);\n }, [wordWrapProp]);\n useEffect(() => {\n if (minimapProp !== undefined) setMinimap(minimapProp);\n }, [minimapProp]);\n\n // Apply word wrap / minimap changes to the live editor\n useEffect(() => {\n editorRef.current?.updateOptions({\n wordWrap: wordWrap ? \"on\" : \"off\",\n minimap: { enabled: minimap },\n });\n }, [wordWrap, minimap]);\n\n // Apply markers when they change\n useEffect(() => {\n const editor = editorRef.current;\n const monaco = monacoRef.current;\n if (!editor || !monaco || !markers) return;\n const model = editor.getModel();\n if (!model) return;\n monaco.editor.setModelMarkers(\n model,\n \"octaviaflow\",\n markers.map((m) => ({\n severity: MARKER_SEVERITY[m.severity ?? \"error\"],\n message: m.message,\n startLineNumber: m.line,\n startColumn: m.column ?? 1,\n endLineNumber: m.endLine ?? m.line,\n endColumn: m.endColumn ?? (m.column ?? 1) + 1,\n source: m.source,\n })),\n );\n }, [markers]);\n\n const handleMount: OnMount = useCallback(\n (editor, monaco) => {\n editorRef.current = editor;\n monacoRef.current = monaco;\n monaco.editor.defineTheme(OCTAVIAFLOW_THEME_ID, OCTAVIAFLOW_LIGHT);\n monaco.editor.setTheme(theme ?? OCTAVIAFLOW_THEME_ID);\n\n // Cursor + selection tracking\n editor.onDidChangeCursorPosition((e) => {\n setCursor({ line: e.position.lineNumber, column: e.position.column });\n });\n editor.onDidChangeCursorSelection((e) => {\n const sel = e.selection;\n if (sel.isEmpty()) {\n setSelection({ chars: 0, lines: 0 });\n return;\n }\n const model = editor.getModel();\n if (!model) return;\n const text = model.getValueInRange(sel);\n setSelection({\n chars: text.length,\n lines: text.split(\"\\n\").length,\n });\n });\n // Track line count for footer\n const model = editor.getModel();\n if (model) {\n setLineCount(model.getLineCount());\n model.onDidChangeContent(() => setLineCount(model.getLineCount()));\n }\n\n onMount?.(editor, monaco);\n },\n [onMount, theme],\n );\n\n const handleCopy = async () => {\n if (typeof navigator === \"undefined\") return;\n try {\n await navigator.clipboard.writeText(value);\n setCopied(true);\n setTimeout(() => setCopied(false), 1200);\n } catch {\n /* ignore */\n }\n };\n\n const handleFormat = () => {\n editorRef.current?.getAction(\"editor.action.formatDocument\")?.run();\n };\n\n const mergedOptions: editor.IStandaloneEditorConstructionOptions = {\n readOnly,\n fontFamily:\n \"ui-monospace, SFMono-Regular, 'JetBrains Mono', 'Fira Code', Menlo, Consolas, monospace\",\n fontSize: 13,\n fontLigatures: true,\n lineHeight: 20,\n lineNumbers: showLineNumbers ? \"on\" : \"off\",\n lineNumbersMinChars: 3,\n lineDecorationsWidth: 6,\n folding: true,\n glyphMargin: false,\n minimap: { enabled: minimap },\n wordWrap: wordWrap ? \"on\" : \"off\",\n scrollBeyondLastLine: false,\n smoothScrolling: true,\n cursorBlinking: \"smooth\",\n cursorSmoothCaretAnimation: \"on\",\n renderLineHighlight: \"line\",\n padding: { top: 8, bottom: 8 },\n bracketPairColorization: { enabled: true },\n guides: { bracketPairs: true, indentation: true },\n automaticLayout: true,\n tabSize: 2,\n insertSpaces: true,\n scrollbar: {\n verticalScrollbarSize: 8,\n horizontalScrollbarSize: 8,\n useShadows: false,\n },\n fixedOverflowWidgets: true,\n contextmenu: true,\n suggestOnTriggerCharacters: true,\n quickSuggestions: { other: true, comments: false, strings: false },\n formatOnPaste: false,\n formatOnType: false,\n \"semanticHighlighting.enabled\": true,\n ...options,\n };\n\n const showWrapBtn = showWordWrapToggle && wordWrapProp === undefined;\n const showMinimapBtn = showMinimapToggle && minimapProp === undefined;\n\n return (\n <div\n className={cn(\n \"ods-monaco\",\n `ods-monaco--${language}`,\n readOnly && \"ods-monaco--readonly\",\n className,\n )}\n style={style}\n >\n {!hideToolbar && (\n <div className=\"ods-monaco__toolbar\">\n <div className=\"ods-monaco__toolbar-left\">\n <span className=\"ods-monaco__lang\">{language.toUpperCase()}</span>\n {toolbar}\n </div>\n <div className=\"ods-monaco__toolbar-right\">\n <span className=\"ods-monaco__lines\">\n {lineCount} line{lineCount === 1 ? \"\" : \"s\"}\n </span>\n {status && <span className=\"ods-monaco__status\">{status}</span>}\n {showWrapBtn && (\n <button\n type=\"button\"\n className={cn(\"ods-monaco__btn\", wordWrap && \"ods-monaco__btn--active\")}\n onClick={() => setWordWrap((w) => !w)}\n aria-pressed={wordWrap}\n aria-label=\"Toggle word wrap\"\n title=\"Word wrap\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M2 3.5h10M2 7h7.5a2 2 0 1 1 0 4H8m0 0 1.5-1.5M8 11l1.5 1.5M2 10.5h3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n )}\n {showMinimapBtn && (\n <button\n type=\"button\"\n className={cn(\"ods-monaco__btn\", minimap && \"ods-monaco__btn--active\")}\n onClick={() => setMinimap((m) => !m)}\n aria-pressed={minimap}\n aria-label=\"Toggle minimap\"\n title=\"Minimap\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <rect x=\"2\" y=\"2.5\" width=\"6\" height=\"9\" rx=\"0.5\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <rect x=\"9\" y=\"2.5\" width=\"3\" height=\"9\" rx=\"0.5\" fill=\"currentColor\" opacity=\"0.25\" />\n <path d=\"M3.5 4.5h3M3.5 6.5h3M3.5 8.5h2\" stroke=\"currentColor\" strokeWidth=\"1\" strokeLinecap=\"round\" />\n </svg>\n </button>\n )}\n {showFormat && !readOnly && (\n <button\n type=\"button\"\n className=\"ods-monaco__btn\"\n onClick={handleFormat}\n aria-label=\"Format document\"\n title=\"Format (Shift+Alt+F)\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M2.5 4h9M4 7h7.5M5.5 10H11\" stroke=\"currentColor\" strokeWidth=\"1.3\" strokeLinecap=\"round\" />\n <path d=\"M2.5 7 3.5 6 2.5 5\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n )}\n {showCopy && (\n <button\n type=\"button\"\n className={cn(\"ods-monaco__btn\", copied && \"ods-monaco__btn--success\")}\n onClick={handleCopy}\n aria-label=\"Copy\"\n title=\"Copy\"\n >\n {copied ? (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"m3 7 3 3 5-6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n ) : (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <rect x=\"3\" y=\"3\" width=\"8\" height=\"8\" rx=\"1\" stroke=\"currentColor\" strokeWidth=\"1.3\" />\n <path d=\"M5 1.5h6V8\" stroke=\"currentColor\" strokeWidth=\"1.3\" strokeLinecap=\"round\" />\n </svg>\n )}\n </button>\n )}\n </div>\n </div>\n )}\n\n <div className=\"ods-monaco__body\" style={{ minHeight }}>\n <Editor\n value={value}\n onChange={(v) => onChange?.(v ?? \"\")}\n language={language}\n height={height}\n theme={theme ?? OCTAVIAFLOW_THEME_ID}\n options={mergedOptions}\n onMount={handleMount}\n loading={\n <div className=\"ods-monaco__loading\">\n <span className=\"ods-monaco__loading-spin\" aria-hidden=\"true\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <circle cx=\"7\" cy=\"7\" r=\"5\" stroke=\"currentColor\" strokeWidth=\"1.4\" strokeDasharray=\"4 18\" strokeLinecap=\"round\" />\n </svg>\n </span>\n <span>Loading editor…</span>\n </div>\n }\n aria-label={ariaLabel}\n />\n </div>\n\n {!hideFooter && (\n <div className=\"ods-monaco__footer\">\n <span className=\"ods-monaco__pos\">\n Ln {cursor.line}, Col {cursor.column}\n {selection.chars > 0 && (\n <>\n {\" \"}· {selection.chars} char{selection.chars === 1 ? \"\" : \"s\"}\n {selection.lines > 1 && ` · ${selection.lines} lines`}\n </>\n )}\n </span>\n <span className=\"ods-monaco__shortcut-hint\">\n <kbd className=\"ods-monaco__kbd\">⌘F</kbd> find\n <span className=\"ods-monaco__sep\">·</span>\n <kbd className=\"ods-monaco__kbd\">⌘⇧F</kbd> replace\n <span className=\"ods-monaco__sep\">·</span>\n <kbd className=\"ods-monaco__kbd\">F1</kbd> commands\n </span>\n </div>\n )}\n </div>\n );\n}\n","import type { editor } from \"monaco-editor\";\n\n/**\n * OctaviaFlow v1 Monaco theme — light, Linear-tight, accent-driven.\n * Hex values mirror the canonical v1 tokens (see packages/styles/src/02-tokens/_v1.scss).\n */\nexport const OCTAVIAFLOW_LIGHT: editor.IStandaloneThemeData = {\n base: \"vs\",\n inherit: true,\n rules: [\n { token: \"\", foreground: \"161616\", background: \"FFFFFF\" },\n { token: \"comment\", foreground: \"6F6F6F\", fontStyle: \"italic\" },\n { token: \"string\", foreground: \"198038\" },\n { token: \"string.key.json\", foreground: \"0F62FE\" },\n { token: \"string.value.json\", foreground: \"198038\" },\n { token: \"number\", foreground: \"0043CE\" },\n { token: \"keyword\", foreground: \"8A3FFC\" },\n { token: \"keyword.sql\", foreground: \"8A3FFC\" },\n { token: \"operator\", foreground: \"393939\" },\n { token: \"delimiter\", foreground: \"525252\" },\n { token: \"type\", foreground: \"0F62FE\" },\n { token: \"type.identifier\", foreground: \"0F62FE\" },\n { token: \"identifier\", foreground: \"161616\" },\n { token: \"constant\", foreground: \"0043CE\" },\n { token: \"boolean\", foreground: \"F1C21B\", fontStyle: \"bold\" },\n { token: \"tag\", foreground: \"DA1E28\" },\n { token: \"attribute.name\", foreground: \"8A3FFC\" },\n { token: \"attribute.value\", foreground: \"198038\" },\n { token: \"regexp\", foreground: \"DA1E28\" },\n { token: \"function\", foreground: \"0F62FE\" },\n { token: \"variable\", foreground: \"161616\" },\n { token: \"variable.parameter\", foreground: \"393939\", fontStyle: \"italic\" },\n { token: \"namespace\", foreground: \"0F62FE\" },\n ],\n colors: {\n \"editor.background\": \"#FFFFFF\",\n \"editor.foreground\": \"#161616\",\n \"editor.lineHighlightBackground\": \"#F4F4F4\",\n \"editor.lineHighlightBorder\": \"#00000000\",\n \"editorLineNumber.foreground\": \"#A8A8A8\",\n \"editorLineNumber.activeForeground\": \"#0F62FE\",\n \"editorCursor.foreground\": \"#0F62FE\",\n \"editor.selectionBackground\": \"#D0E2FF\",\n \"editor.selectionHighlightBackground\": \"#EDF5FF\",\n \"editor.wordHighlightBackground\": \"#EDF5FF\",\n \"editor.wordHighlightStrongBackground\": \"#D0E2FF\",\n \"editor.findMatchBackground\": \"#FFD7D9\",\n \"editor.findMatchHighlightBackground\": \"#FFE9EB\",\n \"editorIndentGuide.background1\": \"#F4F4F4\",\n \"editorIndentGuide.activeBackground1\": \"#E0E0E0\",\n \"editorWhitespace.foreground\": \"#E0E0E0\",\n \"editorBracketMatch.background\": \"#D0E2FF\",\n \"editorBracketMatch.border\": \"#0F62FE\",\n \"editor.foldBackground\": \"#F4F4F4\",\n\n \"editorGutter.background\": \"#F4F4F4\",\n \"editorGutter.modifiedBackground\": \"#0F62FE\",\n \"editorGutter.addedBackground\": \"#198038\",\n \"editorGutter.deletedBackground\": \"#DA1E28\",\n\n \"editorWidget.background\": \"#FFFFFF\",\n \"editorWidget.foreground\": \"#161616\",\n \"editorWidget.border\": \"#E0E0E0\",\n \"editorSuggestWidget.background\": \"#FFFFFF\",\n \"editorSuggestWidget.border\": \"#E0E0E0\",\n \"editorSuggestWidget.foreground\": \"#161616\",\n \"editorSuggestWidget.selectedBackground\": \"#EDF5FF\",\n \"editorSuggestWidget.selectedForeground\": \"#161616\",\n \"editorSuggestWidget.highlightForeground\": \"#0F62FE\",\n\n \"editorHoverWidget.background\": \"#FFFFFF\",\n \"editorHoverWidget.border\": \"#E0E0E0\",\n\n \"editorError.foreground\": \"#DA1E28\",\n \"editorWarning.foreground\": \"#F1C21B\",\n \"editorInfo.foreground\": \"#0F62FE\",\n\n \"diffEditor.insertedTextBackground\": \"#A7F0BA40\",\n \"diffEditor.removedTextBackground\": \"#FFB3B840\",\n \"diffEditor.insertedLineBackground\": \"#DEFBE640\",\n \"diffEditor.removedLineBackground\": \"#FFD7D940\",\n\n \"scrollbar.shadow\": \"#00000000\",\n \"scrollbarSlider.background\": \"#0F62FE20\",\n \"scrollbarSlider.hoverBackground\": \"#0F62FE40\",\n \"scrollbarSlider.activeBackground\": \"#0F62FE60\",\n\n \"minimap.background\": \"#FAFAFA\",\n \"minimap.selectionHighlight\": \"#0F62FE\",\n \"minimapSlider.background\": \"#0F62FE15\",\n \"minimapSlider.hoverBackground\": \"#0F62FE30\",\n \"minimapSlider.activeBackground\": \"#0F62FE50\",\n\n \"input.background\": \"#FFFFFF\",\n \"input.foreground\": \"#161616\",\n \"input.border\": \"#C6C6C6\",\n \"inputOption.activeBorder\": \"#0F62FE\",\n\n \"focusBorder\": \"#0F62FE\",\n },\n};\n\nexport const OCTAVIAFLOW_THEME_ID = \"octaviaflow-light\";\n","\"use client\";\nimport { DiffEditor, type Monaco } from \"@monaco-editor/react\";\nimport type { editor } from \"monaco-editor\";\nimport { type CSSProperties, type ReactNode, useRef, useState } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { OCTAVIAFLOW_LIGHT, OCTAVIAFLOW_THEME_ID } from \"./octaviaflowTheme\";\nimport type { MonacoLanguage } from \"./MonacoEditor\";\n\nexport interface MonacoDiffEditorProps {\n original: string;\n modified: string;\n onModifiedChange?: (value: string) => void;\n language?: MonacoLanguage;\n /** Side-by-side vs inline diff. Default \"side-by-side\". */\n renderSideBySide?: boolean;\n /** Read-only on the right side. Default false. */\n readOnly?: boolean;\n /** Show only changed regions. */\n hideUnchangedRegions?: boolean;\n /** Editor height. Default 360. */\n height?: number | string;\n minHeight?: number;\n /** Labels above each side. */\n originalLabel?: ReactNode;\n modifiedLabel?: ReactNode;\n toolbar?: ReactNode;\n /** Pass-through Monaco diff editor options. */\n options?: editor.IDiffEditorConstructionOptions;\n onMount?: (\n editor: editor.IStandaloneDiffEditor,\n monaco: Monaco,\n ) => void;\n style?: CSSProperties;\n className?: string;\n theme?: string;\n hideToolbar?: boolean;\n}\n\nexport function MonacoDiffEditor({\n original,\n modified,\n onModifiedChange,\n language = \"plaintext\",\n renderSideBySide = true,\n readOnly = false,\n hideUnchangedRegions = false,\n height = 360,\n minHeight = 200,\n originalLabel = \"Original\",\n modifiedLabel = \"Modified\",\n toolbar,\n options,\n onMount,\n style,\n className,\n theme,\n hideToolbar = false,\n}: MonacoDiffEditorProps) {\n const editorRef = useRef<editor.IStandaloneDiffEditor | null>(null);\n const [sideBySide, setSideBySide] = useState(renderSideBySide);\n\n const handleMount = (\n diffEditor: editor.IStandaloneDiffEditor,\n monaco: Monaco,\n ) => {\n editorRef.current = diffEditor;\n monaco.editor.defineTheme(OCTAVIAFLOW_THEME_ID, OCTAVIAFLOW_LIGHT);\n monaco.editor.setTheme(theme ?? OCTAVIAFLOW_THEME_ID);\n\n const modifiedEditor = diffEditor.getModifiedEditor();\n modifiedEditor.onDidChangeModelContent(() => {\n onModifiedChange?.(modifiedEditor.getValue());\n });\n\n onMount?.(diffEditor, monaco);\n };\n\n const mergedOptions: editor.IDiffEditorConstructionOptions = {\n readOnly,\n originalEditable: false,\n renderSideBySide: sideBySide,\n fontFamily:\n \"ui-monospace, SFMono-Regular, 'JetBrains Mono', 'Fira Code', Menlo, Consolas, monospace\",\n fontSize: 13,\n lineHeight: 20,\n automaticLayout: true,\n lineNumbersMinChars: 3,\n lineDecorationsWidth: 6,\n folding: true,\n glyphMargin: false,\n minimap: { enabled: false },\n scrollBeyondLastLine: false,\n smoothScrolling: true,\n renderOverviewRuler: true,\n diffWordWrap: \"off\",\n padding: { top: 8, bottom: 8 },\n hideUnchangedRegions: {\n enabled: hideUnchangedRegions,\n revealLineCount: 20,\n minimumLineCount: 3,\n contextLineCount: 3,\n },\n scrollbar: {\n verticalScrollbarSize: 8,\n horizontalScrollbarSize: 8,\n useShadows: false,\n },\n ...options,\n };\n\n return (\n <div\n className={cn(\"ods-monaco-diff\", `ods-monaco-diff--${language}`, className)}\n style={style}\n >\n {!hideToolbar && (\n <div className=\"ods-monaco__toolbar\">\n <div className=\"ods-monaco__toolbar-left\">\n <span className=\"ods-monaco__lang\">DIFF · {language.toUpperCase()}</span>\n <span className=\"ods-monaco-diff__labels\">\n <span className=\"ods-monaco-diff__label ods-monaco-diff__label--orig\">\n {originalLabel}\n </span>\n <span className=\"ods-monaco-diff__arrow\" aria-hidden=\"true\">→</span>\n <span className=\"ods-monaco-diff__label ods-monaco-diff__label--mod\">\n {modifiedLabel}\n </span>\n </span>\n {toolbar}\n </div>\n <div className=\"ods-monaco__toolbar-right\">\n <button\n type=\"button\"\n className={cn(\n \"ods-monaco__btn\",\n sideBySide && \"ods-monaco__btn--active\",\n )}\n onClick={() => setSideBySide((s) => !s)}\n aria-pressed={sideBySide}\n aria-label=\"Toggle side-by-side\"\n title={sideBySide ? \"Inline\" : \"Side-by-side\"}\n >\n {sideBySide ? (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <rect x=\"1.5\" y=\"2\" width=\"5\" height=\"10\" rx=\"0.5\" stroke=\"currentColor\" strokeWidth=\"1.3\" />\n <rect x=\"7.5\" y=\"2\" width=\"5\" height=\"10\" rx=\"0.5\" stroke=\"currentColor\" strokeWidth=\"1.3\" />\n </svg>\n ) : (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <rect x=\"1.5\" y=\"2\" width=\"11\" height=\"10\" rx=\"0.5\" stroke=\"currentColor\" strokeWidth=\"1.3\" />\n <path d=\"M1.5 7h11\" stroke=\"currentColor\" strokeWidth=\"1.3\" />\n </svg>\n )}\n </button>\n </div>\n </div>\n )}\n\n <div className=\"ods-monaco__body\" style={{ minHeight }}>\n <DiffEditor\n original={original}\n modified={modified}\n language={language}\n height={height}\n theme={theme ?? OCTAVIAFLOW_THEME_ID}\n options={mergedOptions}\n onMount={handleMount}\n loading={\n <div className=\"ods-monaco__loading\">\n <span className=\"ods-monaco__loading-spin\" aria-hidden=\"true\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <circle cx=\"7\" cy=\"7\" r=\"5\" stroke=\"currentColor\" strokeWidth=\"1.4\" strokeDasharray=\"4 18\" strokeLinecap=\"round\" />\n </svg>\n </span>\n <span>Loading diff…</span>\n </div>\n }\n />\n </div>\n </div>\n );\n}\n","\"use client\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport {\n type KeyboardEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface MultiSelectOption {\n value: string;\n label: string;\n icon?: ReactNode;\n description?: string;\n}\n\nexport interface MultiSelectProps {\n options: MultiSelectOption[];\n value?: string[];\n defaultValue?: string[];\n onChange?: (values: string[]) => void;\n placeholder?: string;\n searchPlaceholder?: string;\n label?: string;\n error?: boolean;\n errorMessage?: string;\n disabled?: boolean;\n size?: \"sm\" | \"md\";\n /** Force searchable on/off. Auto: enabled when options.length > 6. */\n searchable?: boolean;\n /** Hard cap on visible chips. Overrides auto-measurement. */\n maxVisibleTags?: number;\n /** Maximum number of selectable options. */\n maxTags?: number;\n className?: string;\n}\n\nconst RESERVED_TAIL_PX = 64; // reserved for the \"Add more…\" hint + clear button\nconst TAGS_GAP = 6;\n\nexport function MultiSelect({\n options,\n value: controlledValue,\n defaultValue,\n onChange,\n placeholder = \"Select options…\",\n searchPlaceholder = \"Search options…\",\n label,\n error = false,\n errorMessage,\n disabled = false,\n size = \"md\",\n searchable,\n maxVisibleTags,\n maxTags,\n className,\n}: MultiSelectProps) {\n // ── State ──────────────────────────────────────\n const [internalValue, setInternalValue] = useState<string[]>(defaultValue ?? []);\n const selectedValues = controlledValue ?? internalValue;\n\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState(\"\");\n const [activeIdx, setActiveIdx] = useState(0);\n const [dropdownPos, setDropdownPos] = useState({ top: 0, left: 0, width: 0 });\n\n // ── Refs ───────────────────────────────────────\n const wrapRef = useRef<HTMLDivElement>(null);\n const tagsRowRef = useRef<HTMLDivElement>(null);\n const searchRef = useRef<HTMLInputElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const chipRefs = useRef<(HTMLSpanElement | null)[]>([]);\n\n // ── Helpers ────────────────────────────────────\n const commit = useCallback(\n (next: string[]) => {\n if (controlledValue === undefined) setInternalValue(next);\n onChange?.(next);\n },\n [controlledValue, onChange],\n );\n\n const availableOptions = useMemo(() => {\n const selected = new Set(selectedValues);\n const unselected = options.filter((o) => !selected.has(o.value));\n if (!query.trim()) return unselected;\n const q = query.trim().toLowerCase();\n return unselected.filter(\n (o) =>\n o.label.toLowerCase().includes(q) ||\n o.value.toLowerCase().includes(q) ||\n o.description?.toLowerCase().includes(q),\n );\n }, [options, selectedValues, query]);\n\n const showSearch = searchable ?? options.length > 6;\n const getLabel = (v: string) => options.find((o) => o.value === v)?.label ?? v;\n const getIcon = (v: string) => options.find((o) => o.value === v)?.icon;\n\n // ── Position dropdown ──────────────────────────\n const updatePosition = useCallback(() => {\n if (!wrapRef.current) return;\n const rect = wrapRef.current.getBoundingClientRect();\n setDropdownPos({ top: rect.bottom + 4, left: rect.left, width: rect.width });\n }, []);\n\n useEffect(() => {\n if (!open) return;\n updatePosition();\n window.addEventListener(\"scroll\", updatePosition, true);\n window.addEventListener(\"resize\", updatePosition);\n return () => {\n window.removeEventListener(\"scroll\", updatePosition, true);\n window.removeEventListener(\"resize\", updatePosition);\n };\n }, [open, updatePosition]);\n\n // Close on outside click\n useEffect(() => {\n if (!open) return;\n const onDoc = (e: MouseEvent) => {\n const t = e.target as Node;\n if (!wrapRef.current?.contains(t) && !dropdownRef.current?.contains(t)) {\n setOpen(false);\n setQuery(\"\");\n }\n };\n document.addEventListener(\"mousedown\", onDoc);\n return () => document.removeEventListener(\"mousedown\", onDoc);\n }, [open]);\n\n // Focus the search when opened\n useEffect(() => {\n if (open && showSearch) {\n requestAnimationFrame(() => searchRef.current?.focus());\n }\n }, [open, showSearch]);\n\n // Reset highlight when filter changes\n useEffect(() => setActiveIdx(0), [query, open]);\n\n // ── Chip overflow measurement ──────────────────\n // Renders all chips first (hidden), then measures widths and decides how many fit.\n // Re-measures on selected-list change and on wrapper resize.\n const [fitCount, setFitCount] = useState(selectedValues.length);\n const [tick, setTick] = useState(0);\n\n useLayoutEffect(() => {\n if (maxVisibleTags !== undefined) {\n setFitCount(Math.min(selectedValues.length, maxVisibleTags));\n return;\n }\n const row = tagsRowRef.current;\n if (!row) return;\n const rowRect = row.getBoundingClientRect();\n const available = Math.max(0, rowRect.width - RESERVED_TAIL_PX);\n // If we can't measure (zero-width container e.g. jsdom), show everything.\n if (available <= 0) {\n setFitCount(selectedValues.length);\n return;\n }\n let sum = 0;\n let count = 0;\n for (let i = 0; i < chipRefs.current.length; i++) {\n const chip = chipRefs.current[i];\n if (!chip) break;\n const w = chip.getBoundingClientRect().width;\n sum += w + TAGS_GAP;\n if (sum > available) break;\n count++;\n }\n if (count < selectedValues.length && count > 0) count = Math.max(1, count - 1);\n setFitCount(count);\n }, [tick, selectedValues, maxVisibleTags]);\n\n // ResizeObserver isn't available in non-browser envs (jsdom tests).\n useEffect(() => {\n if (typeof ResizeObserver === \"undefined\") return;\n const row = tagsRowRef.current;\n if (!row) return;\n const ro = new ResizeObserver(() => setTick((t) => t + 1));\n ro.observe(row);\n return () => ro.disconnect();\n }, []);\n\n // ── Actions ────────────────────────────────────\n const addValue = useCallback(\n (val: string) => {\n if (maxTags && selectedValues.length >= maxTags) return;\n commit([...selectedValues, val]);\n setQuery(\"\");\n setActiveIdx(0);\n searchRef.current?.focus();\n },\n [selectedValues, maxTags, commit],\n );\n\n const removeValue = useCallback(\n (val: string) => {\n commit(selectedValues.filter((v) => v !== val));\n },\n [selectedValues, commit],\n );\n\n const clearAll = useCallback(() => {\n commit([]);\n setQuery(\"\");\n }, [commit]);\n\n // ── Keyboard ───────────────────────────────────\n const handleSearchKey = useCallback(\n (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Escape\") {\n setOpen(false);\n setQuery(\"\");\n return;\n }\n if (e.key === \"Backspace\" && !query && selectedValues.length > 0) {\n removeValue(selectedValues[selectedValues.length - 1]);\n return;\n }\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setActiveIdx((i) => Math.min(availableOptions.length - 1, i + 1));\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setActiveIdx((i) => Math.max(0, i - 1));\n } else if (e.key === \"Enter\") {\n e.preventDefault();\n const opt = availableOptions[activeIdx];\n if (opt) addValue(opt.value);\n } else if (e.key === \"Home\") {\n e.preventDefault();\n setActiveIdx(0);\n } else if (e.key === \"End\") {\n e.preventDefault();\n setActiveIdx(availableOptions.length - 1);\n }\n },\n [query, selectedValues, availableOptions, activeIdx, addValue, removeValue],\n );\n\n // ── Render ─────────────────────────────────────\n const visibleChips = selectedValues.slice(0, fitCount);\n const overflow = selectedValues.length - visibleChips.length;\n\n return (\n <div\n className={cn(\n \"ods-multiselect\",\n `ods-multiselect--${size}`,\n error && \"ods-multiselect--error\",\n disabled && \"ods-multiselect--disabled\",\n className,\n )}\n >\n {label && <label className=\"ods-multiselect__label\">{label}</label>}\n\n <div\n ref={wrapRef}\n className={cn(\"ods-multiselect__input-wrap\", open && \"ods-multiselect__input-wrap--open\")}\n role=\"combobox\"\n aria-expanded={open}\n aria-haspopup=\"listbox\"\n aria-disabled={disabled}\n onClick={() => !disabled && setOpen(true)}\n >\n <div ref={tagsRowRef} className=\"ods-multiselect__tags\">\n {/* Hidden measurement copies: render ALL chips to measure width, then visibly render only the first N */}\n <div className=\"ods-multiselect__measure\" aria-hidden=\"true\">\n {selectedValues.map((val, i) => (\n <span\n key={val}\n ref={(el) => {\n chipRefs.current[i] = el;\n }}\n className=\"ods-multiselect__tag\"\n >\n {getIcon(val) && <span className=\"ods-multiselect__tag-icon\">{getIcon(val)}</span>}\n <span>{getLabel(val)}</span>\n <span className=\"ods-multiselect__tag-remove-spacer\" aria-hidden=\"true\" />\n </span>\n ))}\n </div>\n\n {/* Actually displayed chips */}\n {visibleChips.map((val) => (\n <span key={val} className=\"ods-multiselect__tag\">\n {getIcon(val) && <span className=\"ods-multiselect__tag-icon\">{getIcon(val)}</span>}\n <span>{getLabel(val)}</span>\n <button\n type=\"button\"\n className=\"ods-multiselect__tag-remove\"\n onClick={(e) => {\n e.stopPropagation();\n removeValue(val);\n }}\n aria-label={`Remove ${getLabel(val)}`}\n tabIndex={-1}\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M3 3L9 9M9 3L3 9\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n </span>\n ))}\n\n {overflow > 0 && (\n <span\n className=\"ods-multiselect__tag ods-multiselect__tag--overflow\"\n title={selectedValues.slice(fitCount).map(getLabel).join(\", \")}\n >\n +{overflow}\n </span>\n )}\n\n {selectedValues.length === 0 && (\n <span className=\"ods-multiselect__placeholder\">{placeholder}</span>\n )}\n </div>\n\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n aria-hidden=\"true\"\n className={cn(\"ods-multiselect__chevron\", open && \"ods-multiselect__chevron--open\")}\n >\n <path\n d=\"M4 6l4 4 4-4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n\n {selectedValues.length > 0 && !disabled && (\n <button\n type=\"button\"\n className=\"ods-multiselect__clear\"\n onClick={(e) => {\n e.stopPropagation();\n clearAll();\n }}\n aria-label=\"Clear all\"\n tabIndex={-1}\n >\n Clear\n </button>\n )}\n </div>\n\n {typeof document !== \"undefined\" &&\n createPortal(\n <AnimatePresence>\n {open && (\n <motion.div\n ref={dropdownRef}\n className=\"ods-multiselect__dropdown\"\n style={{\n position: \"fixed\",\n top: dropdownPos.top,\n left: dropdownPos.left,\n width: dropdownPos.width,\n }}\n initial={{ opacity: 0, y: -4 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -4 }}\n transition={{ duration: 0.15, ease: \"easeOut\" }}\n role=\"listbox\"\n aria-label={label || \"Options\"}\n >\n {showSearch && (\n <div className=\"ods-multiselect__search\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"6\" cy=\"6\" r=\"4.5\" stroke=\"currentColor\" strokeWidth=\"1.4\" />\n <path\n d=\"m12 12-2.5-2.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n />\n </svg>\n <input\n ref={searchRef}\n className=\"ods-multiselect__search-input\"\n type=\"text\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n onKeyDown={handleSearchKey}\n placeholder={searchPlaceholder}\n aria-label=\"Search options\"\n autoComplete=\"off\"\n />\n </div>\n )}\n <div className=\"ods-multiselect__list\">\n {availableOptions.length > 0 ? (\n availableOptions.map((opt, idx) => (\n <div\n key={opt.value}\n className={cn(\n \"ods-multiselect__option\",\n idx === activeIdx && \"ods-multiselect__option--highlighted\",\n )}\n role=\"option\"\n aria-selected={false}\n onClick={() => addValue(opt.value)}\n onMouseEnter={() => setActiveIdx(idx)}\n >\n {opt.icon && (\n <span className=\"ods-multiselect__option-icon\">{opt.icon}</span>\n )}\n <span className=\"ods-multiselect__option-text\">\n <span>{opt.label}</span>\n {opt.description && (\n <span className=\"ods-multiselect__option-desc\">{opt.description}</span>\n )}\n </span>\n </div>\n ))\n ) : (\n <div className=\"ods-multiselect__empty\">No results</div>\n )}\n </div>\n </motion.div>\n )}\n </AnimatePresence>,\n document.body,\n )}\n\n {error && errorMessage && <span className=\"ods-multiselect__error\">{errorMessage}</span>}\n </div>\n );\n}\n","\"use client\";\nimport { type ChangeEvent, type ReactNode, useCallback } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface NumberInputProps {\n label?: ReactNode;\n value: number;\n onChange?: (value: number) => void;\n min?: number;\n max?: number;\n step?: number;\n prefix?: ReactNode;\n suffix?: ReactNode;\n size?: \"sm\" | \"md\" | \"lg\";\n disabled?: boolean;\n error?: ReactNode;\n helperText?: ReactNode;\n placeholder?: string;\n \"aria-label\"?: string;\n className?: string;\n}\n\nexport function NumberInput({\n label,\n value,\n onChange,\n min,\n max,\n step = 1,\n prefix,\n suffix,\n size = \"md\",\n disabled = false,\n error,\n helperText,\n placeholder,\n className,\n ...props\n}: NumberInputProps) {\n const clamp = useCallback(\n (v: number) => {\n if (typeof min === \"number\") v = Math.max(min, v);\n if (typeof max === \"number\") v = Math.min(max, v);\n return v;\n },\n [min, max],\n );\n\n const dec = () => !disabled && onChange?.(clamp(value - step));\n const inc = () => !disabled && onChange?.(clamp(value + step));\n const handleInput = (e: ChangeEvent<HTMLInputElement>) => {\n const num = Number(e.target.value);\n if (!Number.isNaN(num)) onChange?.(clamp(num));\n };\n\n return (\n <div\n className={cn(\n \"ods-num\",\n `ods-num--${size}`,\n disabled && \"ods-num--disabled\",\n error && \"ods-num--error\",\n className,\n )}\n >\n {label && <label className=\"ods-num__label\">{label}</label>}\n <div className=\"ods-num__field\">\n <button\n type=\"button\"\n className=\"ods-num__step ods-num__step--dec\"\n onClick={dec}\n disabled={disabled || (typeof min === \"number\" && value <= min)}\n aria-label=\"Decrease\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M3 7h8\" stroke=\"currentColor\" strokeWidth=\"1.75\" strokeLinecap=\"round\" />\n </svg>\n </button>\n {prefix && <span className=\"ods-num__prefix\">{prefix}</span>}\n <input\n type=\"number\"\n className=\"ods-num__input\"\n value={Number.isFinite(value) ? value : \"\"}\n onChange={handleInput}\n disabled={disabled}\n min={min}\n max={max}\n step={step}\n placeholder={placeholder}\n aria-label={props[\"aria-label\"]}\n />\n {suffix && <span className=\"ods-num__suffix\">{suffix}</span>}\n <button\n type=\"button\"\n className=\"ods-num__step ods-num__step--inc\"\n onClick={inc}\n disabled={disabled || (typeof max === \"number\" && value >= max)}\n aria-label=\"Increase\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M7 3v8M3 7h8\" stroke=\"currentColor\" strokeWidth=\"1.75\" strokeLinecap=\"round\" />\n </svg>\n </button>\n </div>\n {error ? (\n <div className=\"ods-num__hint ods-num__hint--error\">{error}</div>\n ) : helperText ? (\n <div className=\"ods-num__hint\">{helperText}</div>\n ) : null}\n </div>\n );\n}\n","\"use client\";\nimport {\n type ClipboardEvent,\n type KeyboardEvent,\n type ReactNode,\n useCallback,\n useRef,\n} from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface OTPInputProps {\n label?: ReactNode;\n length?: number;\n value: string;\n onChange?: (value: string) => void;\n onComplete?: (value: string) => void;\n disabled?: boolean;\n error?: ReactNode;\n type?: \"numeric\" | \"alphanumeric\";\n mask?: boolean;\n autoFocus?: boolean;\n className?: string;\n}\n\nexport function OTPInput({\n label,\n length = 6,\n value,\n onChange,\n onComplete,\n disabled = false,\n error,\n type = \"numeric\",\n mask = false,\n autoFocus = false,\n className,\n}: OTPInputProps) {\n const refs = useRef<(HTMLInputElement | null)[]>([]);\n const pattern = type === \"numeric\" ? /[^0-9]/g : /[^a-zA-Z0-9]/g;\n\n const setCharAt = useCallback(\n (idx: number, ch: string) => {\n const cleaned = ch.replace(pattern, \"\").slice(0, 1);\n const chars = value.split(\"\");\n while (chars.length < length) chars.push(\"\");\n chars[idx] = cleaned;\n const next = chars.join(\"\").slice(0, length);\n onChange?.(next);\n if (cleaned && idx < length - 1) refs.current[idx + 1]?.focus();\n if (next.length === length && !next.includes(\"\")) onComplete?.(next);\n },\n [value, length, onChange, onComplete, pattern],\n );\n\n const handleKeyDown = (idx: number) => (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Backspace\" && !value[idx] && idx > 0) {\n refs.current[idx - 1]?.focus();\n }\n if (e.key === \"ArrowLeft\" && idx > 0) refs.current[idx - 1]?.focus();\n if (e.key === \"ArrowRight\" && idx < length - 1) refs.current[idx + 1]?.focus();\n };\n\n const handlePaste = (e: ClipboardEvent<HTMLInputElement>) => {\n e.preventDefault();\n const paste = e.clipboardData.getData(\"text\").replace(pattern, \"\").slice(0, length);\n onChange?.(paste);\n if (paste.length === length) onComplete?.(paste);\n refs.current[Math.min(paste.length, length - 1)]?.focus();\n };\n\n return (\n <div\n className={cn(\n \"ods-otp\",\n disabled && \"ods-otp--disabled\",\n error && \"ods-otp--error\",\n className,\n )}\n >\n {label && <label className=\"ods-otp__label\">{label}</label>}\n <div\n className=\"ods-otp__row\"\n role=\"group\"\n aria-label={typeof label === \"string\" ? label : \"One-time passcode\"}\n >\n {Array.from({ length }).map((_, i) => {\n const ch = value[i] ?? \"\";\n return (\n <input\n key={i}\n ref={(el) => {\n refs.current[i] = el;\n }}\n type={mask ? \"password\" : \"text\"}\n inputMode={type === \"numeric\" ? \"numeric\" : \"text\"}\n maxLength={1}\n value={ch}\n disabled={disabled}\n autoFocus={autoFocus && i === 0}\n onChange={(e) => setCharAt(i, e.target.value)}\n onKeyDown={handleKeyDown(i)}\n onPaste={handlePaste}\n className={cn(\"ods-otp__cell\", ch && \"ods-otp__cell--filled\")}\n aria-label={`Digit ${i + 1} of ${length}`}\n />\n );\n })}\n </div>\n {error && <div className=\"ods-otp__hint\">{error}</div>}\n </div>\n );\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface PageHeaderBreadcrumb {\n label: ReactNode;\n href?: string;\n onClick?: () => void;\n}\n\nexport interface PageHeaderProps {\n title: ReactNode;\n description?: ReactNode;\n breadcrumbs?: PageHeaderBreadcrumb[];\n actions?: ReactNode;\n meta?: ReactNode;\n className?: string;\n}\n\nexport function PageHeader({\n title,\n description,\n breadcrumbs,\n actions,\n meta,\n className,\n}: PageHeaderProps) {\n return (\n <header className={cn(\"ods-page-header\", className)}>\n <div className=\"ods-page-header__main\">\n {breadcrumbs && breadcrumbs.length > 0 && (\n <nav className=\"ods-page-header__crumbs\" aria-label=\"Breadcrumb\">\n {breadcrumbs.map((c, i) => (\n <span key={i} className=\"ods-page-header__crumb\">\n {c.href ? (\n <a href={c.href} onClick={c.onClick}>\n {c.label}\n </a>\n ) : c.onClick ? (\n <button type=\"button\" onClick={c.onClick}>\n {c.label}\n </button>\n ) : (\n <span>{c.label}</span>\n )}\n {i < breadcrumbs.length - 1 && (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"m4.5 3 3 3-3 3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </span>\n ))}\n </nav>\n )}\n <h1 className=\"ods-page-header__title\">{title}</h1>\n {description && <p className=\"ods-page-header__description\">{description}</p>}\n {meta && <div className=\"ods-page-header__meta\">{meta}</div>}\n </div>\n {actions && <div className=\"ods-page-header__actions\">{actions}</div>}\n </header>\n );\n}\n","\"use client\";\nimport { type ChangeEvent, type InputHTMLAttributes, type ReactNode, useState } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\ntype NativeProps = Omit<\n InputHTMLAttributes<HTMLInputElement>,\n \"type\" | \"size\" | \"value\" | \"onChange\"\n>;\n\nexport interface PasswordInputProps extends NativeProps {\n label?: ReactNode;\n value: string;\n onChange?: (value: string) => void;\n size?: \"sm\" | \"md\" | \"lg\";\n error?: ReactNode;\n helperText?: ReactNode;\n strength?: 0 | 1 | 2 | 3 | 4;\n showToggle?: boolean;\n leftIcon?: ReactNode;\n className?: string;\n}\n\nconst strengthLabels = [\"Very weak\", \"Weak\", \"Fair\", \"Strong\", \"Very strong\"] as const;\n\nexport function PasswordInput({\n label,\n value,\n onChange,\n size = \"md\",\n error,\n helperText,\n strength,\n showToggle = true,\n leftIcon,\n disabled,\n className,\n ...rest\n}: PasswordInputProps) {\n const [shown, setShown] = useState(false);\n const handle = (e: ChangeEvent<HTMLInputElement>) => onChange?.(e.target.value);\n\n return (\n <div\n className={cn(\n \"ods-pwd\",\n `ods-pwd--${size}`,\n disabled && \"ods-pwd--disabled\",\n error && \"ods-pwd--error\",\n className,\n )}\n >\n {label && <label className=\"ods-pwd__label\">{label}</label>}\n <div className=\"ods-pwd__field\">\n {leftIcon && (\n <span className=\"ods-pwd__icon\" aria-hidden=\"true\">\n {leftIcon}\n </span>\n )}\n <input\n {...rest}\n type={shown ? \"text\" : \"password\"}\n value={value}\n onChange={handle}\n disabled={disabled}\n className=\"ods-pwd__input\"\n />\n {showToggle && (\n <button\n type=\"button\"\n className=\"ods-pwd__toggle\"\n onClick={() => setShown((s) => !s)}\n aria-label={shown ? \"Hide password\" : \"Show password\"}\n disabled={disabled}\n >\n {shown ? (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M2 8c1.5-2.6 3.6-4 6-4s4.5 1.4 6 4c-1.5 2.6-3.6 4-6 4s-4.5-1.4-6-4z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.3\"\n />\n <circle cx=\"8\" cy=\"8\" r=\"1.8\" stroke=\"currentColor\" strokeWidth=\"1.3\" />\n <path\n d=\"M2 2l12 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.3\"\n strokeLinecap=\"round\"\n />\n </svg>\n ) : (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M2 8c1.5-2.6 3.6-4 6-4s4.5 1.4 6 4c-1.5 2.6-3.6 4-6 4s-4.5-1.4-6-4z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.3\"\n />\n <circle cx=\"8\" cy=\"8\" r=\"2\" stroke=\"currentColor\" strokeWidth=\"1.3\" />\n </svg>\n )}\n </button>\n )}\n </div>\n {typeof strength === \"number\" && (\n <div className=\"ods-pwd__strength\" data-level={strength}>\n <span className=\"ods-pwd__meter\">\n <span className={cn(\"ods-pwd__bar\", `ods-pwd__bar--${strength}`)} />\n </span>\n <span className=\"ods-pwd__strength-label\">{strengthLabels[strength]}</span>\n </div>\n )}\n {error ? (\n <div className=\"ods-pwd__hint ods-pwd__hint--error\">{error}</div>\n ) : helperText ? (\n <div className=\"ods-pwd__hint\">{helperText}</div>\n ) : null}\n </div>\n );\n}\n","\"use client\";\nimport { type ChangeEvent, type ReactNode, useState } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface CountryOption {\n code: string; // ISO-3166-1 alpha-2 (US, GB, IN, ...)\n name: string;\n dialCode: string; // \"+1\", \"+44\", \"+91\"\n flag?: string; // Emoji flag\n}\n\nexport interface PhoneInputProps {\n label?: ReactNode;\n value: string; // local number (without dial code)\n countryCode: string; // current selected country code (e.g. \"US\")\n onChange?: (value: string) => void;\n onCountryChange?: (code: string) => void;\n countries?: CountryOption[];\n placeholder?: string;\n size?: \"sm\" | \"md\" | \"lg\";\n disabled?: boolean;\n error?: ReactNode;\n helperText?: ReactNode;\n className?: string;\n}\n\nconst DEFAULT_COUNTRIES: CountryOption[] = [\n { code: \"US\", name: \"United States\", dialCode: \"+1\", flag: \"🇺🇸\" },\n { code: \"GB\", name: \"United Kingdom\", dialCode: \"+44\", flag: \"🇬🇧\" },\n { code: \"IN\", name: \"India\", dialCode: \"+91\", flag: \"🇮🇳\" },\n { code: \"DE\", name: \"Germany\", dialCode: \"+49\", flag: \"🇩🇪\" },\n { code: \"FR\", name: \"France\", dialCode: \"+33\", flag: \"🇫🇷\" },\n { code: \"JP\", name: \"Japan\", dialCode: \"+81\", flag: \"🇯🇵\" },\n { code: \"AU\", name: \"Australia\", dialCode: \"+61\", flag: \"🇦🇺\" },\n { code: \"BR\", name: \"Brazil\", dialCode: \"+55\", flag: \"🇧🇷\" },\n];\n\nexport function PhoneInput({\n label,\n value,\n countryCode,\n onChange,\n onCountryChange,\n countries = DEFAULT_COUNTRIES,\n placeholder = \"(555) 123-4567\",\n size = \"md\",\n disabled = false,\n error,\n helperText,\n className,\n}: PhoneInputProps) {\n const [open, setOpen] = useState(false);\n const country = countries.find((c) => c.code === countryCode) ?? countries[0];\n\n const onInput = (e: ChangeEvent<HTMLInputElement>) => onChange?.(e.target.value);\n\n return (\n <div\n className={cn(\n \"ods-phone\",\n `ods-phone--${size}`,\n disabled && \"ods-phone--disabled\",\n error && \"ods-phone--error\",\n className,\n )}\n >\n {label && <label className=\"ods-phone__label\">{label}</label>}\n <div className=\"ods-phone__field\">\n <button\n type=\"button\"\n className=\"ods-phone__country\"\n onClick={() => !disabled && setOpen((o) => !o)}\n disabled={disabled}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n >\n <span className=\"ods-phone__flag\" aria-hidden=\"true\">\n {country.flag}\n </span>\n <span className=\"ods-phone__dial\">{country.dialCode}</span>\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M3 4.5L6 7.5L9 4.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n <input\n type=\"tel\"\n className=\"ods-phone__input\"\n value={value}\n onChange={onInput}\n disabled={disabled}\n placeholder={placeholder}\n aria-label={typeof label === \"string\" ? `${label} number` : \"Phone number\"}\n />\n {open && (\n <ul className=\"ods-phone__menu\" role=\"listbox\" aria-label=\"Country\">\n {countries.map((c) => (\n <li key={c.code}>\n <button\n type=\"button\"\n role=\"option\"\n aria-selected={c.code === countryCode}\n className={cn(\n \"ods-phone__menu-item\",\n c.code === countryCode && \"ods-phone__menu-item--active\",\n )}\n onClick={() => {\n onCountryChange?.(c.code);\n setOpen(false);\n }}\n >\n <span className=\"ods-phone__flag\" aria-hidden=\"true\">\n {c.flag}\n </span>\n <span className=\"ods-phone__menu-name\">{c.name}</span>\n <span className=\"ods-phone__menu-dial\">{c.dialCode}</span>\n </button>\n </li>\n ))}\n </ul>\n )}\n </div>\n {error ? (\n <div className=\"ods-phone__hint ods-phone__hint--error\">{error}</div>\n ) : helperText ? (\n <div className=\"ods-phone__hint\">{helperText}</div>\n ) : null}\n </div>\n );\n}\n","\"use client\";\nimport { type ReactNode, useCallback, useEffect, useLayoutEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"../../utils/cn\";\n\nexport type PopoverPlacement = \"top\" | \"bottom\" | \"left\" | \"right\";\n\nexport interface PopoverProps {\n content: ReactNode;\n placement?: PopoverPlacement;\n offset?: number;\n open?: boolean; // controlled\n defaultOpen?: boolean; // uncontrolled\n onOpenChange?: (open: boolean) => void;\n trigger?: \"click\" | \"manual\";\n closeOnClickOutside?: boolean;\n closeOnEsc?: boolean;\n arrow?: boolean;\n children: ReactNode;\n className?: string;\n}\n\ninterface Coords {\n top: number;\n left: number;\n}\n\nfunction computePosition(\n rect: DOMRect,\n popRect: DOMRect,\n placement: PopoverPlacement,\n offset: number,\n): Coords {\n const cx = rect.left + rect.width / 2;\n const cy = rect.top + rect.height / 2;\n switch (placement) {\n case \"top\":\n return { top: rect.top - popRect.height - offset, left: cx - popRect.width / 2 };\n case \"bottom\":\n return { top: rect.bottom + offset, left: cx - popRect.width / 2 };\n case \"left\":\n return { top: cy - popRect.height / 2, left: rect.left - popRect.width - offset };\n case \"right\":\n return { top: cy - popRect.height / 2, left: rect.right + offset };\n }\n}\n\nexport function Popover({\n content,\n placement = \"bottom\",\n offset = 8,\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n trigger = \"click\",\n closeOnClickOutside = true,\n closeOnEsc = true,\n arrow = true,\n children,\n className,\n}: PopoverProps) {\n const [openState, setOpenState] = useState(defaultOpen);\n const open = openProp ?? openState;\n const setOpen = useCallback(\n (v: boolean) => {\n if (openProp === undefined) setOpenState(v);\n onOpenChange?.(v);\n },\n [openProp, onOpenChange],\n );\n\n const triggerRef = useRef<HTMLSpanElement>(null);\n const popRef = useRef<HTMLDivElement>(null);\n const [coords, setCoords] = useState<Coords | null>(null);\n\n const reposition = useCallback(() => {\n if (!triggerRef.current || !popRef.current) return;\n const trigRect = triggerRef.current.getBoundingClientRect();\n const popRect = popRef.current.getBoundingClientRect();\n setCoords(computePosition(trigRect, popRect, placement, offset));\n }, [placement, offset]);\n\n useLayoutEffect(() => {\n if (!open) return;\n reposition();\n const id = requestAnimationFrame(reposition);\n return () => cancelAnimationFrame(id);\n }, [open, reposition, content]);\n\n useEffect(() => {\n if (!open) return;\n const onScroll = () => reposition();\n window.addEventListener(\"scroll\", onScroll, true);\n window.addEventListener(\"resize\", onScroll);\n return () => {\n window.removeEventListener(\"scroll\", onScroll, true);\n window.removeEventListener(\"resize\", onScroll);\n };\n }, [open, reposition]);\n\n useEffect(() => {\n if (!open || !closeOnClickOutside) return;\n const onDoc = (e: MouseEvent) => {\n const t = e.target as Node;\n if (!triggerRef.current?.contains(t) && !popRef.current?.contains(t)) {\n setOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", onDoc);\n return () => document.removeEventListener(\"mousedown\", onDoc);\n }, [open, closeOnClickOutside, setOpen]);\n\n useEffect(() => {\n if (!open || !closeOnEsc) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") setOpen(false);\n };\n document.addEventListener(\"keydown\", onKey);\n return () => document.removeEventListener(\"keydown\", onKey);\n }, [open, closeOnEsc, setOpen]);\n\n // Wrapper span anchors the popover — works regardless of whether the\n // child component forwards refs (e.g. our Button doesn't).\n const triggerEl = (\n <span\n ref={triggerRef}\n className=\"ods-popover__anchor\"\n onClickCapture={() => {\n if (trigger === \"click\") setOpen(!open);\n }}\n aria-expanded={open}\n aria-haspopup=\"dialog\"\n >\n {children}\n </span>\n );\n\n const portal =\n typeof document !== \"undefined\" && open\n ? createPortal(\n <div\n ref={popRef}\n role=\"dialog\"\n data-placement={placement}\n className={cn(\"ods-popover\", className)}\n style={{\n position: \"fixed\",\n zIndex: 1000,\n top: coords?.top ?? -9999,\n left: coords?.left ?? -9999,\n visibility: coords ? \"visible\" : \"hidden\",\n }}\n >\n {content}\n {arrow && <span className=\"ods-popover__arrow\" aria-hidden=\"true\" />}\n </div>,\n document.body,\n )\n : null;\n\n return (\n <>\n {triggerEl}\n {portal}\n </>\n );\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface PricingCardProps {\n name: ReactNode;\n description?: ReactNode;\n price: ReactNode;\n pricePeriod?: ReactNode;\n features: ReactNode[];\n badge?: ReactNode;\n highlighted?: boolean;\n cta?: ReactNode;\n className?: string;\n}\n\nexport function PricingCard({\n name,\n description,\n price,\n pricePeriod = \"/month\",\n features,\n badge,\n highlighted = false,\n cta,\n className,\n}: PricingCardProps) {\n return (\n <div className={cn(\"ods-pricing\", highlighted && \"ods-pricing--highlighted\", className)}>\n <div className=\"ods-pricing__head\">\n {badge && <span className=\"ods-pricing__badge\">{badge}</span>}\n <h3 className=\"ods-pricing__name\">{name}</h3>\n {description && <p className=\"ods-pricing__desc\">{description}</p>}\n </div>\n <div className=\"ods-pricing__price\">\n <span className=\"ods-pricing__amount\">{price}</span>\n {pricePeriod && <span className=\"ods-pricing__period\">{pricePeriod}</span>}\n </div>\n <hr className=\"ods-pricing__sep\" />\n <ul className=\"ods-pricing__features\">\n {features.map((f, i) => (\n <li key={i} className=\"ods-pricing__feature\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"m3 8.5 3 3 7-7\"\n stroke=\"#16a34a\"\n strokeWidth=\"1.7\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n <span>{f}</span>\n </li>\n ))}\n </ul>\n {cta && <div className=\"ods-pricing__cta\">{cta}</div>}\n </div>\n );\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface ProductCardProps {\n image?: ReactNode;\n tag?: ReactNode;\n name: ReactNode;\n description?: ReactNode;\n price: ReactNode;\n originalPrice?: ReactNode;\n action?: ReactNode;\n className?: string;\n}\n\nexport function ProductCard({\n image,\n tag,\n name,\n description,\n price,\n originalPrice,\n action,\n className,\n}: ProductCardProps) {\n return (\n <div className={cn(\"ods-product-card\", className)}>\n <div className=\"ods-product-card__image\">{image}</div>\n {tag && <span className=\"ods-product-card__tag\">{tag}</span>}\n <div className=\"ods-product-card__name\">{name}</div>\n {description && <div className=\"ods-product-card__desc\">{description}</div>}\n <div className=\"ods-product-card__footer\">\n <div className=\"ods-product-card__price-group\">\n <span className=\"ods-product-card__price\">{price}</span>\n {originalPrice && <span className=\"ods-product-card__strike\">{originalPrice}</span>}\n </div>\n {action && <div className=\"ods-product-card__action\">{action}</div>}\n </div>\n </div>\n );\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface ProgressRingProps {\n value: number; // 0–100\n max?: number;\n size?: number; // px diameter\n strokeWidth?: number;\n variant?: \"primary\" | \"success\" | \"warning\" | \"error\" | \"neutral\";\n trackColor?: string;\n fillColor?: string;\n label?: ReactNode; // override default centered \"{value}%\" label\n showValue?: boolean;\n indeterminate?: boolean;\n className?: string;\n}\n\nconst VARIANT_COLORS: Record<NonNullable<ProgressRingProps[\"variant\"]>, string> = {\n primary: \"#6c5ce7\",\n success: \"#16a34a\",\n warning: \"#d97706\",\n error: \"#dc2626\",\n neutral: \"#6b7280\",\n};\n\nexport function ProgressRing({\n value,\n max = 100,\n size = 120,\n strokeWidth = 10,\n variant = \"primary\",\n trackColor = \"#f3f1ff\",\n fillColor,\n label,\n showValue = true,\n indeterminate = false,\n className,\n}: ProgressRingProps) {\n const r = (size - strokeWidth) / 2;\n const c = 2 * Math.PI * r;\n const pct = Math.max(0, Math.min(1, value / max));\n const dashOffset = c * (1 - pct);\n const stroke = fillColor ?? VARIANT_COLORS[variant];\n\n return (\n <div\n className={cn(\n \"ods-progress-ring\",\n indeterminate && \"ods-progress-ring--indeterminate\",\n className,\n )}\n style={{ width: size, height: size }}\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={max}\n aria-valuenow={indeterminate ? undefined : value}\n >\n <svg className=\"ods-progress-ring__svg\" width={size} height={size}>\n <circle\n className=\"ods-progress-ring__track\"\n cx={size / 2}\n cy={size / 2}\n r={r}\n fill=\"none\"\n stroke={trackColor}\n strokeWidth={strokeWidth}\n />\n <circle\n className=\"ods-progress-ring__fill\"\n cx={size / 2}\n cy={size / 2}\n r={r}\n fill=\"none\"\n stroke={stroke}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeDasharray={c}\n strokeDashoffset={indeterminate ? c * 0.75 : dashOffset}\n transform={`rotate(-90 ${size / 2} ${size / 2})`}\n />\n </svg>\n {!indeterminate && (label || showValue) && (\n <div className=\"ods-progress-ring__center\">\n {label ?? <span className=\"ods-progress-ring__value\">{Math.round(pct * 100)}%</span>}\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\nimport {\n type DragEvent,\n type KeyboardEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { sanitizeImageUrl } from \"../../utils/sanitizeUrl\";\n\nexport interface PromptInputAttachment {\n id: string;\n name: string;\n size?: number;\n type?: string;\n url?: string;\n /** Optional preview thumbnail URL */\n previewUrl?: string;\n}\n\nexport interface PromptInputSuggestion {\n id: string;\n label: ReactNode;\n description?: ReactNode;\n icon?: ReactNode;\n insert: string;\n}\n\nexport interface PromptInputQuickAction {\n id: string;\n label: ReactNode;\n icon?: ReactNode;\n /** When clicked, set this as the input value (or append). */\n prompt: string;\n /** Replace current value (true) or append (false). Default true. */\n replace?: boolean;\n}\n\nexport interface PromptInputProps {\n value?: string;\n defaultValue?: string;\n onChange?: (value: string) => void;\n onSubmit?: (value: string, attachments: PromptInputAttachment[]) => void | Promise<void>;\n placeholder?: string;\n disabled?: boolean;\n /** Show send button. Default true. */\n showSend?: boolean;\n /** \"running\" disables send + shows stop. */\n status?: \"idle\" | \"running\" | \"error\";\n onStop?: () => void;\n /** Custom toolbar slot on the left. */\n leftActions?: ReactNode;\n /** Custom toolbar slot above-right of textarea. */\n rightActions?: ReactNode;\n /** Attachments rendered as removable chips above textarea. */\n attachments?: PromptInputAttachment[];\n onRemoveAttachment?: (id: string) => void;\n /** Called when files are pasted or dropped onto the input. */\n onAttachFiles?: (files: File[]) => void;\n /** Slash-command/mention suggestions. */\n suggestions?: PromptInputSuggestion[];\n /** Quick action chips below the input. Click to fill the prompt. */\n quickActions?: PromptInputQuickAction[];\n /** Maximum visible rows before scrolling. */\n maxRows?: number;\n /** Minimum visible rows. */\n minRows?: number;\n /** Submit on Enter (without Shift). Default true. */\n submitOnEnter?: boolean;\n /** Caption / hint below the input. */\n hint?: ReactNode;\n /** Optional max character length — shows counter and prevents typing beyond. */\n maxLength?: number;\n /** Show character counter even when no maxLength is set. Default false. */\n showCounter?: boolean;\n /** Recall previously submitted prompts with ↑ when input is empty. */\n history?: string[];\n className?: string;\n /** aria-label on the textarea. */\n ariaLabel?: string;\n}\n\nconst ATTACH_GLYPH = (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M10.5 7 6.4 11.1a2 2 0 1 1-2.8-2.8L8.3 3.6a3 3 0 0 1 4.2 4.2l-5.6 5.6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nconst SEND_GLYPH = (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"m2 7 10-5-4 10-1.5-3.5L2 7Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinejoin=\"round\"\n fill=\"currentColor\"\n fillOpacity=\"0.15\"\n />\n </svg>\n);\n\nconst STOP_GLYPH = (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"currentColor\" aria-hidden=\"true\">\n <rect x=\"2\" y=\"2\" width=\"8\" height=\"8\" rx=\"1\" />\n </svg>\n);\n\nexport function PromptInput({\n value,\n defaultValue = \"\",\n onChange,\n onSubmit,\n placeholder = \"Ask anything…\",\n disabled = false,\n showSend = true,\n status = \"idle\",\n onStop,\n leftActions,\n rightActions,\n attachments = [],\n onRemoveAttachment,\n onAttachFiles,\n suggestions,\n quickActions,\n maxRows = 8,\n minRows = 1,\n submitOnEnter = true,\n hint,\n maxLength,\n showCounter = false,\n history,\n className,\n ariaLabel = \"Prompt\",\n}: PromptInputProps) {\n const taRef = useRef<HTMLTextAreaElement>(null);\n const [internal, setInternal] = useState(defaultValue);\n const v = value ?? internal;\n const isControlled = value !== undefined;\n\n const [suggestionsOpen, setSuggestionsOpen] = useState(false);\n const [suggestionIndex, setSuggestionIndex] = useState(0);\n const [isDragOver, setIsDragOver] = useState(false);\n const [historyIdx, setHistoryIdx] = useState<number | null>(null);\n\n const setValue = useCallback(\n (next: string) => {\n if (!isControlled) setInternal(next);\n onChange?.(next);\n },\n [isControlled, onChange],\n );\n\n // Auto-resize textarea\n useEffect(() => {\n const el = taRef.current;\n if (!el) return;\n const computed = window.getComputedStyle(el);\n const lh = parseFloat(computed.lineHeight) || 20;\n const padding = parseFloat(computed.paddingTop) + parseFloat(computed.paddingBottom);\n const min = lh * minRows + padding;\n const max = lh * maxRows + padding;\n el.style.height = \"auto\";\n const next = Math.max(min, Math.min(max, el.scrollHeight));\n el.style.height = `${next}px`;\n el.style.overflowY = el.scrollHeight > max ? \"auto\" : \"hidden\";\n }, [v, minRows, maxRows]);\n\n const handleSubmit = () => {\n if (status === \"running\" || disabled) return;\n const trimmed = v.trim();\n if (!trimmed && attachments.length === 0) return;\n onSubmit?.(v, attachments);\n setHistoryIdx(null);\n };\n\n const visibleSuggestions = (() => {\n if (!suggestions || !suggestionsOpen) return [];\n const lastLine = v.split(\"\\n\").pop() ?? \"\";\n if (!lastLine.startsWith(\"/\")) return [];\n const q = lastLine.slice(1).toLowerCase();\n return suggestions\n .filter((s) => (typeof s.label === \"string\" ? s.label.toLowerCase().includes(q) : true))\n .slice(0, 8);\n })();\n\n const handleKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n // Slash suggestions navigation\n if (visibleSuggestions.length > 0) {\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setSuggestionIndex((i) => Math.min(i + 1, visibleSuggestions.length - 1));\n return;\n }\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setSuggestionIndex((i) => Math.max(i - 1, 0));\n return;\n }\n if (e.key === \"Enter\" || e.key === \"Tab\") {\n e.preventDefault();\n const pick = visibleSuggestions[suggestionIndex];\n if (pick) {\n const lines = v.split(\"\\n\");\n lines[lines.length - 1] = pick.insert;\n setValue(lines.join(\"\\n\"));\n setSuggestionsOpen(false);\n }\n return;\n }\n if (e.key === \"Escape\") {\n e.preventDefault();\n setSuggestionsOpen(false);\n return;\n }\n }\n\n // History recall (↑ on empty / ↓ when scrolling history)\n if (history && history.length > 0) {\n if (e.key === \"ArrowUp\" && (v === \"\" || historyIdx != null) && !e.shiftKey) {\n e.preventDefault();\n const nextIdx = historyIdx == null ? history.length - 1 : Math.max(0, historyIdx - 1);\n setHistoryIdx(nextIdx);\n setValue(history[nextIdx]);\n return;\n }\n if (e.key === \"ArrowDown\" && historyIdx != null && !e.shiftKey) {\n e.preventDefault();\n const nextIdx = historyIdx + 1;\n if (nextIdx >= history.length) {\n setHistoryIdx(null);\n setValue(\"\");\n } else {\n setHistoryIdx(nextIdx);\n setValue(history[nextIdx]);\n }\n return;\n }\n }\n\n if (e.key === \"Enter\" && submitOnEnter && !e.shiftKey) {\n e.preventDefault();\n handleSubmit();\n }\n if (e.key === \"/\" && (v === \"\" || v.endsWith(\"\\n\"))) {\n setSuggestionsOpen(true);\n setSuggestionIndex(0);\n }\n };\n\n // ── Paste support (files / images) ──────────────────────────\n const handlePaste = (e: React.ClipboardEvent<HTMLTextAreaElement>) => {\n if (!onAttachFiles) return;\n const items = e.clipboardData?.items;\n if (!items) return;\n const files: File[] = [];\n for (const it of Array.from(items)) {\n if (it.kind === \"file\") {\n const f = it.getAsFile();\n if (f) files.push(f);\n }\n }\n if (files.length > 0) {\n e.preventDefault();\n onAttachFiles(files);\n }\n };\n\n // ── Drag-and-drop onto the input ────────────────────────────\n const handleDragEnter = (e: DragEvent) => {\n if (!onAttachFiles || disabled) return;\n if (!e.dataTransfer.types.includes(\"Files\")) return;\n e.preventDefault();\n setIsDragOver(true);\n };\n const handleDragOver = (e: DragEvent) => {\n if (!onAttachFiles || disabled) return;\n if (!e.dataTransfer.types.includes(\"Files\")) return;\n e.preventDefault();\n e.dataTransfer.dropEffect = \"copy\";\n };\n const handleDragLeave = (e: DragEvent) => {\n if (!onAttachFiles || disabled) return;\n const next = e.relatedTarget as Node | null;\n if (next && e.currentTarget.contains(next)) return;\n setIsDragOver(false);\n };\n const handleDrop = (e: DragEvent) => {\n if (!onAttachFiles || disabled) return;\n e.preventDefault();\n setIsDragOver(false);\n const files = Array.from(e.dataTransfer.files);\n if (files.length > 0) onAttachFiles(files);\n };\n\n const fmtSize = (size?: number) => {\n if (size == null) return \"\";\n const kb = size / 1024;\n if (kb < 1) return `${size} B`;\n if (kb < 1024) return `${kb.toFixed(1)} KB`;\n return `${(kb / 1024).toFixed(1)} MB`;\n };\n\n const canSubmit =\n (v.trim().length > 0 || attachments.length > 0) && status !== \"running\" && !disabled;\n\n const charCount = v.length;\n const showCharCounter = showCounter || maxLength != null;\n const overLimit = maxLength != null && charCount > maxLength;\n\n return (\n <div\n className={cn(\n \"ods-prompt-input\",\n status === \"running\" && \"ods-prompt-input--running\",\n status === \"error\" && \"ods-prompt-input--error\",\n disabled && \"ods-prompt-input--disabled\",\n isDragOver && \"ods-prompt-input--drag-over\",\n className,\n )}\n onDragEnter={handleDragEnter}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n >\n {/* Drag overlay */}\n {isDragOver && (\n <div className=\"ods-prompt-input__drop-overlay\" aria-hidden=\"true\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M10 3v9M6 7l4-4 4 4M3 15h14\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n <span>Drop files to attach</span>\n </div>\n )}\n\n {/* Attachments */}\n {attachments.length > 0 && (\n <div className=\"ods-prompt-input__attachments\">\n {attachments.map((a) => {\n const safePreview = sanitizeImageUrl(a.previewUrl);\n return (\n <span key={a.id} className=\"ods-prompt-input__chip\" title={a.name}>\n <span className=\"ods-prompt-input__chip-glyph\" aria-hidden=\"true\">\n {safePreview ? (\n <img src={safePreview} alt=\"\" className=\"ods-prompt-input__chip-thumb\" />\n ) : (\n ATTACH_GLYPH\n )}\n </span>\n <span className=\"ods-prompt-input__chip-label\">{a.name}</span>\n {a.size != null && <span className=\"ods-prompt-input__chip-size\">{fmtSize(a.size)}</span>}\n {onRemoveAttachment && (\n <button\n type=\"button\"\n className=\"ods-prompt-input__chip-remove\"\n onClick={() => onRemoveAttachment(a.id)}\n aria-label={`Remove ${a.name}`}\n >\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"m2.5 2.5 5 5M7.5 2.5l-5 5\" stroke=\"currentColor\" strokeWidth=\"1.4\" strokeLinecap=\"round\" />\n </svg>\n </button>\n )}\n </span>\n );\n })}\n </div>\n )}\n\n <div className=\"ods-prompt-input__field\">\n <textarea\n ref={taRef}\n value={v}\n onChange={(e) => {\n const next = maxLength != null ? e.target.value.slice(0, maxLength) : e.target.value;\n setValue(next);\n if (historyIdx != null) setHistoryIdx(null);\n }}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n onBlur={() => setSuggestionsOpen(false)}\n placeholder={placeholder}\n disabled={disabled}\n rows={minRows}\n aria-label={ariaLabel}\n className=\"ods-prompt-input__textarea\"\n maxLength={maxLength}\n />\n\n {visibleSuggestions.length > 0 && (\n <ul className=\"ods-prompt-input__suggestions\" role=\"listbox\">\n {visibleSuggestions.map((s, i) => (\n <li\n key={s.id}\n role=\"option\"\n aria-selected={i === suggestionIndex}\n className={cn(\n \"ods-prompt-input__suggestion\",\n i === suggestionIndex && \"ods-prompt-input__suggestion--active\",\n )}\n onMouseDown={(e) => {\n e.preventDefault();\n const lines = v.split(\"\\n\");\n lines[lines.length - 1] = s.insert;\n setValue(lines.join(\"\\n\"));\n setSuggestionsOpen(false);\n }}\n onMouseEnter={() => setSuggestionIndex(i)}\n >\n {s.icon && <span className=\"ods-prompt-input__suggestion-icon\">{s.icon}</span>}\n <span className=\"ods-prompt-input__suggestion-text\">\n <span className=\"ods-prompt-input__suggestion-label\">{s.label}</span>\n {s.description && (\n <span className=\"ods-prompt-input__suggestion-desc\">{s.description}</span>\n )}\n </span>\n </li>\n ))}\n </ul>\n )}\n </div>\n\n {/* Toolbar */}\n <div className=\"ods-prompt-input__toolbar\">\n <div className=\"ods-prompt-input__toolbar-left\">{leftActions}</div>\n <div className=\"ods-prompt-input__toolbar-right\">\n {showCharCounter && (\n <span\n className={cn(\n \"ods-prompt-input__count\",\n overLimit && \"ods-prompt-input__count--over\",\n )}\n >\n {maxLength != null ? `${charCount}/${maxLength}` : charCount}\n </span>\n )}\n {rightActions}\n {status === \"running\" ? (\n <button\n type=\"button\"\n className=\"ods-prompt-input__send ods-prompt-input__send--stop\"\n onClick={onStop}\n aria-label=\"Stop generating\"\n >\n {STOP_GLYPH}\n <span>Stop</span>\n </button>\n ) : (\n showSend && (\n <button\n type=\"button\"\n className={cn(\n \"ods-prompt-input__send\",\n !canSubmit && \"ods-prompt-input__send--disabled\",\n )}\n onClick={handleSubmit}\n disabled={!canSubmit}\n aria-label=\"Send\"\n >\n {SEND_GLYPH}\n </button>\n )\n )}\n </div>\n </div>\n\n {/* Quick actions */}\n {quickActions && quickActions.length > 0 && (\n <div className=\"ods-prompt-input__quick-actions\" role=\"toolbar\" aria-label=\"Quick prompts\">\n {quickActions.map((q) => (\n <button\n key={q.id}\n type=\"button\"\n className=\"ods-prompt-input__quick-action\"\n onClick={() => {\n const next = q.replace === false ? `${v}${v.length > 0 ? \" \" : \"\"}${q.prompt}` : q.prompt;\n setValue(next);\n requestAnimationFrame(() => taRef.current?.focus());\n }}\n >\n {q.icon && <span className=\"ods-prompt-input__quick-action-icon\">{q.icon}</span>}\n <span>{q.label}</span>\n </button>\n ))}\n </div>\n )}\n\n {hint && <div className=\"ods-prompt-input__hint\">{hint}</div>}\n </div>\n );\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface QuoteProps {\n variant?: \"default\" | \"muted\" | \"primary\";\n author?: ReactNode;\n attribution?: ReactNode;\n size?: \"sm\" | \"md\" | \"lg\";\n children: ReactNode;\n className?: string;\n}\n\nexport function Quote({\n variant = \"default\",\n author,\n attribution,\n size = \"md\",\n children,\n className,\n}: QuoteProps) {\n return (\n <blockquote\n className={cn(\"ods-quote\", `ods-quote--${variant}`, `ods-quote--${size}`, className)}\n >\n <span className=\"ods-quote__mark\" aria-hidden=\"true\">\n \"\n </span>\n <p className=\"ods-quote__text\">{children}</p>\n {(author || attribution) && (\n <footer className=\"ods-quote__footer\">\n {author && <cite className=\"ods-quote__author\">{author}</cite>}\n {attribution && <span className=\"ods-quote__attribution\">{attribution}</span>}\n </footer>\n )}\n </blockquote>\n );\n}\n","\"use client\";\nimport { useRef } from \"react\";\nimport { useRadio } from \"react-aria\";\nimport { cn } from \"../../utils/cn\";\nimport { useRadioGroupContext } from \"./RadioGroup\";\n\nexport interface RadioProps {\n value: string;\n label?: string;\n disabled?: boolean;\n className?: string;\n}\n\nexport function Radio({ value, label, disabled = false, className }: RadioProps) {\n const state = useRadioGroupContext();\n const ref = useRef<HTMLInputElement>(null);\n\n const { inputProps } = useRadio(\n {\n value,\n isDisabled: disabled,\n \"aria-label\": label,\n },\n state,\n ref,\n );\n\n const isSelected = state.selectedValue === value;\n\n return (\n <label\n className={cn(\n \"ods-radio\",\n isSelected && \"ods-radio--selected\",\n disabled && \"ods-radio--disabled\",\n className,\n )}\n >\n <input {...inputProps} ref={ref} className={\"ods-radio__input\"} />\n <div className={\"ods-radio__circle\"} aria-hidden=\"true\">\n <div className={cn(\"ods-radio__dot\", isSelected && \"ods-radio__dot--visible\")} />\n </div>\n {label && <span className={\"ods-radio__label\"}>{label}</span>}\n </label>\n );\n}\n","\"use client\";\nimport { createContext, type ReactNode, useContext, useRef } from \"react\";\nimport { useRadioGroup } from \"react-aria\";\nimport { type RadioGroupState, useRadioGroupState } from \"react-stately\";\nimport { cn } from \"../../utils/cn\";\n\nexport const RadioGroupContext = createContext<RadioGroupState | null>(null);\n\nexport function useRadioGroupContext() {\n const context = useContext(RadioGroupContext);\n if (!context) {\n throw new Error(\"Radio must be used within a RadioGroup\");\n }\n return context;\n}\n\nexport interface RadioGroupProps {\n value?: string;\n defaultValue?: string;\n onChange?: (value: string) => void;\n label?: string | ReactNode;\n orientation?: \"horizontal\" | \"vertical\";\n disabled?: boolean;\n children: ReactNode;\n className?: string;\n}\n\nexport function RadioGroup({\n value,\n defaultValue,\n onChange,\n label,\n orientation = \"vertical\",\n disabled = false,\n children,\n className,\n}: RadioGroupProps) {\n const ariaProps = {\n label: typeof label === \"string\" ? label : \"radio group\",\n value,\n defaultValue,\n onChange,\n isDisabled: disabled,\n orientation,\n };\n\n const state = useRadioGroupState(ariaProps);\n const ref = useRef<HTMLDivElement>(null);\n const { radioGroupProps, labelProps } = useRadioGroup(ariaProps, state);\n\n return (\n <div\n {...radioGroupProps}\n ref={ref}\n className={cn(\n \"ods-radio-group\",\n `ods-radio-group--${orientation}`,\n disabled && \"ods-radio-group--disabled\",\n className,\n )}\n >\n {label && (\n <span {...labelProps} className={\"ods-radio-group__label\"}>\n {label}\n </span>\n )}\n <RadioGroupContext.Provider value={state}>\n <div className={\"ods-radio-group__items\"}>{children}</div>\n </RadioGroupContext.Provider>\n </div>\n );\n}\n","\"use client\";\nimport type { ChangeEvent, ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface RangeSliderProps {\n label?: ReactNode;\n value: [number, number];\n onChange?: (value: [number, number]) => void;\n min?: number;\n max?: number;\n step?: number;\n formatValue?: (value: number) => ReactNode;\n showValue?: boolean;\n size?: \"sm\" | \"md\" | \"lg\";\n disabled?: boolean;\n className?: string;\n}\n\nexport function RangeSlider({\n label,\n value,\n onChange,\n min = 0,\n max = 100,\n step = 1,\n formatValue,\n showValue = true,\n size = \"md\",\n disabled = false,\n className,\n}: RangeSliderProps) {\n const [lo, hi] = value;\n const fmt = (v: number) => (formatValue ? formatValue(v) : `${v}`);\n const span = max - min || 1;\n const loPct = ((lo - min) / span) * 100;\n const hiPct = ((hi - min) / span) * 100;\n\n const setLo = (e: ChangeEvent<HTMLInputElement>) => {\n const next = Math.min(Number(e.target.value), hi);\n onChange?.([next, hi]);\n };\n const setHi = (e: ChangeEvent<HTMLInputElement>) => {\n const next = Math.max(Number(e.target.value), lo);\n onChange?.([lo, next]);\n };\n\n return (\n <div\n className={cn(\n \"ods-range-slider\",\n `ods-range-slider--${size}`,\n disabled && \"ods-range-slider--disabled\",\n className,\n )}\n >\n {(label || showValue) && (\n <div className=\"ods-range-slider__head\">\n {label && <span className=\"ods-range-slider__label\">{label}</span>}\n {showValue && (\n <span className=\"ods-range-slider__value\">\n {fmt(lo)} – {fmt(hi)}\n </span>\n )}\n </div>\n )}\n <div className=\"ods-range-slider__track\">\n <span\n className=\"ods-range-slider__fill\"\n style={{ left: `${loPct}%`, right: `${100 - hiPct}%` }}\n />\n <input\n type=\"range\"\n className=\"ods-range-slider__input ods-range-slider__input--lo\"\n min={min}\n max={max}\n step={step}\n value={lo}\n onChange={setLo}\n disabled={disabled}\n aria-label=\"Minimum\"\n />\n <input\n type=\"range\"\n className=\"ods-range-slider__input ods-range-slider__input--hi\"\n min={min}\n max={max}\n step={step}\n value={hi}\n onChange={setHi}\n disabled={disabled}\n aria-label=\"Maximum\"\n />\n </div>\n </div>\n );\n}\n","\"use client\";\nimport { type ReactNode, useState } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface RatingProps {\n value: number;\n onChange?: (value: number) => void;\n max?: number;\n size?: \"sm\" | \"md\" | \"lg\";\n allowHalf?: boolean;\n readOnly?: boolean;\n disabled?: boolean;\n showLabel?: boolean;\n label?: ReactNode;\n icon?: \"star\" | \"heart\";\n className?: string;\n}\n\nfunction StarIcon({ fill }: { fill: number }) {\n const pathId = `r-${Math.random().toString(36).slice(2)}`;\n return (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 22 22\" fill=\"none\" aria-hidden=\"true\">\n <defs>\n <linearGradient id={pathId} x1=\"0\" x2=\"1\" y1=\"0\" y2=\"0\">\n <stop offset={`${fill * 100}%`} stopColor=\"#f59e0b\" />\n <stop offset={`${fill * 100}%`} stopColor=\"#e1e5eb\" />\n </linearGradient>\n </defs>\n <path\n d=\"M11 2l2.6 5.4 6 .9-4.3 4.2 1 6-5.3-2.8-5.3 2.8 1-6L2 8.3l6-.9L11 2z\"\n fill={`url(#${pathId})`}\n stroke=\"currentColor\"\n strokeWidth=\"0.6\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction HeartIcon({ fill }: { fill: number }) {\n const pathId = `h-${Math.random().toString(36).slice(2)}`;\n return (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 22 22\" fill=\"none\" aria-hidden=\"true\">\n <defs>\n <linearGradient id={pathId} x1=\"0\" x2=\"1\" y1=\"0\" y2=\"0\">\n <stop offset={`${fill * 100}%`} stopColor=\"#ec4899\" />\n <stop offset={`${fill * 100}%`} stopColor=\"#e1e5eb\" />\n </linearGradient>\n </defs>\n <path\n d=\"M11 18s-6-4-6-8.5A3.5 3.5 0 0 1 11 6a3.5 3.5 0 0 1 6 3.5c0 4.5-6 8.5-6 8.5z\"\n fill={`url(#${pathId})`}\n stroke=\"currentColor\"\n strokeWidth=\"0.6\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nexport function Rating({\n value,\n onChange,\n max = 5,\n size = \"md\",\n allowHalf = false,\n readOnly = false,\n disabled = false,\n showLabel = false,\n label,\n icon = \"star\",\n className,\n}: RatingProps) {\n const [hover, setHover] = useState<number | null>(null);\n const display = hover ?? value;\n const interactive = !readOnly && !disabled;\n const Icon = icon === \"heart\" ? HeartIcon : StarIcon;\n\n const click = (idx: number, half: boolean) => {\n if (!interactive) return;\n onChange?.(half ? idx + 0.5 : idx + 1);\n };\n\n return (\n <div\n className={cn(\n \"ods-rating\",\n `ods-rating--${size}`,\n readOnly && \"ods-rating--readonly\",\n disabled && \"ods-rating--disabled\",\n interactive && \"ods-rating--interactive\",\n className,\n )}\n role=\"radiogroup\"\n aria-label={typeof label === \"string\" ? label : \"Rating\"}\n >\n {Array.from({ length: max }).map((_, i) => {\n const fill = Math.max(0, Math.min(1, display - i));\n return (\n <button\n key={i}\n type=\"button\"\n role=\"radio\"\n aria-checked={Math.ceil(value) === i + 1}\n disabled={!interactive}\n onMouseLeave={() => setHover(null)}\n className=\"ods-rating__item\"\n >\n <span\n className=\"ods-rating__half ods-rating__half--left\"\n onMouseEnter={() => interactive && allowHalf && setHover(i + 0.5)}\n onClick={() => click(i, allowHalf)}\n />\n <span\n className=\"ods-rating__half ods-rating__half--right\"\n onMouseEnter={() => interactive && setHover(i + 1)}\n onClick={() => click(i, false)}\n />\n <Icon fill={fill} />\n </button>\n );\n })}\n {showLabel && (\n <span className=\"ods-rating__label\">\n {typeof label === \"string\" || label\n ? label\n : `${value.toFixed(allowHalf ? 1 : 0)}/${max}`}\n </span>\n )}\n </div>\n );\n}\n","\"use client\";\nimport {\n type CSSProperties,\n type ReactNode,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport type ResizableDirection = \"horizontal\" | \"vertical\";\n\nexport interface ResizablePanelProps {\n /** Initial size in pixels OR as a fraction of the total (0–1). */\n defaultSize?: number;\n /** Minimum size in pixels. */\n minSize?: number;\n /** Maximum size in pixels. */\n maxSize?: number;\n /** Controlled size (when provided, Resizable becomes controlled). */\n size?: number;\n onResize?: (size: number) => void;\n children: ReactNode;\n className?: string;\n}\n\nexport interface ResizableProps {\n /** \"horizontal\" → left/right panels with vertical handle; \"vertical\" → top/bottom with horizontal handle. */\n direction?: ResizableDirection;\n /** Two slots — first panel + second panel. The handle goes between them. */\n children: [ReactNode, ReactNode];\n /** Initial split point in pixels OR a fraction (0..1). Defaults to 0.5. */\n defaultSplit?: number;\n /** Minimum size of the FIRST panel in pixels. */\n minFirst?: number;\n /** Minimum size of the SECOND panel in pixels. */\n minSecond?: number;\n /** Controlled split (when provided, Resizable is controlled). */\n split?: number;\n onSplitChange?: (size: number) => void;\n /** Persist the split to localStorage under this key. */\n storageKey?: string;\n /** Style overrides. */\n style?: CSSProperties;\n className?: string;\n /** ARIA labels for the handle. */\n ariaLabel?: string;\n}\n\n/**\n * Two-panel split with a draggable handle. The first panel is sized in px;\n * the second panel fills the remaining space.\n */\nexport function Resizable({\n direction = \"horizontal\",\n children,\n defaultSplit = 0.5,\n minFirst = 120,\n minSecond = 120,\n split: splitProp,\n onSplitChange,\n storageKey,\n style,\n className,\n ariaLabel = \"Resize panels\",\n}: ResizableProps) {\n const wrapRef = useRef<HTMLDivElement>(null);\n const [internalSplit, setInternalSplit] = useState<number | null>(() => {\n if (typeof window === \"undefined\" || !storageKey) return null;\n const stored = window.localStorage.getItem(storageKey);\n if (stored != null) {\n const n = Number(stored);\n if (Number.isFinite(n)) return n;\n }\n return null;\n });\n const draggingRef = useRef(false);\n const [isDragging, setDragging] = useState(false);\n\n // Resolve the active split value (controlled / internal / default)\n const computeFromDefault = useCallback(() => {\n const el = wrapRef.current;\n if (!el) return 240;\n const total = direction === \"horizontal\" ? el.offsetWidth : el.offsetHeight;\n return defaultSplit > 0 && defaultSplit < 1 ? total * defaultSplit : defaultSplit;\n }, [direction, defaultSplit]);\n\n const [split, setSplit] = useState<number>(() => {\n if (splitProp != null) return splitProp;\n if (internalSplit != null) return internalSplit;\n return defaultSplit > 0 && defaultSplit < 1 ? 0 : defaultSplit;\n });\n\n // After mount, if we still have a fractional default, resolve to px\n useEffect(() => {\n if (splitProp != null) {\n setSplit(splitProp);\n return;\n }\n if (internalSplit != null) {\n setSplit(internalSplit);\n return;\n }\n if (defaultSplit > 0 && defaultSplit < 1) {\n setSplit(computeFromDefault());\n } else {\n setSplit(defaultSplit);\n }\n }, [splitProp, internalSplit, defaultSplit, computeFromDefault]);\n\n const persist = useCallback(\n (next: number) => {\n onSplitChange?.(next);\n if (splitProp == null) setInternalSplit(next);\n if (storageKey && typeof window !== \"undefined\") {\n try {\n window.localStorage.setItem(storageKey, String(next));\n } catch {\n /* ignore */\n }\n }\n },\n [onSplitChange, splitProp, storageKey],\n );\n\n const onMouseDown = (e: React.MouseEvent) => {\n e.preventDefault();\n draggingRef.current = true;\n setDragging(true);\n };\n\n useEffect(() => {\n const onMove = (e: MouseEvent) => {\n if (!draggingRef.current) return;\n const el = wrapRef.current;\n if (!el) return;\n const rect = el.getBoundingClientRect();\n const total = direction === \"horizontal\" ? rect.width : rect.height;\n const point = direction === \"horizontal\" ? e.clientX - rect.left : e.clientY - rect.top;\n const max = total - minSecond;\n const next = Math.max(minFirst, Math.min(max, point));\n setSplit(next);\n };\n const onUp = () => {\n if (!draggingRef.current) return;\n draggingRef.current = false;\n setDragging(false);\n // Persist final position\n persist(split);\n };\n document.addEventListener(\"mousemove\", onMove);\n document.addEventListener(\"mouseup\", onUp);\n return () => {\n document.removeEventListener(\"mousemove\", onMove);\n document.removeEventListener(\"mouseup\", onUp);\n };\n }, [direction, minFirst, minSecond, persist, split]);\n\n // Keyboard support: arrow keys adjust by 16 px, hold shift for 64 px\n const onKeyDown = (e: React.KeyboardEvent) => {\n const isHorizontal = direction === \"horizontal\";\n const step = e.shiftKey ? 64 : 16;\n let delta = 0;\n if (isHorizontal) {\n if (e.key === \"ArrowLeft\") delta = -step;\n else if (e.key === \"ArrowRight\") delta = step;\n } else {\n if (e.key === \"ArrowUp\") delta = -step;\n else if (e.key === \"ArrowDown\") delta = step;\n }\n if (delta === 0) return;\n e.preventDefault();\n const el = wrapRef.current;\n if (!el) return;\n const total = isHorizontal ? el.offsetWidth : el.offsetHeight;\n const max = total - minSecond;\n const next = Math.max(minFirst, Math.min(max, split + delta));\n setSplit(next);\n persist(next);\n };\n\n const firstSize = split;\n\n return (\n <div\n ref={wrapRef}\n className={cn(\n \"ods-resizable\",\n `ods-resizable--${direction}`,\n isDragging && \"ods-resizable--dragging\",\n className,\n )}\n style={style}\n >\n <div\n className=\"ods-resizable__panel ods-resizable__panel--first\"\n style={\n direction === \"horizontal\"\n ? { width: firstSize, flexBasis: firstSize }\n : { height: firstSize, flexBasis: firstSize }\n }\n >\n {children[0]}\n </div>\n <div\n role=\"separator\"\n aria-orientation={direction === \"horizontal\" ? \"vertical\" : \"horizontal\"}\n aria-label={ariaLabel}\n aria-valuemin={minFirst}\n aria-valuenow={Math.round(firstSize)}\n tabIndex={0}\n className=\"ods-resizable__handle\"\n onMouseDown={onMouseDown}\n onKeyDown={onKeyDown}\n >\n <span className=\"ods-resizable__grip\" aria-hidden=\"true\" />\n </div>\n <div className=\"ods-resizable__panel ods-resizable__panel--second\">\n {children[1]}\n </div>\n </div>\n );\n}\n\n/**\n * Single-side resize: a wrapper that lets one edge of a panel be dragged.\n * Useful when the second panel is unmanaged (e.g., main content next to sidebar).\n */\nexport function ResizablePanel({\n defaultSize = 240,\n minSize = 120,\n maxSize = 9999,\n size: sizeProp,\n onResize,\n children,\n className,\n}: ResizablePanelProps & { side?: \"right\" | \"bottom\" }) {\n const [internal, setInternal] = useState(sizeProp ?? defaultSize);\n const size = sizeProp ?? internal;\n const draggingRef = useRef(false);\n const [isDragging, setDragging] = useState(false);\n const startRef = useRef<{ x: number; size: number }>({ x: 0, size });\n\n const onMouseDown = (e: React.MouseEvent) => {\n e.preventDefault();\n draggingRef.current = true;\n setDragging(true);\n startRef.current = { x: e.clientX, size };\n };\n\n useEffect(() => {\n const onMove = (e: MouseEvent) => {\n if (!draggingRef.current) return;\n const dx = e.clientX - startRef.current.x;\n const next = Math.max(minSize, Math.min(maxSize, startRef.current.size + dx));\n if (sizeProp == null) setInternal(next);\n onResize?.(next);\n };\n const onUp = () => {\n draggingRef.current = false;\n setDragging(false);\n };\n document.addEventListener(\"mousemove\", onMove);\n document.addEventListener(\"mouseup\", onUp);\n return () => {\n document.removeEventListener(\"mousemove\", onMove);\n document.removeEventListener(\"mouseup\", onUp);\n };\n }, [maxSize, minSize, onResize, sizeProp]);\n\n return (\n <div\n className={cn(\n \"ods-resizable-panel\",\n isDragging && \"ods-resizable-panel--dragging\",\n className,\n )}\n style={{ width: size }}\n >\n <div className=\"ods-resizable-panel__content\">{children}</div>\n <div\n role=\"separator\"\n aria-orientation=\"vertical\"\n aria-label=\"Resize panel\"\n className=\"ods-resizable-panel__handle\"\n onMouseDown={onMouseDown}\n >\n <span className=\"ods-resizable-panel__grip\" aria-hidden=\"true\" />\n </div>\n </div>\n );\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface RibbonProps {\n variant?: \"primary\" | \"success\" | \"warning\" | \"error\" | \"neutral\";\n icon?: ReactNode;\n size?: \"sm\" | \"md\";\n children: ReactNode;\n className?: string;\n}\n\nexport function Ribbon({\n variant = \"primary\",\n icon,\n size = \"md\",\n children,\n className,\n}: RibbonProps) {\n return (\n <span className={cn(\"ods-ribbon\", `ods-ribbon--${variant}`, `ods-ribbon--${size}`, className)}>\n {icon && (\n <span className=\"ods-ribbon__icon\" aria-hidden=\"true\">\n {icon}\n </span>\n )}\n <span className=\"ods-ribbon__label\">{children}</span>\n </span>\n );\n}\n","\"use client\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport { type ReactNode, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { HiddenSelect, useButton, useListBox, useOption, useSelect } from \"react-aria\";\nimport { createPortal } from \"react-dom\";\nimport { Item, useSelectState } from \"react-stately\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface SelectOption {\n value: string;\n label: string;\n icon?: ReactNode;\n description?: string;\n disabled?: boolean;\n}\n\nexport interface SelectProps {\n options: SelectOption[];\n value?: string;\n defaultValue?: string;\n onChange?: (value: string) => void;\n placeholder?: string;\n searchable?: boolean;\n label?: string;\n error?: boolean;\n errorMessage?: string;\n disabled?: boolean;\n size?: \"sm\" | \"md\" | \"lg\";\n className?: string;\n /** Name for form submission */\n name?: string;\n}\n\n/* ------------------------------------------------------------------ */\n/* Internal ListBox rendered inside the dropdown */\n/* ------------------------------------------------------------------ */\n\nfunction ListBox(props: any) {\n const ref = useRef<HTMLUListElement>(null);\n const { listBoxRef = ref, state } = props;\n const { listBoxProps } = useListBox(props, state, listBoxRef);\n\n return (\n <ul {...listBoxProps} ref={listBoxRef} className={\"ods-select__options\"}>\n {[...state.collection].map((item: any) => (\n <Option key={item.key} item={item} state={state} />\n ))}\n </ul>\n );\n}\n\nfunction Option({ item, state }: any) {\n const ref = useRef<HTMLLIElement>(null);\n const { optionProps, isSelected, isFocused, isDisabled } = useOption(\n { key: item.key },\n state,\n ref,\n );\n\n // item.value is the items-array object; the actual SelectOption is nested inside\n const raw = item.value;\n const option: SelectOption | undefined = raw?.value ?? raw;\n\n return (\n <li\n {...optionProps}\n ref={ref}\n className={cn(\n \"ods-select__option\",\n isFocused && \"ods-select__option--highlighted\",\n isSelected && \"ods-select__option--selected\",\n isDisabled && \"ods-select__option--disabled\",\n )}\n >\n {option?.icon && <span className={\"ods-select__option-icon\"}>{option.icon}</span>}\n <span className={\"ods-select__option-text\"}>\n <span className={\"ods-select__option-label\"}>{item.rendered}</span>\n {option?.description && (\n <span className={\"ods-select__option-desc\"}>{option.description}</span>\n )}\n </span>\n {isSelected && (\n <span className={\"ods-select__check\"} aria-hidden=\"true\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M3.5 8.5L6.5 11.5L12.5 4.5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </span>\n )}\n </li>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Chevron SVG */\n/* ------------------------------------------------------------------ */\nfunction ChevronDown({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M4 6L8 10L12 6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Main Select component */\n/* ------------------------------------------------------------------ */\n\nexport function Select({\n options,\n value,\n defaultValue,\n onChange,\n placeholder = \"Select an option...\",\n searchable = false,\n label,\n error = false,\n errorMessage,\n disabled = false,\n size = \"md\",\n className,\n name,\n}: SelectProps) {\n const triggerRef = useRef<HTMLButtonElement>(null);\n const listBoxRef = useRef<HTMLUListElement>(null);\n const searchRef = useRef<HTMLInputElement>(null);\n const [searchQuery, setSearchQuery] = useState(\"\");\n const [dropdownPos, setDropdownPos] = useState({ top: 0, left: 0, width: 0 });\n\n // Build react-stately items from options, applying search filter\n const filteredOptions = useMemo(() => {\n if (!searchable || !searchQuery) return options;\n const q = searchQuery.toLowerCase();\n return options.filter(\n (o) => o.label.toLowerCase().includes(q) || o.description?.toLowerCase().includes(q),\n );\n }, [options, searchQuery, searchable]);\n\n // Build collection props for useSelectState\n const ariaProps = useMemo(() => {\n const items = filteredOptions.map((o) => ({\n key: o.value,\n label: o.label,\n value: o,\n isDisabled: o.disabled,\n }));\n\n const props: any = {\n label: label || \"Select\",\n items,\n children: (item: any) => (\n <Item key={item.key} textValue={item.label}>\n {item.label}\n </Item>\n ),\n isDisabled: disabled,\n onSelectionChange: (key: any) => {\n onChange?.(String(key));\n setSearchQuery(\"\");\n },\n };\n\n if (value !== undefined) {\n props.selectedKey = value;\n }\n if (defaultValue !== undefined) {\n props.defaultSelectedKey = defaultValue;\n }\n\n return props;\n }, [filteredOptions, label, disabled, value, defaultValue, onChange]);\n\n const state = useSelectState(ariaProps);\n\n const { triggerProps, menuProps } = useSelect(ariaProps, state, triggerRef);\n const { buttonProps } = useButton(triggerProps, triggerRef);\n\n // Position dropdown using getBoundingClientRect (fixed positioning to escape stacking contexts)\n const updatePosition = useCallback(() => {\n if (!triggerRef.current) return;\n const rect = triggerRef.current.getBoundingClientRect();\n setDropdownPos({\n top: rect.bottom + 4,\n left: rect.left,\n width: rect.width,\n });\n }, []);\n\n useEffect(() => {\n if (state.isOpen) {\n updatePosition();\n window.addEventListener(\"scroll\", updatePosition, true);\n window.addEventListener(\"resize\", updatePosition);\n return () => {\n window.removeEventListener(\"scroll\", updatePosition, true);\n window.removeEventListener(\"resize\", updatePosition);\n };\n }\n }, [state.isOpen, updatePosition]);\n\n // Focus search input when dropdown opens\n useEffect(() => {\n if (state.isOpen && searchable && searchRef.current) {\n // Small delay to allow animation frame\n requestAnimationFrame(() => searchRef.current?.focus());\n }\n }, [state.isOpen, searchable]);\n\n // Find currently selected option for display\n const selectedOption = options.find((o) => o.value === String(state.selectedKey ?? \"\"));\n\n return (\n <div\n className={cn(\n \"ods-select\",\n `ods-select--${size}`,\n error && \"ods-select--error\",\n disabled && \"ods-select--disabled\",\n className,\n )}\n >\n {label && <label className={\"ods-select__label\"}>{label}</label>}\n\n <HiddenSelect state={state} triggerRef={triggerRef} label={label} name={name} />\n\n <button\n {...buttonProps}\n ref={triggerRef}\n className={cn(\"ods-select__trigger\", state.isOpen && \"ods-select__trigger--open\")}\n >\n <span className={\"ods-select__value\"}>\n {selectedOption ? (\n <>\n {selectedOption.icon && (\n <span className={\"ods-select__value-icon\"}>{selectedOption.icon}</span>\n )}\n {selectedOption.label}\n </>\n ) : (\n <span className={\"ods-select__placeholder\"}>{placeholder}</span>\n )}\n </span>\n <ChevronDown\n className={cn(\"ods-select__chevron\", state.isOpen && \"ods-select__chevron--open\")}\n />\n </button>\n\n {typeof document !== \"undefined\" &&\n createPortal(\n <AnimatePresence>\n {state.isOpen && (\n <motion.div\n className={\"ods-select__dropdown\"}\n style={{\n position: \"fixed\",\n top: dropdownPos.top,\n left: dropdownPos.left,\n width: dropdownPos.width,\n }}\n initial={{ opacity: 0, scale: 0.95 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.95 }}\n transition={{ duration: 0.2, ease: [0.16, 1, 0.3, 1] }}\n >\n {searchable && (\n <div className={\"ods-select__search-wrap\"}>\n <input\n ref={searchRef}\n className={\"ods-select__search\"}\n type=\"text\"\n placeholder=\"Search...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n aria-label=\"Search options\"\n onKeyDown={(e) => {\n // Allow Escape to close the dropdown\n if (e.key === \"Escape\") {\n state.close();\n }\n }}\n />\n </div>\n )}\n <ListBox {...menuProps} listBoxRef={listBoxRef} state={state} />\n {filteredOptions.length === 0 && (\n <div className={\"ods-select__empty\"}>No results found</div>\n )}\n </motion.div>\n )}\n </AnimatePresence>,\n document.body,\n )}\n\n {error && errorMessage && <span className={\"ods-select__error\"}>{errorMessage}</span>}\n </div>\n );\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface SettingsRowProps {\n title: ReactNode;\n description?: ReactNode;\n icon?: ReactNode;\n control?: ReactNode;\n align?: \"center\" | \"start\";\n className?: string;\n}\n\nexport function SettingsRow({\n title,\n description,\n icon,\n control,\n align = \"center\",\n className,\n}: SettingsRowProps) {\n return (\n <div className={cn(\"ods-settings-row\", `ods-settings-row--${align}`, className)}>\n {icon && (\n <span className=\"ods-settings-row__icon\" aria-hidden=\"true\">\n {icon}\n </span>\n )}\n <div className=\"ods-settings-row__body\">\n <div className=\"ods-settings-row__title\">{title}</div>\n {description && <div className=\"ods-settings-row__desc\">{description}</div>}\n </div>\n {control && <div className=\"ods-settings-row__control\">{control}</div>}\n </div>\n );\n}\n","\"use client\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport { type ReactNode, useEffect } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"../../utils/cn\";\n\nexport type SheetSide = \"top\" | \"right\" | \"bottom\" | \"left\";\n\nexport interface SheetProps {\n open: boolean;\n onClose: () => void;\n side?: SheetSide;\n size?: \"sm\" | \"md\" | \"lg\" | \"full\" | number | string;\n title?: ReactNode;\n description?: ReactNode;\n children?: ReactNode;\n footer?: ReactNode;\n closeOnOverlayClick?: boolean;\n closeOnEsc?: boolean;\n dragHandle?: boolean; // render the notch at the top (bottom/top sheets)\n className?: string;\n}\n\nconst slideVariants: Record<SheetSide, { initial: any; animate: any; exit: any }> = {\n top: { initial: { y: \"-100%\" }, animate: { y: 0 }, exit: { y: \"-100%\" } },\n bottom: { initial: { y: \"100%\" }, animate: { y: 0 }, exit: { y: \"100%\" } },\n left: { initial: { x: \"-100%\" }, animate: { x: 0 }, exit: { x: \"-100%\" } },\n right: { initial: { x: \"100%\" }, animate: { x: 0 }, exit: { x: \"100%\" } },\n};\n\nfunction resolveSize(side: SheetSide, size: SheetProps[\"size\"]): string {\n const isVertical = side === \"left\" || side === \"right\";\n if (size === \"full\") return isVertical ? \"100vw\" : \"100vh\";\n if (typeof size === \"number\") return `${size}px`;\n if (typeof size === \"string\") return size;\n const scale = {\n sm: isVertical ? 320 : 240,\n md: isVertical ? 420 : 360,\n lg: isVertical ? 560 : 480,\n };\n return `${scale[size ?? \"md\"]}px`;\n}\n\nexport function Sheet({\n open,\n onClose,\n side = \"bottom\",\n size = \"md\",\n title,\n description,\n children,\n footer,\n closeOnOverlayClick = true,\n closeOnEsc = true,\n dragHandle = true,\n className,\n}: SheetProps) {\n useEffect(() => {\n if (!open || !closeOnEsc) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onClose();\n };\n document.addEventListener(\"keydown\", onKey);\n return () => document.removeEventListener(\"keydown\", onKey);\n }, [open, closeOnEsc, onClose]);\n\n const variant = slideVariants[side];\n const resolved = resolveSize(side, size);\n const isVertical = side === \"left\" || side === \"right\";\n\n const content = (\n <AnimatePresence>\n {open && (\n <>\n <motion.div\n className=\"ods-sheet__backdrop\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.18 }}\n onClick={closeOnOverlayClick ? onClose : undefined}\n aria-hidden=\"true\"\n />\n <motion.div\n className={cn(\"ods-sheet\", `ods-sheet--${side}`, className)}\n style={isVertical ? { width: resolved } : { height: resolved }}\n role=\"dialog\"\n aria-modal=\"true\"\n initial={variant.initial}\n animate={variant.animate}\n exit={variant.exit}\n transition={{ type: \"tween\", ease: [0.32, 0.72, 0, 1], duration: 0.28 }}\n >\n {(side === \"bottom\" || side === \"top\") && dragHandle && (\n <div className=\"ods-sheet__handle\" aria-hidden=\"true\" />\n )}\n {(title || description) && (\n <header className=\"ods-sheet__head\">\n {title && <h2 className=\"ods-sheet__title\">{title}</h2>}\n {description && <p className=\"ods-sheet__desc\">{description}</p>}\n </header>\n )}\n <div className=\"ods-sheet__body\">{children}</div>\n {footer && <footer className=\"ods-sheet__footer\">{footer}</footer>}\n </motion.div>\n </>\n )}\n </AnimatePresence>\n );\n\n if (typeof document === \"undefined\") return null;\n return createPortal(content, document.body);\n}\n","\"use client\";\nimport { type ReactNode, useCallback, useEffect, useRef, useState } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface SidebarNavItem {\n id: string;\n label: ReactNode;\n icon: ReactNode;\n badge?: ReactNode;\n tag?: ReactNode;\n active?: boolean;\n /** Shortcut hint shown in rail tooltip, e.g. \"⌘1\". */\n shortcut?: string;\n onClick?: () => void;\n href?: string;\n /** Nested children (L2/L3). Items with children expand in place. */\n children?: SidebarNavItem[];\n /** Start expanded. Defaults to active (so active path is pre-revealed). */\n defaultExpanded?: boolean;\n}\n\nexport interface SidebarSection {\n id?: string;\n label?: ReactNode;\n items: SidebarNavItem[];\n}\n\nexport interface SidebarUser {\n name: ReactNode;\n email?: ReactNode;\n initial?: ReactNode;\n avatar?: ReactNode;\n onClick?: () => void;\n}\n\nexport interface SidebarProps {\n /**\n * - \"rail\" — always-collapsed 64px rail\n * - \"expanded\" — always-expanded 260px\n * - \"auto\" — rail that expands into a floating overlay on hover;\n * user can pin it to stay expanded (persisted to localStorage)\n */\n variant?: \"rail\" | \"expanded\" | \"auto\";\n brand?: { name: ReactNode; subtitle?: ReactNode };\n logo?: ReactNode;\n sections?: SidebarSection[];\n items?: SidebarNavItem[];\n footerItems?: SidebarNavItem[];\n user?: SidebarUser;\n /** For rail/expanded: toggle callback. For auto: optional hook called on pin change. */\n onToggle?: () => void;\n\n // ── \"auto\" controls ────────────────────────────\n pinned?: boolean;\n defaultPinned?: boolean;\n onPinnedChange?: (pinned: boolean) => void;\n pinStorageKey?: string;\n hoverOpenDelay?: number;\n hoverCloseDelay?: number;\n\n // ── rail tooltip ───────────────────────────────\n tooltipDelay?: number;\n\n height?: number | string;\n className?: string;\n}\n\nexport function Sidebar({\n variant = \"expanded\",\n brand,\n logo,\n sections,\n items,\n footerItems,\n user,\n onToggle,\n pinned: pinnedProp,\n defaultPinned = false,\n onPinnedChange,\n pinStorageKey = \"ods-sidebar-pinned\",\n hoverOpenDelay = 100,\n hoverCloseDelay = 250,\n tooltipDelay = 300,\n height = \"100%\",\n className,\n}: SidebarProps) {\n const allSections: SidebarSection[] = sections ?? (items ? [{ items }] : []);\n\n // ── Pin state (persisted) ────────────────────\n const [internalPinned, setInternalPinned] = useState<boolean>(() => {\n if (typeof window === \"undefined\") return defaultPinned;\n try {\n const stored = window.localStorage.getItem(pinStorageKey);\n if (stored !== null) return stored === \"true\";\n } catch {\n /* noop */\n }\n return defaultPinned;\n });\n const pinned = pinnedProp ?? internalPinned;\n const setPinned = useCallback(\n (p: boolean) => {\n if (pinnedProp === undefined) setInternalPinned(p);\n try {\n window.localStorage.setItem(pinStorageKey, String(p));\n } catch {\n /* noop */\n }\n onPinnedChange?.(p);\n },\n [pinnedProp, pinStorageKey, onPinnedChange],\n );\n\n // ── Hover overlay ────────────────────────────\n const [hoverOpen, setHoverOpen] = useState(false);\n const openTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const closeTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const clearTimers = () => {\n if (openTimer.current) {\n clearTimeout(openTimer.current);\n openTimer.current = null;\n }\n if (closeTimer.current) {\n clearTimeout(closeTimer.current);\n closeTimer.current = null;\n }\n };\n useEffect(() => () => clearTimers(), []);\n const handleEnter = () => {\n clearTimers();\n openTimer.current = setTimeout(() => setHoverOpen(true), hoverOpenDelay);\n };\n const handleLeave = () => {\n clearTimers();\n closeTimer.current = setTimeout(() => setHoverOpen(false), hoverCloseDelay);\n };\n\n const autoMode = variant === \"auto\";\n const showAsRail = autoMode ? !pinned : variant === \"rail\";\n const overlayOpen = autoMode && !pinned && hoverOpen;\n\n return (\n <nav\n className={cn(\n \"ods-sidebar\",\n `ods-sidebar--${showAsRail ? \"rail\" : \"expanded\"}`,\n autoMode && \"ods-sidebar--auto\",\n overlayOpen && \"ods-sidebar--overlay-open\",\n className,\n )}\n style={{ height }}\n aria-label=\"Sidebar navigation\"\n onMouseEnter={autoMode && !pinned ? handleEnter : undefined}\n onMouseLeave={autoMode && !pinned ? handleLeave : undefined}\n >\n {showAsRail ? (\n <RailLayout\n logo={logo}\n sections={allSections}\n footerItems={footerItems}\n user={user}\n onToggle={autoMode ? () => setPinned(true) : onToggle}\n tooltipDelay={tooltipDelay}\n suppressTooltips={overlayOpen}\n />\n ) : (\n <ExpandedLayout\n logo={logo}\n brand={brand}\n sections={allSections}\n footerItems={footerItems}\n user={user}\n onToggle={autoMode ? () => setPinned(false) : onToggle}\n pinned={autoMode ? pinned : undefined}\n onPinToggle={autoMode ? () => setPinned(!pinned) : undefined}\n />\n )}\n\n {overlayOpen && (\n <div className=\"ods-sidebar__overlay\" onMouseEnter={handleEnter} onMouseLeave={handleLeave}>\n <ExpandedLayout\n logo={logo}\n brand={brand}\n sections={allSections}\n footerItems={footerItems}\n user={user}\n onToggle={() => setPinned(true)}\n pinned={false}\n onPinToggle={() => setPinned(!pinned)}\n />\n </div>\n )}\n </nav>\n );\n}\n\n// ──────────────────────────────────────────────────────────────────────\n// Rail (collapsed) — 64px wide, icon-only\n// ──────────────────────────────────────────────────────────────────────\nfunction RailLayout({\n logo,\n sections,\n footerItems,\n user,\n onToggle,\n tooltipDelay,\n suppressTooltips,\n}: Pick<SidebarProps, \"logo\" | \"footerItems\" | \"user\" | \"onToggle\"> & {\n sections: SidebarSection[];\n tooltipDelay: number;\n suppressTooltips?: boolean;\n}) {\n return (\n <>\n {logo && <div className=\"ods-sidebar__logo-rail\">{logo}</div>}\n {onToggle && (\n <button\n type=\"button\"\n className=\"ods-sidebar__expand-rail\"\n onClick={onToggle}\n aria-label=\"Expand sidebar\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M13 3v10M5 5l3 3-3 3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n )}\n <div className=\"ods-sidebar__nav-rail\">\n {sections\n .flatMap((s) => s.items)\n .map((item) => (\n <RailItem\n key={item.id}\n item={item}\n tooltipDelay={tooltipDelay}\n suppressTooltip={suppressTooltips}\n />\n ))}\n </div>\n <div className=\"ods-sidebar__spacer\" />\n {footerItems && footerItems.length > 0 && (\n <div className=\"ods-sidebar__footer-rail\">\n {footerItems.map((item) => (\n <RailItem\n key={item.id}\n item={item}\n tooltipDelay={tooltipDelay}\n suppressTooltip={suppressTooltips}\n />\n ))}\n </div>\n )}\n {user && (\n <button\n type=\"button\"\n className=\"ods-sidebar__user-rail\"\n onClick={user.onClick}\n aria-label={typeof user.name === \"string\" ? user.name : \"User\"}\n >\n {user.avatar ?? (\n <span>\n {user.initial ??\n (typeof user.name === \"string\" ? user.name.charAt(0).toUpperCase() : \"?\")}\n </span>\n )}\n </button>\n )}\n </>\n );\n}\n\nfunction RailItem({\n item,\n tooltipDelay,\n suppressTooltip,\n}: {\n item: SidebarNavItem;\n tooltipDelay: number;\n suppressTooltip?: boolean;\n}) {\n const [tipOpen, setTipOpen] = useState(false);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const clear = () => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n };\n useEffect(() => () => clear(), []);\n\n const show = () => {\n if (suppressTooltip) return;\n clear();\n timerRef.current = setTimeout(() => setTipOpen(true), tooltipDelay);\n };\n const hide = () => {\n clear();\n setTipOpen(false);\n };\n\n const Comp = item.href ? \"a\" : \"button\";\n const labelText = typeof item.label === \"string\" ? item.label : undefined;\n\n return (\n <div\n className=\"ods-sidebar__rail-wrap\"\n onMouseEnter={show}\n onMouseLeave={hide}\n onFocus={show}\n onBlur={hide}\n >\n <Comp\n type={item.href ? undefined : \"button\"}\n href={item.href}\n onClick={item.onClick}\n className={cn(\"ods-sidebar__rail-item\", item.active && \"ods-sidebar__rail-item--active\")}\n aria-current={item.active ? \"page\" : undefined}\n aria-label={labelText}\n >\n <span className=\"ods-sidebar__rail-icon\">{item.icon}</span>\n </Comp>\n {tipOpen && labelText && (\n <div className=\"ods-sidebar__rail-tooltip\" role=\"tooltip\">\n <span className=\"ods-sidebar__rail-tooltip-label\">{labelText}</span>\n {item.shortcut && <kbd className=\"ods-sidebar__rail-kbd\">{item.shortcut}</kbd>}\n </div>\n )}\n </div>\n );\n}\n\n// ──────────────────────────────────────────────────────────────────────\n// Expanded — 260px wide, with labels + sections + footer + user card\n// ──────────────────────────────────────────────────────────────────────\nfunction ExpandedLayout({\n logo,\n brand,\n sections,\n footerItems,\n user,\n onToggle,\n pinned,\n onPinToggle,\n}: Pick<SidebarProps, \"logo\" | \"brand\" | \"footerItems\" | \"user\" | \"onToggle\"> & {\n sections: SidebarSection[];\n pinned?: boolean;\n onPinToggle?: () => void;\n}) {\n return (\n <>\n <div className=\"ods-sidebar__header\">\n {logo && <div className=\"ods-sidebar__logo\">{logo}</div>}\n {brand && (\n <div className=\"ods-sidebar__brand\">\n <span className=\"ods-sidebar__brand-name\">{brand.name}</span>\n {brand.subtitle && <span className=\"ods-sidebar__brand-sub\">{brand.subtitle}</span>}\n </div>\n )}\n {onPinToggle && (\n <button\n type=\"button\"\n className={cn(\"ods-sidebar__pin\", pinned && \"ods-sidebar__pin--pinned\")}\n onClick={onPinToggle}\n aria-label={pinned ? \"Unpin sidebar\" : \"Pin sidebar\"}\n aria-pressed={pinned}\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M5.5 1h3v3l2 3h-3v3l-1.5 2L4.5 10V7h-3l2-3V1z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.3\"\n strokeLinejoin=\"round\"\n fill={pinned ? \"currentColor\" : \"none\"}\n />\n </svg>\n </button>\n )}\n {onToggle && !onPinToggle && (\n <button\n type=\"button\"\n className=\"ods-sidebar__collapse\"\n onClick={onToggle}\n aria-label=\"Collapse sidebar\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M3 3v10M11 5l-3 3 3 3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n )}\n </div>\n <div className=\"ods-sidebar__body\">\n {sections.map((section, sIdx) => (\n <div className=\"ods-sidebar__section\" key={section.id ?? sIdx}>\n {section.label && <div className=\"ods-sidebar__section-label\">{section.label}</div>}\n {section.items.map((item) => (\n <ExpandedItem key={item.id} item={item} level={0} />\n ))}\n </div>\n ))}\n </div>\n {(footerItems || user) && (\n <div className=\"ods-sidebar__footer\">\n {footerItems && footerItems.length > 0 && (\n <div className=\"ods-sidebar__footer-list\">\n {footerItems.map((item) => (\n <ExpandedItem key={item.id} item={item} level={0} />\n ))}\n </div>\n )}\n {user && (\n <button type=\"button\" className=\"ods-sidebar__user-card\" onClick={user.onClick}>\n <span className=\"ods-sidebar__user-avatar\">\n {user.avatar ?? (\n <span>\n {user.initial ??\n (typeof user.name === \"string\" ? user.name.charAt(0).toUpperCase() : \"?\")}\n </span>\n )}\n </span>\n <span className=\"ods-sidebar__user-info\">\n <span className=\"ods-sidebar__user-name\">{user.name}</span>\n {user.email && <span className=\"ods-sidebar__user-email\">{user.email}</span>}\n </span>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"8\" cy=\"3\" r=\"1.3\" fill=\"currentColor\" />\n <circle cx=\"8\" cy=\"8\" r=\"1.3\" fill=\"currentColor\" />\n <circle cx=\"8\" cy=\"13\" r=\"1.3\" fill=\"currentColor\" />\n </svg>\n </button>\n )}\n </div>\n )}\n </>\n );\n}\n\nfunction ExpandedItem({ item, level }: { item: SidebarNavItem; level: number }) {\n const hasChildren = !!(item.children && item.children.length > 0);\n const [open, setOpen] = useState<boolean>(\n item.defaultExpanded ?? (hasChildren && hasActiveDescendant(item)),\n );\n\n if (hasChildren) {\n return (\n <>\n <button\n type=\"button\"\n className={cn(\n \"ods-sidebar__item\",\n level > 0 && `ods-sidebar__item--l${Math.min(level + 1, 3)}`,\n item.active && \"ods-sidebar__item--active\",\n open && \"ods-sidebar__item--open\",\n )}\n onClick={(e) => {\n setOpen((o) => !o);\n item.onClick?.();\n e.stopPropagation();\n }}\n aria-expanded={open}\n >\n <span className=\"ods-sidebar__icon\">{item.icon}</span>\n <span className=\"ods-sidebar__label\">{item.label}</span>\n {item.tag && <span className=\"ods-sidebar__tag\">{item.tag}</span>}\n {item.badge && <span className=\"ods-sidebar__badge\">{item.badge}</span>}\n <svg\n className={cn(\"ods-sidebar__chevron\", open && \"ods-sidebar__chevron--open\")}\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M4.5 3l3 3-3 3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n {open && (\n <div\n className={cn(\n \"ods-sidebar__subtree\",\n `ods-sidebar__subtree--l${Math.min(level + 1, 3)}`,\n )}\n >\n {item.children!.map((child) => (\n <ExpandedItem key={child.id} item={child} level={level + 1} />\n ))}\n </div>\n )}\n </>\n );\n }\n\n const Comp = item.href ? \"a\" : \"button\";\n return (\n <Comp\n type={item.href ? undefined : \"button\"}\n href={item.href}\n onClick={item.onClick}\n className={cn(\n \"ods-sidebar__item\",\n level > 0 && `ods-sidebar__item--l${Math.min(level + 1, 3)}`,\n item.active && \"ods-sidebar__item--active\",\n )}\n aria-current={item.active ? \"page\" : undefined}\n >\n <span className=\"ods-sidebar__icon\">{item.icon}</span>\n <span className=\"ods-sidebar__label\">{item.label}</span>\n {item.tag && <span className=\"ods-sidebar__tag\">{item.tag}</span>}\n {item.badge && <span className=\"ods-sidebar__badge\">{item.badge}</span>}\n </Comp>\n );\n}\n\nfunction hasActiveDescendant(item: SidebarNavItem): boolean {\n if (!item.children) return false;\n for (const c of item.children) {\n if (c.active) return true;\n if (hasActiveDescendant(c)) return true;\n }\n return false;\n}\n","\"use client\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface SkeletonProps {\n variant?: \"text\" | \"circular\" | \"rectangular\";\n width?: string | number;\n height?: string | number;\n lines?: number;\n className?: string;\n}\n\nexport function Skeleton({ variant = \"text\", width, height, lines = 1, className }: SkeletonProps) {\n const resolvedWidth = typeof width === \"number\" ? `${width}px` : width;\n const resolvedHeight = typeof height === \"number\" ? `${height}px` : height;\n\n if (variant === \"text\" && lines > 1) {\n return (\n <div className={cn(\"ods-skeleton__group\", className)} role=\"status\" aria-label=\"Loading\">\n {Array.from({ length: lines }).map((_, i) => (\n <div\n key={i}\n className={cn(\"ods-skeleton\", \"ods-skeleton--text\")}\n style={{\n width: i === lines - 1 ? \"75%\" : resolvedWidth || \"100%\",\n height: resolvedHeight,\n }}\n />\n ))}\n </div>\n );\n }\n\n return (\n <div\n className={cn(\"ods-skeleton\", `ods-skeleton--${variant}`, className)}\n style={{\n width: resolvedWidth,\n height: resolvedHeight,\n }}\n role=\"status\"\n aria-label=\"Loading\"\n />\n );\n}\n","\"use client\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport { type ReactNode, useRef } from \"react\";\nimport { FocusScope, useDialog, useModal, useOverlay } from \"react-aria\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface SlideoutPanelProps {\n open: boolean;\n onClose: () => void;\n position?: \"left\" | \"right\";\n width?: number | string;\n title?: ReactNode;\n children?: ReactNode;\n footer?: ReactNode;\n className?: string;\n}\n\nconst slideVariants = {\n left: {\n initial: { x: \"-100%\" },\n animate: { x: 0 },\n exit: { x: \"-100%\" },\n },\n right: {\n initial: { x: \"100%\" },\n animate: { x: 0 },\n exit: { x: \"100%\" },\n },\n};\n\nfunction SlideoutContent({\n open,\n onClose,\n position = \"right\",\n width = 360,\n title,\n children,\n footer,\n className,\n}: SlideoutPanelProps) {\n const overlayRef = useRef<HTMLDivElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n\n const { overlayProps } = useOverlay(\n {\n isOpen: open,\n onClose,\n isDismissable: true,\n },\n overlayRef,\n );\n\n const { modalProps } = useModal();\n const { dialogProps, titleProps } = useDialog({}, panelRef);\n\n // Remove motion-conflicting props\n const { onDrag, onDragStart, onDragEnd, onAnimationStart, ...safeOverlayProps } =\n overlayProps as any;\n\n const variant = slideVariants[position];\n const panelWidth = typeof width === \"number\" ? `${width}px` : width;\n\n return (\n <AnimatePresence>\n {open && (\n <>\n {/* Backdrop */}\n <motion.div\n className={\"ods-slideout__backdrop\"}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.2 }}\n onClick={onClose}\n data-testid=\"slideout-backdrop\"\n aria-hidden=\"true\"\n />\n\n {/* Panel */}\n <FocusScope contain restoreFocus autoFocus>\n <motion.div\n {...safeOverlayProps}\n {...modalProps}\n {...dialogProps}\n ref={(node) => {\n (overlayRef as any).current = node;\n (panelRef as any).current = node;\n }}\n className={cn(\"ods-slideout__panel\", `ods-slideout__panel--${position}`, className)}\n style={{ width: panelWidth }}\n initial={variant.initial}\n animate={variant.animate}\n exit={variant.exit}\n transition={{ type: \"tween\", ease: [0.32, 0.72, 0, 1], duration: 0.28 }}\n >\n {title && (\n <div className={\"ods-slideout__header\"}>\n <h2 {...titleProps} className={\"ods-slideout__title\"}>\n {title}\n </h2>\n <button\n className={\"ods-slideout__close\"}\n onClick={onClose}\n aria-label=\"Close panel\"\n type=\"button\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path d=\"M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z\" />\n </svg>\n </button>\n </div>\n )}\n <div className={\"ods-slideout__body\"}>{children}</div>\n {footer && <div className={\"ods-slideout__footer\"}>{footer}</div>}\n </motion.div>\n </FocusScope>\n </>\n )}\n </AnimatePresence>\n );\n}\n\nexport function SlideoutPanel(props: SlideoutPanelProps) {\n if (typeof document === \"undefined\") return null;\n return createPortal(<SlideoutContent {...props} />, document.body);\n}\n","\"use client\";\nimport type { ChangeEvent, ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface SliderProps {\n label?: ReactNode;\n value: number;\n onChange?: (value: number) => void;\n min?: number;\n max?: number;\n step?: number;\n formatValue?: (value: number) => ReactNode;\n showValue?: boolean;\n size?: \"sm\" | \"md\" | \"lg\";\n disabled?: boolean;\n variant?: \"primary\" | \"success\" | \"warning\" | \"error\";\n \"aria-label\"?: string;\n className?: string;\n}\n\nexport function Slider({\n label,\n value,\n onChange,\n min = 0,\n max = 100,\n step = 1,\n formatValue,\n showValue = true,\n size = \"md\",\n disabled = false,\n variant = \"primary\",\n className,\n ...props\n}: SliderProps) {\n const pct = max === min ? 0 : ((value - min) / (max - min)) * 100;\n const display = formatValue ? formatValue(value) : `${value}`;\n const handle = (e: ChangeEvent<HTMLInputElement>) => onChange?.(Number(e.target.value));\n\n return (\n <div\n className={cn(\n \"ods-slider\",\n `ods-slider--${size}`,\n `ods-slider--${variant}`,\n disabled && \"ods-slider--disabled\",\n className,\n )}\n >\n {(label || showValue) && (\n <div className=\"ods-slider__head\">\n {label && <span className=\"ods-slider__label\">{label}</span>}\n {showValue && <span className=\"ods-slider__value\">{display}</span>}\n </div>\n )}\n <div className=\"ods-slider__track\">\n <span className=\"ods-slider__fill\" style={{ width: `${pct}%` }} />\n <input\n type=\"range\"\n className=\"ods-slider__input\"\n min={min}\n max={max}\n step={step}\n value={value}\n onChange={handle}\n disabled={disabled}\n aria-label={typeof label === \"string\" ? label : props[\"aria-label\"]}\n />\n </div>\n </div>\n );\n}\n","\"use client\";\nimport type { ButtonHTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport type SocialProvider = \"google\" | \"github\" | \"apple\" | \"twitter\" | \"custom\";\n\nexport interface SocialButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n provider: SocialProvider;\n label?: ReactNode; // e.g. \"Continue with Google\"\n icon?: ReactNode; // custom icon override\n size?: \"sm\" | \"md\" | \"lg\";\n fullWidth?: boolean;\n}\n\nconst DEFAULT_LABELS: Record<Exclude<SocialProvider, \"custom\">, string> = {\n google: \"Continue with Google\",\n github: \"Continue with GitHub\",\n apple: \"Continue with Apple\",\n twitter: \"Continue with X\",\n};\n\nconst GoogleIcon = () => (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M17.64 9.2c0-.64-.06-1.25-.16-1.84H9v3.48h4.84a4.14 4.14 0 0 1-1.79 2.72v2.26h2.9c1.69-1.56 2.69-3.85 2.69-6.62z\"\n fill=\"#4285F4\"\n />\n <path\n d=\"M9 18c2.43 0 4.47-.8 5.96-2.18l-2.9-2.26c-.8.54-1.84.86-3.06.86-2.34 0-4.33-1.58-5.04-3.71H.96v2.33A9 9 0 0 0 9 18z\"\n fill=\"#34A853\"\n />\n <path\n d=\"M3.96 10.71A5.38 5.38 0 0 1 3.68 9c0-.6.1-1.18.28-1.71V4.96H.96A9 9 0 0 0 0 9c0 1.45.35 2.82.96 4.04l3-2.33z\"\n fill=\"#FBBC05\"\n />\n <path\n d=\"M9 3.58c1.32 0 2.5.45 3.44 1.35l2.58-2.58A9 9 0 0 0 9 0 9 9 0 0 0 .96 4.96l3 2.33C4.67 5.16 6.66 3.58 9 3.58z\"\n fill=\"#EA4335\"\n />\n </svg>\n);\n\nconst GitHubIcon = () => (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M9 .2a9 9 0 0 0-2.85 17.55c.45.08.62-.2.62-.43v-1.5c-2.5.54-3.04-1.2-3.04-1.2-.41-1.05-1-1.33-1-1.33-.82-.56.06-.55.06-.55.9.06 1.38.93 1.38.93.8 1.38 2.11.98 2.63.75.08-.58.31-.98.57-1.2-2-.23-4.1-1-4.1-4.44 0-.98.35-1.78.93-2.41-.1-.23-.4-1.15.09-2.4 0 0 .76-.25 2.48.92a8.6 8.6 0 0 1 4.5 0c1.72-1.17 2.48-.92 2.48-.92.49 1.25.18 2.17.09 2.4.58.63.93 1.43.93 2.4 0 3.45-2.1 4.21-4.1 4.44.32.28.6.82.6 1.67v2.47c0 .24.17.52.63.43A9 9 0 0 0 9 .2z\"\n fill=\"#ffffff\"\n />\n </svg>\n);\n\nconst AppleIcon = () => (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M13.4 9.5c0-1.7 1.4-2.5 1.5-2.6-.8-1.2-2.1-1.3-2.5-1.3-1.1-.1-2.1.6-2.6.6-.6 0-1.4-.6-2.3-.6-1.2 0-2.3.7-2.9 1.8-1.2 2.1-.3 5.3.9 7 .6.9 1.3 1.8 2.2 1.8.9 0 1.2-.6 2.3-.6s1.4.6 2.3.6 1.5-.9 2.1-1.8c.7-1 1-2 1-2.1 0 0-1.9-.7-2-2.8zM11.5 4.5c.5-.6.8-1.4.7-2.2-.7 0-1.5.5-2 1.1-.4.5-.8 1.3-.7 2.1.8.1 1.6-.4 2-1z\"\n fill=\"#ffffff\"\n />\n </svg>\n);\n\nconst TwitterIcon = () => (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M13.8 1.3h2.6l-5.7 6.5L17.4 16h-5.2l-4.1-5.3L3.4 16H.8l6-6.9L.5 1.3h5.4l3.7 4.9 4.2-4.9z\"\n fill=\"#ffffff\"\n />\n </svg>\n);\n\nconst PROVIDER_ICONS: Record<Exclude<SocialProvider, \"custom\">, () => ReactNode> = {\n google: GoogleIcon,\n github: GitHubIcon,\n apple: AppleIcon,\n twitter: TwitterIcon,\n};\n\nexport function SocialButton({\n provider,\n label,\n icon,\n size = \"md\",\n fullWidth = true,\n className,\n children,\n ...props\n}: SocialButtonProps) {\n const resolvedIcon = icon ?? (provider !== \"custom\" ? PROVIDER_ICONS[provider]() : null);\n const resolvedLabel =\n label ?? children ?? (provider !== \"custom\" ? DEFAULT_LABELS[provider] : null);\n return (\n <button\n type=\"button\"\n {...props}\n className={cn(\n \"ods-social-btn\",\n `ods-social-btn--${provider}`,\n `ods-social-btn--${size}`,\n fullWidth && \"ods-social-btn--full\",\n className,\n )}\n >\n {resolvedIcon && (\n <span className=\"ods-social-btn__icon\" aria-hidden=\"true\">\n {resolvedIcon}\n </span>\n )}\n <span className=\"ods-social-btn__label\">{resolvedLabel}</span>\n </button>\n );\n}\n","\"use client\";\nimport {\n type CSSProperties,\n type DragEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface SortableItem {\n id: string;\n}\n\nexport interface SortableProps<T extends SortableItem> {\n items: T[];\n onChange: (items: T[]) => void;\n renderItem: (item: T, index: number, dragProps: SortableDragProps) => ReactNode;\n /** Direction. Default vertical. */\n direction?: \"vertical\" | \"horizontal\";\n /** Disable reorder interactions. */\n disabled?: boolean;\n /** Enable auto-scroll near container edges while dragging. Default true. */\n autoScroll?: boolean;\n /** Auto-scroll trigger zone in pixels from the edge. Default 48. */\n autoScrollEdge?: number;\n className?: string;\n}\n\nexport interface SortableDragProps {\n /** Spread on the drag handle element. */\n dragHandleProps: {\n draggable: boolean;\n onDragStart: (e: DragEvent) => void;\n onDragEnd: () => void;\n onKeyDown: (e: React.KeyboardEvent) => void;\n role: string;\n \"aria-roledescription\": string;\n \"aria-grabbed\"?: boolean;\n tabIndex: number;\n };\n /** Whether THIS item is currently being dragged. */\n isDragging: boolean;\n /** Whether this item is the keyboard-lift source. */\n isKeyboardActive: boolean;\n}\n\nconst DT_TYPE = \"application/x-ods-sortable\";\n\ntype DropPos = { id: string; edge: \"before\" | \"after\" } | null;\n\nexport function Sortable<T extends SortableItem>({\n items,\n onChange,\n renderItem,\n direction = \"vertical\",\n disabled = false,\n autoScroll = true,\n autoScrollEdge = 48,\n className,\n}: SortableProps<T>) {\n const containerRef = useRef<HTMLDivElement>(null);\n const itemRefs = useRef<Map<string, HTMLDivElement>>(new Map());\n const originalOrderRef = useRef<T[] | null>(null);\n const scrollTimerRef = useRef<number | null>(null);\n\n const [draggingId, setDraggingId] = useState<string | null>(null);\n const [dropPos, setDropPos] = useState<DropPos>(null);\n // Keyboard-managed \"active\" item — picked up with Space/Enter\n const [kbActiveId, setKbActiveId] = useState<string | null>(null);\n\n const isVertical = direction === \"vertical\";\n\n // ── Drag start / end ────────────────────────────────────────\n const onDragStart = useCallback(\n (id: string) => (e: DragEvent) => {\n if (disabled) return;\n e.dataTransfer.effectAllowed = \"move\";\n e.dataTransfer.setData(DT_TYPE, id);\n e.dataTransfer.setData(\"text/plain\", id);\n originalOrderRef.current = items.slice();\n setDraggingId(id);\n },\n [disabled, items],\n );\n\n const cancelDrag = useCallback(() => {\n setDraggingId(null);\n setDropPos(null);\n originalOrderRef.current = null;\n if (scrollTimerRef.current != null) {\n clearInterval(scrollTimerRef.current);\n scrollTimerRef.current = null;\n }\n }, []);\n\n const onDragEnd = useCallback(() => {\n cancelDrag();\n }, [cancelDrag]);\n\n // ── DragOver handler ────────────────────────────────────────\n const onItemDragOver = (id: string) => (e: DragEvent) => {\n if (disabled || !draggingId) return;\n e.preventDefault();\n e.dataTransfer.dropEffect = \"move\";\n const el = itemRefs.current.get(id);\n if (!el) return;\n const rect = el.getBoundingClientRect();\n const point = isVertical ? e.clientY : e.clientX;\n const mid = isVertical ? rect.top + rect.height / 2 : rect.left + rect.width / 2;\n const edge: \"before\" | \"after\" = point < mid ? \"before\" : \"after\";\n setDropPos((prev) => (prev?.id === id && prev?.edge === edge ? prev : { id, edge }));\n };\n\n // ── Drop handler ────────────────────────────────────────────\n const onContainerDrop = (e: DragEvent) => {\n if (disabled) return;\n e.preventDefault();\n const sourceId = e.dataTransfer.getData(DT_TYPE) || e.dataTransfer.getData(\"text/plain\");\n const target = dropPos;\n cancelDrag();\n if (!sourceId || !target) return;\n if (sourceId === target.id) return;\n commitMove(sourceId, target.id, target.edge);\n };\n\n const commitMove = useCallback(\n (sourceId: string, targetId: string, edge: \"before\" | \"after\") => {\n const from = items.findIndex((i) => i.id === sourceId);\n let to = items.findIndex((i) => i.id === targetId);\n if (from < 0 || to < 0) return;\n const next = items.slice();\n const [moved] = next.splice(from, 1);\n // Adjust target index after splice if removing earlier item shifted positions\n if (from < to) to -= 1;\n const insertAt = edge === \"after\" ? to + 1 : to;\n next.splice(insertAt, 0, moved);\n onChange(next);\n },\n [items, onChange],\n );\n\n // ── Auto-scroll near edges ─────────────────────────────────\n useEffect(() => {\n if (!autoScroll || !draggingId) return;\n const container = containerRef.current;\n if (!container) return;\n // Find nearest scrollable ancestor\n let scrollParent: HTMLElement | null = container;\n while (scrollParent && scrollParent !== document.body) {\n const style = window.getComputedStyle(scrollParent);\n const overflow = isVertical ? style.overflowY : style.overflowX;\n if ((overflow === \"auto\" || overflow === \"scroll\") &&\n (isVertical\n ? scrollParent.scrollHeight > scrollParent.clientHeight\n : scrollParent.scrollWidth > scrollParent.clientWidth)) {\n break;\n }\n scrollParent = scrollParent.parentElement;\n }\n if (!scrollParent || scrollParent === document.body) {\n // Fall back to window scroll\n scrollParent = (document.scrollingElement as HTMLElement) || document.documentElement;\n }\n\n const onDocDragOver = (e: globalThis.DragEvent) => {\n const rect = scrollParent === document.scrollingElement\n ? { top: 0, bottom: window.innerHeight, left: 0, right: window.innerWidth }\n : (scrollParent as HTMLElement).getBoundingClientRect();\n const point = isVertical ? e.clientY : e.clientX;\n const near = isVertical\n ? { start: rect.top, end: rect.bottom }\n : { start: rect.left, end: rect.right };\n let delta = 0;\n if (point - near.start < autoScrollEdge) {\n delta = -Math.max(2, autoScrollEdge - (point - near.start)) / 4;\n } else if (near.end - point < autoScrollEdge) {\n delta = Math.max(2, autoScrollEdge - (near.end - point)) / 4;\n }\n if (delta === 0) {\n if (scrollTimerRef.current != null) {\n clearInterval(scrollTimerRef.current);\n scrollTimerRef.current = null;\n }\n return;\n }\n if (scrollTimerRef.current == null) {\n scrollTimerRef.current = window.setInterval(() => {\n if (!scrollParent) return;\n if (isVertical) scrollParent.scrollTop += delta;\n else scrollParent.scrollLeft += delta;\n }, 16);\n }\n };\n document.addEventListener(\"dragover\", onDocDragOver);\n return () => {\n document.removeEventListener(\"dragover\", onDocDragOver);\n if (scrollTimerRef.current != null) {\n clearInterval(scrollTimerRef.current);\n scrollTimerRef.current = null;\n }\n };\n }, [autoScroll, autoScrollEdge, draggingId, isVertical]);\n\n // ── Escape cancels drag ─────────────────────────────────────\n useEffect(() => {\n if (!draggingId) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") cancelDrag();\n };\n document.addEventListener(\"keydown\", onKey);\n return () => document.removeEventListener(\"keydown\", onKey);\n }, [draggingId, cancelDrag]);\n\n // ── Keyboard reorder (Space to lift, arrows to move, Enter/Space to drop, Esc to cancel) ──\n const onHandleKeyDown = (id: string) => (e: React.KeyboardEvent) => {\n if (disabled) return;\n // Activate\n if (kbActiveId !== id) {\n if (e.key === \" \" || e.key === \"Enter\") {\n e.preventDefault();\n setKbActiveId(id);\n }\n return;\n }\n // Active mode\n if (e.key === \"Escape\") {\n e.preventDefault();\n setKbActiveId(null);\n return;\n }\n if (e.key === \" \" || e.key === \"Enter\") {\n e.preventDefault();\n setKbActiveId(null);\n return;\n }\n const moveBy = (delta: number) => {\n e.preventDefault();\n const idx = items.findIndex((i) => i.id === id);\n const targetIdx = idx + delta;\n if (idx < 0 || targetIdx < 0 || targetIdx >= items.length) return;\n const next = items.slice();\n const [moved] = next.splice(idx, 1);\n next.splice(targetIdx, 0, moved);\n onChange(next);\n // After reorder, refocus the handle of the moved item\n requestAnimationFrame(() => {\n const el = itemRefs.current.get(id);\n const handle = el?.querySelector<HTMLElement>('[data-ods-sortable-handle=\"true\"]');\n handle?.focus();\n });\n };\n if (isVertical) {\n if (e.key === \"ArrowUp\") return moveBy(-1);\n if (e.key === \"ArrowDown\") return moveBy(1);\n } else {\n if (e.key === \"ArrowLeft\") return moveBy(-1);\n if (e.key === \"ArrowRight\") return moveBy(1);\n }\n };\n\n return (\n <div\n ref={containerRef}\n className={cn(\n \"ods-sortable\",\n `ods-sortable--${direction}`,\n draggingId && \"ods-sortable--dragging\",\n kbActiveId && \"ods-sortable--kb-active\",\n disabled && \"ods-sortable--disabled\",\n className,\n )}\n onDragOver={(e) => {\n // Container-level drag-over fallback so the drop event reliably fires\n if (draggingId) e.preventDefault();\n }}\n onDrop={onContainerDrop}\n >\n {items.map((item, idx) => {\n const isDragging = draggingId === item.id;\n const isKbActive = kbActiveId === item.id;\n const beforeActive = dropPos?.id === item.id && dropPos.edge === \"before\";\n const afterActive = dropPos?.id === item.id && dropPos.edge === \"after\";\n const dragProps: SortableDragProps = {\n dragHandleProps: {\n draggable: !disabled,\n onDragStart: onDragStart(item.id),\n onDragEnd,\n onKeyDown: onHandleKeyDown(item.id),\n role: \"button\",\n \"aria-roledescription\": \"sortable\",\n \"aria-grabbed\": isKbActive,\n tabIndex: 0,\n },\n isDragging,\n isKeyboardActive: isKbActive,\n };\n return (\n <div\n key={item.id}\n ref={(el) => {\n if (el) itemRefs.current.set(item.id, el);\n else itemRefs.current.delete(item.id);\n }}\n className={cn(\n \"ods-sortable__item\",\n isDragging && \"ods-sortable__item--dragging\",\n isKbActive && \"ods-sortable__item--kb-active\",\n beforeActive && \"ods-sortable__item--drop-before\",\n afterActive && \"ods-sortable__item--drop-after\",\n )}\n onDragOver={onItemDragOver(item.id)}\n >\n <span className=\"ods-sortable__indicator ods-sortable__indicator--before\" aria-hidden=\"true\" />\n {renderItem(item, idx, dragProps)}\n <span className=\"ods-sortable__indicator ods-sortable__indicator--after\" aria-hidden=\"true\" />\n </div>\n );\n })}\n {/* Live region for SR announcements */}\n <span className=\"ods-sortable__sr\" aria-live=\"polite\" aria-atomic=\"true\">\n {kbActiveId\n ? `Item picked up. Use arrow keys to reorder, Space or Enter to drop, Escape to cancel.`\n : \"\"}\n </span>\n </div>\n );\n}\n\n// ── Drag handle helper ──────────────────────────────────────────\nexport interface DragHandleProps {\n className?: string;\n style?: CSSProperties;\n ariaLabel?: string;\n /** Spread the dragHandleProps from Sortable's renderItem here. */\n dragProps?: SortableDragProps[\"dragHandleProps\"];\n}\n\nexport function DragHandle({\n className,\n style,\n ariaLabel = \"Drag to reorder\",\n dragProps,\n}: DragHandleProps) {\n return (\n <span\n data-ods-sortable-handle=\"true\"\n aria-label={ariaLabel}\n className={cn(\"ods-sortable-handle\", className)}\n style={style}\n {...dragProps}\n >\n <svg width=\"8\" height=\"14\" viewBox=\"0 0 8 14\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"2\" cy=\"3\" r=\"1\" fill=\"currentColor\" />\n <circle cx=\"6\" cy=\"3\" r=\"1\" fill=\"currentColor\" />\n <circle cx=\"2\" cy=\"7\" r=\"1\" fill=\"currentColor\" />\n <circle cx=\"6\" cy=\"7\" r=\"1\" fill=\"currentColor\" />\n <circle cx=\"2\" cy=\"11\" r=\"1\" fill=\"currentColor\" />\n <circle cx=\"6\" cy=\"11\" r=\"1\" fill=\"currentColor\" />\n </svg>\n </span>\n );\n}\n","\"use client\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface SparklineProps {\n data: number[];\n width?: number;\n height?: number;\n stroke?: string;\n fill?: string;\n smooth?: boolean;\n className?: string;\n \"aria-label\"?: string;\n}\n\nexport function Sparkline({\n data,\n width = 80,\n height = 24,\n stroke = \"var(--ods-accent)\",\n fill,\n smooth = true,\n className,\n \"aria-label\": ariaLabel,\n}: SparklineProps) {\n if (data.length < 2) return null;\n const pad = 1;\n const min = Math.min(...data);\n const max = Math.max(...data);\n const range = Math.max(1, max - min);\n const stepX = (width - pad * 2) / (data.length - 1);\n\n const pts = data.map((y, i) => [\n pad + i * stepX,\n pad + (1 - (y - min) / range) * (height - pad * 2),\n ]) as [number, number][];\n\n let path = `M${pts[0][0]},${pts[0][1]}`;\n if (smooth) {\n for (let i = 0; i < pts.length - 1; i++) {\n const [x0, y0] = pts[Math.max(0, i - 1)];\n const [x1, y1] = pts[i];\n const [x2, y2] = pts[i + 1];\n const [x3, y3] = pts[Math.min(pts.length - 1, i + 2)];\n const cp1x = x1 + (x2 - x0) / 6;\n const cp1y = y1 + (y2 - y0) / 6;\n const cp2x = x2 - (x3 - x1) / 6;\n const cp2y = y2 - (y3 - y1) / 6;\n path += ` C${cp1x},${cp1y} ${cp2x},${cp2y} ${x2},${y2}`;\n }\n } else {\n path += pts\n .slice(1)\n .map(([x, y]) => ` L${x},${y}`)\n .join(\"\");\n }\n\n const area = fill\n ? `${path} L${pts[pts.length - 1][0]},${height - pad} L${pts[0][0]},${height - pad} Z`\n : null;\n\n return (\n <svg\n className={cn(\"ods-sparkline\", className)}\n width={width}\n height={height}\n viewBox={`0 0 ${width} ${height}`}\n role=\"img\"\n aria-label={ariaLabel}\n >\n {area && <path d={area} fill={fill} />}\n <path\n d={path}\n fill=\"none\"\n stroke={stroke}\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n","\"use client\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface SpinnerProps {\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\";\n color?: string;\n className?: string;\n}\n\nconst sizeMap = {\n sm: 16,\n md: 24,\n lg: 32,\n xl: 48,\n} as const;\n\nexport function Spinner({\n size = \"md\",\n color = \"var(--ods-color-brand-500)\",\n className,\n}: SpinnerProps) {\n const px = sizeMap[size];\n\n return (\n <svg\n className={cn(\"ods-spinner\", `ods-spinner--${size}`, className)}\n width={px}\n height={px}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n role=\"status\"\n aria-label=\"Loading\"\n style={{ color }}\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeDasharray=\"31.4 31.4\"\n className={\"ods-spinner__circle\"}\n />\n </svg>\n );\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface StatProps {\n label: ReactNode;\n value: ReactNode;\n delta?: ReactNode;\n deltaTrend?: \"up\" | \"down\" | \"neutral\";\n deltaSuffix?: ReactNode;\n icon?: ReactNode;\n size?: \"sm\" | \"md\" | \"lg\";\n className?: string;\n}\n\nexport function Stat({\n label,\n value,\n delta,\n deltaTrend = \"up\",\n deltaSuffix,\n icon,\n size = \"md\",\n className,\n}: StatProps) {\n return (\n <div className={cn(\"ods-stat\", `ods-stat--${size}`, className)}>\n <div className=\"ods-stat__head\">\n <div className=\"ods-stat__label\">{label}</div>\n {icon && (\n <span className=\"ods-stat__icon\" aria-hidden=\"true\">\n {icon}\n </span>\n )}\n </div>\n <div className=\"ods-stat__value\">{value}</div>\n {delta && (\n <div className={cn(\"ods-stat__delta\", `ods-stat__delta--${deltaTrend}`)}>\n <span className=\"ods-stat__delta-arrow\" aria-hidden=\"true\">\n {deltaTrend === \"up\" && \"▲\"}\n {deltaTrend === \"down\" && \"▼\"}\n {deltaTrend === \"neutral\" && \"—\"}\n </span>\n <span className=\"ods-stat__delta-value\">{delta}</span>\n {deltaSuffix && <span className=\"ods-stat__delta-suffix\">{deltaSuffix}</span>}\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\nimport { type InputHTMLAttributes, type ReactNode, useRef } from \"react\";\nimport { useSwitch } from \"react-aria\";\nimport { useToggleState } from \"react-stately\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface SwitchProps\n extends Omit<InputHTMLAttributes<HTMLInputElement>, \"onChange\" | \"size\"> {\n checked?: boolean;\n defaultChecked?: boolean;\n onChange?: (isSelected: boolean) => void;\n disabled?: boolean;\n size?: \"sm\" | \"md\";\n label?: string | ReactNode;\n className?: string;\n}\n\nexport function Switch({\n checked,\n defaultChecked,\n onChange,\n disabled = false,\n size = \"md\",\n label,\n className,\n ...props\n}: SwitchProps) {\n const ref = useRef<HTMLInputElement>(null);\n\n const state = useToggleState({\n isSelected: checked,\n defaultSelected: defaultChecked,\n onChange,\n });\n\n const { inputProps } = useSwitch(\n {\n isSelected: state.isSelected,\n isDisabled: disabled,\n onChange,\n \"aria-label\": typeof label === \"string\" ? label : undefined,\n },\n state,\n ref,\n );\n\n const isOn = state.isSelected;\n\n return (\n <label\n className={cn(\n \"ods-switch\",\n `ods-switch--${size}`,\n disabled && \"ods-switch--disabled\",\n className,\n )}\n >\n <input {...inputProps} ref={ref} className={\"ods-switch__input\"} />\n <div className={cn(\"ods-switch__track\", isOn && \"ods-switch__track--on\")} aria-hidden=\"true\">\n <div className={\"ods-switch__thumb\"} />\n </div>\n {label && <span className={\"ods-switch__label\"}>{label}</span>}\n </label>\n );\n}\n","\"use client\";\nimport { type ReactNode, useCallback, useState } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface TableColumn<T = any> {\n key: string;\n header: ReactNode;\n sortable?: boolean;\n width?: string | number;\n render?: (value: any, row: T, index: number) => ReactNode;\n}\n\nexport interface TableProps<T extends Record<string, any> = Record<string, any>> {\n columns: TableColumn<T>[];\n data: T[];\n selectable?: boolean;\n selectedRows?: Set<number>;\n onSelectionChange?: (selected: Set<number>) => void;\n expandable?: boolean;\n renderExpanded?: (row: T, index: number) => ReactNode;\n onSort?: (key: string, direction: \"asc\" | \"desc\") => void;\n sortKey?: string;\n sortDirection?: \"asc\" | \"desc\";\n loading?: boolean;\n emptyMessage?: string;\n className?: string;\n}\n\nexport function Table<T extends Record<string, any> = Record<string, any>>({\n columns,\n data,\n selectable = false,\n selectedRows,\n onSelectionChange,\n expandable = false,\n renderExpanded,\n onSort,\n sortKey,\n sortDirection,\n loading = false,\n emptyMessage = \"No data available\",\n className,\n}: TableProps<T>) {\n const _expandedRows = new Set<number>();\n // We use a state-free approach: toggling is handled via a local ref to avoid\n // re-renders for internal-only expanded state. But for simplicity we use a\n // controlled approach where the parent can manage expansion if needed.\n // For self-contained usage, we track expanded rows internally.\n\n const handleSort = useCallback(\n (key: string) => {\n if (!onSort) return;\n const col = columns.find((c) => c.key === key);\n if (!col?.sortable) return;\n const newDirection: \"asc\" | \"desc\" =\n sortKey === key && sortDirection === \"asc\" ? \"desc\" : \"asc\";\n onSort(key, newDirection);\n },\n [columns, onSort, sortKey, sortDirection],\n );\n\n const handleSelectAll = useCallback(() => {\n if (!onSelectionChange) return;\n const allSelected = selectedRows?.size === data.length;\n if (allSelected) {\n onSelectionChange(new Set());\n } else {\n onSelectionChange(new Set(data.map((_, i) => i)));\n }\n }, [data, onSelectionChange, selectedRows]);\n\n const handleSelectRow = useCallback(\n (index: number) => {\n if (!onSelectionChange || !selectedRows) return;\n const next = new Set(selectedRows);\n if (next.has(index)) {\n next.delete(index);\n } else {\n next.add(index);\n }\n onSelectionChange(next);\n },\n [onSelectionChange, selectedRows],\n );\n\n const totalCols = columns.length + (selectable ? 1 : 0) + (expandable ? 1 : 0);\n\n return (\n <div className={cn(\"ods-table-wrapper\", className)} role=\"region\" aria-label=\"Data table\">\n <table className={\"ods-table\"}>\n <thead className={\"ods-table__header\"}>\n <tr>\n {selectable && (\n <th className={\"ods-table__cell--checkbox\"} scope=\"col\">\n <input\n type=\"checkbox\"\n aria-label=\"Select all rows\"\n checked={data.length > 0 && selectedRows?.size === data.length}\n onChange={handleSelectAll}\n />\n </th>\n )}\n {expandable && (\n <th className={\"ods-table__cell--expand\"} scope=\"col\" aria-label=\"Expand\" />\n )}\n {columns.map((col) => (\n <th\n key={col.key}\n className={cn(\"ods-table__cell\", col.sortable && \"ods-table__cell--sortable\")}\n style={col.width ? { width: col.width } : undefined}\n scope=\"col\"\n aria-sort={\n sortKey === col.key\n ? sortDirection === \"asc\"\n ? \"ascending\"\n : \"descending\"\n : undefined\n }\n onClick={col.sortable ? () => handleSort(col.key) : undefined}\n >\n <span className={\"ods-table__header-content\"}>\n {col.header}\n {col.sortable && (\n <span\n className={cn(\n \"ods-table__sort-icon\",\n sortKey === col.key && \"ods-table__sort-icon--active\",\n sortKey === col.key &&\n sortDirection === \"desc\" &&\n \"ods-table__sort-icon--desc\",\n )}\n aria-hidden=\"true\"\n >\n ▲\n </span>\n )}\n </span>\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {loading && (\n <tr>\n <td colSpan={totalCols} className={\"ods-table__loading\"}>\n <div className={\"ods-table__loading-bar\"} />\n </td>\n </tr>\n )}\n {!loading && data.length === 0 && (\n <tr>\n <td colSpan={totalCols} className={\"ods-table__empty\"}>\n {emptyMessage}\n </td>\n </tr>\n )}\n {data.map((row, rowIndex) => (\n <TableRow\n key={rowIndex}\n row={row}\n rowIndex={rowIndex}\n columns={columns}\n selectable={selectable}\n selectedRows={selectedRows}\n onSelectRow={handleSelectRow}\n expandable={expandable}\n renderExpanded={renderExpanded}\n totalCols={totalCols}\n />\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\ninterface TableRowProps<T extends Record<string, any>> {\n row: T;\n rowIndex: number;\n columns: TableColumn<T>[];\n selectable: boolean;\n selectedRows?: Set<number>;\n onSelectRow: (index: number) => void;\n expandable: boolean;\n renderExpanded?: (row: T, index: number) => ReactNode;\n totalCols: number;\n}\n\nfunction TableRow<T extends Record<string, any>>({\n row,\n rowIndex,\n columns,\n selectable,\n selectedRows,\n onSelectRow,\n expandable,\n renderExpanded,\n totalCols,\n}: TableRowProps<T>) {\n const isSelected = selectedRows?.has(rowIndex) ?? false;\n const [expanded, setExpanded] = useState(false);\n\n return (\n <>\n <tr\n className={cn(\"ods-table__row\", isSelected && \"ods-table__row--selected\")}\n data-row-index={rowIndex}\n >\n {selectable && (\n <td className={\"ods-table__cell--checkbox\"}>\n <input\n type=\"checkbox\"\n aria-label={`Select row ${rowIndex + 1}`}\n checked={isSelected}\n onChange={() => onSelectRow(rowIndex)}\n />\n </td>\n )}\n {expandable && (\n <td className={\"ods-table__cell--expand\"}>\n <button\n type=\"button\"\n className={cn(\"ods-table__expand-btn\", expanded && \"ods-table__expand-btn--open\")}\n aria-label={expanded ? \"Collapse row\" : \"Expand row\"}\n onClick={() => setExpanded(!expanded)}\n >\n ▶\n </button>\n </td>\n )}\n {columns.map((col) => (\n <td key={col.key} className={\"ods-table__cell\"}>\n {col.render ? col.render(row[col.key], row, rowIndex) : row[col.key]}\n </td>\n ))}\n </tr>\n {expandable && expanded && renderExpanded && (\n <tr className={\"ods-table__row--expanded\"}>\n <td colSpan={totalCols} className={\"ods-table__expanded-cell\"}>\n {renderExpanded(row, rowIndex)}\n </td>\n </tr>\n )}\n </>\n );\n}\n","\"use client\";\nimport { motion } from \"framer-motion\";\nimport { type ReactNode, useMemo, useRef, useState } from \"react\";\nimport { useTab, useTabList, useTabPanel } from \"react-aria\";\nimport { Item, type TabListStateOptions, useTabListState } from \"react-stately\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface TabItem {\n value: string;\n label: string;\n icon?: ReactNode;\n disabled?: boolean;\n children?: ReactNode;\n}\n\nexport interface TabsProps {\n items: TabItem[];\n value?: string;\n defaultValue?: string;\n onChange?: (value: string) => void;\n orientation?: \"horizontal\" | \"vertical\";\n className?: string;\n}\n\nfunction TabButton({ item, state }: { item: any; state: any }) {\n const ref = useRef<HTMLDivElement>(null);\n const { tabProps } = useTab({ key: item.key }, state, ref);\n const isSelected = state.selectedKey === item.key;\n const isDisabled = state.disabledKeys.has(item.key);\n\n // Remove motion-conflicting props\n const { onDrag, onDragStart, onDragEnd, onAnimationStart, ...safeTabProps } = tabProps as any;\n\n return (\n <motion.div\n {...safeTabProps}\n ref={ref}\n className={cn(\n \"ods-tabs__tab\",\n isSelected && \"ods-tabs__tab--selected\",\n isDisabled && \"ods-tabs__tab--disabled\",\n )}\n >\n {item.rendered}\n {isSelected && (\n <motion.div\n className={\"ods-tabs__indicator\"}\n layoutId=\"ods-tabs-indicator\"\n transition={{ type: \"spring\", damping: 30, stiffness: 400 }}\n />\n )}\n </motion.div>\n );\n}\n\nfunction TabPanelContent({ state, panelContent, ...props }: any) {\n const ref = useRef<HTMLDivElement>(null);\n const { tabPanelProps } = useTabPanel(props, state, ref);\n return (\n <div {...tabPanelProps} ref={ref} className={\"ods-tabs__panel\"}>\n {panelContent}\n </div>\n );\n}\n\nexport function Tabs({\n items,\n value,\n defaultValue,\n onChange,\n orientation = \"horizontal\",\n className,\n}: TabsProps) {\n const [internalValue, setInternalValue] = useState(defaultValue || items[0]?.value);\n const selectedKey = value ?? internalValue;\n\n const handleSelectionChange = (key: any) => {\n const keyStr = String(key);\n if (!value) setInternalValue(keyStr);\n onChange?.(keyStr);\n };\n\n // Build a map of value -> panel content\n const panelContentMap = useMemo(() => {\n const map = new Map<string, ReactNode>();\n items.forEach((item) => {\n map.set(item.value, item.children);\n });\n return map;\n }, [items]);\n\n const stateProps: TabListStateOptions<any> = {\n children: items.map((item) => (\n <Item key={item.value} textValue={item.label}>\n {item.icon && <span className={\"ods-tabs__icon\"}>{item.icon}</span>}\n <span>{item.label}</span>\n </Item>\n )),\n selectedKey,\n onSelectionChange: handleSelectionChange,\n disabledKeys: items.filter((i) => i.disabled).map((i) => i.value),\n };\n\n const state = useTabListState(stateProps);\n const ref = useRef<HTMLDivElement>(null);\n const { tabListProps } = useTabList({ ...stateProps, orientation }, state, ref);\n\n const currentPanelContent = panelContentMap.get(String(selectedKey));\n\n return (\n <div className={cn(\"ods-tabs\", `ods-tabs--${orientation}`, className)}>\n <div {...tabListProps} ref={ref} className={\"ods-tabs__list\"}>\n {[...state.collection].map((item) => (\n <TabButton key={item.key} item={item} state={state} />\n ))}\n </div>\n <TabPanelContent key={state.selectedKey} state={state} panelContent={currentPanelContent} />\n </div>\n );\n}\n","\"use client\";\nimport { type KeyboardEvent, type ReactNode, useState } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface TagsInputProps {\n label?: ReactNode;\n value: string[];\n onChange?: (value: string[]) => void;\n placeholder?: string;\n maxTags?: number;\n disabled?: boolean;\n error?: ReactNode;\n helperText?: ReactNode;\n size?: \"sm\" | \"md\" | \"lg\";\n validate?: (tag: string) => boolean;\n separators?: string[];\n className?: string;\n}\n\nexport function TagsInput({\n label,\n value,\n onChange,\n placeholder = \"Add tag...\",\n maxTags,\n disabled = false,\n error,\n helperText,\n size = \"md\",\n validate,\n separators = [\"Enter\", \",\"],\n className,\n}: TagsInputProps) {\n const [draft, setDraft] = useState(\"\");\n\n const addTag = (raw: string) => {\n const tag = raw.trim();\n if (!tag) return;\n if (validate && !validate(tag)) return;\n if (value.includes(tag)) {\n setDraft(\"\");\n return;\n }\n if (maxTags && value.length >= maxTags) return;\n onChange?.([...value, tag]);\n setDraft(\"\");\n };\n\n const removeTag = (i: number) => {\n onChange?.(value.filter((_, idx) => idx !== i));\n };\n\n const onKey = (e: KeyboardEvent<HTMLInputElement>) => {\n if (separators.includes(e.key)) {\n e.preventDefault();\n addTag(draft);\n } else if (e.key === \"Backspace\" && !draft && value.length) {\n removeTag(value.length - 1);\n }\n };\n\n return (\n <div\n className={cn(\n \"ods-tags\",\n `ods-tags--${size}`,\n disabled && \"ods-tags--disabled\",\n error && \"ods-tags--error\",\n className,\n )}\n >\n {label && <label className=\"ods-tags__label\">{label}</label>}\n <div className=\"ods-tags__field\">\n {value.map((tag, i) => (\n <span key={`${tag}-${i}`} className=\"ods-tags__chip\">\n <span className=\"ods-tags__chip-text\">{tag}</span>\n <button\n type=\"button\"\n className=\"ods-tags__chip-x\"\n onClick={() => removeTag(i)}\n aria-label={`Remove ${tag}`}\n disabled={disabled}\n >\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M2 2l6 6m0-6L2 8\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n </span>\n ))}\n <input\n className=\"ods-tags__input\"\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={onKey}\n onBlur={() => draft && addTag(draft)}\n placeholder={value.length ? \"\" : placeholder}\n disabled={disabled || (maxTags ? value.length >= maxTags : false)}\n />\n </div>\n {error ? (\n <div className=\"ods-tags__hint ods-tags__hint--error\">{error}</div>\n ) : helperText ? (\n <div className=\"ods-tags__hint\">{helperText}</div>\n ) : null}\n </div>\n );\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface TestimonialCardProps {\n quote: ReactNode;\n author: ReactNode;\n role?: ReactNode;\n avatar?: ReactNode;\n initial?: ReactNode;\n rating?: number;\n className?: string;\n}\n\nexport function TestimonialCard({\n quote,\n author,\n role,\n avatar,\n initial,\n rating,\n className,\n}: TestimonialCardProps) {\n return (\n <figure className={cn(\"ods-testimonial\", className)}>\n <svg\n width=\"32\"\n height=\"32\"\n viewBox=\"0 0 32 32\"\n fill=\"none\"\n className=\"ods-testimonial__quote\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M9 20H6c-1 0-1.5-.5-1.5-1.5v-3C4.5 11 7 8 11 8v3c-2 0-3 1.5-3 3v1h1v5zm14 0h-3c-1 0-1.5-.5-1.5-1.5v-3C18.5 11 21 8 25 8v3c-2 0-3 1.5-3 3v1h1v5z\"\n fill=\"currentColor\"\n />\n </svg>\n <blockquote className=\"ods-testimonial__text\">{quote}</blockquote>\n {typeof rating === \"number\" && (\n <div className=\"ods-testimonial__rating\" aria-label={`${rating} out of 5 stars`}>\n {Array.from({ length: 5 }).map((_, i) => (\n <span\n key={i}\n className={cn(\"ods-testimonial__star\", i < rating && \"ods-testimonial__star--on\")}\n >\n ★\n </span>\n ))}\n </div>\n )}\n <figcaption className=\"ods-testimonial__author\">\n <span className=\"ods-testimonial__avatar\">\n {avatar ?? (\n <span>\n {initial ?? (typeof author === \"string\" ? author.charAt(0).toUpperCase() : \"?\")}\n </span>\n )}\n </span>\n <span className=\"ods-testimonial__author-info\">\n <span className=\"ods-testimonial__author-name\">{author}</span>\n {role && <span className=\"ods-testimonial__author-role\">{role}</span>}\n </span>\n </figcaption>\n </figure>\n );\n}\n","\"use client\";\nimport { type TextareaHTMLAttributes, useId, useRef, useState } from \"react\";\nimport { useTextField } from \"react-aria\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface TextareaProps extends Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, \"size\"> {\n label?: string;\n error?: boolean;\n errorMessage?: string;\n resize?: boolean;\n maxLength?: number;\n size?: \"sm\" | \"md\" | \"lg\";\n rows?: number;\n}\n\nexport function Textarea({\n label,\n error = false,\n errorMessage,\n resize = true,\n maxLength,\n size = \"md\",\n rows = 3,\n disabled = false,\n className,\n defaultValue,\n value,\n onChange,\n ...props\n}: TextareaProps) {\n const ref = useRef<HTMLTextAreaElement>(null);\n const errorId = useId();\n const [charCount, setCharCount] = useState(() => String(value ?? defaultValue ?? \"\").length);\n\n const { labelProps, inputProps } = useTextField(\n {\n label: label || props[\"aria-label\"] || \"textarea\",\n isDisabled: disabled,\n errorMessage,\n validationState: error ? \"invalid\" : undefined,\n inputElementType: \"textarea\",\n value: value as string | undefined,\n defaultValue: defaultValue as string | undefined,\n },\n ref,\n );\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n setCharCount(e.target.value.length);\n onChange?.(e);\n };\n\n return (\n <div\n className={cn(\n \"ods-textarea\",\n `ods-textarea--${size}`,\n error && \"ods-textarea--error\",\n disabled && \"ods-textarea--disabled\",\n className,\n )}\n >\n {label && (\n <label {...labelProps} className={\"ods-textarea__label\"}>\n {label}\n </label>\n )}\n <div className={\"ods-textarea__wrapper\"}>\n <textarea\n {...inputProps}\n ref={ref}\n rows={rows}\n disabled={disabled}\n maxLength={maxLength}\n defaultValue={defaultValue}\n value={value}\n onChange={handleChange}\n className={cn(\"ods-textarea__field\", !resize && \"ods-textarea__field--no-resize\")}\n aria-invalid={error || undefined}\n aria-describedby={error && errorMessage ? errorId : undefined}\n />\n {maxLength != null && (\n <span className={\"ods-textarea__count\"} aria-live=\"polite\">\n {charCount}/{maxLength}\n </span>\n )}\n </div>\n {error && errorMessage && (\n <div id={errorId} className={\"ods-textarea__error-message\"} role=\"alert\">\n {errorMessage}\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport type TimelineStatus = \"default\" | \"success\" | \"warning\" | \"error\" | \"muted\";\n\nexport interface TimelineItem {\n id: string;\n title: ReactNode;\n description?: ReactNode;\n meta?: ReactNode;\n icon?: ReactNode;\n status?: TimelineStatus;\n}\n\nexport interface TimelineProps {\n items: TimelineItem[];\n size?: \"sm\" | \"md\";\n className?: string;\n}\n\nexport function Timeline({ items, size = \"md\", className }: TimelineProps) {\n return (\n <ol className={cn(\"ods-timeline\", `ods-timeline--${size}`, className)}>\n {items.map((item, idx) => {\n const last = idx === items.length - 1;\n const status = item.status ?? \"default\";\n return (\n <li key={item.id} className=\"ods-timeline__item\">\n <div className=\"ods-timeline__rail\">\n <span\n className={cn(\"ods-timeline__dot\", `ods-timeline__dot--${status}`)}\n aria-hidden=\"true\"\n >\n {item.icon}\n </span>\n {!last && <span className=\"ods-timeline__line\" aria-hidden=\"true\" />}\n </div>\n <div className=\"ods-timeline__body\">\n <div className=\"ods-timeline__title\">{item.title}</div>\n {item.description && <div className=\"ods-timeline__desc\">{item.description}</div>}\n {item.meta && <div className=\"ods-timeline__meta\">{item.meta}</div>}\n </div>\n </li>\n );\n })}\n </ol>\n );\n}\n","\"use client\";\nimport {\n Fragment,\n type KeyboardEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface TimeValue {\n hours: number;\n minutes: number;\n seconds?: number;\n period?: \"AM\" | \"PM\";\n}\n\nexport interface TimePickerProps {\n label?: ReactNode;\n value: TimeValue;\n onChange?: (value: TimeValue) => void;\n use24h?: boolean;\n showSeconds?: boolean;\n minuteStep?: number;\n secondStep?: number;\n size?: \"sm\" | \"md\" | \"lg\";\n disabled?: boolean;\n error?: ReactNode;\n helperText?: ReactNode;\n className?: string;\n}\n\ntype Segment = \"hours\" | \"minutes\" | \"seconds\";\n\nconst pad = (n: number) => n.toString().padStart(2, \"0\");\n\nfunction format(v: TimeValue, use24h: boolean, showSeconds: boolean): string {\n const base = `${pad(v.hours)}:${pad(v.minutes)}${showSeconds ? `:${pad(v.seconds ?? 0)}` : \"\"}`;\n return use24h ? base : `${base} ${v.period ?? \"AM\"}`;\n}\n\nfunction clampSeg(seg: Segment, n: number, use24h: boolean): number {\n if (seg === \"hours\") {\n if (use24h) return Math.max(0, Math.min(23, n));\n return Math.max(1, Math.min(12, n));\n }\n return Math.max(0, Math.min(59, n));\n}\n\nexport function TimePicker({\n label,\n value,\n onChange,\n use24h = false,\n showSeconds = false,\n minuteStep = 1,\n secondStep = 1,\n size = \"md\",\n disabled = false,\n error,\n helperText,\n className,\n}: TimePickerProps) {\n const [open, setOpen] = useState(false);\n const [activeSeg, setActiveSeg] = useState<Segment | null>(null);\n // Keep the in-progress draft in a ref so rapid keystrokes always see the\n // latest digit (state updates are async and would otherwise drop key #2).\n const draftRef = useRef<string>(\"\");\n const wrapRef = useRef<HTMLDivElement>(null);\n const hoursRef = useRef<HTMLButtonElement>(null);\n const minutesRef = useRef<HTMLButtonElement>(null);\n const secondsRef = useRef<HTMLButtonElement>(null);\n\n const refOf = (s: Segment) =>\n s === \"hours\" ? hoursRef : s === \"minutes\" ? minutesRef : secondsRef;\n\n useEffect(() => {\n if (!open) return;\n const onDoc = (e: MouseEvent) => {\n if (!wrapRef.current?.contains(e.target as Node)) {\n setOpen(false);\n setActiveSeg(null);\n }\n };\n document.addEventListener(\"mousedown\", onDoc);\n return () => document.removeEventListener(\"mousedown\", onDoc);\n }, [open]);\n\n const commit = useCallback(\n (seg: Segment, n: number) => {\n const next: TimeValue = { ...value, [seg]: clampSeg(seg, n, use24h) };\n if (showSeconds && next.seconds === undefined) next.seconds = 0;\n onChange?.(next);\n },\n [value, use24h, onChange, showSeconds],\n );\n\n const stepBy = (seg: Segment, delta: number) => {\n const step = seg === \"hours\" ? 1 : seg === \"minutes\" ? minuteStep : secondStep;\n const cur =\n seg === \"hours\" ? value.hours : seg === \"minutes\" ? value.minutes : (value.seconds ?? 0);\n let next = cur + delta * step;\n if (seg === \"hours\") {\n const max = use24h ? 23 : 12;\n const min = use24h ? 0 : 1;\n if (next > max) next = min;\n if (next < min) next = max;\n } else {\n if (next >= 60) next -= 60;\n if (next < 0) next += 60;\n }\n commit(seg, next);\n };\n\n const setPeriod = (p: \"AM\" | \"PM\") => onChange?.({ ...value, period: p });\n\n const focusSegment = (seg: Segment) => {\n setActiveSeg(seg);\n draftRef.current = \"\";\n requestAnimationFrame(() => refOf(seg).current?.focus());\n };\n\n const segOrder = (): Segment[] =>\n showSeconds ? [\"hours\", \"minutes\", \"seconds\"] : [\"hours\", \"minutes\"];\n\n const handleSegKey = (seg: Segment) => (e: KeyboardEvent<HTMLButtonElement>) => {\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n stepBy(seg, 1);\n } else if (e.key === \"ArrowDown\") {\n e.preventDefault();\n stepBy(seg, -1);\n } else if (e.key === \"ArrowLeft\") {\n e.preventDefault();\n const order = segOrder();\n focusSegment(order[Math.max(0, order.indexOf(seg) - 1)]);\n } else if (e.key === \"ArrowRight\" || e.key === \":\" || e.key === \" \") {\n e.preventDefault();\n const order = segOrder();\n focusSegment(order[Math.min(order.length - 1, order.indexOf(seg) + 1)]);\n } else if (/^[0-9]$/.test(e.key)) {\n e.preventDefault();\n // Two-digit logic with overflow heuristic:\n // - \"0\" alone keeps draft \"0\" so the next digit appends\n // - first digit too large to fit a 2nd one (e.g. \"5\" in 12h hours, or\n // \"6\"+ for minutes/seconds) commits and advances immediately\n const max = seg === \"hours\" ? (use24h ? 23 : 12) : 59;\n const cur = draftRef.current;\n const combined = cur + e.key;\n const combinedNum = parseInt(combined, 10);\n\n if (cur.length === 0) {\n // First key\n const n = parseInt(e.key, 10);\n if (n * 10 > max) {\n // Cannot prefix a 2nd digit — commit and jump to next segment\n commit(seg, n);\n draftRef.current = \"\";\n const order = segOrder();\n const nx = order[order.indexOf(seg) + 1];\n if (nx) focusSegment(nx);\n } else {\n draftRef.current = e.key;\n commit(seg, n);\n }\n } else {\n // Second key\n if (combinedNum <= max) {\n commit(seg, combinedNum);\n } else {\n commit(seg, parseInt(e.key, 10));\n }\n draftRef.current = \"\";\n const order = segOrder();\n const nx = order[order.indexOf(seg) + 1];\n if (nx) focusSegment(nx);\n }\n } else if (e.key === \"Backspace\") {\n e.preventDefault();\n draftRef.current = \"\";\n commit(seg, 0);\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n setActiveSeg(null);\n draftRef.current = \"\";\n }\n };\n\n const segButton = (seg: Segment, val: number) => (\n <button\n ref={refOf(seg)}\n type=\"button\"\n className={cn(\"ods-timepicker__seg\", activeSeg === seg && \"ods-timepicker__seg--active\")}\n onClick={() => focusSegment(seg)}\n onKeyDown={handleSegKey(seg)}\n onBlur={() => activeSeg === seg && setActiveSeg(null)}\n aria-label={seg}\n >\n {pad(val)}\n </button>\n );\n\n return (\n <div\n ref={wrapRef}\n className={cn(\n \"ods-timepicker\",\n `ods-timepicker--${size}`,\n disabled && \"ods-timepicker--disabled\",\n error && \"ods-timepicker--error\",\n className,\n )}\n >\n {label && <label className=\"ods-timepicker__label\">{label}</label>}\n <button\n type=\"button\"\n className=\"ods-timepicker__trigger\"\n onClick={() => !disabled && setOpen((o) => !o)}\n disabled={disabled}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"8\" cy=\"8\" r=\"6\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path\n d=\"M8 4.5V8l2.5 1.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n <span className=\"ods-timepicker__value\">{format(value, use24h, showSeconds)}</span>\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n aria-hidden=\"true\"\n className=\"ods-timepicker__chev\"\n >\n <path\n d=\"M3 4.5 6 7.5 9 4.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n {open && (\n <div className=\"ods-timepicker__popover\" role=\"dialog\">\n <div className=\"ods-timepicker__head\">\n <div className=\"ods-timepicker__display\">\n {segButton(\"hours\", value.hours)}\n <span className=\"ods-timepicker__display-sep\">:</span>\n {segButton(\"minutes\", value.minutes)}\n {showSeconds && (\n <>\n <span className=\"ods-timepicker__display-sep\">:</span>\n {segButton(\"seconds\", value.seconds ?? 0)}\n </>\n )}\n </div>\n {!use24h && (\n <div className=\"ods-timepicker__period\">\n <button\n type=\"button\"\n className={cn(\n \"ods-timepicker__period-btn\",\n value.period === \"AM\" && \"ods-timepicker__period-btn--active\",\n )}\n onClick={() => setPeriod(\"AM\")}\n >\n AM\n </button>\n <button\n type=\"button\"\n className={cn(\n \"ods-timepicker__period-btn\",\n value.period === \"PM\" && \"ods-timepicker__period-btn--active\",\n )}\n onClick={() => setPeriod(\"PM\")}\n >\n PM\n </button>\n </div>\n )}\n </div>\n <div className=\"ods-timepicker__body\">\n {segOrder().map((seg, i, arr) => (\n <Fragment key={seg}>\n <div className=\"ods-timepicker__col\">\n <span className=\"ods-timepicker__col-lbl\">\n {seg === \"hours\" ? \"HOUR\" : seg === \"minutes\" ? \"MIN\" : \"SEC\"}\n </span>\n <button\n type=\"button\"\n className=\"ods-timepicker__step\"\n onClick={() => stepBy(seg, 1)}\n aria-label={`${seg} up`}\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M5 11l4-4 4 4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.7\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n <span className=\"ods-timepicker__col-val\">\n {pad(\n seg === \"hours\"\n ? value.hours\n : seg === \"minutes\"\n ? value.minutes\n : (value.seconds ?? 0),\n )}\n </span>\n <button\n type=\"button\"\n className=\"ods-timepicker__step\"\n onClick={() => stepBy(seg, -1)}\n aria-label={`${seg} down`}\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M5 7l4 4 4-4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.7\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n </div>\n {i < arr.length - 1 && <span className=\"ods-timepicker__sep\">:</span>}\n </Fragment>\n ))}\n </div>\n </div>\n )}\n {error ? (\n <div className=\"ods-timepicker__hint ods-timepicker__hint--error\">{error}</div>\n ) : helperText ? (\n <div className=\"ods-timepicker__hint\">{helperText}</div>\n ) : null}\n </div>\n );\n}\n","\"use client\";\nimport { type ReactNode, useEffect, useMemo, useRef, useState } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface TimezoneOption {\n /** IANA name, e.g. \"America/Los_Angeles\". */\n iana: string;\n /** Friendly label e.g. \"Pacific Time\". */\n label: string;\n /** UTC offset string e.g. \"UTC−8\" or \"UTC+5:30\". */\n offset: string;\n /** Optional country / region for filtering. */\n region?: string;\n}\n\nexport interface TimezonePickerProps {\n label?: ReactNode;\n value: string; // IANA name\n onChange?: (iana: string) => void;\n options?: TimezoneOption[];\n size?: \"sm\" | \"md\" | \"lg\";\n disabled?: boolean;\n error?: ReactNode;\n helperText?: ReactNode;\n placeholder?: string;\n className?: string;\n}\n\nconst DEFAULT_TZS: TimezoneOption[] = [\n { iana: \"America/Los_Angeles\", label: \"Pacific Time\", offset: \"UTC−8\" },\n { iana: \"America/Denver\", label: \"Mountain Time\", offset: \"UTC−7\" },\n { iana: \"America/Chicago\", label: \"Central Time\", offset: \"UTC−6\" },\n { iana: \"America/New_York\", label: \"Eastern Time\", offset: \"UTC−5\" },\n { iana: \"Europe/London\", label: \"London\", offset: \"UTC+0\" },\n { iana: \"Europe/Berlin\", label: \"Berlin\", offset: \"UTC+1\" },\n { iana: \"Europe/Athens\", label: \"Athens\", offset: \"UTC+2\" },\n { iana: \"Asia/Dubai\", label: \"Dubai\", offset: \"UTC+4\" },\n { iana: \"Asia/Kolkata\", label: \"India Standard Time\", offset: \"UTC+5:30\" },\n { iana: \"Asia/Singapore\", label: \"Singapore\", offset: \"UTC+8\" },\n { iana: \"Asia/Tokyo\", label: \"Tokyo\", offset: \"UTC+9\" },\n { iana: \"Australia/Sydney\", label: \"Sydney\", offset: \"UTC+10\" },\n];\n\nexport function TimezonePicker({\n label,\n value,\n onChange,\n options = DEFAULT_TZS,\n size = \"md\",\n disabled = false,\n error,\n helperText,\n placeholder = \"Select timezone\",\n className,\n}: TimezonePickerProps) {\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState(\"\");\n const wrapRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const selected = options.find((o) => o.iana === value);\n\n const filtered = useMemo(() => {\n if (!query.trim()) return options;\n const q = query.trim().toLowerCase();\n return options.filter(\n (o) =>\n o.iana.toLowerCase().includes(q) ||\n o.label.toLowerCase().includes(q) ||\n o.offset.toLowerCase().includes(q) ||\n o.region?.toLowerCase().includes(q),\n );\n }, [options, query]);\n\n useEffect(() => {\n if (!open) return;\n const onDoc = (e: MouseEvent) => {\n if (!wrapRef.current?.contains(e.target as Node)) {\n setOpen(false);\n setQuery(\"\");\n }\n };\n document.addEventListener(\"mousedown\", onDoc);\n return () => document.removeEventListener(\"mousedown\", onDoc);\n }, [open]);\n\n useEffect(() => {\n if (open) requestAnimationFrame(() => inputRef.current?.focus());\n }, [open]);\n\n const select = (iana: string) => {\n onChange?.(iana);\n setOpen(false);\n setQuery(\"\");\n };\n\n return (\n <div\n ref={wrapRef}\n className={cn(\n \"ods-tzpicker\",\n `ods-tzpicker--${size}`,\n disabled && \"ods-tzpicker--disabled\",\n error && \"ods-tzpicker--error\",\n className,\n )}\n >\n {label && <label className=\"ods-tzpicker__label\">{label}</label>}\n <button\n type=\"button\"\n className=\"ods-tzpicker__trigger\"\n onClick={() => !disabled && setOpen((o) => !o)}\n disabled={disabled}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"8\" cy=\"8\" r=\"6\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path\n d=\"M2 8h12M8 2c1.8 2 1.8 10 0 12M8 2c-1.8 2-1.8 10 0 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.3\"\n strokeLinecap=\"round\"\n />\n </svg>\n <span className=\"ods-tzpicker__info\">\n {selected ? (\n <>\n <span className=\"ods-tzpicker__name\">{selected.label}</span>\n <span className=\"ods-tzpicker__meta\">\n {selected.iana.split(\"/\").pop()?.replace(/_/g, \" \")} · {selected.offset}\n </span>\n </>\n ) : (\n <span className=\"ods-tzpicker__name ods-tzpicker__name--placeholder\">\n {placeholder}\n </span>\n )}\n </span>\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n aria-hidden=\"true\"\n className=\"ods-tzpicker__chev\"\n >\n <path\n d=\"M3 4.5 6 7.5 9 4.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n {open && (\n <div className=\"ods-tzpicker__popover\">\n <div className=\"ods-tzpicker__search\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"6\" cy=\"6\" r=\"4.5\" stroke=\"currentColor\" strokeWidth=\"1.4\" />\n <path\n d=\"m12 12-2.5-2.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n />\n </svg>\n <input\n ref={inputRef}\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder=\"Search timezone or city…\"\n aria-label=\"Search timezones\"\n />\n </div>\n <ul className=\"ods-tzpicker__list\" role=\"listbox\">\n {filtered.length === 0 && <li className=\"ods-tzpicker__empty\">No timezones found</li>}\n {filtered.map((opt) => (\n <li key={opt.iana}>\n <button\n type=\"button\"\n role=\"option\"\n aria-selected={opt.iana === value}\n className={cn(\n \"ods-tzpicker__opt\",\n opt.iana === value && \"ods-tzpicker__opt--selected\",\n )}\n onClick={() => select(opt.iana)}\n >\n <span className=\"ods-tzpicker__opt-text\">\n <span className=\"ods-tzpicker__opt-name\">{opt.label}</span>\n <span className=\"ods-tzpicker__opt-iana\">{opt.iana}</span>\n </span>\n <span className=\"ods-tzpicker__opt-off\">{opt.offset}</span>\n {opt.iana === value && (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n aria-hidden=\"true\"\n className=\"ods-tzpicker__opt-check\"\n >\n <path\n d=\"m3 7.5 3 3 5-6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.7\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </button>\n </li>\n ))}\n </ul>\n </div>\n )}\n {error ? (\n <div className=\"ods-tzpicker__hint ods-tzpicker__hint--error\">{error}</div>\n ) : helperText ? (\n <div className=\"ods-tzpicker__hint\">{helperText}</div>\n ) : null}\n </div>\n );\n}\n","\"use client\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport {\n createContext,\n type ReactNode,\n useCallback,\n useContext,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"../../utils/cn\";\n\n// ─────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────\nexport type ToastVariant = \"success\" | \"error\" | \"warning\" | \"info\";\nexport type ToastPosition =\n | \"top-left\"\n | \"top-center\"\n | \"top-right\"\n | \"bottom-left\"\n | \"bottom-center\"\n | \"bottom-right\";\n\nexport interface ToastOptions {\n variant?: ToastVariant;\n /** Shorthand — shown as the title. */\n message?: ReactNode;\n title?: ReactNode;\n description?: ReactNode;\n icon?: ReactNode;\n action?: ReactNode;\n /** Completely replaces the default body. */\n render?: (props: { id: string; dismiss: () => void }) => ReactNode;\n duration?: number;\n closeable?: boolean;\n position?: ToastPosition;\n}\n\ninterface ToastItem extends Omit<ToastOptions, \"duration\" | \"closeable\" | \"variant\" | \"position\"> {\n id: string;\n variant: ToastVariant;\n duration: number;\n closeable: boolean;\n position: ToastPosition;\n}\n\ninterface ToastContextValue {\n toast: (options: ToastOptions) => string;\n dismiss: (id: string) => void;\n dismissAll: (position?: ToastPosition) => void;\n}\n\n// ─────────────────────────────────────────────\n// Default icons\n// ─────────────────────────────────────────────\nconst defaultIcons: Record<ToastVariant, ReactNode> = {\n success: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"8\" cy=\"8\" r=\"7\" fill=\"var(--ods-status-success-bg)\" stroke=\"var(--ods-status-success-bd)\" />\n <path\n d=\"m5 8 2 2 4-4.5\"\n stroke=\"var(--ods-status-success-fg)\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n ),\n error: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"8\" cy=\"8\" r=\"7\" fill=\"var(--ods-status-failed-bg)\" stroke=\"var(--ods-status-failed-bd)\" />\n <path\n d=\"M5.5 5.5l5 5M10.5 5.5l-5 5\"\n stroke=\"var(--ods-status-failed-fg)\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n />\n </svg>\n ),\n warning: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"8\" cy=\"8\" r=\"7\" fill=\"var(--ods-status-pending-bg)\" stroke=\"var(--ods-status-pending-bd)\" />\n <path\n d=\"M8 4.5v4.2M8 11v.5\"\n stroke=\"var(--ods-status-pending-fg)\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n />\n </svg>\n ),\n info: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"8\" cy=\"8\" r=\"7\" fill=\"var(--ods-status-running-bg)\" stroke=\"var(--ods-status-running-bd)\" />\n <path\n d=\"M8 7.5v4M8 4.5v.5\"\n stroke=\"var(--ods-status-running-fg)\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n />\n </svg>\n ),\n};\n\nconst ToastContext = createContext<ToastContextValue | null>(null);\n\n// ─────────────────────────────────────────────\n// Toast body\n// ─────────────────────────────────────────────\nfunction ToastBody({ item, onDismiss }: { item: ToastItem; onDismiss: (id: string) => void }) {\n const dismiss = () => onDismiss(item.id);\n\n if (item.render) return <>{item.render({ id: item.id, dismiss })}</>;\n\n const title = item.title ?? item.message;\n return (\n <>\n <span className=\"ods-toast__icon\" aria-hidden=\"true\">\n {item.icon ?? defaultIcons[item.variant]}\n </span>\n <div className=\"ods-toast__body\">\n {title && <div className=\"ods-toast__title\">{title}</div>}\n {item.description && <div className=\"ods-toast__desc\">{item.description}</div>}\n </div>\n {item.action && <div className=\"ods-toast__action\">{item.action}</div>}\n {item.closeable && (\n <button\n type=\"button\"\n className=\"ods-toast__close\"\n aria-label=\"Dismiss\"\n onClick={(e) => {\n e.stopPropagation();\n dismiss();\n }}\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M3 3l8 8M11 3l-8 8\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n )}\n </>\n );\n}\n\n// ─────────────────────────────────────────────\n// Stack per-position (handles stacking, hover expand, click pin)\n// ─────────────────────────────────────────────\ninterface StackProps {\n items: ToastItem[];\n position: ToastPosition;\n onDismiss: (id: string) => void;\n maxStack: number;\n}\n\nfunction PositionStack({ items, position, onDismiss, maxStack }: StackProps) {\n const [hovered, setHovered] = useState(false);\n const [pinned, setPinned] = useState(false);\n const expanded = hovered || pinned;\n\n // Display order: newest first (index 0 = newest)\n const ordered = useMemo(() => [...items].reverse(), [items]);\n const isBottom = position.startsWith(\"bottom\");\n const dir = isBottom ? -1 : 1;\n\n // Reset pinned state when the last toast dismisses\n if (pinned && items.length === 0) setPinned(false);\n\n // Per-index stacked transform (only used when collapsed)\n const stackedStyle = (idx: number) => {\n if (expanded) return { y: 0, scale: 1, opacity: 1 };\n if (idx === 0) return { y: 0, scale: 1, opacity: 1 };\n if (idx < maxStack) {\n return {\n y: idx * 10 * dir,\n scale: 1 - idx * 0.05,\n opacity: 1 - idx * 0.22,\n };\n }\n // Hidden beyond the stack depth\n return { y: maxStack * 10 * dir, scale: 1 - maxStack * 0.05, opacity: 0 };\n };\n\n return (\n <div\n className={cn(\n \"ods-toast-stack\",\n `ods-toast-stack--${position}`,\n expanded && \"ods-toast-stack--expanded\",\n pinned && \"ods-toast-stack--pinned\",\n )}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n aria-live=\"polite\"\n >\n <div\n className={cn(\"ods-toast-stack__scroll\", expanded && \"ods-toast-stack__scroll--expanded\")}\n style={expanded ? { flexDirection: isBottom ? \"column-reverse\" : \"column\" } : undefined}\n onClick={(e) => {\n // Only handle clicks on the container itself (not on a toast or its buttons).\n if (e.target === e.currentTarget && items.length > 1) {\n setPinned((p) => !p);\n }\n }}\n >\n <AnimatePresence mode=\"popLayout\">\n {ordered.map((item, idx) => {\n const s = stackedStyle(idx);\n return (\n <motion.div\n key={item.id}\n layout\n className={cn(\n \"ods-toast\",\n `ods-toast--${item.variant}`,\n !expanded && \"ods-toast--stacked\",\n )}\n style={{\n zIndex: ordered.length - idx,\n transformOrigin: isBottom ? \"bottom center\" : \"top center\",\n }}\n initial={{ opacity: 0, y: 24 * -dir, scale: 0.96 }}\n animate={{ opacity: s.opacity, y: s.y, scale: s.scale }}\n exit={{ opacity: 0, y: 10 * -dir, scale: 0.96 }}\n transition={{ type: \"tween\", duration: 0.28, ease: [0.32, 0.72, 0, 1] }}\n onClick={(e) => {\n // Click on the newest toast (or anywhere on a stacked toast) toggles pin\n if (!expanded && items.length > 1) {\n e.stopPropagation();\n setPinned(true);\n }\n }}\n >\n <ToastBody item={item} onDismiss={onDismiss} />\n </motion.div>\n );\n })}\n </AnimatePresence>\n </div>\n {expanded && items.length > 1 && pinned && (\n <button\n type=\"button\"\n className=\"ods-toast-stack__collapse\"\n onClick={() => setPinned(false)}\n aria-label=\"Collapse toasts\"\n >\n Collapse\n </button>\n )}\n </div>\n );\n}\n\n// ─────────────────────────────────────────────\n// Provider\n// ─────────────────────────────────────────────\nexport interface ToastProviderProps {\n children: ReactNode;\n defaultPosition?: ToastPosition;\n /** How many toasts to show \"peeking\" when collapsed. Default 3. */\n maxStack?: number;\n}\n\nconst POSITIONS: ToastPosition[] = [\n \"top-left\",\n \"top-center\",\n \"top-right\",\n \"bottom-left\",\n \"bottom-center\",\n \"bottom-right\",\n];\n\nexport function ToastProvider({\n children,\n defaultPosition = \"bottom-right\",\n maxStack = 3,\n}: ToastProviderProps) {\n const [toasts, setToasts] = useState<ToastItem[]>([]);\n const timers = useRef<Map<string, ReturnType<typeof setTimeout>>>(new Map());\n const idCounter = useRef(0);\n\n const dismiss = useCallback((id: string) => {\n setToasts((prev) => prev.filter((t) => t.id !== id));\n const timer = timers.current.get(id);\n if (timer) {\n clearTimeout(timer);\n timers.current.delete(id);\n }\n }, []);\n\n const dismissAll = useCallback((position?: ToastPosition) => {\n setToasts((prev) => {\n const remaining = position ? prev.filter((t) => t.position !== position) : [];\n for (const t of prev) {\n if (!remaining.find((r) => r.id === t.id)) {\n const timer = timers.current.get(t.id);\n if (timer) {\n clearTimeout(timer);\n timers.current.delete(t.id);\n }\n }\n }\n return remaining;\n });\n }, []);\n\n const toast = useCallback(\n (options: ToastOptions): string => {\n const id = `toast-${++idCounter.current}`;\n const item: ToastItem = {\n id,\n variant: options.variant ?? \"info\",\n message: options.message,\n title: options.title,\n description: options.description,\n icon: options.icon,\n action: options.action,\n render: options.render,\n duration: options.duration ?? 5000,\n closeable: options.closeable ?? true,\n position: options.position ?? defaultPosition,\n };\n setToasts((prev) => [...prev, item]);\n if (item.duration > 0) {\n const timer = setTimeout(() => dismiss(id), item.duration);\n timers.current.set(id, timer);\n }\n return id;\n },\n [dismiss, defaultPosition],\n );\n\n const groups = useMemo(() => {\n const out: Record<ToastPosition, ToastItem[]> = {\n \"top-left\": [],\n \"top-center\": [],\n \"top-right\": [],\n \"bottom-left\": [],\n \"bottom-center\": [],\n \"bottom-right\": [],\n };\n for (const t of toasts) out[t.position].push(t);\n return out;\n }, [toasts]);\n\n const ctx: ToastContextValue = { toast, dismiss, dismissAll };\n\n const containers = (\n <>\n {POSITIONS.map((pos) => {\n const list = groups[pos];\n if (list.length === 0) return null;\n return (\n <PositionStack\n key={pos}\n items={list}\n position={pos}\n maxStack={maxStack}\n onDismiss={dismiss}\n />\n );\n })}\n </>\n );\n\n return (\n <ToastContext.Provider value={ctx}>\n {children}\n {typeof document !== \"undefined\" && createPortal(containers, document.body)}\n </ToastContext.Provider>\n );\n}\n\n// ─────────────────────────────────────────────\n// Hook\n// ─────────────────────────────────────────────\nexport function useToast() {\n const ctx = useContext(ToastContext);\n if (!ctx) throw new Error(\"useToast must be used within a ToastProvider\");\n const { toast: raw, dismiss, dismissAll } = ctx;\n\n const toast = Object.assign((options: ToastOptions) => raw(options), {\n success: (message: ReactNode, opts: Omit<ToastOptions, \"variant\" | \"message\"> = {}) =>\n raw({ ...opts, variant: \"success\", message }),\n error: (message: ReactNode, opts: Omit<ToastOptions, \"variant\" | \"message\"> = {}) =>\n raw({ ...opts, variant: \"error\", message }),\n warning: (message: ReactNode, opts: Omit<ToastOptions, \"variant\" | \"message\"> = {}) =>\n raw({ ...opts, variant: \"warning\", message }),\n info: (message: ReactNode, opts: Omit<ToastOptions, \"variant\" | \"message\"> = {}) =>\n raw({ ...opts, variant: \"info\", message }),\n custom: (\n render: NonNullable<ToastOptions[\"render\"]>,\n opts: Omit<ToastOptions, \"render\"> = {},\n ) => raw({ ...opts, render }),\n });\n\n return { toast, dismiss, dismissAll };\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface ToggleOption<T extends string = string> {\n value: T;\n label: ReactNode;\n icon?: ReactNode;\n disabled?: boolean;\n}\n\nexport interface ToggleProps<T extends string = string> {\n options: ToggleOption<T>[];\n value: T;\n onChange?: (value: T) => void;\n size?: \"sm\" | \"md\" | \"lg\";\n fullWidth?: boolean;\n className?: string;\n \"aria-label\"?: string;\n}\n\nexport function Toggle<T extends string = string>({\n options,\n value,\n onChange,\n size = \"md\",\n fullWidth = false,\n className,\n ...props\n}: ToggleProps<T>) {\n return (\n <div\n role=\"radiogroup\"\n aria-label={props[\"aria-label\"]}\n className={cn(\n \"ods-toggle\",\n `ods-toggle--${size}`,\n fullWidth && \"ods-toggle--full\",\n className,\n )}\n >\n {options.map((opt) => {\n const active = opt.value === value;\n return (\n <button\n key={opt.value}\n type=\"button\"\n role=\"radio\"\n aria-checked={active}\n disabled={opt.disabled}\n onClick={() => onChange?.(opt.value)}\n className={cn(\"ods-toggle__opt\", active && \"ods-toggle__opt--active\")}\n >\n {opt.icon && (\n <span className=\"ods-toggle__icon\" aria-hidden=\"true\">\n {opt.icon}\n </span>\n )}\n <span className=\"ods-toggle__label\">{opt.label}</span>\n </button>\n );\n })}\n </div>\n );\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface ToolbarProps {\n children: ReactNode;\n className?: string;\n}\n\nexport function Toolbar({ children, className }: ToolbarProps) {\n return (\n <div role=\"toolbar\" className={cn(\"ods-toolbar\", className)}>\n {children}\n </div>\n );\n}\n\nexport interface ToolbarButtonProps {\n icon?: ReactNode;\n label?: ReactNode;\n active?: boolean;\n disabled?: boolean;\n onClick?: () => void;\n ariaLabel?: string;\n className?: string;\n children?: ReactNode;\n}\n\nexport function ToolbarButton({\n icon,\n label,\n active = false,\n disabled = false,\n onClick,\n ariaLabel,\n className,\n children,\n}: ToolbarButtonProps) {\n return (\n <button\n type=\"button\"\n className={cn(\"ods-toolbar__btn\", active && \"ods-toolbar__btn--active\", className)}\n onClick={onClick}\n disabled={disabled}\n aria-pressed={active}\n aria-label={ariaLabel ?? (typeof label === \"string\" ? label : undefined)}\n >\n {icon && (\n <span className=\"ods-toolbar__btn-icon\" aria-hidden=\"true\">\n {icon}\n </span>\n )}\n {label && <span className=\"ods-toolbar__btn-label\">{label}</span>}\n {children}\n </button>\n );\n}\n\nexport function ToolbarDivider() {\n return <span className=\"ods-toolbar__divider\" aria-hidden=\"true\" />;\n}\n\nexport function ToolbarSpacer() {\n return <span className=\"ods-toolbar__spacer\" />;\n}\n","\"use client\";\nimport { type ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport type ToolCategory =\n | \"search\"\n | \"database\"\n | \"web\"\n | \"code\"\n | \"file\"\n | \"api\"\n | \"ai\"\n | \"custom\";\n\nexport interface ToolCardProps {\n name: ReactNode;\n description?: ReactNode;\n icon?: ReactNode;\n category?: ToolCategory;\n /** When true, renders a switch on the right. */\n enabled?: boolean;\n onToggle?: (next: boolean) => void;\n /** Hide the toggle entirely. */\n hideToggle?: boolean;\n /** Show \"new\" badge. */\n isNew?: boolean;\n /** Disabled state (e.g. waiting on auth). */\n disabled?: boolean;\n /** Required permissions / auth status. */\n badge?: ReactNode;\n /** Compact / dense variant. */\n compact?: boolean;\n onClick?: () => void;\n className?: string;\n}\n\nconst CATEGORY_GLYPH: Record<ToolCategory, ReactNode> = {\n search: (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"6\" cy=\"6\" r=\"4.5\" stroke=\"currentColor\" strokeWidth=\"1.4\" />\n <path d=\"m12 12-2.5-2.5\" stroke=\"currentColor\" strokeWidth=\"1.4\" strokeLinecap=\"round\" />\n </svg>\n ),\n database: (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <ellipse cx=\"7\" cy=\"3.2\" rx=\"5\" ry=\"1.5\" stroke=\"currentColor\" strokeWidth=\"1.3\" />\n <path d=\"M2 3.5v7c0 .8 2.2 1.5 5 1.5s5-.7 5-1.5v-7M2 7c0 .8 2.2 1.5 5 1.5s5-.7 5-1.5\" stroke=\"currentColor\" strokeWidth=\"1.3\" />\n </svg>\n ),\n web: (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"7\" cy=\"7\" r=\"5\" stroke=\"currentColor\" strokeWidth=\"1.3\" />\n <path d=\"M2 7h10M7 2c1.7 2 1.7 8 0 10M7 2c-1.7 2-1.7 8 0 10\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n </svg>\n ),\n code: (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"m4.5 4-3 3 3 3M9.5 4l3 3-3 3\" stroke=\"currentColor\" strokeWidth=\"1.4\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n ),\n file: (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M3 2h6l3 3v7H3z\" stroke=\"currentColor\" strokeWidth=\"1.3\" strokeLinejoin=\"round\" />\n <path d=\"M9 2v3h3\" stroke=\"currentColor\" strokeWidth=\"1.3\" />\n </svg>\n ),\n api: (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M2 7h2m6 0h2M4 7a3 3 0 1 1 6 0 3 3 0 0 1-6 0z\" stroke=\"currentColor\" strokeWidth=\"1.3\" />\n </svg>\n ),\n ai: (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M7 2v3M7 9v3M2 7h3M9 7h3M3.5 3.5l2 2M10.5 10.5l-2-2M3.5 10.5l2-2M10.5 3.5l-2 2\" stroke=\"currentColor\" strokeWidth=\"1.3\" strokeLinecap=\"round\" />\n </svg>\n ),\n custom: (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M3 7c2.5-2.5 5.5-2.5 8 0M3 7c2.5 2.5 5.5 2.5 8 0\" stroke=\"currentColor\" strokeWidth=\"1.3\" strokeLinecap=\"round\" />\n </svg>\n ),\n};\n\nexport function ToolCard({\n name,\n description,\n icon,\n category = \"custom\",\n enabled,\n onToggle,\n hideToggle,\n isNew,\n disabled,\n badge,\n compact,\n onClick,\n className,\n}: ToolCardProps) {\n return (\n <div\n className={cn(\n \"ods-tool-card\",\n compact && \"ods-tool-card--compact\",\n disabled && \"ods-tool-card--disabled\",\n enabled && \"ods-tool-card--enabled\",\n onClick && \"ods-tool-card--interactive\",\n className,\n )}\n onClick={onClick}\n role={onClick ? \"button\" : undefined}\n tabIndex={onClick ? 0 : undefined}\n >\n <span className={cn(\"ods-tool-card__icon\", `ods-tool-card__icon--${category}`)} aria-hidden=\"true\">\n {icon ?? CATEGORY_GLYPH[category]}\n </span>\n <div className=\"ods-tool-card__body\">\n <div className=\"ods-tool-card__head\">\n <span className=\"ods-tool-card__name\">{name}</span>\n {isNew && <span className=\"ods-tool-card__new\">NEW</span>}\n {badge && <span className=\"ods-tool-card__badge\">{badge}</span>}\n </div>\n {description && <div className=\"ods-tool-card__desc\">{description}</div>}\n </div>\n {!hideToggle && onToggle && (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={!!enabled}\n aria-label={`Toggle ${typeof name === \"string\" ? name : \"tool\"}`}\n disabled={disabled}\n className={cn(\"ods-tool-card__switch\", enabled && \"ods-tool-card__switch--on\")}\n onClick={(e) => {\n e.stopPropagation();\n if (!disabled) onToggle(!enabled);\n }}\n >\n <span className=\"ods-tool-card__switch-thumb\" aria-hidden=\"true\" />\n </button>\n )}\n </div>\n );\n}\n","\"use client\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport {\n cloneElement,\n type ReactElement,\n type ReactNode,\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n} from \"react\";\nimport { useTooltip, useTooltipTrigger } from \"react-aria\";\nimport { createPortal } from \"react-dom\";\nimport { useTooltipTriggerState } from \"react-stately\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface TooltipProps {\n content: ReactNode;\n position?: \"top\" | \"bottom\" | \"left\" | \"right\";\n delay?: number;\n offset?: number;\n children: ReactElement;\n className?: string;\n}\n\ninterface Coords {\n top: number;\n left: number;\n}\n\nfunction computePosition(\n rect: DOMRect,\n tipRect: DOMRect,\n position: NonNullable<TooltipProps[\"position\"]>,\n offset: number,\n): Coords {\n const cx = rect.left + rect.width / 2;\n const cy = rect.top + rect.height / 2;\n switch (position) {\n case \"top\":\n return { top: rect.top - tipRect.height - offset, left: cx - tipRect.width / 2 };\n case \"bottom\":\n return { top: rect.bottom + offset, left: cx - tipRect.width / 2 };\n case \"left\":\n return { top: cy - tipRect.height / 2, left: rect.left - tipRect.width - offset };\n case \"right\":\n return { top: cy - tipRect.height / 2, left: rect.right + offset };\n }\n}\n\nconst animVariants: Record<\n NonNullable<TooltipProps[\"position\"]>,\n { initial: any; animate: any }\n> = {\n top: { initial: { opacity: 0, y: 4 }, animate: { opacity: 1, y: 0 } },\n bottom: { initial: { opacity: 0, y: -4 }, animate: { opacity: 1, y: 0 } },\n left: { initial: { opacity: 0, x: 4 }, animate: { opacity: 1, x: 0 } },\n right: { initial: { opacity: 0, x: -4 }, animate: { opacity: 1, x: 0 } },\n};\n\nfunction TooltipContent({\n state,\n content,\n position = \"top\",\n triggerRef,\n className,\n offset,\n}: {\n state: ReturnType<typeof useTooltipTriggerState>;\n content: ReactNode;\n position: NonNullable<TooltipProps[\"position\"]>;\n triggerRef: React.RefObject<HTMLElement | null>;\n className?: string;\n offset: number;\n}) {\n const { tooltipProps } = useTooltip({ isOpen: state.isOpen }, state);\n const tipRef = useRef<HTMLDivElement | null>(null);\n const [coords, setCoords] = useState<Coords | null>(null);\n\n const reposition = useCallback(() => {\n if (!triggerRef.current || !tipRef.current) return;\n const trigRect = triggerRef.current.getBoundingClientRect();\n const tipRect = tipRef.current.getBoundingClientRect();\n setCoords(computePosition(trigRect, tipRect, position, offset));\n }, [triggerRef, position, offset]);\n\n // Initial mount has zero size — re-measure next frame for accurate placement.\n useLayoutEffect(() => {\n if (!state.isOpen) return;\n reposition();\n const id = requestAnimationFrame(reposition);\n return () => cancelAnimationFrame(id);\n }, [state.isOpen, reposition]);\n\n useEffect(() => {\n if (!state.isOpen) return;\n const handler = () => reposition();\n window.addEventListener(\"scroll\", handler, true);\n window.addEventListener(\"resize\", handler);\n return () => {\n window.removeEventListener(\"scroll\", handler, true);\n window.removeEventListener(\"resize\", handler);\n };\n }, [state.isOpen, reposition]);\n\n const variants = animVariants[position];\n const { onDrag, onDragStart, onDragEnd, onAnimationStart, ...safeTipProps } = tooltipProps as any;\n\n const portalContent = (\n <AnimatePresence>\n {state.isOpen && (\n // Outer wrapper owns positioning. No transform.\n <div\n className=\"ods-tooltip__wrapper\"\n style={{\n position: \"fixed\",\n zIndex: 1500,\n top: coords?.top ?? -9999,\n left: coords?.left ?? -9999,\n visibility: coords ? \"visible\" : \"hidden\",\n pointerEvents: \"none\",\n }}\n >\n {/* Inner motion div owns the entrance animation. */}\n <motion.div\n ref={tipRef}\n {...safeTipProps}\n role=\"tooltip\"\n data-position={position}\n className={cn(\"ods-tooltip\", className)}\n initial={variants.initial}\n animate={variants.animate}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.15, ease: \"easeOut\" }}\n >\n {content}\n <span className=\"ods-tooltip__arrow\" aria-hidden=\"true\" />\n </motion.div>\n </div>\n )}\n </AnimatePresence>\n );\n\n if (typeof document === \"undefined\") return null;\n return createPortal(portalContent, document.body);\n}\n\nexport function Tooltip({\n content,\n position = \"top\",\n delay = 200,\n offset = 8,\n children,\n className,\n}: TooltipProps) {\n const triggerRef = useRef<HTMLElement>(null);\n const state = useTooltipTriggerState({ delay });\n const { triggerProps } = useTooltipTrigger({ delay }, state, triggerRef);\n\n return (\n <>\n {cloneElement(children, {\n ...triggerProps,\n ref: triggerRef,\n } as any)}\n <TooltipContent\n state={state}\n content={content}\n position={position}\n triggerRef={triggerRef}\n offset={offset}\n className={className}\n />\n </>\n );\n}\n","\"use client\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface TopBarBreadcrumb {\n label: string;\n href?: string;\n}\n\nexport interface TopBarProps extends Omit<HTMLAttributes<HTMLElement>, \"title\"> {\n title?: string;\n breadcrumbs?: TopBarBreadcrumb[];\n actions?: ReactNode;\n searchPlaceholder?: string;\n onSearch?: (value: string) => void;\n children?: ReactNode;\n className?: string;\n}\n\nexport function TopBar({\n title,\n breadcrumbs,\n actions,\n searchPlaceholder = \"Search...\",\n onSearch,\n children,\n className,\n ...props\n}: TopBarProps) {\n return (\n <header {...props} className={cn(\"ods-topbar\", className)}>\n <div className={\"ods-topbar__left\"}>\n {breadcrumbs && breadcrumbs.length > 0 && (\n <nav className={\"ods-topbar__breadcrumbs\"} aria-label=\"Breadcrumb\">\n <ol>\n {breadcrumbs.map((crumb, idx) => (\n <li key={idx} className={\"ods-topbar__crumb\"}>\n {idx > 0 && (\n <span className={\"ods-topbar__separator\"} aria-hidden=\"true\">\n /\n </span>\n )}\n {crumb.href ? (\n <a href={crumb.href}>{crumb.label}</a>\n ) : (\n <span aria-current={idx === breadcrumbs.length - 1 ? \"page\" : undefined}>\n {crumb.label}\n </span>\n )}\n </li>\n ))}\n </ol>\n </nav>\n )}\n {title && <h1 className={\"ods-topbar__title\"}>{title}</h1>}\n </div>\n\n {children && <div className={\"ods-topbar__center\"}>{children}</div>}\n\n <div className={\"ods-topbar__right\"}>\n {onSearch && (\n <div className={\"ods-topbar__search\"}>\n <svg\n className={\"ods-topbar__search-icon\"}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M8 4a4 4 0 100 8 4 4 0 000-8zM2 8a6 6 0 1110.89 3.476l4.817 4.817a1 1 0 01-1.414 1.414l-4.816-4.816A6 6 0 012 8z\"\n clipRule=\"evenodd\"\n />\n </svg>\n <input\n type=\"search\"\n placeholder={searchPlaceholder}\n onChange={(e) => onSearch(e.target.value)}\n className={\"ods-topbar__search-input\"}\n aria-label={searchPlaceholder}\n />\n </div>\n )}\n {actions && <div className={\"ods-topbar__actions\"}>{actions}</div>}\n </div>\n </header>\n );\n}\n","\"use client\";\nimport { type ReactNode, useState } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport type TraceStepKind = \"thought\" | \"tool\" | \"input\" | \"output\" | \"error\";\nexport type TraceStepStatus = \"running\" | \"success\" | \"failed\" | \"pending\" | \"idle\";\n\nexport interface TraceStepProps {\n /** Numeric step index. */\n index?: number;\n /** Kind of step — drives the icon + color. */\n kind?: TraceStepKind;\n /** Status of the step. */\n status?: TraceStepStatus;\n /** Short label, e.g. \"search_web\" or \"Thinking…\" */\n title: ReactNode;\n /** Tool name when kind=\"tool\" (rendered as a chip on the right). */\n tool?: string;\n /** Wall-clock duration string. */\n duration?: string;\n /** Token count or cost annotation. */\n tokens?: number;\n /** Body content — collapsed by default. Usually a JsonViewer or CodeEditor or text. */\n children?: ReactNode;\n /** Open by default. */\n defaultOpen?: boolean;\n /** Hide the connecting vertical rail at the left. */\n hideRail?: boolean;\n /** Last step in a chain (skips the trailing rail). */\n isLast?: boolean;\n className?: string;\n}\n\nconst KIND_GLYPH: Record<TraceStepKind, ReactNode> = {\n thought: (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M3 5a3 3 0 0 1 6 0c0 1.5-1 2-1 3.5h-4C4 7 3 6.5 3 5z M5 10h2\" stroke=\"currentColor\" strokeWidth=\"1.3\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n ),\n tool: (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M3 2v3l2 2-1.5 3M9 2l-2 4 1 2 2.5-1L9 2z\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinejoin=\"round\" />\n </svg>\n ),\n input: (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M2 6h6M5 3l3 3-3 3M9.5 2v8\" stroke=\"currentColor\" strokeWidth=\"1.3\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n ),\n output: (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M10 6H4M7 3l3 3-3 3M2.5 2v8\" stroke=\"currentColor\" strokeWidth=\"1.3\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n ),\n error: (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"6\" cy=\"6\" r=\"5\" stroke=\"currentColor\" strokeWidth=\"1.3\" />\n <path d=\"M6 3.5v3M6 8.2v.3\" stroke=\"currentColor\" strokeWidth=\"1.4\" strokeLinecap=\"round\" />\n </svg>\n ),\n};\n\nexport function TraceStep({\n index,\n kind = \"thought\",\n status = \"idle\",\n title,\n tool,\n duration,\n tokens,\n children,\n defaultOpen = false,\n hideRail = false,\n isLast = false,\n className,\n}: TraceStepProps) {\n const [open, setOpen] = useState(defaultOpen);\n const canExpand = !!children;\n\n return (\n <div\n className={cn(\n \"ods-trace-step\",\n `ods-trace-step--${kind}`,\n `ods-trace-step--status-${status}`,\n open && \"ods-trace-step--open\",\n isLast && \"ods-trace-step--last\",\n hideRail && \"ods-trace-step--no-rail\",\n className,\n )}\n >\n <div className=\"ods-trace-step__rail\" aria-hidden=\"true\">\n <span className=\"ods-trace-step__icon\">\n {status === \"running\" ? (\n <svg className=\"ods-trace-step__spin\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"6\" cy=\"6\" r=\"4\" stroke=\"currentColor\" strokeWidth=\"1.4\" strokeDasharray=\"4 18\" strokeLinecap=\"round\" />\n </svg>\n ) : (\n KIND_GLYPH[kind]\n )}\n </span>\n {!isLast && <span className=\"ods-trace-step__line\" />}\n </div>\n\n <div className=\"ods-trace-step__body\">\n <button\n type=\"button\"\n className=\"ods-trace-step__head\"\n onClick={() => canExpand && setOpen((o) => !o)}\n aria-expanded={canExpand ? open : undefined}\n disabled={!canExpand}\n >\n {index != null && <span className=\"ods-trace-step__index\">{index}</span>}\n <span className=\"ods-trace-step__title\">{title}</span>\n {tool && (\n <span className=\"ods-trace-step__tool\" title={tool}>\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M2 7v-2l1-1 4 4-1 1-2-1z\" stroke=\"currentColor\" strokeWidth=\"1.1\" strokeLinejoin=\"round\" />\n </svg>\n {tool}\n </span>\n )}\n <span className=\"ods-trace-step__meta\">\n {tokens != null && (\n <span className=\"ods-trace-step__tokens\">\n <span>{tokens.toLocaleString()}</span> tok\n </span>\n )}\n {duration && <span className=\"ods-trace-step__duration\">{duration}</span>}\n </span>\n {canExpand && (\n <svg\n className={cn(\"ods-trace-step__chev\", open && \"ods-trace-step__chev--open\")}\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 10 10\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M3 4 5 6 7 4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </button>\n {canExpand && open && <div className=\"ods-trace-step__content\">{children}</div>}\n </div>\n </div>\n );\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface UserCardStat {\n label: ReactNode;\n value: ReactNode;\n}\n\nexport interface UserCardProps {\n name: ReactNode;\n role?: ReactNode;\n avatar?: ReactNode;\n initial?: ReactNode;\n stats?: UserCardStat[];\n action?: ReactNode;\n className?: string;\n}\n\nexport function UserCard({ name, role, avatar, initial, stats, action, className }: UserCardProps) {\n return (\n <div className={cn(\"ods-user-card\", className)}>\n <div className=\"ods-user-card__avatar\">\n {avatar ?? (\n <span>{initial ?? (typeof name === \"string\" ? name.charAt(0).toUpperCase() : \"?\")}</span>\n )}\n </div>\n <div className=\"ods-user-card__name\">{name}</div>\n {role && <div className=\"ods-user-card__role\">{role}</div>}\n {stats && stats.length > 0 && (\n <div className=\"ods-user-card__stats\">\n {stats.map((s, i) => (\n <div key={i} className=\"ods-user-card__stat\">\n <div className=\"ods-user-card__stat-value\">{s.value}</div>\n <div className=\"ods-user-card__stat-label\">{s.label}</div>\n </div>\n ))}\n </div>\n )}\n {action && <div className=\"ods-user-card__action\">{action}</div>}\n </div>\n );\n}\n","\"use client\";\nimport { type ReactNode, useCallback, useMemo, useState } from \"react\";\nimport { type UseWorkflowOptions, useWorkflow } from \"../../hooks/useWorkflow\";\nimport { cn } from \"../../utils/cn\";\nimport type { WorkflowNode, WorkflowPolicies } from \"../../workflow/types\";\nimport { wouldCreateCycle } from \"../../workflow/validator\";\nimport { FlowCanvas } from \"../FlowCanvas/FlowCanvas\";\nimport {\n FlowToolbar,\n FlowToolbarButton,\n FlowToolbarDivider,\n FlowToolbarIcons,\n FlowToolbarZoom,\n} from \"../FlowToolbar/FlowToolbar\";\n\nexport interface WorkflowEditorProps extends UseWorkflowOptions {\n /** Slot at the top-left — defaults to FlowToolbar with common actions. */\n toolbar?: ReactNode | \"default\" | null;\n\n /** Left-side drawer slot (e.g. an ActionDrawer). Rendered before the canvas. */\n drawer?: ReactNode;\n\n /** Bottom slot (e.g. an ExecutionConsole). Rendered absolutely at the bottom. */\n console?: ReactNode;\n\n /** Minimap slot — rendered in the bottom-right of the canvas. */\n minimap?: ReactNode;\n\n /** Empty-state contents (shown when no nodes/edges). */\n emptyState?: ReactNode;\n\n /** Action side-panel (e.g. a config form) — rendered as overlay via `children`. */\n children?: ReactNode;\n\n // Editor-level callbacks\n onSave?: (workflow: ReturnType<typeof useWorkflow>[\"workflow\"]) => void;\n onRun?: () => void;\n onStop?: () => void;\n onSettings?: () => void;\n /** Called when Reset is pressed — consumer should clear workflow state or ignore. */\n onReset?: () => void;\n onToggleDrawer?: (open: boolean) => void;\n onToggleHistory?: (open: boolean) => void;\n onToggleDebug?: (open: boolean) => void;\n onToggleLockMode?: (locked: boolean) => void;\n /** Controlled lock mode. If omitted, editor owns the state. */\n isLockMode?: boolean;\n /** Controlled drawer state. If omitted, editor owns the state. */\n isDrawerOpen?: boolean;\n /** Controlled history panel state. */\n isHistoryOpen?: boolean;\n /** Controlled debug console state. */\n isDebugOpen?: boolean;\n /** Show/hide the debug button in the default toolbar. */\n isDebugModeEnabled?: boolean;\n /** Show the Run button as an active \"stop\" button while true. */\n isExecuting?: boolean;\n\n height?: number | string;\n width?: number | string;\n className?: string;\n}\n\nconst NODE_DEFAULT_WIDTH = 368;\nconst NODE_DEFAULT_HEIGHT = 108;\n\nfunction computeFitViewport(\n nodes: WorkflowNode[],\n containerWidth: number,\n containerHeight: number,\n padding = 80,\n): { x: number; y: number; zoom: number } | null {\n if (nodes.length === 0) return null;\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (const n of nodes) {\n const w = n.dimensions?.width ?? NODE_DEFAULT_WIDTH;\n const h = n.dimensions?.height ?? NODE_DEFAULT_HEIGHT;\n minX = Math.min(minX, n.position.x);\n minY = Math.min(minY, n.position.y);\n maxX = Math.max(maxX, n.position.x + w);\n maxY = Math.max(maxY, n.position.y + h);\n }\n const contentW = maxX - minX;\n const contentH = maxY - minY;\n const zoomX = (containerWidth - padding * 2) / contentW;\n const zoomY = (containerHeight - padding * 2) / contentH;\n const zoom = Math.min(zoomX, zoomY, 1.5);\n const clampedZoom = Math.max(zoom, 0.25);\n const centerX = (minX + maxX) / 2;\n const centerY = (minY + maxY) / 2;\n return {\n zoom: clampedZoom,\n x: containerWidth / 2 - centerX * clampedZoom,\n y: containerHeight / 2 - centerY * clampedZoom,\n };\n}\n\nexport function WorkflowEditor({\n toolbar = \"default\",\n drawer,\n console: consoleSlot,\n minimap,\n emptyState = <DefaultEmptyState />,\n children,\n onSave,\n onRun,\n onStop,\n onSettings,\n onReset,\n onToggleDrawer,\n onToggleHistory,\n onToggleDebug,\n onToggleLockMode,\n isLockMode: controlledLockMode,\n isDrawerOpen: controlledDrawerOpen,\n isHistoryOpen: controlledHistoryOpen,\n isDebugOpen: controlledDebugOpen,\n isDebugModeEnabled = false,\n isExecuting = false,\n height = 720,\n width = \"100%\",\n className,\n ...options\n}: WorkflowEditorProps) {\n const wf = useWorkflow(options);\n const { workflow, dispatch, canUndo, canRedo, undo, redo } = wf;\n\n // ── Uncontrolled state for lock/drawer/history/debug ────────────────────\n const [uncontrolledLock, setUncontrolledLock] = useState(false);\n const [uncontrolledDrawer, setUncontrolledDrawer] = useState(!!drawer);\n const [uncontrolledHistory, setUncontrolledHistory] = useState(false);\n const [uncontrolledDebug, setUncontrolledDebug] = useState(false);\n const isLockMode = controlledLockMode ?? uncontrolledLock;\n const isDrawerOpen = controlledDrawerOpen ?? uncontrolledDrawer;\n const isHistoryOpen = controlledHistoryOpen ?? uncontrolledHistory;\n const isDebugOpen = controlledDebugOpen ?? uncontrolledDebug;\n\n const toggleLock = useCallback(() => {\n const next = !isLockMode;\n if (controlledLockMode === undefined) setUncontrolledLock(next);\n onToggleLockMode?.(next);\n }, [isLockMode, controlledLockMode, onToggleLockMode]);\n\n const toggleDrawer = useCallback(() => {\n const next = !isDrawerOpen;\n if (controlledDrawerOpen === undefined) setUncontrolledDrawer(next);\n onToggleDrawer?.(next);\n }, [isDrawerOpen, controlledDrawerOpen, onToggleDrawer]);\n\n const toggleHistory = useCallback(() => {\n const next = !isHistoryOpen;\n if (controlledHistoryOpen === undefined) setUncontrolledHistory(next);\n onToggleHistory?.(next);\n }, [isHistoryOpen, controlledHistoryOpen, onToggleHistory]);\n\n const toggleDebug = useCallback(() => {\n const next = !isDebugOpen;\n if (controlledDebugOpen === undefined) setUncontrolledDebug(next);\n onToggleDebug?.(next);\n }, [isDebugOpen, controlledDebugOpen, onToggleDebug]);\n\n const handleReset = useCallback(() => {\n if (onReset) onReset();\n else dispatch({ type: \"RESET\" });\n }, [onReset, dispatch]);\n\n // ── Canvas sizing for fit-to-view ───────────────────────────────────────\n const [canvasSize, setCanvasSize] = useState<{ w: number; h: number }>({\n w: 0,\n h: 0,\n });\n\n const handleCanvasRef = useCallback((node: HTMLDivElement | null) => {\n if (!node) return;\n setCanvasSize({ w: node.clientWidth, h: node.clientHeight });\n }, []);\n\n const fitToView = useCallback(() => {\n const viewport = computeFitViewport(\n workflow.canvas.nodes as WorkflowNode[],\n canvasSize.w || 800,\n canvasSize.h || 600,\n );\n if (viewport) wf.setViewport(viewport);\n }, [workflow.canvas.nodes, canvasSize, wf]);\n\n const policies: WorkflowPolicies = workflow.policies;\n\n // ── Connection validation used by FlowNode ──\n const validateConnection = useCallback(\n (targetNodeId: string, targetPortId: string, targetPortType: \"input\" | \"output\") => {\n const from = workflow.canvas.connectingFrom;\n if (!from) return { valid: true };\n\n if (!policies.connection.allowSelfLoop && from.nodeId === targetNodeId) {\n return { valid: false, reason: \"Self-loops are not allowed\" };\n }\n if (from.portType === targetPortType) {\n return {\n valid: false,\n reason: `Cannot connect ${targetPortType} to ${targetPortType}`,\n };\n }\n const maxPerNode = policies.connection.maxConnectionsPerNode;\n if (maxPerNode !== undefined) {\n const count = workflow.canvas.edges.filter(\n (e) => e.source === targetNodeId || e.target === targetNodeId,\n ).length;\n if (count >= maxPerNode) {\n return { valid: false, reason: `Max ${maxPerNode} connections per node` };\n }\n }\n if (!policies.connection.allowMultipleInputs && targetPortType === \"input\") {\n if (\n workflow.canvas.edges.some(\n (e) => e.target === targetNodeId && e.targetPort === targetPortId,\n )\n ) {\n return { valid: false, reason: \"Port already has a connection\" };\n }\n }\n if (!policies.connection.allowMultipleOutputs && targetPortType === \"output\") {\n if (\n workflow.canvas.edges.some(\n (e) => e.source === targetNodeId && e.sourcePort === targetPortId,\n )\n ) {\n return { valid: false, reason: \"Port already has a connection\" };\n }\n }\n if (policies.connection.preventCircularDependencies) {\n const [src, tgt] =\n from.portType === \"output\" ? [from.nodeId, targetNodeId] : [targetNodeId, from.nodeId];\n if (wouldCreateCycle(src, tgt, workflow.canvas.edges)) {\n return { valid: false, reason: \"Would create a circular dependency\" };\n }\n }\n return { valid: true };\n },\n [policies, workflow.canvas.connectingFrom, workflow.canvas.edges],\n );\n\n const handleEndConnecting = useCallback(\n (target: { nodeId: string; portId: string; portType: \"input\" | \"output\" } | null) => {\n const from = workflow.canvas.connectingFrom;\n if (!from) return;\n if (!target) {\n wf.endConnecting();\n return;\n }\n const result = validateConnection(target.nodeId, target.portId, target.portType);\n if (!result.valid) {\n wf.endConnecting();\n return;\n }\n if (from.portType === \"output\" && target.portType === \"input\") {\n wf.createEdge(from.nodeId, from.portId, target.nodeId, target.portId);\n } else if (from.portType === \"input\" && target.portType === \"output\") {\n wf.createEdge(target.nodeId, target.portId, from.nodeId, from.portId);\n }\n wf.endConnecting();\n },\n [workflow.canvas.connectingFrom, validateConnection, wf],\n );\n\n const selectedNodeId = workflow.canvas.selectedNodes[0];\n\n // ── Default toolbar: Save / Run / Lock / Reset / Drawer / Settings / History / Zoom ──\n const defaultToolbar = useMemo(\n () => (\n <FlowToolbar placement=\"left\">\n {onSave && (\n <FlowToolbarButton\n icon={FlowToolbarIcons.save}\n label=\"Save\"\n shortcut=\"⌘S\"\n onClick={() => onSave(workflow)}\n />\n )}\n {onRun && (\n <FlowToolbarButton\n icon={isExecuting ? FlowToolbarIcons.stop : FlowToolbarIcons.run}\n label={isExecuting ? \"Stop\" : \"Run\"}\n tooltip={isExecuting ? \"Running — click to stop\" : \"Run workflow\"}\n shortcut=\"⌘↵\"\n active={isExecuting}\n onClick={isExecuting ? onStop : onRun}\n />\n )}\n <FlowToolbarButton\n icon={isLockMode ? FlowToolbarIcons.lock : FlowToolbarIcons.unlock}\n label={isLockMode ? \"Unlock canvas\" : \"Lock canvas\"}\n tooltip={isLockMode ? \"Unlock canvas (edit mode)\" : \"Lock canvas\"}\n active={isLockMode}\n onClick={toggleLock}\n />\n <FlowToolbarButton\n icon={FlowToolbarIcons.reset}\n label=\"Reset canvas\"\n onClick={handleReset}\n />\n {drawer && (\n <FlowToolbarButton\n icon={isDrawerOpen ? FlowToolbarIcons.drawerClose : FlowToolbarIcons.drawerOpen}\n label={isDrawerOpen ? \"Hide actions drawer\" : \"Show actions drawer\"}\n active={isDrawerOpen}\n onClick={toggleDrawer}\n />\n )}\n <FlowToolbarDivider />\n {onSettings && (\n <FlowToolbarButton\n icon={FlowToolbarIcons.settings}\n label=\"Settings\"\n onClick={onSettings}\n />\n )}\n <FlowToolbarButton\n icon={FlowToolbarIcons.history}\n label={isHistoryOpen ? \"Hide history\" : \"Show history\"}\n active={isHistoryOpen}\n onClick={toggleHistory}\n />\n {isDebugModeEnabled && (\n <FlowToolbarButton\n icon={FlowToolbarIcons.debug}\n label={isDebugOpen ? \"Hide debug console\" : \"Show debug console\"}\n active={isDebugOpen}\n onClick={toggleDebug}\n />\n )}\n <FlowToolbarDivider />\n <FlowToolbarButton\n icon={FlowToolbarIcons.undo}\n label=\"Undo\"\n shortcut=\"⌘Z\"\n disabled={!canUndo}\n onClick={undo}\n />\n <FlowToolbarButton\n icon={FlowToolbarIcons.redo}\n label=\"Redo\"\n shortcut=\"⌘⇧Z\"\n disabled={!canRedo}\n onClick={redo}\n />\n <FlowToolbarDivider />\n <FlowToolbarZoom\n zoom={workflow.canvas.viewport.zoom}\n onZoomIn={wf.zoomIn}\n onZoomOut={wf.zoomOut}\n onReset={wf.resetViewport}\n onFit={fitToView}\n />\n </FlowToolbar>\n ),\n [\n onSave,\n onRun,\n onStop,\n onSettings,\n isExecuting,\n isLockMode,\n isDrawerOpen,\n isHistoryOpen,\n isDebugOpen,\n isDebugModeEnabled,\n drawer,\n toggleLock,\n toggleDrawer,\n toggleHistory,\n toggleDebug,\n handleReset,\n canUndo,\n canRedo,\n undo,\n redo,\n workflow,\n wf,\n fitToView,\n ],\n );\n\n const resolvedToolbar =\n toolbar === \"default\" ? defaultToolbar : toolbar === null ? null : toolbar;\n\n return (\n <div\n className={cn(\"ods-workflow-editor\", className)}\n style={{ width, height, position: \"relative\", display: \"flex\", overflow: \"hidden\" }}\n >\n {drawer && isDrawerOpen && <div className=\"ods-workflow-editor__drawer\">{drawer}</div>}\n <div\n ref={handleCanvasRef}\n className=\"ods-workflow-editor__canvas-wrapper\"\n style={{ position: \"relative\", flex: 1, minWidth: 0 }}\n >\n <FlowCanvas\n nodes={workflow.canvas.nodes as WorkflowNode[]}\n edges={workflow.canvas.edges}\n viewport={workflow.canvas.viewport}\n connectingFrom={workflow.canvas.connectingFrom}\n selectedNodeId={selectedNodeId}\n isLockMode={isLockMode}\n onViewportChange={wf.setViewport}\n onNodeSelect={(id) => wf.selectNode(id)}\n onEdgeSelect={wf.selectEdge}\n onDeselectAll={wf.deselectAll}\n onNodePositionChange={(id, pos) => wf.updateNode(id, { position: pos })}\n onNodeDelete={wf.deleteNode}\n onNodesDelete={wf.deleteNodes}\n onEdgeDelete={wf.deleteEdge}\n onStartConnecting={(nodeId, portId, portType) =>\n dispatch({ type: \"START_CONNECTING\", payload: { nodeId, portId, portType } })\n }\n onEndConnecting={handleEndConnecting}\n validateConnection={validateConnection}\n emptyState={emptyState}\n >\n {resolvedToolbar}\n {minimap && <div className=\"ods-workflow-editor__minimap\">{minimap}</div>}\n {consoleSlot && <div className=\"ods-workflow-editor__console\">{consoleSlot}</div>}\n {children}\n </FlowCanvas>\n </div>\n </div>\n );\n}\n\nfunction DefaultEmptyState() {\n return (\n <div\n style={{\n textAlign: \"center\",\n color: \"#8b8ca0\",\n maxWidth: 280,\n lineHeight: 1.5,\n }}\n >\n <div style={{ fontSize: 14, fontWeight: 600, color: \"#1e1b4b\", marginBottom: 4 }}>\n Start with a trigger\n </div>\n <div style={{ fontSize: 12 }}>\n Drop an action here, or use the drawer to add your first node.\n </div>\n </div>\n );\n}\n","\"use client\";\nimport { useCallback, useMemo, useReducer } from \"react\";\nimport {\n type CanvasViewport,\n DEFAULT_WORKFLOW_POLICIES,\n type Position,\n type ValidationResult,\n type Workflow,\n type WorkflowAction,\n type WorkflowEdge,\n type WorkflowNode,\n type WorkflowPolicies,\n} from \"../workflow/types\";\nimport { validateWorkflow } from \"../workflow/validator\";\n\n// ── Initial workflow ────────────────────────────────────────────────────────\nconst now = () => new Date().toISOString();\n\nfunction buildInitialWorkflow(overrides: Partial<Workflow> = {}): Workflow {\n const base: Workflow = {\n metadata: {\n id: \"\",\n name: \"Untitled Workflow\",\n projectId: undefined,\n version: \"1.0.0\",\n status: \"draft\",\n createdAt: now(),\n updatedAt: now(),\n tags: [],\n },\n canvas: {\n nodes: [],\n edges: [],\n viewport: { x: 0, y: 0, zoom: 1 },\n selectedNodes: [],\n selectedEdges: [],\n isDragging: false,\n isPanning: false,\n isConnecting: false,\n settings: {\n snapToGrid: true,\n gridSize: 20,\n showGrid: true,\n showMinimap: false,\n autoLayout: false,\n useAdvancedLayout: false,\n theme: \"light\",\n },\n history: { past: [], future: [] },\n },\n policies: DEFAULT_WORKFLOW_POLICIES,\n validation: { isValid: true, errors: [], warnings: [] },\n };\n return {\n ...base,\n ...overrides,\n metadata: { ...base.metadata, ...(overrides.metadata ?? {}) },\n canvas: { ...base.canvas, ...(overrides.canvas ?? {}) },\n policies: { ...base.policies, ...(overrides.policies ?? {}) },\n };\n}\n\n// ── Reducer helpers ────────────────────────────────────────────────────────\nfunction withValidation(state: Workflow): Workflow {\n return { ...state, validation: validateWorkflow(state.canvas.nodes, state.canvas.edges) };\n}\n\nfunction snapshot(state: Workflow): Pick<Workflow[\"canvas\"], \"nodes\" | \"edges\"> {\n return { nodes: state.canvas.nodes, edges: state.canvas.edges };\n}\n\nfunction withHistoryCheckpoint(state: Workflow): Workflow {\n return {\n ...state,\n canvas: {\n ...state.canvas,\n history: {\n past: [...state.canvas.history.past, snapshot(state)].slice(-50),\n future: [],\n },\n },\n };\n}\n\n// ── Reducer ─────────────────────────────────────────────────────────────────\nfunction reducer(state: Workflow, action: WorkflowAction): Workflow {\n switch (action.type) {\n case \"ADD_NODE\": {\n const checkpoint = withHistoryCheckpoint(state);\n return withValidation({\n ...checkpoint,\n canvas: { ...checkpoint.canvas, nodes: [...checkpoint.canvas.nodes, action.payload] },\n metadata: { ...checkpoint.metadata, updatedAt: now() },\n });\n }\n case \"UPDATE_NODE\": {\n const { id, updates } = action.payload;\n return withValidation({\n ...state,\n canvas: {\n ...state.canvas,\n nodes: state.canvas.nodes.map((n) =>\n n.id === id ? { ...n, ...updates, updatedAt: now() } : n,\n ),\n },\n metadata: { ...state.metadata, updatedAt: now() },\n });\n }\n case \"DELETE_NODE\": {\n const checkpoint = withHistoryCheckpoint(state);\n const nodeId = action.payload;\n return withValidation({\n ...checkpoint,\n canvas: {\n ...checkpoint.canvas,\n nodes: checkpoint.canvas.nodes.filter((n) => n.id !== nodeId),\n edges: checkpoint.canvas.edges.filter((e) => e.source !== nodeId && e.target !== nodeId),\n selectedNodes: checkpoint.canvas.selectedNodes.filter((id) => id !== nodeId),\n },\n metadata: { ...checkpoint.metadata, updatedAt: now() },\n });\n }\n case \"DELETE_NODES\": {\n const checkpoint = withHistoryCheckpoint(state);\n const ids = action.payload;\n return withValidation({\n ...checkpoint,\n canvas: {\n ...checkpoint.canvas,\n nodes: checkpoint.canvas.nodes.filter((n) => !ids.includes(n.id)),\n edges: checkpoint.canvas.edges.filter(\n (e) => !ids.includes(e.source) && !ids.includes(e.target),\n ),\n selectedNodes: checkpoint.canvas.selectedNodes.filter((id) => !ids.includes(id)),\n },\n metadata: { ...checkpoint.metadata, updatedAt: now() },\n });\n }\n case \"ADD_EDGE\": {\n const checkpoint = withHistoryCheckpoint(state);\n return withValidation({\n ...checkpoint,\n canvas: { ...checkpoint.canvas, edges: [...checkpoint.canvas.edges, action.payload] },\n metadata: { ...checkpoint.metadata, updatedAt: now() },\n });\n }\n case \"DELETE_EDGE\": {\n const checkpoint = withHistoryCheckpoint(state);\n const edgeId = action.payload;\n return withValidation({\n ...checkpoint,\n canvas: {\n ...checkpoint.canvas,\n edges: checkpoint.canvas.edges.filter((e) => e.id !== edgeId),\n selectedEdges: checkpoint.canvas.selectedEdges.filter((id) => id !== edgeId),\n },\n metadata: { ...checkpoint.metadata, updatedAt: now() },\n });\n }\n case \"DELETE_EDGES\": {\n const checkpoint = withHistoryCheckpoint(state);\n const ids = action.payload;\n return withValidation({\n ...checkpoint,\n canvas: {\n ...checkpoint.canvas,\n edges: checkpoint.canvas.edges.filter((e) => !ids.includes(e.id)),\n selectedEdges: checkpoint.canvas.selectedEdges.filter((id) => !ids.includes(id)),\n },\n metadata: { ...checkpoint.metadata, updatedAt: now() },\n });\n }\n case \"SELECT_NODE\": {\n const id = action.payload;\n return {\n ...state,\n canvas: {\n ...state.canvas,\n selectedNodes: [id],\n selectedEdges: [],\n nodes: state.canvas.nodes.map((n) => ({ ...n, selected: n.id === id })),\n edges: state.canvas.edges.map((e) => ({ ...e, selected: false })),\n },\n };\n }\n case \"SELECT_NODES\": {\n const ids = action.payload;\n return {\n ...state,\n canvas: {\n ...state.canvas,\n selectedNodes: ids,\n selectedEdges: [],\n nodes: state.canvas.nodes.map((n) => ({ ...n, selected: ids.includes(n.id) })),\n edges: state.canvas.edges.map((e) => ({ ...e, selected: false })),\n },\n };\n }\n case \"SELECT_EDGE\": {\n const id = action.payload;\n return {\n ...state,\n canvas: {\n ...state.canvas,\n selectedNodes: [],\n selectedEdges: [id],\n nodes: state.canvas.nodes.map((n) => ({ ...n, selected: false })),\n edges: state.canvas.edges.map((e) => ({ ...e, selected: e.id === id })),\n },\n };\n }\n case \"DESELECT_ALL\":\n return {\n ...state,\n canvas: {\n ...state.canvas,\n selectedNodes: [],\n selectedEdges: [],\n nodes: state.canvas.nodes.map((n) => ({ ...n, selected: false })),\n edges: state.canvas.edges.map((e) => ({ ...e, selected: false })),\n },\n };\n case \"UPDATE_VIEWPORT\":\n return {\n ...state,\n canvas: { ...state.canvas, viewport: { ...state.canvas.viewport, ...action.payload } },\n };\n case \"UPDATE_SETTINGS\":\n return {\n ...state,\n canvas: { ...state.canvas, settings: { ...state.canvas.settings, ...action.payload } },\n };\n case \"START_CONNECTING\":\n return {\n ...state,\n canvas: { ...state.canvas, isConnecting: true, connectingFrom: action.payload },\n };\n case \"END_CONNECTING\":\n return {\n ...state,\n canvas: { ...state.canvas, isConnecting: false, connectingFrom: undefined },\n };\n case \"REPLACE_NODES\": {\n const checkpoint = withHistoryCheckpoint(state);\n return withValidation({\n ...checkpoint,\n canvas: { ...checkpoint.canvas, nodes: action.payload },\n metadata: { ...checkpoint.metadata, updatedAt: now() },\n });\n }\n case \"REPLACE_EDGES\": {\n const checkpoint = withHistoryCheckpoint(state);\n return withValidation({\n ...checkpoint,\n canvas: { ...checkpoint.canvas, edges: action.payload },\n metadata: { ...checkpoint.metadata, updatedAt: now() },\n });\n }\n case \"UNDO\": {\n const { past, future } = state.canvas.history;\n if (past.length === 0) return state;\n const previous = past[past.length - 1];\n const newPast = past.slice(0, -1);\n return withValidation({\n ...state,\n canvas: {\n ...state.canvas,\n nodes: previous.nodes,\n edges: previous.edges,\n history: {\n past: newPast,\n future: [snapshot(state), ...future].slice(0, 50),\n },\n },\n });\n }\n case \"REDO\": {\n const { past, future } = state.canvas.history;\n if (future.length === 0) return state;\n const [next, ...rest] = future;\n return withValidation({\n ...state,\n canvas: {\n ...state.canvas,\n nodes: next.nodes,\n edges: next.edges,\n history: {\n past: [...past, snapshot(state)].slice(-50),\n future: rest,\n },\n },\n });\n }\n case \"RESET\":\n return buildInitialWorkflow();\n default:\n return state;\n }\n}\n\n// ── Hook ────────────────────────────────────────────────────────────────────\nexport interface UseWorkflowOptions {\n initialNodes?: WorkflowNode[];\n initialEdges?: WorkflowEdge[];\n initialViewport?: Partial<CanvasViewport>;\n policies?: Partial<WorkflowPolicies>;\n metadata?: Partial<Workflow[\"metadata\"]>;\n}\n\nexport interface UseWorkflowReturn {\n workflow: Workflow;\n dispatch: React.Dispatch<WorkflowAction>;\n\n // Nodes\n addNode: (node: WorkflowNode) => void;\n createNode: (\n partial: Partial<WorkflowNode> & { label: string; position: Position },\n ) => WorkflowNode;\n updateNode: (id: string, updates: Partial<WorkflowNode>) => void;\n deleteNode: (id: string) => void;\n deleteNodes: (ids: string[]) => void;\n replaceNodes: (nodes: WorkflowNode[]) => void;\n\n // Edges\n addEdge: (edge: WorkflowEdge) => void;\n createEdge: (\n source: string,\n sourcePort: string,\n target: string,\n targetPort: string,\n ) => WorkflowEdge;\n deleteEdge: (id: string) => void;\n replaceEdges: (edges: WorkflowEdge[]) => void;\n\n // Connecting\n startConnecting: (nodeId: string, portId: string, portType: \"input\" | \"output\") => void;\n endConnecting: () => void;\n\n // Selection\n selectNode: (id: string, multi?: boolean) => void;\n selectNodes: (ids: string[]) => void;\n selectEdge: (id: string) => void;\n deselectAll: () => void;\n\n // Viewport\n zoomIn: () => void;\n zoomOut: () => void;\n resetViewport: () => void;\n setViewport: (viewport: Partial<CanvasViewport>) => void;\n\n // History\n undo: () => void;\n redo: () => void;\n canUndo: boolean;\n canRedo: boolean;\n\n // Validation\n validate: () => ValidationResult;\n}\n\nlet idCounter = 0;\nfunction genId(prefix: string): string {\n idCounter += 1;\n return `${prefix}_${Date.now().toString(36)}_${idCounter}`;\n}\n\nexport function useWorkflow(options: UseWorkflowOptions = {}): UseWorkflowReturn {\n const initial = useMemo(\n () =>\n buildInitialWorkflow({\n metadata: options.metadata ? ({ ...options.metadata } as Workflow[\"metadata\"]) : undefined,\n canvas: {\n nodes: options.initialNodes ?? [],\n edges: options.initialEdges ?? [],\n viewport: {\n x: options.initialViewport?.x ?? 0,\n y: options.initialViewport?.y ?? 0,\n zoom: options.initialViewport?.zoom ?? 1,\n },\n selectedNodes: [],\n selectedEdges: [],\n isDragging: false,\n isPanning: false,\n isConnecting: false,\n settings: {\n snapToGrid: true,\n gridSize: 20,\n showGrid: true,\n showMinimap: false,\n autoLayout: false,\n useAdvancedLayout: false,\n theme: \"light\",\n },\n history: { past: [], future: [] },\n },\n policies: options.policies\n ? ({ ...DEFAULT_WORKFLOW_POLICIES, ...options.policies } as WorkflowPolicies)\n : undefined,\n }),\n // Initial value only; subsequent option changes don't reset state.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [],\n );\n const [workflow, dispatch] = useReducer(reducer, initial);\n\n const addNode = useCallback(\n (node: WorkflowNode) => dispatch({ type: \"ADD_NODE\", payload: node }),\n [],\n );\n\n const createNode = useCallback(\n (partial: Partial<WorkflowNode> & { label: string; position: Position }): WorkflowNode => {\n const id = partial.id ?? genId(\"node\");\n const ports = partial.ports ?? {\n input:\n partial.type === \"trigger\"\n ? []\n : [\n {\n id: `${id}_input_0`,\n type: \"input\" as const,\n position: \"left\" as const,\n connected: false,\n },\n ],\n output: [\n {\n id: `${id}_output_0`,\n type: \"output\" as const,\n position: \"right\" as const,\n connected: false,\n },\n ],\n };\n const node: WorkflowNode = {\n id,\n type: partial.type ?? \"action\",\n label: partial.label,\n description: partial.description,\n icon: partial.icon,\n color: partial.color,\n position: partial.position,\n config: partial.config ?? {},\n ports,\n status: partial.status ?? \"idle\",\n selected: false,\n dragging: false,\n isValid: partial.isValid ?? true,\n expanded: true,\n minimized: false,\n locked: false,\n createdAt: now(),\n updatedAt: now(),\n actionDefinitionId: partial.actionDefinitionId,\n data: partial.data,\n configStatus: partial.configStatus,\n };\n dispatch({ type: \"ADD_NODE\", payload: node });\n return node;\n },\n [],\n );\n\n const updateNode = useCallback(\n (id: string, updates: Partial<WorkflowNode>) =>\n dispatch({ type: \"UPDATE_NODE\", payload: { id, updates } }),\n [],\n );\n const deleteNode = useCallback(\n (id: string) => dispatch({ type: \"DELETE_NODE\", payload: id }),\n [],\n );\n const deleteNodes = useCallback(\n (ids: string[]) => dispatch({ type: \"DELETE_NODES\", payload: ids }),\n [],\n );\n const replaceNodes = useCallback(\n (nodes: WorkflowNode[]) => dispatch({ type: \"REPLACE_NODES\", payload: nodes }),\n [],\n );\n\n const addEdge = useCallback(\n (edge: WorkflowEdge) => dispatch({ type: \"ADD_EDGE\", payload: edge }),\n [],\n );\n const createEdge = useCallback(\n (source: string, sourcePort: string, target: string, targetPort: string): WorkflowEdge => {\n const edge: WorkflowEdge = {\n id: genId(\"edge\"),\n type: \"default\",\n source,\n sourcePort,\n target,\n targetPort,\n selected: false,\n animated: false,\n createdAt: now(),\n };\n dispatch({ type: \"ADD_EDGE\", payload: edge });\n return edge;\n },\n [],\n );\n const deleteEdge = useCallback(\n (id: string) => dispatch({ type: \"DELETE_EDGE\", payload: id }),\n [],\n );\n const replaceEdges = useCallback(\n (edges: WorkflowEdge[]) => dispatch({ type: \"REPLACE_EDGES\", payload: edges }),\n [],\n );\n\n const startConnecting = useCallback(\n (nodeId: string, portId: string, portType: \"input\" | \"output\") =>\n dispatch({ type: \"START_CONNECTING\", payload: { nodeId, portId, portType } }),\n [],\n );\n const endConnecting = useCallback(() => dispatch({ type: \"END_CONNECTING\" }), []);\n\n const selectNode = useCallback(\n (id: string, multi = false) => {\n if (multi) {\n const current = workflow.canvas.selectedNodes;\n const next = current.includes(id) ? current.filter((x) => x !== id) : [...current, id];\n dispatch({ type: \"SELECT_NODES\", payload: next });\n } else {\n dispatch({ type: \"SELECT_NODE\", payload: id });\n }\n },\n [workflow.canvas.selectedNodes],\n );\n const selectNodes = useCallback(\n (ids: string[]) => dispatch({ type: \"SELECT_NODES\", payload: ids }),\n [],\n );\n const selectEdge = useCallback(\n (id: string) => dispatch({ type: \"SELECT_EDGE\", payload: id }),\n [],\n );\n const deselectAll = useCallback(() => dispatch({ type: \"DESELECT_ALL\" }), []);\n\n const zoomIn = useCallback(() => {\n const z = Math.min(workflow.canvas.viewport.zoom * 1.2, 2);\n dispatch({ type: \"UPDATE_VIEWPORT\", payload: { zoom: z } });\n }, [workflow.canvas.viewport.zoom]);\n\n const zoomOut = useCallback(() => {\n const z = Math.max(workflow.canvas.viewport.zoom / 1.2, 0.25);\n dispatch({ type: \"UPDATE_VIEWPORT\", payload: { zoom: z } });\n }, [workflow.canvas.viewport.zoom]);\n\n const resetViewport = useCallback(\n () => dispatch({ type: \"UPDATE_VIEWPORT\", payload: { x: 0, y: 0, zoom: 1 } }),\n [],\n );\n const setViewport = useCallback(\n (viewport: Partial<CanvasViewport>) => dispatch({ type: \"UPDATE_VIEWPORT\", payload: viewport }),\n [],\n );\n\n const undo = useCallback(() => dispatch({ type: \"UNDO\" }), []);\n const redo = useCallback(() => dispatch({ type: \"REDO\" }), []);\n const canUndo = workflow.canvas.history.past.length > 0;\n const canRedo = workflow.canvas.history.future.length > 0;\n\n const validate = useCallback((): ValidationResult => workflow.validation, [workflow.validation]);\n\n return {\n workflow,\n dispatch,\n addNode,\n createNode,\n updateNode,\n deleteNode,\n deleteNodes,\n replaceNodes,\n addEdge,\n createEdge,\n deleteEdge,\n replaceEdges,\n startConnecting,\n endConnecting,\n selectNode,\n selectNodes,\n selectEdge,\n deselectAll,\n zoomIn,\n zoomOut,\n resetViewport,\n setViewport,\n undo,\n redo,\n canUndo,\n canRedo,\n validate,\n };\n}\n","// ============================================================================\n// Workflow types — ported from octaviaflow-ui, decoupled from app-specific\n// ActionDefinition/Next.js so the design system can stand alone.\n// Consumers can extend WorkflowNode via the `data` field for their own schemas.\n// ============================================================================\n\n// ── Geometry ────────────────────────────────────────────────────────────────\nexport interface Position {\n x: number;\n y: number;\n}\nexport interface Dimensions {\n width: number;\n height: number;\n}\nexport interface Bounds {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n// ── Node ────────────────────────────────────────────────────────────────────\nexport type NodeStatus = \"idle\" | \"running\" | \"success\" | \"error\" | \"warning\" | \"disabled\";\nexport type NodeKind = \"trigger\" | \"action\" | \"condition\" | \"transform\";\nexport type ConfigStatus = \"valid\" | \"warning\" | \"error\" | \"unconfigured\" | \"hidden\";\n\nexport interface NodePort {\n id: string;\n type: \"input\" | \"output\";\n position: \"top\" | \"right\" | \"bottom\" | \"left\";\n label?: string;\n connected: boolean;\n maxConnections?: number;\n}\n\nexport interface DataSchema {\n type: \"object\" | \"array\" | \"string\" | \"number\" | \"boolean\" | \"null\";\n properties?: Record<string, DataSchema>;\n items?: DataSchema;\n required?: string[];\n description?: string;\n example?: unknown;\n}\n\nexport interface WorkflowNode<TData = unknown> {\n id: string;\n type: NodeKind;\n\n /** Optional reference to an action-definition id in the consumer's registry. */\n actionDefinitionId?: string;\n\n // Display\n name?: string;\n label: string;\n description?: string;\n /**\n * Icon — a ReactNode rendered inside the node chrome. Consumer provides it\n * (Lucide, Carbon, custom SVG, whatever). The DS doesn't bundle icons.\n */\n icon?: unknown;\n color?: string;\n\n // Position & size\n position: Position;\n dimensions?: Dimensions;\n\n // Configuration (arbitrary consumer data). `data` is a type-safe bag.\n config: Record<string, unknown>;\n data?: TData;\n configStatus?: ConfigStatus;\n\n // Ports\n ports: {\n input: NodePort[];\n output: NodePort[];\n };\n\n // Data flow schemas\n inputSchema?: DataSchema;\n outputSchema?: DataSchema;\n\n // Runtime state\n status: NodeStatus;\n selected: boolean;\n dragging: boolean;\n\n // Validation\n isValid: boolean;\n validationErrors?: string[];\n\n // UI state\n expanded: boolean;\n minimized: boolean;\n locked: boolean;\n\n // Execution data\n executionData?: {\n lastRun?: string;\n duration?: number;\n output?: unknown;\n error?: string;\n };\n\n // Metadata\n createdAt: string;\n updatedAt: string;\n notes?: string;\n}\n\n// ── Edge ────────────────────────────────────────────────────────────────────\nexport type EdgeType = \"default\" | \"conditional\" | \"loop\" | \"error\";\n\nexport interface EdgeStyle {\n stroke?: string;\n strokeWidth?: number;\n strokeDasharray?: string;\n animated?: boolean;\n}\n\nexport interface WorkflowEdge {\n id: string;\n type: EdgeType;\n source: string;\n sourcePort: string;\n target: string;\n targetPort: string;\n style?: EdgeStyle;\n label?: string;\n condition?: string;\n selected: boolean;\n animated: boolean;\n createdAt: string;\n}\n\n// ── Viewport & settings ─────────────────────────────────────────────────────\nexport interface CanvasViewport {\n x: number;\n y: number;\n zoom: number;\n}\n\nexport interface CanvasSettings {\n snapToGrid: boolean;\n gridSize: number;\n showGrid: boolean;\n showMinimap: boolean;\n autoLayout: boolean;\n useAdvancedLayout: boolean;\n theme: \"light\" | \"dark\";\n}\n\n// ── Canvas state ────────────────────────────────────────────────────────────\nexport interface WorkflowCanvasState {\n nodes: WorkflowNode[];\n edges: WorkflowEdge[];\n viewport: CanvasViewport;\n selectedNodes: string[];\n selectedEdges: string[];\n isDragging: boolean;\n isPanning: boolean;\n isConnecting: boolean;\n connectingFrom?: {\n nodeId: string;\n portId: string;\n portType: \"input\" | \"output\";\n };\n settings: CanvasSettings;\n history: {\n past: Array<Pick<WorkflowCanvasState, \"nodes\" | \"edges\">>;\n future: Array<Pick<WorkflowCanvasState, \"nodes\" | \"edges\">>;\n };\n}\n\n// ── Actions (reducer input) ─────────────────────────────────────────────────\nexport type WorkflowAction =\n | { type: \"ADD_NODE\"; payload: WorkflowNode }\n | { type: \"UPDATE_NODE\"; payload: { id: string; updates: Partial<WorkflowNode> } }\n | { type: \"DELETE_NODE\"; payload: string }\n | { type: \"DELETE_NODES\"; payload: string[] }\n | { type: \"ADD_EDGE\"; payload: WorkflowEdge }\n | { type: \"DELETE_EDGE\"; payload: string }\n | { type: \"DELETE_EDGES\"; payload: string[] }\n | { type: \"SELECT_NODE\"; payload: string }\n | { type: \"SELECT_NODES\"; payload: string[] }\n | { type: \"SELECT_EDGE\"; payload: string }\n | { type: \"DESELECT_ALL\" }\n | { type: \"UPDATE_VIEWPORT\"; payload: Partial<CanvasViewport> }\n | { type: \"UPDATE_SETTINGS\"; payload: Partial<CanvasSettings> }\n | {\n type: \"START_CONNECTING\";\n payload: { nodeId: string; portId: string; portType: \"input\" | \"output\" };\n }\n | { type: \"END_CONNECTING\" }\n | { type: \"UNDO\" }\n | { type: \"REDO\" }\n | { type: \"REPLACE_NODES\"; payload: WorkflowNode[] }\n | { type: \"REPLACE_EDGES\"; payload: WorkflowEdge[] }\n | { type: \"RESET\" };\n\n// ── Policies ────────────────────────────────────────────────────────────────\nexport interface ConnectionPolicies {\n allowSelfLoop: boolean;\n allowMultipleOutputs: boolean;\n allowMultipleInputs: boolean;\n strictTypeChecking: boolean;\n maxConnectionsPerNode?: number;\n preventCircularDependencies: boolean;\n allowConditionalConnections: boolean;\n requireAllInputsConnected: boolean;\n}\n\nexport interface NodePolicies {\n minNodes: number;\n maxNodes?: number;\n allowDuplicateTypes: boolean;\n requiredNodeTypes?: string[];\n forbiddenNodeTypes?: string[];\n allowOrphanNodes: boolean;\n snapToGrid: boolean;\n gridSize: number;\n}\n\nexport interface ExecutionPolicies {\n allowParallelExecution: boolean;\n maxExecutionTime?: number;\n retryFailedNodes: boolean;\n maxRetries: number;\n continueOnError: boolean;\n requireApproval: boolean;\n}\n\nexport interface ValidationPolicies {\n validateOnChange: boolean;\n validateBeforeExecution: boolean;\n blockExecutionOnValidationError: boolean;\n showValidationWarnings: boolean;\n strictMode: boolean;\n}\n\nexport interface WorkflowPolicies {\n connection: ConnectionPolicies;\n node: NodePolicies;\n execution: ExecutionPolicies;\n validation: ValidationPolicies;\n}\n\nexport const DEFAULT_WORKFLOW_POLICIES: WorkflowPolicies = {\n connection: {\n allowSelfLoop: false,\n allowMultipleOutputs: true,\n allowMultipleInputs: false,\n strictTypeChecking: true,\n maxConnectionsPerNode: undefined,\n preventCircularDependencies: true,\n allowConditionalConnections: true,\n requireAllInputsConnected: false,\n },\n node: {\n minNodes: 1,\n maxNodes: undefined,\n allowDuplicateTypes: true,\n requiredNodeTypes: undefined,\n forbiddenNodeTypes: undefined,\n allowOrphanNodes: true,\n snapToGrid: true,\n gridSize: 20,\n },\n execution: {\n allowParallelExecution: true,\n maxExecutionTime: undefined,\n retryFailedNodes: true,\n maxRetries: 3,\n continueOnError: false,\n requireApproval: false,\n },\n validation: {\n validateOnChange: true,\n validateBeforeExecution: true,\n blockExecutionOnValidationError: true,\n showValidationWarnings: true,\n strictMode: false,\n },\n};\n\n// ── Validation ──────────────────────────────────────────────────────────────\nexport interface ValidationIssue {\n id: string;\n type: \"node\" | \"edge\" | \"workflow\";\n severity: \"error\" | \"warning\";\n message: string;\n nodeId?: string;\n edgeId?: string;\n}\n\nexport interface ValidationResult {\n isValid: boolean;\n errors: ValidationIssue[];\n warnings: ValidationIssue[];\n}\n\n// ── Workflow metadata & aggregate ───────────────────────────────────────────\nexport interface WorkflowMetadata {\n id: string;\n name: string;\n description?: string;\n projectId?: string;\n version: string;\n status: \"draft\" | \"published\" | \"archived\";\n createdAt: string;\n updatedAt: string;\n createdBy?: string;\n tags: string[];\n}\n\nexport interface Workflow {\n metadata: WorkflowMetadata;\n canvas: WorkflowCanvasState;\n policies: WorkflowPolicies;\n validation: ValidationResult;\n}\n\n// ── Helpers ─────────────────────────────────────────────────────────────────\nexport interface ConnectionValidation {\n valid: boolean;\n reason?: string;\n}\n","import type { ValidationIssue, ValidationResult, WorkflowEdge, WorkflowNode } from \"./types\";\n\n// ── Node validation ─────────────────────────────────────────────────────────\nexport function validateNode(\n node: WorkflowNode,\n _allNodes: WorkflowNode[],\n allEdges: WorkflowEdge[],\n): ValidationIssue[] {\n const issues: ValidationIssue[] = [];\n\n if (!node.id || node.id.trim().length === 0) {\n issues.push({\n id: `node-${node.id}-id`,\n type: \"node\",\n severity: \"error\",\n message: \"Node ID is required\",\n nodeId: node.id,\n });\n }\n\n if (!node.label || (typeof node.label === \"string\" && node.label.trim().length === 0)) {\n issues.push({\n id: `node-${node.id}-label`,\n type: \"node\",\n severity: \"error\",\n message: \"Node label is required\",\n nodeId: node.id,\n });\n }\n\n if (!node.isValid) {\n issues.push({\n id: `node-${node.id}-config`,\n type: \"node\",\n severity: \"error\",\n message: `Node \"${node.label}\" has incomplete configuration`,\n nodeId: node.id,\n });\n }\n\n if (node.type !== \"trigger\") {\n const hasInput = allEdges.some((edge) => edge.target === node.id);\n if (!hasInput) {\n issues.push({\n id: `node-${node.id}-input`,\n type: \"node\",\n severity: \"warning\",\n message: `Node \"${node.label}\" has no incoming connections`,\n nodeId: node.id,\n });\n }\n }\n\n const hasOutput = allEdges.some((edge) => edge.source === node.id);\n if (!hasOutput && node.type === \"trigger\") {\n issues.push({\n id: `node-${node.id}-output`,\n type: \"node\",\n severity: \"warning\",\n message: `Trigger \"${node.label}\" has no outgoing connections`,\n nodeId: node.id,\n });\n }\n\n return issues;\n}\n\n// ── Edge validation ─────────────────────────────────────────────────────────\nexport function validateEdge(edge: WorkflowEdge, allNodes: WorkflowNode[]): ValidationIssue[] {\n const issues: ValidationIssue[] = [];\n\n const sourceNode = allNodes.find((n) => n.id === edge.source);\n if (!sourceNode) {\n issues.push({\n id: `edge-${edge.id}-source`,\n type: \"edge\",\n severity: \"error\",\n message: `Source node \"${edge.source}\" does not exist`,\n edgeId: edge.id,\n });\n }\n\n const targetNode = allNodes.find((n) => n.id === edge.target);\n if (!targetNode) {\n issues.push({\n id: `edge-${edge.id}-target`,\n type: \"edge\",\n severity: \"error\",\n message: `Target node \"${edge.target}\" does not exist`,\n edgeId: edge.id,\n });\n }\n\n if (edge.source === edge.target) {\n issues.push({\n id: `edge-${edge.id}-loop`,\n type: \"edge\",\n severity: \"error\",\n message: \"Nodes cannot connect to themselves\",\n edgeId: edge.id,\n });\n }\n\n return issues;\n}\n\n// ── Workflow-level validation ──────────────────────────────────────────────\nexport function validateWorkflow(nodes: WorkflowNode[], edges: WorkflowEdge[]): ValidationResult {\n const all: ValidationIssue[] = [];\n\n const hasTrigger = nodes.some((n) => n.type === \"trigger\");\n if (!hasTrigger) {\n all.push({\n id: \"workflow-trigger\",\n type: \"workflow\",\n severity: \"error\",\n message: \"Workflow must have at least one trigger node\",\n });\n }\n\n const hasAction = nodes.some((n) => n.type === \"action\");\n if (!hasAction && nodes.length > 0) {\n all.push({\n id: \"workflow-action\",\n type: \"workflow\",\n severity: \"warning\",\n message: \"Workflow should have at least one action node\",\n });\n }\n\n for (const node of nodes) all.push(...validateNode(node, nodes, edges));\n for (const edge of edges) all.push(...validateEdge(edge, nodes));\n\n // Orphan detection\n for (const node of nodes) {\n if (node.type === \"trigger\") continue;\n const connected = edges.some((e) => e.source === node.id || e.target === node.id);\n if (!connected) {\n all.push({\n id: `node-${node.id}-orphan`,\n type: \"node\",\n severity: \"warning\",\n message: `Node \"${node.label}\" is not connected to the workflow`,\n nodeId: node.id,\n });\n }\n }\n\n const errors = all.filter((e) => e.severity === \"error\");\n const warnings = all.filter((e) => e.severity === \"warning\");\n\n return { isValid: errors.length === 0, errors, warnings };\n}\n\n// ── Selectors ───────────────────────────────────────────────────────────────\nexport function getNodeValidationStatus(\n nodeId: string,\n result: ValidationResult,\n): \"valid\" | \"error\" | \"warning\" {\n if (result.errors.some((e) => e.nodeId === nodeId)) return \"error\";\n if (result.warnings.some((e) => e.nodeId === nodeId)) return \"warning\";\n return \"valid\";\n}\n\nexport function getEdgeValidationStatus(\n edgeId: string,\n result: ValidationResult,\n): \"valid\" | \"error\" | \"warning\" {\n if (result.errors.some((e) => e.edgeId === edgeId)) return \"error\";\n if (result.warnings.some((e) => e.edgeId === edgeId)) return \"warning\";\n return \"valid\";\n}\n\n// ── Cycle detection ─────────────────────────────────────────────────────────\nexport function wouldCreateCycle(source: string, target: string, edges: WorkflowEdge[]): boolean {\n if (source === target) return true;\n const visited = new Set<string>();\n const queue: string[] = [target];\n while (queue.length > 0) {\n const current = queue.shift();\n if (!current) continue;\n if (current === source) return true;\n if (visited.has(current)) continue;\n visited.add(current);\n for (const edge of edges)\n if (edge.source === current && !visited.has(edge.target)) queue.push(edge.target);\n }\n return false;\n}\n","\"use client\";\nimport { type ReactNode, useMemo, useState } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface XmlViewerProps {\n /** Raw XML string. */\n data: string;\n /** Initially expand to N levels deep. Default 2. */\n defaultExpandDepth?: number;\n /** Show attributes inline (vs. collapsed). Default true. */\n showAttributes?: boolean;\n /** Optional title. */\n title?: ReactNode;\n /** Optional status pill next to title. */\n status?: ReactNode;\n /** Maximum length for text node display. */\n truncateAt?: number;\n className?: string;\n}\n\ninterface XmlNode {\n type: \"element\" | \"text\" | \"comment\" | \"cdata\" | \"pi\";\n name?: string;\n attributes?: Record<string, string>;\n children?: XmlNode[];\n text?: string;\n}\n\n/** Parse XML into a typed AST. Uses browser DOMParser when available, else a basic fallback. */\nfunction parseXml(src: string): { root: XmlNode | null; error: string | null } {\n if (typeof window !== \"undefined\" && typeof window.DOMParser !== \"undefined\") {\n try {\n const dom = new window.DOMParser().parseFromString(src, \"application/xml\");\n const errEl = dom.querySelector(\"parsererror\");\n if (errEl) {\n return { root: null, error: errEl.textContent ?? \"Invalid XML\" };\n }\n const docEl = dom.documentElement;\n if (!docEl) return { root: null, error: \"Empty document\" };\n return { root: domToNode(docEl), error: null };\n } catch (e) {\n return { root: null, error: e instanceof Error ? e.message : \"Parse error\" };\n }\n }\n // SSR fallback: just store the raw string as a single text node\n return {\n root: { type: \"text\", text: src },\n error: null,\n };\n}\n\nfunction domToNode(el: Element): XmlNode {\n const attributes: Record<string, string> = {};\n for (const a of Array.from(el.attributes)) attributes[a.name] = a.value;\n const children: XmlNode[] = [];\n for (const c of Array.from(el.childNodes)) {\n if (c.nodeType === 1) {\n children.push(domToNode(c as Element));\n } else if (c.nodeType === 3) {\n const text = c.nodeValue ?? \"\";\n if (text.trim().length > 0) children.push({ type: \"text\", text });\n } else if (c.nodeType === 4) {\n children.push({ type: \"cdata\", text: c.nodeValue ?? \"\" });\n } else if (c.nodeType === 8) {\n children.push({ type: \"comment\", text: c.nodeValue ?? \"\" });\n } else if (c.nodeType === 7) {\n children.push({ type: \"pi\", text: c.nodeValue ?? \"\" });\n }\n }\n return {\n type: \"element\",\n name: el.tagName,\n attributes,\n children,\n };\n}\n\n/**\n * Read-only XML viewer with collapsible elements, attribute chips, and\n * type-tinted text/CDATA/comment nodes.\n */\nexport function XmlViewer({\n data,\n defaultExpandDepth = 2,\n showAttributes = true,\n title,\n status,\n truncateAt = 200,\n className,\n}: XmlViewerProps) {\n const parsed = useMemo(() => parseXml(data), [data]);\n\n return (\n <div className={cn(\"ods-xml-viewer\", className)}>\n {(title || status || parsed.error) && (\n <div className=\"ods-xml-viewer__head\">\n {title && <span className=\"ods-xml-viewer__title\">{title}</span>}\n {parsed.error && (\n <span className=\"ods-xml-viewer__status ods-xml-viewer__status--error\">\n Invalid XML\n </span>\n )}\n {status && !parsed.error && (\n <span className=\"ods-xml-viewer__status\">{status}</span>\n )}\n </div>\n )}\n <div className=\"ods-xml-viewer__body\">\n {parsed.error ? (\n <pre className=\"ods-xml-viewer__raw\">{data}</pre>\n ) : parsed.root ? (\n <XmlNodeRow\n node={parsed.root}\n depth={0}\n defaultExpandDepth={defaultExpandDepth}\n showAttributes={showAttributes}\n truncateAt={truncateAt}\n />\n ) : null}\n </div>\n </div>\n );\n}\n\nfunction XmlNodeRow({\n node,\n depth,\n defaultExpandDepth,\n showAttributes,\n truncateAt,\n}: {\n node: XmlNode;\n depth: number;\n defaultExpandDepth: number;\n showAttributes: boolean;\n truncateAt: number;\n}) {\n const [open, setOpen] = useState(depth < defaultExpandDepth);\n const pad = depth * 14;\n\n if (node.type === \"text\") {\n const t = (node.text ?? \"\").trim();\n const truncated = t.length > truncateAt ? `${t.slice(0, truncateAt)}…` : t;\n return (\n <div className=\"ods-xml-viewer__row\" style={{ paddingLeft: pad }}>\n <span className=\"ods-xml-viewer__caret-spacer\" />\n <span className=\"ods-xml-viewer__text\">{truncated}</span>\n </div>\n );\n }\n\n if (node.type === \"comment\") {\n return (\n <div className=\"ods-xml-viewer__row\" style={{ paddingLeft: pad }}>\n <span className=\"ods-xml-viewer__caret-spacer\" />\n <span className=\"ods-xml-viewer__comment\">{`<!-- ${node.text} -->`}</span>\n </div>\n );\n }\n\n if (node.type === \"cdata\") {\n return (\n <div className=\"ods-xml-viewer__row\" style={{ paddingLeft: pad }}>\n <span className=\"ods-xml-viewer__caret-spacer\" />\n <span className=\"ods-xml-viewer__cdata\">{`<![CDATA[${node.text}]]>`}</span>\n </div>\n );\n }\n\n if (node.type === \"pi\") {\n return (\n <div className=\"ods-xml-viewer__row\" style={{ paddingLeft: pad }}>\n <span className=\"ods-xml-viewer__caret-spacer\" />\n <span className=\"ods-xml-viewer__pi\">{`<?${node.text}?>`}</span>\n </div>\n );\n }\n\n // Element\n const children = node.children ?? [];\n const isSelfClosing = children.length === 0;\n const attrs = Object.entries(node.attributes ?? {});\n\n return (\n <div>\n <div\n className=\"ods-xml-viewer__row ods-xml-viewer__row--element\"\n style={{ paddingLeft: pad }}\n onClick={() => !isSelfClosing && setOpen((o) => !o)}\n >\n {isSelfClosing ? (\n <span className=\"ods-xml-viewer__caret-spacer\" />\n ) : (\n <button\n type=\"button\"\n className={cn(\"ods-xml-viewer__caret\", open && \"ods-xml-viewer__caret--open\")}\n aria-expanded={open}\n aria-label={open ? \"Collapse\" : \"Expand\"}\n onClick={(e) => {\n e.stopPropagation();\n setOpen((o) => !o);\n }}\n >\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M3 2 5 4 3 6\" stroke=\"currentColor\" strokeWidth=\"1.4\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n )}\n <span className=\"ods-xml-viewer__bracket\"><</span>\n <span className=\"ods-xml-viewer__tag\">{node.name}</span>\n {showAttributes &&\n attrs.map(([k, v]) => (\n <span key={k} className=\"ods-xml-viewer__attr\">\n <span className=\"ods-xml-viewer__attr-name\">{k}</span>\n <span className=\"ods-xml-viewer__attr-eq\">=</span>\n <span className=\"ods-xml-viewer__attr-value\">{`\"${v}\"`}</span>\n </span>\n ))}\n {isSelfClosing ? (\n <span className=\"ods-xml-viewer__bracket\">{\" />\"}</span>\n ) : (\n <>\n <span className=\"ods-xml-viewer__bracket\">></span>\n {!open && (\n <>\n <span className=\"ods-xml-viewer__preview\">\n {children.length} child{children.length === 1 ? \"\" : \"ren\"}\n </span>\n <span className=\"ods-xml-viewer__bracket\"></</span>\n <span className=\"ods-xml-viewer__tag\">{node.name}</span>\n <span className=\"ods-xml-viewer__bracket\">></span>\n </>\n )}\n </>\n )}\n </div>\n {!isSelfClosing && open && (\n <>\n {children.map((c, i) => (\n <XmlNodeRow\n key={i}\n node={c}\n depth={depth + 1}\n defaultExpandDepth={defaultExpandDepth}\n showAttributes={showAttributes}\n truncateAt={truncateAt}\n />\n ))}\n <div className=\"ods-xml-viewer__row\" style={{ paddingLeft: pad }}>\n <span className=\"ods-xml-viewer__caret-spacer\" />\n <span className=\"ods-xml-viewer__bracket\"></</span>\n <span className=\"ods-xml-viewer__tag\">{node.name}</span>\n <span className=\"ods-xml-viewer__bracket\">></span>\n </div>\n </>\n )}\n </div>\n );\n}\n","\"use client\";\nimport { type ReactNode, useMemo, useState } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface YamlViewerProps {\n /** Raw YAML string OR a parsed object/array (will be auto-stringified). */\n data: string | unknown;\n /** Initially expand to N levels deep. Default 2. */\n defaultExpandDepth?: number;\n /** Show line numbers at the gutter. Default true. */\n showLineNumbers?: boolean;\n /** Optional title. */\n title?: ReactNode;\n /** Optional status pill next to title. */\n status?: ReactNode;\n className?: string;\n}\n\ntype YamlValue = string | number | boolean | null | YamlValue[] | { [k: string]: YamlValue };\n\ninterface YamlLine {\n /** Indent depth in YAML keys/sequences (each level == 2 spaces). */\n depth: number;\n kind: \"key\" | \"scalar\" | \"sequence\" | \"comment\" | \"blank\";\n raw: string;\n /** For key lines: the key portion. */\n key?: string;\n /** For key lines: inline scalar value, if any. */\n inlineValue?: string;\n /** For sequence lines: scalar after dash, if any. */\n sequenceValue?: string;\n /** Whether this line opens a child block. */\n hasChildren?: boolean;\n /** Line index. */\n index: number;\n}\n\n/** Render an object/array as YAML text. Minimal — handles primitives, arrays, objects. */\nfunction toYaml(value: YamlValue, indent = 0): string {\n const pad = \" \".repeat(indent);\n if (value === null) return \"null\";\n if (typeof value === \"string\") {\n const needsQuotes = /[:#&*!|>'\"%@`]/.test(value) || /^[\\s-]/.test(value) || value === \"\";\n return needsQuotes ? JSON.stringify(value) : value;\n }\n if (typeof value === \"number\" || typeof value === \"boolean\") return String(value);\n if (Array.isArray(value)) {\n if (value.length === 0) return \"[]\";\n return value\n .map((v) => {\n if (v !== null && typeof v === \"object\" && !Array.isArray(v)) {\n const body = toYaml(v as YamlValue, indent + 1);\n // Inline first key with the dash\n const lines = body.split(\"\\n\");\n const firstNonEmpty = lines.findIndex((l) => l.trim().length > 0);\n if (firstNonEmpty >= 0) {\n const first = lines[firstNonEmpty].replace(/^ {2}/, \"\");\n const rest = lines.slice(firstNonEmpty + 1).join(\"\\n\");\n return `${pad}- ${first}${rest ? `\\n${rest}` : \"\"}`;\n }\n return `${pad}- ${body}`;\n }\n if (Array.isArray(v)) {\n return `${pad}-\\n${toYaml(v as YamlValue, indent + 1)}`;\n }\n return `${pad}- ${toYaml(v as YamlValue, indent)}`;\n })\n .join(\"\\n\");\n }\n if (typeof value === \"object\") {\n const entries = Object.entries(value);\n if (entries.length === 0) return \"{}\";\n return entries\n .map(([k, v]) => {\n if (v !== null && typeof v === \"object\") {\n if (Array.isArray(v) && v.length === 0) return `${pad}${k}: []`;\n if (!Array.isArray(v) && Object.keys(v).length === 0) return `${pad}${k}: {}`;\n return `${pad}${k}:\\n${toYaml(v as YamlValue, indent + 1)}`;\n }\n return `${pad}${k}: ${toYaml(v as YamlValue, indent)}`;\n })\n .join(\"\\n\");\n }\n return String(value);\n}\n\n/** Tokenize YAML text into structured lines. Doesn't fully parse — preserves visual structure. */\nfunction tokenizeYaml(src: string): YamlLine[] {\n const lines = src.split(\"\\n\");\n const out: YamlLine[] = [];\n\n for (let i = 0; i < lines.length; i++) {\n const raw = lines[i];\n const trimmed = raw.trim();\n const leading = raw.length - raw.trimStart().length;\n const depth = Math.floor(leading / 2);\n\n if (trimmed === \"\") {\n out.push({ depth, kind: \"blank\", raw, index: i });\n continue;\n }\n if (trimmed.startsWith(\"#\")) {\n out.push({ depth, kind: \"comment\", raw, index: i });\n continue;\n }\n if (trimmed.startsWith(\"- \") || trimmed === \"-\") {\n const rest = trimmed === \"-\" ? \"\" : trimmed.slice(2);\n // Could be \"- key: value\" or \"- scalar\"\n const colon = rest.indexOf(\": \");\n if (colon > 0 || rest.endsWith(\":\")) {\n const key = colon > 0 ? rest.slice(0, colon) : rest.slice(0, -1);\n const inline = colon > 0 ? rest.slice(colon + 2) : \"\";\n out.push({\n depth,\n kind: \"key\",\n raw,\n key,\n inlineValue: inline || undefined,\n hasChildren: !inline,\n index: i,\n });\n } else {\n out.push({\n depth,\n kind: \"sequence\",\n raw,\n sequenceValue: rest,\n index: i,\n });\n }\n continue;\n }\n const colon = trimmed.indexOf(\": \");\n if (colon > 0) {\n const key = trimmed.slice(0, colon);\n const inline = trimmed.slice(colon + 2);\n out.push({\n depth,\n kind: \"key\",\n raw,\n key,\n inlineValue: inline,\n hasChildren: false,\n index: i,\n });\n } else if (trimmed.endsWith(\":\")) {\n out.push({\n depth,\n kind: \"key\",\n raw,\n key: trimmed.slice(0, -1),\n hasChildren: true,\n index: i,\n });\n } else {\n out.push({\n depth,\n kind: \"scalar\",\n raw,\n index: i,\n });\n }\n }\n return out;\n}\n\nfunction valueClass(v: string): string {\n if (/^(true|false)$/i.test(v)) return \"boolean\";\n if (/^null$/i.test(v)) return \"null\";\n if (/^-?\\d+(\\.\\d+)?$/.test(v)) return \"number\";\n if (/^['\"].*['\"]$/.test(v)) return \"string\";\n return \"string\";\n}\n\n/**\n * Read-only YAML viewer — keys highlighted, values type-tinted, comments\n * grayed, optional gutter line numbers, foldable blocks.\n */\nexport function YamlViewer({\n data,\n defaultExpandDepth = 99,\n showLineNumbers = true,\n title,\n status,\n className,\n}: YamlViewerProps) {\n const text = useMemo(() => {\n if (typeof data === \"string\") return data;\n try {\n return toYaml(data as YamlValue);\n } catch {\n return JSON.stringify(data, null, 2);\n }\n }, [data]);\n\n const tokens = useMemo(() => tokenizeYaml(text), [text]);\n\n // Track collapsed parent line indices.\n const [collapsed, setCollapsed] = useState<Set<number>>(() => {\n const s = new Set<number>();\n tokens.forEach((t) => {\n if (t.hasChildren && t.depth >= defaultExpandDepth) s.add(t.index);\n });\n return s;\n });\n\n const toggle = (idx: number) => {\n setCollapsed((prev) => {\n const next = new Set(prev);\n if (next.has(idx)) next.delete(idx);\n else next.add(idx);\n return next;\n });\n };\n\n // Compute which lines are hidden by a collapsed parent\n const hidden = useMemo(() => {\n const hidden = new Set<number>();\n for (let i = 0; i < tokens.length; i++) {\n const t = tokens[i];\n if (!collapsed.has(t.index)) continue;\n const parentDepth = t.depth;\n for (let j = i + 1; j < tokens.length; j++) {\n const next = tokens[j];\n if (next.kind === \"blank\") continue;\n if (next.depth > parentDepth) hidden.add(next.index);\n else break;\n }\n }\n return hidden;\n }, [tokens, collapsed]);\n\n return (\n <div className={cn(\"ods-yaml-viewer\", className)}>\n {(title || status) && (\n <div className=\"ods-yaml-viewer__head\">\n {title && <span className=\"ods-yaml-viewer__title\">{title}</span>}\n {status && <span className=\"ods-yaml-viewer__status\">{status}</span>}\n </div>\n )}\n <div className=\"ods-yaml-viewer__body\">\n {tokens.map((t) => {\n if (hidden.has(t.index)) return null;\n const lineNo = t.index + 1;\n const isCollapsed = collapsed.has(t.index);\n return (\n <div\n key={t.index}\n className={cn(\n \"ods-yaml-viewer__line\",\n `ods-yaml-viewer__line--${t.kind}`,\n isCollapsed && \"ods-yaml-viewer__line--collapsed\",\n )}\n >\n {showLineNumbers && (\n <span className=\"ods-yaml-viewer__line-no\" aria-hidden=\"true\">\n {lineNo}\n </span>\n )}\n <span\n className=\"ods-yaml-viewer__indent\"\n style={{ width: t.depth * 14 }}\n aria-hidden=\"true\"\n />\n {t.hasChildren ? (\n <button\n type=\"button\"\n className={cn(\n \"ods-yaml-viewer__caret\",\n !isCollapsed && \"ods-yaml-viewer__caret--open\",\n )}\n onClick={() => toggle(t.index)}\n aria-expanded={!isCollapsed}\n aria-label={isCollapsed ? \"Expand\" : \"Collapse\"}\n >\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M3 2 5 4 3 6\" stroke=\"currentColor\" strokeWidth=\"1.4\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n ) : (\n <span className=\"ods-yaml-viewer__caret-spacer\" />\n )}\n {t.kind === \"comment\" && (\n <span className=\"ods-yaml-viewer__comment\">{t.raw.trim()}</span>\n )}\n {t.kind === \"key\" && (\n <>\n {t.raw.trim().startsWith(\"-\") && (\n <span className=\"ods-yaml-viewer__dash\">- </span>\n )}\n <span className=\"ods-yaml-viewer__key\">{t.key}</span>\n <span className=\"ods-yaml-viewer__colon\">:</span>\n {t.inlineValue && (\n <span\n className={cn(\n \"ods-yaml-viewer__value\",\n `ods-yaml-viewer__value--${valueClass(t.inlineValue)}`,\n )}\n >\n {\" \"}\n {t.inlineValue}\n </span>\n )}\n {isCollapsed && (\n <span className=\"ods-yaml-viewer__preview\"> …</span>\n )}\n </>\n )}\n {t.kind === \"sequence\" && (\n <>\n <span className=\"ods-yaml-viewer__dash\">- </span>\n <span\n className={cn(\n \"ods-yaml-viewer__value\",\n `ods-yaml-viewer__value--${valueClass(t.sequenceValue ?? \"\")}`,\n )}\n >\n {t.sequenceValue}\n </span>\n </>\n )}\n {t.kind === \"scalar\" && (\n <span\n className={cn(\n \"ods-yaml-viewer__value\",\n `ods-yaml-viewer__value--${valueClass(t.raw.trim())}`,\n )}\n >\n {t.raw.trim()}\n </span>\n )}\n {t.kind === \"blank\" && <span> </span>}\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","import type { DeepPartial, OdsConfig } from \"@octaviaflow/config\";\nimport { generateCssVars, resolveConfig } from \"@octaviaflow/config\";\nimport { createContext, type ReactNode, useContext, useEffect, useMemo } from \"react\";\nimport { OverlayProvider } from \"react-aria\";\nimport { odsMotion } from \"../utils/motion\";\n\ntype OdsContextValue = {\n config: OdsConfig;\n};\n\nconst OdsContext = createContext<OdsContextValue | null>(null);\n\ntype OdsProviderProps = {\n config?: DeepPartial<OdsConfig>;\n children: ReactNode;\n};\n\nexport function OdsProvider({ config: userConfig, children }: OdsProviderProps) {\n const resolved = useMemo(() => resolveConfig(userConfig), [userConfig]);\n\n useEffect(() => {\n const cssVarsBlock = generateCssVars(resolved);\n // Extract individual declarations from the :root { ... } block\n const match = cssVarsBlock.match(/:root\\s*\\{([\\s\\S]*)\\}/);\n if (match) {\n const declarations = match[1].trim().split(\"\\n\");\n for (const decl of declarations) {\n const trimmed = decl.trim().replace(/;$/, \"\");\n const colonIndex = trimmed.indexOf(\":\");\n if (colonIndex > -1) {\n const prop = trimmed.slice(0, colonIndex).trim();\n const value = trimmed.slice(colonIndex + 1).trim();\n document.documentElement.style.setProperty(prop, value);\n }\n }\n }\n }, [resolved]);\n\n const contextValue = useMemo(() => ({ config: resolved }), [resolved]);\n\n return (\n <OdsContext.Provider value={contextValue}>\n <OverlayProvider>{children}</OverlayProvider>\n </OdsContext.Provider>\n );\n}\n\nexport function useOds(): OdsConfig {\n const ctx = useContext(OdsContext);\n if (!ctx) {\n throw new Error(\"useOds must be used within an OdsProvider\");\n }\n return ctx.config;\n}\n\ntype MotionPreset = Record<string, unknown>;\ntype MotionPresets = Record<string, MotionPreset>;\n\nconst emptyMotion: MotionPresets = {\n fadeIn: {},\n scaleIn: {},\n slideRight: {},\n slideUp: {},\n tap: {},\n hover: {},\n};\n\nexport function useOdsMotion(): MotionPresets {\n const config = useOds();\n\n return useMemo(() => {\n if (!config.motion.enabled) {\n return emptyMotion;\n }\n\n if (config.motion.reducedMotion === \"always\") {\n return emptyMotion;\n }\n\n if (\n config.motion.reducedMotion === \"respect\" &&\n typeof window !== \"undefined\" &&\n window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches\n ) {\n return emptyMotion;\n }\n\n return odsMotion as unknown as MotionPresets;\n }, [config.motion.enabled, config.motion.reducedMotion]);\n}\n","import type { ConfigStatus, WorkflowNode } from \"./types\";\n\n/**\n * Lightweight field schema type the DS uses to compute config status.\n * Consumers map their own schemas (zod, yup, custom) to this shape.\n */\nexport interface FieldConditional {\n action: \"show\" | \"hide\" | \"require\" | \"disable\";\n field: string;\n operator: \"==\" | \"!=\" | \">\" | \"<\" | \">=\" | \"<=\" | \"in\" | \"not_in\" | \"contains\";\n value: unknown;\n}\n\nexport interface FieldSchema {\n key: string;\n required?: boolean;\n defaultValue?: unknown;\n hidden?: boolean;\n conditional?: FieldConditional[];\n}\n\nexport interface ConfigStatusResult {\n status: ConfigStatus;\n requiredTotal: number;\n requiredFilled: number;\n optionalTotal: number;\n optionalFilled: number;\n missingRequired: string[];\n filledOptional: string[];\n}\n\nfunction isFilled(value: unknown): boolean {\n if (value === undefined || value === null) return false;\n if (typeof value === \"string\") return value.trim().length > 0;\n if (typeof value === \"number\" || typeof value === \"boolean\") return true;\n if (Array.isArray(value)) return value.length > 0;\n if (typeof value === \"object\") return Object.keys(value as Record<string, unknown>).length > 0;\n return false;\n}\n\nfunction getNested(config: Record<string, unknown>, keyPath: string): unknown {\n const parts = keyPath.split(\".\");\n let current: unknown = config;\n for (const part of parts) {\n if (current === null || current === undefined || typeof current !== \"object\") return undefined;\n current = (current as Record<string, unknown>)[part];\n }\n return current;\n}\n\nfunction isActive(field: FieldSchema, config: Record<string, unknown>): boolean {\n if (!field.conditional || field.conditional.length === 0) return true;\n return field.conditional.some((cond) => {\n if (cond.action !== \"show\" && cond.action !== \"require\") return false;\n const value = getNested(config, cond.field);\n switch (cond.operator) {\n case \"==\":\n return value === cond.value;\n case \"!=\":\n return value !== cond.value;\n case \">\":\n return (value as number) > (cond.value as number);\n case \"<\":\n return (value as number) < (cond.value as number);\n case \">=\":\n return (value as number) >= (cond.value as number);\n case \"<=\":\n return (value as number) <= (cond.value as number);\n case \"in\":\n return Array.isArray(cond.value) && (cond.value as unknown[]).includes(value);\n case \"not_in\":\n return Array.isArray(cond.value) && !(cond.value as unknown[]).includes(value);\n case \"contains\":\n return typeof value === \"string\" && value.includes(cond.value as string);\n default:\n return false;\n }\n });\n}\n\n/**\n * Compute the config status of a node, given its fields schema.\n * Returns \"hidden\" if no schema is provided — caller can wrap this and\n * apply their own registry lookup.\n */\nexport function getNodeConfigStatus(\n node: WorkflowNode,\n fields: FieldSchema[] | undefined,\n options: { hiddenActionIds?: Set<string> } = {},\n): ConfigStatusResult {\n const hiddenIds = options.hiddenActionIds;\n if (node.actionDefinitionId && hiddenIds?.has(node.actionDefinitionId)) {\n return {\n status: \"hidden\",\n requiredTotal: 0,\n requiredFilled: 0,\n optionalTotal: 0,\n optionalFilled: 0,\n missingRequired: [],\n filledOptional: [],\n };\n }\n\n if (!fields) {\n return {\n status: \"unconfigured\",\n requiredTotal: 0,\n requiredFilled: 0,\n optionalTotal: 0,\n optionalFilled: 0,\n missingRequired: [],\n filledOptional: [],\n };\n }\n\n const config = node.config ?? {};\n const active = fields.filter((f) => !f.hidden && isActive(f, config));\n const required = active.filter((f) => f.required);\n const optional = active.filter((f) => !f.required);\n\n const missingRequired: string[] = [];\n let requiredFilled = 0;\n\n for (const field of required) {\n const value = getNested(config, field.key);\n if (isFilled(value) || isFilled(field.defaultValue)) requiredFilled++;\n else missingRequired.push(field.key);\n }\n\n const filledOptional: string[] = [];\n let optionalFilled = 0;\n\n for (const field of optional) {\n const value = getNested(config, field.key);\n if (isFilled(value)) {\n optionalFilled++;\n filledOptional.push(field.key);\n }\n }\n\n let status: ConfigStatus;\n if (required.length === 0) status = \"valid\";\n else if (missingRequired.length === 0) status = \"valid\";\n else if (requiredFilled > 0 || optionalFilled > 0) status = \"warning\";\n else status = \"error\";\n\n return {\n status,\n requiredTotal: required.length,\n requiredFilled,\n optionalTotal: optional.length,\n optionalFilled,\n missingRequired,\n filledOptional,\n };\n}\n","import type { WorkflowEdge, WorkflowNode } from \"./types\";\n\nconst NODE_WIDTH = 368;\nconst NODE_HEIGHT = 108;\n\nexport interface LayoutResult {\n nodes: WorkflowNode[];\n}\n\nfunction buildAdjacencyList(edges: WorkflowEdge[]): Map<string, string[]> {\n const adj = new Map<string, string[]>();\n for (const edge of edges) {\n const children = adj.get(edge.source) ?? [];\n children.push(edge.target);\n adj.set(edge.source, children);\n }\n return adj;\n}\n\nfunction findRootNodes(nodes: WorkflowNode[], edges: WorkflowEdge[]): Set<string> {\n const hasIncoming = new Set<string>();\n for (const edge of edges) hasIncoming.add(edge.target);\n const roots = new Set<string>();\n for (const node of nodes) if (!hasIncoming.has(node.id)) roots.add(node.id);\n return roots;\n}\n\nfunction assignLevels(nodes: WorkflowNode[], edges: WorkflowEdge[]): Map<string, number> {\n const levels = new Map<string, number>();\n const adj = buildAdjacencyList(edges);\n const roots = findRootNodes(nodes, edges);\n\n if (roots.size === 0 && nodes.length > 0) roots.add(nodes[0].id);\n\n const queue: Array<{ id: string; level: number }> = [];\n const visited = new Set<string>();\n for (const rootId of roots) queue.push({ id: rootId, level: 0 });\n\n while (queue.length > 0) {\n const next = queue.shift();\n if (!next) continue;\n const { id, level } = next;\n if (visited.has(id)) continue;\n visited.add(id);\n levels.set(id, level);\n\n const children = adj.get(id) ?? [];\n for (const childId of children) {\n if (!visited.has(childId)) queue.push({ id: childId, level: level + 1 });\n }\n }\n\n for (const node of nodes) if (!levels.has(node.id)) levels.set(node.id, 0);\n return levels;\n}\n\nexport interface LayoutOptions {\n direction?: \"horizontal\" | \"vertical\";\n nodeSpacing?: number;\n rankSpacing?: number;\n startX?: number;\n startY?: number;\n nodeWidth?: number;\n nodeHeight?: number;\n}\n\nexport function applyLayout(\n nodes: WorkflowNode[],\n edges: WorkflowEdge[],\n options: LayoutOptions = {},\n): LayoutResult {\n if (nodes.length === 0) return { nodes: [] };\n\n const direction = options.direction ?? \"horizontal\";\n const nodeW = options.nodeWidth ?? NODE_WIDTH;\n const nodeH = options.nodeHeight ?? NODE_HEIGHT;\n const startX = options.startX ?? 50;\n const startY = options.startY ?? 50;\n\n const horizontalSpacing = options.rankSpacing ?? (direction === \"horizontal\" ? 150 : 100);\n const verticalSpacing = options.nodeSpacing ?? (direction === \"horizontal\" ? 80 : 120);\n\n const levels = assignLevels(nodes, edges);\n const nodesByLevel = new Map<number, WorkflowNode[]>();\n for (const node of nodes) {\n const level = levels.get(node.id) ?? 0;\n const group = nodesByLevel.get(level) ?? [];\n group.push(node);\n nodesByLevel.set(level, group);\n }\n\n const laid: WorkflowNode[] = [];\n const sortedLevels = Array.from(nodesByLevel.keys()).sort((a, b) => a - b);\n\n for (const level of sortedLevels) {\n const group = nodesByLevel.get(level) ?? [];\n if (direction === \"horizontal\") {\n const x = startX + level * (nodeW + horizontalSpacing);\n for (let i = 0; i < group.length; i++) {\n const y = startY + i * (nodeH + verticalSpacing);\n laid.push({ ...group[i], position: { x, y } });\n }\n } else {\n const y = startY + level * (nodeH + verticalSpacing);\n for (let i = 0; i < group.length; i++) {\n const x = startX + i * (nodeW + horizontalSpacing);\n laid.push({ ...group[i], position: { x, y } });\n }\n }\n }\n\n return { nodes: laid };\n}\n\nexport function applyHorizontalLayout(nodes: WorkflowNode[], edges: WorkflowEdge[]): LayoutResult {\n return applyLayout(nodes, edges, { direction: \"horizontal\" });\n}\n\nexport function applyVerticalLayout(nodes: WorkflowNode[], edges: WorkflowEdge[]): LayoutResult {\n return applyLayout(nodes, edges, { direction: \"vertical\" });\n}\n"],"mappings":"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","names":["import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_react_aria","import_jsx_runtime","import_framer_motion","import_react","import_react_aria","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_framer_motion","import_jsx_runtime","import_jsx_runtime","import_react","import_react_aria","$1CcWn$react","$1CcWn$useState","$1CcWn$useRef","$1CcWn$useEffect","$1CcWn$useReducer","$1CcWn$useCallback","value","$8AuPP$createContext","$8AuPP$useMemo","$8AuPP$useContext","name","$8AuPP$useState","$8AuPP$useRef","$8AuPP$useEffect","value","a","a","$7w3VE$useRef","$7w3VE$useState","$7w3VE$useMemo","$7w3VE$useEffect","$jO8i1$react","items","node","$emYU7$useMemo","$3yt54$useMemo","$3yt54$useCallback","$3yt54$useRef","$3yt54$useEffect","$kE40A$useCallback","$dJmKC$react","$jhfZc$useMemo","$aoDK0$useState","focusStrategy","$6Hs9a$useMemo","$6Hs9a$useState","$5t5rb$useState","$5t5rb$useMemo","value","focusStrategy","$eOo4G$useRef","$eOo4G$useEffect","$dAajM$useState","$auOuY$useMemo","$auOuY$useRef","$auOuY$useEffect","$aXIpm$useMemo","$aXIpm$useCallback","$aXIpm$useEffect","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","pad","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_framer_motion","import_react","import_react_aria","import_jsx_runtime","import_react","import_jsx_runtime","sel","range","import_react","import_jsx_runtime","SearchIcon","XIcon","import_react","import_jsx_runtime","format","import_jsx_runtime","import_framer_motion","import_react","import_react_aria","import_jsx_runtime","onDrag","onDragStart","onDragEnd","onAnimationStart","import_jsx_runtime","import_jsx_runtime","import_framer_motion","import_react","import_react_aria","import_react_dom","import_jsx_runtime","import_jsx_runtime","import_framer_motion","import_react","import_jsx_runtime","TrashIcon","import_jsx_runtime","import_react","import_jsx_runtime","error","import_framer_motion","import_react","import_jsx_runtime","import_framer_motion","import_react","import_jsx_runtime","FlowNode","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_react_dom","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","pad","import_jsx_runtime","import_react","import_jsx_runtime","model","import_react","import_jsx_runtime","import_framer_motion","import_react","import_react_dom","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_react_dom","import_jsx_runtime","computePosition","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","fmtSize","import_jsx_runtime","import_react","import_react_aria","import_react","import_react_aria","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_framer_motion","import_react","import_react_aria","import_react_dom","import_jsx_runtime","ChevronDown","import_jsx_runtime","import_framer_motion","import_react","import_react_dom","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_framer_motion","import_react","import_react_aria","import_react_dom","import_jsx_runtime","slideVariants","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","pad","import_jsx_runtime","import_jsx_runtime","import_react","import_react_aria","import_jsx_runtime","import_react","import_jsx_runtime","import_framer_motion","import_react","import_react_aria","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_react_aria","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_framer_motion","import_react","import_react_dom","import_jsx_runtime","idCounter","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_framer_motion","import_react","import_react_aria","import_react_dom","import_jsx_runtime","computePosition","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_react","import_jsx_runtime","import_react","import_jsx_runtime","pad","import_react","import_jsx_runtime","pad","colon","hidden","import_react","import_react_aria","import_jsx_runtime"]}
|