@flanksource/clicky-ui 0.2.19 → 0.2.20
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/ai.cjs +26 -0
- package/dist/ai.cjs.map +1 -0
- package/dist/ai.d.ts +2 -0
- package/dist/ai.d.ts.map +1 -0
- package/dist/ai.js +26 -0
- package/dist/ai.js.map +1 -0
- package/dist/chat.cjs +7 -0
- package/dist/chat.cjs.map +1 -1
- package/dist/chat.js +7 -0
- package/dist/chat.js.map +1 -1
- package/dist/components/FilterBar.cjs +49 -18
- package/dist/components/FilterBar.cjs.map +1 -1
- package/dist/components/FilterBar.d.ts +0 -2
- package/dist/components/FilterBar.d.ts.map +1 -1
- package/dist/components/FilterBar.js +50 -19
- package/dist/components/FilterBar.js.map +1 -1
- package/dist/components/SearchInput.cjs +63 -0
- package/dist/components/SearchInput.cjs.map +1 -0
- package/dist/components/SearchInput.d.ts +31 -0
- package/dist/components/SearchInput.d.ts.map +1 -0
- package/dist/components/SearchInput.js +63 -0
- package/dist/components/SearchInput.js.map +1 -0
- package/dist/components/SegmentedControl.cjs +88 -0
- package/dist/components/SegmentedControl.cjs.map +1 -0
- package/dist/components/SegmentedControl.d.ts +38 -0
- package/dist/components/SegmentedControl.d.ts.map +1 -0
- package/dist/components/SegmentedControl.js +88 -0
- package/dist/components/SegmentedControl.js.map +1 -0
- package/dist/components/Switch.cjs +51 -0
- package/dist/components/Switch.cjs.map +1 -0
- package/dist/components/Switch.d.ts +23 -0
- package/dist/components/Switch.d.ts.map +1 -0
- package/dist/components/Switch.js +51 -0
- package/dist/components/Switch.js.map +1 -0
- package/dist/components/TimeRange.cjs +53 -45
- package/dist/components/TimeRange.cjs.map +1 -1
- package/dist/components/TimeRange.d.ts.map +1 -1
- package/dist/components/TimeRange.js +53 -45
- package/dist/components/TimeRange.js.map +1 -1
- package/dist/components/TreePickerField.cjs +5 -1
- package/dist/components/TreePickerField.cjs.map +1 -1
- package/dist/components/TreePickerField.d.ts.map +1 -1
- package/dist/components/TreePickerField.js +5 -1
- package/dist/components/TreePickerField.js.map +1 -1
- package/dist/components/filter-bar-utils.cjs +5 -0
- package/dist/components/filter-bar-utils.cjs.map +1 -1
- package/dist/components/filter-bar-utils.d.ts +2 -0
- package/dist/components/filter-bar-utils.d.ts.map +1 -1
- package/dist/components/filter-bar-utils.js +5 -0
- package/dist/components/filter-bar-utils.js.map +1 -1
- package/dist/components/json-schema-form-fields.cjs +8 -2
- package/dist/components/json-schema-form-fields.cjs.map +1 -1
- package/dist/components/json-schema-form-fields.d.ts.map +1 -1
- package/dist/components/json-schema-form-fields.js +8 -2
- package/dist/components/json-schema-form-fields.js.map +1 -1
- package/dist/components/json-schema-form-resolve.cjs +1 -1
- package/dist/components/json-schema-form-resolve.cjs.map +1 -1
- package/dist/components/json-schema-form-resolve.js +1 -1
- package/dist/components/json-schema-form-resolve.js.map +1 -1
- package/dist/components.cjs +15 -1
- package/dist/components.cjs.map +1 -1
- package/dist/components.d.ts +8 -1
- package/dist/components.d.ts.map +1 -1
- package/dist/components.js +15 -1
- package/dist/components.js.map +1 -1
- package/dist/data/Clicky.cjs +33 -44
- package/dist/data/Clicky.cjs.map +1 -1
- package/dist/data/Clicky.d.ts +0 -9
- package/dist/data/Clicky.d.ts.map +1 -1
- package/dist/data/Clicky.js +31 -42
- package/dist/data/Clicky.js.map +1 -1
- package/dist/data/DataTable.cjs +73 -50
- package/dist/data/DataTable.cjs.map +1 -1
- package/dist/data/DataTable.d.ts +4 -0
- package/dist/data/DataTable.d.ts.map +1 -1
- package/dist/data/DataTable.js +73 -50
- package/dist/data/DataTable.js.map +1 -1
- package/dist/data/Icon.cjs +2 -5
- package/dist/data/Icon.cjs.map +1 -1
- package/dist/data/Icon.d.ts +1 -21
- package/dist/data/Icon.d.ts.map +1 -1
- package/dist/data/Icon.js +3 -6
- package/dist/data/Icon.js.map +1 -1
- package/dist/data/MatrixTable.cjs +4 -4
- package/dist/data/MatrixTable.cjs.map +1 -1
- package/dist/data/MatrixTable.js +4 -4
- package/dist/data/MatrixTable.js.map +1 -1
- package/dist/data/RadialGauge.cjs +76 -0
- package/dist/data/RadialGauge.cjs.map +1 -0
- package/dist/data/RadialGauge.d.ts +24 -0
- package/dist/data/RadialGauge.d.ts.map +1 -0
- package/dist/data/RadialGauge.js +76 -0
- package/dist/data/RadialGauge.js.map +1 -0
- package/dist/data/StatusBreakdown.cjs +0 -4
- package/dist/data/StatusBreakdown.cjs.map +1 -1
- package/dist/data/StatusBreakdown.d.ts +0 -2
- package/dist/data/StatusBreakdown.d.ts.map +1 -1
- package/dist/data/StatusBreakdown.js +1 -5
- package/dist/data/StatusBreakdown.js.map +1 -1
- package/dist/data/Timeline.cjs +61 -0
- package/dist/data/Timeline.cjs.map +1 -0
- package/dist/data/Timeline.d.ts +36 -0
- package/dist/data/Timeline.d.ts.map +1 -0
- package/dist/data/Timeline.js +61 -0
- package/dist/data/Timeline.js.map +1 -0
- package/dist/data/TimeseriesCoreBars.cjs +2 -25
- package/dist/data/TimeseriesCoreBars.cjs.map +1 -1
- package/dist/data/TimeseriesCoreBars.d.ts +0 -19
- package/dist/data/TimeseriesCoreBars.d.ts.map +1 -1
- package/dist/data/TimeseriesCoreBars.js +2 -25
- package/dist/data/TimeseriesCoreBars.js.map +1 -1
- package/dist/data/TimeseriesCoreBars.model.cjs +27 -0
- package/dist/data/TimeseriesCoreBars.model.cjs.map +1 -0
- package/dist/data/TimeseriesCoreBars.model.d.ts +20 -0
- package/dist/data/TimeseriesCoreBars.model.d.ts.map +1 -0
- package/dist/data/TimeseriesCoreBars.model.js +27 -0
- package/dist/data/TimeseriesCoreBars.model.js.map +1 -0
- package/dist/data/TimeseriesPanel.axes.cjs.map +1 -1
- package/dist/data/TimeseriesPanel.axes.d.ts +1 -1
- package/dist/data/TimeseriesPanel.axes.d.ts.map +1 -1
- package/dist/data/TimeseriesPanel.axes.js.map +1 -1
- package/dist/data/TimeseriesPanel.cjs +4 -54
- package/dist/data/TimeseriesPanel.cjs.map +1 -1
- package/dist/data/TimeseriesPanel.d.ts +2 -138
- package/dist/data/TimeseriesPanel.d.ts.map +1 -1
- package/dist/data/TimeseriesPanel.js +2 -52
- package/dist/data/TimeseriesPanel.js.map +1 -1
- package/dist/data/TimeseriesPanel.model.cjs +53 -0
- package/dist/data/TimeseriesPanel.model.cjs.map +1 -0
- package/dist/data/TimeseriesPanel.model.d.ts +88 -0
- package/dist/data/TimeseriesPanel.model.d.ts.map +1 -0
- package/dist/data/TimeseriesPanel.model.js +53 -0
- package/dist/data/TimeseriesPanel.model.js.map +1 -0
- package/dist/data/Tree.cjs +1 -1
- package/dist/data/Tree.cjs.map +1 -1
- package/dist/data/Tree.js +1 -1
- package/dist/data/Tree.js.map +1 -1
- package/dist/data/ai/ChatFab.cjs +29 -0
- package/dist/data/ai/ChatFab.cjs.map +1 -0
- package/dist/data/ai/ChatFab.d.ts +12 -0
- package/dist/data/ai/ChatFab.d.ts.map +1 -0
- package/dist/data/ai/ChatFab.js +29 -0
- package/dist/data/ai/ChatFab.js.map +1 -0
- package/dist/data/ai/ChatWindow.cjs +178 -0
- package/dist/data/ai/ChatWindow.cjs.map +1 -0
- package/dist/data/ai/ChatWindow.d.ts +38 -0
- package/dist/data/ai/ChatWindow.d.ts.map +1 -0
- package/dist/data/ai/ChatWindow.js +156 -0
- package/dist/data/ai/ChatWindow.js.map +1 -0
- package/dist/data/ai/ChatWindowManager.cjs +139 -0
- package/dist/data/ai/ChatWindowManager.cjs.map +1 -0
- package/dist/data/ai/ChatWindowManager.d.ts +12 -0
- package/dist/data/ai/ChatWindowManager.d.ts.map +1 -0
- package/dist/data/ai/ChatWindowManager.js +139 -0
- package/dist/data/ai/ChatWindowManager.js.map +1 -0
- package/dist/data/ai/ContextBadges.cjs +74 -0
- package/dist/data/ai/ContextBadges.cjs.map +1 -0
- package/dist/data/ai/ContextBadges.d.ts +16 -0
- package/dist/data/ai/ContextBadges.d.ts.map +1 -0
- package/dist/data/ai/ContextBadges.js +74 -0
- package/dist/data/ai/ContextBadges.js.map +1 -0
- package/dist/data/ai/ThreadPicker.cjs +148 -0
- package/dist/data/ai/ThreadPicker.cjs.map +1 -0
- package/dist/data/ai/ThreadPicker.d.ts +37 -0
- package/dist/data/ai/ThreadPicker.d.ts.map +1 -0
- package/dist/data/ai/ThreadPicker.js +148 -0
- package/dist/data/ai/ThreadPicker.js.map +1 -0
- package/dist/data/ai/ToolPreferences.cjs +80 -0
- package/dist/data/ai/ToolPreferences.cjs.map +1 -0
- package/dist/data/ai/ToolPreferences.d.ts +19 -0
- package/dist/data/ai/ToolPreferences.d.ts.map +1 -0
- package/dist/data/ai/ToolPreferences.js +80 -0
- package/dist/data/ai/ToolPreferences.js.map +1 -0
- package/dist/data/ai/chat-window-context.cjs +78 -0
- package/dist/data/ai/chat-window-context.cjs.map +1 -0
- package/dist/data/ai/chat-window-context.d.ts +57 -0
- package/dist/data/ai/chat-window-context.d.ts.map +1 -0
- package/dist/data/ai/chat-window-context.js +78 -0
- package/dist/data/ai/chat-window-context.js.map +1 -0
- package/dist/data/ai/context.cjs +43 -0
- package/dist/data/ai/context.cjs.map +1 -0
- package/dist/data/ai/context.d.ts +35 -0
- package/dist/data/ai/context.d.ts.map +1 -0
- package/dist/data/ai/context.js +43 -0
- package/dist/data/ai/context.js.map +1 -0
- package/dist/data/ai/index.d.ts +10 -0
- package/dist/data/ai/index.d.ts.map +1 -0
- package/dist/data/cache-browser/CacheDetailPanel.cjs +15 -0
- package/dist/data/cache-browser/CacheDetailPanel.cjs.map +1 -1
- package/dist/data/cache-browser/CacheDetailPanel.d.ts.map +1 -1
- package/dist/data/cache-browser/CacheDetailPanel.js +15 -0
- package/dist/data/cache-browser/CacheDetailPanel.js.map +1 -1
- package/dist/data/cache-browser/cache-browser.fixtures.d.ts +10 -0
- package/dist/data/cache-browser/cache-browser.fixtures.d.ts.map +1 -0
- package/dist/data/cache-browser/download.cjs +13 -0
- package/dist/data/cache-browser/download.cjs.map +1 -0
- package/dist/data/cache-browser/download.d.ts +3 -0
- package/dist/data/cache-browser/download.d.ts.map +1 -0
- package/dist/data/cache-browser/download.js +13 -0
- package/dist/data/cache-browser/download.js.map +1 -0
- package/dist/data/chat/Chat.cjs +40 -2
- package/dist/data/chat/Chat.cjs.map +1 -1
- package/dist/data/chat/Chat.d.ts +5 -2
- package/dist/data/chat/Chat.d.ts.map +1 -1
- package/dist/data/chat/Chat.fixtures.cjs +86 -0
- package/dist/data/chat/Chat.fixtures.cjs.map +1 -0
- package/dist/data/chat/Chat.fixtures.d.ts +4 -0
- package/dist/data/chat/Chat.fixtures.d.ts.map +1 -1
- package/dist/data/chat/Chat.fixtures.js +86 -0
- package/dist/data/chat/Chat.fixtures.js.map +1 -0
- package/dist/data/chat/Chat.js +41 -3
- package/dist/data/chat/Chat.js.map +1 -1
- package/dist/data/chat/ContextUsage.cjs +99 -0
- package/dist/data/chat/ContextUsage.cjs.map +1 -0
- package/dist/data/chat/ContextUsage.d.ts +19 -0
- package/dist/data/chat/ContextUsage.d.ts.map +1 -0
- package/dist/data/chat/ContextUsage.js +99 -0
- package/dist/data/chat/ContextUsage.js.map +1 -0
- package/dist/data/chat/ModelSelector.cjs +28 -14
- package/dist/data/chat/ModelSelector.cjs.map +1 -1
- package/dist/data/chat/ModelSelector.d.ts +5 -4
- package/dist/data/chat/ModelSelector.d.ts.map +1 -1
- package/dist/data/chat/ModelSelector.js +28 -14
- package/dist/data/chat/ModelSelector.js.map +1 -1
- package/dist/data/chat/clickyOperationsToTools.cjs +21 -1
- package/dist/data/chat/clickyOperationsToTools.cjs.map +1 -1
- package/dist/data/chat/clickyOperationsToTools.d.ts +5 -4
- package/dist/data/chat/clickyOperationsToTools.d.ts.map +1 -1
- package/dist/data/chat/clickyOperationsToTools.js +21 -1
- package/dist/data/chat/clickyOperationsToTools.js.map +1 -1
- package/dist/data/chat/index.d.ts +4 -1
- package/dist/data/chat/index.d.ts.map +1 -1
- package/dist/data/chat/provider-icons.cjs +15 -0
- package/dist/data/chat/provider-icons.cjs.map +1 -0
- package/dist/data/chat/provider-icons.d.ts +7 -0
- package/dist/data/chat/provider-icons.d.ts.map +1 -0
- package/dist/data/chat/provider-icons.js +15 -0
- package/dist/data/chat/provider-icons.js.map +1 -0
- package/dist/data/chat/types.cjs.map +1 -1
- package/dist/data/chat/types.d.ts +41 -9
- package/dist/data/chat/types.d.ts.map +1 -1
- package/dist/data/chat/types.js.map +1 -1
- package/dist/data/clicky-parse.cjs +42 -0
- package/dist/data/clicky-parse.cjs.map +1 -0
- package/dist/data/clicky-parse.d.ts +11 -0
- package/dist/data/clicky-parse.d.ts.map +1 -0
- package/dist/data/clicky-parse.js +42 -0
- package/dist/data/clicky-parse.js.map +1 -0
- package/dist/data/diagnostics/FrameSourceWindow.cjs +0 -4
- package/dist/data/diagnostics/FrameSourceWindow.cjs.map +1 -1
- package/dist/data/diagnostics/FrameSourceWindow.d.ts +1 -11
- package/dist/data/diagnostics/FrameSourceWindow.d.ts.map +1 -1
- package/dist/data/diagnostics/FrameSourceWindow.js +1 -5
- package/dist/data/diagnostics/FrameSourceWindow.js.map +1 -1
- package/dist/data/diagnostics/FrameSourceWindow.utils.cjs +7 -0
- package/dist/data/diagnostics/FrameSourceWindow.utils.cjs.map +1 -0
- package/dist/data/diagnostics/FrameSourceWindow.utils.d.ts +12 -0
- package/dist/data/diagnostics/FrameSourceWindow.utils.d.ts.map +1 -0
- package/dist/data/diagnostics/FrameSourceWindow.utils.js +7 -0
- package/dist/data/diagnostics/FrameSourceWindow.utils.js.map +1 -0
- package/dist/data/diagnostics/JvmStackTrace.cjs +2 -1
- package/dist/data/diagnostics/JvmStackTrace.cjs.map +1 -1
- package/dist/data/diagnostics/JvmStackTrace.d.ts.map +1 -1
- package/dist/data/diagnostics/JvmStackTrace.js +2 -1
- package/dist/data/diagnostics/JvmStackTrace.js.map +1 -1
- package/dist/data/icon-fallback.cjs +12 -0
- package/dist/data/icon-fallback.cjs.map +1 -0
- package/dist/data/icon-fallback.d.ts +19 -0
- package/dist/data/icon-fallback.d.ts.map +1 -0
- package/dist/data/icon-fallback.js +12 -0
- package/dist/data/icon-fallback.js.map +1 -0
- package/dist/data/status-breakdown-utils.cjs +7 -0
- package/dist/data/status-breakdown-utils.cjs.map +1 -0
- package/dist/data/status-breakdown-utils.d.ts +4 -0
- package/dist/data/status-breakdown-utils.d.ts.map +1 -0
- package/dist/data/status-breakdown-utils.js +7 -0
- package/dist/data/status-breakdown-utils.js.map +1 -0
- package/dist/data/test-runner/TestRunSummary.cjs +36 -0
- package/dist/data/test-runner/TestRunSummary.cjs.map +1 -1
- package/dist/data/test-runner/TestRunSummary.d.ts +7 -1
- package/dist/data/test-runner/TestRunSummary.d.ts.map +1 -1
- package/dist/data/test-runner/TestRunSummary.js +36 -0
- package/dist/data/test-runner/TestRunSummary.js.map +1 -1
- package/dist/data/test-runner/TestRunner.cjs +5 -3
- package/dist/data/test-runner/TestRunner.cjs.map +1 -1
- package/dist/data/test-runner/TestRunner.d.ts +13 -1
- package/dist/data/test-runner/TestRunner.d.ts.map +1 -1
- package/dist/data/test-runner/TestRunner.js +5 -3
- package/dist/data/test-runner/TestRunner.js.map +1 -1
- package/dist/data/version-info.cjs +2 -2
- package/dist/data/version-info.js +2 -2
- package/dist/data.cjs +19 -6
- package/dist/data.cjs.map +1 -1
- package/dist/data.d.ts +13 -5
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +18 -5
- package/dist/data.js.map +1 -1
- package/dist/index.cjs +51 -7
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +50 -6
- package/dist/index.js.map +1 -1
- package/dist/layout/AppShell.cjs +179 -29
- package/dist/layout/AppShell.cjs.map +1 -1
- package/dist/layout/AppShell.d.ts +5 -5
- package/dist/layout/AppShell.d.ts.map +1 -1
- package/dist/layout/AppShell.js +179 -29
- package/dist/layout/AppShell.js.map +1 -1
- package/dist/layout/AppSidebar.cjs +239 -0
- package/dist/layout/AppSidebar.cjs.map +1 -0
- package/dist/layout/AppSidebar.d.ts +62 -0
- package/dist/layout/AppSidebar.d.ts.map +1 -0
- package/dist/layout/AppSidebar.js +239 -0
- package/dist/layout/AppSidebar.js.map +1 -0
- package/dist/overlay/DropdownMenu.cjs.map +1 -1
- package/dist/overlay/DropdownMenu.d.ts.map +1 -1
- package/dist/overlay/DropdownMenu.js.map +1 -1
- package/dist/overlay/Modal.cjs +4 -2
- package/dist/overlay/Modal.cjs.map +1 -1
- package/dist/overlay/Modal.d.ts +1 -1
- package/dist/overlay/Modal.d.ts.map +1 -1
- package/dist/overlay/Modal.js +4 -2
- package/dist/overlay/Modal.js.map +1 -1
- package/dist/overlay/Toast.cjs +89 -0
- package/dist/overlay/Toast.cjs.map +1 -0
- package/dist/overlay/Toast.d.ts +14 -0
- package/dist/overlay/Toast.d.ts.map +1 -0
- package/dist/overlay/Toast.js +89 -0
- package/dist/overlay/Toast.js.map +1 -0
- package/dist/overlay/toast-context.cjs +12 -0
- package/dist/overlay/toast-context.cjs.map +1 -0
- package/dist/overlay/toast-context.d.ts +24 -0
- package/dist/overlay/toast-context.d.ts.map +1 -0
- package/dist/overlay/toast-context.js +12 -0
- package/dist/overlay/toast-context.js.map +1 -0
- package/dist/rpc/AcceptPicker.cjs +81 -58
- package/dist/rpc/AcceptPicker.cjs.map +1 -1
- package/dist/rpc/AcceptPicker.d.ts.map +1 -1
- package/dist/rpc/AcceptPicker.js +81 -58
- package/dist/rpc/AcceptPicker.js.map +1 -1
- package/dist/rpc/CommandForm.cjs +5 -35
- package/dist/rpc/CommandForm.cjs.map +1 -1
- package/dist/rpc/CommandForm.d.ts +0 -3
- package/dist/rpc/CommandForm.d.ts.map +1 -1
- package/dist/rpc/CommandForm.js +2 -32
- package/dist/rpc/CommandForm.js.map +1 -1
- package/dist/rpc/CommandOutput.cjs +2 -1
- package/dist/rpc/CommandOutput.cjs.map +1 -1
- package/dist/rpc/CommandOutput.d.ts.map +1 -1
- package/dist/rpc/CommandOutput.js +2 -1
- package/dist/rpc/CommandOutput.js.map +1 -1
- package/dist/rpc/EntityExplorerApp.cjs +28 -83
- package/dist/rpc/EntityExplorerApp.cjs.map +1 -1
- package/dist/rpc/EntityExplorerApp.d.ts +1 -4
- package/dist/rpc/EntityExplorerApp.d.ts.map +1 -1
- package/dist/rpc/EntityExplorerApp.js +13 -68
- package/dist/rpc/EntityExplorerApp.js.map +1 -1
- package/dist/rpc/OperationCatalog.cjs +2 -2
- package/dist/rpc/OperationCatalog.cjs.map +1 -1
- package/dist/rpc/OperationCatalog.d.ts +1 -1
- package/dist/rpc/OperationCatalog.d.ts.map +1 -1
- package/dist/rpc/OperationCatalog.js +1 -1
- package/dist/rpc/OperationCatalog.js.map +1 -1
- package/dist/rpc/OperationCommandPage.cjs +6 -4
- package/dist/rpc/OperationCommandPage.cjs.map +1 -1
- package/dist/rpc/OperationCommandPage.d.ts.map +1 -1
- package/dist/rpc/OperationCommandPage.js +3 -1
- package/dist/rpc/OperationCommandPage.js.map +1 -1
- package/dist/rpc/RouterProvider.cjs +10 -0
- package/dist/rpc/RouterProvider.cjs.map +1 -0
- package/dist/rpc/RouterProvider.d.ts +10 -0
- package/dist/rpc/RouterProvider.d.ts.map +1 -0
- package/dist/rpc/RouterProvider.js +10 -0
- package/dist/rpc/RouterProvider.js.map +1 -0
- package/dist/rpc/apiClient.cjs +4 -4
- package/dist/rpc/apiClient.cjs.map +1 -1
- package/dist/rpc/apiClient.js +4 -4
- package/dist/rpc/apiClient.js.map +1 -1
- package/dist/rpc/command-form-utils.cjs +43 -0
- package/dist/rpc/command-form-utils.cjs.map +1 -0
- package/dist/rpc/command-form-utils.d.ts +5 -0
- package/dist/rpc/command-form-utils.d.ts.map +1 -0
- package/dist/rpc/command-form-utils.js +43 -0
- package/dist/rpc/command-form-utils.js.map +1 -0
- package/dist/rpc/commandHref.cjs +62 -0
- package/dist/rpc/commandHref.cjs.map +1 -0
- package/dist/rpc/commandHref.d.ts +7 -0
- package/dist/rpc/commandHref.d.ts.map +1 -0
- package/dist/rpc/commandHref.js +62 -0
- package/dist/rpc/commandHref.js.map +1 -0
- package/dist/rpc/formMetadata.cjs +1 -1
- package/dist/rpc/formMetadata.cjs.map +1 -1
- package/dist/rpc/formMetadata.js +1 -1
- package/dist/rpc/formMetadata.js.map +1 -1
- package/dist/rpc/router.cjs +83 -0
- package/dist/rpc/router.cjs.map +1 -0
- package/dist/rpc/router.d.ts +24 -0
- package/dist/rpc/router.d.ts.map +1 -0
- package/dist/rpc/router.js +83 -0
- package/dist/rpc/router.js.map +1 -0
- package/dist/rpc/rpc-story-fixtures/orders.fixture.d.ts +3 -0
- package/dist/rpc/rpc-story-fixtures/orders.fixture.d.ts.map +1 -0
- package/dist/rpc/rpc-story-fixtures/services.fixture.d.ts +3 -0
- package/dist/rpc/rpc-story-fixtures/services.fixture.d.ts.map +1 -0
- package/dist/rpc/rpc-story-fixtures/surface-fixture.d.ts +24 -0
- package/dist/rpc/rpc-story-fixtures/surface-fixture.d.ts.map +1 -0
- package/dist/rpc/rpc-story-fixtures/widgets.fixture.d.ts +3 -0
- package/dist/rpc/rpc-story-fixtures/widgets.fixture.d.ts.map +1 -0
- package/dist/rpc/rpc-story.fixtures.d.ts +16 -0
- package/dist/rpc/rpc-story.fixtures.d.ts.map +1 -0
- package/dist/rpc.cjs +17 -0
- package/dist/rpc.cjs.map +1 -1
- package/dist/rpc.d.ts +5 -0
- package/dist/rpc.d.ts.map +1 -1
- package/dist/rpc.js +18 -1
- package/dist/rpc.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +11 -1
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const jsxRuntime = require("react/jsx-runtime");
|
|
4
|
+
const react = require("react");
|
|
5
|
+
const utils = require("../lib/utils.cjs");
|
|
6
|
+
const Icon = require("../data/Icon.cjs");
|
|
7
|
+
const UiSearch = require("../icons/components/UiSearch.cjs");
|
|
8
|
+
function SearchInput({
|
|
9
|
+
value,
|
|
10
|
+
onChange,
|
|
11
|
+
placeholder = "Search…",
|
|
12
|
+
shortcut = "⌘K",
|
|
13
|
+
onShortcut,
|
|
14
|
+
className,
|
|
15
|
+
...rest
|
|
16
|
+
}) {
|
|
17
|
+
const inputRef = react.useRef(null);
|
|
18
|
+
const shortcutKey = shortcut ? shortcut.slice(-1).toLowerCase() : "k";
|
|
19
|
+
react.useEffect(() => {
|
|
20
|
+
if (!onShortcut) return;
|
|
21
|
+
const handler = (e) => {
|
|
22
|
+
var _a;
|
|
23
|
+
if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === shortcutKey) {
|
|
24
|
+
e.preventDefault();
|
|
25
|
+
onShortcut();
|
|
26
|
+
(_a = inputRef.current) == null ? void 0 : _a.focus();
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
window.addEventListener("keydown", handler);
|
|
30
|
+
return () => window.removeEventListener("keydown", handler);
|
|
31
|
+
}, [onShortcut, shortcutKey]);
|
|
32
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
33
|
+
"div",
|
|
34
|
+
{
|
|
35
|
+
className: utils.cn(
|
|
36
|
+
"flex items-center gap-density-2 rounded-md border border-border bg-secondary px-density-3",
|
|
37
|
+
"h-control-h focus-within:ring-2 focus-within:ring-ring",
|
|
38
|
+
className
|
|
39
|
+
),
|
|
40
|
+
children: [
|
|
41
|
+
/* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiSearch.UiSearch, className: "shrink-0 text-muted-foreground" }),
|
|
42
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
43
|
+
"input",
|
|
44
|
+
{
|
|
45
|
+
ref: inputRef,
|
|
46
|
+
type: "search",
|
|
47
|
+
value,
|
|
48
|
+
onChange: (e) => onChange(e.target.value),
|
|
49
|
+
placeholder,
|
|
50
|
+
className: utils.cn(
|
|
51
|
+
"min-w-0 flex-1 border-none bg-transparent text-sm text-foreground outline-none",
|
|
52
|
+
"placeholder:text-muted-foreground [&::-webkit-search-cancel-button]:appearance-none"
|
|
53
|
+
),
|
|
54
|
+
...rest
|
|
55
|
+
}
|
|
56
|
+
),
|
|
57
|
+
shortcut && /* @__PURE__ */ jsxRuntime.jsx("kbd", { className: "shrink-0 rounded border border-border px-1 font-mono text-[10px] text-muted-foreground", children: shortcut })
|
|
58
|
+
]
|
|
59
|
+
}
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
exports.SearchInput = SearchInput;
|
|
63
|
+
//# sourceMappingURL=SearchInput.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SearchInput.cjs","sources":["../../src/components/SearchInput.tsx"],"sourcesContent":["import { useEffect, useRef, type InputHTMLAttributes } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"../data/Icon\";\nimport { UiSearch } from \"../icons\";\n\ntype NativeInputProps = Omit<\n InputHTMLAttributes<HTMLInputElement>,\n \"value\" | \"onChange\" | \"size\"\n>;\n\nexport type SearchInputProps = NativeInputProps & {\n /** Controlled query value. */\n value: string;\n /** Called with the next query string. */\n onChange: (value: string) => void;\n /** Placeholder text. */\n placeholder?: string;\n /**\n * Keyboard-shortcut hint rendered as a trailing `<kbd>` (Gavel's `⌘K`).\n * Pass `null` to hide it. Defaults to `⌘K`.\n */\n shortcut?: string | null;\n /**\n * When set, the matching shortcut (cmd/ctrl + the last character of\n * `shortcut`, default `k`) focuses the input from anywhere on the page.\n */\n onShortcut?: () => void;\n /** Classes applied to the wrapper. */\n className?: string;\n};\n\n/**\n * Search field with a leading magnifier and an optional trailing keyboard-hint\n * (the Gavel app-bar `⌘K` search). Controlled. Built on clicky tokens. When\n * `onShortcut` is provided, a global cmd/ctrl+K listener is wired so the field\n * can be focused from anywhere.\n */\nexport function SearchInput({\n value,\n onChange,\n placeholder = \"Search…\",\n shortcut = \"⌘K\",\n onShortcut,\n className,\n ...rest\n}: SearchInputProps) {\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n // Match cmd/ctrl + the shortcut's trailing key (e.g. \"k\" from \"⌘K\").\n const shortcutKey = shortcut ? shortcut.slice(-1).toLowerCase() : \"k\";\n\n useEffect(() => {\n if (!onShortcut) return;\n const handler = (e: KeyboardEvent) => {\n if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === shortcutKey) {\n e.preventDefault();\n onShortcut();\n inputRef.current?.focus();\n }\n };\n window.addEventListener(\"keydown\", handler);\n return () => window.removeEventListener(\"keydown\", handler);\n }, [onShortcut, shortcutKey]);\n\n return (\n <div\n className={cn(\n \"flex items-center gap-density-2 rounded-md border border-border bg-secondary px-density-3\",\n \"h-control-h focus-within:ring-2 focus-within:ring-ring\",\n className,\n )}\n >\n <Icon icon={UiSearch} className=\"shrink-0 text-muted-foreground\" />\n <input\n ref={inputRef}\n type=\"search\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder={placeholder}\n className={cn(\n \"min-w-0 flex-1 border-none bg-transparent text-sm text-foreground outline-none\",\n \"placeholder:text-muted-foreground [&::-webkit-search-cancel-button]:appearance-none\",\n )}\n {...rest}\n />\n {shortcut && (\n <kbd className=\"shrink-0 rounded border border-border px-1 font-mono text-[10px] text-muted-foreground\">\n {shortcut}\n </kbd>\n )}\n </div>\n );\n}\n"],"names":["useRef","useEffect","jsxs","cn","jsx","Icon","UiSearch"],"mappings":";;;;;;;AAqCO,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAqB;AACnB,QAAM,WAAWA,MAAAA,OAAgC,IAAI;AAGrD,QAAM,cAAc,WAAW,SAAS,MAAM,EAAE,EAAE,gBAAgB;AAElEC,QAAAA,UAAU,MAAM;AACd,QAAI,CAAC,WAAY;AACjB,UAAM,UAAU,CAAC,MAAqB;;AACpC,WAAK,EAAE,WAAW,EAAE,YAAY,EAAE,IAAI,YAAA,MAAkB,aAAa;AACnE,UAAE,eAAA;AACF,mBAAA;AACA,uBAAS,YAAT,mBAAkB;AAAA,MACpB;AAAA,IACF;AACA,WAAO,iBAAiB,WAAW,OAAO;AAC1C,WAAO,MAAM,OAAO,oBAAoB,WAAW,OAAO;AAAA,EAC5D,GAAG,CAAC,YAAY,WAAW,CAAC;AAE5B,SACEC,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWC,MAAAA;AAAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,MAGF,UAAA;AAAA,QAAAC,2BAAAA,IAACC,KAAAA,MAAA,EAAK,MAAMC,SAAAA,UAAU,WAAU,kCAAiC;AAAA,QACjEF,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,KAAK;AAAA,YACL,MAAK;AAAA,YACL;AAAA,YACA,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,YACxC;AAAA,YACA,WAAWD,MAAAA;AAAAA,cACT;AAAA,cACA;AAAA,YAAA;AAAA,YAED,GAAG;AAAA,UAAA;AAAA,QAAA;AAAA,QAEL,YACCC,2BAAAA,IAAC,OAAA,EAAI,WAAU,0FACZ,UAAA,SAAA,CACH;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIR;;"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { InputHTMLAttributes } from 'react';
|
|
2
|
+
type NativeInputProps = Omit<InputHTMLAttributes<HTMLInputElement>, "value" | "onChange" | "size">;
|
|
3
|
+
export type SearchInputProps = NativeInputProps & {
|
|
4
|
+
/** Controlled query value. */
|
|
5
|
+
value: string;
|
|
6
|
+
/** Called with the next query string. */
|
|
7
|
+
onChange: (value: string) => void;
|
|
8
|
+
/** Placeholder text. */
|
|
9
|
+
placeholder?: string;
|
|
10
|
+
/**
|
|
11
|
+
* Keyboard-shortcut hint rendered as a trailing `<kbd>` (Gavel's `⌘K`).
|
|
12
|
+
* Pass `null` to hide it. Defaults to `⌘K`.
|
|
13
|
+
*/
|
|
14
|
+
shortcut?: string | null;
|
|
15
|
+
/**
|
|
16
|
+
* When set, the matching shortcut (cmd/ctrl + the last character of
|
|
17
|
+
* `shortcut`, default `k`) focuses the input from anywhere on the page.
|
|
18
|
+
*/
|
|
19
|
+
onShortcut?: () => void;
|
|
20
|
+
/** Classes applied to the wrapper. */
|
|
21
|
+
className?: string;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Search field with a leading magnifier and an optional trailing keyboard-hint
|
|
25
|
+
* (the Gavel app-bar `⌘K` search). Controlled. Built on clicky tokens. When
|
|
26
|
+
* `onShortcut` is provided, a global cmd/ctrl+K listener is wired so the field
|
|
27
|
+
* can be focused from anywhere.
|
|
28
|
+
*/
|
|
29
|
+
export declare function SearchInput({ value, onChange, placeholder, shortcut, onShortcut, className, ...rest }: SearchInputProps): import("react/jsx-runtime").JSX.Element;
|
|
30
|
+
export {};
|
|
31
|
+
//# sourceMappingURL=SearchInput.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SearchInput.d.ts","sourceRoot":"","sources":["../../src/components/SearchInput.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,mBAAmB,EAAE,MAAM,OAAO,CAAC;AAKpE,KAAK,gBAAgB,GAAG,IAAI,CAC1B,mBAAmB,CAAC,gBAAgB,CAAC,EACrC,OAAO,GAAG,UAAU,GAAG,MAAM,CAC9B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,gBAAgB,GAAG;IAChD,8BAA8B;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,yCAAyC;IACzC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,wBAAwB;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,sCAAsC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,QAAQ,EACR,WAAuB,EACvB,QAAe,EACf,UAAU,EACV,SAAS,EACT,GAAG,IAAI,EACR,EAAE,gBAAgB,2CA+ClB"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useRef, useEffect } from "react";
|
|
3
|
+
import { cn } from "../lib/utils.js";
|
|
4
|
+
import { Icon } from "../data/Icon.js";
|
|
5
|
+
import { UiSearch } from "../icons/components/UiSearch.js";
|
|
6
|
+
function SearchInput({
|
|
7
|
+
value,
|
|
8
|
+
onChange,
|
|
9
|
+
placeholder = "Search…",
|
|
10
|
+
shortcut = "⌘K",
|
|
11
|
+
onShortcut,
|
|
12
|
+
className,
|
|
13
|
+
...rest
|
|
14
|
+
}) {
|
|
15
|
+
const inputRef = useRef(null);
|
|
16
|
+
const shortcutKey = shortcut ? shortcut.slice(-1).toLowerCase() : "k";
|
|
17
|
+
useEffect(() => {
|
|
18
|
+
if (!onShortcut) return;
|
|
19
|
+
const handler = (e) => {
|
|
20
|
+
var _a;
|
|
21
|
+
if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === shortcutKey) {
|
|
22
|
+
e.preventDefault();
|
|
23
|
+
onShortcut();
|
|
24
|
+
(_a = inputRef.current) == null ? void 0 : _a.focus();
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
window.addEventListener("keydown", handler);
|
|
28
|
+
return () => window.removeEventListener("keydown", handler);
|
|
29
|
+
}, [onShortcut, shortcutKey]);
|
|
30
|
+
return /* @__PURE__ */ jsxs(
|
|
31
|
+
"div",
|
|
32
|
+
{
|
|
33
|
+
className: cn(
|
|
34
|
+
"flex items-center gap-density-2 rounded-md border border-border bg-secondary px-density-3",
|
|
35
|
+
"h-control-h focus-within:ring-2 focus-within:ring-ring",
|
|
36
|
+
className
|
|
37
|
+
),
|
|
38
|
+
children: [
|
|
39
|
+
/* @__PURE__ */ jsx(Icon, { icon: UiSearch, className: "shrink-0 text-muted-foreground" }),
|
|
40
|
+
/* @__PURE__ */ jsx(
|
|
41
|
+
"input",
|
|
42
|
+
{
|
|
43
|
+
ref: inputRef,
|
|
44
|
+
type: "search",
|
|
45
|
+
value,
|
|
46
|
+
onChange: (e) => onChange(e.target.value),
|
|
47
|
+
placeholder,
|
|
48
|
+
className: cn(
|
|
49
|
+
"min-w-0 flex-1 border-none bg-transparent text-sm text-foreground outline-none",
|
|
50
|
+
"placeholder:text-muted-foreground [&::-webkit-search-cancel-button]:appearance-none"
|
|
51
|
+
),
|
|
52
|
+
...rest
|
|
53
|
+
}
|
|
54
|
+
),
|
|
55
|
+
shortcut && /* @__PURE__ */ jsx("kbd", { className: "shrink-0 rounded border border-border px-1 font-mono text-[10px] text-muted-foreground", children: shortcut })
|
|
56
|
+
]
|
|
57
|
+
}
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
export {
|
|
61
|
+
SearchInput
|
|
62
|
+
};
|
|
63
|
+
//# sourceMappingURL=SearchInput.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SearchInput.js","sources":["../../src/components/SearchInput.tsx"],"sourcesContent":["import { useEffect, useRef, type InputHTMLAttributes } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"../data/Icon\";\nimport { UiSearch } from \"../icons\";\n\ntype NativeInputProps = Omit<\n InputHTMLAttributes<HTMLInputElement>,\n \"value\" | \"onChange\" | \"size\"\n>;\n\nexport type SearchInputProps = NativeInputProps & {\n /** Controlled query value. */\n value: string;\n /** Called with the next query string. */\n onChange: (value: string) => void;\n /** Placeholder text. */\n placeholder?: string;\n /**\n * Keyboard-shortcut hint rendered as a trailing `<kbd>` (Gavel's `⌘K`).\n * Pass `null` to hide it. Defaults to `⌘K`.\n */\n shortcut?: string | null;\n /**\n * When set, the matching shortcut (cmd/ctrl + the last character of\n * `shortcut`, default `k`) focuses the input from anywhere on the page.\n */\n onShortcut?: () => void;\n /** Classes applied to the wrapper. */\n className?: string;\n};\n\n/**\n * Search field with a leading magnifier and an optional trailing keyboard-hint\n * (the Gavel app-bar `⌘K` search). Controlled. Built on clicky tokens. When\n * `onShortcut` is provided, a global cmd/ctrl+K listener is wired so the field\n * can be focused from anywhere.\n */\nexport function SearchInput({\n value,\n onChange,\n placeholder = \"Search…\",\n shortcut = \"⌘K\",\n onShortcut,\n className,\n ...rest\n}: SearchInputProps) {\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n // Match cmd/ctrl + the shortcut's trailing key (e.g. \"k\" from \"⌘K\").\n const shortcutKey = shortcut ? shortcut.slice(-1).toLowerCase() : \"k\";\n\n useEffect(() => {\n if (!onShortcut) return;\n const handler = (e: KeyboardEvent) => {\n if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === shortcutKey) {\n e.preventDefault();\n onShortcut();\n inputRef.current?.focus();\n }\n };\n window.addEventListener(\"keydown\", handler);\n return () => window.removeEventListener(\"keydown\", handler);\n }, [onShortcut, shortcutKey]);\n\n return (\n <div\n className={cn(\n \"flex items-center gap-density-2 rounded-md border border-border bg-secondary px-density-3\",\n \"h-control-h focus-within:ring-2 focus-within:ring-ring\",\n className,\n )}\n >\n <Icon icon={UiSearch} className=\"shrink-0 text-muted-foreground\" />\n <input\n ref={inputRef}\n type=\"search\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder={placeholder}\n className={cn(\n \"min-w-0 flex-1 border-none bg-transparent text-sm text-foreground outline-none\",\n \"placeholder:text-muted-foreground [&::-webkit-search-cancel-button]:appearance-none\",\n )}\n {...rest}\n />\n {shortcut && (\n <kbd className=\"shrink-0 rounded border border-border px-1 font-mono text-[10px] text-muted-foreground\">\n {shortcut}\n </kbd>\n )}\n </div>\n );\n}\n"],"names":[],"mappings":";;;;;AAqCO,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAqB;AACnB,QAAM,WAAW,OAAgC,IAAI;AAGrD,QAAM,cAAc,WAAW,SAAS,MAAM,EAAE,EAAE,gBAAgB;AAElE,YAAU,MAAM;AACd,QAAI,CAAC,WAAY;AACjB,UAAM,UAAU,CAAC,MAAqB;;AACpC,WAAK,EAAE,WAAW,EAAE,YAAY,EAAE,IAAI,YAAA,MAAkB,aAAa;AACnE,UAAE,eAAA;AACF,mBAAA;AACA,uBAAS,YAAT,mBAAkB;AAAA,MACpB;AAAA,IACF;AACA,WAAO,iBAAiB,WAAW,OAAO;AAC1C,WAAO,MAAM,OAAO,oBAAoB,WAAW,OAAO;AAAA,EAC5D,GAAG,CAAC,YAAY,WAAW,CAAC;AAE5B,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,MAGF,UAAA;AAAA,QAAA,oBAAC,MAAA,EAAK,MAAM,UAAU,WAAU,kCAAiC;AAAA,QACjE;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,KAAK;AAAA,YACL,MAAK;AAAA,YACL;AAAA,YACA,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,YACxC;AAAA,YACA,WAAW;AAAA,cACT;AAAA,cACA;AAAA,YAAA;AAAA,YAED,GAAG;AAAA,UAAA;AAAA,QAAA;AAAA,QAEL,YACC,oBAAC,OAAA,EAAI,WAAU,0FACZ,UAAA,SAAA,CACH;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIR;"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const jsxRuntime = require("react/jsx-runtime");
|
|
4
|
+
const react = require("react");
|
|
5
|
+
const utils = require("../lib/utils.cjs");
|
|
6
|
+
const Icon = require("../data/Icon.cjs");
|
|
7
|
+
const SIZE_CLASSES = {
|
|
8
|
+
sm: "text-xs px-density-2 py-density-1 gap-1",
|
|
9
|
+
md: "text-sm px-density-3 py-1.5 gap-1.5"
|
|
10
|
+
};
|
|
11
|
+
function SegmentedControl({
|
|
12
|
+
value,
|
|
13
|
+
options,
|
|
14
|
+
onChange,
|
|
15
|
+
size = "md",
|
|
16
|
+
className,
|
|
17
|
+
"aria-label": ariaLabel
|
|
18
|
+
}) {
|
|
19
|
+
const btnRefs = react.useRef([]);
|
|
20
|
+
const move = (from, dir) => {
|
|
21
|
+
var _a;
|
|
22
|
+
const n = options.length;
|
|
23
|
+
let i = from;
|
|
24
|
+
for (let step = 0; step < n; step++) {
|
|
25
|
+
i = (i + dir + n) % n;
|
|
26
|
+
const opt = options[i];
|
|
27
|
+
if (opt && !opt.disabled) {
|
|
28
|
+
onChange(opt.id);
|
|
29
|
+
(_a = btnRefs.current[i]) == null ? void 0 : _a.focus();
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
35
|
+
"div",
|
|
36
|
+
{
|
|
37
|
+
role: "radiogroup",
|
|
38
|
+
"aria-label": ariaLabel,
|
|
39
|
+
className: utils.cn("inline-flex items-center rounded-md bg-muted p-0.5", className),
|
|
40
|
+
children: options.map((option, index) => {
|
|
41
|
+
const active = option.id === value;
|
|
42
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
43
|
+
"button",
|
|
44
|
+
{
|
|
45
|
+
ref: (el) => {
|
|
46
|
+
btnRefs.current[index] = el;
|
|
47
|
+
},
|
|
48
|
+
type: "button",
|
|
49
|
+
role: "radio",
|
|
50
|
+
"aria-checked": active,
|
|
51
|
+
title: option.title,
|
|
52
|
+
disabled: option.disabled,
|
|
53
|
+
tabIndex: active ? 0 : -1,
|
|
54
|
+
onClick: () => !option.disabled && onChange(option.id),
|
|
55
|
+
onKeyDown: (e) => {
|
|
56
|
+
if (e.key === "ArrowRight" || e.key === "ArrowDown") {
|
|
57
|
+
e.preventDefault();
|
|
58
|
+
move(index, 1);
|
|
59
|
+
} else if (e.key === "ArrowLeft" || e.key === "ArrowUp") {
|
|
60
|
+
e.preventDefault();
|
|
61
|
+
move(index, -1);
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
className: utils.cn(
|
|
65
|
+
"inline-flex items-center whitespace-nowrap rounded-[5px] font-medium transition-colors",
|
|
66
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
67
|
+
"disabled:cursor-not-allowed disabled:opacity-50",
|
|
68
|
+
SIZE_CLASSES[size],
|
|
69
|
+
active ? "bg-card text-foreground shadow-sm" : "text-muted-foreground hover:text-foreground"
|
|
70
|
+
),
|
|
71
|
+
children: [
|
|
72
|
+
option.icon && /* @__PURE__ */ jsxRuntime.jsx(
|
|
73
|
+
Icon.Icon,
|
|
74
|
+
{
|
|
75
|
+
...typeof option.icon === "string" ? { name: option.icon } : { icon: option.icon }
|
|
76
|
+
}
|
|
77
|
+
),
|
|
78
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: option.label })
|
|
79
|
+
]
|
|
80
|
+
},
|
|
81
|
+
option.id
|
|
82
|
+
);
|
|
83
|
+
})
|
|
84
|
+
}
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
exports.SegmentedControl = SegmentedControl;
|
|
88
|
+
//# sourceMappingURL=SegmentedControl.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SegmentedControl.cjs","sources":["../../src/components/SegmentedControl.tsx"],"sourcesContent":["import { useRef, type ReactNode } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Icon, type StaticIconComponent } from \"../data/Icon\";\n\nexport type SegmentedSize = \"sm\" | \"md\";\n\nexport type SegmentedOption<T extends string = string> = {\n /** Stable value emitted on selection. */\n id: T;\n /** Visible label. */\n label: ReactNode;\n /** Optional leading icon (imported `Ui*` component or runtime name). */\n icon?: string | StaticIconComponent;\n /** Native title attribute. */\n title?: string;\n /** Disable this segment. */\n disabled?: boolean;\n};\n\nexport type SegmentedControlProps<T extends string = string> = {\n /** Currently selected option id. */\n value: T;\n /** Mutually-exclusive options rendered left to right. */\n options: SegmentedOption<T>[];\n /** Called with the newly selected id. */\n onChange: (id: T) => void;\n /** Control size. `md` (default) matches form controls; `sm` is denser. */\n size?: SegmentedSize;\n /** Accessible group label. */\n \"aria-label\"?: string;\n /** Classes applied to the track. */\n className?: string;\n};\n\nconst SIZE_CLASSES: Record<SegmentedSize, string> = {\n sm: \"text-xs px-density-2 py-density-1 gap-1\",\n md: \"text-sm px-density-3 py-1.5 gap-1.5\",\n};\n\n/**\n * Single-select toggle group (the Gavel `Segmented` \"Mine / All / Bots\"\n * pattern). A muted track holds mutually-exclusive segments; the active\n * segment lifts onto the card surface. Built on clicky tokens so it inherits\n * dark-mode and density. Use for small, flat choice sets — reach for `Select`\n * when the option count grows.\n */\nexport function SegmentedControl<T extends string = string>({\n value,\n options,\n onChange,\n size = \"md\",\n className,\n \"aria-label\": ariaLabel,\n}: SegmentedControlProps<T>) {\n const btnRefs = useRef<(HTMLButtonElement | null)[]>([]);\n\n const move = (from: number, dir: 1 | -1) => {\n const n = options.length;\n let i = from;\n for (let step = 0; step < n; step++) {\n i = (i + dir + n) % n;\n const opt = options[i];\n if (opt && !opt.disabled) {\n onChange(opt.id);\n btnRefs.current[i]?.focus();\n return;\n }\n }\n };\n\n return (\n <div\n role=\"radiogroup\"\n aria-label={ariaLabel}\n className={cn(\"inline-flex items-center rounded-md bg-muted p-0.5\", className)}\n >\n {options.map((option, index) => {\n const active = option.id === value;\n return (\n <button\n key={option.id}\n ref={(el) => {\n btnRefs.current[index] = el;\n }}\n type=\"button\"\n role=\"radio\"\n aria-checked={active}\n title={option.title}\n disabled={option.disabled}\n tabIndex={active ? 0 : -1}\n onClick={() => !option.disabled && onChange(option.id)}\n onKeyDown={(e) => {\n if (e.key === \"ArrowRight\" || e.key === \"ArrowDown\") {\n e.preventDefault();\n move(index, 1);\n } else if (e.key === \"ArrowLeft\" || e.key === \"ArrowUp\") {\n e.preventDefault();\n move(index, -1);\n }\n }}\n className={cn(\n \"inline-flex items-center whitespace-nowrap rounded-[5px] font-medium transition-colors\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n SIZE_CLASSES[size],\n active\n ? \"bg-card text-foreground shadow-sm\"\n : \"text-muted-foreground hover:text-foreground\",\n )}\n >\n {option.icon && (\n <Icon\n {...(typeof option.icon === \"string\" ? { name: option.icon } : { icon: option.icon })}\n />\n )}\n <span>{option.label}</span>\n </button>\n );\n })}\n </div>\n );\n}\n"],"names":["useRef","jsx","cn","jsxs","Icon"],"mappings":";;;;;;AAkCA,MAAM,eAA8C;AAAA,EAClD,IAAI;AAAA,EACJ,IAAI;AACN;AASO,SAAS,iBAA4C;AAAA,EAC1D;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA,cAAc;AAChB,GAA6B;AAC3B,QAAM,UAAUA,MAAAA,OAAqC,EAAE;AAEvD,QAAM,OAAO,CAAC,MAAc,QAAgB;;AAC1C,UAAM,IAAI,QAAQ;AAClB,QAAI,IAAI;AACR,aAAS,OAAO,GAAG,OAAO,GAAG,QAAQ;AACnC,WAAK,IAAI,MAAM,KAAK;AACpB,YAAM,MAAM,QAAQ,CAAC;AACrB,UAAI,OAAO,CAAC,IAAI,UAAU;AACxB,iBAAS,IAAI,EAAE;AACf,sBAAQ,QAAQ,CAAC,MAAjB,mBAAoB;AACpB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SACEC,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,cAAY;AAAA,MACZ,WAAWC,MAAAA,GAAG,sDAAsD,SAAS;AAAA,MAE5E,UAAA,QAAQ,IAAI,CAAC,QAAQ,UAAU;AAC9B,cAAM,SAAS,OAAO,OAAO;AAC7B,eACEC,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YAEC,KAAK,CAAC,OAAO;AACX,sBAAQ,QAAQ,KAAK,IAAI;AAAA,YAC3B;AAAA,YACA,MAAK;AAAA,YACL,MAAK;AAAA,YACL,gBAAc;AAAA,YACd,OAAO,OAAO;AAAA,YACd,UAAU,OAAO;AAAA,YACjB,UAAU,SAAS,IAAI;AAAA,YACvB,SAAS,MAAM,CAAC,OAAO,YAAY,SAAS,OAAO,EAAE;AAAA,YACrD,WAAW,CAAC,MAAM;AAChB,kBAAI,EAAE,QAAQ,gBAAgB,EAAE,QAAQ,aAAa;AACnD,kBAAE,eAAA;AACF,qBAAK,OAAO,CAAC;AAAA,cACf,WAAW,EAAE,QAAQ,eAAe,EAAE,QAAQ,WAAW;AACvD,kBAAE,eAAA;AACF,qBAAK,OAAO,EAAE;AAAA,cAChB;AAAA,YACF;AAAA,YACA,WAAWD,MAAAA;AAAAA,cACT;AAAA,cACA;AAAA,cACA;AAAA,cACA,aAAa,IAAI;AAAA,cACjB,SACI,sCACA;AAAA,YAAA;AAAA,YAGL,UAAA;AAAA,cAAA,OAAO,QACND,2BAAAA;AAAAA,gBAACG,KAAAA;AAAAA,gBAAA;AAAA,kBACE,GAAI,OAAO,OAAO,SAAS,WAAW,EAAE,MAAM,OAAO,KAAA,IAAS,EAAE,MAAM,OAAO,KAAA;AAAA,gBAAK;AAAA,cAAA;AAAA,cAGvFH,2BAAAA,IAAC,QAAA,EAAM,UAAA,OAAO,MAAA,CAAM;AAAA,YAAA;AAAA,UAAA;AAAA,UAnCf,OAAO;AAAA,QAAA;AAAA,MAsClB,CAAC;AAAA,IAAA;AAAA,EAAA;AAGP;;"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { StaticIconComponent } from '../data/Icon';
|
|
3
|
+
export type SegmentedSize = "sm" | "md";
|
|
4
|
+
export type SegmentedOption<T extends string = string> = {
|
|
5
|
+
/** Stable value emitted on selection. */
|
|
6
|
+
id: T;
|
|
7
|
+
/** Visible label. */
|
|
8
|
+
label: ReactNode;
|
|
9
|
+
/** Optional leading icon (imported `Ui*` component or runtime name). */
|
|
10
|
+
icon?: string | StaticIconComponent;
|
|
11
|
+
/** Native title attribute. */
|
|
12
|
+
title?: string;
|
|
13
|
+
/** Disable this segment. */
|
|
14
|
+
disabled?: boolean;
|
|
15
|
+
};
|
|
16
|
+
export type SegmentedControlProps<T extends string = string> = {
|
|
17
|
+
/** Currently selected option id. */
|
|
18
|
+
value: T;
|
|
19
|
+
/** Mutually-exclusive options rendered left to right. */
|
|
20
|
+
options: SegmentedOption<T>[];
|
|
21
|
+
/** Called with the newly selected id. */
|
|
22
|
+
onChange: (id: T) => void;
|
|
23
|
+
/** Control size. `md` (default) matches form controls; `sm` is denser. */
|
|
24
|
+
size?: SegmentedSize;
|
|
25
|
+
/** Accessible group label. */
|
|
26
|
+
"aria-label"?: string;
|
|
27
|
+
/** Classes applied to the track. */
|
|
28
|
+
className?: string;
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Single-select toggle group (the Gavel `Segmented` "Mine / All / Bots"
|
|
32
|
+
* pattern). A muted track holds mutually-exclusive segments; the active
|
|
33
|
+
* segment lifts onto the card surface. Built on clicky tokens so it inherits
|
|
34
|
+
* dark-mode and density. Use for small, flat choice sets — reach for `Select`
|
|
35
|
+
* when the option count grows.
|
|
36
|
+
*/
|
|
37
|
+
export declare function SegmentedControl<T extends string = string>({ value, options, onChange, size, className, "aria-label": ariaLabel, }: SegmentedControlProps<T>): import("react/jsx-runtime").JSX.Element;
|
|
38
|
+
//# sourceMappingURL=SegmentedControl.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SegmentedControl.d.ts","sourceRoot":"","sources":["../../src/components/SegmentedControl.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAE/C,OAAO,EAAQ,KAAK,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAE9D,MAAM,MAAM,aAAa,GAAG,IAAI,GAAG,IAAI,CAAC;AAExC,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,IAAI;IACvD,yCAAyC;IACzC,EAAE,EAAE,CAAC,CAAC;IACN,qBAAqB;IACrB,KAAK,EAAE,SAAS,CAAC;IACjB,wEAAwE;IACxE,IAAI,CAAC,EAAE,MAAM,GAAG,mBAAmB,CAAC;IACpC,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4BAA4B;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,qBAAqB,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,IAAI;IAC7D,oCAAoC;IACpC,KAAK,EAAE,CAAC,CAAC;IACT,yDAAyD;IACzD,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9B,yCAAyC;IACzC,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC;IAC1B,0EAA0E;IAC1E,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,8BAA8B;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oCAAoC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAOF;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,EAC1D,KAAK,EACL,OAAO,EACP,QAAQ,EACR,IAAW,EACX,SAAS,EACT,YAAY,EAAE,SAAS,GACxB,EAAE,qBAAqB,CAAC,CAAC,CAAC,2CAoE1B"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useRef } from "react";
|
|
3
|
+
import { cn } from "../lib/utils.js";
|
|
4
|
+
import { Icon } from "../data/Icon.js";
|
|
5
|
+
const SIZE_CLASSES = {
|
|
6
|
+
sm: "text-xs px-density-2 py-density-1 gap-1",
|
|
7
|
+
md: "text-sm px-density-3 py-1.5 gap-1.5"
|
|
8
|
+
};
|
|
9
|
+
function SegmentedControl({
|
|
10
|
+
value,
|
|
11
|
+
options,
|
|
12
|
+
onChange,
|
|
13
|
+
size = "md",
|
|
14
|
+
className,
|
|
15
|
+
"aria-label": ariaLabel
|
|
16
|
+
}) {
|
|
17
|
+
const btnRefs = useRef([]);
|
|
18
|
+
const move = (from, dir) => {
|
|
19
|
+
var _a;
|
|
20
|
+
const n = options.length;
|
|
21
|
+
let i = from;
|
|
22
|
+
for (let step = 0; step < n; step++) {
|
|
23
|
+
i = (i + dir + n) % n;
|
|
24
|
+
const opt = options[i];
|
|
25
|
+
if (opt && !opt.disabled) {
|
|
26
|
+
onChange(opt.id);
|
|
27
|
+
(_a = btnRefs.current[i]) == null ? void 0 : _a.focus();
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
return /* @__PURE__ */ jsx(
|
|
33
|
+
"div",
|
|
34
|
+
{
|
|
35
|
+
role: "radiogroup",
|
|
36
|
+
"aria-label": ariaLabel,
|
|
37
|
+
className: cn("inline-flex items-center rounded-md bg-muted p-0.5", className),
|
|
38
|
+
children: options.map((option, index) => {
|
|
39
|
+
const active = option.id === value;
|
|
40
|
+
return /* @__PURE__ */ jsxs(
|
|
41
|
+
"button",
|
|
42
|
+
{
|
|
43
|
+
ref: (el) => {
|
|
44
|
+
btnRefs.current[index] = el;
|
|
45
|
+
},
|
|
46
|
+
type: "button",
|
|
47
|
+
role: "radio",
|
|
48
|
+
"aria-checked": active,
|
|
49
|
+
title: option.title,
|
|
50
|
+
disabled: option.disabled,
|
|
51
|
+
tabIndex: active ? 0 : -1,
|
|
52
|
+
onClick: () => !option.disabled && onChange(option.id),
|
|
53
|
+
onKeyDown: (e) => {
|
|
54
|
+
if (e.key === "ArrowRight" || e.key === "ArrowDown") {
|
|
55
|
+
e.preventDefault();
|
|
56
|
+
move(index, 1);
|
|
57
|
+
} else if (e.key === "ArrowLeft" || e.key === "ArrowUp") {
|
|
58
|
+
e.preventDefault();
|
|
59
|
+
move(index, -1);
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
className: cn(
|
|
63
|
+
"inline-flex items-center whitespace-nowrap rounded-[5px] font-medium transition-colors",
|
|
64
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
65
|
+
"disabled:cursor-not-allowed disabled:opacity-50",
|
|
66
|
+
SIZE_CLASSES[size],
|
|
67
|
+
active ? "bg-card text-foreground shadow-sm" : "text-muted-foreground hover:text-foreground"
|
|
68
|
+
),
|
|
69
|
+
children: [
|
|
70
|
+
option.icon && /* @__PURE__ */ jsx(
|
|
71
|
+
Icon,
|
|
72
|
+
{
|
|
73
|
+
...typeof option.icon === "string" ? { name: option.icon } : { icon: option.icon }
|
|
74
|
+
}
|
|
75
|
+
),
|
|
76
|
+
/* @__PURE__ */ jsx("span", { children: option.label })
|
|
77
|
+
]
|
|
78
|
+
},
|
|
79
|
+
option.id
|
|
80
|
+
);
|
|
81
|
+
})
|
|
82
|
+
}
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
export {
|
|
86
|
+
SegmentedControl
|
|
87
|
+
};
|
|
88
|
+
//# sourceMappingURL=SegmentedControl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SegmentedControl.js","sources":["../../src/components/SegmentedControl.tsx"],"sourcesContent":["import { useRef, type ReactNode } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Icon, type StaticIconComponent } from \"../data/Icon\";\n\nexport type SegmentedSize = \"sm\" | \"md\";\n\nexport type SegmentedOption<T extends string = string> = {\n /** Stable value emitted on selection. */\n id: T;\n /** Visible label. */\n label: ReactNode;\n /** Optional leading icon (imported `Ui*` component or runtime name). */\n icon?: string | StaticIconComponent;\n /** Native title attribute. */\n title?: string;\n /** Disable this segment. */\n disabled?: boolean;\n};\n\nexport type SegmentedControlProps<T extends string = string> = {\n /** Currently selected option id. */\n value: T;\n /** Mutually-exclusive options rendered left to right. */\n options: SegmentedOption<T>[];\n /** Called with the newly selected id. */\n onChange: (id: T) => void;\n /** Control size. `md` (default) matches form controls; `sm` is denser. */\n size?: SegmentedSize;\n /** Accessible group label. */\n \"aria-label\"?: string;\n /** Classes applied to the track. */\n className?: string;\n};\n\nconst SIZE_CLASSES: Record<SegmentedSize, string> = {\n sm: \"text-xs px-density-2 py-density-1 gap-1\",\n md: \"text-sm px-density-3 py-1.5 gap-1.5\",\n};\n\n/**\n * Single-select toggle group (the Gavel `Segmented` \"Mine / All / Bots\"\n * pattern). A muted track holds mutually-exclusive segments; the active\n * segment lifts onto the card surface. Built on clicky tokens so it inherits\n * dark-mode and density. Use for small, flat choice sets — reach for `Select`\n * when the option count grows.\n */\nexport function SegmentedControl<T extends string = string>({\n value,\n options,\n onChange,\n size = \"md\",\n className,\n \"aria-label\": ariaLabel,\n}: SegmentedControlProps<T>) {\n const btnRefs = useRef<(HTMLButtonElement | null)[]>([]);\n\n const move = (from: number, dir: 1 | -1) => {\n const n = options.length;\n let i = from;\n for (let step = 0; step < n; step++) {\n i = (i + dir + n) % n;\n const opt = options[i];\n if (opt && !opt.disabled) {\n onChange(opt.id);\n btnRefs.current[i]?.focus();\n return;\n }\n }\n };\n\n return (\n <div\n role=\"radiogroup\"\n aria-label={ariaLabel}\n className={cn(\"inline-flex items-center rounded-md bg-muted p-0.5\", className)}\n >\n {options.map((option, index) => {\n const active = option.id === value;\n return (\n <button\n key={option.id}\n ref={(el) => {\n btnRefs.current[index] = el;\n }}\n type=\"button\"\n role=\"radio\"\n aria-checked={active}\n title={option.title}\n disabled={option.disabled}\n tabIndex={active ? 0 : -1}\n onClick={() => !option.disabled && onChange(option.id)}\n onKeyDown={(e) => {\n if (e.key === \"ArrowRight\" || e.key === \"ArrowDown\") {\n e.preventDefault();\n move(index, 1);\n } else if (e.key === \"ArrowLeft\" || e.key === \"ArrowUp\") {\n e.preventDefault();\n move(index, -1);\n }\n }}\n className={cn(\n \"inline-flex items-center whitespace-nowrap rounded-[5px] font-medium transition-colors\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n SIZE_CLASSES[size],\n active\n ? \"bg-card text-foreground shadow-sm\"\n : \"text-muted-foreground hover:text-foreground\",\n )}\n >\n {option.icon && (\n <Icon\n {...(typeof option.icon === \"string\" ? { name: option.icon } : { icon: option.icon })}\n />\n )}\n <span>{option.label}</span>\n </button>\n );\n })}\n </div>\n );\n}\n"],"names":[],"mappings":";;;;AAkCA,MAAM,eAA8C;AAAA,EAClD,IAAI;AAAA,EACJ,IAAI;AACN;AASO,SAAS,iBAA4C;AAAA,EAC1D;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA,cAAc;AAChB,GAA6B;AAC3B,QAAM,UAAU,OAAqC,EAAE;AAEvD,QAAM,OAAO,CAAC,MAAc,QAAgB;;AAC1C,UAAM,IAAI,QAAQ;AAClB,QAAI,IAAI;AACR,aAAS,OAAO,GAAG,OAAO,GAAG,QAAQ;AACnC,WAAK,IAAI,MAAM,KAAK;AACpB,YAAM,MAAM,QAAQ,CAAC;AACrB,UAAI,OAAO,CAAC,IAAI,UAAU;AACxB,iBAAS,IAAI,EAAE;AACf,sBAAQ,QAAQ,CAAC,MAAjB,mBAAoB;AACpB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,cAAY;AAAA,MACZ,WAAW,GAAG,sDAAsD,SAAS;AAAA,MAE5E,UAAA,QAAQ,IAAI,CAAC,QAAQ,UAAU;AAC9B,cAAM,SAAS,OAAO,OAAO;AAC7B,eACE;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,KAAK,CAAC,OAAO;AACX,sBAAQ,QAAQ,KAAK,IAAI;AAAA,YAC3B;AAAA,YACA,MAAK;AAAA,YACL,MAAK;AAAA,YACL,gBAAc;AAAA,YACd,OAAO,OAAO;AAAA,YACd,UAAU,OAAO;AAAA,YACjB,UAAU,SAAS,IAAI;AAAA,YACvB,SAAS,MAAM,CAAC,OAAO,YAAY,SAAS,OAAO,EAAE;AAAA,YACrD,WAAW,CAAC,MAAM;AAChB,kBAAI,EAAE,QAAQ,gBAAgB,EAAE,QAAQ,aAAa;AACnD,kBAAE,eAAA;AACF,qBAAK,OAAO,CAAC;AAAA,cACf,WAAW,EAAE,QAAQ,eAAe,EAAE,QAAQ,WAAW;AACvD,kBAAE,eAAA;AACF,qBAAK,OAAO,EAAE;AAAA,cAChB;AAAA,YACF;AAAA,YACA,WAAW;AAAA,cACT;AAAA,cACA;AAAA,cACA;AAAA,cACA,aAAa,IAAI;AAAA,cACjB,SACI,sCACA;AAAA,YAAA;AAAA,YAGL,UAAA;AAAA,cAAA,OAAO,QACN;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACE,GAAI,OAAO,OAAO,SAAS,WAAW,EAAE,MAAM,OAAO,KAAA,IAAS,EAAE,MAAM,OAAO,KAAA;AAAA,gBAAK;AAAA,cAAA;AAAA,cAGvF,oBAAC,QAAA,EAAM,UAAA,OAAO,MAAA,CAAM;AAAA,YAAA;AAAA,UAAA;AAAA,UAnCf,OAAO;AAAA,QAAA;AAAA,MAsClB,CAAC;AAAA,IAAA;AAAA,EAAA;AAGP;"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const jsxRuntime = require("react/jsx-runtime");
|
|
4
|
+
const react = require("react");
|
|
5
|
+
const utils = require("../lib/utils.cjs");
|
|
6
|
+
function Switch({
|
|
7
|
+
checked,
|
|
8
|
+
onChange,
|
|
9
|
+
disabled,
|
|
10
|
+
label,
|
|
11
|
+
className,
|
|
12
|
+
"aria-label": ariaLabel
|
|
13
|
+
}) {
|
|
14
|
+
const labelId = react.useId();
|
|
15
|
+
const track = /* @__PURE__ */ jsxRuntime.jsx(
|
|
16
|
+
"button",
|
|
17
|
+
{
|
|
18
|
+
type: "button",
|
|
19
|
+
role: "switch",
|
|
20
|
+
"aria-checked": checked,
|
|
21
|
+
"aria-label": label ? void 0 : ariaLabel,
|
|
22
|
+
"aria-labelledby": label ? labelId : void 0,
|
|
23
|
+
disabled,
|
|
24
|
+
onClick: () => onChange(!checked),
|
|
25
|
+
className: utils.cn(
|
|
26
|
+
"inline-flex shrink-0 items-center rounded-full px-0.5 transition-colors",
|
|
27
|
+
"h-5 w-9 density-compact:h-4 density-compact:w-7 density-spacious:h-6 density-spacious:w-11",
|
|
28
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
|
|
29
|
+
"disabled:cursor-not-allowed disabled:opacity-50",
|
|
30
|
+
checked ? "justify-end bg-primary" : "justify-start bg-input",
|
|
31
|
+
!label && className
|
|
32
|
+
),
|
|
33
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
34
|
+
"span",
|
|
35
|
+
{
|
|
36
|
+
className: utils.cn(
|
|
37
|
+
"pointer-events-none rounded-full bg-background shadow transition-all",
|
|
38
|
+
"h-4 w-4 density-compact:h-3 density-compact:w-3 density-spacious:h-5 density-spacious:w-5"
|
|
39
|
+
)
|
|
40
|
+
}
|
|
41
|
+
)
|
|
42
|
+
}
|
|
43
|
+
);
|
|
44
|
+
if (!label) return track;
|
|
45
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("label", { className: utils.cn("inline-flex cursor-pointer items-center gap-density-2", className), children: [
|
|
46
|
+
track,
|
|
47
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { id: labelId, className: "text-sm text-foreground", children: label })
|
|
48
|
+
] });
|
|
49
|
+
}
|
|
50
|
+
exports.Switch = Switch;
|
|
51
|
+
//# sourceMappingURL=Switch.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Switch.cjs","sources":["../../src/components/Switch.tsx"],"sourcesContent":["import { useId, type ReactNode } from \"react\";\nimport { cn } from \"../lib/utils\";\n\nexport type SwitchProps = {\n /** Current on/off state. */\n checked: boolean;\n /** Called with the next state when toggled. */\n onChange: (checked: boolean) => void;\n /** Disable interaction. */\n disabled?: boolean;\n /** Optional clickable label rendered after the track. */\n label?: ReactNode;\n /** Accessible name when no visible `label` is given. */\n \"aria-label\"?: string;\n /** Classes applied to the wrapper (or the track when there is no label). */\n className?: string;\n};\n\n/**\n * On/off toggle switch (`role=\"switch\"`). Density-aware: the track and knob\n * scale via `density-*` variants, so it shrinks/grows with the active\n * `data-density`. The knob is positioned with flex alignment (no translate\n * math), so it stays centered at every size.\n */\nexport function Switch({\n checked,\n onChange,\n disabled,\n label,\n className,\n \"aria-label\": ariaLabel,\n}: SwitchProps) {\n const labelId = useId();\n\n const track = (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n aria-label={label ? undefined : ariaLabel}\n aria-labelledby={label ? labelId : undefined}\n disabled={disabled}\n onClick={() => onChange(!checked)}\n className={cn(\n \"inline-flex shrink-0 items-center rounded-full px-0.5 transition-colors\",\n \"h-5 w-9 density-compact:h-4 density-compact:w-7 density-spacious:h-6 density-spacious:w-11\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n checked ? \"justify-end bg-primary\" : \"justify-start bg-input\",\n !label && className,\n )}\n >\n <span\n className={cn(\n \"pointer-events-none rounded-full bg-background shadow transition-all\",\n \"h-4 w-4 density-compact:h-3 density-compact:w-3 density-spacious:h-5 density-spacious:w-5\",\n )}\n />\n </button>\n );\n\n if (!label) return track;\n\n return (\n <label className={cn(\"inline-flex cursor-pointer items-center gap-density-2\", className)}>\n {track}\n <span id={labelId} className=\"text-sm text-foreground\">\n {label}\n </span>\n </label>\n );\n}\n"],"names":["useId","jsx","cn"],"mappings":";;;;;AAwBO,SAAS,OAAO;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAChB,GAAgB;AACd,QAAM,UAAUA,MAAAA,MAAA;AAEhB,QAAM,QACJC,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,MAAK;AAAA,MACL,gBAAc;AAAA,MACd,cAAY,QAAQ,SAAY;AAAA,MAChC,mBAAiB,QAAQ,UAAU;AAAA,MACnC;AAAA,MACA,SAAS,MAAM,SAAS,CAAC,OAAO;AAAA,MAChC,WAAWC,MAAAA;AAAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,UAAU,2BAA2B;AAAA,QACrC,CAAC,SAAS;AAAA,MAAA;AAAA,MAGZ,UAAAD,2BAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAWC,MAAAA;AAAAA,YACT;AAAA,YACA;AAAA,UAAA;AAAA,QACF;AAAA,MAAA;AAAA,IACF;AAAA,EAAA;AAIJ,MAAI,CAAC,MAAO,QAAO;AAEnB,yCACG,SAAA,EAAM,WAAWA,MAAAA,GAAG,yDAAyD,SAAS,GACpF,UAAA;AAAA,IAAA;AAAA,mCACA,QAAA,EAAK,IAAI,SAAS,WAAU,2BAC1B,UAAA,MAAA,CACH;AAAA,EAAA,GACF;AAEJ;;"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
export type SwitchProps = {
|
|
3
|
+
/** Current on/off state. */
|
|
4
|
+
checked: boolean;
|
|
5
|
+
/** Called with the next state when toggled. */
|
|
6
|
+
onChange: (checked: boolean) => void;
|
|
7
|
+
/** Disable interaction. */
|
|
8
|
+
disabled?: boolean;
|
|
9
|
+
/** Optional clickable label rendered after the track. */
|
|
10
|
+
label?: ReactNode;
|
|
11
|
+
/** Accessible name when no visible `label` is given. */
|
|
12
|
+
"aria-label"?: string;
|
|
13
|
+
/** Classes applied to the wrapper (or the track when there is no label). */
|
|
14
|
+
className?: string;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* On/off toggle switch (`role="switch"`). Density-aware: the track and knob
|
|
18
|
+
* scale via `density-*` variants, so it shrinks/grows with the active
|
|
19
|
+
* `data-density`. The knob is positioned with flex alignment (no translate
|
|
20
|
+
* math), so it stays centered at every size.
|
|
21
|
+
*/
|
|
22
|
+
export declare function Switch({ checked, onChange, disabled, label, className, "aria-label": ariaLabel, }: SwitchProps): import("react/jsx-runtime").JSX.Element;
|
|
23
|
+
//# sourceMappingURL=Switch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Switch.d.ts","sourceRoot":"","sources":["../../src/components/Switch.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAG9C,MAAM,MAAM,WAAW,GAAG;IACxB,4BAA4B;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,+CAA+C;IAC/C,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACrC,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,yDAAyD;IACzD,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,wDAAwD;IACxD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,4EAA4E;IAC5E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,EACrB,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,KAAK,EACL,SAAS,EACT,YAAY,EAAE,SAAS,GACxB,EAAE,WAAW,2CAwCb"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useId } from "react";
|
|
3
|
+
import { cn } from "../lib/utils.js";
|
|
4
|
+
function Switch({
|
|
5
|
+
checked,
|
|
6
|
+
onChange,
|
|
7
|
+
disabled,
|
|
8
|
+
label,
|
|
9
|
+
className,
|
|
10
|
+
"aria-label": ariaLabel
|
|
11
|
+
}) {
|
|
12
|
+
const labelId = useId();
|
|
13
|
+
const track = /* @__PURE__ */ jsx(
|
|
14
|
+
"button",
|
|
15
|
+
{
|
|
16
|
+
type: "button",
|
|
17
|
+
role: "switch",
|
|
18
|
+
"aria-checked": checked,
|
|
19
|
+
"aria-label": label ? void 0 : ariaLabel,
|
|
20
|
+
"aria-labelledby": label ? labelId : void 0,
|
|
21
|
+
disabled,
|
|
22
|
+
onClick: () => onChange(!checked),
|
|
23
|
+
className: cn(
|
|
24
|
+
"inline-flex shrink-0 items-center rounded-full px-0.5 transition-colors",
|
|
25
|
+
"h-5 w-9 density-compact:h-4 density-compact:w-7 density-spacious:h-6 density-spacious:w-11",
|
|
26
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
|
|
27
|
+
"disabled:cursor-not-allowed disabled:opacity-50",
|
|
28
|
+
checked ? "justify-end bg-primary" : "justify-start bg-input",
|
|
29
|
+
!label && className
|
|
30
|
+
),
|
|
31
|
+
children: /* @__PURE__ */ jsx(
|
|
32
|
+
"span",
|
|
33
|
+
{
|
|
34
|
+
className: cn(
|
|
35
|
+
"pointer-events-none rounded-full bg-background shadow transition-all",
|
|
36
|
+
"h-4 w-4 density-compact:h-3 density-compact:w-3 density-spacious:h-5 density-spacious:w-5"
|
|
37
|
+
)
|
|
38
|
+
}
|
|
39
|
+
)
|
|
40
|
+
}
|
|
41
|
+
);
|
|
42
|
+
if (!label) return track;
|
|
43
|
+
return /* @__PURE__ */ jsxs("label", { className: cn("inline-flex cursor-pointer items-center gap-density-2", className), children: [
|
|
44
|
+
track,
|
|
45
|
+
/* @__PURE__ */ jsx("span", { id: labelId, className: "text-sm text-foreground", children: label })
|
|
46
|
+
] });
|
|
47
|
+
}
|
|
48
|
+
export {
|
|
49
|
+
Switch
|
|
50
|
+
};
|
|
51
|
+
//# sourceMappingURL=Switch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Switch.js","sources":["../../src/components/Switch.tsx"],"sourcesContent":["import { useId, type ReactNode } from \"react\";\nimport { cn } from \"../lib/utils\";\n\nexport type SwitchProps = {\n /** Current on/off state. */\n checked: boolean;\n /** Called with the next state when toggled. */\n onChange: (checked: boolean) => void;\n /** Disable interaction. */\n disabled?: boolean;\n /** Optional clickable label rendered after the track. */\n label?: ReactNode;\n /** Accessible name when no visible `label` is given. */\n \"aria-label\"?: string;\n /** Classes applied to the wrapper (or the track when there is no label). */\n className?: string;\n};\n\n/**\n * On/off toggle switch (`role=\"switch\"`). Density-aware: the track and knob\n * scale via `density-*` variants, so it shrinks/grows with the active\n * `data-density`. The knob is positioned with flex alignment (no translate\n * math), so it stays centered at every size.\n */\nexport function Switch({\n checked,\n onChange,\n disabled,\n label,\n className,\n \"aria-label\": ariaLabel,\n}: SwitchProps) {\n const labelId = useId();\n\n const track = (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n aria-label={label ? undefined : ariaLabel}\n aria-labelledby={label ? labelId : undefined}\n disabled={disabled}\n onClick={() => onChange(!checked)}\n className={cn(\n \"inline-flex shrink-0 items-center rounded-full px-0.5 transition-colors\",\n \"h-5 w-9 density-compact:h-4 density-compact:w-7 density-spacious:h-6 density-spacious:w-11\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n checked ? \"justify-end bg-primary\" : \"justify-start bg-input\",\n !label && className,\n )}\n >\n <span\n className={cn(\n \"pointer-events-none rounded-full bg-background shadow transition-all\",\n \"h-4 w-4 density-compact:h-3 density-compact:w-3 density-spacious:h-5 density-spacious:w-5\",\n )}\n />\n </button>\n );\n\n if (!label) return track;\n\n return (\n <label className={cn(\"inline-flex cursor-pointer items-center gap-density-2\", className)}>\n {track}\n <span id={labelId} className=\"text-sm text-foreground\">\n {label}\n </span>\n </label>\n );\n}\n"],"names":[],"mappings":";;;AAwBO,SAAS,OAAO;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAChB,GAAgB;AACd,QAAM,UAAU,MAAA;AAEhB,QAAM,QACJ;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,MAAK;AAAA,MACL,gBAAc;AAAA,MACd,cAAY,QAAQ,SAAY;AAAA,MAChC,mBAAiB,QAAQ,UAAU;AAAA,MACnC;AAAA,MACA,SAAS,MAAM,SAAS,CAAC,OAAO;AAAA,MAChC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,UAAU,2BAA2B;AAAA,QACrC,CAAC,SAAS;AAAA,MAAA;AAAA,MAGZ,UAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAW;AAAA,YACT;AAAA,YACA;AAAA,UAAA;AAAA,QACF;AAAA,MAAA;AAAA,IACF;AAAA,EAAA;AAIJ,MAAI,CAAC,MAAO,QAAO;AAEnB,8BACG,SAAA,EAAM,WAAW,GAAG,yDAAyD,SAAS,GACpF,UAAA;AAAA,IAAA;AAAA,wBACA,QAAA,EAAK,IAAI,SAAS,WAAU,2BAC1B,UAAA,MAAA,CACH;AAAA,EAAA,GACF;AAEJ;"}
|