@refraction-ui/react 0.19.1 → 0.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-533MCMSU.js +2355 -0
- package/dist/chunk-533MCMSU.js.map +7 -0
- package/dist/chunk-AMK4VCBG.js +250 -0
- package/dist/chunk-AMK4VCBG.js.map +7 -0
- package/dist/chunk-BOLFYVI6.js +90 -0
- package/dist/chunk-BOLFYVI6.js.map +7 -0
- package/dist/chunk-F7B64KT3.js +187 -0
- package/dist/chunk-F7B64KT3.js.map +7 -0
- package/dist/chunk-FD37DFCC.js +77 -0
- package/dist/chunk-FD37DFCC.js.map +7 -0
- package/dist/chunk-H54FLNAF.js +132 -0
- package/dist/chunk-H54FLNAF.js.map +7 -0
- package/dist/chunk-INP46354.js +664 -0
- package/dist/chunk-INP46354.js.map +7 -0
- package/dist/chunk-ONACRMG4.js +116 -0
- package/dist/chunk-ONACRMG4.js.map +7 -0
- package/dist/chunk-SDZ3LROZ.js +7 -0
- package/dist/chunk-SDZ3LROZ.js.map +7 -0
- package/dist/chunk-TOZBR4GL.js +154 -0
- package/dist/chunk-TOZBR4GL.js.map +7 -0
- package/dist/chunk-UNEM2TRI.js +225 -0
- package/dist/chunk-UNEM2TRI.js.map +7 -0
- package/dist/chunk-VK3EQ34F.js +92 -0
- package/dist/chunk-VK3EQ34F.js.map +7 -0
- package/dist/chunk-WK2IIUFO.js +316 -0
- package/dist/chunk-WK2IIUFO.js.map +7 -0
- package/dist/chunk-WSPJTQAV.js +59 -0
- package/dist/chunk-WSPJTQAV.js.map +7 -0
- package/dist/chunk-XWP763SH.js +3 -2
- package/dist/chunk-XWP763SH.js.map +7 -1
- package/dist/chunk-Y2FNNAIL.js +80 -0
- package/dist/chunk-Y2FNNAIL.js.map +1 -0
- package/dist/{chunk-4A4BW3GR.js → chunk-ZF3OHCGV.js} +28 -5
- package/dist/chunk-ZF3OHCGV.js.map +7 -0
- package/dist/form.cjs +5 -11
- package/dist/form.cjs.map +1 -1
- package/dist/form.js +6 -12
- package/dist/form.js.map +1 -1
- package/dist/index.cjs +2879 -33936
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +126 -28780
- package/dist/internal/react-app-shell/index.d.cts +2 -22
- package/dist/internal/react-app-shell/index.d.ts +2 -22
- package/dist/internal/react-badge/index.d.cts +5 -0
- package/dist/internal/react-badge/index.d.ts +5 -0
- package/dist/internal/react-callout/index.d.cts +4 -0
- package/dist/internal/react-callout/index.d.ts +4 -0
- package/dist/internal/react-card/index.d.cts +8 -1
- package/dist/internal/react-card/index.d.ts +8 -1
- package/dist/internal/react-collapsible/index.d.cts +0 -3
- package/dist/internal/react-collapsible/index.d.ts +0 -3
- package/dist/internal/react-combobox/index.d.cts +0 -3
- package/dist/internal/react-combobox/index.d.ts +0 -3
- package/dist/internal/react-command/index.d.cts +0 -3
- package/dist/internal/react-command/index.d.ts +0 -3
- package/dist/internal/react-data-table/index.d.cts +0 -3
- package/dist/internal/react-data-table/index.d.ts +0 -3
- package/dist/internal/react-dialog/index.d.cts +0 -3
- package/dist/internal/react-dialog/index.d.ts +0 -3
- package/dist/internal/react-dropdown-menu/index.d.cts +0 -3
- package/dist/internal/react-dropdown-menu/index.d.ts +0 -3
- package/dist/internal/react-feedback-dialog/index.d.cts +0 -3
- package/dist/internal/react-feedback-dialog/index.d.ts +0 -3
- package/dist/internal/react-form/index.d.cts +2 -21
- package/dist/internal/react-form/index.d.ts +2 -21
- package/dist/internal/react-keyboard-shortcut/index.d.cts +0 -6
- package/dist/internal/react-keyboard-shortcut/index.d.ts +0 -6
- package/dist/internal/react-link-card/index.d.cts +8 -2
- package/dist/internal/react-link-card/index.d.ts +8 -2
- package/dist/internal/react-popover/index.d.cts +0 -3
- package/dist/internal/react-popover/index.d.ts +0 -3
- package/dist/internal/react-sheet/index.d.cts +0 -3
- package/dist/internal/react-sheet/index.d.ts +0 -3
- package/dist/internal/react-slot/index.d.cts +23 -0
- package/dist/internal/react-slot/index.d.ts +23 -0
- package/dist/internal/react-toast/index.d.cts +0 -3
- package/dist/internal/react-toast/index.d.ts +0 -3
- package/dist/internal/react-tooltip/index.d.cts +0 -3
- package/dist/internal/react-tooltip/index.d.ts +0 -3
- package/dist/react-accordion.js +125 -0
- package/dist/react-accordion.js.map +7 -0
- package/dist/react-ai.js +257 -0
- package/dist/react-ai.js.map +7 -0
- package/dist/react-analytics.js +1698 -0
- package/dist/react-analytics.js.map +7 -0
- package/dist/react-animated-text.js +164 -0
- package/dist/react-animated-text.js.map +7 -0
- package/dist/react-app-shell.js +631 -0
- package/dist/react-app-shell.js.map +7 -0
- package/dist/react-audience-feature-card.js +53 -0
- package/dist/react-audience-feature-card.js.map +7 -0
- package/dist/react-audio-room.js +166 -0
- package/dist/react-audio-room.js.map +7 -0
- package/dist/react-auth.js +211 -0
- package/dist/react-auth.js.map +7 -0
- package/dist/react-avatar-group.js +154 -0
- package/dist/react-avatar-group.js.map +7 -0
- package/dist/react-avatar.js +168 -0
- package/dist/react-avatar.js.map +7 -0
- package/dist/react-badge.js +86 -0
- package/dist/react-badge.js.map +7 -0
- package/dist/react-bottom-nav.js +67 -0
- package/dist/react-bottom-nav.js.map +7 -0
- package/dist/react-brand-network-cell.js +92 -0
- package/dist/react-brand-network-cell.js.map +7 -0
- package/dist/react-breadcrumbs.js +104 -0
- package/dist/react-breadcrumbs.js.map +7 -0
- package/dist/react-browser-chrome-mock.js +89 -0
- package/dist/react-browser-chrome-mock.js.map +7 -0
- package/dist/react-button.js +13 -0
- package/dist/react-button.js.map +7 -0
- package/dist/react-calendar.js +301 -0
- package/dist/react-calendar.js.map +7 -0
- package/dist/react-call-controls.js +113 -0
- package/dist/react-call-controls.js.map +7 -0
- package/dist/react-callout.js +152 -0
- package/dist/react-callout.js.map +7 -0
- package/dist/react-card-grid.js +34 -0
- package/dist/react-card-grid.js.map +7 -0
- package/dist/react-card.js +200 -0
- package/dist/react-card.js.map +7 -0
- package/dist/react-carousel.js +132 -0
- package/dist/react-carousel.js.map +7 -0
- package/dist/react-charts.js +509 -0
- package/dist/react-charts.js.map +7 -0
- package/dist/react-checkbox.js +156 -0
- package/dist/react-checkbox.js.map +7 -0
- package/dist/react-checklist.js +168 -0
- package/dist/react-checklist.js.map +7 -0
- package/dist/react-code-block.js +78 -0
- package/dist/react-code-block.js.map +7 -0
- package/dist/react-code-editor.js +184 -0
- package/dist/react-code-editor.js.map +7 -0
- package/dist/react-collapsible.js +192 -0
- package/dist/react-collapsible.js.map +7 -0
- package/dist/react-combobox.js +609 -0
- package/dist/react-combobox.js.map +7 -0
- package/dist/react-command-input.js +202 -0
- package/dist/react-command-input.js.map +7 -0
- package/dist/react-command.js +364 -0
- package/dist/react-command.js.map +7 -0
- package/dist/react-composer.js +2036 -0
- package/dist/react-composer.js.map +7 -0
- package/dist/react-content-protection.js +133 -0
- package/dist/react-content-protection.js.map +7 -0
- package/dist/react-conversation.js +1226 -0
- package/dist/react-conversation.js.map +7 -0
- package/dist/react-cookie-consent.js +291 -0
- package/dist/react-cookie-consent.js.map +7 -0
- package/dist/react-data-table.js +310 -0
- package/dist/react-data-table.js.map +7 -0
- package/dist/react-date-picker.js +95 -0
- package/dist/react-date-picker.js.map +7 -0
- package/dist/react-device-frame.js +137 -0
- package/dist/react-device-frame.js.map +7 -0
- package/dist/react-dialog.js +218 -0
- package/dist/react-dialog.js.map +7 -0
- package/dist/react-diff-viewer.js +460 -0
- package/dist/react-diff-viewer.js.map +7 -0
- package/dist/react-dropdown-menu.js +292 -0
- package/dist/react-dropdown-menu.js.map +7 -0
- package/dist/react-editor-status-bar.js +148 -0
- package/dist/react-editor-status-bar.js.map +7 -0
- package/dist/react-editor-tabs.js +159 -0
- package/dist/react-editor-tabs.js.map +7 -0
- package/dist/react-emoji-picker.js +238 -0
- package/dist/react-emoji-picker.js.map +7 -0
- package/dist/react-empty-state.js +90 -0
- package/dist/react-empty-state.js.map +7 -0
- package/dist/react-feedback-dialog.js +275 -0
- package/dist/react-feedback-dialog.js.map +7 -0
- package/dist/react-file-tree.js +376 -0
- package/dist/react-file-tree.js.map +7 -0
- package/dist/react-file-upload.js +360 -0
- package/dist/react-file-upload.js.map +7 -0
- package/dist/react-floating-reactions.js +124 -0
- package/dist/react-floating-reactions.js.map +7 -0
- package/dist/react-flow-editor.js +198 -0
- package/dist/react-flow-editor.js.map +7 -0
- package/dist/react-footer.js +67 -0
- package/dist/react-footer.js.map +7 -0
- package/dist/react-graph-view.js +197 -0
- package/dist/react-graph-view.js.map +7 -0
- package/dist/react-icon-system.js +9 -0
- package/dist/react-icon-system.js.map +7 -0
- package/dist/react-infinite-canvas.js +8 -0
- package/dist/react-infinite-canvas.js.map +7 -0
- package/dist/react-inline-editor.js +216 -0
- package/dist/react-inline-editor.js.map +7 -0
- package/dist/react-input-group.js +150 -0
- package/dist/react-input-group.js.map +7 -0
- package/dist/react-input.js +10 -0
- package/dist/react-input.js.map +7 -0
- package/dist/react-install-prompt.js +132 -0
- package/dist/react-install-prompt.js.map +7 -0
- package/dist/react-kanban-board.js +198 -0
- package/dist/react-kanban-board.js.map +7 -0
- package/dist/react-keyboard-shortcut.js +36 -0
- package/dist/react-keyboard-shortcut.js.map +7 -0
- package/dist/react-language-selector.js +311 -0
- package/dist/react-language-selector.js.map +7 -0
- package/dist/react-link-card.js +48 -0
- package/dist/react-link-card.js.map +7 -0
- package/dist/react-live-captions.js +92 -0
- package/dist/react-live-captions.js.map +7 -0
- package/dist/react-live-cursors.js +145 -0
- package/dist/react-live-cursors.js.map +7 -0
- package/dist/react-live-transcript.js +117 -0
- package/dist/react-live-transcript.js.map +7 -0
- package/dist/react-location-selector.js +252 -0
- package/dist/react-location-selector.js.map +7 -0
- package/dist/react-logger.js +415 -0
- package/dist/react-logger.js.map +7 -0
- package/dist/react-markdown-renderer.js +12 -0
- package/dist/react-markdown-renderer.js.map +7 -0
- package/dist/react-marquee-strip.js +62 -0
- package/dist/react-marquee-strip.js.map +7 -0
- package/dist/react-mascot.js +367 -0
- package/dist/react-mascot.js.map +7 -0
- package/dist/react-mastery-bar.js +97 -0
- package/dist/react-mastery-bar.js.map +7 -0
- package/dist/react-mini-map.js +207 -0
- package/dist/react-mini-map.js.map +7 -0
- package/dist/react-mobile-nav.js +216 -0
- package/dist/react-mobile-nav.js.map +7 -0
- package/dist/react-navbar.js +96 -0
- package/dist/react-navbar.js.map +7 -0
- package/dist/react-numbered-steps.js +67 -0
- package/dist/react-numbered-steps.js.map +7 -0
- package/dist/react-otp-input.js +318 -0
- package/dist/react-otp-input.js.map +7 -0
- package/dist/react-pagination.js +199 -0
- package/dist/react-pagination.js.map +7 -0
- package/dist/react-password-input.js +104 -0
- package/dist/react-password-input.js.map +7 -0
- package/dist/react-payment.js +81 -0
- package/dist/react-payment.js.map +7 -0
- package/dist/react-popover.js +176 -0
- package/dist/react-popover.js.map +7 -0
- package/dist/react-pre-call-lobby.js +309 -0
- package/dist/react-pre-call-lobby.js.map +7 -0
- package/dist/react-presence-indicator.js +86 -0
- package/dist/react-presence-indicator.js.map +7 -0
- package/dist/react-pricing-card.js +142 -0
- package/dist/react-pricing-card.js.map +7 -0
- package/dist/react-progress-display.js +188 -0
- package/dist/react-progress-display.js.map +7 -0
- package/dist/react-radial-gauge.js +193 -0
- package/dist/react-radial-gauge.js.map +7 -0
- package/dist/react-radio.js +169 -0
- package/dist/react-radio.js.map +7 -0
- package/dist/react-rating-scale.js +171 -0
- package/dist/react-rating-scale.js.map +7 -0
- package/dist/react-reaction-bar.js +111 -0
- package/dist/react-reaction-bar.js.map +7 -0
- package/dist/react-resizable-layout.js +298 -0
- package/dist/react-resizable-layout.js.map +7 -0
- package/dist/react-rich-editor.js +1 -0
- package/dist/react-rich-editor.js.map +7 -0
- package/dist/react-search-bar.js +285 -0
- package/dist/react-search-bar.js.map +7 -0
- package/dist/react-section-head.js +65 -0
- package/dist/react-section-head.js.map +7 -0
- package/dist/react-segmented-control.js +215 -0
- package/dist/react-segmented-control.js.map +7 -0
- package/dist/react-select.js +389 -0
- package/dist/react-select.js.map +7 -0
- package/dist/react-separator.js +86 -0
- package/dist/react-separator.js.map +7 -0
- package/dist/react-sheet.js +310 -0
- package/dist/react-sheet.js.map +7 -0
- package/dist/react-sidebar.js +100 -0
- package/dist/react-sidebar.js.map +7 -0
- package/dist/react-skeleton.js +91 -0
- package/dist/react-skeleton.js.map +7 -0
- package/dist/react-skip-to-content.js +38 -0
- package/dist/react-skip-to-content.js.map +7 -0
- package/dist/react-slide-viewer.js +264 -0
- package/dist/react-slide-viewer.js.map +7 -0
- package/dist/react-slider.js +105 -0
- package/dist/react-slider.js.map +7 -0
- package/dist/react-slot-picker.js +184 -0
- package/dist/react-slot-picker.js.map +7 -0
- package/dist/react-slot.js +7 -0
- package/dist/react-slot.js.map +7 -0
- package/dist/react-social-auth-button.js +169 -0
- package/dist/react-social-auth-button.js.map +7 -0
- package/dist/react-sortable-list.js +204 -0
- package/dist/react-sortable-list.js.map +7 -0
- package/dist/react-stat-grid.js +69 -0
- package/dist/react-stat-grid.js.map +7 -0
- package/dist/react-status-indicator.js +117 -0
- package/dist/react-status-indicator.js.map +7 -0
- package/dist/react-steps.js +167 -0
- package/dist/react-steps.js.map +7 -0
- package/dist/react-sticky-note.js +131 -0
- package/dist/react-sticky-note.js.map +7 -0
- package/dist/react-switch.js +139 -0
- package/dist/react-switch.js.map +7 -0
- package/dist/react-table-of-contents.js +80 -0
- package/dist/react-table-of-contents.js.map +7 -0
- package/dist/react-tabs.js +230 -0
- package/dist/react-tabs.js.map +7 -0
- package/dist/react-terminal.js +101 -0
- package/dist/react-terminal.js.map +7 -0
- package/dist/react-test-results.js +158 -0
- package/dist/react-test-results.js.map +7 -0
- package/dist/react-textarea.js +89 -0
- package/dist/react-textarea.js.map +7 -0
- package/dist/react-thread-view.js +139 -0
- package/dist/react-thread-view.js.map +7 -0
- package/dist/react-timeline.js +153 -0
- package/dist/react-timeline.js.map +7 -0
- package/dist/react-toast.js +253 -0
- package/dist/react-toast.js.map +7 -0
- package/dist/react-tooltip.js +221 -0
- package/dist/react-tooltip.js.map +7 -0
- package/dist/react-version-selector.js +270 -0
- package/dist/react-version-selector.js.map +7 -0
- package/dist/react-video-grid.js +129 -0
- package/dist/react-video-grid.js.map +7 -0
- package/dist/react-video-player.js +206 -0
- package/dist/react-video-player.js.map +7 -0
- package/dist/react-video-tile.js +8 -0
- package/dist/react-video-tile.js.map +7 -0
- package/dist/react-voice-pill.js +314 -0
- package/dist/react-voice-pill.js.map +7 -0
- package/dist/react-waveform.js +558 -0
- package/dist/react-waveform.js.map +7 -0
- package/dist/react-wizard.js +337 -0
- package/dist/react-wizard.js.map +7 -0
- package/dist/styles.css +7 -0
- package/dist/theme.js +1 -1
- package/package.json +3 -2
- package/dist/applicationinsights-web-H7OBLIVJ.js +0 -23393
- package/dist/applicationinsights-web-H7OBLIVJ.js.map +0 -1
- package/dist/chunk-4A4BW3GR.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/module-X3HTTRQK.js +0 -6438
- package/dist/module-X3HTTRQK.js.map +0 -1
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../react-combobox/src/combobox.tsx"],
|
|
4
|
+
"sourcesContent": ["import * as React from 'react'\nimport { createPortal } from 'react-dom'\nimport { cn, cva, generateId, devWarn } from '@refraction-ui/shared'\n\n/* ─── Types ────────────────────────────────────────────────────── */\n\nexport interface ComboboxOption {\n value: string\n label: string\n disabled?: boolean\n}\n\nexport type ComboboxFilter = (option: ComboboxOption, query: string) => boolean\n\nconst defaultFilter: ComboboxFilter = (option, query) => {\n if (!query) return true\n return option.label.toLowerCase().includes(query.toLowerCase())\n}\n\n/* ─── Variants ─────────────────────────────────────────────────── */\n\nexport const comboboxTriggerVariants = cva({\n base: 'flex w-full items-center justify-between rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-1 focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50',\n variants: {\n size: {\n sm: 'h-8 text-xs',\n default: 'h-9 text-sm',\n lg: 'h-10 text-base',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n})\n\nexport const comboboxContentVariants = cva({\n base: 'relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95',\n})\n\nexport const comboboxInputVariants = cva({\n base: 'flex h-9 w-full rounded-md border-0 border-b bg-transparent px-3 py-2 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50',\n})\n\nexport const comboboxListVariants = cva({\n base: 'max-h-[300px] overflow-y-auto overflow-x-hidden p-1',\n})\n\nexport const comboboxItemVariants = cva({\n base: 'relative flex w-full cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none data-[highlighted]:bg-accent data-[highlighted]:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n variants: {\n selected: {\n true: 'bg-accent/50 font-medium',\n false: '',\n },\n },\n defaultVariants: {\n selected: 'false',\n },\n})\n\nexport const comboboxEmptyVariants = cva({\n base: 'py-6 text-center text-sm text-muted-foreground',\n})\n\n/* ─── Context ──────────────────────────────────────────────────── */\n\ninterface RegisteredItem {\n id: string\n value: string\n disabled: boolean\n label: string\n}\n\ninterface ComboboxContextValue {\n value: string | undefined\n onValueChange: (value: string) => void\n open: boolean\n setOpen: (open: boolean) => void\n query: string\n setQuery: (query: string) => void\n highlightedValue: string | undefined\n setHighlightedValue: (value: string | undefined) => void\n registerItem: (item: RegisteredItem) => void\n unregisterItem: (id: string) => void\n matches: (option: { value: string; label: string; disabled?: boolean }) => boolean\n itemMatchesQuery: (label: string, value: string, disabled: boolean) => boolean\n visibleCount: number\n setVisibleCount: (count: number) => void\n ids: {\n trigger: string\n content: string\n list: string\n input: string\n item: (value: string) => string\n }\n disabled: boolean\n options: ComboboxOption[]\n hasOptions: boolean\n filter: ComboboxFilter\n selectedLabel: string | undefined\n triggerRef: React.MutableRefObject<HTMLButtonElement | null>\n contentRef: React.MutableRefObject<HTMLDivElement | null>\n inputRef: React.MutableRefObject<HTMLInputElement | null>\n}\n\nconst ComboboxContext = React.createContext<ComboboxContextValue | null>(null)\n\nfunction useComboboxContext(): ComboboxContextValue {\n const ctx = React.useContext(ComboboxContext)\n if (!ctx) {\n devWarn(\n 'react-combobox/context-outside-provider',\n 'Combobox compound components (ComboboxInput/ComboboxContent/ComboboxItem/etc.) must be rendered inside a <Combobox>. The missing ComboboxContext makes this throw.',\n )\n throw new Error('Combobox compound components must be used within <Combobox>')\n }\n return ctx\n}\n\n/* ─── Combobox (root) ──────────────────────────────────────────── */\n\nexport interface ComboboxProps {\n value?: string\n defaultValue?: string\n onValueChange?: (value: string) => void\n open?: boolean\n defaultOpen?: boolean\n onOpenChange?: (open: boolean) => void\n options?: ComboboxOption[]\n filter?: ComboboxFilter\n disabled?: boolean\n children?: React.ReactNode\n}\n\n/**\n * Combobox -- searchable select with text-based filtering.\n *\n * Compound component:\n * Combobox > ComboboxTrigger + ComboboxContent\n * ComboboxContent > ComboboxInput + ComboboxList(ComboboxItem...) + ComboboxEmpty\n *\n * Supports both controlled (value/onValueChange) and uncontrolled (defaultValue) modes.\n * Options can be supplied via the `options` prop (auto-renders items) or by composing\n * <ComboboxItem> children inside <ComboboxList> for full control.\n */\nexport function Combobox({\n value: valueProp,\n defaultValue,\n onValueChange,\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n options,\n filter = defaultFilter,\n disabled = false,\n children,\n}: ComboboxProps) {\n const isValueControlled = valueProp !== undefined\n const [internalValue, setInternalValue] = React.useState<string | undefined>(defaultValue)\n const value = isValueControlled ? valueProp : internalValue\n\n const isOpenControlled = openProp !== undefined\n const [internalOpen, setInternalOpen] = React.useState(defaultOpen)\n const open = isOpenControlled ? openProp : internalOpen\n\n const [query, setQuery] = React.useState('')\n const [highlightedValue, setHighlightedValue] = React.useState<string | undefined>(undefined)\n const [registry, setRegistry] = React.useState<RegisteredItem[]>([])\n const [visibleCount, setVisibleCount] = React.useState(0)\n\n const idBaseRef = React.useRef<string>(generateId('combobox'))\n const idBase = idBaseRef.current\n\n const triggerRef = React.useRef<HTMLButtonElement | null>(null)\n const contentRef = React.useRef<HTMLDivElement | null>(null)\n const inputRef = React.useRef<HTMLInputElement | null>(null)\n\n const handleValueChange = React.useCallback(\n (next: string) => {\n if (!isValueControlled) setInternalValue(next)\n onValueChange?.(next)\n },\n [isValueControlled, onValueChange],\n )\n\n const handleOpenChange = React.useCallback(\n (next: boolean) => {\n if (disabled && next) return\n if (!isOpenControlled) setInternalOpen(next)\n onOpenChange?.(next)\n if (!next) {\n // Reset query when closing\n setQuery('')\n setHighlightedValue(undefined)\n }\n },\n [disabled, isOpenControlled, onOpenChange],\n )\n\n const registerItem = React.useCallback((item: RegisteredItem) => {\n setRegistry((prev) => {\n const existing = prev.findIndex((i) => i.id === item.id)\n if (existing >= 0) {\n const next = prev.slice()\n next[existing] = item\n return next\n }\n return [...prev, item]\n })\n }, [])\n\n const unregisterItem = React.useCallback((id: string) => {\n setRegistry((prev) => prev.filter((i) => i.id !== id))\n }, [])\n\n const itemMatchesQuery = React.useCallback(\n (label: string, itemValue: string, itemDisabled: boolean) => {\n return filter({ value: itemValue, label, disabled: itemDisabled }, query)\n },\n [filter, query],\n )\n\n const matches = React.useCallback(\n (option: { value: string; label: string; disabled?: boolean }) => {\n return filter(\n { value: option.value, label: option.label, disabled: option.disabled },\n query,\n )\n },\n [filter, query],\n )\n\n const selectedLabel = React.useMemo(() => {\n if (value === undefined) return undefined\n if (options) {\n const opt = options.find((o) => o.value === value)\n if (opt) return opt.label\n }\n const reg = registry.find((r) => r.value === value)\n return reg?.label\n }, [value, options, registry])\n\n const ids = React.useMemo(\n () => ({\n trigger: `${idBase}-trigger`,\n content: `${idBase}-content`,\n list: `${idBase}-list`,\n input: `${idBase}-input`,\n item: (v: string) => `${idBase}-item-${v}`,\n }),\n [idBase],\n )\n\n // Click-outside to close\n React.useEffect(() => {\n if (!open) return\n if (typeof document === 'undefined') return\n const handler = (e: MouseEvent) => {\n const target = e.target as Node | null\n if (!target) return\n if (contentRef.current?.contains(target)) return\n if (triggerRef.current?.contains(target)) return\n handleOpenChange(false)\n }\n document.addEventListener('mousedown', handler)\n return () => document.removeEventListener('mousedown', handler)\n }, [open, handleOpenChange])\n\n // When opening, default highlight: selected value or first available\n React.useEffect(() => {\n if (!open) return\n if (highlightedValue !== undefined) return\n const candidates = registry.filter(\n (r) => !r.disabled && itemMatchesQuery(r.label, r.value, r.disabled),\n )\n if (candidates.length === 0) return\n const selected = candidates.find((r) => r.value === value)\n setHighlightedValue(selected ? selected.value : candidates[0].value)\n }, [open, highlightedValue, registry, value, itemMatchesQuery])\n\n // When query changes, reset highlight to first match\n React.useEffect(() => {\n if (!open) return\n const candidates = registry.filter(\n (r) => !r.disabled && itemMatchesQuery(r.label, r.value, r.disabled),\n )\n if (candidates.length === 0) {\n setHighlightedValue(undefined)\n return\n }\n if (\n highlightedValue === undefined ||\n !candidates.some((c) => c.value === highlightedValue)\n ) {\n setHighlightedValue(candidates[0].value)\n }\n }, [query, open, registry, itemMatchesQuery, highlightedValue])\n\n const ctx = React.useMemo<ComboboxContextValue>(\n () => ({\n value,\n onValueChange: handleValueChange,\n open,\n setOpen: handleOpenChange,\n query,\n setQuery,\n highlightedValue,\n setHighlightedValue,\n registerItem,\n unregisterItem,\n matches,\n itemMatchesQuery,\n visibleCount,\n setVisibleCount,\n ids,\n disabled,\n options: options ?? [],\n hasOptions: !!options,\n filter,\n selectedLabel,\n triggerRef,\n contentRef,\n inputRef,\n }),\n [\n value,\n handleValueChange,\n open,\n handleOpenChange,\n query,\n highlightedValue,\n registerItem,\n unregisterItem,\n matches,\n itemMatchesQuery,\n visibleCount,\n ids,\n disabled,\n options,\n filter,\n selectedLabel,\n ],\n )\n\n return (\n <ComboboxContext.Provider value={ctx}>{children}</ComboboxContext.Provider>\n )\n}\n\n/* ─── ComboboxTrigger ──────────────────────────────────────────── */\n\nexport interface ComboboxTriggerProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n size?: 'sm' | 'default' | 'lg'\n placeholder?: string\n}\n\nexport const ComboboxTrigger = React.forwardRef<\n HTMLButtonElement,\n ComboboxTriggerProps\n>(function ComboboxTrigger({ className, children, size = 'default', placeholder = 'Select…', ...props }, forwardedRef) {\n const ctx = useComboboxContext()\n const { open, setOpen, disabled, ids, selectedLabel, triggerRef } = ctx\n\n const ref = React.useCallback(\n (node: HTMLButtonElement | null) => {\n triggerRef.current = node\n if (typeof forwardedRef === 'function') forwardedRef(node)\n else if (forwardedRef) forwardedRef.current = node\n },\n [forwardedRef, triggerRef],\n )\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n if (disabled) return\n setOpen(!open)\n props.onClick?.(e)\n }\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLButtonElement>) => {\n if (disabled) return\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n setOpen(!open)\n } else if (e.key === 'Escape') {\n if (open) {\n e.preventDefault()\n setOpen(false)\n }\n } else if ((e.key === 'ArrowDown' || e.key === 'ArrowUp') && !open) {\n e.preventDefault()\n setOpen(true)\n }\n props.onKeyDown?.(e)\n }\n\n const label = children ?? selectedLabel ?? placeholder\n const isPlaceholder = !children && selectedLabel === undefined\n\n return (\n <button\n {...props}\n ref={ref}\n type=\"button\"\n id={ids.trigger}\n role=\"combobox\"\n aria-expanded={open}\n aria-controls={ids.content}\n aria-haspopup=\"listbox\"\n aria-disabled={disabled || undefined}\n data-state={open ? 'open' : 'closed'}\n data-placeholder={isPlaceholder ? '' : undefined}\n disabled={disabled}\n className={cn(comboboxTriggerVariants({ size }), className)}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n >\n <span className={cn('truncate', isPlaceholder && 'text-muted-foreground')}>\n {label}\n </span>\n <svg\n className=\"h-4 w-4 opacity-50 shrink-0\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </button>\n )\n})\n\n/* ─── ComboboxContent ──────────────────────────────────────────── */\n\nexport interface ComboboxContentProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Render content inside a portal (defaults true). */\n portal?: boolean\n}\n\nexport const ComboboxContent = React.forwardRef<HTMLDivElement, ComboboxContentProps>(\n function ComboboxContent({ className, children, portal = true, ...props }, forwardedRef) {\n const ctx = useComboboxContext()\n const { open, ids, contentRef, hasOptions, options, inputRef } = ctx\n\n const ref = React.useCallback(\n (node: HTMLDivElement | null) => {\n contentRef.current = node\n if (typeof forwardedRef === 'function') forwardedRef(node)\n else if (forwardedRef) forwardedRef.current = node\n },\n [forwardedRef, contentRef],\n )\n\n React.useEffect(() => {\n if (open) {\n // Auto-focus the input when opening\n const t = setTimeout(() => inputRef.current?.focus(), 0)\n return () => clearTimeout(t)\n }\n }, [open, inputRef])\n\n if (!open) return null\n\n // If options were supplied via prop and no list children given, render a default list\n const content = (\n <div\n {...props}\n ref={ref}\n id={ids.content}\n data-state={open ? 'open' : 'closed'}\n className={cn(comboboxContentVariants(), className)}\n >\n {children ?? (\n <>\n <ComboboxInput />\n <ComboboxList>\n {hasOptions\n ? options.map((opt) => (\n <ComboboxItem\n key={opt.value}\n value={opt.value}\n disabled={opt.disabled}\n >\n {opt.label}\n </ComboboxItem>\n ))\n : null}\n </ComboboxList>\n <ComboboxEmpty>No results.</ComboboxEmpty>\n </>\n )}\n </div>\n )\n\n if (portal && typeof document !== 'undefined') {\n return createPortal(content, document.body)\n }\n return content\n },\n)\n\n/* ─── ComboboxInput ────────────────────────────────────────────── */\n\nexport interface ComboboxInputProps extends React.InputHTMLAttributes<HTMLInputElement> {}\n\nexport const ComboboxInput = React.forwardRef<HTMLInputElement, ComboboxInputProps>(\n function ComboboxInput({ className, onChange, onKeyDown, placeholder = 'Search…', ...props }, forwardedRef) {\n const ctx = useComboboxContext()\n const {\n query,\n setQuery,\n ids,\n open,\n setOpen,\n highlightedValue,\n setHighlightedValue,\n onValueChange,\n itemMatchesQuery,\n inputRef,\n triggerRef,\n } = ctx\n\n const ref = React.useCallback(\n (node: HTMLInputElement | null) => {\n inputRef.current = node\n if (typeof forwardedRef === 'function') forwardedRef(node)\n else if (forwardedRef) forwardedRef.current = node\n },\n [forwardedRef, inputRef],\n )\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setQuery(e.target.value)\n onChange?.(e)\n }\n\n const getCandidates = (): { value: string; label: string }[] => {\n // Read DOM order from the registry — but registry is in context.\n // Re-derive from contentRef DOM order for stable navigation.\n const root = ctx.contentRef.current\n if (!root) return []\n const els = Array.from(\n root.querySelectorAll<HTMLElement>(\n '[role=\"option\"]:not([data-disabled]):not([data-hidden])',\n ),\n )\n return els.map((el) => ({\n value: el.getAttribute('data-value') ?? '',\n label: el.textContent ?? '',\n }))\n }\n\n const moveHighlight = (delta: number) => {\n const candidates = getCandidates()\n if (candidates.length === 0) {\n setHighlightedValue(undefined)\n return\n }\n const idx = candidates.findIndex((c) => c.value === highlightedValue)\n let next: number\n if (idx === -1) {\n next = delta > 0 ? 0 : candidates.length - 1\n } else {\n next = (idx + delta + candidates.length) % candidates.length\n }\n setHighlightedValue(candidates[next].value)\n }\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'ArrowDown') {\n e.preventDefault()\n moveHighlight(1)\n } else if (e.key === 'ArrowUp') {\n e.preventDefault()\n moveHighlight(-1)\n } else if (e.key === 'Home') {\n e.preventDefault()\n const candidates = getCandidates()\n if (candidates.length) setHighlightedValue(candidates[0].value)\n } else if (e.key === 'End') {\n e.preventDefault()\n const candidates = getCandidates()\n if (candidates.length) setHighlightedValue(candidates[candidates.length - 1].value)\n } else if (e.key === 'Enter') {\n if (highlightedValue !== undefined) {\n e.preventDefault()\n onValueChange(highlightedValue)\n setOpen(false)\n setTimeout(() => triggerRef.current?.focus(), 0)\n }\n } else if (e.key === 'Escape') {\n e.preventDefault()\n setOpen(false)\n setTimeout(() => triggerRef.current?.focus(), 0)\n } else if (e.key === 'Tab') {\n setOpen(false)\n }\n onKeyDown?.(e)\n }\n\n // Suppress unused warning for itemMatchesQuery (used elsewhere via ctx)\n void itemMatchesQuery\n void open\n\n return (\n <input\n {...props}\n ref={ref}\n id={ids.input}\n type=\"text\"\n role=\"combobox\"\n autoComplete=\"off\"\n spellCheck={false}\n aria-autocomplete=\"list\"\n aria-expanded={open}\n aria-controls={ids.list}\n aria-activedescendant={highlightedValue ? ids.item(highlightedValue) : undefined}\n value={query}\n placeholder={placeholder}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n className={cn(comboboxInputVariants(), className)}\n />\n )\n },\n)\n\n/* ─── ComboboxList ─────────────────────────────────────────────── */\n\nexport interface ComboboxListProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nexport const ComboboxList = React.forwardRef<HTMLDivElement, ComboboxListProps>(\n function ComboboxList({ className, children, ...props }, ref) {\n const { ids } = useComboboxContext()\n return (\n <div\n {...props}\n ref={ref}\n id={ids.list}\n role=\"listbox\"\n className={cn(comboboxListVariants(), className)}\n >\n {children}\n </div>\n )\n },\n)\n\n/* ─── ComboboxItem ─────────────────────────────────────────────── */\n\nexport interface ComboboxItemProps extends React.HTMLAttributes<HTMLDivElement> {\n value: string\n disabled?: boolean\n /** Override the label used for filtering (defaults to children text). */\n label?: string\n}\n\nexport const ComboboxItem = React.forwardRef<HTMLDivElement, ComboboxItemProps>(\n function ComboboxItem(\n { className, children, value: itemValue, disabled: itemDisabled = false, label, ...props },\n ref,\n ) {\n const ctx = useComboboxContext()\n const {\n value,\n onValueChange,\n setOpen,\n highlightedValue,\n setHighlightedValue,\n registerItem,\n unregisterItem,\n itemMatchesQuery,\n ids,\n triggerRef,\n } = ctx\n\n const isSelected = value === itemValue\n const itemId = ids.item(itemValue)\n const labelText =\n label ?? (typeof children === 'string' ? children : itemValue)\n\n React.useEffect(() => {\n registerItem({ id: itemId, value: itemValue, disabled: itemDisabled, label: labelText })\n return () => unregisterItem(itemId)\n }, [itemId, itemValue, itemDisabled, labelText, registerItem, unregisterItem])\n\n const matches = itemMatchesQuery(labelText, itemValue, itemDisabled)\n const isHighlighted = highlightedValue === itemValue && matches && !itemDisabled\n\n const handleClick = () => {\n if (itemDisabled) return\n onValueChange(itemValue)\n setOpen(false)\n setTimeout(() => triggerRef.current?.focus(), 0)\n }\n\n const handlePointerMove = () => {\n if (itemDisabled) return\n if (highlightedValue !== itemValue) setHighlightedValue(itemValue)\n }\n\n if (!matches) {\n // Render a hidden placeholder so DOM still contains the option for stable IDs but\n // it is excluded from listbox navigation/queries.\n return (\n <div\n ref={ref}\n id={itemId}\n data-value={itemValue}\n data-hidden=\"\"\n hidden\n aria-hidden=\"true\"\n />\n )\n }\n\n return (\n <div\n {...props}\n ref={ref}\n id={itemId}\n role=\"option\"\n aria-selected={isSelected}\n aria-disabled={itemDisabled || undefined}\n data-value={itemValue}\n data-state={isSelected ? 'checked' : undefined}\n data-highlighted={isHighlighted ? '' : undefined}\n data-disabled={itemDisabled ? '' : undefined}\n className={cn(\n comboboxItemVariants({ selected: isSelected ? 'true' : 'false' }),\n className,\n )}\n onClick={handleClick}\n onPointerMove={handlePointerMove}\n >\n {children}\n </div>\n )\n },\n)\n\n/* ─── ComboboxEmpty ────────────────────────────────────────────── */\n\nexport interface ComboboxEmptyProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nexport const ComboboxEmpty = React.forwardRef<HTMLDivElement, ComboboxEmptyProps>(\n function ComboboxEmpty({ className, children, ...props }, ref) {\n const ctx = useComboboxContext()\n const { contentRef, query, options, hasOptions, filter } = ctx\n\n // Determine whether any option matches.\n // For options-prop mode: filter the prop array.\n // For compound mode: read the DOM in a layout effect.\n const [hasVisible, setHasVisible] = React.useState(true)\n\n React.useEffect(() => {\n if (hasOptions) {\n const visible = options.some((o) =>\n filter({ value: o.value, label: o.label, disabled: o.disabled }, query),\n )\n setHasVisible(visible)\n return\n }\n const root = contentRef.current\n if (!root) {\n setHasVisible(true)\n return\n }\n const els = root.querySelectorAll('[role=\"option\"]:not([data-hidden])')\n setHasVisible(els.length > 0)\n })\n\n if (hasVisible) return null\n\n return (\n <div\n {...props}\n ref={ref}\n role=\"presentation\"\n className={cn(comboboxEmptyVariants(), className)}\n >\n {children ?? 'No results.'}\n </div>\n )\n },\n)\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["ComboboxTrigger", "ComboboxContent", "ComboboxInput", "ComboboxList", "ComboboxItem", "ComboboxEmpty"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import {
|
|
2
|
+
cn
|
|
3
|
+
} from "./chunk-ZF3OHCGV.js";
|
|
4
|
+
|
|
5
|
+
// ../react-command-input/dist/index.js
|
|
6
|
+
import { useRef, useEffect, useState, forwardRef } from "react";
|
|
7
|
+
|
|
8
|
+
// ../command-input/dist/index.js
|
|
9
|
+
var CommandInput = class {
|
|
10
|
+
state = {
|
|
11
|
+
nodes: [],
|
|
12
|
+
rawText: "",
|
|
13
|
+
cursorPosition: 0,
|
|
14
|
+
activeTrigger: null,
|
|
15
|
+
activeCommandText: null
|
|
16
|
+
};
|
|
17
|
+
options;
|
|
18
|
+
constructor(options) {
|
|
19
|
+
this.options = { ...options };
|
|
20
|
+
}
|
|
21
|
+
handleInput(text, cursorPosition) {
|
|
22
|
+
this.state.rawText = text;
|
|
23
|
+
this.state.cursorPosition = cursorPosition;
|
|
24
|
+
this.parseInput();
|
|
25
|
+
this.notifyStateChange();
|
|
26
|
+
}
|
|
27
|
+
handleKeyDown(key, event) {
|
|
28
|
+
if (this.state.activeTrigger) {
|
|
29
|
+
if (key === "Escape") {
|
|
30
|
+
if (event) event.preventDefault();
|
|
31
|
+
this.state.activeTrigger = null;
|
|
32
|
+
this.state.activeCommandText = null;
|
|
33
|
+
if (this.options.onCommandCancel) {
|
|
34
|
+
this.options.onCommandCancel();
|
|
35
|
+
}
|
|
36
|
+
this.notifyStateChange();
|
|
37
|
+
} else if (key === "Enter") {
|
|
38
|
+
if (event) event.preventDefault();
|
|
39
|
+
const trigger = this.state.activeTrigger;
|
|
40
|
+
const text = this.state.activeCommandText || "";
|
|
41
|
+
this.state.activeTrigger = null;
|
|
42
|
+
this.state.activeCommandText = null;
|
|
43
|
+
if (this.options.onCommandCommit) {
|
|
44
|
+
this.options.onCommandCommit(trigger, text);
|
|
45
|
+
}
|
|
46
|
+
this.notifyStateChange();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
get value() {
|
|
51
|
+
return this.state.nodes;
|
|
52
|
+
}
|
|
53
|
+
getState() {
|
|
54
|
+
return { ...this.state };
|
|
55
|
+
}
|
|
56
|
+
parseInput() {
|
|
57
|
+
const { rawText, cursorPosition } = this.state;
|
|
58
|
+
this.state.activeTrigger = null;
|
|
59
|
+
this.state.activeCommandText = null;
|
|
60
|
+
for (let i = cursorPosition - 1; i >= 0; i--) {
|
|
61
|
+
const char = rawText[i];
|
|
62
|
+
const matchedTrigger = this.options.triggers.find((t) => t.char === char);
|
|
63
|
+
if (matchedTrigger) {
|
|
64
|
+
const isStartOfWord = i === 0 || /\s/.test(rawText[i - 1]);
|
|
65
|
+
if (isStartOfWord) {
|
|
66
|
+
const commandText = rawText.slice(i + 1, cursorPosition);
|
|
67
|
+
if (!/\s/.test(commandText)) {
|
|
68
|
+
let isValid = true;
|
|
69
|
+
if (matchedTrigger.pattern) {
|
|
70
|
+
isValid = matchedTrigger.pattern.test(commandText);
|
|
71
|
+
}
|
|
72
|
+
if (isValid) {
|
|
73
|
+
this.state.activeTrigger = matchedTrigger;
|
|
74
|
+
this.state.activeCommandText = commandText;
|
|
75
|
+
if (this.options.onCommandTriggered) {
|
|
76
|
+
this.options.onCommandTriggered(matchedTrigger, commandText);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
if (/\s/.test(char)) {
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
const nodes = [];
|
|
88
|
+
if (this.options.triggers.length === 0) {
|
|
89
|
+
nodes.push({ type: "text", text: rawText });
|
|
90
|
+
this.state.nodes = nodes;
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
const triggerChars = this.options.triggers.map((t) => t.char.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"));
|
|
94
|
+
const patternStr = `(^|\\s)(${triggerChars.join("|")})([^\\s]*)`;
|
|
95
|
+
const regex = new RegExp(patternStr, "g");
|
|
96
|
+
let currentIndex = 0;
|
|
97
|
+
let match;
|
|
98
|
+
while ((match = regex.exec(rawText)) !== null) {
|
|
99
|
+
const precedingWhitespace = match[1];
|
|
100
|
+
const triggerChar = match[2];
|
|
101
|
+
const commandText = match[3];
|
|
102
|
+
const matchStart = match.index;
|
|
103
|
+
const triggerStart = matchStart + precedingWhitespace.length;
|
|
104
|
+
const triggerConfig = this.options.triggers.find((t) => t.char === triggerChar);
|
|
105
|
+
let isValid = true;
|
|
106
|
+
if (triggerConfig?.pattern && commandText.length > 0) {
|
|
107
|
+
isValid = triggerConfig.pattern.test(commandText);
|
|
108
|
+
}
|
|
109
|
+
if (isValid) {
|
|
110
|
+
if (triggerStart > currentIndex) {
|
|
111
|
+
nodes.push({ type: "text", text: rawText.slice(currentIndex, triggerStart) });
|
|
112
|
+
}
|
|
113
|
+
nodes.push({ type: "command", trigger: triggerChar, text: commandText });
|
|
114
|
+
currentIndex = regex.lastIndex;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
if (currentIndex < rawText.length) {
|
|
118
|
+
nodes.push({ type: "text", text: rawText.slice(currentIndex) });
|
|
119
|
+
}
|
|
120
|
+
this.state.nodes = nodes;
|
|
121
|
+
}
|
|
122
|
+
notifyStateChange() {
|
|
123
|
+
if (this.options.onStateChange) {
|
|
124
|
+
this.options.onStateChange({ ...this.state });
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
// ../react-command-input/dist/index.js
|
|
130
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
131
|
+
var CommandInput2 = forwardRef(
|
|
132
|
+
function CommandInput22({
|
|
133
|
+
value = "",
|
|
134
|
+
onChange,
|
|
135
|
+
triggers = [],
|
|
136
|
+
renderPopover,
|
|
137
|
+
className,
|
|
138
|
+
...props
|
|
139
|
+
}, ref) {
|
|
140
|
+
const localRef = useRef(null);
|
|
141
|
+
const containerRef = ref || localRef;
|
|
142
|
+
const [popoverState, setPopoverState] = useState({
|
|
143
|
+
isOpen: false,
|
|
144
|
+
trigger: "",
|
|
145
|
+
search: "",
|
|
146
|
+
position: { top: 0, left: 0 }
|
|
147
|
+
});
|
|
148
|
+
const coreRef = useRef(null);
|
|
149
|
+
useEffect(() => {
|
|
150
|
+
if (containerRef.current && !coreRef.current) {
|
|
151
|
+
coreRef.current = new CommandInput({
|
|
152
|
+
triggers,
|
|
153
|
+
onCommandTriggered: (trigger, search) => {
|
|
154
|
+
setPopoverState({
|
|
155
|
+
isOpen: true,
|
|
156
|
+
trigger: trigger.char,
|
|
157
|
+
search,
|
|
158
|
+
position: { top: 0, left: 0 }
|
|
159
|
+
});
|
|
160
|
+
},
|
|
161
|
+
onCommandCancel: () => {
|
|
162
|
+
setPopoverState((prev) => ({ ...prev, isOpen: false }));
|
|
163
|
+
},
|
|
164
|
+
onStateChange: (state) => {
|
|
165
|
+
onChange?.(state.rawText);
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
}, [triggers, onChange]);
|
|
170
|
+
useEffect(() => {
|
|
171
|
+
if (containerRef.current && containerRef.current.innerHTML !== value && coreRef.current) {
|
|
172
|
+
containerRef.current.innerHTML = value;
|
|
173
|
+
}
|
|
174
|
+
}, [value]);
|
|
175
|
+
return /* @__PURE__ */ jsxs("div", { className: cn("relative w-full", className), children: [
|
|
176
|
+
/* @__PURE__ */ jsx(
|
|
177
|
+
"div",
|
|
178
|
+
{
|
|
179
|
+
ref: containerRef,
|
|
180
|
+
contentEditable: true,
|
|
181
|
+
suppressContentEditableWarning: true,
|
|
182
|
+
className: "w-full min-h-[40px] p-2 border border-gray-300 rounded focus:outline-none focus:ring-2 focus:ring-blue-500",
|
|
183
|
+
onInput: (e) => {
|
|
184
|
+
coreRef.current?.handleInput(e.currentTarget.textContent || "", 0);
|
|
185
|
+
},
|
|
186
|
+
onKeyDown: (e) => {
|
|
187
|
+
coreRef.current?.handleKeyDown(e.key, e);
|
|
188
|
+
},
|
|
189
|
+
...props
|
|
190
|
+
}
|
|
191
|
+
),
|
|
192
|
+
renderPopover && renderPopover({
|
|
193
|
+
...popoverState,
|
|
194
|
+
close: () => setPopoverState((prev) => ({ ...prev, isOpen: false }))
|
|
195
|
+
})
|
|
196
|
+
] });
|
|
197
|
+
}
|
|
198
|
+
);
|
|
199
|
+
export {
|
|
200
|
+
CommandInput2 as CommandInput
|
|
201
|
+
};
|
|
202
|
+
//# sourceMappingURL=react-command-input.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../react-command-input/dist/index.js", "../../command-input/src/command-input.ts"],
|
|
4
|
+
"sourcesContent": ["// src/command-input.tsx\nimport { useRef, useEffect, useState, forwardRef } from \"react\";\nimport { CommandInput as CommandInputCore } from \"@refraction-ui/command-input\";\nimport { cn } from \"@refraction-ui/shared\";\nimport { jsx, jsxs } from \"react/jsx-runtime\";\nvar CommandInput = forwardRef(\n function CommandInput2({\n value = \"\",\n onChange,\n triggers = [],\n renderPopover,\n className,\n ...props\n }, ref) {\n const localRef = useRef(null);\n const containerRef = ref || localRef;\n const [popoverState, setPopoverState] = useState({\n isOpen: false,\n trigger: \"\",\n search: \"\",\n position: { top: 0, left: 0 }\n });\n const coreRef = useRef(null);\n useEffect(() => {\n if (containerRef.current && !coreRef.current) {\n coreRef.current = new CommandInputCore({\n triggers,\n onCommandTriggered: (trigger, search) => {\n setPopoverState({\n isOpen: true,\n trigger: trigger.char,\n search,\n position: { top: 0, left: 0 }\n });\n },\n onCommandCancel: () => {\n setPopoverState((prev) => ({ ...prev, isOpen: false }));\n },\n onStateChange: (state) => {\n onChange?.(state.rawText);\n }\n });\n }\n }, [triggers, onChange]);\n useEffect(() => {\n if (containerRef.current && containerRef.current.innerHTML !== value && coreRef.current) {\n containerRef.current.innerHTML = value;\n }\n }, [value]);\n return /* @__PURE__ */ jsxs(\"div\", { className: cn(\"relative w-full\", className), children: [\n /* @__PURE__ */ jsx(\n \"div\",\n {\n ref: containerRef,\n contentEditable: true,\n suppressContentEditableWarning: true,\n className: \"w-full min-h-[40px] p-2 border border-gray-300 rounded focus:outline-none focus:ring-2 focus:ring-blue-500\",\n onInput: (e) => {\n coreRef.current?.handleInput(e.currentTarget.textContent || \"\", 0);\n },\n onKeyDown: (e) => {\n coreRef.current?.handleKeyDown(e.key, e);\n },\n ...props\n }\n ),\n renderPopover && renderPopover({\n ...popoverState,\n close: () => setPopoverState((prev) => ({ ...prev, isOpen: false }))\n })\n ] });\n }\n);\nexport {\n CommandInput\n};\n", "export interface Trigger {\n char: string;\n pattern?: RegExp;\n}\n\nexport interface CommandNode {\n type: 'command';\n trigger: string;\n text: string;\n}\n\nexport interface TextNode {\n type: 'text';\n text: string;\n}\n\nexport type InputNode = TextNode | CommandNode;\n\nexport interface CommandInputState {\n nodes: InputNode[];\n rawText: string;\n cursorPosition: number;\n activeTrigger: Trigger | null;\n activeCommandText: string | null;\n}\n\nexport interface CommandInputOptions {\n triggers: Trigger[];\n onCommandTriggered?: (trigger: Trigger, text: string) => void;\n onStateChange?: (state: CommandInputState) => void;\n onCommandCommit?: (trigger: Trigger, text: string) => void;\n onCommandCancel?: () => void;\n}\n\n/**\n * Minimal keyboard-event surface {@link CommandInput.handleKeyDown} needs.\n * DOM `KeyboardEvent`s and framework synthetic events (e.g. React's) both\n * satisfy this structurally, so adapters can pass their events without casts.\n */\nexport interface CommandKeyEvent {\n preventDefault(): void;\n}\n\nexport class CommandInput {\n private state: CommandInputState = {\n nodes: [],\n rawText: '',\n cursorPosition: 0,\n activeTrigger: null,\n activeCommandText: null,\n };\n\n private options: CommandInputOptions;\n\n constructor(options: CommandInputOptions) {\n this.options = { ...options };\n }\n\n public handleInput(text: string, cursorPosition: number): void {\n this.state.rawText = text;\n this.state.cursorPosition = cursorPosition;\n this.parseInput();\n this.notifyStateChange();\n }\n\n public handleKeyDown(key: string, event?: CommandKeyEvent): void {\n if (this.state.activeTrigger) {\n if (key === 'Escape') {\n if (event) event.preventDefault();\n this.state.activeTrigger = null;\n this.state.activeCommandText = null;\n if (this.options.onCommandCancel) {\n this.options.onCommandCancel();\n }\n this.notifyStateChange();\n } else if (key === 'Enter') {\n if (event) event.preventDefault();\n const trigger = this.state.activeTrigger;\n const text = this.state.activeCommandText || '';\n this.state.activeTrigger = null;\n this.state.activeCommandText = null;\n if (this.options.onCommandCommit) {\n this.options.onCommandCommit(trigger, text);\n }\n this.notifyStateChange();\n }\n }\n }\n\n public get value(): InputNode[] {\n return this.state.nodes;\n }\n\n public getState(): CommandInputState {\n return { ...this.state };\n }\n\n private parseInput() {\n const { rawText, cursorPosition } = this.state;\n\n this.state.activeTrigger = null;\n this.state.activeCommandText = null;\n\n for (let i = cursorPosition - 1; i >= 0; i--) {\n const char = rawText[i];\n const matchedTrigger = this.options.triggers.find((t) => t.char === char);\n\n if (matchedTrigger) {\n const isStartOfWord = i === 0 || /\\s/.test(rawText[i - 1]);\n if (isStartOfWord) {\n const commandText = rawText.slice(i + 1, cursorPosition);\n if (!/\\s/.test(commandText)) {\n let isValid = true;\n if (matchedTrigger.pattern) {\n isValid = matchedTrigger.pattern.test(commandText);\n }\n if (isValid) {\n this.state.activeTrigger = matchedTrigger;\n this.state.activeCommandText = commandText;\n \n if (this.options.onCommandTriggered) {\n this.options.onCommandTriggered(matchedTrigger, commandText);\n }\n }\n }\n }\n break;\n }\n \n if (/\\s/.test(char)) {\n break;\n }\n }\n\n const nodes: InputNode[] = [];\n if (this.options.triggers.length === 0) {\n nodes.push({ type: 'text', text: rawText });\n this.state.nodes = nodes;\n return;\n }\n\n const triggerChars = this.options.triggers.map((t) => t.char.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'));\n const patternStr = `(^|\\\\s)(${triggerChars.join('|')})([^\\\\s]*)`;\n const regex = new RegExp(patternStr, 'g');\n \n let currentIndex = 0;\n let match;\n\n while ((match = regex.exec(rawText)) !== null) {\n const precedingWhitespace = match[1];\n const triggerChar = match[2];\n const commandText = match[3];\n\n const matchStart = match.index;\n const triggerStart = matchStart + precedingWhitespace.length;\n\n const triggerConfig = this.options.triggers.find(t => t.char === triggerChar);\n let isValid = true;\n if (triggerConfig?.pattern && commandText.length > 0) {\n isValid = triggerConfig.pattern.test(commandText);\n }\n\n if (isValid) {\n if (triggerStart > currentIndex) {\n nodes.push({ type: 'text', text: rawText.slice(currentIndex, triggerStart) });\n }\n\n nodes.push({ type: 'command', trigger: triggerChar, text: commandText });\n currentIndex = regex.lastIndex;\n }\n }\n\n if (currentIndex < rawText.length) {\n nodes.push({ type: 'text', text: rawText.slice(currentIndex) });\n }\n\n this.state.nodes = nodes;\n }\n\n private notifyStateChange() {\n if (this.options.onStateChange) {\n this.options.onStateChange({ ...this.state });\n }\n }\n}"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["CommandInput", "CommandInput2"]
|
|
7
|
+
}
|