@nocoo/basalt 3.2.0 → 3.2.4
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/README.md +25 -19
- package/ai/COMPATIBILITY.md +41 -36
- package/ai/DESIGN.md +73 -56
- package/ai/INTEGRATION.md +819 -825
- package/ai/RECIPES.md +334 -135
- package/ai/USAGE.md +2 -2
- package/ai/registry.json +454 -97
- package/ai/sources.json +2 -2
- package/dist/assets/brand-mark.js +1 -2
- package/dist/charts/area.js +1 -2
- package/dist/charts/bar.js +1 -2
- package/dist/charts/bullet.js +1 -2
- package/dist/charts/chart-colors.js +1 -2
- package/dist/charts/charts.js +1 -2
- package/dist/charts/config.js +1 -2
- package/dist/charts/custom-chart.js +1 -2
- package/dist/charts/date-navigation.js +1 -2
- package/dist/charts/donut.js +1 -2
- package/dist/charts/frame.js +3 -4
- package/dist/charts/frame.js.map +1 -1
- package/dist/charts/funnel.js +1 -2
- package/dist/charts/gauge.js +1 -2
- package/dist/charts/grouped-bar.js +1 -2
- package/dist/charts/heatmap-calendar.js +7 -11
- package/dist/charts/heatmap-calendar.js.map +1 -1
- package/dist/charts/heatmap-matrix.js +4 -5
- package/dist/charts/heatmap-matrix.js.map +1 -1
- package/dist/charts/item-list.js +1 -2
- package/dist/charts/legend.js +1 -2
- package/dist/charts/line.js +1 -2
- package/dist/charts/palette.js +1 -2
- package/dist/charts/radar.js +1 -2
- package/dist/charts/sample.js +1 -2
- package/dist/charts/sankey.js +1 -2
- package/dist/charts/series.js +1 -2
- package/dist/charts/slot-bar.js +1 -2
- package/dist/charts/sparkline.js +1 -2
- package/dist/charts/stacked-bar.js +1 -2
- package/dist/charts/stat-card.js +1 -2
- package/dist/charts/timeline.js +1 -2
- package/dist/charts/timeseries.js +1 -2
- package/dist/charts/tooltip.js +31 -27
- package/dist/charts/tooltip.js.map +1 -1
- package/dist/components/accordion.js +1 -2
- package/dist/components/alert-dialog.js +1 -2
- package/dist/components/app-header.js +2 -3
- package/dist/components/app-header.js.map +1 -1
- package/dist/components/app-shell.js +2 -3
- package/dist/components/app-shell.js.map +1 -1
- package/dist/components/approval-card.js +1 -2
- package/dist/components/autocomplete.js +1 -2
- package/dist/components/avatar.js +1 -2
- package/dist/components/badge.js +1 -2
- package/dist/components/banner.js +1 -2
- package/dist/components/basalt-mark.js +1 -2
- package/dist/components/battery-meter.js +1 -2
- package/dist/components/breadcrumbs.js +1 -2
- package/dist/components/button.d.ts +1 -1
- package/dist/components/button.js +3 -3
- package/dist/components/button.js.map +1 -1
- package/dist/components/chat-bubble.js +1 -2
- package/dist/components/chat-composer.js +2 -3
- package/dist/components/chat-composer.js.map +1 -1
- package/dist/components/chat-header.js +1 -2
- package/dist/components/chat-inbox.js +1 -2
- package/dist/components/chat-markdown.js +1 -2
- package/dist/components/chat-message.js +2 -3
- package/dist/components/chat-message.js.map +1 -1
- package/dist/components/checkbox.js +1 -2
- package/dist/components/clipboard-text.js +1 -2
- package/dist/components/code.js +2 -3
- package/dist/components/code.js.map +1 -1
- package/dist/components/collapsible.js +1 -2
- package/dist/components/collapsible.js.map +1 -1
- package/dist/components/combobox.js +1 -2
- package/dist/components/command-palette.js +3 -4
- package/dist/components/command-palette.js.map +1 -1
- package/dist/components/confirm-dialog.js +3 -12
- package/dist/components/confirm-dialog.js.map +1 -1
- package/dist/components/context-cards.js +2 -3
- package/dist/components/context-cards.js.map +1 -1
- package/dist/components/context-menu.js +2 -3
- package/dist/components/context-menu.js.map +1 -1
- package/dist/components/data-table.js +129 -131
- package/dist/components/data-table.js.map +1 -1
- package/dist/components/date-picker.js +7 -18
- package/dist/components/date-picker.js.map +1 -1
- package/dist/components/delete-resource.js +1 -2
- package/dist/components/description-list.js +1 -2
- package/dist/components/dialog.js +1 -2
- package/dist/components/diff-table.js +2 -3
- package/dist/components/diff-table.js.map +1 -1
- package/dist/components/dock.js +1 -2
- package/dist/components/dock.js.map +1 -1
- package/dist/components/dropdown-menu.js +2 -3
- package/dist/components/dropdown-menu.js.map +1 -1
- package/dist/components/editable-nav-item.js +3 -4
- package/dist/components/editable-nav-item.js.map +1 -1
- package/dist/components/empty.js +1 -2
- package/dist/components/fab.js +1 -2
- package/dist/components/field.js +1 -2
- package/dist/components/file-dropzone.js +2 -3
- package/dist/components/file-dropzone.js.map +1 -1
- package/dist/components/filter-bar.js +2 -3
- package/dist/components/filter-bar.js.map +1 -1
- package/dist/components/flow.js +1 -2
- package/dist/components/grid.js +1 -2
- package/dist/components/hover-card.js +1 -2
- package/dist/components/icon-picker.js +4 -5
- package/dist/components/icon-picker.js.map +1 -1
- package/dist/components/inline-editable.js +2 -3
- package/dist/components/inline-editable.js.map +1 -1
- package/dist/components/input-area.js +1 -2
- package/dist/components/input-group.js +4 -5
- package/dist/components/input-group.js.map +1 -1
- package/dist/components/input.js +1 -2
- package/dist/components/label.js +1 -2
- package/dist/components/layer-card.js +3 -3
- package/dist/components/layer-card.js.map +1 -1
- package/dist/components/link.js +2 -3
- package/dist/components/link.js.map +1 -1
- package/dist/components/loader.js +1 -2
- package/dist/components/loading-screen.js +1 -2
- package/dist/components/menu-bar.js +3 -4
- package/dist/components/menu-bar.js.map +1 -1
- package/dist/components/meter.js +1 -2
- package/dist/components/multi-select.js +2 -3
- package/dist/components/multi-select.js.map +1 -1
- package/dist/components/navigation-menu.js +1 -2
- package/dist/components/overlay.d.ts +3 -6
- package/dist/components/overlay.js +4 -5
- package/dist/components/overlay.js.map +1 -1
- package/dist/components/page-header.js +1 -2
- package/dist/components/pagination.js +1 -2
- package/dist/components/popover.js +1 -2
- package/dist/components/prompt-bar.js +1 -2
- package/dist/components/radio.js +2 -7
- package/dist/components/radio.js.map +1 -1
- package/dist/components/recommendation-card.js +1 -2
- package/dist/components/resource-list.js +1 -2
- package/dist/components/responsive-master-detail.js +3 -4
- package/dist/components/responsive-master-detail.js.map +1 -1
- package/dist/components/scroll-area.js +2 -3
- package/dist/components/scroll-area.js.map +1 -1
- package/dist/components/section-rule.js +1 -2
- package/dist/components/segment-control.js +2 -3
- package/dist/components/segment-control.js.map +1 -1
- package/dist/components/select.js +2 -3
- package/dist/components/select.js.map +1 -1
- package/dist/components/sensitive-input.js +2 -3
- package/dist/components/sensitive-input.js.map +1 -1
- package/dist/components/separator.js +1 -2
- package/dist/components/sheet.js +1 -2
- package/dist/components/sidebar.d.ts +53 -19
- package/dist/components/sidebar.js +201 -100
- package/dist/components/sidebar.js.map +1 -1
- package/dist/components/skeleton-line.js +1 -2
- package/dist/components/slider.js +1 -2
- package/dist/components/stat-strip.js +1 -2
- package/dist/components/switch.js +1 -2
- package/dist/components/table-of-contents.js +1 -2
- package/dist/components/table-pager.js +1 -2
- package/dist/components/table.js +2 -3
- package/dist/components/table.js.map +1 -1
- package/dist/components/tabs.js +2 -3
- package/dist/components/tabs.js.map +1 -1
- package/dist/components/tag-badge.js +1 -2
- package/dist/components/tag-color-picker.js +3 -4
- package/dist/components/tag-color-picker.js.map +1 -1
- package/dist/components/text.js +1 -2
- package/dist/components/theme-toggle.js +1 -2
- package/dist/components/thinking.js +1 -2
- package/dist/components/toast.js +2 -3
- package/dist/components/toast.js.map +1 -1
- package/dist/components/toggle-group.js +1 -2
- package/dist/components/toggle.js +1 -2
- package/dist/components/tool-chips.js +1 -2
- package/dist/components/toolbar.js +9 -10
- package/dist/components/toolbar.js.map +1 -1
- package/dist/components/tooltip.js +1 -2
- package/dist/components/typeahead-field.js +6 -21
- package/dist/components/typeahead-field.js.map +1 -1
- package/dist/components/upload-queue.js +1 -2
- package/dist/index.d.ts +1 -1
- package/dist/index.js +11 -11
- package/dist/models/agent-feedback.js +1 -2
- package/dist/models/avatar.js +1 -2
- package/dist/models/code.js +1 -2
- package/dist/models/context-cards.js +1 -2
- package/dist/models/diff-table.js +1 -2
- package/dist/models/recommendation.js +1 -2
- package/dist/providers/accent.js +2 -7
- package/dist/providers/accent.js.map +1 -1
- package/dist/providers/link.js +1 -2
- package/dist/providers/theme.js +2 -7
- package/dist/providers/theme.js.map +1 -1
- package/dist/styles/base.css +71 -0
- package/dist/styles/standalone.css +127 -98
- package/dist/styles/tailwind.css +10 -2
- package/dist/styles/tokens.css +55 -7
- package/dist/utils/cn.js +1 -2
- package/dist/utils/control-surface.js +1 -2
- package/dist/utils/navigation.d.ts +2 -2
- package/dist/utils/navigation.js +2 -3
- package/dist/utils/navigation.js.map +1 -1
- package/dist/utils/preference-store.js +1 -2
- package/dist/utils/selection-indicator.js +1 -2
- package/dist/utils/use-checkable-group.js +1 -2
- package/dist/utils/use-hover-highlight.js +2 -3
- package/dist/utils/use-hover-highlight.js.map +1 -1
- package/dist/viewmodels/use-approval-card.js +11 -13
- package/dist/viewmodels/use-approval-card.js.map +1 -1
- package/dist/viewmodels/use-chat-composer.js +1 -2
- package/dist/viewmodels/use-chat-message.js +1 -2
- package/dist/viewmodels/use-code-block.js +1 -2
- package/dist/viewmodels/use-code-block.js.map +1 -1
- package/dist/viewmodels/use-context-cards.js +1 -2
- package/dist/viewmodels/use-diff-table.js +1 -2
- package/dist/viewmodels/use-diff-table.js.map +1 -1
- package/dist/viewmodels/use-loader.js +1 -2
- package/dist/viewmodels/use-recommendation-card.js +1 -2
- package/dist/viewmodels/use-recommendation-card.js.map +1 -1
- package/dist/viewmodels/use-thinking.js +1 -2
- package/dist/viewmodels/use-tool-chips.js +1 -2
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toast.js","names":["sonnerToast","Sonner","Toaster$1","toast$1","VARIANT_CLASS","VARIANT_ICON","Check","CircleAlert","TriangleAlert","Info","resolveIcon","icon","variant","show","rest","options","payload","close","message","toast","Toaster","props","X","Toast"],"sources":["../../src/components/toast.tsx"],"sourcesContent":["import { Check, CircleAlert, Info, TriangleAlert, X } from \"lucide-react\";\nimport type { ComponentProps, ReactNode } from \"react\";\nimport { Toaster as Sonner, toast as sonnerToast } from \"sonner\";\n\nexport type ToastVariant = \"default\" | \"success\" | \"error\" | \"warning\" | \"info\";\n\nexport type ToastOptions = {\n\t/**\n\t * Secondary supporting text or node displayed below the main message.\n\t */\n\tdescription?: ReactNode;\n\t/**\n\t * Custom icon override. When set to `false`, suppresses default status or notification icons.\n\t */\n\ticon?: ReactNode | false;\n\t/**\n\t * Whether a close button is displayed on this individual toast notification.\n\t * @default true\n\t */\n\tclose?: boolean;\n\t/**\n\t * Visibility duration in milliseconds before auto-dismissal. Resolved as `toast.duration || (Toaster.toastOptions.duration ?? Toaster.duration) || 4000`. Infinity disables auto-closing. Setting to 0 treats it as falsy and falls back through container duration before defaulting to 4000ms.\n\t * @default \"inherited from container, finally 4000ms\"\n\t */\n\tduration?: number;\n\t/**\n\t * Unique identifier for this toast notification. Can be used with `toast.dismiss(id)` to manually dismiss this specific toast.\n\t */\n\tid?: string | number;\n\t/**\n\t * Optional action button configuration with label and onClick handler.\n\t */\n\taction?: {\n\t\tlabel: string;\n\t\tonClick: () => void;\n\t};\n};\n\n/**\n * Options accepted by the root `toast(message, options)` dispatch function, extending `ToastOptions` with an optional `variant`.\n */\nexport type ToastCallOptions = ToastOptions & {\n\t/**\n\t * Visual status variant style for this toast.\n\t * @default \"default\"\n\t */\n\tvariant?: ToastVariant;\n};\n\nconst VARIANT_CLASS: Record<ToastVariant, string> = {\n\tdefault: \"bg-basalt-popover\",\n\tsuccess:\n\t\t\"bg-basalt-heatmap-green-1 [&_[data-icon]]:text-basalt-heatmap-green-4 [&_[data-title]]:text-basalt-heatmap-green-4\",\n\terror:\n\t\t\"bg-basalt-danger-tint [&_[data-icon]]:text-basalt-danger [&_[data-title]]:text-basalt-danger\",\n\twarning:\n\t\t\"bg-basalt-warning-tint [&_[data-icon]]:text-basalt-warning [&_[data-title]]:text-basalt-warning\",\n\tinfo: \"bg-basalt-info-tint [&_[data-icon]]:text-basalt-info [&_[data-title]]:text-basalt-info\",\n};\n\nconst VARIANT_ICON: Record<ToastVariant, ReactNode> = {\n\tdefault: null,\n\tsuccess: <Check className=\"size-basalt-icon-lg\" />,\n\terror: <CircleAlert className=\"size-basalt-icon-lg\" />,\n\twarning: <TriangleAlert className=\"size-basalt-icon-lg\" />,\n\tinfo: <Info className=\"size-basalt-icon-lg\" />,\n};\n\nfunction resolveIcon(variant: ToastVariant, icon: ToastOptions[\"icon\"]) {\n\tif (icon === false) {\n\t\treturn null;\n\t}\n\tif (icon != null) {\n\t\treturn icon;\n\t}\n\treturn VARIANT_ICON[variant] ?? undefined;\n}\n\n/**\n * Dispatches a toast notification with the given message and options.\n * @param message Main notification content or React node.\n * @param options Notification customization options including optional variant.\n * @returns The unique toast identifier (string or number).\n */\nfunction show(message: ReactNode, options: ToastCallOptions = {}) {\n\tconst { variant = \"default\", icon, close = true, ...rest } = options;\n\tconst payload = {\n\t\t...rest,\n\t\tcloseButton: close,\n\t\tclassName: VARIANT_CLASS[variant],\n\t\ticon: resolveIcon(variant, icon),\n\t};\n\tif (variant === \"success\") {\n\t\treturn sonnerToast.success(message, payload);\n\t}\n\tif (variant === \"error\") {\n\t\treturn sonnerToast.error(message, payload);\n\t}\n\tif (variant === \"warning\") {\n\t\treturn sonnerToast.warning(message, payload);\n\t}\n\tif (variant === \"info\") {\n\t\treturn sonnerToast.info(message, payload);\n\t}\n\treturn sonnerToast(message, payload);\n}\n\n/**\n * Imperative notification dispatcher. Directly callable as `toast(message, options)` to display a default notification, with helper methods for status variants (`success`, `error`, `warning`, `info`) and dismissal (`dismiss`).\n */\nexport const toast = Object.assign(show, {\n\t/**\n\t * Dispatches a success status toast notification.\n\t * @param message Main notification content or React node.\n\t * @param options Notification customization options.\n\t * @returns The unique toast identifier (string or number).\n\t */\n\tsuccess: (message: ReactNode, options?: ToastOptions) =>\n\t\tshow(message, { ...options, variant: \"success\" }),\n\t/**\n\t * Dispatches an error status toast notification.\n\t * @param message Main notification content or React node.\n\t * @param options Notification customization options.\n\t * @returns The unique toast identifier (string or number).\n\t */\n\terror: (message: ReactNode, options?: ToastOptions) =>\n\t\tshow(message, { ...options, variant: \"error\" }),\n\t/**\n\t * Dispatches a warning status toast notification.\n\t * @param message Main notification content or React node.\n\t * @param options Notification customization options.\n\t * @returns The unique toast identifier (string or number).\n\t */\n\twarning: (message: ReactNode, options?: ToastOptions) =>\n\t\tshow(message, { ...options, variant: \"warning\" }),\n\t/**\n\t * Dispatches an info status toast notification.\n\t * @param message Main notification content or React node.\n\t * @param options Notification customization options.\n\t * @returns The unique toast identifier (string or number).\n\t */\n\tinfo: (message: ReactNode, options?: ToastOptions) =>\n\t\tshow(message, { ...options, variant: \"info\" }),\n\t/**\n\t * Dismisses an active toast by its identifier, or dismisses all toasts when called without arguments. Note: Calling without arguments returns `undefined` at runtime; calling with `id` returns the dismissed `id`.\n\t * @param id Optional identifier of the toast to dismiss. When omitted, all toasts are dismissed.\n\t * @returns The dismissed toast identifier if provided, or undefined if dismissed without arguments.\n\t */\n\tdismiss: sonnerToast.dismiss,\n});\n\ntype SonnerComponentProps = ComponentProps<typeof Sonner>;\n\nexport type ToasterToastOptions = NonNullable<SonnerComponentProps[\"toastOptions\"]>;\nexport type ToasterIcons = NonNullable<SonnerComponentProps[\"icons\"]>;\nexport type ToasterSwipeDirection = NonNullable<SonnerComponentProps[\"swipeDirections\"]>[number];\n\nexport interface ToasterProps\n\textends Omit<\n\t\tSonnerComponentProps,\n\t\t| \"id\"\n\t\t| \"invert\"\n\t\t| \"theme\"\n\t\t| \"position\"\n\t\t| \"hotkey\"\n\t\t| \"richColors\"\n\t\t| \"expand\"\n\t\t| \"duration\"\n\t\t| \"gap\"\n\t\t| \"visibleToasts\"\n\t\t| \"closeButton\"\n\t\t| \"toastOptions\"\n\t\t| \"className\"\n\t\t| \"style\"\n\t\t| \"offset\"\n\t\t| \"mobileOffset\"\n\t\t| \"dir\"\n\t\t| \"swipeDirections\"\n\t\t| \"icons\"\n\t\t| \"containerAriaLabel\"\n\t\t| \"customAriaLabel\"\n\t> {\n\t/**\n\t * Unique identifier for this toaster instance. When set, only toasts dispatched with a matching toasterId will display here. Basalt standard toast options do not expose toasterId, so global un-identified mounting is recommended.\n\t */\n\tid?: SonnerComponentProps[\"id\"];\n\t/**\n\t * Invert toast foreground and background colors.\n\t * @default false\n\t */\n\tinvert?: SonnerComponentProps[\"invert\"];\n\t/**\n\t * Color scheme theme override for toast notifications.\n\t * @default \"light\"\n\t */\n\ttheme?: SonnerComponentProps[\"theme\"];\n\t/**\n\t * Screen positioning for the toast viewport stack.\n\t * @default \"bottom-right\"\n\t */\n\tposition?: SonnerComponentProps[\"position\"];\n\t/**\n\t * Keyboard hotkey combination to expand and focus the toast viewport.\n\t * @default [\"altKey\", \"KeyT\"]\n\t */\n\thotkey?: SonnerComponentProps[\"hotkey\"];\n\t/**\n\t * Whether rich semantic colors should be applied to default notification styles.\n\t * @default false\n\t */\n\trichColors?: SonnerComponentProps[\"richColors\"];\n\t/**\n\t * Whether toasts should be expanded by default rather than collapsed into a stacked pile.\n\t * @default false\n\t */\n\texpand?: SonnerComponentProps[\"expand\"];\n\t/**\n\t * Default visibility duration in milliseconds before auto-dismissal. Resolved as `toast.duration || (Toaster.toastOptions.duration ?? Toaster.duration) || 4000`. Passing Infinity prevents auto-closing. When `toastOptions.duration === 0`, it is treated as falsy and bypasses `Toaster.duration`, falling back to 4000.\n\t * @default 4000\n\t */\n\tduration?: SonnerComponentProps[\"duration\"];\n\t/**\n\t * Pixel gap between stacked toasts.\n\t * @default 14\n\t */\n\tgap?: SonnerComponentProps[\"gap\"];\n\t/**\n\t * Maximum number of toasts visible simultaneously in the stack.\n\t * @default 3\n\t */\n\tvisibleToasts?: SonnerComponentProps[\"visibleToasts\"];\n\t/**\n\t * Whether a close button is displayed on each toast notification. Basalt enables this by default (`closeButton = true`), and Basalt single-toast calls also default to `close: true`, overriding `Toaster.closeButton = false`. To hide the close button on an individual toast, pass `close: false` in the dispatch options.\n\t * @default true\n\t */\n\tcloseButton?: SonnerComponentProps[\"closeButton\"];\n\t/**\n\t * Default options and custom class names applied to all rendered toasts. Passing a custom `toastOptions` object will override Basalt default styling rather than deep-merging.\n\t */\n\ttoastOptions?: ToasterToastOptions;\n\t/**\n\t * Additional CSS class name applied to each rendered ordered list (`ol`) toast viewport.\n\t */\n\tclassName?: SonnerComponentProps[\"className\"];\n\t/**\n\t * Inline style properties applied to each rendered ordered list (`ol`) toast viewport.\n\t */\n\tstyle?: SonnerComponentProps[\"style\"];\n\t/**\n\t * Viewport offset margin from screen edges on desktop screens.\n\t * @default \"24px\"\n\t */\n\toffset?: SonnerComponentProps[\"offset\"];\n\t/**\n\t * Viewport offset margin from screen edges on mobile devices.\n\t * @default \"16px\"\n\t */\n\tmobileOffset?: SonnerComponentProps[\"mobileOffset\"];\n\t/**\n\t * Layout direction of the notification viewport ('ltr', 'rtl', or document direction when unspecified).\n\t * @default document direction\n\t */\n\tdir?: SonnerComponentProps[\"dir\"];\n\t/**\n\t * Allowed swipe directions to dismiss toasts. Defaults based on position orientation (e.g. ['bottom', 'right'] for bottom-right).\n\t */\n\tswipeDirections?: ToasterSwipeDirection[];\n\t/**\n\t * Custom icon overrides for toast status variants. Basalt preconfigures Lucide icons; passing an `icons` object replaces defaults rather than deep-merging. Basalt status variant dispatches (`toast.success`, `error`, `warning`, `info`) supply default status icons directly, which take precedence over `Toaster.icons`; custom individual toast icons should be passed via `options.icon`.\n\t */\n\ticons?: ToasterIcons;\n\t/**\n\t * Accessible label for the notification region container.\n\t * @default \"Notifications\"\n\t */\n\tcontainerAriaLabel?: SonnerComponentProps[\"containerAriaLabel\"];\n\t/**\n\t * Custom accessible label overriding both containerAriaLabel and hotkey text on the section wrapper.\n\t */\n\tcustomAriaLabel?: SonnerComponentProps[\"customAriaLabel\"];\n}\n\nexport function Toaster({ closeButton = true, ...props }: ToasterProps) {\n\treturn (\n\t\t<Sonner\n\t\t\tcloseButton={closeButton}\n\t\t\ticons={{\n\t\t\t\tsuccess: <Check className=\"size-basalt-icon-lg\" />,\n\t\t\t\terror: <CircleAlert className=\"size-basalt-icon-lg\" />,\n\t\t\t\twarning: <TriangleAlert className=\"size-basalt-icon-lg\" />,\n\t\t\t\tinfo: <Info className=\"size-basalt-icon-lg\" />,\n\t\t\t\tclose: <X className=\"size-basalt-icon\" />,\n\t\t\t}}\n\t\t\ttoastOptions={{\n\t\t\t\tunstyled: true,\n\t\t\t\tclassNames: {\n\t\t\t\t\ttoast:\n\t\t\t\t\t\t\"basalt-ui basalt-toast flex w-full items-center gap-basalt-space-lg rounded-basalt-md bg-basalt-popover px-basalt-card-lg py-basalt-card text-basalt-base leading-[var(--basalt-leading-banner)] text-basalt-foreground shadow-lg [&_[data-content]]:min-w-0 [&_[data-content]]:flex-1\",\n\t\t\t\t\ttitle: \"font-medium\",\n\t\t\t\t\tdescription:\n\t\t\t\t\t\t\"text-basalt-sm leading-[var(--basalt-line-relaxed)] text-basalt-muted-foreground\",\n\t\t\t\t\tcloseButton:\n\t\t\t\t\t\t\"basalt-action basalt-action-icon order-last inline-flex shrink-0 cursor-pointer items-center justify-center rounded-basalt-sm text-basalt-muted-foreground hover:bg-basalt-hover hover:text-basalt-foreground focus-visible:ring-2 focus-visible:ring-basalt-ring\",\n\t\t\t\t\tactionButton:\n\t\t\t\t\t\t\"basalt-action shrink-0 cursor-pointer rounded-basalt-sm bg-basalt-primary text-basalt-primary-foreground hover:bg-basalt-primary-hover\",\n\t\t\t\t\tcancelButton:\n\t\t\t\t\t\t\"basalt-action shrink-0 cursor-pointer rounded-basalt-sm bg-basalt-control hover:bg-basalt-hover\",\n\t\t\t\t\ticon: \"flex size-basalt-icon-lg shrink-0 items-center justify-center\",\n\t\t\t\t\tsuccess: VARIANT_CLASS.success,\n\t\t\t\t\terror: VARIANT_CLASS.error,\n\t\t\t\t\twarning: VARIANT_CLASS.warning,\n\t\t\t\t\tinfo: VARIANT_CLASS.info,\n\t\t\t\t},\n\t\t\t}}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport const Toast = Toaster;\n"],"mappings":";;;;;AAiDA,IAAMI,IAA8C;CACnD,SAAS;CACT,SACC;CACD,OACC;CACD,SACC;CACD,MAAM;AACP,GAEMC,IAAgD;CACrD,SAAS;CACT,SAAS,kBAACC,GAAD,EAAO,WAAU,sBAAuB,CAAA;CACjD,OAAO,kBAACC,GAAD,EAAa,WAAU,sBAAuB,CAAA;CACrD,SAAS,kBAACC,GAAD,EAAe,WAAU,sBAAuB,CAAA;CACzD,MAAM,kBAACC,GAAD,EAAM,WAAU,sBAAuB,CAAA;AAC9C;AAEA,SAASC,EAAY,GAAuB,GAA4B;CAOvE,OANIC,MAAS,KACL,OAEJA,KAGGN,EAAaO,MAAY,KAAA;AACjC;AAQA,SAASC,EAAK,GAAoB,IAA4B,CAAC,GAAG;CACjE,IAAM,EAAE,aAAU,WAAW,SAAM,WAAQ,IAAM,GAAGC,MAASC,GACvDC,IAAU;EACf,GAAGF;EACH,aAAaG;EACb,WAAWb,EAAcQ;EACzB,MAAMF,EAAYE,GAASD,CAAI;CAChC;CAaA,OAZIC,MAAY,YACRZ,EAAY,QAAQkB,GAASF,CAAO,IAExCJ,MAAY,UACRZ,EAAY,MAAMkB,GAASF,CAAO,IAEtCJ,MAAY,YACRZ,EAAY,QAAQkB,GAASF,CAAO,IAExCJ,MAAY,SACRZ,EAAY,KAAKkB,GAASF,CAAO,IAElChB,EAAYkB,GAASF,CAAO;AACpC;AAKA,IAAaG,IAAQ,OAAO,OAAON,GAAM;CAOxC,UAAU,GAAoB,MAC7BA,EAAKK,GAAS;EAAE,GAAGH;EAAS,SAAS;CAAU,CAAC;CAOjD,QAAQ,GAAoB,MAC3BF,EAAKK,GAAS;EAAE,GAAGH;EAAS,SAAS;CAAQ,CAAC;CAO/C,UAAU,GAAoB,MAC7BF,EAAKK,GAAS;EAAE,GAAGH;EAAS,SAAS;CAAU,CAAC;CAOjD,OAAO,GAAoB,MAC1BF,EAAKK,GAAS;EAAE,GAAGH;EAAS,SAAS;CAAO,CAAC;CAM9C,SAASf,EAAY;AACtB,CAAC;AAqID,SAAgBoB,EAAQ,EAAE,iBAAc,IAAM,GAAGC,KAAuB;CACvE,OACC,kBAACpB,GAAD;EACc;EACb,OAAO;GACN,SAAS,kBAACK,GAAD,EAAO,WAAU,sBAAuB,CAAA;GACjD,OAAO,kBAACC,GAAD,EAAa,WAAU,sBAAuB,CAAA;GACrD,SAAS,kBAACC,GAAD,EAAe,WAAU,sBAAuB,CAAA;GACzD,MAAM,kBAACC,GAAD,EAAM,WAAU,sBAAuB,CAAA;GAC7C,OAAO,kBAACa,GAAD,EAAG,WAAU,mBAAoB,CAAA;EACzC;EACA,cAAc;GACb,UAAU;GACV,YAAY;IACX,OACC;IACD,OAAO;IACP,aACC;IACD,aACC;IACD,cACC;IACD,cACC;IACD,MAAM;IACN,SAASlB,EAAc;IACvB,OAAOA,EAAc;IACrB,SAASA,EAAc;IACvB,MAAMA,EAAc;GACrB;EACD;EACA,GAAIiB;CACJ,CAAA;AAEH;AAEA,IAAaE,IAAQH"}
|
|
1
|
+
{"version":3,"file":"toast.js","names":["sonnerToast","Sonner","Toaster$1","toast$1","VARIANT_CLASS","VARIANT_ICON","Check","CircleAlert","TriangleAlert","Info","resolveIcon","icon","variant","show","rest","options","payload","close","message","toast","Toaster","props","X","Toast"],"sources":["../../src/components/toast.tsx"],"sourcesContent":["import { Check, CircleAlert, Info, TriangleAlert, X } from \"lucide-react\";\nimport type { ComponentProps, ReactNode } from \"react\";\nimport { Toaster as Sonner, toast as sonnerToast } from \"sonner\";\n\nexport type ToastVariant = \"default\" | \"success\" | \"error\" | \"warning\" | \"info\";\n\nexport type ToastOptions = {\n\t/**\n\t * Secondary supporting text or node displayed below the main message.\n\t */\n\tdescription?: ReactNode;\n\t/**\n\t * Custom icon override. When set to `false`, suppresses default status or notification icons.\n\t */\n\ticon?: ReactNode | false;\n\t/**\n\t * Whether a close button is displayed on this individual toast notification.\n\t * @default true\n\t */\n\tclose?: boolean;\n\t/**\n\t * Visibility duration in milliseconds before auto-dismissal. Resolved as `toast.duration || (Toaster.toastOptions.duration ?? Toaster.duration) || 4000`. Infinity disables auto-closing. Setting to 0 treats it as falsy and falls back through container duration before defaulting to 4000ms.\n\t * @default \"inherited from container, finally 4000ms\"\n\t */\n\tduration?: number;\n\t/**\n\t * Unique identifier for this toast notification. Can be used with `toast.dismiss(id)` to manually dismiss this specific toast.\n\t */\n\tid?: string | number;\n\t/**\n\t * Optional action button configuration with label and onClick handler.\n\t */\n\taction?: {\n\t\tlabel: string;\n\t\tonClick: () => void;\n\t};\n};\n\n/**\n * Options accepted by the root `toast(message, options)` dispatch function, extending `ToastOptions` with an optional `variant`.\n */\nexport type ToastCallOptions = ToastOptions & {\n\t/**\n\t * Visual status variant style for this toast.\n\t * @default \"default\"\n\t */\n\tvariant?: ToastVariant;\n};\n\nconst VARIANT_CLASS: Record<ToastVariant, string> = {\n\tdefault: \"bg-basalt-popover\",\n\tsuccess:\n\t\t\"bg-basalt-heatmap-green-1 [&_[data-icon]]:text-basalt-heatmap-green-4 [&_[data-title]]:text-basalt-heatmap-green-4\",\n\terror:\n\t\t\"bg-basalt-danger-tint [&_[data-icon]]:text-basalt-danger [&_[data-title]]:text-basalt-danger\",\n\twarning:\n\t\t\"bg-basalt-warning-tint [&_[data-icon]]:text-basalt-warning [&_[data-title]]:text-basalt-warning\",\n\tinfo: \"bg-basalt-info-tint [&_[data-icon]]:text-basalt-info [&_[data-title]]:text-basalt-info\",\n};\n\nconst VARIANT_ICON: Record<ToastVariant, ReactNode> = {\n\tdefault: null,\n\tsuccess: <Check className=\"size-basalt-icon-lg\" />,\n\terror: <CircleAlert className=\"size-basalt-icon-lg\" />,\n\twarning: <TriangleAlert className=\"size-basalt-icon-lg\" />,\n\tinfo: <Info className=\"size-basalt-icon-lg\" />,\n};\n\nfunction resolveIcon(variant: ToastVariant, icon: ToastOptions[\"icon\"]) {\n\tif (icon === false) {\n\t\treturn null;\n\t}\n\tif (icon != null) {\n\t\treturn icon;\n\t}\n\treturn VARIANT_ICON[variant] ?? undefined;\n}\n\n/**\n * Dispatches a toast notification with the given message and options.\n * @param message Main notification content or React node.\n * @param options Notification customization options including optional variant.\n * @returns The unique toast identifier (string or number).\n */\nfunction show(message: ReactNode, options: ToastCallOptions = {}) {\n\tconst { variant = \"default\", icon, close = true, ...rest } = options;\n\tconst payload = {\n\t\t...rest,\n\t\tcloseButton: close,\n\t\tclassName: VARIANT_CLASS[variant],\n\t\ticon: resolveIcon(variant, icon),\n\t};\n\tif (variant === \"success\") {\n\t\treturn sonnerToast.success(message, payload);\n\t}\n\tif (variant === \"error\") {\n\t\treturn sonnerToast.error(message, payload);\n\t}\n\tif (variant === \"warning\") {\n\t\treturn sonnerToast.warning(message, payload);\n\t}\n\tif (variant === \"info\") {\n\t\treturn sonnerToast.info(message, payload);\n\t}\n\treturn sonnerToast(message, payload);\n}\n\n/**\n * Imperative notification dispatcher. Directly callable as `toast(message, options)` to display a default notification, with helper methods for status variants (`success`, `error`, `warning`, `info`) and dismissal (`dismiss`).\n */\nexport const toast = Object.assign(show, {\n\t/**\n\t * Dispatches a success status toast notification.\n\t * @param message Main notification content or React node.\n\t * @param options Notification customization options.\n\t * @returns The unique toast identifier (string or number).\n\t */\n\tsuccess: (message: ReactNode, options?: ToastOptions) =>\n\t\tshow(message, { ...options, variant: \"success\" }),\n\t/**\n\t * Dispatches an error status toast notification.\n\t * @param message Main notification content or React node.\n\t * @param options Notification customization options.\n\t * @returns The unique toast identifier (string or number).\n\t */\n\terror: (message: ReactNode, options?: ToastOptions) =>\n\t\tshow(message, { ...options, variant: \"error\" }),\n\t/**\n\t * Dispatches a warning status toast notification.\n\t * @param message Main notification content or React node.\n\t * @param options Notification customization options.\n\t * @returns The unique toast identifier (string or number).\n\t */\n\twarning: (message: ReactNode, options?: ToastOptions) =>\n\t\tshow(message, { ...options, variant: \"warning\" }),\n\t/**\n\t * Dispatches an info status toast notification.\n\t * @param message Main notification content or React node.\n\t * @param options Notification customization options.\n\t * @returns The unique toast identifier (string or number).\n\t */\n\tinfo: (message: ReactNode, options?: ToastOptions) =>\n\t\tshow(message, { ...options, variant: \"info\" }),\n\t/**\n\t * Dismisses an active toast by its identifier, or dismisses all toasts when called without arguments. Note: Calling without arguments returns `undefined` at runtime; calling with `id` returns the dismissed `id`.\n\t * @param id Optional identifier of the toast to dismiss. When omitted, all toasts are dismissed.\n\t * @returns The dismissed toast identifier if provided, or undefined if dismissed without arguments.\n\t */\n\tdismiss: sonnerToast.dismiss,\n});\n\ntype SonnerComponentProps = ComponentProps<typeof Sonner>;\n\nexport type ToasterToastOptions = NonNullable<SonnerComponentProps[\"toastOptions\"]>;\nexport type ToasterIcons = NonNullable<SonnerComponentProps[\"icons\"]>;\nexport type ToasterSwipeDirection = NonNullable<SonnerComponentProps[\"swipeDirections\"]>[number];\n\nexport interface ToasterProps\n\textends Omit<\n\t\tSonnerComponentProps,\n\t\t| \"id\"\n\t\t| \"invert\"\n\t\t| \"theme\"\n\t\t| \"position\"\n\t\t| \"hotkey\"\n\t\t| \"richColors\"\n\t\t| \"expand\"\n\t\t| \"duration\"\n\t\t| \"gap\"\n\t\t| \"visibleToasts\"\n\t\t| \"closeButton\"\n\t\t| \"toastOptions\"\n\t\t| \"className\"\n\t\t| \"style\"\n\t\t| \"offset\"\n\t\t| \"mobileOffset\"\n\t\t| \"dir\"\n\t\t| \"swipeDirections\"\n\t\t| \"icons\"\n\t\t| \"containerAriaLabel\"\n\t\t| \"customAriaLabel\"\n\t> {\n\t/**\n\t * Unique identifier for this toaster instance. When set, only toasts dispatched with a matching toasterId will display here. Basalt standard toast options do not expose toasterId, so global un-identified mounting is recommended.\n\t */\n\tid?: SonnerComponentProps[\"id\"];\n\t/**\n\t * Invert toast foreground and background colors.\n\t * @default false\n\t */\n\tinvert?: SonnerComponentProps[\"invert\"];\n\t/**\n\t * Color scheme theme override for toast notifications.\n\t * @default \"light\"\n\t */\n\ttheme?: SonnerComponentProps[\"theme\"];\n\t/**\n\t * Screen positioning for the toast viewport stack.\n\t * @default \"bottom-right\"\n\t */\n\tposition?: SonnerComponentProps[\"position\"];\n\t/**\n\t * Keyboard hotkey combination to expand and focus the toast viewport.\n\t * @default [\"altKey\", \"KeyT\"]\n\t */\n\thotkey?: SonnerComponentProps[\"hotkey\"];\n\t/**\n\t * Whether rich semantic colors should be applied to default notification styles.\n\t * @default false\n\t */\n\trichColors?: SonnerComponentProps[\"richColors\"];\n\t/**\n\t * Whether toasts should be expanded by default rather than collapsed into a stacked pile.\n\t * @default false\n\t */\n\texpand?: SonnerComponentProps[\"expand\"];\n\t/**\n\t * Default visibility duration in milliseconds before auto-dismissal. Resolved as `toast.duration || (Toaster.toastOptions.duration ?? Toaster.duration) || 4000`. Passing Infinity prevents auto-closing. When `toastOptions.duration === 0`, it is treated as falsy and bypasses `Toaster.duration`, falling back to 4000.\n\t * @default 4000\n\t */\n\tduration?: SonnerComponentProps[\"duration\"];\n\t/**\n\t * Pixel gap between stacked toasts.\n\t * @default 14\n\t */\n\tgap?: SonnerComponentProps[\"gap\"];\n\t/**\n\t * Maximum number of toasts visible simultaneously in the stack.\n\t * @default 3\n\t */\n\tvisibleToasts?: SonnerComponentProps[\"visibleToasts\"];\n\t/**\n\t * Whether a close button is displayed on each toast notification. Basalt enables this by default (`closeButton = true`), and Basalt single-toast calls also default to `close: true`, overriding `Toaster.closeButton = false`. To hide the close button on an individual toast, pass `close: false` in the dispatch options.\n\t * @default true\n\t */\n\tcloseButton?: SonnerComponentProps[\"closeButton\"];\n\t/**\n\t * Default options and custom class names applied to all rendered toasts. Passing a custom `toastOptions` object will override Basalt default styling rather than deep-merging.\n\t */\n\ttoastOptions?: ToasterToastOptions;\n\t/**\n\t * Additional CSS class name applied to each rendered ordered list (`ol`) toast viewport.\n\t */\n\tclassName?: SonnerComponentProps[\"className\"];\n\t/**\n\t * Inline style properties applied to each rendered ordered list (`ol`) toast viewport.\n\t */\n\tstyle?: SonnerComponentProps[\"style\"];\n\t/**\n\t * Viewport offset margin from screen edges on desktop screens.\n\t * @default \"24px\"\n\t */\n\toffset?: SonnerComponentProps[\"offset\"];\n\t/**\n\t * Viewport offset margin from screen edges on mobile devices.\n\t * @default \"16px\"\n\t */\n\tmobileOffset?: SonnerComponentProps[\"mobileOffset\"];\n\t/**\n\t * Layout direction of the notification viewport ('ltr', 'rtl', or document direction when unspecified).\n\t * @default document direction\n\t */\n\tdir?: SonnerComponentProps[\"dir\"];\n\t/**\n\t * Allowed swipe directions to dismiss toasts. Defaults based on position orientation (e.g. ['bottom', 'right'] for bottom-right).\n\t */\n\tswipeDirections?: ToasterSwipeDirection[];\n\t/**\n\t * Custom icon overrides for toast status variants. Basalt preconfigures Lucide icons; passing an `icons` object replaces defaults rather than deep-merging. Basalt status variant dispatches (`toast.success`, `error`, `warning`, `info`) supply default status icons directly, which take precedence over `Toaster.icons`; custom individual toast icons should be passed via `options.icon`.\n\t */\n\ticons?: ToasterIcons;\n\t/**\n\t * Accessible label for the notification region container.\n\t * @default \"Notifications\"\n\t */\n\tcontainerAriaLabel?: SonnerComponentProps[\"containerAriaLabel\"];\n\t/**\n\t * Custom accessible label overriding both containerAriaLabel and hotkey text on the section wrapper.\n\t */\n\tcustomAriaLabel?: SonnerComponentProps[\"customAriaLabel\"];\n}\n\nexport function Toaster({ closeButton = true, ...props }: ToasterProps) {\n\treturn (\n\t\t<Sonner\n\t\t\tcloseButton={closeButton}\n\t\t\ticons={{\n\t\t\t\tsuccess: <Check className=\"size-basalt-icon-lg\" />,\n\t\t\t\terror: <CircleAlert className=\"size-basalt-icon-lg\" />,\n\t\t\t\twarning: <TriangleAlert className=\"size-basalt-icon-lg\" />,\n\t\t\t\tinfo: <Info className=\"size-basalt-icon-lg\" />,\n\t\t\t\tclose: <X className=\"size-basalt-icon\" />,\n\t\t\t}}\n\t\t\ttoastOptions={{\n\t\t\t\tunstyled: true,\n\t\t\t\tclassNames: {\n\t\t\t\t\ttoast:\n\t\t\t\t\t\t\"basalt-ui basalt-toast flex w-full items-center gap-basalt-space-lg rounded-basalt-md bg-basalt-popover px-basalt-card-lg py-basalt-card text-basalt-base leading-[var(--basalt-leading-banner)] text-basalt-foreground shadow-lg [&_[data-content]]:min-w-0 [&_[data-content]]:flex-1\",\n\t\t\t\t\ttitle: \"font-medium\",\n\t\t\t\t\tdescription:\n\t\t\t\t\t\t\"text-basalt-sm leading-[var(--basalt-line-relaxed)] text-basalt-muted-foreground\",\n\t\t\t\t\tcloseButton:\n\t\t\t\t\t\t\"basalt-action basalt-action-icon order-last inline-flex shrink-0 cursor-pointer items-center justify-center rounded-basalt-sm text-basalt-muted-foreground hover:bg-basalt-hover hover:text-basalt-foreground\",\n\t\t\t\t\tactionButton:\n\t\t\t\t\t\t\"basalt-action shrink-0 cursor-pointer rounded-basalt-sm bg-basalt-primary text-basalt-primary-foreground hover:bg-basalt-primary-hover\",\n\t\t\t\t\tcancelButton:\n\t\t\t\t\t\t\"basalt-action shrink-0 cursor-pointer rounded-basalt-sm bg-basalt-control hover:bg-basalt-hover\",\n\t\t\t\t\ticon: \"flex size-basalt-icon-lg shrink-0 items-center justify-center\",\n\t\t\t\t\tsuccess: VARIANT_CLASS.success,\n\t\t\t\t\terror: VARIANT_CLASS.error,\n\t\t\t\t\twarning: VARIANT_CLASS.warning,\n\t\t\t\t\tinfo: VARIANT_CLASS.info,\n\t\t\t\t},\n\t\t\t}}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport const Toast = Toaster;\n"],"mappings":";;;;;AAiDA,IAAMI,IAA8C;CACnD,SAAS;CACT,SACC;CACD,OACC;CACD,SACC;CACD,MAAM;AACP,GAEMC,IAAgD;CACrD,SAAS;CACT,SAAS,kBAACC,GAAD,EAAO,WAAU,sBAAuB,CAAA;CACjD,OAAO,kBAACC,GAAD,EAAa,WAAU,sBAAuB,CAAA;CACrD,SAAS,kBAACC,GAAD,EAAe,WAAU,sBAAuB,CAAA;CACzD,MAAM,kBAACC,GAAD,EAAM,WAAU,sBAAuB,CAAA;AAC9C;AAEA,SAASC,EAAY,GAAuB,GAA4B;CAOvE,OANIC,MAAS,KACL,OAEJA,KAGGN,EAAaO,MAAY,KAAA;AACjC;AAQA,SAASC,EAAK,GAAoB,IAA4B,CAAC,GAAG;CACjE,IAAM,EAAE,aAAU,WAAW,SAAM,WAAQ,IAAM,GAAGC,MAASC,GACvDC,IAAU;EACf,GAAGF;EACH,aAAaG;EACb,WAAWb,EAAcQ;EACzB,MAAMF,EAAYE,GAASD,CAAI;CAChC;CAaA,OAZIC,MAAY,YACRZ,EAAY,QAAQkB,GAASF,CAAO,IAExCJ,MAAY,UACRZ,EAAY,MAAMkB,GAASF,CAAO,IAEtCJ,MAAY,YACRZ,EAAY,QAAQkB,GAASF,CAAO,IAExCJ,MAAY,SACRZ,EAAY,KAAKkB,GAASF,CAAO,IAElChB,EAAYkB,GAASF,CAAO;AACpC;AAKA,IAAaG,IAAQ,OAAO,OAAON,GAAM;CAOxC,UAAU,GAAoB,MAC7BA,EAAKK,GAAS;EAAE,GAAGH;EAAS,SAAS;CAAU,CAAC;CAOjD,QAAQ,GAAoB,MAC3BF,EAAKK,GAAS;EAAE,GAAGH;EAAS,SAAS;CAAQ,CAAC;CAO/C,UAAU,GAAoB,MAC7BF,EAAKK,GAAS;EAAE,GAAGH;EAAS,SAAS;CAAU,CAAC;CAOjD,OAAO,GAAoB,MAC1BF,EAAKK,GAAS;EAAE,GAAGH;EAAS,SAAS;CAAO,CAAC;CAM9C,SAASf,EAAY;AACtB,CAAC;AAqID,SAAgBoB,EAAQ,EAAE,iBAAc,IAAM,GAAGC,KAAuB;CACvE,OACC,kBAACpB,GAAD;EACc;EACb,OAAO;GACN,SAAS,kBAACK,GAAD,EAAO,WAAU,sBAAuB,CAAA;GACjD,OAAO,kBAACC,GAAD,EAAa,WAAU,sBAAuB,CAAA;GACrD,SAAS,kBAACC,GAAD,EAAe,WAAU,sBAAuB,CAAA;GACzD,MAAM,kBAACC,GAAD,EAAM,WAAU,sBAAuB,CAAA;GAC7C,OAAO,kBAACa,GAAD,EAAG,WAAU,mBAAoB,CAAA;EACzC;EACA,cAAc;GACb,UAAU;GACV,YAAY;IACX,OACC;IACD,OAAO;IACP,aACC;IACD,aACC;IACD,cACC;IACD,cACC;IACD,MAAM;IACN,SAASlB,EAAc;IACvB,OAAOA,EAAc;IACrB,SAASA,EAAc;IACvB,MAAMA,EAAc;GACrB;EACD;EACA,GAAIiB;CACJ,CAAA;AAEH;AAEA,IAAaE,IAAQH"}
|
|
@@ -6,7 +6,7 @@ import { useSelectionIndicator as r } from "../utils/selection-indicator.js";
|
|
|
6
6
|
import * as i from "react";
|
|
7
7
|
import { jsx as a, jsxs as o } from "react/jsx-runtime";
|
|
8
8
|
import * as s from "@radix-ui/react-toggle-group";
|
|
9
|
-
|
|
9
|
+
// src/components/toggle-group.tsx
|
|
10
10
|
var c = i.createContext("single"), l = i.forwardRef(({ className: n, children: i, ...l }, u) => {
|
|
11
11
|
let d = l.type === "single", { ref: f, state: p, motionClassName: m } = r({
|
|
12
12
|
itemSelector: "[aria-checked=\"true\"]",
|
|
@@ -44,7 +44,6 @@ var u = i.forwardRef(({ className: t, ...r }, o) => {
|
|
|
44
44
|
});
|
|
45
45
|
});
|
|
46
46
|
u.displayName = s.Item.displayName;
|
|
47
|
-
//#endregion
|
|
48
47
|
export { l as ToggleGroup, u as ToggleGroupItem };
|
|
49
48
|
|
|
50
49
|
//# sourceMappingURL=toggle-group.js.map
|
|
@@ -6,7 +6,7 @@ import * as r from "react";
|
|
|
6
6
|
import { cva as i } from "class-variance-authority";
|
|
7
7
|
import { jsx as a } from "react/jsx-runtime";
|
|
8
8
|
import * as o from "@radix-ui/react-toggle";
|
|
9
|
-
|
|
9
|
+
// src/components/toggle.tsx
|
|
10
10
|
var s = i(`${t} basalt-choice relative inline-flex cursor-pointer items-center justify-center rounded-basalt-md font-medium transition-colors basalt-motion before:absolute before:-inset-basalt-border-width hover:bg-basalt-hover ${n}`, {
|
|
11
11
|
variants: {
|
|
12
12
|
variant: {
|
|
@@ -32,7 +32,6 @@ var s = i(`${t} basalt-choice relative inline-flex cursor-pointer items-center j
|
|
|
32
32
|
...i
|
|
33
33
|
}));
|
|
34
34
|
c.displayName = o.Root.displayName;
|
|
35
|
-
//#endregion
|
|
36
35
|
export { c as Toggle };
|
|
37
36
|
|
|
38
37
|
//# sourceMappingURL=toggle.js.map
|
|
@@ -9,7 +9,7 @@ import { CodeBlock as d } from "./code.js";
|
|
|
9
9
|
import { Loader as f } from "./loader.js";
|
|
10
10
|
import { Check as p, CircleAlert as m, FileText as h, Pencil as g, Sparkles as _, Terminal as v } from "lucide-react";
|
|
11
11
|
import { jsx as y, jsxs as b } from "react/jsx-runtime";
|
|
12
|
-
|
|
12
|
+
// src/components/tool-chips.tsx
|
|
13
13
|
var x = {
|
|
14
14
|
think: _,
|
|
15
15
|
read: h,
|
|
@@ -132,7 +132,6 @@ function S({ steps: h, diffs: g = [], title: _, defaultOpen: v = !0, className:
|
|
|
132
132
|
})]
|
|
133
133
|
});
|
|
134
134
|
}
|
|
135
|
-
//#endregion
|
|
136
135
|
export { S as ToolChips };
|
|
137
136
|
|
|
138
137
|
//# sourceMappingURL=tool-chips.js.map
|
|
@@ -5,7 +5,7 @@ import { Button as n } from "./button.js";
|
|
|
5
5
|
import { Input as r } from "./input.js";
|
|
6
6
|
import * as i from "react";
|
|
7
7
|
import { jsx as a } from "react/jsx-runtime";
|
|
8
|
-
|
|
8
|
+
// src/components/toolbar.tsx
|
|
9
9
|
var o = e("relative min-w-0 rounded-none border-0 bg-transparent shadow-none", "first:rounded-l-basalt-md last:rounded-r-basalt-md", "focus-within:z-2 focus:z-2 focus-visible:z-2");
|
|
10
10
|
function s(e) {
|
|
11
11
|
return [...e.querySelectorAll("button:not([disabled]), input:not([disabled])")].filter((t) => t.closest("[role=\"toolbar\"]") === e);
|
|
@@ -47,16 +47,16 @@ var l = i.forwardRef(({ className: t, onKeyDown: n, onFocus: r, ...o }, l) => {
|
|
|
47
47
|
});
|
|
48
48
|
});
|
|
49
49
|
l.displayName = "Toolbar";
|
|
50
|
-
var u = i.forwardRef(({ className:
|
|
51
|
-
let
|
|
50
|
+
var u = i.forwardRef(({ className: r, size: i, icon: s, children: c, ...l }, u) => {
|
|
51
|
+
let d = i ?? (s && c == null ? "icon" : "default");
|
|
52
52
|
return /* @__PURE__ */ a(n, {
|
|
53
|
-
ref:
|
|
54
|
-
icon:
|
|
55
|
-
className: e(o, "h-auto min-h-basalt-control shrink-0",
|
|
56
|
-
...
|
|
53
|
+
ref: u,
|
|
54
|
+
icon: s,
|
|
55
|
+
className: e(o, t, "h-auto min-h-basalt-control shrink-0", d === "icon" && "w-basalt-control", r),
|
|
56
|
+
...l,
|
|
57
57
|
variant: "ghost",
|
|
58
|
-
size:
|
|
59
|
-
children:
|
|
58
|
+
size: d,
|
|
59
|
+
children: c
|
|
60
60
|
});
|
|
61
61
|
});
|
|
62
62
|
u.displayName = "Toolbar.Button";
|
|
@@ -70,7 +70,6 @@ var f = Object.assign(l, {
|
|
|
70
70
|
Button: u,
|
|
71
71
|
Input: d
|
|
72
72
|
});
|
|
73
|
-
//#endregion
|
|
74
73
|
export { f as Toolbar, u as ToolbarButton, d as ToolbarInput };
|
|
75
74
|
|
|
76
75
|
//# sourceMappingURL=toolbar.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toolbar.js","names":["React","toolbarControlClass","cn","toolbarItems","root","node","setRovingTab","item","items","active","ToolbarRoot","props","innerRef","ref","event","target","onKeyDown","start","index","className","ToolbarButton","resolvedSize","size","icon","children","Button","
|
|
1
|
+
{"version":3,"file":"toolbar.js","names":["React","toolbarControlClass","cn","toolbarItems","root","node","setRovingTab","item","items","active","ToolbarRoot","props","innerRef","ref","event","target","onKeyDown","start","index","className","ToolbarButton","resolvedSize","size","icon","children","Button","FOCUS_INSET","ToolbarInput","Input","Toolbar"],"sources":["../../src/components/toolbar.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { Button, type ButtonProps } from \"./button\";\nimport { Input } from \"./input\";\nimport { FOCUS_INSET } from \"./overlay\";\n\nconst toolbarControlClass = cn(\n\t\"relative min-w-0 rounded-none border-0 bg-transparent shadow-none\",\n\t\"first:rounded-l-basalt-md last:rounded-r-basalt-md\",\n\t\"focus-within:z-2 focus:z-2 focus-visible:z-2\",\n);\n\nexport type ToolbarProps = Omit<React.HTMLAttributes<HTMLDivElement>, \"aria-label\"> & {\n\t/**\n\t * Accessible name for the toolbar.\n\t */\n\t\"aria-label\"?: string;\n};\n\nfunction toolbarItems(root: HTMLElement) {\n\treturn [\n\t\t...root.querySelectorAll<HTMLElement>(\"button:not([disabled]), input:not([disabled])\"),\n\t].filter((node) => node.closest('[role=\"toolbar\"]') === root);\n}\n\nfunction setRovingTab(items: HTMLElement[], active: HTMLElement) {\n\tfor (const item of items) {\n\t\titem.tabIndex = item === active ? 0 : -1;\n\t}\n}\n\nconst ToolbarRoot = React.forwardRef<HTMLDivElement, ToolbarProps>(\n\t({ className, onKeyDown, onFocus, ...props }, ref) => {\n\t\tconst innerRef = React.useRef<HTMLDivElement | null>(null);\n\t\tReact.useLayoutEffect(() => {\n\t\t\tconst root = innerRef.current;\n\t\t\tif (!root) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst items = toolbarItems(root);\n\t\t\tconst active =\n\t\t\t\titems.find((item) => item.tabIndex === 0 && !(item as HTMLButtonElement).disabled) ??\n\t\t\t\titems[0];\n\t\t\tif (active) {\n\t\t\t\tsetRovingTab(items, active);\n\t\t\t}\n\t\t});\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={(node) => {\n\t\t\t\t\tinnerRef.current = node;\n\t\t\t\t\tif (typeof ref === \"function\") {\n\t\t\t\t\t\tref(node);\n\t\t\t\t\t} else if (ref) {\n\t\t\t\t\t\tref.current = node;\n\t\t\t\t\t}\n\t\t\t\t}}\n\t\t\t\t{...props}\n\t\t\t\trole=\"toolbar\"\n\t\t\t\tonFocus={(event) => {\n\t\t\t\t\tonFocus?.(event);\n\t\t\t\t\tconst items = toolbarItems(event.currentTarget);\n\t\t\t\t\tconst target = event.target as HTMLElement;\n\t\t\t\t\tif (items.includes(target)) {\n\t\t\t\t\t\tsetRovingTab(items, target);\n\t\t\t\t\t}\n\t\t\t\t}}\n\t\t\t\tonKeyDown={(event) => {\n\t\t\t\t\tonKeyDown?.(event);\n\t\t\t\t\tif (event.defaultPrevented || (event.key !== \"ArrowRight\" && event.key !== \"ArrowLeft\")) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (\n\t\t\t\t\t\tevent.target instanceof HTMLInputElement ||\n\t\t\t\t\t\tevent.target instanceof HTMLTextAreaElement\n\t\t\t\t\t) {\n\t\t\t\t\t\tconst start = event.target.selectionStart ?? 0;\n\t\t\t\t\t\tconst end = event.target.selectionEnd ?? start;\n\t\t\t\t\t\tif (start !== end) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (event.key === \"ArrowLeft\" && start > 0) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (event.key === \"ArrowRight\" && start < event.target.value.length) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tconst items = toolbarItems(event.currentTarget);\n\t\t\t\t\tconst index = items.indexOf(event.target as HTMLElement);\n\t\t\t\t\tif (index < 0 || items.length === 0) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tconst next =\n\t\t\t\t\t\tevent.key === \"ArrowRight\"\n\t\t\t\t\t\t\t? (index + 1) % items.length\n\t\t\t\t\t\t\t: (index - 1 + items.length) % items.length;\n\t\t\t\t\tconst node = items[next];\n\t\t\t\t\tif (node) {\n\t\t\t\t\t\tsetRovingTab(items, node);\n\t\t\t\t\t\tnode.focus();\n\t\t\t\t\t}\n\t\t\t\t}}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"inline-flex w-fit items-stretch rounded-basalt-md bg-basalt-control shadow-xs ring-1 ring-basalt-border\",\n\t\t\t\t\t\"[&>*:not(:first-child)]:border-l [&>*:not(:first-child)]:border-basalt-border\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t/>\n\t\t);\n\t},\n);\nToolbarRoot.displayName = \"Toolbar\";\n\nexport type ToolbarButtonProps = Omit<ButtonProps, \"variant\" | \"disabled\" | \"asChild\"> & {\n\t/**\n\t * Disable the toolbar button.\n\t * @default false\n\t */\n\tdisabled?: boolean;\n};\n\nexport const ToolbarButton = React.forwardRef<HTMLButtonElement, ToolbarButtonProps>(\n\t({ className, size, icon, children, ...props }, ref) => {\n\t\tconst resolvedSize = size ?? (icon && children == null ? \"icon\" : \"default\");\n\t\treturn (\n\t\t\t<Button\n\t\t\t\tref={ref}\n\t\t\t\ticon={icon}\n\t\t\t\tclassName={cn(\n\t\t\t\t\ttoolbarControlClass,\n\t\t\t\t\tFOCUS_INSET,\n\t\t\t\t\t\"h-auto min-h-basalt-control shrink-0\",\n\t\t\t\t\tresolvedSize === \"icon\" && \"w-basalt-control\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t\tvariant=\"ghost\"\n\t\t\t\tsize={resolvedSize}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</Button>\n\t\t);\n\t},\n);\nToolbarButton.displayName = \"Toolbar.Button\";\n\nexport type ToolbarInputProps = Omit<React.ComponentPropsWithoutRef<typeof Input>, \"disabled\"> & {\n\t/**\n\t * Disable the toolbar input.\n\t * @default false\n\t */\n\tdisabled?: boolean;\n};\n\nexport const ToolbarInput = React.forwardRef<HTMLInputElement, ToolbarInputProps>(\n\t({ className, ...props }, ref) => (\n\t\t<Input\n\t\t\tref={ref}\n\t\t\tclassName={cn(toolbarControlClass, FOCUS_INSET, \"h-auto min-h-basalt-control\", className)}\n\t\t\t{...props}\n\t\t/>\n\t),\n);\nToolbarInput.displayName = \"Toolbar.Input\";\n\nexport const Toolbar = Object.assign(ToolbarRoot, {\n\tButton: ToolbarButton,\n\tInput: ToolbarInput,\n});\n"],"mappings":"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"}
|
|
@@ -5,7 +5,7 @@ import { OVERLAY_LAYER as n, OVERLAY_MOTION as r } from "./overlay.js";
|
|
|
5
5
|
import * as i from "react";
|
|
6
6
|
import { jsx as a } from "react/jsx-runtime";
|
|
7
7
|
import * as o from "@radix-ui/react-tooltip";
|
|
8
|
-
|
|
8
|
+
// src/components/tooltip.tsx
|
|
9
9
|
var s = o.Provider, c = o.Root, l = o.Trigger, u = i.forwardRef(({ className: i, sideOffset: s = 4, ...c }, l) => /* @__PURE__ */ a(o.Portal, {
|
|
10
10
|
forceMount: c.forceMount,
|
|
11
11
|
children: /* @__PURE__ */ a(o.Content, {
|
|
@@ -16,7 +16,6 @@ var s = o.Provider, c = o.Root, l = o.Trigger, u = i.forwardRef(({ className: i,
|
|
|
16
16
|
})
|
|
17
17
|
}));
|
|
18
18
|
u.displayName = o.Content.displayName;
|
|
19
|
-
//#endregion
|
|
20
19
|
export { c as Tooltip, u as TooltipContent, s as TooltipProvider, l as TooltipTrigger };
|
|
21
20
|
|
|
22
21
|
//# sourceMappingURL=tooltip.js.map
|
|
@@ -6,12 +6,12 @@ import { Input as i } from "./input.js";
|
|
|
6
6
|
import { useEffect as a, useId as o, useRef as s, useState as c } from "react";
|
|
7
7
|
import { jsx as l, jsxs as u } from "react/jsx-runtime";
|
|
8
8
|
import * as d from "@radix-ui/react-popover";
|
|
9
|
-
|
|
9
|
+
// src/components/typeahead-field.tsx
|
|
10
10
|
function f({ items: f, value: h, defaultValue: g = "", onValueChange: _, name: v, placeholder: y = "Select…", disabled: b = !1, loading: x = !1, size: S = "default", className: C, id: w, allowFreeform: T, "aria-label": E, "aria-describedby": ee, "aria-invalid": te, onBlur: ne, ...re }) {
|
|
11
11
|
let [D, O] = c(g), k = h ?? D, [A, j] = c(p(f, k)), [M, N] = c(h), [P, F] = c(!1), [I, L] = c(null), R = o(), z = s(null), ie = r(), B = s(!1), V = s(null);
|
|
12
12
|
h !== M && (N(h), h === void 0 ? M !== void 0 && (O(M), j(p(f, M))) : j(p(f, h)));
|
|
13
13
|
let H = p(f, k), [U, W] = c(H);
|
|
14
|
-
H !== U && (W(H),
|
|
14
|
+
H !== U && (W(H), P && A !== U || j(H));
|
|
15
15
|
let G = s({
|
|
16
16
|
defaultValue: g,
|
|
17
17
|
items: f,
|
|
@@ -67,11 +67,7 @@ function f({ items: f, value: h, defaultValue: g = "", onValueChange: _, name: v
|
|
|
67
67
|
}
|
|
68
68
|
function $(e, t = !0) {
|
|
69
69
|
let n = e.trim(), r = f.find((e) => !e.disabled && (e.label.toLowerCase() === n.toLowerCase() || e.value === n));
|
|
70
|
-
|
|
71
|
-
Q(r, t);
|
|
72
|
-
return;
|
|
73
|
-
}
|
|
74
|
-
Z(n, n, t);
|
|
70
|
+
r ? Q(r, t) : Z(n, n, t);
|
|
75
71
|
}
|
|
76
72
|
return a(() => {
|
|
77
73
|
if (!P) return;
|
|
@@ -128,13 +124,7 @@ function f({ items: f, value: h, defaultValue: g = "", onValueChange: _, name: v
|
|
|
128
124
|
j(e.target.value), F(!0), L(null);
|
|
129
125
|
},
|
|
130
126
|
onFocus: () => {
|
|
131
|
-
|
|
132
|
-
if (B.current) {
|
|
133
|
-
B.current = !1;
|
|
134
|
-
return;
|
|
135
|
-
}
|
|
136
|
-
L(null), F(!0);
|
|
137
|
-
}
|
|
127
|
+
X || (B.current ? B.current = !1 : (L(null), F(!0)));
|
|
138
128
|
},
|
|
139
129
|
onClick: () => {
|
|
140
130
|
X || (P || L(null), F(!0));
|
|
@@ -147,17 +137,13 @@ function f({ items: f, value: h, defaultValue: g = "", onValueChange: _, name: v
|
|
|
147
137
|
return;
|
|
148
138
|
}
|
|
149
139
|
L((e) => e === null ? 0 : (e + 1) % K.length);
|
|
150
|
-
|
|
151
|
-
}
|
|
152
|
-
if (e.key === "ArrowUp") {
|
|
140
|
+
} else if (e.key === "ArrowUp") {
|
|
153
141
|
if (e.preventDefault(), F(!0), K.length === 0) {
|
|
154
142
|
L(null);
|
|
155
143
|
return;
|
|
156
144
|
}
|
|
157
145
|
L((e) => e === null ? K.length - 1 : (e - 1 + K.length) % K.length);
|
|
158
|
-
|
|
159
|
-
}
|
|
160
|
-
if (e.key === "Enter") {
|
|
146
|
+
} else if (e.key === "Enter") {
|
|
161
147
|
if (P && J) {
|
|
162
148
|
e.preventDefault(), Q(J);
|
|
163
149
|
return;
|
|
@@ -235,7 +221,6 @@ function m(e, t, n) {
|
|
|
235
221
|
let r = t.trim().toLowerCase();
|
|
236
222
|
return r === "" ? n ? e : [] : e.filter((e) => e.label.toLowerCase().includes(r));
|
|
237
223
|
}
|
|
238
|
-
//#endregion
|
|
239
224
|
export { f as TypeaheadField };
|
|
240
225
|
|
|
241
226
|
//# sourceMappingURL=typeahead-field.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typeahead-field.js","names":["PopoverPrimitive","TypeaheadField","ariaLabel","ariaDescribedBy","ariaInvalid","rest","uncontrolled","setUncontrolled","useState","defaultValue","selected","value","query","setQuery","displayOf","items","prevValue","setPrevValue","open","setOpen","active","setActive","listId","useId","inputRef","useRef","highlightRef","useHoverHighlight","skipFocusOpen","lastPointerPos","selectedDisplay","prevDisplay","setPrevDisplay","latestConfigRef","useEffect","form","disposed","timers","onReset","timer","event","cfg","filtered","filterItems","allowFreeform","activeIndex","activeItem","listOpen","busy","disabled","loading","optionElement","nextLen","current","commitValue","next","display","onValueChange","restoreFocus","commitItem","item","commitFreeform","trimmed","text","match","onKey","nextOpen","cn","className","related","listbox","name","Input","id","placeholder","evt","target","overlayPanelClass","index","overlayItemClass","clientX","clientY","needle","showAllWhenEmpty"],"sources":["../../src/components/typeahead-field.tsx"],"sourcesContent":["import * as PopoverPrimitive from \"@radix-ui/react-popover\";\nimport { type ComponentPropsWithoutRef, useEffect, useId, useRef, useState } from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { useHoverHighlight } from \"../utils/use-hover-highlight\";\nimport { Input, type InputSize } from \"./input\";\nimport { OVERLAY_GAP, overlayItemClass, overlayPanelClass } from \"./overlay\";\n\nexport type TypeaheadItem = {\n\tvalue: string;\n\tlabel: string;\n\tdisabled?: boolean;\n};\n\nexport function TypeaheadField({\n\titems,\n\tvalue,\n\tdefaultValue = \"\",\n\tonValueChange,\n\tname,\n\tplaceholder = \"Select…\",\n\tdisabled = false,\n\tloading = false,\n\tsize = \"default\",\n\tclassName,\n\tid,\n\tallowFreeform,\n\t\"aria-label\": ariaLabel,\n\t\"aria-describedby\": ariaDescribedBy,\n\t\"aria-invalid\": ariaInvalid,\n\tonBlur,\n\t...rest\n}: {\n\titems: TypeaheadItem[];\n\tvalue?: string;\n\tdefaultValue?: string;\n\tonValueChange?: (value: string) => void;\n\tname?: string;\n\tplaceholder?: string;\n\tdisabled?: boolean;\n\tloading?: boolean;\n\tsize?: InputSize;\n\tclassName?: string;\n\tid?: string;\n\tallowFreeform: boolean;\n\t\"aria-label\"?: string;\n\t\"aria-describedby\"?: string;\n\t\"aria-invalid\"?: boolean | \"true\" | \"false\" | \"grammar\" | \"spelling\";\n} & Omit<ComponentPropsWithoutRef<\"div\">, \"children\" | \"defaultValue\" | \"onChange\">) {\n\tconst [uncontrolled, setUncontrolled] = useState(defaultValue);\n\tconst selected = value ?? uncontrolled;\n\tconst [query, setQuery] = useState(displayOf(items, selected));\n\tconst [prevValue, setPrevValue] = useState(value);\n\tconst [open, setOpen] = useState(false);\n\tconst [active, setActive] = useState<number | null>(null);\n\tconst listId = useId();\n\tconst inputRef = useRef<HTMLInputElement>(null);\n\tconst highlightRef = useHoverHighlight();\n\tconst skipFocusOpen = useRef(false);\n\tconst lastPointerPos = useRef<{ x: number; y: number } | null>(null);\n\tif (value !== prevValue) {\n\t\tsetPrevValue(value);\n\t\tif (value !== undefined) {\n\t\t\tsetQuery(displayOf(items, value));\n\t\t} else if (prevValue !== undefined) {\n\t\t\tsetUncontrolled(prevValue);\n\t\t\tsetQuery(displayOf(items, prevValue));\n\t\t}\n\t}\n\tconst selectedDisplay = displayOf(items, selected);\n\tconst [prevDisplay, setPrevDisplay] = useState(selectedDisplay);\n\tif (selectedDisplay !== prevDisplay) {\n\t\tsetPrevDisplay(selectedDisplay);\n\t\tif (!open || query === prevDisplay) {\n\t\t\tsetQuery(selectedDisplay);\n\t\t}\n\t}\n\tconst latestConfigRef = useRef({\n\t\tdefaultValue,\n\t\titems,\n\t\tvalue,\n\t});\n\tuseEffect(() => {\n\t\tlatestConfigRef.current = {\n\t\t\tdefaultValue,\n\t\t\titems,\n\t\t\tvalue,\n\t\t};\n\t});\n\n\tuseEffect(() => {\n\t\tconst node = inputRef.current;\n\t\tconst form = node?.form;\n\t\tif (!form) {\n\t\t\treturn;\n\t\t}\n\t\tlet disposed = false;\n\t\tconst timers = new Set<ReturnType<typeof setTimeout>>();\n\t\tconst onReset = (event: Event) => {\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\ttimers.delete(timer);\n\t\t\t\tif (disposed || event.defaultPrevented) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst cfg = latestConfigRef.current;\n\t\t\t\tif (cfg.value === undefined) {\n\t\t\t\t\tsetUncontrolled(cfg.defaultValue);\n\t\t\t\t\tsetQuery(displayOf(cfg.items, cfg.defaultValue));\n\t\t\t\t} else {\n\t\t\t\t\tsetQuery(displayOf(cfg.items, cfg.value));\n\t\t\t\t}\n\t\t\t\tsetOpen(false);\n\t\t\t\tsetActive(null);\n\t\t\t}, 0);\n\t\t\ttimers.add(timer);\n\t\t};\n\t\tform.addEventListener(\"reset\", onReset);\n\t\treturn () => {\n\t\t\tdisposed = true;\n\t\t\tfor (const timer of timers) {\n\t\t\t\tclearTimeout(timer);\n\t\t\t}\n\t\t\ttimers.clear();\n\t\t\tform.removeEventListener(\"reset\", onReset);\n\t\t};\n\t}, []);\n\tconst filtered = filterItems(items, query, !allowFreeform);\n\tconst activeIndex =\n\t\tactive === null || filtered.length === 0 ? null : Math.min(active, filtered.length - 1);\n\tconst activeItem = activeIndex === null ? undefined : filtered[activeIndex];\n\tconst listOpen = open && filtered.length > 0;\n\tconst busy = disabled || loading;\n\n\tuseEffect(() => {\n\t\tif (!listOpen || activeIndex === null) {\n\t\t\treturn;\n\t\t}\n\t\tconst optionElement = document.getElementById(`${listId}-opt-${activeIndex}`);\n\t\tif (typeof optionElement?.scrollIntoView === \"function\") {\n\t\t\toptionElement.scrollIntoView({ block: \"nearest\" });\n\t\t}\n\t}, [activeIndex, listId, listOpen]);\n\n\tuseEffect(() => {\n\t\tif (!open) {\n\t\t\treturn;\n\t\t}\n\t\tconst nextLen = filterItems(items, query, !allowFreeform).length;\n\t\tsetActive((current) => {\n\t\t\tif (current === null || nextLen === 0) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn Math.min(current, nextLen - 1);\n\t\t});\n\t}, [allowFreeform, items, open, query]);\n\n\tfunction commitValue(next: string, display: string, restoreFocus = true) {\n\t\tif (value === undefined) {\n\t\t\tsetUncontrolled(next);\n\t\t\tsetQuery(display);\n\t\t} else {\n\t\t\tsetQuery(displayOf(items, value));\n\t\t}\n\t\tsetOpen(false);\n\t\tsetActive(null);\n\t\tonValueChange?.(next);\n\t\tif (restoreFocus && inputRef.current && document.activeElement !== inputRef.current) {\n\t\t\tskipFocusOpen.current = true;\n\t\t\tinputRef.current.focus();\n\t\t}\n\t}\n\n\tfunction commitItem(item: TypeaheadItem, restoreFocus = true) {\n\t\tif (item.disabled) {\n\t\t\treturn;\n\t\t}\n\t\tcommitValue(item.value, item.label, restoreFocus);\n\t}\n\n\tfunction commitFreeform(text: string, restoreFocus = true) {\n\t\tconst trimmed = text.trim();\n\t\tconst match = items.find(\n\t\t\t(item) =>\n\t\t\t\t!item.disabled &&\n\t\t\t\t(item.label.toLowerCase() === trimmed.toLowerCase() || item.value === trimmed),\n\t\t);\n\t\tif (match) {\n\t\t\tcommitItem(match, restoreFocus);\n\t\t\treturn;\n\t\t}\n\t\tcommitValue(trimmed, trimmed, restoreFocus);\n\t}\n\n\tuseEffect(() => {\n\t\tif (!open) {\n\t\t\treturn;\n\t\t}\n\t\tconst onKey = (event: KeyboardEvent) => {\n\t\t\tif (event.key !== \"Escape\" || event.isComposing) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t\tevent.stopImmediatePropagation();\n\t\t\tsetOpen(false);\n\t\t\tsetQuery(displayOf(items, selected));\n\t\t\tsetActive(null);\n\t\t};\n\t\twindow.addEventListener(\"keydown\", onKey, true);\n\t\tdocument.addEventListener(\"keydown\", onKey, true);\n\t\treturn () => {\n\t\t\twindow.removeEventListener(\"keydown\", onKey, true);\n\t\t\tdocument.removeEventListener(\"keydown\", onKey, true);\n\t\t};\n\t}, [items, open, selected]);\n\n\treturn (\n\t\t<PopoverPrimitive.Root\n\t\t\topen={listOpen}\n\t\t\tonOpenChange={(nextOpen) => {\n\t\t\t\tif (!nextOpen) {\n\t\t\t\t\tsetOpen(false);\n\t\t\t\t\tsetActive(null);\n\t\t\t\t\tif (!allowFreeform) {\n\t\t\t\t\t\tsetQuery(displayOf(items, selected));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}}\n\t\t>\n\t\t\t<div\n\t\t\t\t{...rest}\n\t\t\t\tclassName={cn(\"relative w-full\", className)}\n\t\t\t\tonBlur={(event) => {\n\t\t\t\t\tonBlur?.(event);\n\t\t\t\t\tconst related = event.relatedTarget as Node | null;\n\t\t\t\t\tconst listbox = document.getElementById(listId);\n\t\t\t\t\tif (!event.currentTarget.contains(related) && !listbox?.contains(related)) {\n\t\t\t\t\t\tif (allowFreeform) {\n\t\t\t\t\t\t\tif (query.trim() !== displayOf(items, selected)) {\n\t\t\t\t\t\t\t\tcommitFreeform(query, false);\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsetQuery(displayOf(items, selected));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsetOpen(false);\n\t\t\t\t\t\tsetActive(null);\n\t\t\t\t\t}\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{name ? <input type=\"hidden\" name={name} value={selected} disabled={busy} /> : null}\n\t\t\t\t<PopoverPrimitive.Anchor asChild>\n\t\t\t\t\t<Input\n\t\t\t\t\t\tref={inputRef}\n\t\t\t\t\t\tid={id}\n\t\t\t\t\t\tvalue={query}\n\t\t\t\t\t\tdisabled={busy}\n\t\t\t\t\t\tsize={size}\n\t\t\t\t\t\taria-busy={loading || undefined}\n\t\t\t\t\t\taria-invalid={ariaInvalid}\n\t\t\t\t\t\taria-describedby={ariaDescribedBy}\n\t\t\t\t\t\tonChange={(event) => {\n\t\t\t\t\t\t\tsetQuery(event.target.value);\n\t\t\t\t\t\t\tsetOpen(true);\n\t\t\t\t\t\t\tsetActive(null);\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonFocus={() => {\n\t\t\t\t\t\t\tif (busy) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (skipFocusOpen.current) {\n\t\t\t\t\t\t\t\tskipFocusOpen.current = false;\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tsetActive(null);\n\t\t\t\t\t\t\tsetOpen(true);\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\tif (busy) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (!open) {\n\t\t\t\t\t\t\t\tsetActive(null);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tsetOpen(true);\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonKeyDown={(event) => {\n\t\t\t\t\t\t\tif (event.nativeEvent.isComposing || event.key === \"Process\") {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (event.key === \"ArrowDown\") {\n\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\tsetOpen(true);\n\t\t\t\t\t\t\t\tif (filtered.length === 0) {\n\t\t\t\t\t\t\t\t\tsetActive(null);\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tsetActive((current) => (current === null ? 0 : (current + 1) % filtered.length));\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (event.key === \"ArrowUp\") {\n\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\tsetOpen(true);\n\t\t\t\t\t\t\t\tif (filtered.length === 0) {\n\t\t\t\t\t\t\t\t\tsetActive(null);\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tsetActive((current) =>\n\t\t\t\t\t\t\t\t\tcurrent === null\n\t\t\t\t\t\t\t\t\t\t? filtered.length - 1\n\t\t\t\t\t\t\t\t\t\t: (current - 1 + filtered.length) % filtered.length,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (event.key === \"Enter\") {\n\t\t\t\t\t\t\t\tif (open && activeItem) {\n\t\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\t\tcommitItem(activeItem);\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (allowFreeform && query.trim() !== displayOf(items, selected)) {\n\t\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\t\tcommitFreeform(query);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\t\trole=\"combobox\"\n\t\t\t\t\t\taria-label={ariaLabel ?? (id ? undefined : placeholder)}\n\t\t\t\t\t\taria-expanded={listOpen}\n\t\t\t\t\t\taria-autocomplete=\"list\"\n\t\t\t\t\t\taria-controls={listOpen ? listId : undefined}\n\t\t\t\t\t\taria-activedescendant={\n\t\t\t\t\t\t\tlistOpen && activeItem && activeIndex !== null\n\t\t\t\t\t\t\t\t? `${listId}-opt-${activeIndex}`\n\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t</PopoverPrimitive.Anchor>\n\t\t\t\t<PopoverPrimitive.Portal>\n\t\t\t\t\t<PopoverPrimitive.Content\n\t\t\t\t\t\tref={highlightRef}\n\t\t\t\t\t\tside=\"bottom\"\n\t\t\t\t\t\tsideOffset={OVERLAY_GAP}\n\t\t\t\t\t\talign=\"start\"\n\t\t\t\t\t\tavoidCollisions\n\t\t\t\t\t\tcollisionPadding={8}\n\t\t\t\t\t\tonPointerMove={(event) => {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tlastPointerPos.current &&\n\t\t\t\t\t\t\t\tlastPointerPos.current.x === event.clientX &&\n\t\t\t\t\t\t\t\tlastPointerPos.current.y === event.clientY\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tlastPointerPos.current = { x: event.clientX, y: event.clientY };\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonEscapeKeyDown={(e) => {\n\t\t\t\t\t\t\tconst evt = e as unknown as {\n\t\t\t\t\t\t\t\tisComposing?: boolean;\n\t\t\t\t\t\t\t\tnativeEvent?: { isComposing?: boolean };\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tif (evt.isComposing || evt.nativeEvent?.isComposing) {\n\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonOpenAutoFocus={(e) => e.preventDefault()}\n\t\t\t\t\t\tonCloseAutoFocus={(e) => e.preventDefault()}\n\t\t\t\t\t\tonInteractOutside={(e) => {\n\t\t\t\t\t\t\tconst target = e.target as Node | null;\n\t\t\t\t\t\t\tif (inputRef.current?.contains(target)) {\n\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tid={listId}\n\t\t\t\t\t\trole=\"listbox\"\n\t\t\t\t\t\tclassName={overlayPanelClass(\n\t\t\t\t\t\t\t\"basalt-hover-list w-[var(--radix-popover-trigger-width)] max-h-[var(--radix-popover-content-available-height)] overflow-y-auto\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{filtered.map((item, index) => (\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tkey={`${listId}-opt-${index}`}\n\t\t\t\t\t\t\t\tid={`${listId}-opt-${index}`}\n\t\t\t\t\t\t\t\trole=\"option\"\n\t\t\t\t\t\t\t\tdata-basalt-hover-item=\"\"\n\t\t\t\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\t\t\t\tdisabled={item.disabled}\n\t\t\t\t\t\t\t\taria-disabled={item.disabled || undefined}\n\t\t\t\t\t\t\t\taria-selected={index === activeIndex}\n\t\t\t\t\t\t\t\tclassName={cn(overlayItemClass(), item.disabled && \"opacity-50\")}\n\t\t\t\t\t\t\t\tonPointerMove={(event) => {\n\t\t\t\t\t\t\t\t\tif (item.disabled) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tconst { clientX, clientY } = event;\n\t\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t\tlastPointerPos.current &&\n\t\t\t\t\t\t\t\t\t\tlastPointerPos.current.x === clientX &&\n\t\t\t\t\t\t\t\t\t\tlastPointerPos.current.y === clientY\n\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tlastPointerPos.current = { x: clientX, y: clientY };\n\t\t\t\t\t\t\t\t\tsetActive(index);\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tonMouseDown={(event) => event.preventDefault()}\n\t\t\t\t\t\t\t\tonClick={() => commitItem(item)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{item.label}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</PopoverPrimitive.Content>\n\t\t\t\t</PopoverPrimitive.Portal>\n\t\t\t</div>\n\t\t</PopoverPrimitive.Root>\n\t);\n}\n\nfunction displayOf(items: TypeaheadItem[], value: string) {\n\treturn items.find((item) => item.value === value)?.label ?? value;\n}\n\nfunction filterItems(items: TypeaheadItem[], query: string, showAllWhenEmpty: boolean) {\n\tconst needle = query.trim().toLowerCase();\n\tif (needle === \"\") {\n\t\treturn showAllWhenEmpty ? items : [];\n\t}\n\treturn items.filter((item) => item.label.toLowerCase().includes(needle));\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"typeahead-field.js","names":["PopoverPrimitive","TypeaheadField","ariaLabel","ariaDescribedBy","ariaInvalid","rest","uncontrolled","setUncontrolled","useState","defaultValue","selected","value","query","setQuery","displayOf","items","prevValue","setPrevValue","open","setOpen","active","setActive","listId","useId","inputRef","useRef","highlightRef","useHoverHighlight","skipFocusOpen","lastPointerPos","selectedDisplay","prevDisplay","setPrevDisplay","latestConfigRef","useEffect","form","disposed","timers","onReset","timer","event","cfg","filtered","filterItems","allowFreeform","activeIndex","activeItem","listOpen","busy","disabled","loading","optionElement","nextLen","current","commitValue","next","display","onValueChange","restoreFocus","commitItem","item","commitFreeform","trimmed","text","match","onKey","nextOpen","cn","className","related","listbox","name","Input","id","placeholder","evt","target","overlayPanelClass","index","overlayItemClass","clientX","clientY","needle","showAllWhenEmpty"],"sources":["../../src/components/typeahead-field.tsx"],"sourcesContent":["import * as PopoverPrimitive from \"@radix-ui/react-popover\";\nimport { type ComponentPropsWithoutRef, useEffect, useId, useRef, useState } from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { useHoverHighlight } from \"../utils/use-hover-highlight\";\nimport { Input, type InputSize } from \"./input\";\nimport { OVERLAY_GAP, overlayItemClass, overlayPanelClass } from \"./overlay\";\n\nexport type TypeaheadItem = {\n\tvalue: string;\n\tlabel: string;\n\tdisabled?: boolean;\n};\n\nexport function TypeaheadField({\n\titems,\n\tvalue,\n\tdefaultValue = \"\",\n\tonValueChange,\n\tname,\n\tplaceholder = \"Select…\",\n\tdisabled = false,\n\tloading = false,\n\tsize = \"default\",\n\tclassName,\n\tid,\n\tallowFreeform,\n\t\"aria-label\": ariaLabel,\n\t\"aria-describedby\": ariaDescribedBy,\n\t\"aria-invalid\": ariaInvalid,\n\tonBlur,\n\t...rest\n}: {\n\titems: TypeaheadItem[];\n\tvalue?: string;\n\tdefaultValue?: string;\n\tonValueChange?: (value: string) => void;\n\tname?: string;\n\tplaceholder?: string;\n\tdisabled?: boolean;\n\tloading?: boolean;\n\tsize?: InputSize;\n\tclassName?: string;\n\tid?: string;\n\tallowFreeform: boolean;\n\t\"aria-label\"?: string;\n\t\"aria-describedby\"?: string;\n\t\"aria-invalid\"?: boolean | \"true\" | \"false\" | \"grammar\" | \"spelling\";\n} & Omit<ComponentPropsWithoutRef<\"div\">, \"children\" | \"defaultValue\" | \"onChange\">) {\n\tconst [uncontrolled, setUncontrolled] = useState(defaultValue);\n\tconst selected = value ?? uncontrolled;\n\tconst [query, setQuery] = useState(displayOf(items, selected));\n\tconst [prevValue, setPrevValue] = useState(value);\n\tconst [open, setOpen] = useState(false);\n\tconst [active, setActive] = useState<number | null>(null);\n\tconst listId = useId();\n\tconst inputRef = useRef<HTMLInputElement>(null);\n\tconst highlightRef = useHoverHighlight();\n\tconst skipFocusOpen = useRef(false);\n\tconst lastPointerPos = useRef<{ x: number; y: number } | null>(null);\n\tif (value !== prevValue) {\n\t\tsetPrevValue(value);\n\t\tif (value !== undefined) {\n\t\t\tsetQuery(displayOf(items, value));\n\t\t} else if (prevValue !== undefined) {\n\t\t\tsetUncontrolled(prevValue);\n\t\t\tsetQuery(displayOf(items, prevValue));\n\t\t}\n\t}\n\tconst selectedDisplay = displayOf(items, selected);\n\tconst [prevDisplay, setPrevDisplay] = useState(selectedDisplay);\n\tif (selectedDisplay !== prevDisplay) {\n\t\tsetPrevDisplay(selectedDisplay);\n\t\tif (!open || query === prevDisplay) {\n\t\t\tsetQuery(selectedDisplay);\n\t\t}\n\t}\n\tconst latestConfigRef = useRef({\n\t\tdefaultValue,\n\t\titems,\n\t\tvalue,\n\t});\n\tuseEffect(() => {\n\t\tlatestConfigRef.current = {\n\t\t\tdefaultValue,\n\t\t\titems,\n\t\t\tvalue,\n\t\t};\n\t});\n\n\tuseEffect(() => {\n\t\tconst node = inputRef.current;\n\t\tconst form = node?.form;\n\t\tif (!form) {\n\t\t\treturn;\n\t\t}\n\t\tlet disposed = false;\n\t\tconst timers = new Set<ReturnType<typeof setTimeout>>();\n\t\tconst onReset = (event: Event) => {\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\ttimers.delete(timer);\n\t\t\t\tif (disposed || event.defaultPrevented) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst cfg = latestConfigRef.current;\n\t\t\t\tif (cfg.value === undefined) {\n\t\t\t\t\tsetUncontrolled(cfg.defaultValue);\n\t\t\t\t\tsetQuery(displayOf(cfg.items, cfg.defaultValue));\n\t\t\t\t} else {\n\t\t\t\t\tsetQuery(displayOf(cfg.items, cfg.value));\n\t\t\t\t}\n\t\t\t\tsetOpen(false);\n\t\t\t\tsetActive(null);\n\t\t\t}, 0);\n\t\t\ttimers.add(timer);\n\t\t};\n\t\tform.addEventListener(\"reset\", onReset);\n\t\treturn () => {\n\t\t\tdisposed = true;\n\t\t\tfor (const timer of timers) {\n\t\t\t\tclearTimeout(timer);\n\t\t\t}\n\t\t\ttimers.clear();\n\t\t\tform.removeEventListener(\"reset\", onReset);\n\t\t};\n\t}, []);\n\tconst filtered = filterItems(items, query, !allowFreeform);\n\tconst activeIndex =\n\t\tactive === null || filtered.length === 0 ? null : Math.min(active, filtered.length - 1);\n\tconst activeItem = activeIndex === null ? undefined : filtered[activeIndex];\n\tconst listOpen = open && filtered.length > 0;\n\tconst busy = disabled || loading;\n\n\tuseEffect(() => {\n\t\tif (!listOpen || activeIndex === null) {\n\t\t\treturn;\n\t\t}\n\t\tconst optionElement = document.getElementById(`${listId}-opt-${activeIndex}`);\n\t\tif (typeof optionElement?.scrollIntoView === \"function\") {\n\t\t\toptionElement.scrollIntoView({ block: \"nearest\" });\n\t\t}\n\t}, [activeIndex, listId, listOpen]);\n\n\tuseEffect(() => {\n\t\tif (!open) {\n\t\t\treturn;\n\t\t}\n\t\tconst nextLen = filterItems(items, query, !allowFreeform).length;\n\t\tsetActive((current) => {\n\t\t\tif (current === null || nextLen === 0) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn Math.min(current, nextLen - 1);\n\t\t});\n\t}, [allowFreeform, items, open, query]);\n\n\tfunction commitValue(next: string, display: string, restoreFocus = true) {\n\t\tif (value === undefined) {\n\t\t\tsetUncontrolled(next);\n\t\t\tsetQuery(display);\n\t\t} else {\n\t\t\tsetQuery(displayOf(items, value));\n\t\t}\n\t\tsetOpen(false);\n\t\tsetActive(null);\n\t\tonValueChange?.(next);\n\t\tif (restoreFocus && inputRef.current && document.activeElement !== inputRef.current) {\n\t\t\tskipFocusOpen.current = true;\n\t\t\tinputRef.current.focus();\n\t\t}\n\t}\n\n\tfunction commitItem(item: TypeaheadItem, restoreFocus = true) {\n\t\tif (item.disabled) {\n\t\t\treturn;\n\t\t}\n\t\tcommitValue(item.value, item.label, restoreFocus);\n\t}\n\n\tfunction commitFreeform(text: string, restoreFocus = true) {\n\t\tconst trimmed = text.trim();\n\t\tconst match = items.find(\n\t\t\t(item) =>\n\t\t\t\t!item.disabled &&\n\t\t\t\t(item.label.toLowerCase() === trimmed.toLowerCase() || item.value === trimmed),\n\t\t);\n\t\tif (match) {\n\t\t\tcommitItem(match, restoreFocus);\n\t\t\treturn;\n\t\t}\n\t\tcommitValue(trimmed, trimmed, restoreFocus);\n\t}\n\n\tuseEffect(() => {\n\t\tif (!open) {\n\t\t\treturn;\n\t\t}\n\t\tconst onKey = (event: KeyboardEvent) => {\n\t\t\tif (event.key !== \"Escape\" || event.isComposing) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t\tevent.stopImmediatePropagation();\n\t\t\tsetOpen(false);\n\t\t\tsetQuery(displayOf(items, selected));\n\t\t\tsetActive(null);\n\t\t};\n\t\twindow.addEventListener(\"keydown\", onKey, true);\n\t\tdocument.addEventListener(\"keydown\", onKey, true);\n\t\treturn () => {\n\t\t\twindow.removeEventListener(\"keydown\", onKey, true);\n\t\t\tdocument.removeEventListener(\"keydown\", onKey, true);\n\t\t};\n\t}, [items, open, selected]);\n\n\treturn (\n\t\t<PopoverPrimitive.Root\n\t\t\topen={listOpen}\n\t\t\tonOpenChange={(nextOpen) => {\n\t\t\t\tif (!nextOpen) {\n\t\t\t\t\tsetOpen(false);\n\t\t\t\t\tsetActive(null);\n\t\t\t\t\tif (!allowFreeform) {\n\t\t\t\t\t\tsetQuery(displayOf(items, selected));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}}\n\t\t>\n\t\t\t<div\n\t\t\t\t{...rest}\n\t\t\t\tclassName={cn(\"relative w-full\", className)}\n\t\t\t\tonBlur={(event) => {\n\t\t\t\t\tonBlur?.(event);\n\t\t\t\t\tconst related = event.relatedTarget as Node | null;\n\t\t\t\t\tconst listbox = document.getElementById(listId);\n\t\t\t\t\tif (!event.currentTarget.contains(related) && !listbox?.contains(related)) {\n\t\t\t\t\t\tif (allowFreeform) {\n\t\t\t\t\t\t\tif (query.trim() !== displayOf(items, selected)) {\n\t\t\t\t\t\t\t\tcommitFreeform(query, false);\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsetQuery(displayOf(items, selected));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsetOpen(false);\n\t\t\t\t\t\tsetActive(null);\n\t\t\t\t\t}\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{name ? <input type=\"hidden\" name={name} value={selected} disabled={busy} /> : null}\n\t\t\t\t<PopoverPrimitive.Anchor asChild>\n\t\t\t\t\t<Input\n\t\t\t\t\t\tref={inputRef}\n\t\t\t\t\t\tid={id}\n\t\t\t\t\t\tvalue={query}\n\t\t\t\t\t\tdisabled={busy}\n\t\t\t\t\t\tsize={size}\n\t\t\t\t\t\taria-busy={loading || undefined}\n\t\t\t\t\t\taria-invalid={ariaInvalid}\n\t\t\t\t\t\taria-describedby={ariaDescribedBy}\n\t\t\t\t\t\tonChange={(event) => {\n\t\t\t\t\t\t\tsetQuery(event.target.value);\n\t\t\t\t\t\t\tsetOpen(true);\n\t\t\t\t\t\t\tsetActive(null);\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonFocus={() => {\n\t\t\t\t\t\t\tif (busy) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (skipFocusOpen.current) {\n\t\t\t\t\t\t\t\tskipFocusOpen.current = false;\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tsetActive(null);\n\t\t\t\t\t\t\tsetOpen(true);\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\tif (busy) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (!open) {\n\t\t\t\t\t\t\t\tsetActive(null);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tsetOpen(true);\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonKeyDown={(event) => {\n\t\t\t\t\t\t\tif (event.nativeEvent.isComposing || event.key === \"Process\") {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (event.key === \"ArrowDown\") {\n\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\tsetOpen(true);\n\t\t\t\t\t\t\t\tif (filtered.length === 0) {\n\t\t\t\t\t\t\t\t\tsetActive(null);\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tsetActive((current) => (current === null ? 0 : (current + 1) % filtered.length));\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (event.key === \"ArrowUp\") {\n\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\tsetOpen(true);\n\t\t\t\t\t\t\t\tif (filtered.length === 0) {\n\t\t\t\t\t\t\t\t\tsetActive(null);\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tsetActive((current) =>\n\t\t\t\t\t\t\t\t\tcurrent === null\n\t\t\t\t\t\t\t\t\t\t? filtered.length - 1\n\t\t\t\t\t\t\t\t\t\t: (current - 1 + filtered.length) % filtered.length,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (event.key === \"Enter\") {\n\t\t\t\t\t\t\t\tif (open && activeItem) {\n\t\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\t\tcommitItem(activeItem);\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (allowFreeform && query.trim() !== displayOf(items, selected)) {\n\t\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\t\tcommitFreeform(query);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\t\trole=\"combobox\"\n\t\t\t\t\t\taria-label={ariaLabel ?? (id ? undefined : placeholder)}\n\t\t\t\t\t\taria-expanded={listOpen}\n\t\t\t\t\t\taria-autocomplete=\"list\"\n\t\t\t\t\t\taria-controls={listOpen ? listId : undefined}\n\t\t\t\t\t\taria-activedescendant={\n\t\t\t\t\t\t\tlistOpen && activeItem && activeIndex !== null\n\t\t\t\t\t\t\t\t? `${listId}-opt-${activeIndex}`\n\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t</PopoverPrimitive.Anchor>\n\t\t\t\t<PopoverPrimitive.Portal>\n\t\t\t\t\t<PopoverPrimitive.Content\n\t\t\t\t\t\tref={highlightRef}\n\t\t\t\t\t\tside=\"bottom\"\n\t\t\t\t\t\tsideOffset={OVERLAY_GAP}\n\t\t\t\t\t\talign=\"start\"\n\t\t\t\t\t\tavoidCollisions\n\t\t\t\t\t\tcollisionPadding={8}\n\t\t\t\t\t\tonPointerMove={(event) => {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tlastPointerPos.current &&\n\t\t\t\t\t\t\t\tlastPointerPos.current.x === event.clientX &&\n\t\t\t\t\t\t\t\tlastPointerPos.current.y === event.clientY\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tlastPointerPos.current = { x: event.clientX, y: event.clientY };\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonEscapeKeyDown={(e) => {\n\t\t\t\t\t\t\tconst evt = e as unknown as {\n\t\t\t\t\t\t\t\tisComposing?: boolean;\n\t\t\t\t\t\t\t\tnativeEvent?: { isComposing?: boolean };\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tif (evt.isComposing || evt.nativeEvent?.isComposing) {\n\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonOpenAutoFocus={(e) => e.preventDefault()}\n\t\t\t\t\t\tonCloseAutoFocus={(e) => e.preventDefault()}\n\t\t\t\t\t\tonInteractOutside={(e) => {\n\t\t\t\t\t\t\tconst target = e.target as Node | null;\n\t\t\t\t\t\t\tif (inputRef.current?.contains(target)) {\n\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tid={listId}\n\t\t\t\t\t\trole=\"listbox\"\n\t\t\t\t\t\tclassName={overlayPanelClass(\n\t\t\t\t\t\t\t\"basalt-hover-list w-[var(--radix-popover-trigger-width)] max-h-[var(--radix-popover-content-available-height)] overflow-y-auto\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{filtered.map((item, index) => (\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tkey={`${listId}-opt-${index}`}\n\t\t\t\t\t\t\t\tid={`${listId}-opt-${index}`}\n\t\t\t\t\t\t\t\trole=\"option\"\n\t\t\t\t\t\t\t\tdata-basalt-hover-item=\"\"\n\t\t\t\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\t\t\t\tdisabled={item.disabled}\n\t\t\t\t\t\t\t\taria-disabled={item.disabled || undefined}\n\t\t\t\t\t\t\t\taria-selected={index === activeIndex}\n\t\t\t\t\t\t\t\tclassName={cn(overlayItemClass(), item.disabled && \"opacity-50\")}\n\t\t\t\t\t\t\t\tonPointerMove={(event) => {\n\t\t\t\t\t\t\t\t\tif (item.disabled) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tconst { clientX, clientY } = event;\n\t\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t\tlastPointerPos.current &&\n\t\t\t\t\t\t\t\t\t\tlastPointerPos.current.x === clientX &&\n\t\t\t\t\t\t\t\t\t\tlastPointerPos.current.y === clientY\n\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tlastPointerPos.current = { x: clientX, y: clientY };\n\t\t\t\t\t\t\t\t\tsetActive(index);\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tonMouseDown={(event) => event.preventDefault()}\n\t\t\t\t\t\t\t\tonClick={() => commitItem(item)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{item.label}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</PopoverPrimitive.Content>\n\t\t\t\t</PopoverPrimitive.Portal>\n\t\t\t</div>\n\t\t</PopoverPrimitive.Root>\n\t);\n}\n\nfunction displayOf(items: TypeaheadItem[], value: string) {\n\treturn items.find((item) => item.value === value)?.label ?? value;\n}\n\nfunction filterItems(items: TypeaheadItem[], query: string, showAllWhenEmpty: boolean) {\n\tconst needle = query.trim().toLowerCase();\n\tif (needle === \"\") {\n\t\treturn showAllWhenEmpty ? items : [];\n\t}\n\treturn items.filter((item) => item.label.toLowerCase().includes(needle));\n}\n"],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@ import { BASALT_UI_CLASS as t } from "../utils/control-surface.js";
|
|
|
4
4
|
import { Button as n } from "./button.js";
|
|
5
5
|
import { Check as r, FileText as i, RotateCcw as a, Trash2 as o, X as s } from "lucide-react";
|
|
6
6
|
import { jsx as c, jsxs as l } from "react/jsx-runtime";
|
|
7
|
-
|
|
7
|
+
// src/components/upload-queue.tsx
|
|
8
8
|
var u = {
|
|
9
9
|
queued: "Queued",
|
|
10
10
|
uploading: "Uploading",
|
|
@@ -111,7 +111,6 @@ function f({ label: n, files: r, emptyLabel: i = "No files selected.", className
|
|
|
111
111
|
})
|
|
112
112
|
});
|
|
113
113
|
}
|
|
114
|
-
//#endregion
|
|
115
114
|
export { d as UploadItem, f as UploadQueue };
|
|
116
115
|
|
|
117
116
|
//# sourceMappingURL=upload-queue.js.map
|
package/dist/index.d.ts
CHANGED
|
@@ -20,7 +20,7 @@ export { ScrollArea } from "./components/scroll-area.js";
|
|
|
20
20
|
export { SegmentControl } from "./components/segment-control.js";
|
|
21
21
|
export { Separator } from "./components/separator.js";
|
|
22
22
|
export { Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger, } from "./components/sheet.js";
|
|
23
|
-
export { ContentIsland, Sidebar, SidebarFooter, SidebarGroup, SidebarHeader, SidebarIconItem, SidebarItem, SidebarNav, SidebarPartition, SidebarProvider, SidebarSearch, SidebarUser, } from "./components/sidebar.js";
|
|
23
|
+
export { ContentIsland, Sidebar, SidebarBrand, SidebarFooter, SidebarGroup, SidebarHeader, SidebarIconItem, SidebarItem, SidebarNav, SidebarPartition, SidebarProvider, SidebarSearch, SidebarToggle, SidebarUser, } from "./components/sidebar.js";
|
|
24
24
|
export { StatStrip } from "./components/stat-strip.js";
|
|
25
25
|
export { Switch } from "./components/switch.js";
|
|
26
26
|
export { TablePager } from "./components/table-pager.js";
|
package/dist/index.js
CHANGED
|
@@ -23,14 +23,14 @@ import { ScrollArea as ae } from "./components/scroll-area.js";
|
|
|
23
23
|
import { SegmentControl as oe } from "./components/segment-control.js";
|
|
24
24
|
import { Separator as se } from "./components/separator.js";
|
|
25
25
|
import { Sheet as ce, SheetClose as le, SheetContent as ue, SheetDescription as de, SheetFooter as fe, SheetHeader as pe, SheetTitle as me, SheetTrigger as he } from "./components/sheet.js";
|
|
26
|
-
import { ContentIsland as ge, Sidebar as _e,
|
|
27
|
-
import { StatStrip as
|
|
28
|
-
import { Switch as
|
|
29
|
-
import { TablePager as
|
|
30
|
-
import { Tabs as
|
|
31
|
-
import { Text as
|
|
32
|
-
import { ThemeProvider as
|
|
33
|
-
import { ThemeToggle as
|
|
34
|
-
import { Toast as
|
|
35
|
-
import { Toolbar as
|
|
36
|
-
export { l as AlertDialog, u as AlertDialogAction, d as AlertDialogCancel, f as AlertDialogContent, p as AlertDialogDescription, m as AlertDialogFooter, h as AlertDialogHeader, g as AlertDialogTitle, _ as AlertDialogTrigger, v as Avatar, y as AvatarFallback, b as AvatarImage, x as Badge, e as Button, S as Checkbox, C as Collapsible, w as CollapsibleContent, T as CollapsibleTrigger, E as CommandEmpty, D as CommandGroup, O as CommandInput, k as CommandItem, A as CommandList, j as CommandPalette, M as CommandPaletteTrigger, N as CommandSeparator, P as CommandShortcut, F as ConfirmDialog, ge as ContentIsland, L as DescriptionList, t as Dialog, n as DialogClose, r as DialogContent, i as DialogDescription, a as DialogFooter, o as DialogHeader, s as DialogTitle, c as DialogTrigger, R as DropdownMenu, z as DropdownMenuContent, B as DropdownMenuItem, V as DropdownMenuTrigger, q as Field, J as Input, K as Label, Y as LayerCard, Z as Link, X as LinkProvider, Q as Meter, $ as Popover, ee as PopoverClose, te as PopoverContent, ne as PopoverDescription, re as PopoverTitle, ie as PopoverTrigger, ae as ScrollArea, oe as SegmentControl, se as Separator, ce as Sheet, le as SheetClose, ue as SheetContent, de as SheetDescription, fe as SheetFooter, pe as SheetHeader, me as SheetTitle, he as SheetTrigger, _e as Sidebar, ve as
|
|
26
|
+
import { ContentIsland as ge, Sidebar as _e, SidebarBrand as ve, SidebarFooter as ye, SidebarGroup as be, SidebarHeader as xe, SidebarIconItem as Se, SidebarItem as Ce, SidebarNav as we, SidebarPartition as Te, SidebarProvider as Ee, SidebarSearch as De, SidebarToggle as Oe, SidebarUser as ke } from "./components/sidebar.js";
|
|
27
|
+
import { StatStrip as Ae } from "./components/stat-strip.js";
|
|
28
|
+
import { Switch as je } from "./components/switch.js";
|
|
29
|
+
import { TablePager as Me } from "./components/table-pager.js";
|
|
30
|
+
import { Tabs as Ne, TabsContent as Pe, TabsList as Fe, TabsTrigger as Ie } from "./components/tabs.js";
|
|
31
|
+
import { Text as Le } from "./components/text.js";
|
|
32
|
+
import { ThemeProvider as Re } from "./providers/theme.js";
|
|
33
|
+
import { ThemeToggle as ze } from "./components/theme-toggle.js";
|
|
34
|
+
import { Toast as Be, Toaster as Ve, toast as He } from "./components/toast.js";
|
|
35
|
+
import { Toolbar as Ue } from "./components/toolbar.js";
|
|
36
|
+
export { l as AlertDialog, u as AlertDialogAction, d as AlertDialogCancel, f as AlertDialogContent, p as AlertDialogDescription, m as AlertDialogFooter, h as AlertDialogHeader, g as AlertDialogTitle, _ as AlertDialogTrigger, v as Avatar, y as AvatarFallback, b as AvatarImage, x as Badge, e as Button, S as Checkbox, C as Collapsible, w as CollapsibleContent, T as CollapsibleTrigger, E as CommandEmpty, D as CommandGroup, O as CommandInput, k as CommandItem, A as CommandList, j as CommandPalette, M as CommandPaletteTrigger, N as CommandSeparator, P as CommandShortcut, F as ConfirmDialog, ge as ContentIsland, L as DescriptionList, t as Dialog, n as DialogClose, r as DialogContent, i as DialogDescription, a as DialogFooter, o as DialogHeader, s as DialogTitle, c as DialogTrigger, R as DropdownMenu, z as DropdownMenuContent, B as DropdownMenuItem, V as DropdownMenuTrigger, q as Field, J as Input, K as Label, Y as LayerCard, Z as Link, X as LinkProvider, Q as Meter, $ as Popover, ee as PopoverClose, te as PopoverContent, ne as PopoverDescription, re as PopoverTitle, ie as PopoverTrigger, ae as ScrollArea, oe as SegmentControl, se as Separator, ce as Sheet, le as SheetClose, ue as SheetContent, de as SheetDescription, fe as SheetFooter, pe as SheetHeader, me as SheetTitle, he as SheetTrigger, _e as Sidebar, ve as SidebarBrand, ye as SidebarFooter, be as SidebarGroup, xe as SidebarHeader, Se as SidebarIconItem, Ce as SidebarItem, we as SidebarNav, Te as SidebarPartition, Ee as SidebarProvider, De as SidebarSearch, Oe as SidebarToggle, ke as SidebarUser, Ae as StatStrip, je as Switch, Me as TablePager, Ne as Tabs, Pe as TabsContent, Fe as TabsList, Ie as TabsTrigger, Le as Text, Re as ThemeProvider, ze as ThemeToggle, Be as Toast, Ve as Toaster, Ue as Toolbar, H as Tooltip, U as TooltipContent, W as TooltipProvider, G as TooltipTrigger, He as toast, I as useConfirm };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
|
|
2
|
+
// src/models/agent-feedback.ts
|
|
3
3
|
function e(e) {
|
|
4
4
|
let t = e.filter((e) => e.status === "complete").length, n = e.some((e) => e.status === "error") ? "error" : e.some((e) => e.status === "running") ? "running" : e.length > 0 && t === e.length ? "complete" : "pending";
|
|
5
5
|
return {
|
|
@@ -22,7 +22,6 @@ function n(e, t) {
|
|
|
22
22
|
}];
|
|
23
23
|
}));
|
|
24
24
|
}
|
|
25
|
-
//#endregion
|
|
26
25
|
export { n as approvalSnapshot, e as summarizeSteps, t as validApprovalAnswer };
|
|
27
26
|
|
|
28
27
|
//# sourceMappingURL=agent-feedback.js.map
|
package/dist/models/avatar.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
|
|
2
|
+
// src/models/avatar.ts
|
|
3
3
|
function e(e) {
|
|
4
4
|
let t = e.trim().split(/[\s—–-]+/u).filter(Boolean), n = t.length > 1 ? [Array.from(t[0])[0], Array.from(t[1])[0]] : Array.from(t[0] ?? "").slice(0, 2);
|
|
5
5
|
return Array.from(n.join("").toLocaleUpperCase("en-US")).slice(0, 2).join("") || "?";
|
|
@@ -9,7 +9,6 @@ function t(e) {
|
|
|
9
9
|
for (let n of e) t = Math.imul(t ^ (n.codePointAt(0) ?? 0), 16777619);
|
|
10
10
|
return (t >>> 0) % 6;
|
|
11
11
|
}
|
|
12
|
-
//#endregion
|
|
13
12
|
export { t as avatarColorIndex, e as avatarInitials };
|
|
14
13
|
|
|
15
14
|
//# sourceMappingURL=avatar.js.map
|
package/dist/models/code.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
|
|
2
|
+
// src/models/code.ts
|
|
3
3
|
var e = /(\/\/[^\n]*)|("(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|`[^`]*`)|\b(import|from|export|default|async|await|function|return|const|let|var|type|interface|as|if|else|throw|new|typeof|null|true|false|undefined)\b|(\b\d+\b)|(<\/?[A-Za-z][\w.-]*)/g;
|
|
4
4
|
function t(t, n) {
|
|
5
5
|
let r = [], i = 0;
|
|
@@ -18,7 +18,6 @@ function t(t, n) {
|
|
|
18
18
|
});
|
|
19
19
|
return a;
|
|
20
20
|
}
|
|
21
|
-
//#endregion
|
|
22
21
|
export { t as codeLines };
|
|
23
22
|
|
|
24
23
|
//# sourceMappingURL=code.js.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
|
|
2
|
+
// src/models/context-cards.ts
|
|
3
3
|
function e(e) {
|
|
4
4
|
if (e && e === e.trim() && !Array.from(e).some((e) => e.charCodeAt(0) <= 32 || e === "\\")) {
|
|
5
5
|
if (e.startsWith("/") && !e.startsWith("//")) return e;
|
|
@@ -11,7 +11,6 @@ function e(e) {
|
|
|
11
11
|
}
|
|
12
12
|
}
|
|
13
13
|
}
|
|
14
|
-
//#endregion
|
|
15
14
|
export { e as contextSourceHref };
|
|
16
15
|
|
|
17
16
|
//# sourceMappingURL=context-cards.js.map
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
|
|
2
|
+
// src/models/diff-table.ts
|
|
3
3
|
function e(e, t) {
|
|
4
4
|
return e.filter((e) => e.change !== "unchanged" && !t.includes(e.id));
|
|
5
5
|
}
|
|
6
|
-
//#endregion
|
|
7
6
|
export { e as selectedDiffRows };
|
|
8
7
|
|
|
9
8
|
//# sourceMappingURL=diff-table.js.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
|
|
2
|
+
// src/models/recommendation.ts
|
|
3
3
|
var e = {
|
|
4
4
|
high: {
|
|
5
5
|
label: "High confidence",
|
|
@@ -17,7 +17,6 @@ var e = {
|
|
|
17
17
|
className: "text-basalt-muted-foreground"
|
|
18
18
|
}
|
|
19
19
|
};
|
|
20
|
-
//#endregion
|
|
21
20
|
export { e as RECOMMENDATION_CONFIDENCE };
|
|
22
21
|
|
|
23
22
|
//# sourceMappingURL=recommendation.js.map
|
package/dist/providers/accent.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { createPreferenceStore as e } from "../utils/preference-store.js";
|
|
3
3
|
import { createContext as t, useCallback as n, useContext as r, useEffect as i, useMemo as a, useState as o, useSyncExternalStore as s } from "react";
|
|
4
4
|
import { jsx as c } from "react/jsx-runtime";
|
|
5
|
-
|
|
5
|
+
// src/providers/accent.tsx
|
|
6
6
|
var l = [
|
|
7
7
|
{
|
|
8
8
|
id: "primary",
|
|
@@ -275,11 +275,7 @@ function M({ children: t, paletteOverrides: r, storageKey: u = f, defaultAccent:
|
|
|
275
275
|
]);
|
|
276
276
|
let E = n((e) => {
|
|
277
277
|
let t = m(e).id;
|
|
278
|
-
|
|
279
|
-
v?.(t);
|
|
280
|
-
return;
|
|
281
|
-
}
|
|
282
|
-
S.setValue(t), v?.(t);
|
|
278
|
+
b || S.setValue(t), v?.(t);
|
|
283
279
|
}, [
|
|
284
280
|
b,
|
|
285
281
|
v,
|
|
@@ -303,7 +299,6 @@ function N() {
|
|
|
303
299
|
if (!e) throw Error("useAccent must be used within AccentProvider");
|
|
304
300
|
return e;
|
|
305
301
|
}
|
|
306
|
-
//#endregion
|
|
307
302
|
export { l as ACCENT_SWATCHES, M as AccentProvider, d as DEFAULT_ACCENT_ID, E as accentForeground, m as accentSwatchById, D as applyAccent, N as useAccent };
|
|
308
303
|
|
|
309
304
|
//# sourceMappingURL=accent.js.map
|