@flanksource/clicky-ui 0.1.0 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +29 -2
- package/dist/api-explorer.d.ts +5 -0
- package/dist/api-explorer.d.ts.map +1 -0
- package/dist/api-explorer.js +25 -0
- package/dist/api-explorer.js.map +1 -0
- package/dist/clicky.d.ts +2 -0
- package/dist/clicky.d.ts.map +1 -0
- package/dist/clicky.js +5 -0
- package/dist/clicky.js.map +1 -0
- package/dist/components/DatePicker.d.ts +18 -0
- package/dist/components/DatePicker.d.ts.map +1 -0
- package/dist/components/DatePicker.js +63 -0
- package/dist/components/DatePicker.js.map +1 -0
- package/dist/components/DateTimePicker.d.ts +18 -0
- package/dist/components/DateTimePicker.d.ts.map +1 -0
- package/dist/components/DateTimePicker.js +84 -0
- package/dist/components/DateTimePicker.js.map +1 -0
- package/dist/components/FilterBar.d.ts +180 -0
- package/dist/components/FilterBar.d.ts.map +1 -0
- package/dist/components/FilterBar.js +1685 -0
- package/dist/components/FilterBar.js.map +1 -0
- package/dist/components/MultiSelect.d.ts +19 -0
- package/dist/components/MultiSelect.d.ts.map +1 -0
- package/dist/components/MultiSelect.js +143 -0
- package/dist/components/MultiSelect.js.map +1 -0
- package/dist/components/RangeSlider.d.ts +16 -0
- package/dist/components/RangeSlider.d.ts.map +1 -0
- package/dist/components/RangeSlider.js +92 -0
- package/dist/components/RangeSlider.js.map +1 -0
- package/dist/components/button.d.ts +21 -0
- package/dist/components/button.d.ts.map +1 -0
- package/dist/components/button.js +126 -0
- package/dist/components/button.js.map +1 -0
- package/dist/components/density-switcher.d.ts +7 -0
- package/dist/components/density-switcher.d.ts.map +1 -0
- package/dist/components/density-switcher.js +32 -0
- package/dist/components/density-switcher.js.map +1 -0
- package/dist/components/icon-menu-picker.d.ts +23 -0
- package/dist/components/icon-menu-picker.d.ts.map +1 -0
- package/dist/components/icon-menu-picker.js +192 -0
- package/dist/components/icon-menu-picker.js.map +1 -0
- package/dist/components/select.d.ts +15 -0
- package/dist/components/select.d.ts.map +1 -0
- package/dist/components/select.js +39 -0
- package/dist/components/select.js.map +1 -0
- package/dist/components/theme-switcher.d.ts +7 -0
- package/dist/components/theme-switcher.d.ts.map +1 -0
- package/dist/components/theme-switcher.js +42 -0
- package/dist/components/theme-switcher.js.map +1 -0
- package/dist/components.d.ts +15 -0
- package/dist/components.d.ts.map +1 -0
- package/dist/components.js +33 -0
- package/dist/components.js.map +1 -0
- package/dist/data/AnsiHtml.d.ts +7 -0
- package/dist/data/AnsiHtml.d.ts.map +1 -0
- package/dist/data/AnsiHtml.js +71 -0
- package/dist/data/AnsiHtml.js.map +1 -0
- package/dist/data/Avatar.d.ts +32 -0
- package/dist/data/Avatar.d.ts.map +1 -0
- package/dist/data/Avatar.js +201 -0
- package/dist/data/Avatar.js.map +1 -0
- package/dist/data/AvatarBadge.d.ts +26 -0
- package/dist/data/AvatarBadge.d.ts.map +1 -0
- package/dist/data/AvatarBadge.js +104 -0
- package/dist/data/AvatarBadge.js.map +1 -0
- package/dist/data/Badge.d.ts +44 -0
- package/dist/data/Badge.d.ts.map +1 -0
- package/dist/data/Badge.js +667 -0
- package/dist/data/Badge.js.map +1 -0
- package/dist/data/Clicky.d.ts +147 -0
- package/dist/data/Clicky.d.ts.map +1 -0
- package/dist/data/Clicky.fixtures.d.ts +3 -0
- package/dist/data/Clicky.fixtures.d.ts.map +1 -0
- package/dist/data/Clicky.js +1960 -0
- package/dist/data/Clicky.js.map +1 -0
- package/dist/data/DataTable.d.ts +95 -0
- package/dist/data/DataTable.d.ts.map +1 -0
- package/dist/data/DataTable.js +1464 -0
- package/dist/data/DataTable.js.map +1 -0
- package/dist/data/FilterPill.d.ts +29 -0
- package/dist/data/FilterPill.d.ts.map +1 -0
- package/dist/data/FilterPill.js +153 -0
- package/dist/data/FilterPill.js.map +1 -0
- package/dist/data/Gauge.d.ts +15 -0
- package/dist/data/Gauge.d.ts.map +1 -0
- package/dist/data/Gauge.js +63 -0
- package/dist/data/Gauge.js.map +1 -0
- package/dist/data/Icon.d.ts +53 -0
- package/dist/data/Icon.d.ts.map +1 -0
- package/dist/data/Icon.js +115 -0
- package/dist/data/Icon.js.map +1 -0
- package/dist/data/JsonView.d.ts +8 -0
- package/dist/data/JsonView.d.ts.map +1 -0
- package/dist/data/JsonView.js +74 -0
- package/dist/data/JsonView.js.map +1 -0
- package/dist/data/KeyValueList.d.ts +17 -0
- package/dist/data/KeyValueList.d.ts.map +1 -0
- package/dist/data/KeyValueList.js +33 -0
- package/dist/data/KeyValueList.js.map +1 -0
- package/dist/data/LogViewer.d.ts +10 -0
- package/dist/data/LogViewer.d.ts.map +1 -0
- package/dist/data/LogViewer.js +46 -0
- package/dist/data/LogViewer.js.map +1 -0
- package/dist/data/LogsTable.d.ts +27 -0
- package/dist/data/LogsTable.d.ts.map +1 -0
- package/dist/data/LogsTable.js +580 -0
- package/dist/data/LogsTable.js.map +1 -0
- package/dist/data/Markdown.d.ts +6 -0
- package/dist/data/Markdown.d.ts.map +1 -0
- package/dist/data/Markdown.js +59 -0
- package/dist/data/Markdown.js.map +1 -0
- package/dist/data/MatrixTable.d.ts +22 -0
- package/dist/data/MatrixTable.d.ts.map +1 -0
- package/dist/data/MatrixTable.js +164 -0
- package/dist/data/MatrixTable.js.map +1 -0
- package/dist/data/MethodBadge.d.ts +6 -0
- package/dist/data/MethodBadge.d.ts.map +1 -0
- package/dist/data/MethodBadge.js +18 -0
- package/dist/data/MethodBadge.js.map +1 -0
- package/dist/data/ProgressBar.d.ts +13 -0
- package/dist/data/ProgressBar.d.ts.map +1 -0
- package/dist/data/ProgressBar.js +34 -0
- package/dist/data/ProgressBar.js.map +1 -0
- package/dist/data/SortableHeader.d.ts +12 -0
- package/dist/data/SortableHeader.d.ts.map +1 -0
- package/dist/data/SortableHeader.js +33 -0
- package/dist/data/SortableHeader.js.map +1 -0
- package/dist/data/TabButton.d.ts +12 -0
- package/dist/data/TabButton.d.ts.map +1 -0
- package/dist/data/TabButton.js +45 -0
- package/dist/data/TabButton.js.map +1 -0
- package/dist/data/Tree.d.ts +35 -0
- package/dist/data/Tree.d.ts.map +1 -0
- package/dist/data/Tree.js +236 -0
- package/dist/data/Tree.js.map +1 -0
- package/dist/data/TreeGroupHeader.d.ts +11 -0
- package/dist/data/TreeGroupHeader.d.ts.map +1 -0
- package/dist/data/TreeGroupHeader.js +41 -0
- package/dist/data/TreeGroupHeader.js.map +1 -0
- package/dist/data/TreeNode.d.ts +43 -0
- package/dist/data/TreeNode.d.ts.map +1 -0
- package/dist/data/TreeNode.js +100 -0
- package/dist/data/TreeNode.js.map +1 -0
- package/dist/data/cells/StatusDot.d.ts +11 -0
- package/dist/data/cells/StatusDot.d.ts.map +1 -0
- package/dist/data/cells/StatusDot.js +38 -0
- package/dist/data/cells/StatusDot.js.map +1 -0
- package/dist/data/cells/TagList.d.ts +59 -0
- package/dist/data/cells/TagList.d.ts.map +1 -0
- package/dist/data/cells/TagList.js +257 -0
- package/dist/data/cells/TagList.js.map +1 -0
- package/dist/data/cells/Timestamp.d.ts +46 -0
- package/dist/data/cells/Timestamp.d.ts.map +1 -0
- package/dist/data/cells/Timestamp.js +146 -0
- package/dist/data/cells/Timestamp.js.map +1 -0
- package/dist/data/cells/status-mapping.d.ts +8 -0
- package/dist/data/cells/status-mapping.d.ts.map +1 -0
- package/dist/data/cells/status-mapping.js +44 -0
- package/dist/data/cells/status-mapping.js.map +1 -0
- package/dist/data/code-highlight.d.ts +12 -0
- package/dist/data/code-highlight.d.ts.map +1 -0
- package/dist/data/code-highlight.js +28 -0
- package/dist/data/code-highlight.js.map +1 -0
- package/dist/data/diagnostics/DiagnosticsDetailPanel.d.ts +9 -0
- package/dist/data/diagnostics/DiagnosticsDetailPanel.d.ts.map +1 -0
- package/dist/data/diagnostics/DiagnosticsDetailPanel.js +445 -0
- package/dist/data/diagnostics/DiagnosticsDetailPanel.js.map +1 -0
- package/dist/data/diagnostics/DiagnosticsTree.d.ts +9 -0
- package/dist/data/diagnostics/DiagnosticsTree.d.ts.map +1 -0
- package/dist/data/diagnostics/DiagnosticsTree.js +78 -0
- package/dist/data/diagnostics/DiagnosticsTree.js.map +1 -0
- package/dist/data/diagnostics/ErrorDetails.d.ts +20 -0
- package/dist/data/diagnostics/ErrorDetails.d.ts.map +1 -0
- package/dist/data/diagnostics/ErrorDetails.js +157 -0
- package/dist/data/diagnostics/ErrorDetails.js.map +1 -0
- package/dist/data/diagnostics/GoroutineCard.d.ts +10 -0
- package/dist/data/diagnostics/GoroutineCard.d.ts.map +1 -0
- package/dist/data/diagnostics/GoroutineCard.js +75 -0
- package/dist/data/diagnostics/GoroutineCard.js.map +1 -0
- package/dist/data/diagnostics/JvmStackTrace.d.ts +11 -0
- package/dist/data/diagnostics/JvmStackTrace.d.ts.map +1 -0
- package/dist/data/diagnostics/JvmStackTrace.js +26 -0
- package/dist/data/diagnostics/JvmStackTrace.js.map +1 -0
- package/dist/data/diagnostics/RenderedStackTrace.d.ts +18 -0
- package/dist/data/diagnostics/RenderedStackTrace.d.ts.map +1 -0
- package/dist/data/diagnostics/RenderedStackTrace.js +235 -0
- package/dist/data/diagnostics/RenderedStackTrace.js.map +1 -0
- package/dist/data/diagnostics/ThreadCard.d.ts +10 -0
- package/dist/data/diagnostics/ThreadCard.d.ts.map +1 -0
- package/dist/data/diagnostics/ThreadCard.js +78 -0
- package/dist/data/diagnostics/ThreadCard.js.map +1 -0
- package/dist/data/diagnostics/error-diagnostics.d.ts +26 -0
- package/dist/data/diagnostics/error-diagnostics.d.ts.map +1 -0
- package/dist/data/diagnostics/error-diagnostics.js +108 -0
- package/dist/data/diagnostics/error-diagnostics.js.map +1 -0
- package/dist/data/diagnostics/fixtures.d.ts +3 -0
- package/dist/data/diagnostics/fixtures.d.ts.map +1 -0
- package/dist/data/diagnostics/jvm-stacktrace.d.ts +34 -0
- package/dist/data/diagnostics/jvm-stacktrace.d.ts.map +1 -0
- package/dist/data/diagnostics/jvm-stacktrace.js +190 -0
- package/dist/data/diagnostics/jvm-stacktrace.js.map +1 -0
- package/dist/data/diagnostics/stacktrace-parse.d.ts +11 -0
- package/dist/data/diagnostics/stacktrace-parse.d.ts.map +1 -0
- package/dist/data/diagnostics/stacktrace-parse.js +87 -0
- package/dist/data/diagnostics/stacktrace-parse.js.map +1 -0
- package/dist/data/diagnostics/stacktrace.d.ts +38 -0
- package/dist/data/diagnostics/stacktrace.d.ts.map +1 -0
- package/dist/data/diagnostics/stacktrace.js +119 -0
- package/dist/data/diagnostics/stacktrace.js.map +1 -0
- package/dist/data/diagnostics/types.d.ts +30 -0
- package/dist/data/diagnostics/types.d.ts.map +1 -0
- package/dist/data/diagnostics/utils.d.ts +8 -0
- package/dist/data/diagnostics/utils.d.ts.map +1 -0
- package/dist/data/diagnostics/utils.js +59 -0
- package/dist/data/diagnostics/utils.js.map +1 -0
- package/dist/data/har/HarPanel.d.ts +9 -0
- package/dist/data/har/HarPanel.d.ts.map +1 -0
- package/dist/data/har/HarPanel.js +175 -0
- package/dist/data/har/HarPanel.js.map +1 -0
- package/dist/data/har/fixtures.d.ts +3 -0
- package/dist/data/har/fixtures.d.ts.map +1 -0
- package/dist/data/har/types.d.ts +47 -0
- package/dist/data/har/types.d.ts.map +1 -0
- package/dist/data.d.ts +39 -0
- package/dist/data.d.ts.map +1 -0
- package/dist/data.js +109 -0
- package/dist/data.js.map +1 -0
- package/dist/hooks/use-density.d.ts +22 -0
- package/dist/hooks/use-density.d.ts.map +1 -0
- package/dist/hooks/use-density.js +54 -0
- package/dist/hooks/use-density.js.map +1 -0
- package/dist/hooks/use-history-route.d.ts +6 -0
- package/dist/hooks/use-history-route.d.ts.map +1 -0
- package/dist/hooks/use-history-route.js +31 -0
- package/dist/hooks/use-history-route.js.map +1 -0
- package/dist/hooks/use-sort.d.ts +17 -0
- package/dist/hooks/use-sort.d.ts.map +1 -0
- package/dist/hooks/use-sort.js +42 -0
- package/dist/hooks/use-sort.js.map +1 -0
- package/dist/hooks/use-theme.d.ts +17 -0
- package/dist/hooks/use-theme.d.ts.map +1 -0
- package/dist/hooks/use-theme.js +68 -0
- package/dist/hooks/use-theme.js.map +1 -0
- package/dist/hooks.d.ts +5 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +14 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +195 -0
- package/dist/index.js.map +1 -0
- package/dist/layout/Section.d.ts +23 -0
- package/dist/layout/Section.d.ts.map +1 -0
- package/dist/layout/Section.js +73 -0
- package/dist/layout/Section.js.map +1 -0
- package/dist/layout/SplitPane.d.ts +13 -0
- package/dist/layout/SplitPane.d.ts.map +1 -0
- package/dist/layout/SplitPane.js +72 -0
- package/dist/layout/SplitPane.js.map +1 -0
- package/dist/lib/palette.d.ts +4 -0
- package/dist/lib/palette.d.ts.map +1 -0
- package/dist/lib/palette.js +35 -0
- package/dist/lib/palette.js.map +1 -0
- package/dist/lib/size.d.ts +6 -0
- package/dist/lib/size.d.ts.map +1 -0
- package/dist/lib/size.js +14 -0
- package/dist/lib/size.js.map +1 -0
- package/dist/lib/utils.d.ts +3 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +9 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/overlay/HoverCard.d.ts +13 -0
- package/dist/overlay/HoverCard.d.ts.map +1 -0
- package/dist/overlay/HoverCard.js +170 -0
- package/dist/overlay/HoverCard.js.map +1 -0
- package/dist/overlay/Modal.d.ts +17 -0
- package/dist/overlay/Modal.d.ts.map +1 -0
- package/dist/overlay/Modal.js +91 -0
- package/dist/overlay/Modal.js.map +1 -0
- package/dist/rpc/AcceptPicker.d.ts +52 -0
- package/dist/rpc/AcceptPicker.d.ts.map +1 -0
- package/dist/rpc/AcceptPicker.js +126 -0
- package/dist/rpc/AcceptPicker.js.map +1 -0
- package/dist/rpc/ApiExplorer.d.ts +11 -0
- package/dist/rpc/ApiExplorer.d.ts.map +1 -0
- package/dist/rpc/ApiExplorer.js +37 -0
- package/dist/rpc/ApiExplorer.js.map +1 -0
- package/dist/rpc/CommandForm.d.ts +15 -0
- package/dist/rpc/CommandForm.d.ts.map +1 -0
- package/dist/rpc/CommandForm.js +356 -0
- package/dist/rpc/CommandForm.js.map +1 -0
- package/dist/rpc/CommandOutput.d.ts +11 -0
- package/dist/rpc/CommandOutput.d.ts.map +1 -0
- package/dist/rpc/CommandOutput.js +195 -0
- package/dist/rpc/CommandOutput.js.map +1 -0
- package/dist/rpc/EndpointList.d.ts +18 -0
- package/dist/rpc/EndpointList.d.ts.map +1 -0
- package/dist/rpc/EndpointList.js +56 -0
- package/dist/rpc/EndpointList.js.map +1 -0
- package/dist/rpc/EntityExplorerApp.d.ts +15 -0
- package/dist/rpc/EntityExplorerApp.d.ts.map +1 -0
- package/dist/rpc/EntityExplorerApp.js +282 -0
- package/dist/rpc/EntityExplorerApp.js.map +1 -0
- package/dist/rpc/ExecutionResult.d.ts +14 -0
- package/dist/rpc/ExecutionResult.d.ts.map +1 -0
- package/dist/rpc/ExecutionResult.js +51 -0
- package/dist/rpc/ExecutionResult.js.map +1 -0
- package/dist/rpc/FilterForm.d.ts +22 -0
- package/dist/rpc/FilterForm.d.ts.map +1 -0
- package/dist/rpc/FilterForm.js +392 -0
- package/dist/rpc/FilterForm.js.map +1 -0
- package/dist/rpc/InlineError.d.ts +7 -0
- package/dist/rpc/InlineError.d.ts.map +1 -0
- package/dist/rpc/InlineError.js +54 -0
- package/dist/rpc/InlineError.js.map +1 -0
- package/dist/rpc/OperationActionDialog.d.ts +12 -0
- package/dist/rpc/OperationActionDialog.d.ts.map +1 -0
- package/dist/rpc/OperationActionDialog.js +105 -0
- package/dist/rpc/OperationActionDialog.js.map +1 -0
- package/dist/rpc/OperationCatalog.d.ts +21 -0
- package/dist/rpc/OperationCatalog.d.ts.map +1 -0
- package/dist/rpc/OperationCatalog.js +339 -0
- package/dist/rpc/OperationCatalog.js.map +1 -0
- package/dist/rpc/OperationCommandPage.d.ts +22 -0
- package/dist/rpc/OperationCommandPage.d.ts.map +1 -0
- package/dist/rpc/OperationCommandPage.js +484 -0
- package/dist/rpc/OperationCommandPage.js.map +1 -0
- package/dist/rpc/OperationEntityPage.d.ts +23 -0
- package/dist/rpc/OperationEntityPage.d.ts.map +1 -0
- package/dist/rpc/OperationEntityPage.js +218 -0
- package/dist/rpc/OperationEntityPage.js.map +1 -0
- package/dist/rpc/classify.d.ts +8 -0
- package/dist/rpc/classify.d.ts.map +1 -0
- package/dist/rpc/classify.js +76 -0
- package/dist/rpc/classify.js.map +1 -0
- package/dist/rpc/clickyMetadata.d.ts +12 -0
- package/dist/rpc/clickyMetadata.d.ts.map +1 -0
- package/dist/rpc/clickyMetadata.js +71 -0
- package/dist/rpc/clickyMetadata.js.map +1 -0
- package/dist/rpc/formMetadata.d.ts +27 -0
- package/dist/rpc/formMetadata.d.ts.map +1 -0
- package/dist/rpc/formMetadata.js +250 -0
- package/dist/rpc/formMetadata.js.map +1 -0
- package/dist/rpc/types.d.ts +109 -0
- package/dist/rpc/types.d.ts.map +1 -0
- package/dist/rpc/types.js +8 -0
- package/dist/rpc/types.js.map +1 -0
- package/dist/rpc/useOperations.d.ts +346 -0
- package/dist/rpc/useOperations.d.ts.map +1 -0
- package/dist/rpc/useOperations.js +31 -0
- package/dist/rpc/useOperations.js.map +1 -0
- package/dist/rpc.d.ts +14 -0
- package/dist/rpc.d.ts.map +1 -0
- package/dist/rpc.js +37 -0
- package/dist/rpc.js.map +1 -0
- package/dist/styles.css +2 -0
- package/dist/styles.d.ts +1 -0
- package/dist/styles.d.ts.map +1 -0
- package/dist/styles.js +2 -0
- package/dist/styles.js.map +1 -0
- package/dist/tailwind-preset.d.ts +4 -0
- package/dist/tailwind-preset.d.ts.map +1 -0
- package/dist/tailwind-preset.js +69 -0
- package/dist/tailwind-preset.js.map +1 -0
- package/dist/utils.d.ts +4 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +12 -0
- package/dist/utils.js.map +1 -0
- package/package.json +83 -40
- package/dist/index.d.mts +0 -834
- package/dist/index.d.mts.map +0 -1
- package/dist/index.mjs +0 -2918
- package/dist/index.mjs.map +0 -1
- package/dist/tailwind-preset.d.mts +0 -7
- package/dist/tailwind-preset.d.mts.map +0 -1
- package/dist/tailwind-preset.mjs +0 -64
- package/dist/tailwind-preset.mjs.map +0 -1
- package/src/styles/tokens.css +0 -78
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Slot } from "@radix-ui/react-slot";
|
|
3
|
+
import { cva } from "class-variance-authority";
|
|
4
|
+
import { forwardRef } from "react";
|
|
5
|
+
import { cn } from "../lib/utils.js";
|
|
6
|
+
const buttonVariants = cva(
|
|
7
|
+
"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
|
|
8
|
+
{
|
|
9
|
+
variants: {
|
|
10
|
+
variant: {
|
|
11
|
+
default: "bg-primary text-primary-foreground hover:bg-primary/90",
|
|
12
|
+
destructive: "bg-destructive text-destructive-foreground hover:bg-destructive/90",
|
|
13
|
+
outline: "border border-input bg-background hover:bg-accent hover:text-accent-foreground",
|
|
14
|
+
secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",
|
|
15
|
+
ghost: "hover:bg-accent hover:text-accent-foreground",
|
|
16
|
+
link: "text-primary underline-offset-4 hover:underline"
|
|
17
|
+
},
|
|
18
|
+
size: {
|
|
19
|
+
default: "h-control-h px-control-px py-2",
|
|
20
|
+
sm: "h-8 rounded-md px-3 text-xs",
|
|
21
|
+
lg: "h-10 rounded-md px-8",
|
|
22
|
+
icon: "h-control-h w-control-h"
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
defaultVariants: {
|
|
26
|
+
variant: "default",
|
|
27
|
+
size: "default"
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
);
|
|
31
|
+
function ButtonSpinner() {
|
|
32
|
+
return /* @__PURE__ */ jsxs(
|
|
33
|
+
"svg",
|
|
34
|
+
{
|
|
35
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
36
|
+
width: "32",
|
|
37
|
+
height: "32",
|
|
38
|
+
viewBox: "0 0 24 24",
|
|
39
|
+
"aria-hidden": "true",
|
|
40
|
+
className: "h-4 w-4 shrink-0",
|
|
41
|
+
children: [
|
|
42
|
+
/* @__PURE__ */ jsx("circle", { cx: "4", cy: "12", r: "3", fill: "#151515", children: /* @__PURE__ */ jsx(
|
|
43
|
+
"animate",
|
|
44
|
+
{
|
|
45
|
+
id: "SVG7x14Dcom",
|
|
46
|
+
fill: "freeze",
|
|
47
|
+
attributeName: "opacity",
|
|
48
|
+
begin: "0;SVGqSjG0dUp.end-0.25s",
|
|
49
|
+
dur: "0.75s",
|
|
50
|
+
values: "1;0.2"
|
|
51
|
+
}
|
|
52
|
+
) }),
|
|
53
|
+
/* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", r: "3", fill: "#151515", opacity: "0.4", children: /* @__PURE__ */ jsx(
|
|
54
|
+
"animate",
|
|
55
|
+
{
|
|
56
|
+
fill: "freeze",
|
|
57
|
+
attributeName: "opacity",
|
|
58
|
+
begin: "SVG7x14Dcom.begin+0.15s",
|
|
59
|
+
dur: "0.75s",
|
|
60
|
+
values: "1;0.2"
|
|
61
|
+
}
|
|
62
|
+
) }),
|
|
63
|
+
/* @__PURE__ */ jsx("circle", { cx: "20", cy: "12", r: "3", fill: "#151515", opacity: "0.3", children: /* @__PURE__ */ jsx(
|
|
64
|
+
"animate",
|
|
65
|
+
{
|
|
66
|
+
id: "SVGqSjG0dUp",
|
|
67
|
+
fill: "freeze",
|
|
68
|
+
attributeName: "opacity",
|
|
69
|
+
begin: "SVG7x14Dcom.begin+0.3s",
|
|
70
|
+
dur: "0.75s",
|
|
71
|
+
values: "1;0.2"
|
|
72
|
+
}
|
|
73
|
+
) })
|
|
74
|
+
]
|
|
75
|
+
}
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
const Button = forwardRef(
|
|
79
|
+
({
|
|
80
|
+
children,
|
|
81
|
+
className,
|
|
82
|
+
disabled,
|
|
83
|
+
loading = false,
|
|
84
|
+
loadingLabel,
|
|
85
|
+
variant,
|
|
86
|
+
size,
|
|
87
|
+
asChild = false,
|
|
88
|
+
...props
|
|
89
|
+
}, ref) => {
|
|
90
|
+
const Comp = asChild ? Slot : "button";
|
|
91
|
+
const content = loadingLabel !== void 0 ? loadingLabel : children;
|
|
92
|
+
if (asChild) {
|
|
93
|
+
return /* @__PURE__ */ jsx(
|
|
94
|
+
Comp,
|
|
95
|
+
{
|
|
96
|
+
ref,
|
|
97
|
+
"aria-busy": loading || void 0,
|
|
98
|
+
className: cn(buttonVariants({ variant, size }), className),
|
|
99
|
+
disabled: disabled || loading,
|
|
100
|
+
...props,
|
|
101
|
+
children
|
|
102
|
+
}
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
return /* @__PURE__ */ jsxs(
|
|
106
|
+
Comp,
|
|
107
|
+
{
|
|
108
|
+
ref,
|
|
109
|
+
"aria-busy": loading || void 0,
|
|
110
|
+
className: cn(buttonVariants({ variant, size }), className),
|
|
111
|
+
disabled: disabled || loading,
|
|
112
|
+
...props,
|
|
113
|
+
children: [
|
|
114
|
+
loading && /* @__PURE__ */ jsx(ButtonSpinner, {}),
|
|
115
|
+
content
|
|
116
|
+
]
|
|
117
|
+
}
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
);
|
|
121
|
+
Button.displayName = "Button";
|
|
122
|
+
export {
|
|
123
|
+
Button,
|
|
124
|
+
buttonVariants
|
|
125
|
+
};
|
|
126
|
+
//# sourceMappingURL=button.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"button.js","sources":["../../src/components/button.tsx"],"sourcesContent":["import { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { forwardRef, type ButtonHTMLAttributes, type ReactNode } from \"react\";\nimport { cn } from \"../lib/utils\";\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive: \"bg-destructive text-destructive-foreground hover:bg-destructive/90\",\n outline: \"border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n secondary: \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-control-h px-control-px py-2\",\n sm: \"h-8 rounded-md px-3 text-xs\",\n lg: \"h-10 rounded-md px-8\",\n icon: \"h-control-h w-control-h\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\nexport type ButtonProps = ButtonHTMLAttributes<HTMLButtonElement> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean;\n loading?: boolean;\n loadingLabel?: ReactNode;\n };\n\nfunction ButtonSpinner() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n className=\"h-4 w-4 shrink-0\"\n >\n <circle cx=\"4\" cy=\"12\" r=\"3\" fill=\"#151515\">\n <animate\n id=\"SVG7x14Dcom\"\n fill=\"freeze\"\n attributeName=\"opacity\"\n begin=\"0;SVGqSjG0dUp.end-0.25s\"\n dur=\"0.75s\"\n values=\"1;0.2\"\n />\n </circle>\n <circle cx=\"12\" cy=\"12\" r=\"3\" fill=\"#151515\" opacity=\"0.4\">\n <animate\n fill=\"freeze\"\n attributeName=\"opacity\"\n begin=\"SVG7x14Dcom.begin+0.15s\"\n dur=\"0.75s\"\n values=\"1;0.2\"\n />\n </circle>\n <circle cx=\"20\" cy=\"12\" r=\"3\" fill=\"#151515\" opacity=\"0.3\">\n <animate\n id=\"SVGqSjG0dUp\"\n fill=\"freeze\"\n attributeName=\"opacity\"\n begin=\"SVG7x14Dcom.begin+0.3s\"\n dur=\"0.75s\"\n values=\"1;0.2\"\n />\n </circle>\n </svg>\n );\n}\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n children,\n className,\n disabled,\n loading = false,\n loadingLabel,\n variant,\n size,\n asChild = false,\n ...props\n },\n ref,\n ) => {\n const Comp = asChild ? Slot : \"button\";\n const content = loadingLabel !== undefined ? loadingLabel : children;\n\n if (asChild) {\n return (\n <Comp\n ref={ref}\n aria-busy={loading || undefined}\n className={cn(buttonVariants({ variant, size }), className)}\n disabled={disabled || loading}\n {...props}\n >\n {children}\n </Comp>\n );\n }\n\n return (\n <Comp\n ref={ref}\n aria-busy={loading || undefined}\n className={cn(buttonVariants({ variant, size }), className)}\n disabled={disabled || loading}\n {...props}\n >\n {loading && <ButtonSpinner />}\n {content}\n </Comp>\n );\n },\n);\nButton.displayName = \"Button\";\n\nexport { buttonVariants };\n"],"names":[],"mappings":";;;;;AAKA,MAAM,iBAAiB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SAAS;AAAA,QACT,aAAa;AAAA,QACb,SAAS;AAAA,QACT,WAAW;AAAA,QACX,OAAO;AAAA,QACP,MAAM;AAAA,MAAA;AAAA,MAER,MAAM;AAAA,QACJ,SAAS;AAAA,QACT,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,iBAAiB;AAAA,MACf,SAAS;AAAA,MACT,MAAM;AAAA,IAAA;AAAA,EACR;AAEJ;AASA,SAAS,gBAAgB;AACvB,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAM;AAAA,MACN,OAAM;AAAA,MACN,QAAO;AAAA,MACP,SAAQ;AAAA,MACR,eAAY;AAAA,MACZ,WAAU;AAAA,MAEV,UAAA;AAAA,QAAA,oBAAC,UAAA,EAAO,IAAG,KAAI,IAAG,MAAK,GAAE,KAAI,MAAK,WAChC,UAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,IAAG;AAAA,YACH,MAAK;AAAA,YACL,eAAc;AAAA,YACd,OAAM;AAAA,YACN,KAAI;AAAA,YACJ,QAAO;AAAA,UAAA;AAAA,QAAA,GAEX;AAAA,QACA,oBAAC,UAAA,EAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI,MAAK,WAAU,SAAQ,OACnD,UAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,eAAc;AAAA,YACd,OAAM;AAAA,YACN,KAAI;AAAA,YACJ,QAAO;AAAA,UAAA;AAAA,QAAA,GAEX;AAAA,QACA,oBAAC,UAAA,EAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI,MAAK,WAAU,SAAQ,OACnD,UAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,IAAG;AAAA,YACH,MAAK;AAAA,YACL,eAAc;AAAA,YACd,OAAM;AAAA,YACN,KAAI;AAAA,YACJ,QAAO;AAAA,UAAA;AAAA,QAAA,EACT,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN;AAEO,MAAM,SAAS;AAAA,EACpB,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV,GAAG;AAAA,EAAA,GAEL,QACG;AACH,UAAM,OAAO,UAAU,OAAO;AAC9B,UAAM,UAAU,iBAAiB,SAAY,eAAe;AAE5D,QAAI,SAAS;AACX,aACE;AAAA,QAAC;AAAA,QAAA;AAAA,UACC;AAAA,UACA,aAAW,WAAW;AAAA,UACtB,WAAW,GAAG,eAAe,EAAE,SAAS,KAAA,CAAM,GAAG,SAAS;AAAA,UAC1D,UAAU,YAAY;AAAA,UACrB,GAAG;AAAA,UAEH;AAAA,QAAA;AAAA,MAAA;AAAA,IAGP;AAEA,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA,aAAW,WAAW;AAAA,QACtB,WAAW,GAAG,eAAe,EAAE,SAAS,KAAA,CAAM,GAAG,SAAS;AAAA,QAC1D,UAAU,YAAY;AAAA,QACrB,GAAG;AAAA,QAEH,UAAA;AAAA,UAAA,+BAAY,eAAA,EAAc;AAAA,UAC1B;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAGP;AACF;AACA,OAAO,cAAc;"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type DensitySwitcherProps = {
|
|
2
|
+
className?: string;
|
|
3
|
+
triggerClassName?: string;
|
|
4
|
+
menuClassName?: string;
|
|
5
|
+
};
|
|
6
|
+
export declare const DensitySwitcher: import('react').ForwardRefExoticComponent<DensitySwitcherProps & import('react').RefAttributes<HTMLDivElement>>;
|
|
7
|
+
//# sourceMappingURL=density-switcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"density-switcher.d.ts","sourceRoot":"","sources":["../../src/components/density-switcher.tsx"],"names":[],"mappings":"AAUA,MAAM,MAAM,oBAAoB,GAAG;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,eAAO,MAAM,eAAe,iHAgB3B,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef } from "react";
|
|
3
|
+
import { IconMenuPicker } from "./icon-menu-picker.js";
|
|
4
|
+
import { useDensity } from "../hooks/use-density.js";
|
|
5
|
+
const DENSITY_OPTIONS = [
|
|
6
|
+
{ value: "compact", icon: "ph:rows", label: "compact" },
|
|
7
|
+
{ value: "comfortable", icon: "ph:list", label: "comfortable" },
|
|
8
|
+
{ value: "spacious", icon: "ph:list-dashes", label: "spacious" }
|
|
9
|
+
];
|
|
10
|
+
const DensitySwitcher = forwardRef(
|
|
11
|
+
({ className, triggerClassName, menuClassName }, ref) => {
|
|
12
|
+
const { density, setDensity } = useDensity();
|
|
13
|
+
return /* @__PURE__ */ jsx(
|
|
14
|
+
IconMenuPicker,
|
|
15
|
+
{
|
|
16
|
+
ref,
|
|
17
|
+
value: density,
|
|
18
|
+
onChange: setDensity,
|
|
19
|
+
options: DENSITY_OPTIONS,
|
|
20
|
+
ariaLabel: "Density",
|
|
21
|
+
className,
|
|
22
|
+
triggerClassName,
|
|
23
|
+
menuClassName
|
|
24
|
+
}
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
);
|
|
28
|
+
DensitySwitcher.displayName = "DensitySwitcher";
|
|
29
|
+
export {
|
|
30
|
+
DensitySwitcher
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=density-switcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"density-switcher.js","sources":["../../src/components/density-switcher.tsx"],"sourcesContent":["import { forwardRef } from \"react\";\nimport { IconMenuPicker, type IconMenuOption } from \"./icon-menu-picker\";\nimport { useDensity, type Density } from \"../hooks/use-density\";\n\nconst DENSITY_OPTIONS: IconMenuOption<Density>[] = [\n { value: \"compact\", icon: \"ph:rows\", label: \"compact\" },\n { value: \"comfortable\", icon: \"ph:list\", label: \"comfortable\" },\n { value: \"spacious\", icon: \"ph:list-dashes\", label: \"spacious\" },\n];\n\nexport type DensitySwitcherProps = {\n className?: string;\n triggerClassName?: string;\n menuClassName?: string;\n};\n\nexport const DensitySwitcher = forwardRef<HTMLDivElement, DensitySwitcherProps>(\n ({ className, triggerClassName, menuClassName }, ref) => {\n const { density, setDensity } = useDensity();\n return (\n <IconMenuPicker<Density>\n ref={ref}\n value={density}\n onChange={setDensity}\n options={DENSITY_OPTIONS}\n ariaLabel=\"Density\"\n className={className}\n triggerClassName={triggerClassName}\n menuClassName={menuClassName}\n />\n );\n },\n);\nDensitySwitcher.displayName = \"DensitySwitcher\";\n"],"names":[],"mappings":";;;;AAIA,MAAM,kBAA6C;AAAA,EACjD,EAAE,OAAO,WAAW,MAAM,WAAW,OAAO,UAAA;AAAA,EAC5C,EAAE,OAAO,eAAe,MAAM,WAAW,OAAO,cAAA;AAAA,EAChD,EAAE,OAAO,YAAY,MAAM,kBAAkB,OAAO,WAAA;AACtD;AAQO,MAAM,kBAAkB;AAAA,EAC7B,CAAC,EAAE,WAAW,kBAAkB,cAAA,GAAiB,QAAQ;AACvD,UAAM,EAAE,SAAS,WAAA,IAAe,WAAA;AAChC,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA,OAAO;AAAA,QACP,UAAU;AAAA,QACV,SAAS;AAAA,QACT,WAAU;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IAAA;AAAA,EAGN;AACF;AACA,gBAAgB,cAAc;"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
export type IconMenuOption<T extends string> = {
|
|
3
|
+
value: T;
|
|
4
|
+
icon: string;
|
|
5
|
+
label: string;
|
|
6
|
+
description?: string;
|
|
7
|
+
};
|
|
8
|
+
export type IconMenuPickerProps<T extends string> = {
|
|
9
|
+
value: T;
|
|
10
|
+
onChange: (next: T) => void;
|
|
11
|
+
options: IconMenuOption<T>[];
|
|
12
|
+
ariaLabel: string;
|
|
13
|
+
triggerTitle?: string | undefined;
|
|
14
|
+
footer?: ReactNode | undefined;
|
|
15
|
+
showLabel?: boolean | undefined;
|
|
16
|
+
className?: string | undefined;
|
|
17
|
+
triggerClassName?: string | undefined;
|
|
18
|
+
menuClassName?: string | undefined;
|
|
19
|
+
};
|
|
20
|
+
export declare const IconMenuPicker: <T extends string>(props: IconMenuPickerProps<T> & {
|
|
21
|
+
ref?: React.Ref<HTMLDivElement>;
|
|
22
|
+
}) => JSX.Element;
|
|
23
|
+
//# sourceMappingURL=icon-menu-picker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icon-menu-picker.d.ts","sourceRoot":"","sources":["../../src/components/icon-menu-picker.tsx"],"names":[],"mappings":"AAAA,OAAO,EASL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAKf,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,MAAM,IAAI;IAC7C,KAAK,EAAE,CAAC,CAAC;IACT,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,mBAAmB,CAAC,CAAC,SAAS,MAAM,IAAI;IAClD,KAAK,EAAE,CAAC,CAAC;IACT,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC;IAC5B,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,MAAM,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAC/B,SAAS,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC,CAAC;AA4MF,eAAO,MAAM,cAAc,EAAsC,CAAC,CAAC,SAAS,MAAM,EAChF,KAAK,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG;IAAE,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;CAAE,KAChE,GAAG,CAAC,OAAO,CAAC"}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import { jsxs, jsx, Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef, useRef, useState, useImperativeHandle, useMemo, useCallback, useEffect } from "react";
|
|
3
|
+
import { cn } from "../lib/utils.js";
|
|
4
|
+
import { Icon } from "../data/Icon.js";
|
|
5
|
+
import { Button } from "./button.js";
|
|
6
|
+
function IconMenuPickerInner({
|
|
7
|
+
value,
|
|
8
|
+
onChange,
|
|
9
|
+
options,
|
|
10
|
+
ariaLabel,
|
|
11
|
+
triggerTitle,
|
|
12
|
+
footer,
|
|
13
|
+
showLabel,
|
|
14
|
+
className,
|
|
15
|
+
triggerClassName,
|
|
16
|
+
menuClassName
|
|
17
|
+
}, ref) {
|
|
18
|
+
const rootRef = useRef(null);
|
|
19
|
+
const triggerRef = useRef(null);
|
|
20
|
+
const itemRefs = useRef([]);
|
|
21
|
+
const [open, setOpen] = useState(false);
|
|
22
|
+
useImperativeHandle(ref, () => rootRef.current);
|
|
23
|
+
const activeIndex = useMemo(
|
|
24
|
+
() => Math.max(
|
|
25
|
+
0,
|
|
26
|
+
options.findIndex((option) => option.value === value)
|
|
27
|
+
),
|
|
28
|
+
[options, value]
|
|
29
|
+
);
|
|
30
|
+
const close = useCallback((returnFocus) => {
|
|
31
|
+
var _a;
|
|
32
|
+
setOpen(false);
|
|
33
|
+
if (returnFocus) (_a = triggerRef.current) == null ? void 0 : _a.focus();
|
|
34
|
+
}, []);
|
|
35
|
+
const select = useCallback(
|
|
36
|
+
(next) => {
|
|
37
|
+
onChange(next);
|
|
38
|
+
close(true);
|
|
39
|
+
},
|
|
40
|
+
[close, onChange]
|
|
41
|
+
);
|
|
42
|
+
useEffect(() => {
|
|
43
|
+
if (!open) return;
|
|
44
|
+
const onPointerDown = (event) => {
|
|
45
|
+
var _a;
|
|
46
|
+
if (event.button !== 0) return;
|
|
47
|
+
if (!((_a = rootRef.current) == null ? void 0 : _a.contains(event.target))) {
|
|
48
|
+
close(false);
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
const onKeyDown = (event) => {
|
|
52
|
+
if (event.key === "Escape") {
|
|
53
|
+
event.preventDefault();
|
|
54
|
+
close(true);
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
document.addEventListener("pointerdown", onPointerDown);
|
|
58
|
+
document.addEventListener("keydown", onKeyDown);
|
|
59
|
+
return () => {
|
|
60
|
+
document.removeEventListener("pointerdown", onPointerDown);
|
|
61
|
+
document.removeEventListener("keydown", onKeyDown);
|
|
62
|
+
};
|
|
63
|
+
}, [close, open]);
|
|
64
|
+
useEffect(() => {
|
|
65
|
+
if (!open) return;
|
|
66
|
+
const node = itemRefs.current[activeIndex];
|
|
67
|
+
node == null ? void 0 : node.focus();
|
|
68
|
+
}, [activeIndex, open]);
|
|
69
|
+
const focusItem = (index) => {
|
|
70
|
+
var _a;
|
|
71
|
+
const wrapped = (index + options.length) % options.length;
|
|
72
|
+
(_a = itemRefs.current[wrapped]) == null ? void 0 : _a.focus();
|
|
73
|
+
};
|
|
74
|
+
const onMenuKeyDown = (event) => {
|
|
75
|
+
const focusedIndex = itemRefs.current.findIndex((node) => node === document.activeElement);
|
|
76
|
+
if (event.key === "ArrowDown") {
|
|
77
|
+
event.preventDefault();
|
|
78
|
+
focusItem((focusedIndex < 0 ? activeIndex : focusedIndex) + 1);
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
if (event.key === "ArrowUp") {
|
|
82
|
+
event.preventDefault();
|
|
83
|
+
focusItem((focusedIndex < 0 ? activeIndex : focusedIndex) - 1);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
if (event.key === "Home") {
|
|
87
|
+
event.preventDefault();
|
|
88
|
+
focusItem(0);
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
if (event.key === "End") {
|
|
92
|
+
event.preventDefault();
|
|
93
|
+
focusItem(options.length - 1);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
if (event.key === "Tab") {
|
|
97
|
+
close(false);
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
const onTriggerKeyDown = (event) => {
|
|
101
|
+
if (event.key === "ArrowDown" || event.key === "Enter" || event.key === " ") {
|
|
102
|
+
event.preventDefault();
|
|
103
|
+
setOpen(true);
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
const selected = options[activeIndex];
|
|
107
|
+
if (!selected) {
|
|
108
|
+
throw new Error(`IconMenuPicker: value "${value}" not found in options for ${ariaLabel}`);
|
|
109
|
+
}
|
|
110
|
+
return /* @__PURE__ */ jsxs("div", { ref: rootRef, className: cn("relative inline-flex", showLabel && "w-full", className), children: [
|
|
111
|
+
/* @__PURE__ */ jsxs(
|
|
112
|
+
Button,
|
|
113
|
+
{
|
|
114
|
+
ref: triggerRef,
|
|
115
|
+
type: "button",
|
|
116
|
+
variant: "ghost",
|
|
117
|
+
size: showLabel ? "default" : "icon",
|
|
118
|
+
"aria-label": ariaLabel,
|
|
119
|
+
"aria-haspopup": "menu",
|
|
120
|
+
"aria-expanded": open,
|
|
121
|
+
title: triggerTitle ?? `${ariaLabel}: ${selected.label}`,
|
|
122
|
+
onClick: () => setOpen((current) => !current),
|
|
123
|
+
onKeyDown: onTriggerKeyDown,
|
|
124
|
+
className: cn(
|
|
125
|
+
"text-muted-foreground hover:text-foreground",
|
|
126
|
+
showLabel && "w-full justify-start",
|
|
127
|
+
triggerClassName
|
|
128
|
+
),
|
|
129
|
+
children: [
|
|
130
|
+
/* @__PURE__ */ jsx(Icon, { name: selected.icon, className: showLabel ? "shrink-0 text-foreground" : void 0 }),
|
|
131
|
+
showLabel && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
132
|
+
/* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate text-left capitalize", children: selected.label }),
|
|
133
|
+
/* @__PURE__ */ jsx(Icon, { name: "ph:caret-up-down", className: "shrink-0 text-muted-foreground" })
|
|
134
|
+
] })
|
|
135
|
+
]
|
|
136
|
+
}
|
|
137
|
+
),
|
|
138
|
+
open && /* @__PURE__ */ jsxs(
|
|
139
|
+
"div",
|
|
140
|
+
{
|
|
141
|
+
role: "menu",
|
|
142
|
+
"aria-label": ariaLabel,
|
|
143
|
+
onKeyDown: onMenuKeyDown,
|
|
144
|
+
className: cn(
|
|
145
|
+
"absolute left-0 top-[calc(100%+0.375rem)] z-50 min-w-[12rem] rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-lg shadow-black/5",
|
|
146
|
+
menuClassName
|
|
147
|
+
),
|
|
148
|
+
children: [
|
|
149
|
+
options.map((option, index) => {
|
|
150
|
+
const active = option.value === value;
|
|
151
|
+
return /* @__PURE__ */ jsxs(
|
|
152
|
+
"button",
|
|
153
|
+
{
|
|
154
|
+
ref: (node) => {
|
|
155
|
+
itemRefs.current[index] = node;
|
|
156
|
+
},
|
|
157
|
+
type: "button",
|
|
158
|
+
role: "menuitemradio",
|
|
159
|
+
"aria-checked": active,
|
|
160
|
+
tabIndex: active ? 0 : -1,
|
|
161
|
+
onClick: () => select(option.value),
|
|
162
|
+
onKeyDown: (event) => {
|
|
163
|
+
if (event.key === "Enter" || event.key === " ") {
|
|
164
|
+
event.preventDefault();
|
|
165
|
+
select(option.value);
|
|
166
|
+
}
|
|
167
|
+
},
|
|
168
|
+
className: cn(
|
|
169
|
+
"flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-left text-sm transition-colors",
|
|
170
|
+
"hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus:outline-none",
|
|
171
|
+
active && "text-foreground"
|
|
172
|
+
),
|
|
173
|
+
children: [
|
|
174
|
+
/* @__PURE__ */ jsx(Icon, { name: option.icon, className: "shrink-0 text-muted-foreground" }),
|
|
175
|
+
/* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate capitalize", children: option.label }),
|
|
176
|
+
active ? /* @__PURE__ */ jsx(Icon, { name: "ph:check", className: "shrink-0 text-foreground" }) : /* @__PURE__ */ jsx("span", { className: "inline-block size-4 shrink-0", "aria-hidden": true })
|
|
177
|
+
]
|
|
178
|
+
},
|
|
179
|
+
option.value
|
|
180
|
+
);
|
|
181
|
+
}),
|
|
182
|
+
footer ? /* @__PURE__ */ jsx("div", { className: "mt-1 border-t border-border/60 px-2 py-1.5 text-[11px] text-muted-foreground", children: footer }) : null
|
|
183
|
+
]
|
|
184
|
+
}
|
|
185
|
+
)
|
|
186
|
+
] });
|
|
187
|
+
}
|
|
188
|
+
const IconMenuPicker = forwardRef(IconMenuPickerInner);
|
|
189
|
+
export {
|
|
190
|
+
IconMenuPicker
|
|
191
|
+
};
|
|
192
|
+
//# sourceMappingURL=icon-menu-picker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icon-menu-picker.js","sources":["../../src/components/icon-menu-picker.tsx"],"sourcesContent":["import {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactNode,\n} from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"../data/Icon\";\nimport { Button } from \"./button\";\n\nexport type IconMenuOption<T extends string> = {\n value: T;\n icon: string;\n label: string;\n description?: string;\n};\n\nexport type IconMenuPickerProps<T extends string> = {\n value: T;\n onChange: (next: T) => void;\n options: IconMenuOption<T>[];\n ariaLabel: string;\n triggerTitle?: string | undefined;\n footer?: ReactNode | undefined;\n showLabel?: boolean | undefined;\n className?: string | undefined;\n triggerClassName?: string | undefined;\n menuClassName?: string | undefined;\n};\n\nfunction IconMenuPickerInner<T extends string>(\n {\n value,\n onChange,\n options,\n ariaLabel,\n triggerTitle,\n footer,\n showLabel,\n className,\n triggerClassName,\n menuClassName,\n }: IconMenuPickerProps<T>,\n ref: React.Ref<HTMLDivElement>,\n) {\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const itemRefs = useRef<(HTMLButtonElement | null)[]>([]);\n const [open, setOpen] = useState(false);\n\n useImperativeHandle(ref, () => rootRef.current as HTMLDivElement);\n\n const activeIndex = useMemo(\n () =>\n Math.max(\n 0,\n options.findIndex((option) => option.value === value),\n ),\n [options, value],\n );\n\n const close = useCallback((returnFocus: boolean) => {\n setOpen(false);\n if (returnFocus) triggerRef.current?.focus();\n }, []);\n\n const select = useCallback(\n (next: T) => {\n onChange(next);\n close(true);\n },\n [close, onChange],\n );\n\n useEffect(() => {\n if (!open) return;\n\n const onPointerDown = (event: PointerEvent) => {\n if (event.button !== 0) return;\n if (!rootRef.current?.contains(event.target as Node)) {\n close(false);\n }\n };\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n close(true);\n }\n };\n\n document.addEventListener(\"pointerdown\", onPointerDown);\n document.addEventListener(\"keydown\", onKeyDown);\n return () => {\n document.removeEventListener(\"pointerdown\", onPointerDown);\n document.removeEventListener(\"keydown\", onKeyDown);\n };\n }, [close, open]);\n\n useEffect(() => {\n if (!open) return;\n const node = itemRefs.current[activeIndex];\n node?.focus();\n }, [activeIndex, open]);\n\n const focusItem = (index: number) => {\n const wrapped = (index + options.length) % options.length;\n itemRefs.current[wrapped]?.focus();\n };\n\n const onMenuKeyDown = (event: ReactKeyboardEvent<HTMLDivElement>) => {\n const focusedIndex = itemRefs.current.findIndex((node) => node === document.activeElement);\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n focusItem((focusedIndex < 0 ? activeIndex : focusedIndex) + 1);\n return;\n }\n if (event.key === \"ArrowUp\") {\n event.preventDefault();\n focusItem((focusedIndex < 0 ? activeIndex : focusedIndex) - 1);\n return;\n }\n if (event.key === \"Home\") {\n event.preventDefault();\n focusItem(0);\n return;\n }\n if (event.key === \"End\") {\n event.preventDefault();\n focusItem(options.length - 1);\n return;\n }\n if (event.key === \"Tab\") {\n close(false);\n }\n };\n\n const onTriggerKeyDown = (event: ReactKeyboardEvent<HTMLButtonElement>) => {\n if (event.key === \"ArrowDown\" || event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n setOpen(true);\n }\n };\n\n const selected = options[activeIndex];\n if (!selected) {\n throw new Error(`IconMenuPicker: value \"${value}\" not found in options for ${ariaLabel}`);\n }\n\n return (\n <div ref={rootRef} className={cn(\"relative inline-flex\", showLabel && \"w-full\", className)}>\n <Button\n ref={triggerRef}\n type=\"button\"\n variant=\"ghost\"\n size={showLabel ? \"default\" : \"icon\"}\n aria-label={ariaLabel}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n title={triggerTitle ?? `${ariaLabel}: ${selected.label}`}\n onClick={() => setOpen((current) => !current)}\n onKeyDown={onTriggerKeyDown}\n className={cn(\n \"text-muted-foreground hover:text-foreground\",\n showLabel && \"w-full justify-start\",\n triggerClassName,\n )}\n >\n <Icon name={selected.icon} className={showLabel ? \"shrink-0 text-foreground\" : undefined} />\n {showLabel && (\n <>\n <span className=\"min-w-0 flex-1 truncate text-left capitalize\">{selected.label}</span>\n <Icon name=\"ph:caret-up-down\" className=\"shrink-0 text-muted-foreground\" />\n </>\n )}\n </Button>\n {open && (\n <div\n role=\"menu\"\n aria-label={ariaLabel}\n onKeyDown={onMenuKeyDown}\n className={cn(\n \"absolute left-0 top-[calc(100%+0.375rem)] z-50 min-w-[12rem] rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-lg shadow-black/5\",\n menuClassName,\n )}\n >\n {options.map((option, index) => {\n const active = option.value === value;\n return (\n <button\n key={option.value}\n ref={(node) => {\n itemRefs.current[index] = node;\n }}\n type=\"button\"\n role=\"menuitemradio\"\n aria-checked={active}\n tabIndex={active ? 0 : -1}\n onClick={() => select(option.value)}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n select(option.value);\n }\n }}\n className={cn(\n \"flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-left text-sm transition-colors\",\n \"hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus:outline-none\",\n active && \"text-foreground\",\n )}\n >\n <Icon name={option.icon} className=\"shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 flex-1 truncate capitalize\">{option.label}</span>\n {active ? (\n <Icon name=\"ph:check\" className=\"shrink-0 text-foreground\" />\n ) : (\n <span className=\"inline-block size-4 shrink-0\" aria-hidden />\n )}\n </button>\n );\n })}\n {footer ? (\n <div className=\"mt-1 border-t border-border/60 px-2 py-1.5 text-[11px] text-muted-foreground\">\n {footer}\n </div>\n ) : null}\n </div>\n )}\n </div>\n );\n}\n\nexport const IconMenuPicker = forwardRef(IconMenuPickerInner) as <T extends string>(\n props: IconMenuPickerProps<T> & { ref?: React.Ref<HTMLDivElement> },\n) => JSX.Element;\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { SelectHTMLAttributes } from 'react';
|
|
2
|
+
export type SelectOption = {
|
|
3
|
+
value: string;
|
|
4
|
+
label: string;
|
|
5
|
+
disabled?: boolean;
|
|
6
|
+
};
|
|
7
|
+
export type SelectProps = SelectHTMLAttributes<HTMLSelectElement> & {
|
|
8
|
+
options?: SelectOption[];
|
|
9
|
+
placeholder?: string;
|
|
10
|
+
};
|
|
11
|
+
export declare const Select: import('react').ForwardRefExoticComponent<SelectHTMLAttributes<HTMLSelectElement> & {
|
|
12
|
+
options?: SelectOption[];
|
|
13
|
+
placeholder?: string;
|
|
14
|
+
} & import('react').RefAttributes<HTMLSelectElement>>;
|
|
15
|
+
//# sourceMappingURL=select.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../../src/components/select.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAI9D,MAAM,MAAM,YAAY,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAEhF,MAAM,MAAM,WAAW,GAAG,oBAAoB,CAAC,iBAAiB,CAAC,GAAG;IAClE,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,eAAO,MAAM,MAAM;cAJP,YAAY,EAAE;kBACV,MAAM;qDAqCrB,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef } from "react";
|
|
3
|
+
import { cn } from "../lib/utils.js";
|
|
4
|
+
import { Icon } from "../data/Icon.js";
|
|
5
|
+
const Select = forwardRef(
|
|
6
|
+
({ className, options, placeholder, children, ...props }, ref) => {
|
|
7
|
+
return /* @__PURE__ */ jsxs("div", { className: "relative inline-flex w-full items-center", children: [
|
|
8
|
+
/* @__PURE__ */ jsxs(
|
|
9
|
+
"select",
|
|
10
|
+
{
|
|
11
|
+
ref,
|
|
12
|
+
className: cn(
|
|
13
|
+
"h-control-h w-full appearance-none rounded-md border border-input bg-background px-control-px pr-8 text-sm text-foreground",
|
|
14
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1",
|
|
15
|
+
"disabled:cursor-not-allowed disabled:opacity-50",
|
|
16
|
+
className
|
|
17
|
+
),
|
|
18
|
+
...props,
|
|
19
|
+
children: [
|
|
20
|
+
placeholder !== void 0 && /* @__PURE__ */ jsx("option", { value: "", disabled: true, children: placeholder }),
|
|
21
|
+
options ? options.map((opt) => /* @__PURE__ */ jsx("option", { value: opt.value, disabled: opt.disabled, children: opt.label }, opt.value)) : children
|
|
22
|
+
]
|
|
23
|
+
}
|
|
24
|
+
),
|
|
25
|
+
/* @__PURE__ */ jsx(
|
|
26
|
+
Icon,
|
|
27
|
+
{
|
|
28
|
+
name: "codicon:chevron-down",
|
|
29
|
+
className: "pointer-events-none absolute right-2 top-1/2 -translate-y-1/2 text-xs text-muted-foreground"
|
|
30
|
+
}
|
|
31
|
+
)
|
|
32
|
+
] });
|
|
33
|
+
}
|
|
34
|
+
);
|
|
35
|
+
Select.displayName = "Select";
|
|
36
|
+
export {
|
|
37
|
+
Select
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=select.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"select.js","sources":["../../src/components/select.tsx"],"sourcesContent":["import { forwardRef, type SelectHTMLAttributes } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"../data/Icon\";\n\nexport type SelectOption = { value: string; label: string; disabled?: boolean };\n\nexport type SelectProps = SelectHTMLAttributes<HTMLSelectElement> & {\n options?: SelectOption[];\n placeholder?: string;\n};\n\nexport const Select = forwardRef<HTMLSelectElement, SelectProps>(\n ({ className, options, placeholder, children, ...props }, ref) => {\n return (\n <div className=\"relative inline-flex w-full items-center\">\n <select\n ref={ref}\n className={cn(\n \"h-control-h w-full appearance-none rounded-md border border-input bg-background px-control-px pr-8 text-sm text-foreground\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n className,\n )}\n {...props}\n >\n {placeholder !== undefined && (\n <option value=\"\" disabled>\n {placeholder}\n </option>\n )}\n {options\n ? options.map((opt) => (\n <option key={opt.value} value={opt.value} disabled={opt.disabled}>\n {opt.label}\n </option>\n ))\n : children}\n </select>\n <Icon\n name=\"codicon:chevron-down\"\n className=\"pointer-events-none absolute right-2 top-1/2 -translate-y-1/2 text-xs text-muted-foreground\"\n />\n </div>\n );\n },\n);\nSelect.displayName = \"Select\";\n"],"names":[],"mappings":";;;;AAWO,MAAM,SAAS;AAAA,EACpB,CAAC,EAAE,WAAW,SAAS,aAAa,UAAU,GAAG,MAAA,GAAS,QAAQ;AAChE,WACE,qBAAC,OAAA,EAAI,WAAU,4CACb,UAAA;AAAA,MAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC;AAAA,UACA,WAAW;AAAA,YACT;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UAAA;AAAA,UAED,GAAG;AAAA,UAEH,UAAA;AAAA,YAAA,gBAAgB,UACf,oBAAC,UAAA,EAAO,OAAM,IAAG,UAAQ,MACtB,UAAA,YAAA,CACH;AAAA,YAED,UACG,QAAQ,IAAI,CAAC,QACX,oBAAC,YAAuB,OAAO,IAAI,OAAO,UAAU,IAAI,UACrD,UAAA,IAAI,SADM,IAAI,KAEjB,CACD,IACD;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAEN;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,QAAA;AAAA,MAAA;AAAA,IACZ,GACF;AAAA,EAEJ;AACF;AACA,OAAO,cAAc;"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type ThemeSwitcherProps = {
|
|
2
|
+
className?: string;
|
|
3
|
+
triggerClassName?: string;
|
|
4
|
+
menuClassName?: string;
|
|
5
|
+
};
|
|
6
|
+
export declare const ThemeSwitcher: import('react').ForwardRefExoticComponent<ThemeSwitcherProps & import('react').RefAttributes<HTMLDivElement>>;
|
|
7
|
+
//# sourceMappingURL=theme-switcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme-switcher.d.ts","sourceRoot":"","sources":["../../src/components/theme-switcher.tsx"],"names":[],"mappings":"AAWA,MAAM,MAAM,kBAAkB,GAAG;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,eAAO,MAAM,aAAa,+GA6BzB,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef } from "react";
|
|
3
|
+
import { Icon } from "../data/Icon.js";
|
|
4
|
+
import { IconMenuPicker } from "./icon-menu-picker.js";
|
|
5
|
+
import { useTheme } from "../hooks/use-theme.js";
|
|
6
|
+
const THEME_OPTIONS = [
|
|
7
|
+
{ value: "light", icon: "ph:sun", label: "light" },
|
|
8
|
+
{ value: "dark", icon: "ph:moon", label: "dark" },
|
|
9
|
+
{ value: "system", icon: "ph:desktop", label: "system" }
|
|
10
|
+
];
|
|
11
|
+
const ThemeSwitcher = forwardRef(
|
|
12
|
+
({ className, triggerClassName, menuClassName }, ref) => {
|
|
13
|
+
const { theme, setTheme, resolvedTheme } = useTheme();
|
|
14
|
+
const footer = theme === "system" ? /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1.5", children: [
|
|
15
|
+
/* @__PURE__ */ jsx(Icon, { name: resolvedTheme === "dark" ? "ph:moon" : "ph:sun", width: 12, height: 12 }),
|
|
16
|
+
/* @__PURE__ */ jsxs("span", { children: [
|
|
17
|
+
"resolves to",
|
|
18
|
+
" ",
|
|
19
|
+
/* @__PURE__ */ jsx("span", { "data-testid": "resolved-theme", className: "font-medium text-foreground", children: resolvedTheme })
|
|
20
|
+
] })
|
|
21
|
+
] }) : null;
|
|
22
|
+
return /* @__PURE__ */ jsx(
|
|
23
|
+
IconMenuPicker,
|
|
24
|
+
{
|
|
25
|
+
ref,
|
|
26
|
+
value: theme,
|
|
27
|
+
onChange: setTheme,
|
|
28
|
+
options: THEME_OPTIONS,
|
|
29
|
+
ariaLabel: "Theme",
|
|
30
|
+
footer,
|
|
31
|
+
className,
|
|
32
|
+
triggerClassName,
|
|
33
|
+
menuClassName
|
|
34
|
+
}
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
);
|
|
38
|
+
ThemeSwitcher.displayName = "ThemeSwitcher";
|
|
39
|
+
export {
|
|
40
|
+
ThemeSwitcher
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=theme-switcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme-switcher.js","sources":["../../src/components/theme-switcher.tsx"],"sourcesContent":["import { forwardRef } from \"react\";\nimport { Icon } from \"../data/Icon\";\nimport { IconMenuPicker, type IconMenuOption } from \"./icon-menu-picker\";\nimport { useTheme, type Theme } from \"../hooks/use-theme\";\n\nconst THEME_OPTIONS: IconMenuOption<Theme>[] = [\n { value: \"light\", icon: \"ph:sun\", label: \"light\" },\n { value: \"dark\", icon: \"ph:moon\", label: \"dark\" },\n { value: \"system\", icon: \"ph:desktop\", label: \"system\" },\n];\n\nexport type ThemeSwitcherProps = {\n className?: string;\n triggerClassName?: string;\n menuClassName?: string;\n};\n\nexport const ThemeSwitcher = forwardRef<HTMLDivElement, ThemeSwitcherProps>(\n ({ className, triggerClassName, menuClassName }, ref) => {\n const { theme, setTheme, resolvedTheme } = useTheme();\n const footer =\n theme === \"system\" ? (\n <span className=\"inline-flex items-center gap-1.5\">\n <Icon name={resolvedTheme === \"dark\" ? \"ph:moon\" : \"ph:sun\"} width={12} height={12} />\n <span>\n resolves to{\" \"}\n <span data-testid=\"resolved-theme\" className=\"font-medium text-foreground\">\n {resolvedTheme}\n </span>\n </span>\n </span>\n ) : null;\n return (\n <IconMenuPicker<Theme>\n ref={ref}\n value={theme}\n onChange={setTheme}\n options={THEME_OPTIONS}\n ariaLabel=\"Theme\"\n footer={footer}\n className={className}\n triggerClassName={triggerClassName}\n menuClassName={menuClassName}\n />\n );\n },\n);\nThemeSwitcher.displayName = \"ThemeSwitcher\";\n"],"names":[],"mappings":";;;;;AAKA,MAAM,gBAAyC;AAAA,EAC7C,EAAE,OAAO,SAAS,MAAM,UAAU,OAAO,QAAA;AAAA,EACzC,EAAE,OAAO,QAAQ,MAAM,WAAW,OAAO,OAAA;AAAA,EACzC,EAAE,OAAO,UAAU,MAAM,cAAc,OAAO,SAAA;AAChD;AAQO,MAAM,gBAAgB;AAAA,EAC3B,CAAC,EAAE,WAAW,kBAAkB,cAAA,GAAiB,QAAQ;AACvD,UAAM,EAAE,OAAO,UAAU,cAAA,IAAkB,SAAA;AAC3C,UAAM,SACJ,UAAU,WACR,qBAAC,QAAA,EAAK,WAAU,oCACd,UAAA;AAAA,MAAA,oBAAC,MAAA,EAAK,MAAM,kBAAkB,SAAS,YAAY,UAAU,OAAO,IAAI,QAAQ,GAAA,CAAI;AAAA,2BACnF,QAAA,EAAK,UAAA;AAAA,QAAA;AAAA,QACQ;AAAA,4BACX,QAAA,EAAK,eAAY,kBAAiB,WAAU,+BAC1C,UAAA,cAAA,CACH;AAAA,MAAA,EAAA,CACF;AAAA,IAAA,EAAA,CACF,IACE;AACN,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA,OAAO;AAAA,QACP,UAAU;AAAA,QACV,SAAS;AAAA,QACT,WAAU;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IAAA;AAAA,EAGN;AACF;AACA,cAAc,cAAc;"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export { Button, buttonVariants, type ButtonProps } from './components/button';
|
|
2
|
+
export { DatePicker, type DatePickerProps } from './components/DatePicker';
|
|
3
|
+
export { DateTimePicker, type DateTimePickerProps } from './components/DateTimePicker';
|
|
4
|
+
export { RangeSlider, type RangeSliderProps, type RangeSliderValue, } from './components/RangeSlider';
|
|
5
|
+
export { FilterBar, type FilterBarBooleanFilter, type FilterBarEnumFilter, type FilterBarFilter, type FilterBarLookupFilter, type FilterBarLookupInputType, type FilterBarLookupMultiFilter, type FilterBarLookupOption, type FilterBarMultiFilter, type FilterBarMultiFilterMode, type FilterBarNestedMultiFilter, type FilterBarNestedMultiGroup, type FilterBarNumberFilter, type FilterBarNumberValue, type FilterBarProps, type FilterBarRangePreset, type FilterBarRangeProps, type FilterBarSearchProps, type FilterBarSelectMultiFilter, type FilterBarTextFilter, } from './components/FilterBar';
|
|
6
|
+
export { MultiSelect, type MultiSelectOption, type MultiSelectProps, } from './components/MultiSelect';
|
|
7
|
+
export { Select, type SelectProps, type SelectOption } from './components/select';
|
|
8
|
+
export { ThemeSwitcher, type ThemeSwitcherProps } from './components/theme-switcher';
|
|
9
|
+
export { DensitySwitcher, type DensitySwitcherProps } from './components/density-switcher';
|
|
10
|
+
export { IconMenuPicker, type IconMenuPickerProps, type IconMenuOption, } from './components/icon-menu-picker';
|
|
11
|
+
export { SplitPane, type SplitPaneProps } from './layout/SplitPane';
|
|
12
|
+
export { Section, DetailEmptyState, type SectionProps, type DetailEmptyStateProps, } from './layout/Section';
|
|
13
|
+
export { HoverCard, type HoverCardProps, type HoverCardPlacement } from './overlay/HoverCard';
|
|
14
|
+
export { Modal, type ModalProps, type ModalSize } from './overlay/Modal';
|
|
15
|
+
//# sourceMappingURL=components.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"components.d.ts","sourceRoot":"","sources":["../src/components.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACvF,OAAO,EACL,WAAW,EACX,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,GACtB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,SAAS,EACT,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC1B,KAAK,wBAAwB,EAC7B,KAAK,0BAA0B,EAC/B,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,KAAK,wBAAwB,EAC7B,KAAK,0BAA0B,EAC/B,KAAK,yBAAyB,EAC9B,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACnB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,0BAA0B,EAC/B,KAAK,mBAAmB,GACzB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,WAAW,EACX,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,GACtB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAClF,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACrF,OAAO,EAAE,eAAe,EAAE,KAAK,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAC3F,OAAO,EACL,cAAc,EACd,KAAK,mBAAmB,EACxB,KAAK,cAAc,GACpB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EACL,OAAO,EACP,gBAAgB,EAChB,KAAK,YAAY,EACjB,KAAK,qBAAqB,GAC3B,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,KAAK,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9F,OAAO,EAAE,KAAK,EAAE,KAAK,UAAU,EAAE,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Button, buttonVariants } from "./components/button.js";
|
|
2
|
+
import { DatePicker } from "./components/DatePicker.js";
|
|
3
|
+
import { DateTimePicker } from "./components/DateTimePicker.js";
|
|
4
|
+
import { RangeSlider } from "./components/RangeSlider.js";
|
|
5
|
+
import { FilterBar } from "./components/FilterBar.js";
|
|
6
|
+
import { MultiSelect } from "./components/MultiSelect.js";
|
|
7
|
+
import { Select } from "./components/select.js";
|
|
8
|
+
import { ThemeSwitcher } from "./components/theme-switcher.js";
|
|
9
|
+
import { DensitySwitcher } from "./components/density-switcher.js";
|
|
10
|
+
import { IconMenuPicker } from "./components/icon-menu-picker.js";
|
|
11
|
+
import { SplitPane } from "./layout/SplitPane.js";
|
|
12
|
+
import { DetailEmptyState, Section } from "./layout/Section.js";
|
|
13
|
+
import { HoverCard } from "./overlay/HoverCard.js";
|
|
14
|
+
import { Modal } from "./overlay/Modal.js";
|
|
15
|
+
export {
|
|
16
|
+
Button,
|
|
17
|
+
DatePicker,
|
|
18
|
+
DateTimePicker,
|
|
19
|
+
DensitySwitcher,
|
|
20
|
+
DetailEmptyState,
|
|
21
|
+
FilterBar,
|
|
22
|
+
HoverCard,
|
|
23
|
+
IconMenuPicker,
|
|
24
|
+
Modal,
|
|
25
|
+
MultiSelect,
|
|
26
|
+
RangeSlider,
|
|
27
|
+
Section,
|
|
28
|
+
Select,
|
|
29
|
+
SplitPane,
|
|
30
|
+
ThemeSwitcher,
|
|
31
|
+
buttonVariants
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=components.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"components.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AnsiHtml.d.ts","sourceRoot":"","sources":["../../src/data/AnsiHtml.tsx"],"names":[],"mappings":"AAmEA,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,EAAE,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;CACrB,CAAC;AAEF,wBAAgB,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAU,EAAE,EAAE,aAAa,2CAatE"}
|