@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,59 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useState, useEffect } from "react";
|
|
3
|
+
import { cn } from "../lib/utils.js";
|
|
4
|
+
let loadPromise = null;
|
|
5
|
+
function loadMarked() {
|
|
6
|
+
if (loadPromise) return loadPromise;
|
|
7
|
+
loadPromise = import("marked").then(({ Marked, Renderer }) => {
|
|
8
|
+
const renderer = new Renderer();
|
|
9
|
+
renderer.code = ({ text, lang }) => `<pre class="bg-muted rounded p-2 text-xs overflow-x-auto border border-border my-1.5"><code${lang ? ` class="language-${lang}"` : ""}>${text}</code></pre>`;
|
|
10
|
+
renderer.codespan = ({ text }) => `<code class="bg-muted rounded px-1 text-xs">${text}</code>`;
|
|
11
|
+
renderer.heading = ({ text, depth }) => {
|
|
12
|
+
const cls = depth <= 1 ? "font-bold text-base mt-2 mb-1" : depth === 2 ? "font-semibold text-sm mt-2 mb-1" : "font-semibold text-sm mt-2 mb-1";
|
|
13
|
+
return `<h${depth} class="${cls}">${text}</h${depth}>`;
|
|
14
|
+
};
|
|
15
|
+
renderer.link = ({ href, text }) => `<a href="${href}" target="_blank" rel="noopener noreferrer" class="text-primary hover:underline">${text}</a>`;
|
|
16
|
+
renderer.blockquote = ({ text }) => `<blockquote class="border-l-2 border-border pl-2 text-muted-foreground italic my-1">${text}</blockquote>`;
|
|
17
|
+
renderer.tablerow = ({ text }) => `<tr class="border-b border-border">${text}</tr>`;
|
|
18
|
+
renderer.list = function(token) {
|
|
19
|
+
const tag = token.ordered ? "ol" : "ul";
|
|
20
|
+
const cls = token.ordered ? "list-decimal ml-4 my-1" : "list-disc ml-4 my-1";
|
|
21
|
+
const body = token.items.map((item) => this.listitem(item)).join("");
|
|
22
|
+
return `<${tag} class="${cls}">${body}</${tag}>`;
|
|
23
|
+
};
|
|
24
|
+
renderer.listitem = ({ text }) => `<li class="my-0.5">${text}</li>`;
|
|
25
|
+
renderer.image = ({ href, text }) => `<img src="${href}" alt="${text}" class="max-w-full rounded my-1" />`;
|
|
26
|
+
renderer.hr = () => '<hr class="border-border my-2" />';
|
|
27
|
+
renderer.paragraph = ({ text }) => `<p class="mt-1.5">${text}</p>`;
|
|
28
|
+
return new Marked({ renderer, gfm: true, breaks: true });
|
|
29
|
+
});
|
|
30
|
+
return loadPromise;
|
|
31
|
+
}
|
|
32
|
+
function Markdown({ text, className }) {
|
|
33
|
+
const [html, setHtml] = useState(null);
|
|
34
|
+
useEffect(() => {
|
|
35
|
+
let cancelled = false;
|
|
36
|
+
loadMarked().then((m) => Promise.resolve(m.parse(text))).then((out) => {
|
|
37
|
+
if (!cancelled) setHtml(out);
|
|
38
|
+
}).catch(() => {
|
|
39
|
+
if (!cancelled) setHtml(text);
|
|
40
|
+
});
|
|
41
|
+
return () => {
|
|
42
|
+
cancelled = true;
|
|
43
|
+
};
|
|
44
|
+
}, [text]);
|
|
45
|
+
if (html === null) {
|
|
46
|
+
return /* @__PURE__ */ jsx("pre", { className: cn("text-sm whitespace-pre-wrap", className), children: text });
|
|
47
|
+
}
|
|
48
|
+
return /* @__PURE__ */ jsx(
|
|
49
|
+
"div",
|
|
50
|
+
{
|
|
51
|
+
className: cn("prose prose-sm max-w-none dark:prose-invert", className),
|
|
52
|
+
dangerouslySetInnerHTML: { __html: html }
|
|
53
|
+
}
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
export {
|
|
57
|
+
Markdown
|
|
58
|
+
};
|
|
59
|
+
//# sourceMappingURL=Markdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Markdown.js","sources":["../../src/data/Markdown.tsx"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport { cn } from \"../lib/utils\";\n\nexport type MarkdownProps = {\n text: string;\n className?: string;\n};\n\ntype MarkedLike = {\n parse: (md: string) => string | Promise<string>;\n};\n\nlet loadPromise: Promise<MarkedLike> | null = null;\n\nfunction loadMarked(): Promise<MarkedLike> {\n if (loadPromise) return loadPromise;\n loadPromise = import(\"marked\").then(({ Marked, Renderer }) => {\n const renderer = new Renderer();\n\n renderer.code = ({ text, lang }) =>\n `<pre class=\"bg-muted rounded p-2 text-xs overflow-x-auto border border-border my-1.5\"><code${lang ? ` class=\"language-${lang}\"` : \"\"}>${text}</code></pre>`;\n\n renderer.codespan = ({ text }) => `<code class=\"bg-muted rounded px-1 text-xs\">${text}</code>`;\n\n renderer.heading = ({ text, depth }) => {\n const cls =\n depth <= 1\n ? \"font-bold text-base mt-2 mb-1\"\n : depth === 2\n ? \"font-semibold text-sm mt-2 mb-1\"\n : \"font-semibold text-sm mt-2 mb-1\";\n return `<h${depth} class=\"${cls}\">${text}</h${depth}>`;\n };\n\n renderer.link = ({ href, text }) =>\n `<a href=\"${href}\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"text-primary hover:underline\">${text}</a>`;\n\n renderer.blockquote = ({ text }) =>\n `<blockquote class=\"border-l-2 border-border pl-2 text-muted-foreground italic my-1\">${text}</blockquote>`;\n\n renderer.tablerow = ({ text }) => `<tr class=\"border-b border-border\">${text}</tr>`;\n\n renderer.list = function (token) {\n const tag = token.ordered ? \"ol\" : \"ul\";\n const cls = token.ordered ? \"list-decimal ml-4 my-1\" : \"list-disc ml-4 my-1\";\n const body = token.items.map((item) => this.listitem(item)).join(\"\");\n return `<${tag} class=\"${cls}\">${body}</${tag}>`;\n };\n\n renderer.listitem = ({ text }) => `<li class=\"my-0.5\">${text}</li>`;\n\n renderer.image = ({ href, text }) =>\n `<img src=\"${href}\" alt=\"${text}\" class=\"max-w-full rounded my-1\" />`;\n\n renderer.hr = () => '<hr class=\"border-border my-2\" />';\n\n renderer.paragraph = ({ text }) => `<p class=\"mt-1.5\">${text}</p>`;\n\n return new Marked({ renderer, gfm: true, breaks: true }) as unknown as MarkedLike;\n });\n return loadPromise;\n}\n\nexport function Markdown({ text, className }: MarkdownProps) {\n const [html, setHtml] = useState<string | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n loadMarked()\n .then((m) => Promise.resolve(m.parse(text)))\n .then((out) => {\n if (!cancelled) setHtml(out);\n })\n .catch(() => {\n if (!cancelled) setHtml(text);\n });\n return () => {\n cancelled = true;\n };\n }, [text]);\n\n if (html === null) {\n return <pre className={cn(\"text-sm whitespace-pre-wrap\", className)}>{text}</pre>;\n }\n\n return (\n <div\n className={cn(\"prose prose-sm max-w-none dark:prose-invert\", className)}\n dangerouslySetInnerHTML={{ __html: html }}\n />\n );\n}\n"],"names":[],"mappings":";;;AAYA,IAAI,cAA0C;AAE9C,SAAS,aAAkC;AACzC,MAAI,YAAa,QAAO;AACxB,gBAAc,OAAO,QAAQ,EAAE,KAAK,CAAC,EAAE,QAAQ,eAAe;AAC5D,UAAM,WAAW,IAAI,SAAA;AAErB,aAAS,OAAO,CAAC,EAAE,MAAM,KAAA,MACvB,8FAA8F,OAAO,oBAAoB,IAAI,MAAM,EAAE,IAAI,IAAI;AAE/I,aAAS,WAAW,CAAC,EAAE,KAAA,MAAW,+CAA+C,IAAI;AAErF,aAAS,UAAU,CAAC,EAAE,MAAM,YAAY;AACtC,YAAM,MACJ,SAAS,IACL,kCACA,UAAU,IACR,oCACA;AACR,aAAO,KAAK,KAAK,WAAW,GAAG,KAAK,IAAI,MAAM,KAAK;AAAA,IACrD;AAEA,aAAS,OAAO,CAAC,EAAE,MAAM,WACvB,YAAY,IAAI,oFAAoF,IAAI;AAE1G,aAAS,aAAa,CAAC,EAAE,KAAA,MACvB,uFAAuF,IAAI;AAE7F,aAAS,WAAW,CAAC,EAAE,KAAA,MAAW,sCAAsC,IAAI;AAE5E,aAAS,OAAO,SAAU,OAAO;AAC/B,YAAM,MAAM,MAAM,UAAU,OAAO;AACnC,YAAM,MAAM,MAAM,UAAU,2BAA2B;AACvD,YAAM,OAAO,MAAM,MAAM,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC,EAAE,KAAK,EAAE;AACnE,aAAO,IAAI,GAAG,WAAW,GAAG,KAAK,IAAI,KAAK,GAAG;AAAA,IAC/C;AAEA,aAAS,WAAW,CAAC,EAAE,KAAA,MAAW,sBAAsB,IAAI;AAE5D,aAAS,QAAQ,CAAC,EAAE,MAAM,WACxB,aAAa,IAAI,UAAU,IAAI;AAEjC,aAAS,KAAK,MAAM;AAEpB,aAAS,YAAY,CAAC,EAAE,KAAA,MAAW,qBAAqB,IAAI;AAE5D,WAAO,IAAI,OAAO,EAAE,UAAU,KAAK,MAAM,QAAQ,MAAM;AAAA,EACzD,CAAC;AACD,SAAO;AACT;AAEO,SAAS,SAAS,EAAE,MAAM,aAA4B;AAC3D,QAAM,CAAC,MAAM,OAAO,IAAI,SAAwB,IAAI;AAEpD,YAAU,MAAM;AACd,QAAI,YAAY;AAChB,eAAA,EACG,KAAK,CAAC,MAAM,QAAQ,QAAQ,EAAE,MAAM,IAAI,CAAC,CAAC,EAC1C,KAAK,CAAC,QAAQ;AACb,UAAI,CAAC,UAAW,SAAQ,GAAG;AAAA,IAC7B,CAAC,EACA,MAAM,MAAM;AACX,UAAI,CAAC,UAAW,SAAQ,IAAI;AAAA,IAC9B,CAAC;AACH,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,IAAI,CAAC;AAET,MAAI,SAAS,MAAM;AACjB,+BAAQ,OAAA,EAAI,WAAW,GAAG,+BAA+B,SAAS,GAAI,UAAA,MAAK;AAAA,EAC7E;AAEA,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,GAAG,+CAA+C,SAAS;AAAA,MACtE,yBAAyB,EAAE,QAAQ,KAAA;AAAA,IAAK;AAAA,EAAA;AAG9C;"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
export type MatrixTableRow = {
|
|
3
|
+
key: string;
|
|
4
|
+
label: ReactNode;
|
|
5
|
+
cells: ReactNode[];
|
|
6
|
+
};
|
|
7
|
+
export type MatrixTableProps = {
|
|
8
|
+
columns: ReactNode[];
|
|
9
|
+
rows: MatrixTableRow[];
|
|
10
|
+
corner?: ReactNode;
|
|
11
|
+
emptyMessage?: ReactNode;
|
|
12
|
+
angledHeaders?: boolean;
|
|
13
|
+
density?: "default" | "compact";
|
|
14
|
+
columnWidth?: number;
|
|
15
|
+
headerHeight?: number;
|
|
16
|
+
className?: string;
|
|
17
|
+
columnClassName?: string;
|
|
18
|
+
rowLabelClassName?: string;
|
|
19
|
+
cellClassName?: string;
|
|
20
|
+
};
|
|
21
|
+
export declare function MatrixTable({ columns, rows, corner, emptyMessage, angledHeaders, density, columnWidth, headerHeight, className, columnClassName, rowLabelClassName, cellClassName, }: MatrixTableProps): import("react/jsx-runtime").JSX.Element;
|
|
22
|
+
//# sourceMappingURL=MatrixTable.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MatrixTable.d.ts","sourceRoot":"","sources":["../../src/data/MatrixTable.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,MAAM,MAAM,cAAc,GAAG;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,SAAS,EAAE,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,IAAI,EAAE,cAAc,EAAE,CAAC;IACvB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,wBAAgB,WAAW,CAAC,EAC1B,OAAO,EACP,IAAI,EACJ,MAAM,EACN,YAAwB,EACxB,aAAqB,EACrB,OAAmB,EACnB,WAAgB,EAChB,YAAkB,EAClB,SAAS,EACT,eAAe,EACf,iBAAiB,EACjB,aAAa,GACd,EAAE,gBAAgB,2CAgJlB"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { cn } from "../lib/utils.js";
|
|
3
|
+
function MatrixTable({
|
|
4
|
+
columns,
|
|
5
|
+
rows,
|
|
6
|
+
corner,
|
|
7
|
+
emptyMessage = "No data",
|
|
8
|
+
angledHeaders = false,
|
|
9
|
+
density = "default",
|
|
10
|
+
columnWidth = 48,
|
|
11
|
+
headerHeight = 120,
|
|
12
|
+
className,
|
|
13
|
+
columnClassName,
|
|
14
|
+
rowLabelClassName,
|
|
15
|
+
cellClassName
|
|
16
|
+
}) {
|
|
17
|
+
if (rows.length === 0 || columns.length === 0) {
|
|
18
|
+
return /* @__PURE__ */ jsx("div", { className: "text-sm text-muted-foreground", children: emptyMessage });
|
|
19
|
+
}
|
|
20
|
+
const textWidth = Math.round(headerHeight * 1.41);
|
|
21
|
+
const diagonalOverhang = Math.round(headerHeight * 0.71);
|
|
22
|
+
const compact = density === "compact";
|
|
23
|
+
const headerCellPadding = compact ? "px-density-2 py-density-1" : "px-density-3 py-density-2";
|
|
24
|
+
const rowLabelPadding = compact ? "px-density-2 py-1" : "px-density-3 py-density-2";
|
|
25
|
+
const bodyCellPadding = compact ? "px-density-2 py-1" : "px-density-3 py-density-2";
|
|
26
|
+
return /* @__PURE__ */ jsx(
|
|
27
|
+
"div",
|
|
28
|
+
{
|
|
29
|
+
className: cn("overflow-auto rounded-md border border-border", className),
|
|
30
|
+
style: angledHeaders ? { paddingRight: diagonalOverhang } : void 0,
|
|
31
|
+
children: /* @__PURE__ */ jsxs("table", { className: cn("w-max border-collapse", compact ? "text-xs" : "text-sm"), children: [
|
|
32
|
+
angledHeaders && /* @__PURE__ */ jsxs("colgroup", { children: [
|
|
33
|
+
/* @__PURE__ */ jsx("col", {}),
|
|
34
|
+
columns.map((_, index) => /* @__PURE__ */ jsx("col", { style: { width: columnWidth } }, index))
|
|
35
|
+
] }),
|
|
36
|
+
/* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { className: cn("bg-muted/40", !angledHeaders && "border-b border-border"), children: [
|
|
37
|
+
/* @__PURE__ */ jsx(
|
|
38
|
+
"th",
|
|
39
|
+
{
|
|
40
|
+
scope: "col",
|
|
41
|
+
className: cn(
|
|
42
|
+
"sticky left-0 z-10 min-w-44 border-r border-border bg-muted/40 text-left font-medium",
|
|
43
|
+
headerCellPadding,
|
|
44
|
+
angledHeaders ? "align-bottom" : columnClassName
|
|
45
|
+
),
|
|
46
|
+
children: corner
|
|
47
|
+
}
|
|
48
|
+
),
|
|
49
|
+
columns.map(
|
|
50
|
+
(column, index) => angledHeaders ? /* @__PURE__ */ jsxs(
|
|
51
|
+
"th",
|
|
52
|
+
{
|
|
53
|
+
scope: "col",
|
|
54
|
+
title: columnTitle(column),
|
|
55
|
+
className: cn(
|
|
56
|
+
"relative overflow-visible border-b border-border p-0 align-bottom",
|
|
57
|
+
columnClassName
|
|
58
|
+
),
|
|
59
|
+
style: {
|
|
60
|
+
width: columnWidth,
|
|
61
|
+
minWidth: columnWidth,
|
|
62
|
+
maxWidth: columnWidth,
|
|
63
|
+
height: headerHeight
|
|
64
|
+
},
|
|
65
|
+
children: [
|
|
66
|
+
/* @__PURE__ */ jsx(
|
|
67
|
+
"div",
|
|
68
|
+
{
|
|
69
|
+
className: "absolute bottom-0 border-b border-border",
|
|
70
|
+
style: {
|
|
71
|
+
left: columnWidth,
|
|
72
|
+
width: textWidth,
|
|
73
|
+
transform: "rotate(-45deg)",
|
|
74
|
+
transformOrigin: "0 100%"
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
),
|
|
78
|
+
index === 0 && /* @__PURE__ */ jsx(
|
|
79
|
+
"div",
|
|
80
|
+
{
|
|
81
|
+
className: "absolute bottom-0 border-b border-border",
|
|
82
|
+
style: {
|
|
83
|
+
left: 0,
|
|
84
|
+
width: textWidth,
|
|
85
|
+
transform: "rotate(-45deg)",
|
|
86
|
+
transformOrigin: "0 100%"
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
),
|
|
90
|
+
/* @__PURE__ */ jsx(
|
|
91
|
+
"div",
|
|
92
|
+
{
|
|
93
|
+
className: "absolute bottom-2 overflow-hidden text-ellipsis whitespace-nowrap pl-1 text-left text-xs font-medium leading-none text-muted-foreground",
|
|
94
|
+
style: {
|
|
95
|
+
left: columnWidth / 2,
|
|
96
|
+
width: textWidth,
|
|
97
|
+
transform: "rotate(-45deg)",
|
|
98
|
+
transformOrigin: "0 100%"
|
|
99
|
+
},
|
|
100
|
+
children: column
|
|
101
|
+
}
|
|
102
|
+
)
|
|
103
|
+
]
|
|
104
|
+
},
|
|
105
|
+
index
|
|
106
|
+
) : /* @__PURE__ */ jsx(
|
|
107
|
+
"th",
|
|
108
|
+
{
|
|
109
|
+
scope: "col",
|
|
110
|
+
className: cn(
|
|
111
|
+
"min-w-24 whitespace-nowrap text-center text-xs font-medium text-muted-foreground",
|
|
112
|
+
headerCellPadding,
|
|
113
|
+
columnClassName
|
|
114
|
+
),
|
|
115
|
+
children: column
|
|
116
|
+
},
|
|
117
|
+
index
|
|
118
|
+
)
|
|
119
|
+
)
|
|
120
|
+
] }) }),
|
|
121
|
+
/* @__PURE__ */ jsx("tbody", { children: rows.map((row) => /* @__PURE__ */ jsxs("tr", { className: "border-b border-border last:border-b-0", children: [
|
|
122
|
+
/* @__PURE__ */ jsx(
|
|
123
|
+
"th",
|
|
124
|
+
{
|
|
125
|
+
scope: "row",
|
|
126
|
+
className: cn(
|
|
127
|
+
"sticky left-0 z-10 border-r border-border bg-background text-left font-medium",
|
|
128
|
+
rowLabelPadding,
|
|
129
|
+
rowLabelClassName
|
|
130
|
+
),
|
|
131
|
+
children: row.label
|
|
132
|
+
}
|
|
133
|
+
),
|
|
134
|
+
columns.map((_, index) => /* @__PURE__ */ jsx(
|
|
135
|
+
"td",
|
|
136
|
+
{
|
|
137
|
+
className: cn(
|
|
138
|
+
angledHeaders ? "p-0 text-center align-middle" : cn(bodyCellPadding, "text-center align-middle"),
|
|
139
|
+
cellClassName
|
|
140
|
+
),
|
|
141
|
+
style: angledHeaders ? {
|
|
142
|
+
width: columnWidth,
|
|
143
|
+
minWidth: columnWidth,
|
|
144
|
+
maxWidth: columnWidth
|
|
145
|
+
} : void 0,
|
|
146
|
+
children: row.cells[index] ?? null
|
|
147
|
+
},
|
|
148
|
+
index
|
|
149
|
+
))
|
|
150
|
+
] }, row.key)) })
|
|
151
|
+
] })
|
|
152
|
+
}
|
|
153
|
+
);
|
|
154
|
+
}
|
|
155
|
+
function columnTitle(column) {
|
|
156
|
+
if (typeof column === "string" || typeof column === "number") {
|
|
157
|
+
return String(column);
|
|
158
|
+
}
|
|
159
|
+
return void 0;
|
|
160
|
+
}
|
|
161
|
+
export {
|
|
162
|
+
MatrixTable
|
|
163
|
+
};
|
|
164
|
+
//# sourceMappingURL=MatrixTable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MatrixTable.js","sources":["../../src/data/MatrixTable.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { cn } from \"../lib/utils\";\n\nexport type MatrixTableRow = {\n key: string;\n label: ReactNode;\n cells: ReactNode[];\n};\n\nexport type MatrixTableProps = {\n columns: ReactNode[];\n rows: MatrixTableRow[];\n corner?: ReactNode;\n emptyMessage?: ReactNode;\n angledHeaders?: boolean;\n density?: \"default\" | \"compact\";\n columnWidth?: number;\n headerHeight?: number;\n className?: string;\n columnClassName?: string;\n rowLabelClassName?: string;\n cellClassName?: string;\n};\n\nexport function MatrixTable({\n columns,\n rows,\n corner,\n emptyMessage = \"No data\",\n angledHeaders = false,\n density = \"default\",\n columnWidth = 48,\n headerHeight = 120,\n className,\n columnClassName,\n rowLabelClassName,\n cellClassName,\n}: MatrixTableProps) {\n if (rows.length === 0 || columns.length === 0) {\n return <div className=\"text-sm text-muted-foreground\">{emptyMessage}</div>;\n }\n\n const textWidth = Math.round(headerHeight * 1.41);\n const diagonalOverhang = Math.round(headerHeight * 0.71);\n const compact = density === \"compact\";\n const headerCellPadding = compact ? \"px-density-2 py-density-1\" : \"px-density-3 py-density-2\";\n const rowLabelPadding = compact ? \"px-density-2 py-1\" : \"px-density-3 py-density-2\";\n const bodyCellPadding = compact ? \"px-density-2 py-1\" : \"px-density-3 py-density-2\";\n\n return (\n <div\n className={cn(\"overflow-auto rounded-md border border-border\", className)}\n style={angledHeaders ? { paddingRight: diagonalOverhang } : undefined}\n >\n <table className={cn(\"w-max border-collapse\", compact ? \"text-xs\" : \"text-sm\")}>\n {angledHeaders && (\n <colgroup>\n <col />\n {columns.map((_, index) => (\n <col key={index} style={{ width: columnWidth }} />\n ))}\n </colgroup>\n )}\n <thead>\n <tr className={cn(\"bg-muted/40\", !angledHeaders && \"border-b border-border\")}>\n <th\n scope=\"col\"\n className={cn(\n \"sticky left-0 z-10 min-w-44 border-r border-border bg-muted/40 text-left font-medium\",\n headerCellPadding,\n angledHeaders ? \"align-bottom\" : columnClassName,\n )}\n >\n {corner}\n </th>\n {columns.map((column, index) =>\n angledHeaders ? (\n <th\n key={index}\n scope=\"col\"\n title={columnTitle(column)}\n className={cn(\n \"relative overflow-visible border-b border-border p-0 align-bottom\",\n columnClassName,\n )}\n style={{\n width: columnWidth,\n minWidth: columnWidth,\n maxWidth: columnWidth,\n height: headerHeight,\n }}\n >\n <div\n className=\"absolute bottom-0 border-b border-border\"\n style={{\n left: columnWidth,\n width: textWidth,\n transform: \"rotate(-45deg)\",\n transformOrigin: \"0 100%\",\n }}\n />\n {index === 0 && (\n <div\n className=\"absolute bottom-0 border-b border-border\"\n style={{\n left: 0,\n width: textWidth,\n transform: \"rotate(-45deg)\",\n transformOrigin: \"0 100%\",\n }}\n />\n )}\n <div\n className=\"absolute bottom-2 overflow-hidden text-ellipsis whitespace-nowrap pl-1 text-left text-xs font-medium leading-none text-muted-foreground\"\n style={{\n left: columnWidth / 2,\n width: textWidth,\n transform: \"rotate(-45deg)\",\n transformOrigin: \"0 100%\",\n }}\n >\n {column}\n </div>\n </th>\n ) : (\n <th\n key={index}\n scope=\"col\"\n className={cn(\n \"min-w-24 whitespace-nowrap text-center text-xs font-medium text-muted-foreground\",\n headerCellPadding,\n columnClassName,\n )}\n >\n {column}\n </th>\n ),\n )}\n </tr>\n </thead>\n <tbody>\n {rows.map((row) => (\n <tr key={row.key} className=\"border-b border-border last:border-b-0\">\n <th\n scope=\"row\"\n className={cn(\n \"sticky left-0 z-10 border-r border-border bg-background text-left font-medium\",\n rowLabelPadding,\n rowLabelClassName,\n )}\n >\n {row.label}\n </th>\n {columns.map((_, index) => (\n <td\n key={index}\n className={cn(\n angledHeaders\n ? \"p-0 text-center align-middle\"\n : cn(bodyCellPadding, \"text-center align-middle\"),\n cellClassName,\n )}\n style={\n angledHeaders\n ? {\n width: columnWidth,\n minWidth: columnWidth,\n maxWidth: columnWidth,\n }\n : undefined\n }\n >\n {row.cells[index] ?? null}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\nfunction columnTitle(column: ReactNode) {\n if (typeof column === \"string\" || typeof column === \"number\") {\n return String(column);\n }\n return undefined;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MethodBadge.d.ts","sourceRoot":"","sources":["../../src/data/MethodBadge.tsx"],"names":[],"mappings":"AAaA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wBAAgB,WAAW,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,gBAAgB,2CAOlE"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Badge } from "./Badge.js";
|
|
3
|
+
import { cn } from "../lib/utils.js";
|
|
4
|
+
const METHOD_TONES = {
|
|
5
|
+
get: "info",
|
|
6
|
+
post: "success",
|
|
7
|
+
put: "warning",
|
|
8
|
+
patch: "warning",
|
|
9
|
+
delete: "danger"
|
|
10
|
+
};
|
|
11
|
+
function MethodBadge({ method, className }) {
|
|
12
|
+
const tone = METHOD_TONES[method.toLowerCase()] ?? "neutral";
|
|
13
|
+
return /* @__PURE__ */ jsx(Badge, { variant: "outline", tone, size: "sm", className: cn("font-mono uppercase", className), children: method.toUpperCase() });
|
|
14
|
+
}
|
|
15
|
+
export {
|
|
16
|
+
MethodBadge
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=MethodBadge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MethodBadge.js","sources":["../../src/data/MethodBadge.tsx"],"sourcesContent":["import { Badge, type BadgeProps } from \"./Badge\";\nimport { cn } from \"../lib/utils\";\n\ntype Tone = NonNullable<BadgeProps[\"tone\"]>;\n\nconst METHOD_TONES: Record<string, Tone> = {\n get: \"info\",\n post: \"success\",\n put: \"warning\",\n patch: \"warning\",\n delete: \"danger\",\n};\n\nexport type MethodBadgeProps = {\n method: string;\n className?: string;\n};\n\nexport function MethodBadge({ method, className }: MethodBadgeProps) {\n const tone = METHOD_TONES[method.toLowerCase()] ?? \"neutral\";\n return (\n <Badge variant=\"outline\" tone={tone} size=\"sm\" className={cn(\"font-mono uppercase\", className)}>\n {method.toUpperCase()}\n </Badge>\n );\n}\n"],"names":[],"mappings":";;;AAKA,MAAM,eAAqC;AAAA,EACzC,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,OAAO;AAAA,EACP,QAAQ;AACV;AAOO,SAAS,YAAY,EAAE,QAAQ,aAA+B;AACnE,QAAM,OAAO,aAAa,OAAO,YAAA,CAAa,KAAK;AACnD,SACE,oBAAC,OAAA,EAAM,SAAQ,WAAU,MAAY,MAAK,MAAK,WAAW,GAAG,uBAAuB,SAAS,GAC1F,UAAA,OAAO,eACV;AAEJ;"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type ProgressSegment = {
|
|
2
|
+
count: number;
|
|
3
|
+
color: string;
|
|
4
|
+
label: string;
|
|
5
|
+
};
|
|
6
|
+
export type ProgressBarProps = {
|
|
7
|
+
segments: ProgressSegment[];
|
|
8
|
+
total: number;
|
|
9
|
+
height?: string;
|
|
10
|
+
className?: string;
|
|
11
|
+
};
|
|
12
|
+
export declare function ProgressBar({ segments, total, height, className }: ProgressBarProps): import("react/jsx-runtime").JSX.Element | null;
|
|
13
|
+
//# sourceMappingURL=ProgressBar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProgressBar.d.ts","sourceRoot":"","sources":["../../src/data/ProgressBar.tsx"],"names":[],"mappings":"AAEA,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wBAAgB,WAAW,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAc,EAAE,SAAS,EAAE,EAAE,gBAAgB,kDA+B3F"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { cn } from "../lib/utils.js";
|
|
3
|
+
function ProgressBar({ segments, total, height = "h-2", className }) {
|
|
4
|
+
if (total === 0) return null;
|
|
5
|
+
const tooltip = segments.filter((s) => s.count > 0).map((s) => `${s.count} ${s.label}`).join(", ");
|
|
6
|
+
return /* @__PURE__ */ jsx(
|
|
7
|
+
"div",
|
|
8
|
+
{
|
|
9
|
+
className: cn("w-full bg-muted rounded-full flex overflow-hidden", height, className),
|
|
10
|
+
title: tooltip,
|
|
11
|
+
role: "progressbar",
|
|
12
|
+
"aria-valuemin": 0,
|
|
13
|
+
"aria-valuemax": total,
|
|
14
|
+
"aria-valuenow": segments.reduce((acc, s) => acc + s.count, 0),
|
|
15
|
+
children: segments.map((seg, i) => {
|
|
16
|
+
if (seg.count === 0) return null;
|
|
17
|
+
const pct = seg.count / total * 100;
|
|
18
|
+
return /* @__PURE__ */ jsx(
|
|
19
|
+
"div",
|
|
20
|
+
{
|
|
21
|
+
className: cn(seg.color, height, "transition-all duration-300"),
|
|
22
|
+
style: { width: `${pct}%` },
|
|
23
|
+
title: `${seg.count} ${seg.label}`
|
|
24
|
+
},
|
|
25
|
+
i
|
|
26
|
+
);
|
|
27
|
+
})
|
|
28
|
+
}
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
export {
|
|
32
|
+
ProgressBar
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=ProgressBar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProgressBar.js","sources":["../../src/data/ProgressBar.tsx"],"sourcesContent":["import { cn } from \"../lib/utils\";\n\nexport type ProgressSegment = {\n count: number;\n color: string;\n label: string;\n};\n\nexport type ProgressBarProps = {\n segments: ProgressSegment[];\n total: number;\n height?: string;\n className?: string;\n};\n\nexport function ProgressBar({ segments, total, height = \"h-2\", className }: ProgressBarProps) {\n if (total === 0) return null;\n\n const tooltip = segments\n .filter((s) => s.count > 0)\n .map((s) => `${s.count} ${s.label}`)\n .join(\", \");\n\n return (\n <div\n className={cn(\"w-full bg-muted rounded-full flex overflow-hidden\", height, className)}\n title={tooltip}\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={total}\n aria-valuenow={segments.reduce((acc, s) => acc + s.count, 0)}\n >\n {segments.map((seg, i) => {\n if (seg.count === 0) return null;\n const pct = (seg.count / total) * 100;\n return (\n <div\n key={i}\n className={cn(seg.color, height, \"transition-all duration-300\")}\n style={{ width: `${pct}%` }}\n title={`${seg.count} ${seg.label}`}\n />\n );\n })}\n </div>\n );\n}\n"],"names":[],"mappings":";;AAeO,SAAS,YAAY,EAAE,UAAU,OAAO,SAAS,OAAO,aAA+B;AAC5F,MAAI,UAAU,EAAG,QAAO;AAExB,QAAM,UAAU,SACb,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,EACzB,IAAI,CAAC,MAAM,GAAG,EAAE,KAAK,IAAI,EAAE,KAAK,EAAE,EAClC,KAAK,IAAI;AAEZ,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,GAAG,qDAAqD,QAAQ,SAAS;AAAA,MACpF,OAAO;AAAA,MACP,MAAK;AAAA,MACL,iBAAe;AAAA,MACf,iBAAe;AAAA,MACf,iBAAe,SAAS,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,OAAO,CAAC;AAAA,MAE1D,UAAA,SAAS,IAAI,CAAC,KAAK,MAAM;AACxB,YAAI,IAAI,UAAU,EAAG,QAAO;AAC5B,cAAM,MAAO,IAAI,QAAQ,QAAS;AAClC,eACE;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,WAAW,GAAG,IAAI,OAAO,QAAQ,6BAA6B;AAAA,YAC9D,OAAO,EAAE,OAAO,GAAG,GAAG,IAAA;AAAA,YACtB,OAAO,GAAG,IAAI,KAAK,IAAI,IAAI,KAAK;AAAA,UAAA;AAAA,UAH3B;AAAA,QAAA;AAAA,MAMX,CAAC;AAAA,IAAA;AAAA,EAAA;AAGP;"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { SortDir } from '../hooks/use-sort';
|
|
3
|
+
export type SortableHeaderProps = {
|
|
4
|
+
active: boolean;
|
|
5
|
+
dir?: SortDir | undefined;
|
|
6
|
+
onClick: () => void;
|
|
7
|
+
align?: "left" | "right" | "center";
|
|
8
|
+
className?: string;
|
|
9
|
+
children: ReactNode;
|
|
10
|
+
};
|
|
11
|
+
export declare function SortableHeader({ active, dir, onClick, align, className, children, }: SortableHeaderProps): import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
//# sourceMappingURL=SortableHeader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SortableHeader.d.ts","sourceRoot":"","sources":["../../src/data/SortableHeader.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,OAAO,CAAC;IAChB,GAAG,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC1B,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,SAAS,CAAC;CACrB,CAAC;AAEF,wBAAgB,cAAc,CAAC,EAC7B,MAAM,EACN,GAAG,EACH,OAAO,EACP,KAAc,EACd,SAAS,EACT,QAAQ,GACT,EAAE,mBAAmB,2CAwBrB"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import { cn } from "../lib/utils.js";
|
|
3
|
+
function SortableHeader({
|
|
4
|
+
active,
|
|
5
|
+
dir,
|
|
6
|
+
onClick,
|
|
7
|
+
align = "left",
|
|
8
|
+
className,
|
|
9
|
+
children
|
|
10
|
+
}) {
|
|
11
|
+
const alignCls = align === "right" ? "justify-end" : align === "center" ? "justify-center" : "justify-start";
|
|
12
|
+
return /* @__PURE__ */ jsxs(
|
|
13
|
+
"button",
|
|
14
|
+
{
|
|
15
|
+
type: "button",
|
|
16
|
+
onClick,
|
|
17
|
+
className: cn(
|
|
18
|
+
"inline-flex items-center gap-1 cursor-pointer select-none hover:text-foreground",
|
|
19
|
+
active ? "text-primary" : "text-muted-foreground",
|
|
20
|
+
alignCls,
|
|
21
|
+
className
|
|
22
|
+
),
|
|
23
|
+
children: [
|
|
24
|
+
children,
|
|
25
|
+
active ? /* @__PURE__ */ jsx("span", { "aria-hidden": true, children: dir === "asc" ? "↑" : "↓" }) : /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "opacity-40", children: "↕" })
|
|
26
|
+
]
|
|
27
|
+
}
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
export {
|
|
31
|
+
SortableHeader
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=SortableHeader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SortableHeader.js","sources":["../../src/data/SortableHeader.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport type { SortDir } from \"../hooks/use-sort\";\n\nexport type SortableHeaderProps = {\n active: boolean;\n dir?: SortDir | undefined;\n onClick: () => void;\n align?: \"left\" | \"right\" | \"center\";\n className?: string;\n children: ReactNode;\n};\n\nexport function SortableHeader({\n active,\n dir,\n onClick,\n align = \"left\",\n className,\n children,\n}: SortableHeaderProps) {\n const alignCls =\n align === \"right\" ? \"justify-end\" : align === \"center\" ? \"justify-center\" : \"justify-start\";\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={cn(\n \"inline-flex items-center gap-1 cursor-pointer select-none hover:text-foreground\",\n active ? \"text-primary\" : \"text-muted-foreground\",\n alignCls,\n className,\n )}\n >\n {children}\n {active ? (\n <span aria-hidden>{dir === \"asc\" ? \"↑\" : \"↓\"}</span>\n ) : (\n <span aria-hidden className=\"opacity-40\">\n ↕\n </span>\n )}\n </button>\n );\n}\n"],"names":[],"mappings":";;AAaO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA;AACF,GAAwB;AACtB,QAAM,WACJ,UAAU,UAAU,gBAAgB,UAAU,WAAW,mBAAmB;AAC9E,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA,SAAS,iBAAiB;AAAA,QAC1B;AAAA,QACA;AAAA,MAAA;AAAA,MAGD,UAAA;AAAA,QAAA;AAAA,QACA,SACC,oBAAC,QAAA,EAAK,eAAW,MAAE,kBAAQ,QAAQ,MAAM,IAAA,CAAI,wBAE5C,QAAA,EAAK,eAAW,MAAC,WAAU,cAAa,UAAA,IAAA,CAEzC;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIR;"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
export type TabButtonProps = {
|
|
3
|
+
active: boolean;
|
|
4
|
+
onClick: () => void;
|
|
5
|
+
label: ReactNode;
|
|
6
|
+
icon?: string;
|
|
7
|
+
count?: number;
|
|
8
|
+
countColor?: string;
|
|
9
|
+
className?: string;
|
|
10
|
+
};
|
|
11
|
+
export declare function TabButton({ active, onClick, label, icon, count, countColor, className, }: TabButtonProps): import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
//# sourceMappingURL=TabButton.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TabButton.d.ts","sourceRoot":"","sources":["../../src/data/TabButton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIvC,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,EAAE,SAAS,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wBAAgB,SAAS,CAAC,EACxB,MAAM,EACN,OAAO,EACP,KAAK,EACL,IAAI,EACJ,KAAK,EACL,UAAkC,EAClC,SAAS,GACV,EAAE,cAAc,2CA6BhB"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import { cn } from "../lib/utils.js";
|
|
3
|
+
import { Icon } from "./Icon.js";
|
|
4
|
+
function TabButton({
|
|
5
|
+
active,
|
|
6
|
+
onClick,
|
|
7
|
+
label,
|
|
8
|
+
icon,
|
|
9
|
+
count,
|
|
10
|
+
countColor = "bg-muted-foreground",
|
|
11
|
+
className
|
|
12
|
+
}) {
|
|
13
|
+
return /* @__PURE__ */ jsxs(
|
|
14
|
+
"button",
|
|
15
|
+
{
|
|
16
|
+
type: "button",
|
|
17
|
+
role: "tab",
|
|
18
|
+
"aria-selected": active,
|
|
19
|
+
onClick,
|
|
20
|
+
className: cn(
|
|
21
|
+
"inline-flex items-center gap-1.5 px-density-3 py-density-1.5 text-sm rounded-md transition-colors",
|
|
22
|
+
active ? "bg-primary text-primary-foreground" : "text-muted-foreground hover:bg-accent hover:text-foreground",
|
|
23
|
+
className
|
|
24
|
+
),
|
|
25
|
+
children: [
|
|
26
|
+
icon && /* @__PURE__ */ jsx(Icon, { name: icon }),
|
|
27
|
+
/* @__PURE__ */ jsx("span", { children: label }),
|
|
28
|
+
count !== void 0 && count > 0 && /* @__PURE__ */ jsx(
|
|
29
|
+
"span",
|
|
30
|
+
{
|
|
31
|
+
className: cn(
|
|
32
|
+
"inline-flex items-center justify-center min-w-[18px] h-[18px] px-1 rounded-full text-[10px] font-bold text-white",
|
|
33
|
+
countColor
|
|
34
|
+
),
|
|
35
|
+
children: count
|
|
36
|
+
}
|
|
37
|
+
)
|
|
38
|
+
]
|
|
39
|
+
}
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
export {
|
|
43
|
+
TabButton
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=TabButton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TabButton.js","sources":["../../src/data/TabButton.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"./Icon\";\n\nexport type TabButtonProps = {\n active: boolean;\n onClick: () => void;\n label: ReactNode;\n icon?: string;\n count?: number;\n countColor?: string;\n className?: string;\n};\n\nexport function TabButton({\n active,\n onClick,\n label,\n icon,\n count,\n countColor = \"bg-muted-foreground\",\n className,\n}: TabButtonProps) {\n return (\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={active}\n onClick={onClick}\n className={cn(\n \"inline-flex items-center gap-1.5 px-density-3 py-density-1.5 text-sm rounded-md transition-colors\",\n active\n ? \"bg-primary text-primary-foreground\"\n : \"text-muted-foreground hover:bg-accent hover:text-foreground\",\n className,\n )}\n >\n {icon && <Icon name={icon} />}\n <span>{label}</span>\n {count !== undefined && count > 0 && (\n <span\n className={cn(\n \"inline-flex items-center justify-center min-w-[18px] h-[18px] px-1 rounded-full text-[10px] font-bold text-white\",\n countColor,\n )}\n >\n {count}\n </span>\n )}\n </button>\n );\n}\n"],"names":[],"mappings":";;;AAcO,SAAS,UAAU;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb;AACF,GAAmB;AACjB,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,MAAK;AAAA,MACL,iBAAe;AAAA,MACf;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA,SACI,uCACA;AAAA,QACJ;AAAA,MAAA;AAAA,MAGD,UAAA;AAAA,QAAA,QAAQ,oBAAC,MAAA,EAAK,MAAM,KAAA,CAAM;AAAA,QAC3B,oBAAC,UAAM,UAAA,MAAA,CAAM;AAAA,QACZ,UAAU,UAAa,QAAQ,KAC9B;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA;AAAA,YAAA;AAAA,YAGD,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MACH;AAAA,IAAA;AAAA,EAAA;AAIR;"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { TreeNodeProps } from './TreeNode';
|
|
3
|
+
export type TreeProps<T> = Omit<TreeNodeProps<T>, "node" | "depth" | "expandAll" | "forcedOpenKeys"> & {
|
|
4
|
+
roots: T[];
|
|
5
|
+
empty?: ReactNode;
|
|
6
|
+
className?: string;
|
|
7
|
+
/**
|
|
8
|
+
* Render the Expand all / Collapse all toolbar above the tree. Enabled by
|
|
9
|
+
* default. Set to false to suppress when the tree is tiny or the controls
|
|
10
|
+
* are owned externally.
|
|
11
|
+
*/
|
|
12
|
+
showControls?: boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Externally controlled expand-all state. When provided together with
|
|
15
|
+
* `onExpandAllChange`, the tree is controlled; otherwise it manages the
|
|
16
|
+
* toolbar state internally.
|
|
17
|
+
*/
|
|
18
|
+
expandAll?: boolean | null;
|
|
19
|
+
onExpandAllChange?: (next: boolean | null) => void;
|
|
20
|
+
toolbarClassName?: string;
|
|
21
|
+
/**
|
|
22
|
+
* Override the text the filter matches against for a given node.
|
|
23
|
+
* Defaults to a recursive walk of the node's own fields (excluding
|
|
24
|
+
* its `children` and any secondary children), which works for
|
|
25
|
+
* plain-shape trees but leaks text from nested domain objects —
|
|
26
|
+
* e.g. a SQL Table's Field rows are marked secondary, yet the
|
|
27
|
+
* parent record still carries `record.fields[].field` strings that
|
|
28
|
+
* the default walker would collect. Callers that need precise
|
|
29
|
+
* control over search behaviour should return only the text they
|
|
30
|
+
* want surfaced (the node's own display label / id / type).
|
|
31
|
+
*/
|
|
32
|
+
getSearchText?: (node: T) => string;
|
|
33
|
+
};
|
|
34
|
+
export declare function Tree<T>({ roots, empty, className, showControls, expandAll: controlledExpandAll, onExpandAllChange, toolbarClassName, getSearchText, ...nodeProps }: TreeProps<T>): import("react/jsx-runtime").JSX.Element;
|
|
35
|
+
//# sourceMappingURL=Tree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tree.d.ts","sourceRoot":"","sources":["../../src/data/Tree.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAG1D,OAAO,EAAY,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAE1D,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI,IAAI,CAC7B,aAAa,CAAC,CAAC,CAAC,EAChB,MAAM,GAAG,OAAO,GAAG,WAAW,GAAG,gBAAgB,CAClD,GAAG;IACF,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC3B,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,KAAK,IAAI,CAAC;IACnD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;;;;;;;OAUG;IACH,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAC;CACrC,CAAC;AAgJF,wBAAgB,IAAI,CAAC,CAAC,EAAE,EACtB,KAAK,EACL,KAAK,EACL,SAAS,EACT,YAAmB,EACnB,SAAS,EAAE,mBAAmB,EAC9B,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,GAAG,SAAS,EACb,EAAE,SAAS,CAAC,CAAC,CAAC,2CAsJd"}
|