@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
package/dist/index.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["STORAGE_KEY","DATA_ATTR","readStored","apply","formatBytes","formatBytes","headerRe","formatBytes"],"sources":["../src/lib/utils.ts","../src/lib/palette.ts","../src/hooks/use-theme.tsx","../src/hooks/use-density.tsx","../src/hooks/use-sort.ts","../src/hooks/use-history-route.ts","../src/components/button.tsx","../src/data/Icon.tsx","../src/components/select.tsx","../src/components/theme-switcher.tsx","../src/components/density-switcher.tsx","../src/layout/SplitPane.tsx","../src/layout/Section.tsx","../src/data/AnsiHtml.tsx","../src/data/Avatar.tsx","../src/data/Badge.tsx","../src/data/SortableHeader.tsx","../src/data/TreeNode.tsx","../src/data/Tree.tsx","../src/data/Clicky.tsx","../src/data/FilterPill.tsx","../src/data/Gauge.tsx","../src/data/JsonView.tsx","../src/data/LogViewer.tsx","../src/data/Markdown.tsx","../src/data/ProgressBar.tsx","../src/data/TabButton.tsx","../src/data/TreeGroupHeader.tsx","../src/data/diagnostics/utils.ts","../src/data/diagnostics/DiagnosticsTree.tsx","../src/data/diagnostics/jvm-stacktrace.ts","../src/data/diagnostics/stacktrace.ts","../src/data/diagnostics/GoroutineCard.tsx","../src/data/diagnostics/ThreadCard.tsx","../src/data/diagnostics/DiagnosticsDetailPanel.tsx","../src/data/har/HarPanel.tsx","../src/overlay/HoverCard.tsx","../src/overlay/Modal.tsx"],"sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","// 16 Tailwind bg/text pairs chosen for WCAG AA contrast at small avatar sizes.\n// Add/remove entries carefully — the index is hash-derived and must stay stable.\nexport const AVATAR_PALETTE: readonly string[] = [\n \"bg-rose-100 text-rose-700\",\n \"bg-pink-100 text-pink-700\",\n \"bg-fuchsia-100 text-fuchsia-700\",\n \"bg-purple-100 text-purple-700\",\n \"bg-violet-100 text-violet-700\",\n \"bg-indigo-100 text-indigo-700\",\n \"bg-blue-100 text-blue-700\",\n \"bg-sky-100 text-sky-700\",\n \"bg-cyan-100 text-cyan-700\",\n \"bg-teal-100 text-teal-700\",\n \"bg-emerald-100 text-emerald-700\",\n \"bg-green-100 text-green-700\",\n \"bg-lime-100 text-lime-800\",\n \"bg-amber-100 text-amber-800\",\n \"bg-orange-100 text-orange-700\",\n \"bg-red-100 text-red-700\",\n];\n\n// Deterministic 32-bit FNV-1a hash. Same input → same output across sessions.\nexport function fnv1a32(s: string): number {\n let h = 0x811c9dc5;\n for (let i = 0; i < s.length; i++) {\n h ^= s.charCodeAt(i);\n h = Math.imul(h, 0x01000193);\n }\n return h >>> 0;\n}\n\nexport function paletteClass(key: string): string {\n return AVATAR_PALETTE[fnv1a32(key) % AVATAR_PALETTE.length]!;\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n type ReactNode,\n} from \"react\";\n\nexport type Theme = \"light\" | \"dark\" | \"system\";\nexport type ResolvedTheme = \"light\" | \"dark\";\n\ntype ThemeContextValue = {\n theme: Theme;\n resolvedTheme: ResolvedTheme;\n setTheme: (next: Theme) => void;\n};\n\nconst STORAGE_KEY = \"clicky-ui-theme\";\nconst DATA_ATTR = \"data-theme\";\n\nconst ThemeContext = createContext<ThemeContextValue | null>(null);\n\nfunction prefersDark(): boolean {\n if (typeof window === \"undefined\") return false;\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n}\n\nfunction readStored(): Theme {\n if (typeof window === \"undefined\") return \"system\";\n const raw = window.localStorage.getItem(STORAGE_KEY);\n return raw === \"light\" || raw === \"dark\" || raw === \"system\" ? raw : \"system\";\n}\n\nfunction resolve(theme: Theme): ResolvedTheme {\n if (theme === \"system\") return prefersDark() ? \"dark\" : \"light\";\n return theme;\n}\n\nfunction apply(resolved: ResolvedTheme): void {\n if (typeof document === \"undefined\") return;\n document.documentElement.setAttribute(DATA_ATTR, resolved);\n}\n\nexport type ThemeProviderProps = {\n children: ReactNode;\n defaultTheme?: Theme;\n storageKey?: string;\n};\n\nexport function ThemeProvider({\n children,\n defaultTheme = \"system\",\n storageKey = STORAGE_KEY,\n}: ThemeProviderProps) {\n const [theme, setThemeState] = useState<Theme>(() => {\n if (typeof window === \"undefined\") return defaultTheme;\n return readStored() ?? defaultTheme;\n });\n const [resolvedTheme, setResolvedTheme] = useState<ResolvedTheme>(() => resolve(theme));\n\n useEffect(() => {\n const next = resolve(theme);\n setResolvedTheme(next);\n apply(next);\n if (typeof window !== \"undefined\") {\n window.localStorage.setItem(storageKey, theme);\n }\n }, [theme, storageKey]);\n\n useEffect(() => {\n if (theme !== \"system\" || typeof window === \"undefined\") return;\n const mq = window.matchMedia(\"(prefers-color-scheme: dark)\");\n const onChange = () => {\n const next: ResolvedTheme = mq.matches ? \"dark\" : \"light\";\n setResolvedTheme(next);\n apply(next);\n };\n mq.addEventListener(\"change\", onChange);\n return () => mq.removeEventListener(\"change\", onChange);\n }, [theme]);\n\n const setTheme = useCallback((next: Theme) => setThemeState(next), []);\n\n const value = useMemo<ThemeContextValue>(\n () => ({ theme, resolvedTheme, setTheme }),\n [theme, resolvedTheme, setTheme],\n );\n\n return <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>;\n}\n\nexport function useTheme(): ThemeContextValue {\n const ctx = useContext(ThemeContext);\n if (!ctx) throw new Error(\"useTheme must be used inside <ThemeProvider>\");\n return ctx;\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n type ReactNode,\n} from \"react\";\n\nexport type Density = \"compact\" | \"comfortable\" | \"spacious\";\n\ntype DensityContextValue = {\n density: Density;\n setDensity: (next: Density) => void;\n};\n\nconst STORAGE_KEY = \"clicky-ui-density\";\nconst DATA_ATTR = \"data-density\";\n\nconst DensityContext = createContext<DensityContextValue | null>(null);\n\nfunction readStored(): Density | null {\n if (typeof window === \"undefined\") return null;\n const raw = window.localStorage.getItem(STORAGE_KEY);\n return raw === \"compact\" || raw === \"comfortable\" || raw === \"spacious\" ? raw : null;\n}\n\nfunction apply(density: Density): void {\n if (typeof document === \"undefined\") return;\n document.documentElement.setAttribute(DATA_ATTR, density);\n}\n\nexport type DensityProviderProps = {\n children: ReactNode;\n defaultDensity?: Density;\n storageKey?: string;\n};\n\nexport function DensityProvider({\n children,\n defaultDensity = \"comfortable\",\n storageKey = STORAGE_KEY,\n}: DensityProviderProps) {\n const [density, setDensityState] = useState<Density>(() => {\n if (typeof window === \"undefined\") return defaultDensity;\n return readStored() ?? defaultDensity;\n });\n\n useEffect(() => {\n apply(density);\n if (typeof window !== \"undefined\") {\n window.localStorage.setItem(storageKey, density);\n }\n }, [density, storageKey]);\n\n const setDensity = useCallback((next: Density) => setDensityState(next), []);\n\n const value = useMemo<DensityContextValue>(\n () => ({ density, setDensity }),\n [density, setDensity],\n );\n\n return <DensityContext.Provider value={value}>{children}</DensityContext.Provider>;\n}\n\nexport function useDensity(): DensityContextValue {\n const ctx = useContext(DensityContext);\n if (!ctx) throw new Error(\"useDensity must be used inside <DensityProvider>\");\n return ctx;\n}\n","import { useMemo, useState } from \"react\";\n\nexport type SortDir = \"asc\" | \"desc\";\n\nexport type SortState = {\n key: string;\n dir: SortDir;\n};\n\nexport type UseSortOptions<T> = {\n defaultKey?: string;\n defaultDir?: SortDir;\n resolvers?: Record<string, (item: T) => unknown>;\n};\n\nexport type UseSortReturn<T> = {\n sorted: T[];\n sort: SortState | null;\n toggle: (key: string) => void;\n};\n\nfunction resolvePath(obj: unknown, path: string): unknown {\n return path.split(\".\").reduce<unknown>((o, k) => {\n if (o && typeof o === \"object\") return (o as Record<string, unknown>)[k];\n return undefined;\n }, obj);\n}\n\nexport function useSort<T>(items: T[], options: UseSortOptions<T> = {}): UseSortReturn<T> {\n const { defaultKey, defaultDir = \"asc\", resolvers } = options;\n\n const [sort, setSort] = useState<SortState | null>(\n defaultKey ? { key: defaultKey, dir: defaultDir } : null,\n );\n\n function toggle(key: string) {\n setSort((prev) => {\n if (prev?.key === key) {\n return prev.dir === \"asc\" ? { key, dir: \"desc\" } : null;\n }\n return { key, dir: \"asc\" };\n });\n }\n\n const sorted = useMemo(() => {\n if (!items) return [];\n if (!sort) return items;\n const { key, dir } = sort;\n const resolver = resolvers?.[key];\n const get = (item: T) => (resolver ? resolver(item) : resolvePath(item, key));\n return [...items].sort((a, b) => {\n const av = get(a);\n const bv = get(b);\n if (av == null && bv == null) return 0;\n if (av == null) return 1;\n if (bv == null) return -1;\n const cmp =\n typeof av === \"number\" && typeof bv === \"number\"\n ? av - bv\n : String(av).localeCompare(String(bv));\n return dir === \"asc\" ? cmp : -cmp;\n });\n }, [items, sort, resolvers]);\n\n return { sorted, sort, toggle };\n}\n","import { useCallback, useEffect, useState } from \"react\";\n\nexport type UseHistoryRouteOptions<R> = {\n parse: (pathname: string, search: string) => R;\n build: (route: R) => string;\n};\n\nexport function useHistoryRoute<R>(\n options: UseHistoryRouteOptions<R>,\n): [R, (next: Partial<R> | ((prev: R) => R)) => void] {\n const { parse, build } = options;\n\n const [route, setRoute] = useState<R>(() =>\n typeof window === \"undefined\"\n ? parse(\"/\", \"\")\n : parse(window.location.pathname, window.location.search),\n );\n\n useEffect(() => {\n const onPop = () => setRoute(parse(window.location.pathname, window.location.search));\n window.addEventListener(\"popstate\", onPop);\n return () => window.removeEventListener(\"popstate\", onPop);\n }, [parse]);\n\n const navigate = useCallback(\n (next: Partial<R> | ((prev: R) => R)) => {\n setRoute((prev) => {\n const merged =\n typeof next === \"function\" ? (next as (p: R) => R)(prev) : ({ ...prev, ...next } as R);\n const path = build(merged);\n if (typeof window !== \"undefined\") {\n const current = window.location.pathname + window.location.search;\n if (current !== path) window.history.pushState(null, \"\", path);\n }\n return merged;\n });\n },\n [build],\n );\n\n return [route, navigate];\n}\n","import { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { forwardRef, type ButtonHTMLAttributes } 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 };\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\";\n return (\n <Comp ref={ref} className={cn(buttonVariants({ variant, size }), className)} {...props} />\n );\n },\n);\nButton.displayName = \"Button\";\n\nexport { buttonVariants };\n","import { cn } from \"../lib/utils\";\n// Type augmentation (no runtime side-effects) — include via tsconfig.\n// @see ./iconify-icon.d.ts\n\nexport type IconProps = {\n name: string;\n className?: string;\n width?: string | number;\n height?: string | number;\n rotate?: string | number;\n flip?: string;\n inline?: boolean;\n title?: string;\n};\n\nexport function Icon({ name, className, width, height, rotate, flip, inline, title }: IconProps) {\n return (\n <iconify-icon\n icon={name}\n className={cn(\"shrink-0\", className)}\n width={width}\n height={height}\n rotate={rotate}\n flip={flip}\n inline={inline}\n title={title}\n aria-hidden={title ? undefined : true}\n />\n );\n}\n","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","import { forwardRef, type HTMLAttributes } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { useTheme, type Theme } from \"../hooks/use-theme\";\n\nconst THEMES: Theme[] = [\"light\", \"dark\", \"system\"];\n\nexport type ThemeSwitcherProps = HTMLAttributes<HTMLDivElement>;\n\nexport const ThemeSwitcher = forwardRef<HTMLDivElement, ThemeSwitcherProps>(\n ({ className, ...props }, ref) => {\n const { theme, setTheme, resolvedTheme } = useTheme();\n return (\n <div\n ref={ref}\n role=\"radiogroup\"\n aria-label=\"Theme\"\n className={cn(\n \"inline-flex items-center gap-density-1 rounded-md border border-input bg-background p-density-1\",\n className,\n )}\n {...props}\n >\n {THEMES.map((t) => {\n const active = theme === t;\n return (\n <button\n key={t}\n type=\"button\"\n role=\"radio\"\n aria-checked={active}\n data-active={active || undefined}\n onClick={() => setTheme(t)}\n className={cn(\n \"inline-flex h-control-h items-center justify-center rounded-sm px-density-3 text-sm capitalize transition-colors\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n active\n ? \"bg-primary text-primary-foreground\"\n : \"text-foreground hover:bg-accent hover:text-accent-foreground\",\n )}\n >\n {t}\n </button>\n );\n })}\n <span className=\"ml-density-2 text-xs text-muted-foreground\">\n resolved: <span data-testid=\"resolved-theme\">{resolvedTheme}</span>\n </span>\n </div>\n );\n },\n);\nThemeSwitcher.displayName = \"ThemeSwitcher\";\n","import { forwardRef, type HTMLAttributes } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { useDensity, type Density } from \"../hooks/use-density\";\n\nconst DENSITIES: Density[] = [\"compact\", \"comfortable\", \"spacious\"];\n\nexport type DensitySwitcherProps = HTMLAttributes<HTMLDivElement>;\n\nexport const DensitySwitcher = forwardRef<HTMLDivElement, DensitySwitcherProps>(\n ({ className, ...props }, ref) => {\n const { density, setDensity } = useDensity();\n return (\n <div\n ref={ref}\n role=\"radiogroup\"\n aria-label=\"Density\"\n className={cn(\n \"inline-flex items-center gap-density-1 rounded-md border border-input bg-background p-density-1\",\n className,\n )}\n {...props}\n >\n {DENSITIES.map((d) => {\n const active = density === d;\n return (\n <button\n key={d}\n type=\"button\"\n role=\"radio\"\n aria-checked={active}\n data-active={active || undefined}\n onClick={() => setDensity(d)}\n className={cn(\n \"inline-flex h-control-h items-center justify-center rounded-sm px-density-3 text-sm capitalize transition-colors\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n active\n ? \"bg-primary text-primary-foreground\"\n : \"text-foreground hover:bg-accent hover:text-accent-foreground\",\n )}\n >\n {d}\n </button>\n );\n })}\n </div>\n );\n },\n);\nDensitySwitcher.displayName = \"DensitySwitcher\";\n","import { useCallback, useRef, useState, type ReactNode } from \"react\";\nimport { cn } from \"../lib/utils\";\n\nexport type SplitPaneProps = {\n left: ReactNode;\n right: ReactNode;\n defaultSplit?: number;\n minLeft?: number;\n minRight?: number;\n leftClass?: string;\n rightClass?: string;\n className?: string;\n};\n\nexport function SplitPane({\n left,\n right,\n defaultSplit = 50,\n minLeft = 20,\n minRight = 20,\n leftClass,\n rightClass,\n className,\n}: SplitPaneProps) {\n const [split, setSplit] = useState(defaultSplit);\n const dragging = useRef(false);\n const container = useRef<HTMLDivElement>(null);\n\n const onMouseDown = useCallback(\n (e: React.MouseEvent) => {\n e.preventDefault();\n dragging.current = true;\n\n const onMove = (ev: MouseEvent) => {\n if (!dragging.current || !container.current) return;\n const rect = container.current.getBoundingClientRect();\n const pct = ((ev.clientX - rect.left) / rect.width) * 100;\n setSplit(Math.max(minLeft, Math.min(100 - minRight, pct)));\n };\n\n const onUp = () => {\n dragging.current = false;\n document.removeEventListener(\"mousemove\", onMove);\n document.removeEventListener(\"mouseup\", onUp);\n document.body.style.cursor = \"\";\n document.body.style.userSelect = \"\";\n };\n\n document.addEventListener(\"mousemove\", onMove);\n document.addEventListener(\"mouseup\", onUp);\n document.body.style.cursor = \"col-resize\";\n document.body.style.userSelect = \"none\";\n },\n [minLeft, minRight],\n );\n\n return (\n <div ref={container} className={cn(\"flex flex-1 overflow-hidden min-h-0\", className)}>\n <div\n style={{ width: `${split}%` }}\n className={cn(\"overflow-y-auto bg-background min-h-0\", leftClass)}\n >\n {left}\n </div>\n <div\n role=\"separator\"\n aria-orientation=\"vertical\"\n className=\"w-1 bg-border hover:bg-primary cursor-col-resize shrink-0 transition-colors\"\n onMouseDown={onMouseDown}\n />\n <div\n style={{ width: `${100 - split}%` }}\n className={cn(\"overflow-hidden bg-background min-h-0\", rightClass)}\n >\n {right}\n </div>\n </div>\n );\n}\n","import { useState, type ReactNode } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"../data/Icon\";\n\nexport type SectionProps = {\n title: ReactNode;\n summary?: ReactNode;\n defaultOpen?: boolean;\n open?: boolean;\n onToggle?: (open: boolean) => void;\n icon?: string;\n tone?: \"default\" | \"danger\" | \"warning\" | \"success\" | \"info\";\n className?: string;\n headerClassName?: string;\n bodyClassName?: string;\n children: ReactNode;\n};\n\nconst toneRing: Record<NonNullable<SectionProps[\"tone\"]>, string> = {\n default: \"\",\n danger: \"border-l-2 border-red-500\",\n warning: \"border-l-2 border-yellow-500\",\n success: \"border-l-2 border-green-500\",\n info: \"border-l-2 border-blue-500\",\n};\n\nexport function Section({\n title,\n summary,\n defaultOpen = false,\n open: openProp,\n onToggle,\n icon,\n tone = \"default\",\n className,\n headerClassName,\n bodyClassName,\n children,\n}: SectionProps) {\n const isControlled = openProp !== undefined;\n const [innerOpen, setInnerOpen] = useState(defaultOpen);\n const open = isControlled ? openProp : innerOpen;\n\n function toggle() {\n const next = !open;\n if (!isControlled) setInnerOpen(next);\n onToggle?.(next);\n }\n\n return (\n <div className={cn(\"rounded-md border border-border bg-background\", toneRing[tone], className)}>\n <button\n type=\"button\"\n onClick={toggle}\n aria-expanded={open}\n className={cn(\n \"w-full flex items-center gap-2 px-density-3 py-density-2 text-left\",\n \"hover:bg-accent/50 transition-colors\",\n headerClassName,\n )}\n >\n <Icon\n name={open ? \"codicon:chevron-down\" : \"codicon:chevron-right\"}\n className=\"text-muted-foreground text-xs\"\n />\n {icon && <Icon name={icon} className=\"text-base\" />}\n <span className=\"font-medium text-sm flex-1 truncate\">{title}</span>\n {summary && <span className=\"text-xs text-muted-foreground\">{summary}</span>}\n </button>\n {open && (\n <div className={cn(\"px-density-3 py-density-2 border-t border-border\", bodyClassName)}>\n {children}\n </div>\n )}\n </div>\n );\n}\n\nexport type DetailEmptyStateProps = {\n icon?: string;\n label: ReactNode;\n description?: ReactNode;\n className?: string;\n};\n\nexport function DetailEmptyState({ icon, label, description, className }: DetailEmptyStateProps) {\n return (\n <div className={cn(\"p-density-6 text-center text-muted-foreground\", className)}>\n {icon && <Icon name={icon} className=\"text-3xl mb-density-2\" />}\n <p className=\"text-sm\">{label}</p>\n {description && <p className=\"text-xs mt-density-1 opacity-70\">{description}</p>}\n </div>\n );\n}\n","const ANSI_COLORS: Record<string, string> = {\n \"30\": \"color:#1e1e1e\",\n \"31\": \"color:#cd3131\",\n \"32\": \"color:#0dbc79\",\n \"33\": \"color:#e5e510\",\n \"34\": \"color:#2472c8\",\n \"35\": \"color:#bc3fbc\",\n \"36\": \"color:#11a8cd\",\n \"37\": \"color:#e5e5e5\",\n \"90\": \"color:#666\",\n \"91\": \"color:#f14c4c\",\n \"92\": \"color:#23d18b\",\n \"93\": \"color:#f5f543\",\n \"94\": \"color:#3b8eea\",\n \"95\": \"color:#d670d6\",\n \"96\": \"color:#29b8db\",\n \"97\": \"color:#fff\",\n \"1\": \"font-weight:bold\",\n \"2\": \"opacity:0.7\",\n \"3\": \"font-style:italic\",\n \"4\": \"text-decoration:underline\",\n};\n\ntype Span = { text: string; style: string };\n\nfunction parseAnsi(raw: string): Span[] {\n const spans: Span[] = [];\n // eslint-disable-next-line no-control-regex\n const re = /\\x1b\\[([0-9;]*)m/g;\n let last = 0;\n let styles: string[] = [];\n let match: RegExpExecArray | null;\n\n while ((match = re.exec(raw)) !== null) {\n if (match.index > last) {\n spans.push({ text: raw.slice(last, match.index), style: styles.join(\";\") });\n }\n const codes = (match[1] ?? \"\").split(\";\").filter(Boolean);\n for (const code of codes) {\n if (code === \"0\" || code === \"\") {\n styles = [];\n } else {\n const rule = ANSI_COLORS[code];\n if (rule) styles.push(rule);\n }\n }\n last = match.index + match[0].length;\n }\n\n if (last < raw.length) {\n spans.push({ text: raw.slice(last), style: styles.join(\";\") });\n }\n\n return spans;\n}\n\nfunction spanToStyle(style: string): React.CSSProperties {\n const out: Record<string, string> = {};\n for (const rule of style.split(\";\")) {\n const [k, v] = rule.split(\":\");\n if (!k || !v) continue;\n const key = k.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase());\n out[key] = v;\n }\n return out as React.CSSProperties;\n}\n\nexport type AnsiHtmlProps = {\n text: string;\n className?: string;\n as?: \"pre\" | \"span\";\n};\n\nexport function AnsiHtml({ text, className, as = \"pre\" }: AnsiHtmlProps) {\n const spans = parseAnsi(text);\n const children = spans.map((s, i) =>\n s.style ? (\n <span key={i} style={spanToStyle(s.style)}>\n {s.text}\n </span>\n ) : (\n <span key={i}>{s.text}</span>\n ),\n );\n if (as === \"span\") return <span className={className}>{children}</span>;\n return <pre className={className}>{children}</pre>;\n}\n","import type { SyntheticEvent } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { paletteClass } from \"../lib/palette\";\n\nexport type AvatarProps = {\n src?: string;\n alt: string;\n size?: number;\n rounded?: \"full\" | \"md\";\n title?: string;\n href?: string;\n /**\n * Selects the palette color for the initial-fallback. Defaults to `alt` so\n * repeated rendering of the same identity stays consistent. Pass the full\n * \"owner/name\" for repo avatars so two repos named \"cli\" under different\n * orgs render with different colors.\n */\n colorKey?: string;\n onError?: (e: SyntheticEvent<HTMLImageElement>) => void;\n className?: string;\n};\n\nexport function Avatar({\n src,\n alt,\n size = 20,\n rounded = \"full\",\n title,\n href,\n colorKey,\n onError,\n className,\n}: AvatarProps) {\n const shape = rounded === \"full\" ? \"rounded-full\" : \"rounded\";\n const key = colorKey ?? alt;\n const base = cn(\"inline-block shrink-0\", shape);\n\n const content = src ? (\n <img\n src={src}\n alt={alt}\n title={title ?? alt}\n width={size}\n height={size}\n className={cn(base, \"bg-muted\", className)}\n loading=\"lazy\"\n onError={onError}\n />\n ) : (\n <span\n className={cn(\n base,\n paletteClass(key),\n \"inline-flex items-center justify-center font-semibold\",\n className,\n )}\n style={{ width: size, height: size, fontSize: Math.max(9, Math.floor(size * 0.5)) }}\n title={title ?? alt}\n >\n {(alt.replace(/^@/, \"\").charAt(0) || \"?\").toUpperCase()}\n </span>\n );\n\n if (href) {\n return (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex shrink-0\"\n onClick={(e) => e.stopPropagation()}\n >\n {content}\n </a>\n );\n }\n return content;\n}\n","import type { ReactNode } from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"./Icon\";\n\nexport const badgeVariants = cva(\n \"inline-flex items-center gap-1 rounded-full font-medium whitespace-nowrap\",\n {\n variants: {\n tone: {\n neutral: \"\",\n success: \"\",\n danger: \"\",\n warning: \"\",\n info: \"\",\n },\n variant: {\n soft: \"\",\n solid: \"\",\n outline: \"border bg-transparent\",\n },\n size: {\n sm: \"text-[10px] px-1.5 py-0 h-4\",\n md: \"text-xs px-2 py-0.5\",\n lg: \"text-sm px-2.5 py-1\",\n },\n },\n compoundVariants: [\n { tone: \"neutral\", variant: \"soft\", class: \"bg-muted text-foreground\" },\n { tone: \"neutral\", variant: \"solid\", class: \"bg-foreground text-background\" },\n { tone: \"neutral\", variant: \"outline\", class: \"border-border text-foreground\" },\n\n {\n tone: \"success\",\n variant: \"soft\",\n class: \"bg-green-100 text-green-800 dark:bg-green-500/20 dark:text-green-300\",\n },\n { tone: \"success\", variant: \"solid\", class: \"bg-green-500 text-white\" },\n {\n tone: \"success\",\n variant: \"outline\",\n class: \"border-green-500 text-green-700 dark:text-green-400\",\n },\n\n {\n tone: \"danger\",\n variant: \"soft\",\n class: \"bg-red-100 text-red-800 dark:bg-red-500/20 dark:text-red-300\",\n },\n { tone: \"danger\", variant: \"solid\", class: \"bg-red-500 text-white\" },\n {\n tone: \"danger\",\n variant: \"outline\",\n class: \"border-red-500 text-red-700 dark:text-red-400\",\n },\n\n {\n tone: \"warning\",\n variant: \"soft\",\n class: \"bg-yellow-100 text-yellow-800 dark:bg-yellow-500/20 dark:text-yellow-300\",\n },\n { tone: \"warning\", variant: \"solid\", class: \"bg-yellow-400 text-yellow-950\" },\n {\n tone: \"warning\",\n variant: \"outline\",\n class: \"border-yellow-500 text-yellow-700 dark:text-yellow-400\",\n },\n\n {\n tone: \"info\",\n variant: \"soft\",\n class: \"bg-blue-100 text-blue-800 dark:bg-blue-500/20 dark:text-blue-300\",\n },\n { tone: \"info\", variant: \"solid\", class: \"bg-blue-500 text-white\" },\n {\n tone: \"info\",\n variant: \"outline\",\n class: \"border-blue-500 text-blue-700 dark:text-blue-400\",\n },\n ],\n defaultVariants: {\n tone: \"neutral\",\n variant: \"soft\",\n size: \"md\",\n },\n },\n);\n\nexport type BadgeProps = VariantProps<typeof badgeVariants> & {\n children?: ReactNode;\n icon?: string;\n count?: number;\n className?: string;\n};\n\nexport function Badge({ tone, variant, size, icon, count, children, className }: BadgeProps) {\n return (\n <span className={cn(badgeVariants({ tone, variant, size }), className)}>\n {icon && <Icon name={icon} className=\"text-[1em]\" />}\n {count !== undefined && <span>{count}</span>}\n {children}\n </span>\n );\n}\n","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","import { useEffect, useRef, useState, type ReactNode } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"./Icon\";\n\nexport type TreeRowContext<T> = {\n node: T;\n depth: number;\n open: boolean;\n selected: boolean;\n hasChildren: boolean;\n toggle: () => void;\n};\n\nexport type TreeNodeProps<T> = {\n node: T;\n depth?: number;\n expandAll?: boolean | null;\n selected?: T | null;\n defaultOpen?: (node: T, depth: number) => boolean;\n getChildren: (node: T) => T[] | undefined;\n getKey: (node: T) => string | number;\n onSelect?: (node: T) => void;\n renderRow: (ctx: TreeRowContext<T>) => ReactNode;\n rowClass?: (node: T, selected: boolean) => string;\n indentPx?: number;\n basePaddingPx?: number;\n};\n\nexport function TreeNode<T>({\n node,\n depth = 0,\n expandAll = null,\n selected = null,\n defaultOpen,\n getChildren,\n getKey,\n onSelect,\n renderRow,\n rowClass,\n indentPx = 16,\n basePaddingPx = 8,\n}: TreeNodeProps<T>) {\n const children = getChildren(node);\n const hasChildren = (children?.length ?? 0) > 0;\n const initialOpen = defaultOpen ? defaultOpen(node, depth) : depth < 1;\n const [open, setOpen] = useState(initialOpen);\n const prevExpandAll = useRef(expandAll);\n const isSelected = selected === node;\n\n useEffect(() => {\n if (expandAll !== null && expandAll !== prevExpandAll.current) {\n setOpen(expandAll);\n }\n prevExpandAll.current = expandAll;\n }, [expandAll]);\n\n function toggle() {\n if (hasChildren) setOpen((o) => !o);\n }\n\n const defaultRowBg = isSelected ? \"bg-primary/10 border-l-2 border-primary\" : \"hover:bg-accent\";\n const rowClassName = rowClass ? rowClass(node, isSelected) : defaultRowBg;\n\n return (\n <div role=\"treeitem\" aria-expanded={hasChildren ? open : undefined} aria-selected={isSelected}>\n <div\n className={cn(\"flex items-center gap-1.5 py-1 px-2 cursor-pointer text-sm\", rowClassName)}\n style={{ paddingLeft: `${depth * indentPx + basePaddingPx}px` }}\n onClick={(e) => {\n e.stopPropagation();\n onSelect?.(node);\n toggle();\n }}\n >\n {hasChildren ? (\n <Icon\n name={open ? \"codicon:chevron-down\" : \"codicon:chevron-right\"}\n className=\"text-muted-foreground text-xs w-3\"\n />\n ) : (\n <span className=\"w-3 shrink-0\" aria-hidden />\n )}\n {renderRow({ node, depth, open, selected: isSelected, hasChildren, toggle })}\n </div>\n {open && hasChildren && (\n <div role=\"group\">\n {children!.map((child) => (\n <TreeNode\n key={getKey(child)}\n node={child}\n depth={depth + 1}\n expandAll={expandAll}\n selected={selected}\n defaultOpen={defaultOpen}\n getChildren={getChildren}\n getKey={getKey}\n onSelect={onSelect}\n renderRow={renderRow}\n rowClass={rowClass}\n indentPx={indentPx}\n basePaddingPx={basePaddingPx}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n","import { useState, type ReactNode } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"./Icon\";\nimport { TreeNode, type TreeNodeProps } from \"./TreeNode\";\n\nexport type TreeProps<T> = Omit<TreeNodeProps<T>, \"node\" | \"depth\" | \"expandAll\"> & {\n roots: T[];\n empty?: ReactNode;\n className?: string;\n /**\n * Render the Expand all / Collapse all toolbar above the tree. Enabled by\n * default. Set to false to suppress when the tree is tiny or the controls\n * are owned externally.\n */\n showControls?: boolean;\n /**\n * Externally controlled expand-all state. When provided together with\n * `onExpandAllChange`, the tree is controlled; otherwise it manages the\n * toolbar state internally.\n */\n expandAll?: boolean | null;\n onExpandAllChange?: (next: boolean | null) => void;\n toolbarClassName?: string;\n};\n\nexport function Tree<T>({\n roots,\n empty,\n className,\n showControls = true,\n expandAll: controlledExpandAll,\n onExpandAllChange,\n toolbarClassName,\n ...nodeProps\n}: TreeProps<T>) {\n const [internalExpandAll, setInternalExpandAll] = useState<boolean | null>(null);\n const isControlled = onExpandAllChange !== undefined;\n const expandAll = isControlled ? controlledExpandAll ?? null : internalExpandAll;\n const setExpandAll = (next: boolean | null) => {\n if (isControlled) onExpandAllChange?.(next);\n else setInternalExpandAll(next);\n };\n\n if (roots.length === 0) return <>{empty ?? null}</>;\n\n return (\n <div className={cn(\"flex flex-col min-h-0\", className)}>\n {showControls && (\n <div\n className={cn(\n \"flex items-center gap-1 border-b border-border px-2 py-1 text-xs text-muted-foreground\",\n toolbarClassName,\n )}\n >\n <button\n type=\"button\"\n onClick={() => setExpandAll(true)}\n aria-pressed={expandAll === true}\n className={cn(\n \"inline-flex items-center gap-1 rounded px-1.5 py-0.5 hover:bg-accent hover:text-accent-foreground\",\n expandAll === true && \"bg-accent text-accent-foreground\",\n )}\n >\n <Icon name=\"codicon:expand-all\" className=\"text-xs\" />\n Expand all\n </button>\n <button\n type=\"button\"\n onClick={() => setExpandAll(false)}\n aria-pressed={expandAll === false}\n className={cn(\n \"inline-flex items-center gap-1 rounded px-1.5 py-0.5 hover:bg-accent hover:text-accent-foreground\",\n expandAll === false && \"bg-accent text-accent-foreground\",\n )}\n >\n <Icon name=\"codicon:collapse-all\" className=\"text-xs\" />\n Collapse all\n </button>\n </div>\n )}\n <div role=\"tree\" className=\"min-h-0 flex-1 overflow-auto\">\n {roots.map((root) => (\n <TreeNode<T>\n key={nodeProps.getKey(root)}\n node={root}\n expandAll={expandAll}\n {...nodeProps}\n />\n ))}\n </div>\n </div>\n );\n}\n","import { Fragment, useState, type CSSProperties } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { SortableHeader } from \"./SortableHeader\";\nimport { Tree } from \"./Tree\";\nimport { Icon } from \"./Icon\";\n\nexport type ClickyStyle = {\n className?: string;\n color?: string;\n backgroundColor?: string;\n bold?: boolean;\n faint?: boolean;\n italic?: boolean;\n underline?: boolean;\n strikethrough?: boolean;\n textTransform?: string;\n maxWidth?: number;\n maxLines?: number;\n truncateMode?: \"suffix\" | \"prefix\" | \"headtail\";\n monospace?: boolean;\n};\n\nexport type ClickyField = {\n name: string;\n label?: string;\n value: ClickyNode;\n};\n\nexport type ClickyColumn = {\n name: string;\n label?: string;\n header?: ClickyNode;\n align?: \"left\" | \"right\" | \"center\";\n};\n\nexport type ClickyRow = {\n cells: Record<string, ClickyNode>;\n detail?: ClickyNode;\n};\n\nexport type ClickyTreeItem = {\n id: string;\n label: ClickyNode;\n children?: ClickyTreeItem[];\n};\n\nexport type ClickyNode = {\n kind:\n | \"text\"\n | \"icon\"\n | \"list\"\n | \"map\"\n | \"table\"\n | \"tree\"\n | \"code\"\n | \"collapsed\"\n | \"button\"\n | \"button-group\"\n | \"html\"\n | \"comment\";\n plain?: string;\n style?: ClickyStyle;\n text?: string;\n children?: ClickyNode[];\n tooltip?: ClickyNode;\n html?: string;\n inline?: boolean;\n ordered?: boolean;\n unstyled?: boolean;\n bullet?: ClickyNode;\n items?: ClickyNode[];\n fields?: ClickyField[];\n columns?: ClickyColumn[];\n rows?: ClickyRow[];\n roots?: ClickyTreeItem[];\n label?: ClickyNode;\n content?: ClickyNode;\n href?: string;\n id?: string;\n payload?: string;\n variant?: string;\n iconify?: string;\n unicode?: string;\n language?: string;\n source?: string;\n highlightedHtml?: string;\n};\n\nexport type ClickyDocument = {\n version: 1;\n node: ClickyNode;\n};\n\nexport type ClickyProps = {\n data: ClickyDocument | ClickyNode | string;\n className?: string;\n};\n\ntype ParsedClicky =\n | { ok: true; document: ClickyDocument }\n | { ok: false; message: string; raw: string };\n\ntype SortDir = \"asc\" | \"desc\";\n\nexport function Clicky({ data, className }: ClickyProps) {\n const parsed = parseClickyData(data);\n\n if (!parsed.ok) {\n return (\n <div className={cn(\"rounded-md border border-destructive/30 bg-destructive/5 p-density-3\", className)}>\n <div className=\"text-sm font-medium text-destructive\">Invalid Clicky payload</div>\n <pre className=\"mt-2 whitespace-pre-wrap break-all text-xs text-muted-foreground\">\n {parsed.message}\n {parsed.raw ? `\\n\\n${parsed.raw}` : \"\"}\n </pre>\n </div>\n );\n }\n\n return (\n <div className={className}>\n <ClickyNodeRenderer node={parsed.document.node} />\n </div>\n );\n}\n\nfunction parseClickyData(data: ClickyProps[\"data\"]): ParsedClicky {\n if (typeof data === \"string\") {\n try {\n return normalizeClickyDocument(JSON.parse(data) as unknown);\n } catch (error) {\n return {\n ok: false,\n message: error instanceof Error ? error.message : \"Failed to parse JSON\",\n raw: data,\n };\n }\n }\n\n return normalizeClickyDocument(data);\n}\n\nfunction normalizeClickyDocument(data: unknown): ParsedClicky {\n if (!data || typeof data !== \"object\") {\n return { ok: false, message: \"Payload must be an object\", raw: String(data ?? \"\") };\n }\n\n const candidate = data as Partial<ClickyDocument> & Partial<ClickyNode>;\n if (\"version\" in candidate && candidate.version === 1 && candidate.node && isClickyNode(candidate.node)) {\n return { ok: true, document: candidate as ClickyDocument };\n }\n\n if (isClickyNode(candidate)) {\n return { ok: true, document: { version: 1, node: candidate } };\n }\n\n return {\n ok: false,\n message: \"Payload is neither a Clicky document nor a Clicky node\",\n raw: JSON.stringify(data, null, 2),\n };\n}\n\nfunction isClickyNode(value: unknown): value is ClickyNode {\n return !!value && typeof value === \"object\" && typeof (value as { kind?: unknown }).kind === \"string\";\n}\n\nfunction ClickyNodeRenderer({ node }: { node: ClickyNode | null | undefined }) {\n if (!node) return null;\n\n switch (node.kind) {\n case \"text\":\n return <ClickyText node={node} />;\n case \"icon\":\n return <ClickyIconNode node={node} />;\n case \"list\":\n return <ClickyList node={node} />;\n case \"map\":\n return <ClickyMap node={node} />;\n case \"table\":\n return <ClickyTable node={node} />;\n case \"tree\":\n return <ClickyTreeNode node={node} />;\n case \"code\":\n return <ClickyCodeBlock node={node} />;\n case \"collapsed\":\n return <ClickyCollapsed node={node} />;\n case \"button\":\n return <ClickyButtonNode node={node} />;\n case \"button-group\":\n return <ClickyButtonGroup node={node} />;\n case \"html\":\n return <ClickyHtmlNode node={node} />;\n case \"comment\":\n return null;\n default:\n return (\n <pre className=\"rounded-md border border-border bg-muted p-density-3 text-xs\">\n {JSON.stringify(node, null, 2)}\n </pre>\n );\n }\n}\n\nfunction ClickyText({ node }: { node: ClickyNode }) {\n const inlineStyle = toInlineStyle(node.style, node.text ?? node.plain);\n const content = (\n <>\n {node.text}\n {node.children?.map((child, index) => (\n <Fragment key={index}>\n <ClickyNodeRenderer node={child} />\n </Fragment>\n ))}\n </>\n );\n\n if (!node.style && !node.tooltip) {\n return <>{content}</>;\n }\n\n return (\n <span\n style={inlineStyle}\n title={node.tooltip?.plain}\n className={cn(node.style?.className, (node.text ?? \"\").includes(\"\\n\") && \"whitespace-pre-wrap\")}\n >\n {content}\n </span>\n );\n}\n\nfunction ClickyIconNode({ node }: { node: ClickyNode }) {\n const inlineStyle = toInlineStyle(node.style, node.plain ?? node.unicode);\n\n return (\n <span style={inlineStyle} title={node.tooltip?.plain} className=\"inline-flex items-center\">\n {node.iconify ? (\n <Icon name={node.iconify} />\n ) : (\n <span>{node.unicode ?? node.plain}</span>\n )}\n </span>\n );\n}\n\nfunction ClickyList({ node }: { node: ClickyNode }) {\n const items = node.items ?? [];\n if (items.length === 0) return null;\n\n if (node.inline) {\n return (\n <span className=\"inline-flex flex-wrap items-start gap-1\">\n {items.map((item, index) => (\n <Fragment key={index}>\n {index > 0 && <span className=\"text-muted-foreground\">,</span>}\n <span className=\"inline-flex items-center gap-1\">\n {!node.ordered && node.bullet && <ClickyNodeRenderer node={node.bullet} />}\n {node.ordered && <span className=\"text-muted-foreground\">{index + 1}.</span>}\n <ClickyNodeRenderer node={item} />\n </span>\n </Fragment>\n ))}\n </span>\n );\n }\n\n if (node.unstyled) {\n return (\n <div className=\"space-y-1\">\n {items.map((item, index) => (\n <div key={index} className=\"flex items-start gap-2\">\n {!node.ordered && node.bullet && <ClickyNodeRenderer node={node.bullet} />}\n {node.ordered && <span className=\"text-muted-foreground\">{index + 1}.</span>}\n <div className=\"min-w-0 flex-1\">\n <ClickyNodeRenderer node={item} />\n </div>\n </div>\n ))}\n </div>\n );\n }\n\n const Tag = node.ordered ? \"ol\" : \"ul\";\n const listClass = node.ordered ? \"list-decimal\" : \"list-disc\";\n\n return (\n <Tag className={cn(\"ml-5 space-y-1 text-sm\", listClass)}>\n {items.map((item, index) => (\n <li key={index}>\n <ClickyNodeRenderer node={item} />\n </li>\n ))}\n </Tag>\n );\n}\n\nfunction ClickyMap({ node }: { node: ClickyNode }) {\n const fields = node.fields ?? [];\n if (fields.length === 0) return null;\n\n const inlineFields = fields.filter((field) => isInlineNode(field.value));\n const blockFields = fields.filter((field) => !isInlineNode(field.value));\n\n return (\n <div className=\"space-y-density-4\">\n {inlineFields.length > 0 && (\n <dl className=\"grid gap-density-3 md:grid-cols-2\">\n {inlineFields.map((field) => (\n <div key={field.name}>\n <dt className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n {field.label || prettifyName(field.name)}\n </dt>\n <dd className=\"mt-1 text-sm text-foreground\">\n <ClickyNodeRenderer node={field.value} />\n </dd>\n </div>\n ))}\n </dl>\n )}\n\n {blockFields.map((field) => (\n <section key={field.name} className=\"space-y-2\">\n <div className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n {field.label || prettifyName(field.name)}\n </div>\n <div className=\"rounded-md border border-border bg-background p-density-3\">\n <ClickyNodeRenderer node={field.value} />\n </div>\n </section>\n ))}\n </div>\n );\n}\n\nfunction ClickyTable({ node }: { node: ClickyNode }) {\n const columns = node.columns ?? [];\n const rows = node.rows ?? [];\n const hasDetail = rows.some((row) => !!row.detail);\n const [sortKey, setSortKey] = useState(columns[0]?.name ?? \"\");\n const [sortDir, setSortDir] = useState<SortDir>(\"asc\");\n\n if (columns.length === 0 || rows.length === 0) {\n return <div className=\"text-sm text-muted-foreground\">No data</div>;\n }\n\n const sortedRows = [...rows].sort((left, right) => {\n if (!sortKey) return 0;\n const leftValue = left.cells[sortKey]?.plain ?? left.cells[sortKey]?.text ?? \"\";\n const rightValue = right.cells[sortKey]?.plain ?? right.cells[sortKey]?.text ?? \"\";\n return sortDir === \"asc\" ? compareClickyValues(leftValue, rightValue) : compareClickyValues(rightValue, leftValue);\n });\n\n return (\n <div className=\"overflow-auto rounded-md border border-border\">\n <table className=\"w-full text-left text-sm table-fixed\">\n <thead className=\"sticky top-0 bg-muted/50\">\n <tr className=\"border-b border-border text-xs text-muted-foreground\">\n {hasDetail && <th className=\"w-8 px-2 py-2\" />}\n {columns.map((column) => (\n <th key={column.name} className=\"px-2 py-2 font-medium\">\n <SortableHeader\n active={sortKey === column.name}\n dir={sortKey === column.name ? sortDir : undefined}\n align={column.align ?? \"left\"}\n onClick={() => {\n if (sortKey === column.name) {\n setSortDir((current) => (current === \"asc\" ? \"desc\" : \"asc\"));\n } else {\n setSortKey(column.name);\n setSortDir(\"asc\");\n }\n }}\n >\n {column.header ? (\n <ClickyNodeRenderer node={column.header} />\n ) : (\n column.label || prettifyName(column.name)\n )}\n </SortableHeader>\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {sortedRows.map((row, index) => (\n <ClickyTableRow\n key={`${index}-${row.cells[columns[0]?.name ?? \"\"]?.plain ?? \"\"}`}\n row={row}\n columns={columns}\n hasDetail={hasDetail}\n />\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\nfunction ClickyTableRow({\n row,\n columns,\n hasDetail,\n}: {\n row: ClickyRow;\n columns: ClickyColumn[];\n hasDetail: boolean;\n}) {\n const [open, setOpen] = useState(false);\n const expandable = !!row.detail;\n\n return (\n <>\n <tr\n className={cn(\"border-b border-border align-top\", expandable && \"cursor-pointer hover:bg-accent/50\")}\n onClick={expandable ? () => setOpen((current) => !current) : undefined}\n >\n {hasDetail && (\n <td className=\"px-2 py-2 text-center text-muted-foreground\">\n {expandable ? (open ? \"▼\" : \"▶\") : \"\"}\n </td>\n )}\n {columns.map((column) => (\n <td key={column.name} className={cn(\"px-2 py-2\", alignmentClass(column.align))}>\n <ClickyNodeRenderer node={row.cells[column.name]} />\n </td>\n ))}\n </tr>\n {open && row.detail && (\n <tr>\n <td colSpan={columns.length + (hasDetail ? 1 : 0)} className=\"bg-muted/40 p-density-3\">\n <div className=\"rounded-md border border-border bg-background p-density-3\">\n <ClickyNodeRenderer node={row.detail} />\n </div>\n </td>\n </tr>\n )}\n </>\n );\n}\n\nfunction ClickyTreeNode({ node }: { node: ClickyNode }) {\n const roots = node.roots ?? [];\n if (roots.length === 0) return null;\n\n return (\n <Tree<ClickyTreeItem>\n roots={roots}\n getChildren={(item) => item.children}\n getKey={(item) => item.id}\n defaultOpen={(_, depth) => depth < 1}\n renderRow={({ node: item }) => (\n <div className=\"min-w-0 flex-1 truncate\">\n <ClickyNodeRenderer node={item.label} />\n </div>\n )}\n />\n );\n}\n\nfunction ClickyCodeBlock({ node }: { node: ClickyNode }) {\n const html = node.highlightedHtml ? sanitizeHtml(node.highlightedHtml) : \"\";\n\n return (\n <div className=\"overflow-hidden rounded-md border border-border bg-muted/40\">\n <div className=\"border-b border-border px-3 py-1.5 text-[11px] uppercase tracking-wide text-muted-foreground\">\n {node.language || \"text\"}\n </div>\n {html ? (\n <div\n className=\"overflow-auto p-3 text-xs font-mono [&_.chroma]:bg-transparent [&_pre]:m-0 [&_pre]:whitespace-pre-wrap [&_pre]:bg-transparent\"\n dangerouslySetInnerHTML={{ __html: html }}\n />\n ) : (\n <pre className=\"overflow-auto whitespace-pre-wrap break-words p-3 text-xs font-mono text-foreground\">\n {node.source ?? node.plain}\n </pre>\n )}\n </div>\n );\n}\n\nfunction ClickyCollapsed({ node }: { node: ClickyNode }) {\n return (\n <details className=\"rounded-md border border-border bg-background\">\n <summary className=\"cursor-pointer px-3 py-2 text-sm font-medium text-foreground\">\n <ClickyNodeRenderer node={node.label} />\n </summary>\n {node.content && (\n <div className=\"border-t border-border px-3 py-3\">\n <ClickyNodeRenderer node={node.content} />\n </div>\n )}\n </details>\n );\n}\n\nfunction ClickyButtonNode({ node }: { node: ClickyNode }) {\n const title = [node.id, node.payload].filter(Boolean).join(\"\\n\") || undefined;\n const content = node.label ? <ClickyNodeRenderer node={node.label} /> : node.text;\n\n if (node.href) {\n return (\n <a\n href={node.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n title={title}\n className=\"inline-flex items-center rounded-md border border-border bg-background px-3 py-1.5 text-sm font-medium text-foreground hover:bg-accent\"\n >\n {content}\n </a>\n );\n }\n\n return (\n <button\n type=\"button\"\n title={title}\n className=\"inline-flex items-center rounded-md border border-border bg-muted px-3 py-1.5 text-sm font-medium text-foreground\"\n >\n {content}\n </button>\n );\n}\n\nfunction ClickyButtonGroup({ node }: { node: ClickyNode }) {\n const items = node.items ?? [];\n if (items.length === 0) return null;\n\n return (\n <div className=\"flex flex-wrap gap-2\">\n {items.map((item, index) => (\n <ClickyNodeRenderer key={index} node={item} />\n ))}\n </div>\n );\n}\n\nfunction ClickyHtmlNode({ node }: { node: ClickyNode }) {\n const sanitized = sanitizeHtml(node.html ?? \"\");\n if (!sanitized) return null;\n\n const Tag = isBlockHtml(sanitized) ? \"div\" : \"span\";\n return <Tag dangerouslySetInnerHTML={{ __html: sanitized }} />;\n}\n\nfunction toInlineStyle(style?: ClickyStyle, text?: string): CSSProperties | undefined {\n if (!style) return text?.includes(\"\\n\") ? { whiteSpace: \"pre-wrap\" } : undefined;\n\n const inlineStyle: CSSProperties = {};\n\n if (style.color) inlineStyle.color = style.color;\n if (style.backgroundColor) inlineStyle.backgroundColor = style.backgroundColor;\n if (style.bold) inlineStyle.fontWeight = 700;\n if (style.faint) inlineStyle.opacity = 0.7;\n if (style.italic) inlineStyle.fontStyle = \"italic\";\n\n const decorations: string[] = [];\n if (style.underline) decorations.push(\"underline\");\n if (style.strikethrough) decorations.push(\"line-through\");\n if (decorations.length > 0) inlineStyle.textDecoration = decorations.join(\" \");\n\n if (style.textTransform === \"uppercase\" || style.textTransform === \"lowercase\" || style.textTransform === \"capitalize\") {\n inlineStyle.textTransform = style.textTransform;\n }\n\n if (style.maxWidth && style.maxWidth > 0) {\n inlineStyle.maxWidth = `${style.maxWidth}ch`;\n }\n\n if (style.maxLines && style.maxLines > 0) {\n inlineStyle.display = \"-webkit-box\";\n inlineStyle.overflow = \"hidden\";\n inlineStyle.WebkitLineClamp = style.maxLines;\n inlineStyle.WebkitBoxOrient = \"vertical\";\n inlineStyle.whiteSpace = \"pre-wrap\";\n }\n\n if (style.truncateMode === \"suffix\" && style.maxWidth && (!style.maxLines || style.maxLines <= 1)) {\n inlineStyle.overflow = \"hidden\";\n inlineStyle.textOverflow = \"ellipsis\";\n inlineStyle.whiteSpace = \"nowrap\";\n inlineStyle.display = \"inline-block\";\n inlineStyle.verticalAlign = \"bottom\";\n }\n\n if (style.monospace) {\n inlineStyle.fontFamily =\n 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace';\n }\n\n if (!inlineStyle.whiteSpace && text?.includes(\"\\n\")) {\n inlineStyle.whiteSpace = \"pre-wrap\";\n }\n\n return Object.keys(inlineStyle).length > 0 ? inlineStyle : undefined;\n}\n\nfunction sanitizeHtml(raw: string): string {\n if (!raw) return \"\";\n\n if (typeof DOMParser === \"undefined\") {\n return raw\n .replace(/<script[\\s\\S]*?>[\\s\\S]*?<\\/script>/gi, \"\")\n .replace(/\\son\\w+=\"[^\"]*\"/gi, \"\")\n .replace(/\\son\\w+='[^']*'/gi, \"\");\n }\n\n const doc = new DOMParser().parseFromString(raw, \"text/html\");\n\n doc.querySelectorAll(\"script,iframe,object,embed,form\").forEach((element) => element.remove());\n\n doc.querySelectorAll(\"*\").forEach((element) => {\n Array.from(element.attributes).forEach((attribute) => {\n const name = attribute.name.toLowerCase();\n const value = attribute.value.trim().toLowerCase();\n\n if (name.startsWith(\"on\") || name === \"srcdoc\") {\n element.removeAttribute(attribute.name);\n }\n\n if ((name === \"href\" || name === \"src\") && value.startsWith(\"javascript:\")) {\n element.removeAttribute(attribute.name);\n }\n });\n });\n\n return doc.body.innerHTML;\n}\n\nfunction prettifyName(name: string): string {\n return name\n .replace(/([a-z])([A-Z])/g, \"$1 $2\")\n .replace(/_/g, \" \")\n .replace(/\\b\\w/g, (value) => value.toUpperCase());\n}\n\nfunction compareClickyValues(left: string, right: string): number {\n const leftNumber = Number(left);\n const rightNumber = Number(right);\n\n if (!Number.isNaN(leftNumber) && !Number.isNaN(rightNumber)) {\n return leftNumber - rightNumber;\n }\n\n return left.localeCompare(right, undefined, { numeric: true, sensitivity: \"base\" });\n}\n\nfunction isInlineNode(node: ClickyNode): boolean {\n return (\n node.kind === \"text\" ||\n node.kind === \"icon\" ||\n node.kind === \"html\" ||\n node.kind === \"button\" ||\n node.kind === \"button-group\"\n );\n}\n\nfunction alignmentClass(align?: ClickyColumn[\"align\"]): string | undefined {\n if (align === \"right\") return \"text-right\";\n if (align === \"center\") return \"text-center\";\n return undefined;\n}\n\nfunction isBlockHtml(html: string): boolean {\n return /<(div|p|pre|table|ul|ol|li|details|blockquote|h[1-6])/i.test(html);\n}\n","import type { ReactNode } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"./Icon\";\n\nexport type FilterMode = \"active\" | \"neutral\" | \"include\" | \"exclude\";\n\nexport type FilterPillProps = {\n mode?: FilterMode;\n label: ReactNode;\n count?: number;\n icon?: string;\n badge?: string;\n /**\n * Tri-state handler. When provided the pill renders as a toggle with a left\n * minus (exclude) and right plus (include) region. Clicking a side toggles\n * that state against \"neutral\"; clicking the label cycles neutral → include\n * → exclude → neutral.\n */\n onModeChange?: (next: FilterMode) => void;\n /** Legacy single-click handler, used when onModeChange is not provided. */\n onClick?: () => void;\n title?: string;\n className?: string;\n};\n\nfunction bodyClasses(mode: FilterMode): string {\n switch (mode) {\n case \"active\":\n return \"bg-primary/10 border-primary/40 text-primary font-medium\";\n case \"include\":\n return \"bg-green-500/10 border-green-500/50 text-green-700 dark:text-green-400 font-medium\";\n case \"exclude\":\n return \"bg-red-500/10 border-red-500/50 text-red-700 dark:text-red-400 font-medium\";\n case \"neutral\":\n default:\n return \"border-border text-muted-foreground hover:bg-accent\";\n }\n}\n\ntype SlotMode = \"exclude\" | \"neutral\" | \"include\";\n\nconst SLOT_TRANSLATE: Record<SlotMode, string> = {\n exclude: \"-translate-x-[21px]\",\n neutral: \"translate-x-0\",\n include: \"translate-x-[21px]\",\n};\n\nfunction TristateSwitch({\n mode,\n onChange,\n ariaLabel,\n}: {\n mode: FilterMode;\n onChange: (next: FilterMode) => void;\n ariaLabel?: string;\n}) {\n const slot: SlotMode =\n mode === \"exclude\" ? \"exclude\" : mode === \"include\" ? \"include\" : \"neutral\";\n const bg = slot === \"exclude\" ? \"bg-red-500\" : slot === \"include\" ? \"bg-green-500\" : \"bg-muted\";\n const fg = slot === \"neutral\" ? \"text-muted-foreground\" : \"text-white\";\n\n const onSlot = (target: SlotMode) => {\n if (target === \"neutral\") {\n onChange(\"neutral\");\n return;\n }\n onChange(slot === target ? \"neutral\" : target);\n };\n\n return (\n <span\n role=\"radiogroup\"\n aria-label={ariaLabel}\n className={cn(\n \"relative inline-flex items-center justify-center w-[66px] h-6 rounded-full overflow-hidden transition-colors duration-200 shrink-0\",\n bg,\n )}\n >\n {([\"exclude\", \"neutral\", \"include\"] as SlotMode[]).map((target) => (\n <button\n key={target}\n type=\"button\"\n role=\"radio\"\n aria-checked={slot === target}\n title={\n target === \"exclude\" ? \"Exclude\" : target === \"include\" ? \"Include\" : \"Do not filter\"\n }\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onSlot(target);\n }}\n className={cn(\n \"relative z-10 flex h-full flex-1 items-center justify-center transition-colors duration-100\",\n fg,\n )}\n >\n <Icon\n name={\n target === \"exclude\"\n ? \"codicon:close\"\n : target === \"include\"\n ? \"codicon:check\"\n : \"codicon:primitive-dot\"\n }\n className=\"text-sm\"\n />\n </button>\n ))}\n <span\n aria-hidden\n className={cn(\n \"pointer-events-none absolute w-5 h-5 rounded-full bg-white shadow-md transition-transform duration-150\",\n SLOT_TRANSLATE[slot],\n )}\n />\n </span>\n );\n}\n\nexport function FilterPill({\n mode = \"neutral\",\n label,\n count,\n icon,\n badge,\n onModeChange,\n onClick,\n title,\n className,\n}: FilterPillProps) {\n const triState = !!onModeChange;\n const content = (\n <>\n {count !== undefined && (\n <span\n className={cn(\n \"inline-flex items-center justify-center min-w-[16px] h-[16px] px-1 rounded-full text-[10px] font-bold text-white\",\n badge ?? \"bg-muted-foreground\",\n )}\n >\n {count}\n </span>\n )}\n {icon && <Icon name={icon} className=\"text-sm\" />}\n <span className=\"truncate\">{label}</span>\n </>\n );\n\n if (triState) {\n const labelTone =\n mode === \"include\"\n ? \"text-green-700 dark:text-green-400\"\n : mode === \"exclude\"\n ? \"text-red-700 dark:text-red-400\"\n : \"text-foreground\";\n return (\n <span className={cn(\"inline-flex items-center gap-2 select-none\", className)} title={title}>\n <TristateSwitch mode={mode} onChange={onModeChange!} ariaLabel={title} />\n <span className={cn(\"inline-flex items-center gap-1.5 text-xs\", labelTone)}>{content}</span>\n </span>\n );\n }\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n title={title}\n className={cn(\n \"inline-flex items-center gap-1.5 text-xs px-2 py-0.5 rounded-full border transition-colors\",\n bodyClasses(mode),\n className,\n )}\n >\n <LegacyMarker mode={mode} />\n {content}\n </button>\n );\n}\n\nfunction LegacyMarker({ mode }: { mode: FilterMode }) {\n if (mode === \"include\") return <Icon name=\"codicon:add\" className=\"text-xs\" />;\n if (mode === \"exclude\") return <Icon name=\"codicon:remove\" className=\"text-xs\" />;\n if (mode === \"active\") return <span className=\"w-2 h-2 rounded-full bg-current\" />;\n return <span className=\"w-2 h-2 rounded-full bg-current opacity-30\" />;\n}\n\nexport type FilterPillGroupProps = {\n children: ReactNode;\n className?: string;\n};\n\nexport function FilterPillGroup({ children, className }: FilterPillGroupProps) {\n return <div className={cn(\"flex items-center gap-1.5 flex-wrap\", className)}>{children}</div>;\n}\n\nexport function FilterSeparator() {\n return (\n <span aria-hidden className=\"text-border mx-0.5\">\n |\n </span>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { cn } from \"../lib/utils\";\n\nexport type GaugeTone = \"neutral\" | \"success\" | \"warning\" | \"danger\" | \"info\";\n\nexport type GaugeProps = {\n label: ReactNode;\n value: number;\n max?: number;\n tone?: GaugeTone;\n suffix?: string;\n className?: string;\n};\n\nconst toneClass: Record<GaugeTone, string> = {\n neutral: \"text-foreground\",\n success: \"text-green-600 dark:text-green-400\",\n warning: \"text-yellow-600 dark:text-yellow-400\",\n danger: \"text-red-600 dark:text-red-400\",\n info: \"text-blue-600 dark:text-blue-400\",\n};\n\nexport function Gauge({\n label,\n value,\n max = 100,\n tone = \"neutral\",\n suffix = \"%\",\n className,\n}: GaugeProps) {\n const pct = max > 0 ? Math.round((value / max) * 100) : 0;\n return (\n <div\n className={cn(\n \"flex flex-col items-start gap-0.5 rounded-md border border-border bg-background px-density-3 py-density-2\",\n className,\n )}\n >\n <span className=\"text-[10px] uppercase tracking-wide text-muted-foreground\">{label}</span>\n <span className={cn(\"text-lg font-semibold tabular-nums\", toneClass[tone])}>\n {max === 100 ? value : pct}\n <span className=\"text-xs ml-0.5 opacity-60\">{suffix}</span>\n </span>\n </div>\n );\n}\n","import { useState } from \"react\";\n\nexport type JsonViewProps = {\n data: unknown;\n name?: string;\n depth?: number;\n defaultOpenDepth?: number;\n};\n\nexport function JsonView({ data, name, depth = 0, defaultOpenDepth = 2 }: JsonViewProps) {\n const [open, setOpen] = useState(depth < defaultOpenDepth);\n\n if (data === null || data === undefined) {\n return <span className=\"text-muted-foreground italic\">null</span>;\n }\n\n if (typeof data === \"string\") {\n return <span className=\"text-green-700 dark:text-green-400\">\"{data}\"</span>;\n }\n\n if (typeof data === \"number\" || typeof data === \"boolean\") {\n return <span className=\"text-blue-700 dark:text-blue-400\">{String(data)}</span>;\n }\n\n if (typeof data !== \"object\") {\n return <span className=\"text-muted-foreground\">{String(data)}</span>;\n }\n\n const isArray = Array.isArray(data);\n const entries: Array<[string | number, unknown]> = isArray\n ? (data as unknown[]).map((v, i) => [i, v])\n : Object.entries(data as Record<string, unknown>);\n const [openB, closeB] = isArray ? [\"[\", \"]\"] : [\"{\", \"}\"];\n\n if (entries.length === 0) {\n return (\n <span className=\"text-muted-foreground\">\n {openB}\n {closeB}\n </span>\n );\n }\n\n return (\n <div className=\"text-sm font-mono\" style={{ paddingLeft: depth > 0 ? \"12px\" : \"0\" }}>\n <span\n className=\"cursor-pointer hover:bg-accent rounded px-0.5 select-none\"\n onClick={() => setOpen(!open)}\n >\n <span className=\"text-muted-foreground text-xs mr-1\">{open ? \"▼\" : \"▶\"}</span>\n {name && <span className=\"text-purple-600 dark:text-purple-400\">{name}</span>}\n {name && <span className=\"text-muted-foreground\">: </span>}\n {!open && (\n <span className=\"text-muted-foreground\">\n {openB} {entries.length} {isArray ? \"items\" : \"keys\"} {closeB}\n </span>\n )}\n {open && <span className=\"text-muted-foreground\">{openB}</span>}\n </span>\n {open && (\n <>\n {entries.map(([key, val]) => (\n <div key={key} className=\"pl-3 border-l border-border ml-1\">\n {typeof val === \"object\" && val !== null ? (\n <JsonView\n data={val}\n name={String(key)}\n depth={depth + 1}\n defaultOpenDepth={defaultOpenDepth}\n />\n ) : (\n <div>\n <span className=\"text-purple-600 dark:text-purple-400\">\n {isArray ? \"\" : String(key)}\n </span>\n {!isArray && <span className=\"text-muted-foreground\">: </span>}\n <JsonView data={val} depth={depth + 1} defaultOpenDepth={defaultOpenDepth} />\n </div>\n )}\n </div>\n ))}\n <span className=\"text-muted-foreground\">{closeB}</span>\n </>\n )}\n </div>\n );\n}\n","import { useMemo, useState } from \"react\";\nimport { cn } from \"../lib/utils\";\n\nexport type LogViewerProps = {\n logs: string;\n collapsedLines?: number;\n maxExpandedVh?: number;\n bgClass?: string;\n borderClass?: string;\n className?: string;\n};\n\nexport function LogViewer({\n logs,\n collapsedLines = 5,\n maxExpandedVh = 70,\n bgClass = \"bg-muted\",\n borderClass = \"border-border\",\n className,\n}: LogViewerProps) {\n const [expanded, setExpanded] = useState(false);\n const lines = useMemo(() => logs.split(\"\\n\"), [logs]);\n const hasMore = lines.length > collapsedLines;\n\n const maxHeight = expanded ? `${maxExpandedVh}vh` : `${collapsedLines * 1.4}em`;\n\n return (\n <div className={cn(\"relative\", className)}>\n <pre\n className={cn(\n \"mt-0.5 text-[11px] text-muted-foreground rounded p-1.5 whitespace-pre-wrap overflow-y-auto border transition-all duration-200\",\n bgClass,\n borderClass,\n )}\n style={{ maxHeight }}\n >\n {expanded ? logs : lines.slice(0, collapsedLines).join(\"\\n\")}\n </pre>\n {hasMore && (\n <button\n type=\"button\"\n className={cn(\n \"text-[10px] mt-0.5\",\n expanded ? \"text-muted-foreground\" : \"text-primary hover:opacity-80\",\n )}\n onClick={() => setExpanded((e) => !e)}\n >\n {expanded ? `▲ Collapse (${lines.length} lines)` : `▼ Show more (${lines.length} lines)`}\n </button>\n )}\n </div>\n );\n}\n","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","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","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","import type { ReactNode } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"./Icon\";\n\nexport type TreeGroupHeaderProps = {\n title: ReactNode;\n open: boolean;\n onToggle: () => void;\n icon?: string;\n count?: number;\n className?: string;\n};\n\nexport function TreeGroupHeader({\n title,\n open,\n onToggle,\n icon,\n count,\n className,\n}: TreeGroupHeaderProps) {\n return (\n <button\n type=\"button\"\n onClick={onToggle}\n aria-expanded={open}\n className={cn(\n \"w-full flex items-center gap-2 px-3 py-2 border-b border-border select-none\",\n \"hover:bg-accent transition-colors text-left\",\n className,\n )}\n >\n <Icon\n name={open ? \"codicon:chevron-down\" : \"codicon:chevron-right\"}\n className=\"text-muted-foreground text-xs\"\n />\n {icon && <Icon name={icon} className=\"text-base\" />}\n <span className=\"font-medium text-sm flex-1 truncate\">{title}</span>\n {count !== undefined && <span className=\"text-xs text-muted-foreground\">{count}</span>}\n </button>\n );\n}\n","import type { ProcessNode } from \"./types\";\n\nexport function countProcesses(node?: ProcessNode): number {\n if (!node) return 0;\n return 1 + (node.children || []).reduce((sum, child) => sum + countProcesses(child), 0);\n}\n\nexport function findProcessByPID(node: ProcessNode | undefined, pid: number): ProcessNode | null {\n if (!node) return null;\n if (node.pid === pid) return node;\n for (const child of node.children || []) {\n const found = findProcessByPID(child, pid);\n if (found) return found;\n }\n return null;\n}\n\nexport function processStateIcon(status?: string): string {\n const value = (status || \"\").toLowerCase();\n if (value.includes(\"run\")) return \"codicon:play-circle\";\n if (value.includes(\"sleep\") || value.includes(\"idle\")) return \"codicon:clock\";\n if (value.includes(\"stop\") || value.includes(\"halt\")) return \"codicon:debug-pause\";\n if (value.includes(\"zombie\") || value.includes(\"dead\")) return \"codicon:error\";\n if (value.includes(\"wait\") || value.includes(\"block\")) return \"codicon:debug-step-over\";\n return \"codicon:circle-filled\";\n}\n\nexport function processStateColor(status?: string): string {\n const value = (status || \"\").toLowerCase();\n if (value.includes(\"run\")) return \"text-green-600\";\n if (value.includes(\"sleep\") || value.includes(\"idle\")) return \"text-amber-500\";\n if (value.includes(\"stop\") || value.includes(\"halt\")) return \"text-orange-600\";\n if (value.includes(\"zombie\") || value.includes(\"dead\")) return \"text-red-600\";\n if (value.includes(\"wait\") || value.includes(\"block\")) return \"text-blue-600\";\n return \"text-muted-foreground\";\n}\n\nexport function formatBytes(value?: number): string {\n if (!value || value <= 0) return \"0 B\";\n const units = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\"];\n let size = value;\n let unit = 0;\n while (size >= 1024 && unit < units.length - 1) {\n size /= 1024;\n unit++;\n }\n return `${size >= 10 || unit === 0 ? size.toFixed(0) : size.toFixed(1)} ${units[unit]}`;\n}\n\nexport function processLabel(node: ProcessNode): string {\n if (node.name) return node.name;\n if (node.command) {\n const [first] = node.command.split(/\\s+/, 1);\n return first || `pid ${node.pid}`;\n }\n return `pid ${node.pid}`;\n}\n","import { Tree } from \"../Tree\";\nimport { Icon } from \"../Icon\";\nimport type { ProcessNode } from \"./types\";\nimport {\n countProcesses,\n formatBytes,\n processLabel,\n processStateColor,\n processStateIcon,\n} from \"./utils\";\n\nexport type DiagnosticsTreeProps = {\n root?: ProcessNode;\n selectedPid?: number | null;\n expandAll?: boolean | null;\n onSelect: (pid: number) => void;\n};\n\nexport function DiagnosticsTree({\n root,\n selectedPid,\n expandAll = null,\n onSelect,\n}: DiagnosticsTreeProps) {\n if (!root) {\n return (\n <div className=\"p-density-6 text-center text-muted-foreground\">\n <Icon name=\"svg-spinners:ring-resize\" className=\"text-3xl text-blue-500\" />\n <p className=\"mt-density-2\">Waiting for process diagnostics...</p>\n </div>\n );\n }\n\n if (countProcesses(root) === 0) {\n return (\n <div className=\"p-density-6 text-center text-muted-foreground text-sm\">\n No processes available\n </div>\n );\n }\n\n return (\n <Tree<ProcessNode>\n roots={[root]}\n getChildren={(n) => n.children}\n getKey={(n) => n.pid}\n expandAll={expandAll}\n defaultOpen={(n, depth) => !!n.is_root || depth < 1}\n onSelect={(n) => onSelect(n.pid)}\n renderRow={({ node }) => {\n const selected = node.pid === selectedPid;\n const cpu = node.cpu_percent || 0;\n return (\n <>\n <Icon\n name={node.is_root ? \"codicon:server-process\" : \"codicon:debug-alt\"}\n className={\n node.is_root ? \"text-base text-blue-600\" : \"text-base text-muted-foreground\"\n }\n />\n <span\n className={`truncate ${\n selected ? \"font-semibold text-primary\" : \"font-medium text-foreground\"\n }`}\n >\n {processLabel(node)}\n </span>\n <span className=\"text-xs text-muted-foreground shrink-0\">pid {node.pid}</span>\n <span className=\"flex-1\" />\n {node.status && (\n <span\n className={`inline-flex items-center gap-1 text-xs shrink-0 ${processStateColor(\n node.status,\n )}`}\n >\n <Icon name={processStateIcon(node.status)} />\n {node.status}\n </span>\n )}\n <span className=\"text-xs text-muted-foreground shrink-0 tabular-nums\">\n {cpu.toFixed(1)}%\n </span>\n <span className=\"text-xs text-muted-foreground shrink-0 tabular-nums\">\n {formatBytes(node.rss)}\n </span>\n </>\n );\n }}\n rowClass={(node) =>\n node.pid === selectedPid ? \"bg-primary/10 border-l-2 border-primary\" : \"hover:bg-accent\"\n }\n />\n );\n}\n","export interface ParsedThreadFrame {\n functionName: string;\n displayName: string;\n file?: string;\n line?: number;\n location?: string;\n kind: \"frame\" | \"locked\" | \"waiting_on\" | \"waiting_to_lock\" | \"parking\";\n runtime: boolean;\n nativeMethod: boolean;\n annotationText?: string;\n}\n\nexport interface ParsedThread {\n id: number;\n nid?: string;\n name: string;\n state: string;\n rawState: string;\n priority?: number;\n daemon?: boolean;\n frames: ParsedThreadFrame[];\n raw: string;\n userFrameCount: number;\n topFunction?: string;\n searchText: string;\n}\n\nconst headerRe = /^\"(?<name>[^\"]*)\"(?<rest>.*)$/;\nconst stateRe = /^\\s*java\\.lang\\.Thread\\.State:\\s+(?<state>[A-Z_]+)(?:\\s+\\((?<sub>[^)]+)\\))?/;\nconst frameRe = /^\\s*at\\s+(?<fn>[^\\s(]+)\\((?<src>[^)]+)\\)\\s*$/;\nconst srcLineRe = /^(?<file>[^:]+):(?<line>\\d+)$/;\nconst annotationRe =\n /^\\s*-\\s+(?<kind>locked|waiting on|waiting to lock|parking to wait for)\\b(?<rest>.*)$/;\n\nexport function parseJvmThreadDump(text: string): ParsedThread[] {\n const trimmed = text.trim();\n if (!trimmed) return [];\n\n // Split on blank lines OR on a new `\"...\"` header that follows immediately.\n const blocks = splitIntoThreadBlocks(trimmed);\n const threads: ParsedThread[] = [];\n\n for (const block of blocks) {\n const parsed = parseThreadBlock(block);\n if (parsed) threads.push(parsed);\n }\n return threads;\n}\n\nfunction splitIntoThreadBlocks(text: string): string[] {\n const out: string[] = [];\n let current: string[] = [];\n const lines = text.split(\"\\n\");\n for (const raw of lines) {\n const line = raw.replace(/\\r$/, \"\");\n if (line.startsWith('\"') && current.length > 0) {\n out.push(current.join(\"\\n\"));\n current = [line];\n } else {\n current.push(line);\n }\n }\n if (current.length > 0) out.push(current.join(\"\\n\"));\n return out;\n}\n\nfunction parseThreadBlock(block: string): ParsedThread | null {\n const lines = block.split(\"\\n\");\n const header = lines[0]?.trim() ?? \"\";\n const headerMatch = headerRe.exec(header);\n if (!headerMatch?.groups) return null;\n\n const name = headerMatch.groups.name;\n const rest = headerMatch.groups.rest ?? \"\";\n const idMatch = /#(\\d+)\\b/.exec(rest);\n const prioMatch = /\\bprio=(\\d+)/.exec(rest);\n const nidMatch = /\\bnid=(0x[0-9a-f]+)/i.exec(rest);\n const daemon = /\\bdaemon\\b/.test(rest);\n const headerStateTrail = extractHeaderStateTrail(rest);\n\n let rawState = headerStateTrail ?? \"\";\n let state = normalizeJvmState(rawState);\n const frames: ParsedThreadFrame[] = [];\n\n for (let i = 1; i < lines.length; i++) {\n const line = lines[i];\n if (!line.trim()) continue;\n\n const stateMatch = stateRe.exec(line);\n if (stateMatch?.groups) {\n const primary = stateMatch.groups.state;\n const sub = stateMatch.groups.sub;\n rawState = sub ? `${primary} (${sub})` : primary;\n state = normalizeJvmState(primary);\n continue;\n }\n\n const frameMatch = frameRe.exec(line);\n if (frameMatch?.groups) {\n const functionName = frameMatch.groups.fn;\n const src = frameMatch.groups.src;\n const frame: ParsedThreadFrame = {\n functionName,\n displayName: sanitizeJvmFunctionName(functionName),\n kind: \"frame\",\n runtime: isJvmRuntimeFrame(functionName),\n nativeMethod: src === \"Native Method\",\n };\n const srcMatch = srcLineRe.exec(src);\n if (srcMatch?.groups) {\n frame.file = srcMatch.groups.file;\n frame.line = Number(srcMatch.groups.line);\n frame.location = `${frame.file}:${frame.line}`;\n } else if (src === \"Native Method\") {\n frame.location = \"Native Method\";\n } else {\n frame.location = src;\n }\n frames.push(frame);\n continue;\n }\n\n const annoMatch = annotationRe.exec(line);\n if (annoMatch?.groups) {\n const kind = mapAnnotationKind(annoMatch.groups.kind);\n frames.push({\n functionName: annoMatch.groups.kind,\n displayName: annoMatch.groups.kind,\n kind,\n runtime: false,\n nativeMethod: false,\n annotationText: (annoMatch.groups.rest ?? \"\").trim(),\n });\n continue;\n }\n }\n\n const userFrameCount = frames.filter((f) => f.kind === \"frame\" && !f.runtime).length;\n const topFunction = frames.find((f) => f.kind === \"frame\")?.functionName;\n const searchText = [\n header,\n ...frames.map((f) => `${f.functionName} ${f.location ?? \"\"} ${f.annotationText ?? \"\"}`),\n ]\n .join(\"\\n\")\n .toLowerCase();\n\n return {\n id: idMatch ? Number(idMatch[1]) : deriveSyntheticId(name, rest),\n nid: nidMatch ? nidMatch[1] : undefined,\n name,\n state: state || \"unknown\",\n rawState: rawState || \"\",\n priority: prioMatch ? Number(prioMatch[1]) : undefined,\n daemon,\n frames,\n raw: block,\n userFrameCount,\n topFunction,\n searchText,\n };\n}\n\nfunction extractHeaderStateTrail(rest: string): string | undefined {\n // Example header tails: \"... nid=0x1903 waiting on condition [0x...]\"\n // Capture the descriptor between nid=... and the trailing [address].\n const tail = rest.match(/nid=0x[0-9a-f]+\\s+(?<desc>[^\\[]+?)(?:\\s+\\[0x[0-9a-f]+\\])?\\s*$/i);\n return tail?.groups?.desc?.trim();\n}\n\nfunction deriveSyntheticId(name: string, rest: string): number {\n const tid = /\\btid=(0x[0-9a-f]+)/i.exec(rest);\n if (tid) {\n // stable non-negative int derived from tid hex suffix\n const hex = tid[1].slice(2);\n const n = Number.parseInt(hex.slice(-8), 16);\n if (Number.isFinite(n)) return n;\n }\n // Fallback: hash of name\n let h = 0;\n for (let i = 0; i < name.length; i++) h = (h * 31 + name.charCodeAt(i)) | 0;\n return Math.abs(h);\n}\n\nfunction mapAnnotationKind(kind: string): ParsedThreadFrame[\"kind\"] {\n switch (kind) {\n case \"locked\":\n return \"locked\";\n case \"waiting on\":\n return \"waiting_on\";\n case \"waiting to lock\":\n return \"waiting_to_lock\";\n case \"parking to wait for\":\n return \"parking\";\n default:\n return \"frame\";\n }\n}\n\nexport function countThreadsByState(threads: ParsedThread[]): Map<string, number> {\n const counts = new Map<string, number>();\n for (const t of threads) counts.set(t.state, (counts.get(t.state) ?? 0) + 1);\n return counts;\n}\n\nfunction normalizeJvmState(value: string): string {\n if (!value) return \"\";\n const upper = value.trim().toUpperCase();\n if (upper.startsWith(\"RUNNABLE\")) return \"runnable\";\n if (upper.startsWith(\"TIMED_WAITING\")) return \"timed_waiting\";\n if (upper.startsWith(\"WAITING\")) return \"waiting\";\n if (upper.startsWith(\"BLOCKED\")) return \"blocked\";\n if (upper.startsWith(\"NEW\")) return \"new\";\n if (upper.startsWith(\"TERMINATED\")) return \"terminated\";\n // Header fragments like \"waiting on condition\", \"runnable\", \"sleeping\"\n const lower = value.trim().toLowerCase();\n if (lower.includes(\"runnable\")) return \"runnable\";\n if (lower.includes(\"waiting on condition\") || lower.includes(\"sleeping\")) return \"timed_waiting\";\n if (lower.includes(\"waiting\")) return \"waiting\";\n if (lower.includes(\"blocked\")) return \"blocked\";\n return lower.split(/\\s+/)[0];\n}\n\nconst runtimePrefixes = [\"java.\", \"javax.\", \"sun.\", \"jdk.\", \"com.sun.\", \"oracle.jrockit.\"];\nfunction isJvmRuntimeFrame(functionName: string): boolean {\n return runtimePrefixes.some((p) => functionName.startsWith(p));\n}\n\nfunction sanitizeJvmFunctionName(functionName: string): string {\n // e.g. \"com.example.App$Inner.method\" → \"App$Inner.method\"\n const parts = functionName.split(\".\");\n if (parts.length < 2) return functionName;\n const method = parts[parts.length - 1];\n const cls = parts[parts.length - 2];\n return `${cls}.${method}`;\n}\n","import { parseJvmThreadDump, countThreadsByState, type ParsedThread } from \"./jvm-stacktrace\";\n\nexport type DumpFormat = \"go\" | \"jvm\" | \"unknown\";\n\nexport type ParsedStack =\n | { format: \"go\"; goroutines: ParsedGoroutine[] }\n | { format: \"jvm\"; threads: ParsedThread[] }\n | { format: \"unknown\"; goroutines: []; threads: [] };\n\nexport function detectDumpFormat(text: string): DumpFormat {\n const trimmed = text.trim();\n if (!trimmed) return \"unknown\";\n // JVM header: `\"name\" ... prio=` OR `\"name\" ... tid=`\n if (/^\"[^\"]*\"[^\\n]*\\b(prio=|tid=|nid=)/m.test(trimmed)) return \"jvm\";\n // Go header: `goroutine N [state]:`\n if (/^goroutine\\s+\\d+\\s+\\[[^\\]]+\\]:/m.test(trimmed)) return \"go\";\n return \"unknown\";\n}\n\nexport function parseStackDump(text: string): ParsedStack {\n const format = detectDumpFormat(text);\n if (format === \"jvm\") {\n return { format: \"jvm\", threads: parseJvmThreadDump(text) };\n }\n if (format === \"go\") {\n return { format: \"go\", goroutines: parseGoroutineDump(text) };\n }\n return { format: \"unknown\", goroutines: [], threads: [] };\n}\n\nexport function countStackByState(stack: ParsedStack): Map<string, number> {\n if (stack.format === \"jvm\") return countThreadsByState(stack.threads);\n if (stack.format === \"go\") return countGoroutinesByState(stack.goroutines);\n return new Map();\n}\n\nexport interface ParsedGoroutineFrame {\n functionName: string;\n displayName: string;\n file?: string;\n location?: string;\n line?: number;\n kind: \"frame\" | \"created_by\";\n runtime: boolean;\n}\n\nexport interface ParsedGoroutine {\n id: number;\n state: string;\n rawState: string;\n frames: ParsedGoroutineFrame[];\n raw: string;\n userFrameCount: number;\n topFunction?: string;\n searchText: string;\n}\n\nconst headerRe = /^goroutine\\s+(\\d+)\\s+\\[(.+?)\\]:$/;\nconst fileRe = /^\\s*(.+?):(\\d+)(?:\\s+\\+0x[0-9a-f]+)?$/i;\nconst goSrcPrefixRe = /^\\/usr\\/local\\/go[\\d.]+\\/src\\//;\nconst goWorkspacePrefixRe = /^.*?\\/go\\/src\\//;\nconst goPkgModPrefixRe = /^.*?\\/go\\/pkg\\/mod\\//;\n\nexport function parseGoroutineDump(text: string): ParsedGoroutine[] {\n const trimmed = text.trim();\n if (!trimmed) return [];\n\n const blocks = trimmed.split(/\\n\\s*\\n+/);\n const goroutines: ParsedGoroutine[] = [];\n\n for (const block of blocks) {\n const lines = block.split(\"\\n\").map((line) => line.replace(/\\r$/, \"\"));\n const header = lines[0]?.trim();\n const match = headerRe.exec(header || \"\");\n if (!match) continue;\n\n const id = Number(match[1]);\n const rawState = match[2];\n const state = normalizeState(rawState);\n const frames: ParsedGoroutineFrame[] = [];\n\n for (let i = 1; i < lines.length; i++) {\n const line = lines[i];\n const trimmedLine = line.trim();\n if (!trimmedLine) continue;\n\n const fileMatch = fileRe.exec(trimmedLine);\n if (fileMatch && frames.length > 0 && !frames[frames.length - 1].file) {\n frames[frames.length - 1].file = fileMatch[1];\n frames[frames.length - 1].line = Number(fileMatch[2]);\n continue;\n }\n\n const kind = trimmedLine.startsWith(\"created by \") ? \"created_by\" : \"frame\";\n const functionName =\n kind === \"created_by\" ? trimmedLine.slice(\"created by \".length) : trimmedLine;\n frames.push({\n functionName,\n displayName: sanitizeFunctionName(functionName),\n kind,\n runtime: isRuntimeFrame(functionName),\n });\n }\n\n for (const frame of frames) {\n if (frame.file) {\n frame.file = normalizeFilePath(frame.file);\n frame.location = `${frame.file}${frame.line ? `:${frame.line}` : \"\"}`;\n }\n }\n\n goroutines.push({\n id,\n state,\n rawState,\n frames,\n raw: block,\n userFrameCount: frames.filter((frame) => !frame.runtime && frame.kind === \"frame\").length,\n topFunction: frames.find((frame) => frame.kind === \"frame\")?.functionName,\n searchText: `${header}\\n${frames\n .map((frame) => `${frame.functionName} ${frame.file || \"\"}`)\n .join(\"\\n\")}`.toLowerCase(),\n });\n }\n\n return goroutines;\n}\n\nexport function countGoroutinesByState(goroutines: ParsedGoroutine[]): Map<string, number> {\n const counts = new Map<string, number>();\n for (const goroutine of goroutines) {\n counts.set(goroutine.state, (counts.get(goroutine.state) || 0) + 1);\n }\n return counts;\n}\n\nfunction normalizeState(value: string): string {\n return value.split(\",\")[0].trim().toLowerCase();\n}\n\nfunction isRuntimeFrame(functionName: string): boolean {\n return (\n functionName.startsWith(\"runtime.\") ||\n functionName.startsWith(\"runtime/\") ||\n functionName.startsWith(\"internal/\") ||\n functionName.startsWith(\"runtime/internal/\") ||\n functionName.startsWith(\"syscall.\") ||\n functionName.startsWith(\"reflect.\")\n );\n}\n\nfunction sanitizeFunctionName(functionName: string): string {\n let name = functionName.trim();\n const paren = name.indexOf(\"(\");\n if (paren !== -1) name = name.slice(0, paren);\n name = name.replace(/\\.\\(\\*([^)]+)\\)\\./g, \".$1.\");\n return stripPackageQualifier(name);\n}\n\nfunction stripPackageQualifier(name: string): string {\n return name.replace(/^((?:[^./\\s]+\\/)+)([^./\\s]+)\\./, \"$2.\");\n}\n\nfunction normalizeFilePath(path: string): string {\n return path\n .replace(goSrcPrefixRe, \"\")\n .replace(goWorkspacePrefixRe, \"\")\n .replace(goPkgModPrefixRe, \"\");\n}\n","import { Icon } from \"../Icon\";\nimport type { ParsedGoroutine, ParsedGoroutineFrame } from \"./stacktrace\";\n\nexport function goroutineStateBadge(state: string): string {\n if (state.includes(\"running\"))\n return \"bg-green-50 text-green-700 dark:bg-green-500/20 dark:text-green-300\";\n if (state.includes(\"chan\") || state.includes(\"wait\"))\n return \"bg-blue-50 text-blue-700 dark:bg-blue-500/20 dark:text-blue-300\";\n if (state.includes(\"sleep\"))\n return \"bg-amber-50 text-amber-700 dark:bg-amber-500/20 dark:text-amber-300\";\n if (state.includes(\"select\"))\n return \"bg-violet-50 text-violet-700 dark:bg-violet-500/20 dark:text-violet-300\";\n return \"bg-muted text-muted-foreground\";\n}\n\nexport function goroutineStateDot(state: string): string {\n if (state.includes(\"running\")) return \"bg-green-500\";\n if (state.includes(\"chan\") || state.includes(\"wait\")) return \"bg-blue-500\";\n if (state.includes(\"sleep\")) return \"bg-amber-500\";\n if (state.includes(\"select\")) return \"bg-violet-500\";\n return \"bg-muted-foreground/40\";\n}\n\nexport type GoroutineCardProps = {\n goroutine: ParsedGoroutine;\n search: string;\n hideRuntimeOnly: boolean;\n};\n\nexport function GoroutineCard({ goroutine, search, hideRuntimeOnly }: GoroutineCardProps) {\n const frames = hideRuntimeOnly\n ? goroutine.frames.filter((frame) => !frame.runtime || frame.kind === \"created_by\")\n : goroutine.frames;\n const defaultOpen = goroutine.state === \"running\" || !!search;\n\n return (\n <details className=\"border-0 bg-transparent\" open={defaultOpen}>\n <summary className=\"cursor-pointer list-none px-0 py-1\">\n <div className=\"flex items-center gap-2 flex-wrap\">\n <span className=\"font-mono text-xs font-semibold text-foreground\">g{goroutine.id}</span>\n <span\n className={`inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-[11px] ${goroutineStateBadge(\n goroutine.state,\n )}`}\n >\n <span className={`h-2 w-2 rounded-full ${goroutineStateDot(goroutine.state)}`} />\n {goroutine.rawState}\n </span>\n <span className=\"text-[11px] text-muted-foreground\">{frames.length}f</span>\n {goroutine.userFrameCount > 0 && (\n <span className=\"text-[11px] text-muted-foreground\">{goroutine.userFrameCount}u</span>\n )}\n {goroutine.topFunction && (\n <span className=\"truncate text-[11px] text-muted-foreground\">\n {goroutine.topFunction}\n </span>\n )}\n </div>\n </summary>\n <div className=\"pl-3 py-1 space-y-0.5\">\n {frames.map((frame, index) => (\n <FrameRow key={`${goroutine.id}-${index}`} frame={frame} />\n ))}\n </div>\n </details>\n );\n}\n\nfunction FrameRow({ frame }: { frame: ParsedGoroutineFrame }) {\n return (\n <div className={frame.runtime ? \"text-muted-foreground\" : \"text-foreground\"}>\n <div className=\"flex items-start gap-1.5\">\n <Icon\n name={\n frame.kind === \"created_by\"\n ? \"codicon:debug-restart\"\n : frame.runtime\n ? \"codicon:debug-step-over\"\n : \"codicon:symbol-method\"\n }\n className=\"shrink-0 mt-0.5 text-[11px]\"\n />\n <div className=\"min-w-0\">\n <div className=\"break-all font-mono text-[11px] font-semibold leading-4\">\n {frame.displayName}\n {frame.location && (\n <span className=\"ml-2 text-[10px] font-normal opacity-80\">{frame.location}</span>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import { Icon } from \"../Icon\";\nimport type { ParsedThread, ParsedThreadFrame } from \"./jvm-stacktrace\";\n\nexport function threadStateBadge(state: string): string {\n switch (state) {\n case \"runnable\":\n return \"bg-green-50 text-green-700 dark:bg-green-500/20 dark:text-green-300\";\n case \"blocked\":\n return \"bg-red-50 text-red-700 dark:bg-red-500/20 dark:text-red-300\";\n case \"waiting\":\n case \"timed_waiting\":\n return \"bg-blue-50 text-blue-700 dark:bg-blue-500/20 dark:text-blue-300\";\n case \"new\":\n return \"bg-amber-50 text-amber-700 dark:bg-amber-500/20 dark:text-amber-300\";\n case \"terminated\":\n return \"bg-muted text-muted-foreground\";\n default:\n return \"bg-muted text-muted-foreground\";\n }\n}\n\nexport function threadStateDot(state: string): string {\n switch (state) {\n case \"runnable\":\n return \"bg-green-500\";\n case \"blocked\":\n return \"bg-red-500\";\n case \"waiting\":\n case \"timed_waiting\":\n return \"bg-blue-500\";\n case \"new\":\n return \"bg-amber-500\";\n case \"terminated\":\n return \"bg-muted-foreground/40\";\n default:\n return \"bg-muted-foreground/40\";\n }\n}\n\nexport type ThreadCardProps = {\n thread: ParsedThread;\n search: string;\n hideRuntimeOnly: boolean;\n};\n\nexport function ThreadCard({ thread, search, hideRuntimeOnly }: ThreadCardProps) {\n const frames = hideRuntimeOnly\n ? thread.frames.filter((f) => f.kind !== \"frame\" || !f.runtime)\n : thread.frames;\n const defaultOpen = thread.state === \"runnable\" || thread.state === \"blocked\" || !!search;\n\n return (\n <details className=\"border-0 bg-transparent\" open={defaultOpen}>\n <summary className=\"cursor-pointer list-none px-0 py-1\">\n <div className=\"flex items-center gap-2 flex-wrap\">\n <span className=\"font-mono text-xs font-semibold text-foreground\">#{thread.id}</span>\n <span className=\"truncate font-mono text-xs text-foreground\">{thread.name}</span>\n <span\n className={`inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-[11px] ${threadStateBadge(\n thread.state,\n )}`}\n >\n <span className={`h-2 w-2 rounded-full ${threadStateDot(thread.state)}`} />\n {thread.rawState || thread.state}\n </span>\n {thread.daemon && (\n <span className=\"rounded-full bg-muted px-1.5 py-0.5 text-[10px] text-muted-foreground\">\n daemon\n </span>\n )}\n <span className=\"text-[11px] text-muted-foreground\">{frames.length}f</span>\n {thread.userFrameCount > 0 && (\n <span className=\"text-[11px] text-muted-foreground\">{thread.userFrameCount}u</span>\n )}\n {thread.topFunction && (\n <span className=\"truncate text-[11px] text-muted-foreground\">{thread.topFunction}</span>\n )}\n </div>\n </summary>\n <div className=\"pl-3 py-1 space-y-0.5\">\n {frames.map((frame, index) => (\n <ThreadFrameRow key={`${thread.id}-${index}`} frame={frame} />\n ))}\n </div>\n </details>\n );\n}\n\nfunction ThreadFrameRow({ frame }: { frame: ParsedThreadFrame }) {\n const isAnno = frame.kind !== \"frame\";\n const iconName = isAnno\n ? frame.kind === \"locked\"\n ? \"codicon:lock\"\n : frame.kind === \"waiting_to_lock\"\n ? \"codicon:sync\"\n : \"codicon:watch\"\n : frame.nativeMethod\n ? \"codicon:chip\"\n : frame.runtime\n ? \"codicon:debug-step-over\"\n : \"codicon:symbol-method\";\n\n return (\n <div className={frame.runtime ? \"text-muted-foreground\" : \"text-foreground\"}>\n <div className=\"flex items-start gap-1.5\">\n <Icon name={iconName} className=\"shrink-0 mt-0.5 text-[11px]\" />\n <div className=\"min-w-0\">\n <div className=\"break-all font-mono text-[11px] font-semibold leading-4\">\n {isAnno ? (\n <>\n <span className=\"opacity-70\">{frame.functionName}</span>\n {frame.annotationText && (\n <span className=\"ml-2 font-normal opacity-80\">{frame.annotationText}</span>\n )}\n </>\n ) : (\n <>\n {frame.displayName}\n {frame.location && (\n <span className=\"ml-2 text-[10px] font-normal opacity-80\">{frame.location}</span>\n )}\n </>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import { useEffect, useMemo, useState, type ReactNode } from \"react\";\nimport { Icon } from \"../Icon\";\nimport type { GaugeTone } from \"../Gauge\";\nimport type { ProcessNode, RunMeta } from \"./types\";\nimport { formatBytes, processLabel, processStateColor, processStateIcon } from \"./utils\";\nimport { countStackByState, parseStackDump, type ParsedStack } from \"./stacktrace\";\nimport { GoroutineCard, goroutineStateDot } from \"./GoroutineCard\";\nimport { ThreadCard, threadStateDot } from \"./ThreadCard\";\n\nconst STACK_MIN_LINES = 10;\nconst STACK_LINE_HEIGHT_REM = 1;\nconst STACK_MIN_HEIGHT = `${STACK_MIN_LINES * STACK_LINE_HEIGHT_REM}rem`;\n\nfunction cpuTone(pct: number): GaugeTone {\n if (pct >= 90) return \"danger\";\n if (pct >= 60) return \"warning\";\n if (pct > 0) return \"success\";\n return \"neutral\";\n}\n\nfunction memoryTone(rss: number | undefined, vms: number | undefined): GaugeTone {\n if (!rss || !vms) return \"neutral\";\n const ratio = rss / vms;\n if (ratio >= 0.9) return \"danger\";\n if (ratio >= 0.6) return \"warning\";\n return \"info\";\n}\n\nexport type DiagnosticsDetailPanelProps = {\n process: ProcessNode | null;\n collectBusy?: boolean;\n onCollectStack?: (pid: number) => void | Promise<void>;\n runMeta?: RunMeta;\n};\n\nexport function DiagnosticsDetailPanel({\n process,\n collectBusy,\n onCollectStack,\n runMeta,\n}: DiagnosticsDetailPanelProps) {\n const [search, setSearch] = useState(\"\");\n const [selectedStates, setSelectedStates] = useState<Set<string>>(new Set());\n const [hideRuntimeOnly, setHideRuntimeOnly] = useState(true);\n const stack = process?.stack_capture;\n const parsed = useMemo<ParsedStack>(() => parseStackDump(stack?.text || \"\"), [stack?.text]);\n const stateCounts = useMemo(() => countStackByState(parsed), [parsed]);\n const filtered = useMemo(() => {\n const needle = search.trim().toLowerCase();\n const items: Array<{\n state: string;\n userFrameCount: number;\n searchText: string;\n }> =\n parsed.format === \"jvm\"\n ? parsed.threads\n : parsed.format === \"go\"\n ? parsed.goroutines\n : [];\n return items.filter((item) => {\n if (selectedStates.size > 0 && !selectedStates.has(item.state)) return false;\n if (hideRuntimeOnly && item.userFrameCount === 0) return false;\n if (needle && !item.searchText.includes(needle)) return false;\n return true;\n });\n }, [parsed, search, selectedStates, hideRuntimeOnly]);\n\n useEffect(() => {\n setSearch(\"\");\n setSelectedStates(new Set());\n setHideRuntimeOnly(true);\n }, [stack?.text, process?.pid]);\n\n if (!process) {\n return (\n <div className=\"flex items-center justify-center h-full text-muted-foreground text-sm\">\n <div className=\"text-center\">\n <Icon name=\"codicon:server-process\" className=\"text-4xl mb-density-2\" />\n <div>Select a process to view diagnostics</div>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"h-full min-h-0 flex flex-col gap-density-3 p-density-4\">\n <Header process={process} />\n {runMeta && <RunSection runMeta={runMeta} />}\n {process.command && (\n <PanelSection title=\"Command\">\n <pre className=\"text-xs text-foreground whitespace-pre-wrap font-mono bg-blue-50 dark:bg-blue-500/10 rounded p-2 break-all\">\n {process.command}\n </pre>\n </PanelSection>\n )}\n\n <PanelSection title=\"Metrics\">\n <ProcessMetrics process={process} />\n </PanelSection>\n\n <PanelSection title=\"Stack\" grow>\n <StackBlock\n process={process}\n parsed={parsed}\n stateCounts={stateCounts}\n filtered={filtered}\n search={search}\n setSearch={setSearch}\n selectedStates={selectedStates}\n setSelectedStates={setSelectedStates}\n hideRuntimeOnly={hideRuntimeOnly}\n setHideRuntimeOnly={setHideRuntimeOnly}\n collectBusy={collectBusy}\n onCollectStack={onCollectStack}\n />\n </PanelSection>\n </div>\n );\n}\n\nfunction Header({ process }: { process: ProcessNode }) {\n return (\n <div className=\"flex items-start justify-between gap-density-3\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-density-2\">\n <Icon\n name={process.is_root ? \"codicon:server-process\" : \"codicon:debug-alt\"}\n className=\"text-2xl text-blue-600\"\n />\n <h2 className=\"text-lg font-bold text-foreground break-words\">{processLabel(process)}</h2>\n </div>\n <div className=\"mt-1 flex items-center gap-density-2 flex-wrap text-xs text-muted-foreground\">\n <span className=\"font-mono\">pid {process.pid}</span>\n {process.ppid ? <span className=\"font-mono\">ppid {process.ppid}</span> : null}\n {process.status ? (\n <span\n className={`inline-flex items-center gap-1 rounded-full bg-muted px-2 py-0.5 ${processStateColor(\n process.status,\n )}`}\n >\n <Icon name={processStateIcon(process.status)} />\n {process.status}\n </span>\n ) : null}\n </div>\n </div>\n </div>\n );\n}\n\nfunction RunSection({ runMeta }: { runMeta: RunMeta }) {\n return (\n <PanelSection title=\"Run\">\n <div className=\"grid grid-cols-2 gap-density-2 text-sm\">\n <InfoTile\n label={runMeta.kind === \"rerun\" ? `Rerun #${runMeta.sequence}` : \"Initial run\"}\n value={runMeta.started ? new Date(runMeta.started).toLocaleString() : \"Unavailable\"}\n />\n <InfoTile\n label=\"Finished\"\n value={runMeta.ended ? new Date(runMeta.ended).toLocaleString() : \"In progress\"}\n />\n </div>\n </PanelSection>\n );\n}\n\ntype StackFilterItem = { state: string; userFrameCount: number; searchText: string };\n\ntype StackBlockProps = {\n process: ProcessNode;\n parsed: ParsedStack;\n stateCounts: Map<string, number>;\n filtered: StackFilterItem[];\n search: string;\n setSearch: (v: string) => void;\n selectedStates: Set<string>;\n setSelectedStates: (updater: (prev: Set<string>) => Set<string>) => void;\n hideRuntimeOnly: boolean;\n setHideRuntimeOnly: (v: boolean) => void;\n collectBusy?: boolean;\n onCollectStack?: (pid: number) => void | Promise<void>;\n};\n\nfunction stackItemCount(parsed: ParsedStack): number {\n if (parsed.format === \"jvm\") return parsed.threads.length;\n if (parsed.format === \"go\") return parsed.goroutines.length;\n return 0;\n}\n\nfunction stackItemLabel(parsed: ParsedStack): string {\n if (parsed.format === \"jvm\") return \"threads\";\n if (parsed.format === \"go\") return \"goroutines\";\n return \"frames\";\n}\n\nfunction stackStateDot(parsed: ParsedStack, state: string): string {\n return parsed.format === \"jvm\" ? threadStateDot(state) : goroutineStateDot(state);\n}\n\nfunction StackBlock(props: StackBlockProps) {\n const {\n process,\n parsed,\n stateCounts,\n filtered,\n search,\n setSearch,\n selectedStates,\n setSelectedStates,\n hideRuntimeOnly,\n setHideRuntimeOnly,\n collectBusy,\n onCollectStack,\n } = props;\n const stack = process.stack_capture;\n\n if (!stack?.text) {\n return (\n <div className=\"h-full min-h-[14rem] flex flex-col justify-center gap-density-3 p-density-3\">\n <div className=\"space-y-1.5\">\n <div\n className={`h-3 w-40 rounded ${collectBusy ? \"animate-pulse bg-muted\" : \"bg-muted/70\"}`}\n />\n <div\n className={`h-3 w-full rounded ${collectBusy ? \"animate-pulse bg-muted\" : \"bg-muted/70\"}`}\n />\n <div\n className={`h-3 w-5/6 rounded ${collectBusy ? \"animate-pulse bg-muted\" : \"bg-muted/70\"}`}\n />\n </div>\n <div className=\"flex items-center justify-between gap-density-3\">\n <div className=\"text-sm text-muted-foreground\">\n {stack?.error\n ? stack.error\n : collectBusy\n ? \"Collecting stack trace...\"\n : \"No stack trace collected yet.\"}\n </div>\n {onCollectStack && (\n <CollectButton pid={process.pid} busy={collectBusy} onClick={onCollectStack} primary />\n )}\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"h-full min-h-0 flex flex-col\">\n <div className=\"px-1 py-1.5 space-y-density-2\">\n <div className=\"flex items-center justify-between gap-density-2 text-[11px] text-muted-foreground flex-wrap\">\n <div className=\"flex items-center gap-density-2 flex-wrap\">\n <StackStatusBadge status={stack.status} />\n {stack.collected_at && <span>{new Date(stack.collected_at).toLocaleString()}</span>}\n {stackItemCount(parsed) > 0 && (\n <span>\n {filtered.length} / {stackItemCount(parsed)} {stackItemLabel(parsed)}\n </span>\n )}\n </div>\n {onCollectStack && (\n <CollectButton pid={process.pid} busy={collectBusy} onClick={onCollectStack} />\n )}\n </div>\n {stackItemCount(parsed) > 0 && (\n <>\n <div className=\"flex items-center gap-1.5 flex-wrap\">\n <div className=\"relative min-w-[14rem] flex-1\">\n <Icon\n name=\"codicon:search\"\n className=\"absolute left-2 top-1/2 -translate-y-1/2 text-muted-foreground text-xs\"\n />\n <input\n className=\"w-full rounded-md border border-border bg-muted/50 py-1 pl-7 pr-2 text-xs outline-none focus:border-primary focus:bg-background\"\n placeholder={\n parsed.format === \"jvm\"\n ? \"Filter by thread name, function, or file\"\n : \"Filter by goroutine id, function, or file\"\n }\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n />\n </div>\n <label className=\"inline-flex items-center gap-1.5 rounded-md border border-border bg-muted/50 px-2 py-1 text-[11px] text-muted-foreground\">\n <input\n type=\"checkbox\"\n checked={hideRuntimeOnly}\n onChange={(e) => setHideRuntimeOnly(e.target.checked)}\n />\n Hide runtime-only\n </label>\n {(search || selectedStates.size > 0 || !hideRuntimeOnly) && (\n <button\n className=\"text-[11px] text-muted-foreground hover:text-foreground\"\n onClick={() => {\n setSearch(\"\");\n setSelectedStates(() => new Set());\n setHideRuntimeOnly(true);\n }}\n >\n Clear\n </button>\n )}\n </div>\n <div className=\"flex items-center gap-1 flex-wrap\">\n {Array.from(stateCounts.entries())\n .sort((a, b) => b[1] - a[1])\n .map(([state, count]) => {\n const active = selectedStates.has(state);\n return (\n <button\n key={state}\n className={`inline-flex items-center gap-1 rounded-full border px-2 py-0.5 text-[11px] transition-colors ${\n active\n ? \"border-primary bg-primary/10 text-primary\"\n : \"border-border bg-muted/50 text-muted-foreground hover:bg-background\"\n }`}\n onClick={() => {\n setSelectedStates((prev) => {\n const next = new Set(prev);\n if (next.has(state)) next.delete(state);\n else next.add(state);\n return next;\n });\n }}\n >\n <span className={`h-2 w-2 rounded-full ${stackStateDot(parsed, state)}`} />\n {state}\n <span className=\"text-[10px] opacity-70\">{count}</span>\n </button>\n );\n })}\n </div>\n </>\n )}\n </div>\n {stack.error && (\n <div className=\"mt-density-2 text-xs text-red-600 whitespace-pre-wrap\">{stack.error}</div>\n )}\n {stackItemCount(parsed) === 0 ? (\n <pre\n className=\"flex-1 min-h-0 overflow-auto py-1 text-[11px] text-foreground whitespace-pre-wrap font-mono leading-4\"\n style={{ minHeight: STACK_MIN_HEIGHT }}\n >\n {stack.text}\n </pre>\n ) : (\n <div\n className=\"flex-1 min-h-0 overflow-auto py-1 space-y-1\"\n style={{ minHeight: STACK_MIN_HEIGHT }}\n >\n {filtered.length === 0 && (\n <div className=\"py-density-3 text-center text-xs text-muted-foreground\">\n No {stackItemLabel(parsed)} match the current filters.\n </div>\n )}\n {parsed.format === \"jvm\" &&\n parsed.threads\n .filter((t) => filtered.includes(t))\n .map((t) => (\n <ThreadCard\n key={t.id}\n thread={t}\n search={search}\n hideRuntimeOnly={hideRuntimeOnly}\n />\n ))}\n {parsed.format === \"go\" &&\n parsed.goroutines\n .filter((g) => filtered.includes(g))\n .map((goroutine) => (\n <GoroutineCard\n key={goroutine.id}\n goroutine={goroutine}\n search={search}\n hideRuntimeOnly={hideRuntimeOnly}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n\nfunction StackStatusBadge({ status }: { status: string }) {\n const cls =\n status === \"ready\"\n ? \"bg-green-100 text-green-700 dark:bg-green-500/20 dark:text-green-300\"\n : status === \"unsupported\"\n ? \"bg-yellow-100 text-yellow-700 dark:bg-yellow-500/20 dark:text-yellow-300\"\n : \"bg-red-100 text-red-700 dark:bg-red-500/20 dark:text-red-300\";\n return <span className={`px-2 py-0.5 rounded-full ${cls}`}>{status}</span>;\n}\n\nfunction CollectButton({\n pid,\n busy,\n onClick,\n primary,\n}: {\n pid: number;\n busy?: boolean;\n onClick: (pid: number) => void | Promise<void>;\n primary?: boolean;\n}) {\n const base =\n \"shrink-0 text-[11px] px-2 py-1 rounded disabled:opacity-50 disabled:cursor-not-allowed flex items-center gap-1\";\n const style = primary\n ? \"bg-primary text-primary-foreground hover:bg-primary/90\"\n : \"border border-border text-muted-foreground hover:bg-accent\";\n return (\n <button\n className={`${base} ${style}`}\n onClick={() => onClick(pid)}\n disabled={busy}\n title={primary ? \"Collect the latest stack trace\" : \"Refresh stack trace\"}\n >\n <Icon\n name={\n busy\n ? \"svg-spinners:ring-resize\"\n : primary\n ? \"codicon:debug-alt-small\"\n : \"codicon:refresh\"\n }\n />\n {busy ? \"Collecting...\" : primary ? \"Collect stack trace\" : \"Refresh\"}\n </button>\n );\n}\n\nfunction PanelSection({\n title,\n grow,\n children,\n}: {\n title: string;\n grow?: boolean;\n children: ReactNode;\n}) {\n return (\n <section className={grow ? \"flex min-h-0 flex-1 flex-col\" : \"\"}>\n <div className=\"text-[11px] font-semibold uppercase tracking-wide text-muted-foreground mb-1.5\">\n {title}\n </div>\n {grow ? <div className=\"flex-1 min-h-0 overflow-hidden\">{children}</div> : children}\n </section>\n );\n}\n\nfunction InfoTile({ label, value }: { label: string; value: string }) {\n return (\n <div className=\"border border-border rounded-lg bg-muted/50 px-2.5 py-density-2\">\n <div className=\"text-[10px] uppercase tracking-wide text-muted-foreground\">{label}</div>\n <div className=\"text-xs font-medium text-foreground mt-0.5\">{value}</div>\n </div>\n );\n}\n\nfunction ProcessMetrics({ process }: { process: ProcessNode }) {\n const cpu = process.cpu_percent || 0;\n const rss = process.rss;\n const vms = process.vms;\n const memRatioPct = rss && vms && vms > 0 ? Math.min(100, Math.round((rss / vms) * 100)) : 0;\n return (\n <div className=\"grid grid-cols-4 gap-density-1\">\n <MetricTile\n label=\"CPU\"\n value={`${cpu.toFixed(1)}%`}\n barPct={Math.min(100, cpu)}\n tone={cpuTone(cpu)}\n />\n <MetricTile\n label=\"RSS\"\n value={rss !== undefined ? formatBytes(rss) : \"n/a\"}\n barPct={memRatioPct}\n tone={memoryTone(rss, vms)}\n />\n <MetricTile label=\"VMS\" value={vms !== undefined ? formatBytes(vms) : \"n/a\"} tone=\"neutral\" />\n <MetricTile\n label=\"Files\"\n value={process.open_files !== undefined ? String(process.open_files) : \"n/a\"}\n barPct={process.open_files ? Math.min(100, (process.open_files / 1024) * 100) : 0}\n tone=\"info\"\n />\n </div>\n );\n}\n\nfunction MetricTile({\n label,\n value,\n barPct,\n tone = \"neutral\",\n}: {\n label: string;\n value: string;\n barPct?: number;\n tone?: GaugeTone;\n}) {\n const toneBar: Record<GaugeTone, string> = {\n neutral: \"bg-muted-foreground/40\",\n success: \"bg-green-500\",\n warning: \"bg-yellow-500\",\n danger: \"bg-red-500\",\n info: \"bg-blue-500\",\n };\n const toneText: Record<GaugeTone, string> = {\n neutral: \"text-foreground\",\n success: \"text-green-600 dark:text-green-400\",\n warning: \"text-yellow-600 dark:text-yellow-400\",\n danger: \"text-red-600 dark:text-red-400\",\n info: \"text-blue-600 dark:text-blue-400\",\n };\n return (\n <div className=\"flex flex-col gap-0.5 rounded-md border border-border bg-background px-density-2 py-1 min-w-0\">\n <span className=\"text-[9px] uppercase tracking-wide text-muted-foreground leading-none\">\n {label}\n </span>\n <span className={`text-xs font-semibold tabular-nums truncate ${toneText[tone]}`}>\n {value}\n </span>\n {barPct !== undefined && (\n <div className=\"h-0.5 w-full rounded-full bg-muted overflow-hidden\">\n <div\n className={`h-full ${toneBar[tone]} transition-all duration-300`}\n style={{ width: `${barPct}%` }}\n />\n </div>\n )}\n </div>\n );\n}\n","import { useMemo, useState } from \"react\";\nimport { useSort } from \"../../hooks/use-sort\";\nimport { SortableHeader } from \"../SortableHeader\";\nimport { JsonView } from \"../JsonView\";\nimport type { HAREntry } from \"./types\";\n\nexport type HarPanelProps = {\n entries: HAREntry[];\n search?: string;\n emptyLabel?: string;\n className?: string;\n};\n\nconst COLS: { key: string; label: string; cls: string; align?: \"left\" | \"right\" }[] = [\n { key: \"request.method\", label: \"Method\", cls: \"px-2 py-2 w-16\" },\n { key: \"request.url\", label: \"URL\", cls: \"px-2 py-2\" },\n { key: \"response.status\", label: \"Status\", cls: \"px-2 py-2 w-20\" },\n { key: \"time\", label: \"Time\", cls: \"px-2 py-2 w-16 text-right\", align: \"right\" },\n { key: \"response.bodySize\", label: \"Size\", cls: \"px-2 py-2 w-16 text-right\", align: \"right\" },\n { key: \"response.content.mimeType\", label: \"Type\", cls: \"px-2 py-2 w-40\" },\n];\n\nexport function HarPanel({\n entries,\n search,\n emptyLabel = \"No HTTP traffic captured\",\n className,\n}: HarPanelProps) {\n const filtered = useMemo(() => {\n if (!search) return entries;\n const needle = search.toLowerCase();\n return entries.filter((e) => matchesSearch(needle, e));\n }, [entries, search]);\n const { sorted, sort, toggle } = useSort(filtered, { defaultKey: \"time\" });\n\n if (!entries || entries.length === 0) {\n return (\n <div className=\"p-density-6 text-center text-muted-foreground text-sm\">{emptyLabel}</div>\n );\n }\n\n return (\n <div className={`overflow-auto h-full ${className ?? \"\"}`}>\n <table className=\"w-full text-left table-fixed\">\n <thead className=\"bg-muted/50 sticky top-0\">\n <tr className=\"text-xs text-muted-foreground border-b border-border\">\n {COLS.map((c) => (\n <th\n key={c.key}\n className={`${c.cls} cursor-pointer select-none whitespace-nowrap font-medium`}\n >\n <SortableHeader\n active={sort?.key === c.key}\n dir={sort?.dir}\n onClick={() => toggle(c.key)}\n align={c.align}\n >\n {c.label}\n </SortableHeader>\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {sorted.map((entry, i) => (\n <HarRow key={i} entry={entry} />\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\nfunction HarRow({ entry }: { entry: HAREntry }) {\n const [open, setOpen] = useState(false);\n return (\n <>\n <tr\n className=\"hover:bg-accent cursor-pointer text-xs border-b border-border\"\n onClick={() => setOpen(!open)}\n >\n <td className=\"px-2 py-1.5 font-mono font-medium whitespace-nowrap\">\n {entry.request.method}\n </td>\n <td className=\"px-2 py-1.5 font-mono truncate max-w-0\" title={entry.request.url}>\n {entry.request.url}\n </td>\n <td\n className={`px-2 py-1.5 font-medium whitespace-nowrap ${statusColor(entry.response.status)}`}\n >\n {entry.response.status}\n </td>\n <td className=\"px-2 py-1.5 text-right text-muted-foreground whitespace-nowrap tabular-nums\">\n {entry.time.toFixed(0)}ms\n </td>\n <td className=\"px-2 py-1.5 text-right text-muted-foreground whitespace-nowrap tabular-nums\">\n {formatBytes(entry.response.bodySize)}\n </td>\n <td className=\"px-2 py-1.5 text-muted-foreground whitespace-nowrap\">\n {entry.response.content?.mimeType || \"\"}\n </td>\n </tr>\n {open && (\n <tr>\n <td colSpan={COLS.length} className=\"bg-muted/50 p-density-3 text-xs\">\n <HarRowDetails entry={entry} />\n </td>\n </tr>\n )}\n </>\n );\n}\n\nfunction HarRowDetails({ entry }: { entry: HAREntry }) {\n return (\n <>\n <div className=\"grid grid-cols-2 gap-density-4\">\n <div>\n <HeaderList title=\"Request Headers\" headers={entry.request.headers} />\n {entry.request.postData?.text && (\n <div className=\"mt-density-2\">\n <div className=\"font-semibold text-foreground mb-1\">Request Body</div>\n <div className=\"bg-background p-density-2 rounded border border-border overflow-auto max-h-48\">\n <BodyView\n text={entry.request.postData.text}\n mimeType={entry.request.postData.mimeType}\n />\n </div>\n </div>\n )}\n </div>\n <div>\n <HeaderList title=\"Response Headers\" headers={entry.response.headers} />\n </div>\n </div>\n {entry.response.content?.text && (\n <div className=\"mt-density-3\">\n <div className=\"font-semibold text-foreground mb-1\">Response Body</div>\n <div className=\"bg-background p-density-2 rounded border border-border overflow-auto max-h-64\">\n <BodyView\n text={entry.response.content.text}\n mimeType={entry.response.content.mimeType}\n />\n </div>\n </div>\n )}\n </>\n );\n}\n\nfunction HeaderList({\n title,\n headers,\n}: {\n title: string;\n headers?: { name: string; value: string }[];\n}) {\n return (\n <>\n <div className=\"font-semibold text-foreground mb-1\">{title}</div>\n <div className=\"space-y-0.5\">\n {headers?.map((h, i) => (\n <div key={i} className=\"whitespace-nowrap\">\n <span className=\"text-purple-600 dark:text-purple-400\">{h.name}:</span> {h.value}\n </div>\n ))}\n </div>\n </>\n );\n}\n\nfunction BodyView({ text, mimeType }: { text: string; mimeType?: string }) {\n if (isJsonType(mimeType)) {\n const parsed = tryParseJson(text);\n if (parsed !== null) return <JsonView data={parsed} />;\n }\n return <pre className=\"whitespace-pre-wrap break-all\">{text}</pre>;\n}\n\nfunction tryParseJson(text: string): unknown | null {\n try {\n return JSON.parse(text);\n } catch {\n return null;\n }\n}\n\nfunction isJsonType(mime?: string): boolean {\n return !!mime && (mime.includes(\"json\") || mime.includes(\"javascript\"));\n}\n\nfunction matchesSearch(needle: string, e: HAREntry): boolean {\n const haystacks = [\n e.request.url,\n e.request.method,\n e.request.postData?.text,\n e.response.content?.text,\n ];\n return haystacks.some((h) => !!h && h.toLowerCase().includes(needle));\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 0) return \"\";\n if (bytes < 1024) return `${bytes}B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}KB`;\n return `${(bytes / 1024 / 1024).toFixed(1)}MB`;\n}\n\nfunction statusColor(status: number): string {\n if (status >= 500) return \"text-red-600\";\n if (status >= 400) return \"text-amber-600\";\n if (status >= 300) return \"text-blue-600\";\n if (status >= 200) return \"text-green-600\";\n return \"text-muted-foreground\";\n}\n","import { useState, type ReactNode } from \"react\";\nimport { cn } from \"../lib/utils\";\n\nexport type HoverCardPlacement = \"top\" | \"bottom\" | \"left\" | \"right\";\n\nexport type HoverCardProps = {\n trigger: ReactNode;\n children: ReactNode;\n placement?: HoverCardPlacement;\n delay?: number;\n arrow?: boolean;\n className?: string;\n cardClassName?: string;\n};\n\nconst placementPos: Record<HoverCardPlacement, string> = {\n top: \"bottom-full left-1/2 -translate-x-1/2 mb-1.5\",\n bottom: \"top-full left-1/2 -translate-x-1/2 mt-1.5\",\n left: \"right-full top-1/2 -translate-y-1/2 mr-1.5\",\n right: \"left-full top-1/2 -translate-y-1/2 ml-1.5\",\n};\n\nexport function HoverCard({\n trigger,\n children,\n placement = \"top\",\n delay = 0,\n arrow = true,\n className,\n cardClassName,\n}: HoverCardProps) {\n const [open, setOpen] = useState(false);\n const timer = useState<number | null>(null);\n\n function onEnter() {\n if (delay > 0) {\n const id = window.setTimeout(() => setOpen(true), delay);\n timer[1](id);\n } else {\n setOpen(true);\n }\n }\n function onLeave() {\n if (timer[0] !== null) window.clearTimeout(timer[0]);\n setOpen(false);\n }\n\n return (\n <span\n className={cn(\"relative inline-flex items-center\", className)}\n onMouseEnter={onEnter}\n onMouseLeave={onLeave}\n onFocus={onEnter}\n onBlur={onLeave}\n >\n {trigger}\n {open && (\n <div\n role=\"tooltip\"\n className={cn(\n \"absolute z-20 bg-background border border-border rounded-md shadow-lg px-2.5 py-1.5 whitespace-nowrap text-[11px]\",\n placementPos[placement],\n cardClassName,\n )}\n >\n {children}\n {arrow && placement === \"top\" && (\n <div className=\"absolute top-full left-1/2 -translate-x-1/2 -mt-px\">\n <div className=\"w-1.5 h-1.5 bg-background border-b border-r border-border rotate-45 -translate-y-1\" />\n </div>\n )}\n </div>\n )}\n </span>\n );\n}\n","import { useEffect, useRef, type ReactNode } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"../data/Icon\";\n\nexport type ModalSize = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\";\n\nexport type ModalProps = {\n open: boolean;\n onClose: () => void;\n title?: ReactNode;\n size?: ModalSize;\n closeOnBackdrop?: boolean;\n closeOnEsc?: boolean;\n hideClose?: boolean;\n className?: string;\n headerSlot?: ReactNode;\n footer?: ReactNode;\n children: ReactNode;\n};\n\nconst sizeClass: Record<ModalSize, string> = {\n sm: \"max-w-sm\",\n md: \"max-w-md\",\n lg: \"max-w-2xl\",\n xl: \"max-w-4xl\",\n full: \"max-w-[95vw] max-h-[95vh]\",\n};\n\nexport function Modal({\n open,\n onClose,\n title,\n size = \"md\",\n closeOnBackdrop = true,\n closeOnEsc = true,\n hideClose = false,\n className,\n headerSlot,\n footer,\n children,\n}: ModalProps) {\n const dialogRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!open || !closeOnEsc) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onClose();\n };\n document.addEventListener(\"keydown\", onKey);\n return () => document.removeEventListener(\"keydown\", onKey);\n }, [open, closeOnEsc, onClose]);\n\n useEffect(() => {\n if (!open) return;\n const prev = document.activeElement as HTMLElement | null;\n dialogRef.current?.focus();\n return () => prev?.focus?.();\n }, [open]);\n\n if (!open) return null;\n\n return (\n <div\n className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/40\"\n onClick={closeOnBackdrop ? onClose : undefined}\n role=\"presentation\"\n >\n <div\n ref={dialogRef}\n tabIndex={-1}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={typeof title === \"string\" ? title : undefined}\n className={cn(\n \"relative bg-background border border-border rounded-lg shadow-xl w-full flex flex-col\",\n sizeClass[size],\n className,\n )}\n onClick={(e) => e.stopPropagation()}\n >\n {(title || headerSlot || !hideClose) && (\n <div className=\"flex items-center gap-density-2 px-density-4 py-density-3 border-b border-border\">\n {title && <h2 className=\"text-sm font-semibold flex-1\">{title}</h2>}\n {headerSlot}\n {!hideClose && (\n <button\n type=\"button\"\n onClick={onClose}\n aria-label=\"Close\"\n className=\"text-muted-foreground hover:text-foreground\"\n >\n <Icon name=\"codicon:close\" />\n </button>\n )}\n </div>\n )}\n <div className=\"flex-1 overflow-auto px-density-4 py-density-3\">{children}</div>\n {footer && <div className=\"px-density-4 py-density-3 border-t border-border\">{footer}</div>}\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tailwind-preset.d.mts","names":[],"sources":["../src/tailwind-preset.ts"],"mappings":";;;cAEM,MAAA,EAAQ,OAAA,CAAQ,MAAA"}
|
package/dist/tailwind-preset.mjs
DELETED
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
//#region src/tailwind-preset.ts
|
|
2
|
-
const preset = {
|
|
3
|
-
darkMode: ["selector", "[data-theme=\"dark\"]"],
|
|
4
|
-
theme: { extend: {
|
|
5
|
-
colors: {
|
|
6
|
-
border: "hsl(var(--border))",
|
|
7
|
-
input: "hsl(var(--input))",
|
|
8
|
-
ring: "hsl(var(--ring))",
|
|
9
|
-
background: "hsl(var(--background))",
|
|
10
|
-
foreground: "hsl(var(--foreground))",
|
|
11
|
-
primary: {
|
|
12
|
-
DEFAULT: "hsl(var(--primary))",
|
|
13
|
-
foreground: "hsl(var(--primary-foreground))"
|
|
14
|
-
},
|
|
15
|
-
secondary: {
|
|
16
|
-
DEFAULT: "hsl(var(--secondary))",
|
|
17
|
-
foreground: "hsl(var(--secondary-foreground))"
|
|
18
|
-
},
|
|
19
|
-
destructive: {
|
|
20
|
-
DEFAULT: "hsl(var(--destructive))",
|
|
21
|
-
foreground: "hsl(var(--destructive-foreground))"
|
|
22
|
-
},
|
|
23
|
-
muted: {
|
|
24
|
-
DEFAULT: "hsl(var(--muted))",
|
|
25
|
-
foreground: "hsl(var(--muted-foreground))"
|
|
26
|
-
},
|
|
27
|
-
accent: {
|
|
28
|
-
DEFAULT: "hsl(var(--accent))",
|
|
29
|
-
foreground: "hsl(var(--accent-foreground))"
|
|
30
|
-
},
|
|
31
|
-
popover: {
|
|
32
|
-
DEFAULT: "hsl(var(--popover))",
|
|
33
|
-
foreground: "hsl(var(--popover-foreground))"
|
|
34
|
-
},
|
|
35
|
-
card: {
|
|
36
|
-
DEFAULT: "hsl(var(--card))",
|
|
37
|
-
foreground: "hsl(var(--card-foreground))"
|
|
38
|
-
}
|
|
39
|
-
},
|
|
40
|
-
borderRadius: {
|
|
41
|
-
lg: "var(--radius)",
|
|
42
|
-
md: "calc(var(--radius) - 2px)",
|
|
43
|
-
sm: "calc(var(--radius) - 4px)"
|
|
44
|
-
},
|
|
45
|
-
spacing: {
|
|
46
|
-
"control-h": "var(--control-height)",
|
|
47
|
-
"control-px": "var(--control-padding-x)",
|
|
48
|
-
"density-1": "var(--spacing-unit)",
|
|
49
|
-
"density-2": "calc(var(--spacing-unit) * 2)",
|
|
50
|
-
"density-3": "calc(var(--spacing-unit) * 3)",
|
|
51
|
-
"density-4": "calc(var(--spacing-unit) * 4)"
|
|
52
|
-
},
|
|
53
|
-
fontSize: { "density-base": "var(--font-size-base)" }
|
|
54
|
-
} },
|
|
55
|
-
plugins: [({ addVariant }) => {
|
|
56
|
-
addVariant("density-compact", "[data-density=\"compact\"] &");
|
|
57
|
-
addVariant("density-comfortable", "[data-density=\"comfortable\"] &");
|
|
58
|
-
addVariant("density-spacious", "[data-density=\"spacious\"] &");
|
|
59
|
-
}]
|
|
60
|
-
};
|
|
61
|
-
|
|
62
|
-
//#endregion
|
|
63
|
-
export { preset as default };
|
|
64
|
-
//# sourceMappingURL=tailwind-preset.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tailwind-preset.mjs","names":[],"sources":["../src/tailwind-preset.ts"],"sourcesContent":["import type { Config } from \"tailwindcss\";\n\nconst preset: Partial<Config> = {\n darkMode: [\"selector\", '[data-theme=\"dark\"]'],\n theme: {\n extend: {\n colors: {\n border: \"hsl(var(--border))\",\n input: \"hsl(var(--input))\",\n ring: \"hsl(var(--ring))\",\n background: \"hsl(var(--background))\",\n foreground: \"hsl(var(--foreground))\",\n primary: {\n DEFAULT: \"hsl(var(--primary))\",\n foreground: \"hsl(var(--primary-foreground))\",\n },\n secondary: {\n DEFAULT: \"hsl(var(--secondary))\",\n foreground: \"hsl(var(--secondary-foreground))\",\n },\n destructive: {\n DEFAULT: \"hsl(var(--destructive))\",\n foreground: \"hsl(var(--destructive-foreground))\",\n },\n muted: {\n DEFAULT: \"hsl(var(--muted))\",\n foreground: \"hsl(var(--muted-foreground))\",\n },\n accent: {\n DEFAULT: \"hsl(var(--accent))\",\n foreground: \"hsl(var(--accent-foreground))\",\n },\n popover: {\n DEFAULT: \"hsl(var(--popover))\",\n foreground: \"hsl(var(--popover-foreground))\",\n },\n card: {\n DEFAULT: \"hsl(var(--card))\",\n foreground: \"hsl(var(--card-foreground))\",\n },\n },\n borderRadius: {\n lg: \"var(--radius)\",\n md: \"calc(var(--radius) - 2px)\",\n sm: \"calc(var(--radius) - 4px)\",\n },\n spacing: {\n \"control-h\": \"var(--control-height)\",\n \"control-px\": \"var(--control-padding-x)\",\n \"density-1\": \"var(--spacing-unit)\",\n \"density-2\": \"calc(var(--spacing-unit) * 2)\",\n \"density-3\": \"calc(var(--spacing-unit) * 3)\",\n \"density-4\": \"calc(var(--spacing-unit) * 4)\",\n },\n fontSize: {\n \"density-base\": \"var(--font-size-base)\",\n },\n },\n },\n plugins: [\n ({ addVariant }: { addVariant: (name: string, selector: string) => void }) => {\n addVariant(\"density-compact\", '[data-density=\"compact\"] &');\n addVariant(\"density-comfortable\", '[data-density=\"comfortable\"] &');\n addVariant(\"density-spacious\", '[data-density=\"spacious\"] &');\n },\n ],\n};\n\nexport default preset;\n"],"mappings":";AAEA,MAAM,SAA0B;CAC9B,UAAU,CAAC,YAAY,wBAAsB;CAC7C,OAAO,EACL,QAAQ;EACN,QAAQ;GACN,QAAQ;GACR,OAAO;GACP,MAAM;GACN,YAAY;GACZ,YAAY;GACZ,SAAS;IACP,SAAS;IACT,YAAY;IACb;GACD,WAAW;IACT,SAAS;IACT,YAAY;IACb;GACD,aAAa;IACX,SAAS;IACT,YAAY;IACb;GACD,OAAO;IACL,SAAS;IACT,YAAY;IACb;GACD,QAAQ;IACN,SAAS;IACT,YAAY;IACb;GACD,SAAS;IACP,SAAS;IACT,YAAY;IACb;GACD,MAAM;IACJ,SAAS;IACT,YAAY;IACb;GACF;EACD,cAAc;GACZ,IAAI;GACJ,IAAI;GACJ,IAAI;GACL;EACD,SAAS;GACP,aAAa;GACb,cAAc;GACd,aAAa;GACb,aAAa;GACb,aAAa;GACb,aAAa;GACd;EACD,UAAU,EACR,gBAAgB,yBACjB;EACF,EACF;CACD,SAAS,EACN,EAAE,iBAA2E;AAC5E,aAAW,mBAAmB,+BAA6B;AAC3D,aAAW,uBAAuB,mCAAiC;AACnE,aAAW,oBAAoB,gCAA8B;GAEhE;CACF"}
|