@flanksource/clicky-ui 0.1.0 → 0.2.1
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 +22 -0
- package/dist/components/icon-menu-picker.d.ts.map +1 -0
- package/dist/components/icon-menu-picker.js +181 -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 +14 -0
- package/dist/components.d.ts.map +1 -0
- package/dist/components.js +31 -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 +193 -0
- package/dist/index.js.map +1 -0
- package/dist/layout/Section.d.ts +23 -0
- package/dist/layout/Section.d.ts.map +1 -0
- package/dist/layout/Section.js +73 -0
- package/dist/layout/Section.js.map +1 -0
- package/dist/layout/SplitPane.d.ts +13 -0
- package/dist/layout/SplitPane.d.ts.map +1 -0
- package/dist/layout/SplitPane.js +72 -0
- package/dist/layout/SplitPane.js.map +1 -0
- package/dist/lib/palette.d.ts +4 -0
- package/dist/lib/palette.d.ts.map +1 -0
- package/dist/lib/palette.js +35 -0
- package/dist/lib/palette.js.map +1 -0
- package/dist/lib/size.d.ts +6 -0
- package/dist/lib/size.d.ts.map +1 -0
- package/dist/lib/size.js +14 -0
- package/dist/lib/size.js.map +1 -0
- package/dist/lib/utils.d.ts +3 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +9 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/overlay/HoverCard.d.ts +13 -0
- package/dist/overlay/HoverCard.d.ts.map +1 -0
- package/dist/overlay/HoverCard.js +170 -0
- package/dist/overlay/HoverCard.js.map +1 -0
- package/dist/overlay/Modal.d.ts +17 -0
- package/dist/overlay/Modal.d.ts.map +1 -0
- package/dist/overlay/Modal.js +91 -0
- package/dist/overlay/Modal.js.map +1 -0
- package/dist/rpc/AcceptPicker.d.ts +52 -0
- package/dist/rpc/AcceptPicker.d.ts.map +1 -0
- package/dist/rpc/AcceptPicker.js +126 -0
- package/dist/rpc/AcceptPicker.js.map +1 -0
- package/dist/rpc/ApiExplorer.d.ts +11 -0
- package/dist/rpc/ApiExplorer.d.ts.map +1 -0
- package/dist/rpc/ApiExplorer.js +37 -0
- package/dist/rpc/ApiExplorer.js.map +1 -0
- package/dist/rpc/CommandForm.d.ts +15 -0
- package/dist/rpc/CommandForm.d.ts.map +1 -0
- package/dist/rpc/CommandForm.js +356 -0
- package/dist/rpc/CommandForm.js.map +1 -0
- package/dist/rpc/CommandOutput.d.ts +11 -0
- package/dist/rpc/CommandOutput.d.ts.map +1 -0
- package/dist/rpc/CommandOutput.js +195 -0
- package/dist/rpc/CommandOutput.js.map +1 -0
- package/dist/rpc/EndpointList.d.ts +18 -0
- package/dist/rpc/EndpointList.d.ts.map +1 -0
- package/dist/rpc/EndpointList.js +56 -0
- package/dist/rpc/EndpointList.js.map +1 -0
- package/dist/rpc/EntityExplorerApp.d.ts +15 -0
- package/dist/rpc/EntityExplorerApp.d.ts.map +1 -0
- package/dist/rpc/EntityExplorerApp.js +282 -0
- package/dist/rpc/EntityExplorerApp.js.map +1 -0
- package/dist/rpc/ExecutionResult.d.ts +14 -0
- package/dist/rpc/ExecutionResult.d.ts.map +1 -0
- package/dist/rpc/ExecutionResult.js +51 -0
- package/dist/rpc/ExecutionResult.js.map +1 -0
- package/dist/rpc/FilterForm.d.ts +22 -0
- package/dist/rpc/FilterForm.d.ts.map +1 -0
- package/dist/rpc/FilterForm.js +392 -0
- package/dist/rpc/FilterForm.js.map +1 -0
- package/dist/rpc/InlineError.d.ts +7 -0
- package/dist/rpc/InlineError.d.ts.map +1 -0
- package/dist/rpc/InlineError.js +54 -0
- package/dist/rpc/InlineError.js.map +1 -0
- package/dist/rpc/OperationActionDialog.d.ts +12 -0
- package/dist/rpc/OperationActionDialog.d.ts.map +1 -0
- package/dist/rpc/OperationActionDialog.js +105 -0
- package/dist/rpc/OperationActionDialog.js.map +1 -0
- package/dist/rpc/OperationCatalog.d.ts +21 -0
- package/dist/rpc/OperationCatalog.d.ts.map +1 -0
- package/dist/rpc/OperationCatalog.js +339 -0
- package/dist/rpc/OperationCatalog.js.map +1 -0
- package/dist/rpc/OperationCommandPage.d.ts +22 -0
- package/dist/rpc/OperationCommandPage.d.ts.map +1 -0
- package/dist/rpc/OperationCommandPage.js +484 -0
- package/dist/rpc/OperationCommandPage.js.map +1 -0
- package/dist/rpc/OperationEntityPage.d.ts +23 -0
- package/dist/rpc/OperationEntityPage.d.ts.map +1 -0
- package/dist/rpc/OperationEntityPage.js +218 -0
- package/dist/rpc/OperationEntityPage.js.map +1 -0
- package/dist/rpc/classify.d.ts +8 -0
- package/dist/rpc/classify.d.ts.map +1 -0
- package/dist/rpc/classify.js +76 -0
- package/dist/rpc/classify.js.map +1 -0
- package/dist/rpc/clickyMetadata.d.ts +12 -0
- package/dist/rpc/clickyMetadata.d.ts.map +1 -0
- package/dist/rpc/clickyMetadata.js +71 -0
- package/dist/rpc/clickyMetadata.js.map +1 -0
- package/dist/rpc/formMetadata.d.ts +27 -0
- package/dist/rpc/formMetadata.d.ts.map +1 -0
- package/dist/rpc/formMetadata.js +250 -0
- package/dist/rpc/formMetadata.js.map +1 -0
- package/dist/rpc/types.d.ts +109 -0
- package/dist/rpc/types.d.ts.map +1 -0
- package/dist/rpc/types.js +8 -0
- package/dist/rpc/types.js.map +1 -0
- package/dist/rpc/useOperations.d.ts +346 -0
- package/dist/rpc/useOperations.d.ts.map +1 -0
- package/dist/rpc/useOperations.js +31 -0
- package/dist/rpc/useOperations.js.map +1 -0
- package/dist/rpc.d.ts +14 -0
- package/dist/rpc.d.ts.map +1 -0
- package/dist/rpc.js +37 -0
- package/dist/rpc.js.map +1 -0
- package/dist/styles.css +2 -0
- package/dist/styles.d.ts +1 -0
- package/dist/styles.d.ts.map +1 -0
- package/dist/styles.js +2 -0
- package/dist/styles.js.map +1 -0
- package/dist/tailwind-preset.d.ts +4 -0
- package/dist/tailwind-preset.d.ts.map +1 -0
- package/dist/tailwind-preset.js +69 -0
- package/dist/tailwind-preset.js.map +1 -0
- package/dist/utils.d.ts +4 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +12 -0
- package/dist/utils.js.map +1 -0
- package/package.json +83 -40
- package/dist/index.d.mts +0 -834
- package/dist/index.d.mts.map +0 -1
- package/dist/index.mjs +0 -2918
- package/dist/index.mjs.map +0 -1
- package/dist/tailwind-preset.d.mts +0 -7
- package/dist/tailwind-preset.d.mts.map +0 -1
- package/dist/tailwind-preset.mjs +0 -64
- package/dist/tailwind-preset.mjs.map +0 -1
- package/src/styles/tokens.css +0 -78
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
const ANSI_COLORS = {
|
|
3
|
+
"30": "color:#1e1e1e",
|
|
4
|
+
"31": "color:#cd3131",
|
|
5
|
+
"32": "color:#0dbc79",
|
|
6
|
+
"33": "color:#e5e510",
|
|
7
|
+
"34": "color:#2472c8",
|
|
8
|
+
"35": "color:#bc3fbc",
|
|
9
|
+
"36": "color:#11a8cd",
|
|
10
|
+
"37": "color:#e5e5e5",
|
|
11
|
+
"90": "color:#666",
|
|
12
|
+
"91": "color:#f14c4c",
|
|
13
|
+
"92": "color:#23d18b",
|
|
14
|
+
"93": "color:#f5f543",
|
|
15
|
+
"94": "color:#3b8eea",
|
|
16
|
+
"95": "color:#d670d6",
|
|
17
|
+
"96": "color:#29b8db",
|
|
18
|
+
"97": "color:#fff",
|
|
19
|
+
"1": "font-weight:bold",
|
|
20
|
+
"2": "opacity:0.7",
|
|
21
|
+
"3": "font-style:italic",
|
|
22
|
+
"4": "text-decoration:underline"
|
|
23
|
+
};
|
|
24
|
+
function parseAnsi(raw) {
|
|
25
|
+
const spans = [];
|
|
26
|
+
const re = /\x1b\[([0-9;]*)m/g;
|
|
27
|
+
let last = 0;
|
|
28
|
+
let styles = [];
|
|
29
|
+
let match;
|
|
30
|
+
while ((match = re.exec(raw)) !== null) {
|
|
31
|
+
if (match.index > last) {
|
|
32
|
+
spans.push({ text: raw.slice(last, match.index), style: styles.join(";") });
|
|
33
|
+
}
|
|
34
|
+
const codes = (match[1] ?? "").split(";").filter(Boolean);
|
|
35
|
+
for (const code of codes) {
|
|
36
|
+
if (code === "0" || code === "") {
|
|
37
|
+
styles = [];
|
|
38
|
+
} else {
|
|
39
|
+
const rule = ANSI_COLORS[code];
|
|
40
|
+
if (rule) styles.push(rule);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
last = match.index + match[0].length;
|
|
44
|
+
}
|
|
45
|
+
if (last < raw.length) {
|
|
46
|
+
spans.push({ text: raw.slice(last), style: styles.join(";") });
|
|
47
|
+
}
|
|
48
|
+
return spans;
|
|
49
|
+
}
|
|
50
|
+
function spanToStyle(style) {
|
|
51
|
+
const out = {};
|
|
52
|
+
for (const rule of style.split(";")) {
|
|
53
|
+
const [k, v] = rule.split(":");
|
|
54
|
+
if (!k || !v) continue;
|
|
55
|
+
const key = k.replace(/-([a-z])/g, (_, c) => c.toUpperCase());
|
|
56
|
+
out[key] = v;
|
|
57
|
+
}
|
|
58
|
+
return out;
|
|
59
|
+
}
|
|
60
|
+
function AnsiHtml({ text, className, as = "pre" }) {
|
|
61
|
+
const spans = parseAnsi(text);
|
|
62
|
+
const children = spans.map(
|
|
63
|
+
(s, i) => s.style ? /* @__PURE__ */ jsx("span", { style: spanToStyle(s.style), children: s.text }, i) : /* @__PURE__ */ jsx("span", { children: s.text }, i)
|
|
64
|
+
);
|
|
65
|
+
if (as === "span") return /* @__PURE__ */ jsx("span", { className, children });
|
|
66
|
+
return /* @__PURE__ */ jsx("pre", { className, children });
|
|
67
|
+
}
|
|
68
|
+
export {
|
|
69
|
+
AnsiHtml
|
|
70
|
+
};
|
|
71
|
+
//# sourceMappingURL=AnsiHtml.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AnsiHtml.js","sources":["../../src/data/AnsiHtml.tsx"],"sourcesContent":["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"],"names":[],"mappings":";AAAA,MAAM,cAAsC;AAAA,EAC1C,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AACP;AAIA,SAAS,UAAU,KAAqB;AACtC,QAAM,QAAgB,CAAA;AAEtB,QAAM,KAAK;AACX,MAAI,OAAO;AACX,MAAI,SAAmB,CAAA;AACvB,MAAI;AAEJ,UAAQ,QAAQ,GAAG,KAAK,GAAG,OAAO,MAAM;AACtC,QAAI,MAAM,QAAQ,MAAM;AACtB,YAAM,KAAK,EAAE,MAAM,IAAI,MAAM,MAAM,MAAM,KAAK,GAAG,OAAO,OAAO,KAAK,GAAG,GAAG;AAAA,IAC5E;AACA,UAAM,SAAS,MAAM,CAAC,KAAK,IAAI,MAAM,GAAG,EAAE,OAAO,OAAO;AACxD,eAAW,QAAQ,OAAO;AACxB,UAAI,SAAS,OAAO,SAAS,IAAI;AAC/B,iBAAS,CAAA;AAAA,MACX,OAAO;AACL,cAAM,OAAO,YAAY,IAAI;AAC7B,YAAI,KAAM,QAAO,KAAK,IAAI;AAAA,MAC5B;AAAA,IACF;AACA,WAAO,MAAM,QAAQ,MAAM,CAAC,EAAE;AAAA,EAChC;AAEA,MAAI,OAAO,IAAI,QAAQ;AACrB,UAAM,KAAK,EAAE,MAAM,IAAI,MAAM,IAAI,GAAG,OAAO,OAAO,KAAK,GAAG,EAAA,CAAG;AAAA,EAC/D;AAEA,SAAO;AACT;AAEA,SAAS,YAAY,OAAoC;AACvD,QAAM,MAA8B,CAAA;AACpC,aAAW,QAAQ,MAAM,MAAM,GAAG,GAAG;AACnC,UAAM,CAAC,GAAG,CAAC,IAAI,KAAK,MAAM,GAAG;AAC7B,QAAI,CAAC,KAAK,CAAC,EAAG;AACd,UAAM,MAAM,EAAE,QAAQ,aAAa,CAAC,GAAG,MAAc,EAAE,aAAa;AACpE,QAAI,GAAG,IAAI;AAAA,EACb;AACA,SAAO;AACT;AAQO,SAAS,SAAS,EAAE,MAAM,WAAW,KAAK,SAAwB;AACvE,QAAM,QAAQ,UAAU,IAAI;AAC5B,QAAM,WAAW,MAAM;AAAA,IAAI,CAAC,GAAG,MAC7B,EAAE,QACA,oBAAC,QAAA,EAAa,OAAO,YAAY,EAAE,KAAK,GACrC,UAAA,EAAE,QADM,CAEX,wBAEC,QAAA,EAAc,UAAA,EAAE,QAAN,CAAW;AAAA,EAAA;AAG1B,MAAI,OAAO,OAAQ,QAAO,oBAAC,QAAA,EAAK,WAAuB,UAAS;AAChE,SAAO,oBAAC,OAAA,EAAI,WAAuB,SAAA,CAAS;AAC9C;"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { SyntheticEvent } from 'react';
|
|
2
|
+
import { SizeToken } from '../lib/size';
|
|
3
|
+
export type AvatarVariant = "duotone" | "solid" | "stamp" | "mono";
|
|
4
|
+
export type AvatarKind = "user" | "group";
|
|
5
|
+
export type AvatarProps = {
|
|
6
|
+
src?: string;
|
|
7
|
+
alt: string;
|
|
8
|
+
initials?: string;
|
|
9
|
+
/**
|
|
10
|
+
* Named size token (xs..xl). The rendered px is resolved through the active
|
|
11
|
+
* density (`compact` shrinks, `spacious` grows). Size also drives typographic
|
|
12
|
+
* adjustments: `xs` shows a single initial; `sm` uses a lighter weight so the
|
|
13
|
+
* monogram stays quiet in dense list rows.
|
|
14
|
+
*/
|
|
15
|
+
size?: SizeToken;
|
|
16
|
+
rounded?: "full" | "md";
|
|
17
|
+
kind?: AvatarKind;
|
|
18
|
+
variant?: AvatarVariant;
|
|
19
|
+
title?: string;
|
|
20
|
+
href?: string;
|
|
21
|
+
/**
|
|
22
|
+
* Selects the palette color for the initial-fallback. Defaults to `alt` so
|
|
23
|
+
* repeated rendering of the same identity stays consistent. Pass the full
|
|
24
|
+
* "owner/name" for repo avatars so two repos named "cli" under different
|
|
25
|
+
* orgs render with different colors.
|
|
26
|
+
*/
|
|
27
|
+
colorKey?: string;
|
|
28
|
+
onError?: (e: SyntheticEvent<HTMLImageElement>) => void;
|
|
29
|
+
className?: string;
|
|
30
|
+
};
|
|
31
|
+
export declare function Avatar({ src, alt, initials, size, rounded, kind, variant, title, href, colorKey, onError, className, }: AvatarProps): import("react/jsx-runtime").JSX.Element;
|
|
32
|
+
//# sourceMappingURL=Avatar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Avatar.d.ts","sourceRoot":"","sources":["../../src/data/Avatar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,cAAc,EAAE,MAAM,OAAO,CAAC;AAG3D,OAAO,EAAe,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAG1D,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,CAAC;AACnE,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,OAAO,CAAC;AAE1C,MAAM,MAAM,WAAW,GAAG;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,cAAc,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAsHF,wBAAgB,MAAM,CAAC,EACrB,GAAG,EACH,GAAG,EACH,QAAQ,EACR,IAAW,EACX,OAAO,EACP,IAAa,EACb,OAAmB,EACnB,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,OAAO,EACP,SAAS,GACV,EAAE,WAAW,2CAuFb"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { cn } from "../lib/utils.js";
|
|
3
|
+
import { fnv1a32 } from "../lib/palette.js";
|
|
4
|
+
import { resolveSize } from "../lib/size.js";
|
|
5
|
+
import { useDensityValue } from "../hooks/use-density.js";
|
|
6
|
+
function hueForKey(key) {
|
|
7
|
+
return fnv1a32(key) % 360;
|
|
8
|
+
}
|
|
9
|
+
function resolveInitials(alt, initials, maxLetters) {
|
|
10
|
+
if (initials == null ? void 0 : initials.trim()) {
|
|
11
|
+
return initials.trim().slice(0, maxLetters).toUpperCase();
|
|
12
|
+
}
|
|
13
|
+
const cleaned = alt.replace(/^@/, "").trim();
|
|
14
|
+
const lastSegment = cleaned.split(/[\\/]/).filter(Boolean).at(-1) ?? cleaned;
|
|
15
|
+
const parts = lastSegment.replace(/[^a-zA-Z0-9]+/g, " ").trim().split(/\s+/).filter(Boolean);
|
|
16
|
+
const letters = parts.map((part) => {
|
|
17
|
+
var _a;
|
|
18
|
+
return ((_a = part.match(/[a-zA-Z0-9]/)) == null ? void 0 : _a[0]) ?? "";
|
|
19
|
+
}).filter(Boolean).slice(0, maxLetters).join("");
|
|
20
|
+
if (letters) {
|
|
21
|
+
return letters.toUpperCase();
|
|
22
|
+
}
|
|
23
|
+
const compact = cleaned.replace(/[^a-zA-Z0-9]+/g, "");
|
|
24
|
+
return (compact.slice(0, maxLetters) || "?").toUpperCase();
|
|
25
|
+
}
|
|
26
|
+
function fallbackTone(variant, kind, hue) {
|
|
27
|
+
if (kind === "group") {
|
|
28
|
+
switch (variant) {
|
|
29
|
+
case "solid":
|
|
30
|
+
return {
|
|
31
|
+
background: "#d8d4cc",
|
|
32
|
+
borderColor: "#d8d4cc",
|
|
33
|
+
color: "#5a574e"
|
|
34
|
+
};
|
|
35
|
+
case "stamp":
|
|
36
|
+
return {
|
|
37
|
+
background: "#fafaf7",
|
|
38
|
+
borderColor: "#8d8778",
|
|
39
|
+
color: "#5a574e",
|
|
40
|
+
shadow: "2px 2px 0 rgba(90, 87, 78, 0.08)"
|
|
41
|
+
};
|
|
42
|
+
case "mono":
|
|
43
|
+
return {
|
|
44
|
+
background: "#f5f2eb",
|
|
45
|
+
borderColor: "#8d8778",
|
|
46
|
+
color: "#5a574e"
|
|
47
|
+
};
|
|
48
|
+
case "duotone":
|
|
49
|
+
default:
|
|
50
|
+
return {
|
|
51
|
+
background: "#f0ede6",
|
|
52
|
+
borderColor: "#b8b3a7",
|
|
53
|
+
borderStyle: "dashed",
|
|
54
|
+
color: "#5a574e"
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
switch (variant) {
|
|
59
|
+
case "solid":
|
|
60
|
+
return {
|
|
61
|
+
background: `oklch(0.55 0.12 ${hue})`,
|
|
62
|
+
borderColor: `oklch(0.55 0.12 ${hue})`,
|
|
63
|
+
color: "#fff"
|
|
64
|
+
};
|
|
65
|
+
case "stamp":
|
|
66
|
+
return {
|
|
67
|
+
background: "#fafaf7",
|
|
68
|
+
borderColor: `oklch(0.42 0.15 ${hue})`,
|
|
69
|
+
color: `oklch(0.42 0.15 ${hue})`,
|
|
70
|
+
shadow: "2px 2px 0 rgba(26, 26, 26, 0.08)"
|
|
71
|
+
};
|
|
72
|
+
case "mono":
|
|
73
|
+
return {
|
|
74
|
+
background: "#fff",
|
|
75
|
+
borderColor: "#1a1a1a",
|
|
76
|
+
color: "#1a1a1a"
|
|
77
|
+
};
|
|
78
|
+
case "duotone":
|
|
79
|
+
default:
|
|
80
|
+
return {
|
|
81
|
+
background: `oklch(0.93 0.04 ${hue})`,
|
|
82
|
+
borderColor: `oklch(0.55 0.14 ${hue} / 0.25)`,
|
|
83
|
+
color: `oklch(0.35 0.14 ${hue})`
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
function fontSizeFor(variant, size) {
|
|
88
|
+
const minimum = size <= 16 ? 7 : size <= 20 ? 8 : 9;
|
|
89
|
+
switch (variant) {
|
|
90
|
+
case "stamp":
|
|
91
|
+
return Math.max(minimum, Math.round(size * 0.34));
|
|
92
|
+
case "mono":
|
|
93
|
+
return Math.max(minimum, Math.round(size * 0.36));
|
|
94
|
+
case "solid":
|
|
95
|
+
case "duotone":
|
|
96
|
+
default:
|
|
97
|
+
return Math.max(minimum, Math.round(size * 0.38));
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
function Avatar({
|
|
101
|
+
src,
|
|
102
|
+
alt,
|
|
103
|
+
initials,
|
|
104
|
+
size = "sm",
|
|
105
|
+
rounded,
|
|
106
|
+
kind = "user",
|
|
107
|
+
variant = "duotone",
|
|
108
|
+
title,
|
|
109
|
+
href,
|
|
110
|
+
colorKey,
|
|
111
|
+
onError,
|
|
112
|
+
className
|
|
113
|
+
}) {
|
|
114
|
+
const density = useDensityValue();
|
|
115
|
+
const px = resolveSize(size, density);
|
|
116
|
+
const effectiveRounded = rounded ?? (kind === "group" ? "md" : "full");
|
|
117
|
+
const shape = effectiveRounded === "full" ? "rounded-full" : "rounded-md";
|
|
118
|
+
const key = colorKey ?? alt;
|
|
119
|
+
const hue = hueForKey(key);
|
|
120
|
+
const tone = fallbackTone(variant, kind, hue);
|
|
121
|
+
const maxLetters = size === "xs" || size === "sm" ? 1 : 2;
|
|
122
|
+
const text = resolveInitials(alt, initials, maxLetters);
|
|
123
|
+
const base = cn(
|
|
124
|
+
"inline-flex shrink-0 select-none items-center justify-center overflow-hidden border",
|
|
125
|
+
shape
|
|
126
|
+
);
|
|
127
|
+
const frameStyle = {
|
|
128
|
+
width: px,
|
|
129
|
+
height: px,
|
|
130
|
+
borderColor: tone.borderColor,
|
|
131
|
+
borderStyle: tone.borderStyle ?? "solid"
|
|
132
|
+
};
|
|
133
|
+
if (variant === "stamp") {
|
|
134
|
+
frameStyle.transform = "rotate(-4deg)";
|
|
135
|
+
frameStyle.boxShadow = tone.shadow;
|
|
136
|
+
}
|
|
137
|
+
const weightFor = (v) => {
|
|
138
|
+
if (v === "stamp") return 700;
|
|
139
|
+
if (size === "sm") return 500;
|
|
140
|
+
return 600;
|
|
141
|
+
};
|
|
142
|
+
const content = src ? /* @__PURE__ */ jsx(
|
|
143
|
+
"img",
|
|
144
|
+
{
|
|
145
|
+
src,
|
|
146
|
+
alt,
|
|
147
|
+
title: title ?? alt,
|
|
148
|
+
width: px,
|
|
149
|
+
height: px,
|
|
150
|
+
"data-avatar-kind": kind,
|
|
151
|
+
"data-avatar-variant": variant,
|
|
152
|
+
"data-avatar-size": size,
|
|
153
|
+
className: cn(base, "bg-muted object-cover", className),
|
|
154
|
+
style: frameStyle,
|
|
155
|
+
loading: "lazy",
|
|
156
|
+
onError
|
|
157
|
+
}
|
|
158
|
+
) : /* @__PURE__ */ jsx(
|
|
159
|
+
"span",
|
|
160
|
+
{
|
|
161
|
+
role: "img",
|
|
162
|
+
"aria-label": alt,
|
|
163
|
+
"data-avatar-kind": kind,
|
|
164
|
+
"data-avatar-variant": variant,
|
|
165
|
+
"data-avatar-size": size,
|
|
166
|
+
className: cn(
|
|
167
|
+
base,
|
|
168
|
+
variant === "mono" || variant === "stamp" ? "font-mono" : void 0,
|
|
169
|
+
variant === "mono" ? "tracking-[-0.05em]" : "tracking-[-0.02em]",
|
|
170
|
+
className
|
|
171
|
+
),
|
|
172
|
+
style: {
|
|
173
|
+
...frameStyle,
|
|
174
|
+
background: tone.background,
|
|
175
|
+
color: tone.color,
|
|
176
|
+
fontSize: fontSizeFor(variant, px),
|
|
177
|
+
fontWeight: weightFor(variant)
|
|
178
|
+
},
|
|
179
|
+
title: title ?? alt,
|
|
180
|
+
children: text
|
|
181
|
+
}
|
|
182
|
+
);
|
|
183
|
+
if (href) {
|
|
184
|
+
return /* @__PURE__ */ jsx(
|
|
185
|
+
"a",
|
|
186
|
+
{
|
|
187
|
+
href,
|
|
188
|
+
target: "_blank",
|
|
189
|
+
rel: "noopener noreferrer",
|
|
190
|
+
className: "inline-flex shrink-0",
|
|
191
|
+
onClick: (e) => e.stopPropagation(),
|
|
192
|
+
children: content
|
|
193
|
+
}
|
|
194
|
+
);
|
|
195
|
+
}
|
|
196
|
+
return content;
|
|
197
|
+
}
|
|
198
|
+
export {
|
|
199
|
+
Avatar
|
|
200
|
+
};
|
|
201
|
+
//# sourceMappingURL=Avatar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Avatar.js","sources":["../../src/data/Avatar.tsx"],"sourcesContent":["import type { CSSProperties, SyntheticEvent } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { fnv1a32 } from \"../lib/palette\";\nimport { resolveSize, type SizeToken } from \"../lib/size\";\nimport { useDensityValue } from \"../hooks/use-density\";\n\nexport type AvatarVariant = \"duotone\" | \"solid\" | \"stamp\" | \"mono\";\nexport type AvatarKind = \"user\" | \"group\";\n\nexport type AvatarProps = {\n src?: string;\n alt: string;\n initials?: string;\n /**\n * Named size token (xs..xl). The rendered px is resolved through the active\n * density (`compact` shrinks, `spacious` grows). Size also drives typographic\n * adjustments: `xs` shows a single initial; `sm` uses a lighter weight so the\n * monogram stays quiet in dense list rows.\n */\n size?: SizeToken;\n rounded?: \"full\" | \"md\";\n kind?: AvatarKind;\n variant?: AvatarVariant;\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\ntype AvatarTone = {\n background: string;\n borderColor: string;\n borderStyle?: CSSProperties[\"borderStyle\"];\n color: string;\n shadow?: string;\n};\n\nfunction hueForKey(key: string): number {\n return fnv1a32(key) % 360;\n}\n\nfunction resolveInitials(alt: string, initials: string | undefined, maxLetters: number): string {\n if (initials?.trim()) {\n return initials.trim().slice(0, maxLetters).toUpperCase();\n }\n\n const cleaned = alt.replace(/^@/, \"\").trim();\n const lastSegment = cleaned.split(/[\\\\/]/).filter(Boolean).at(-1) ?? cleaned;\n const parts = lastSegment\n .replace(/[^a-zA-Z0-9]+/g, \" \")\n .trim()\n .split(/\\s+/)\n .filter(Boolean);\n const letters = parts\n .map((part) => part.match(/[a-zA-Z0-9]/)?.[0] ?? \"\")\n .filter(Boolean)\n .slice(0, maxLetters)\n .join(\"\");\n\n if (letters) {\n return letters.toUpperCase();\n }\n\n const compact = cleaned.replace(/[^a-zA-Z0-9]+/g, \"\");\n return (compact.slice(0, maxLetters) || \"?\").toUpperCase();\n}\n\nfunction fallbackTone(variant: AvatarVariant, kind: AvatarKind, hue: number): AvatarTone {\n if (kind === \"group\") {\n switch (variant) {\n case \"solid\":\n return {\n background: \"#d8d4cc\",\n borderColor: \"#d8d4cc\",\n color: \"#5a574e\",\n };\n case \"stamp\":\n return {\n background: \"#fafaf7\",\n borderColor: \"#8d8778\",\n color: \"#5a574e\",\n shadow: \"2px 2px 0 rgba(90, 87, 78, 0.08)\",\n };\n case \"mono\":\n return {\n background: \"#f5f2eb\",\n borderColor: \"#8d8778\",\n color: \"#5a574e\",\n };\n case \"duotone\":\n default:\n return {\n background: \"#f0ede6\",\n borderColor: \"#b8b3a7\",\n borderStyle: \"dashed\",\n color: \"#5a574e\",\n };\n }\n }\n\n switch (variant) {\n case \"solid\":\n return {\n background: `oklch(0.55 0.12 ${hue})`,\n borderColor: `oklch(0.55 0.12 ${hue})`,\n color: \"#fff\",\n };\n case \"stamp\":\n return {\n background: \"#fafaf7\",\n borderColor: `oklch(0.42 0.15 ${hue})`,\n color: `oklch(0.42 0.15 ${hue})`,\n shadow: \"2px 2px 0 rgba(26, 26, 26, 0.08)\",\n };\n case \"mono\":\n return {\n background: \"#fff\",\n borderColor: \"#1a1a1a\",\n color: \"#1a1a1a\",\n };\n case \"duotone\":\n default:\n return {\n background: `oklch(0.93 0.04 ${hue})`,\n borderColor: `oklch(0.55 0.14 ${hue} / 0.25)`,\n color: `oklch(0.35 0.14 ${hue})`,\n };\n }\n}\n\nfunction fontSizeFor(variant: AvatarVariant, size: number): number {\n const minimum = size <= 16 ? 7 : size <= 20 ? 8 : 9;\n\n switch (variant) {\n case \"stamp\":\n return Math.max(minimum, Math.round(size * 0.34));\n case \"mono\":\n return Math.max(minimum, Math.round(size * 0.36));\n case \"solid\":\n case \"duotone\":\n default:\n return Math.max(minimum, Math.round(size * 0.38));\n }\n}\n\nexport function Avatar({\n src,\n alt,\n initials,\n size = \"sm\",\n rounded,\n kind = \"user\",\n variant = \"duotone\",\n title,\n href,\n colorKey,\n onError,\n className,\n}: AvatarProps) {\n const density = useDensityValue();\n const px = resolveSize(size, density);\n const effectiveRounded = rounded ?? (kind === \"group\" ? \"md\" : \"full\");\n const shape = effectiveRounded === \"full\" ? \"rounded-full\" : \"rounded-md\";\n const key = colorKey ?? alt;\n const hue = hueForKey(key);\n const tone = fallbackTone(variant, kind, hue);\n const maxLetters = size === \"xs\" || size === \"sm\" ? 1 : 2;\n const text = resolveInitials(alt, initials, maxLetters);\n const base = cn(\n \"inline-flex shrink-0 select-none items-center justify-center overflow-hidden border\",\n shape,\n );\n const frameStyle: CSSProperties = {\n width: px,\n height: px,\n borderColor: tone.borderColor,\n borderStyle: tone.borderStyle ?? \"solid\",\n };\n\n if (variant === \"stamp\") {\n frameStyle.transform = \"rotate(-4deg)\";\n frameStyle.boxShadow = tone.shadow;\n }\n\n const weightFor = (v: AvatarVariant): number => {\n if (v === \"stamp\") return 700;\n if (size === \"sm\") return 500;\n return 600;\n };\n\n const content = src ? (\n <img\n src={src}\n alt={alt}\n title={title ?? alt}\n width={px}\n height={px}\n data-avatar-kind={kind}\n data-avatar-variant={variant}\n data-avatar-size={size}\n className={cn(base, \"bg-muted object-cover\", className)}\n style={frameStyle}\n loading=\"lazy\"\n onError={onError}\n />\n ) : (\n <span\n role=\"img\"\n aria-label={alt}\n data-avatar-kind={kind}\n data-avatar-variant={variant}\n data-avatar-size={size}\n className={cn(\n base,\n variant === \"mono\" || variant === \"stamp\" ? \"font-mono\" : undefined,\n variant === \"mono\" ? \"tracking-[-0.05em]\" : \"tracking-[-0.02em]\",\n className,\n )}\n style={{\n ...frameStyle,\n background: tone.background,\n color: tone.color,\n fontSize: fontSizeFor(variant, px),\n fontWeight: weightFor(variant),\n }}\n title={title ?? alt}\n >\n {text}\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"],"names":[],"mappings":";;;;;AA4CA,SAAS,UAAU,KAAqB;AACtC,SAAO,QAAQ,GAAG,IAAI;AACxB;AAEA,SAAS,gBAAgB,KAAa,UAA8B,YAA4B;AAC9F,MAAI,qCAAU,QAAQ;AACpB,WAAO,SAAS,OAAO,MAAM,GAAG,UAAU,EAAE,YAAA;AAAA,EAC9C;AAEA,QAAM,UAAU,IAAI,QAAQ,MAAM,EAAE,EAAE,KAAA;AACtC,QAAM,cAAc,QAAQ,MAAM,OAAO,EAAE,OAAO,OAAO,EAAE,GAAG,EAAE,KAAK;AACrE,QAAM,QAAQ,YACX,QAAQ,kBAAkB,GAAG,EAC7B,KAAA,EACA,MAAM,KAAK,EACX,OAAO,OAAO;AACjB,QAAM,UAAU,MACb,IAAI,CAAC;;AAAS,uBAAK,MAAM,aAAa,MAAxB,mBAA4B,OAAM;AAAA,GAAE,EAClD,OAAO,OAAO,EACd,MAAM,GAAG,UAAU,EACnB,KAAK,EAAE;AAEV,MAAI,SAAS;AACX,WAAO,QAAQ,YAAA;AAAA,EACjB;AAEA,QAAM,UAAU,QAAQ,QAAQ,kBAAkB,EAAE;AACpD,UAAQ,QAAQ,MAAM,GAAG,UAAU,KAAK,KAAK,YAAA;AAC/C;AAEA,SAAS,aAAa,SAAwB,MAAkB,KAAyB;AACvF,MAAI,SAAS,SAAS;AACpB,YAAQ,SAAA;AAAA,MACN,KAAK;AACH,eAAO;AAAA,UACL,YAAY;AAAA,UACZ,aAAa;AAAA,UACb,OAAO;AAAA,QAAA;AAAA,MAEX,KAAK;AACH,eAAO;AAAA,UACL,YAAY;AAAA,UACZ,aAAa;AAAA,UACb,OAAO;AAAA,UACP,QAAQ;AAAA,QAAA;AAAA,MAEZ,KAAK;AACH,eAAO;AAAA,UACL,YAAY;AAAA,UACZ,aAAa;AAAA,UACb,OAAO;AAAA,QAAA;AAAA,MAEX,KAAK;AAAA,MACL;AACE,eAAO;AAAA,UACL,YAAY;AAAA,UACZ,aAAa;AAAA,UACb,aAAa;AAAA,UACb,OAAO;AAAA,QAAA;AAAA,IACT;AAAA,EAEN;AAEA,UAAQ,SAAA;AAAA,IACN,KAAK;AACH,aAAO;AAAA,QACL,YAAY,mBAAmB,GAAG;AAAA,QAClC,aAAa,mBAAmB,GAAG;AAAA,QACnC,OAAO;AAAA,MAAA;AAAA,IAEX,KAAK;AACH,aAAO;AAAA,QACL,YAAY;AAAA,QACZ,aAAa,mBAAmB,GAAG;AAAA,QACnC,OAAO,mBAAmB,GAAG;AAAA,QAC7B,QAAQ;AAAA,MAAA;AAAA,IAEZ,KAAK;AACH,aAAO;AAAA,QACL,YAAY;AAAA,QACZ,aAAa;AAAA,QACb,OAAO;AAAA,MAAA;AAAA,IAEX,KAAK;AAAA,IACL;AACE,aAAO;AAAA,QACL,YAAY,mBAAmB,GAAG;AAAA,QAClC,aAAa,mBAAmB,GAAG;AAAA,QACnC,OAAO,mBAAmB,GAAG;AAAA,MAAA;AAAA,EAC/B;AAEN;AAEA,SAAS,YAAY,SAAwB,MAAsB;AACjE,QAAM,UAAU,QAAQ,KAAK,IAAI,QAAQ,KAAK,IAAI;AAElD,UAAQ,SAAA;AAAA,IACN,KAAK;AACH,aAAO,KAAK,IAAI,SAAS,KAAK,MAAM,OAAO,IAAI,CAAC;AAAA,IAClD,KAAK;AACH,aAAO,KAAK,IAAI,SAAS,KAAK,MAAM,OAAO,IAAI,CAAC;AAAA,IAClD,KAAK;AAAA,IACL,KAAK;AAAA,IACL;AACE,aAAO,KAAK,IAAI,SAAS,KAAK,MAAM,OAAO,IAAI,CAAC;AAAA,EAAA;AAEtD;AAEO,SAAS,OAAO;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA,OAAO;AAAA,EACP,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAgB;AACd,QAAM,UAAU,gBAAA;AAChB,QAAM,KAAK,YAAY,MAAM,OAAO;AACpC,QAAM,mBAAmB,YAAY,SAAS,UAAU,OAAO;AAC/D,QAAM,QAAQ,qBAAqB,SAAS,iBAAiB;AAC7D,QAAM,MAAM,YAAY;AACxB,QAAM,MAAM,UAAU,GAAG;AACzB,QAAM,OAAO,aAAa,SAAS,MAAM,GAAG;AAC5C,QAAM,aAAa,SAAS,QAAQ,SAAS,OAAO,IAAI;AACxD,QAAM,OAAO,gBAAgB,KAAK,UAAU,UAAU;AACtD,QAAM,OAAO;AAAA,IACX;AAAA,IACA;AAAA,EAAA;AAEF,QAAM,aAA4B;AAAA,IAChC,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,aAAa,KAAK;AAAA,IAClB,aAAa,KAAK,eAAe;AAAA,EAAA;AAGnC,MAAI,YAAY,SAAS;AACvB,eAAW,YAAY;AACvB,eAAW,YAAY,KAAK;AAAA,EAC9B;AAEA,QAAM,YAAY,CAAC,MAA6B;AAC9C,QAAI,MAAM,QAAS,QAAO;AAC1B,QAAI,SAAS,KAAM,QAAO;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,MACd;AAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,OAAO,SAAS;AAAA,MAChB,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,oBAAkB;AAAA,MAClB,uBAAqB;AAAA,MACrB,oBAAkB;AAAA,MAClB,WAAW,GAAG,MAAM,yBAAyB,SAAS;AAAA,MACtD,OAAO;AAAA,MACP,SAAQ;AAAA,MACR;AAAA,IAAA;AAAA,EAAA,IAGF;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,cAAY;AAAA,MACZ,oBAAkB;AAAA,MAClB,uBAAqB;AAAA,MACrB,oBAAkB;AAAA,MAClB,WAAW;AAAA,QACT;AAAA,QACA,YAAY,UAAU,YAAY,UAAU,cAAc;AAAA,QAC1D,YAAY,SAAS,uBAAuB;AAAA,QAC5C;AAAA,MAAA;AAAA,MAEF,OAAO;AAAA,QACL,GAAG;AAAA,QACH,YAAY,KAAK;AAAA,QACjB,OAAO,KAAK;AAAA,QACZ,UAAU,YAAY,SAAS,EAAE;AAAA,QACjC,YAAY,UAAU,OAAO;AAAA,MAAA;AAAA,MAE/B,OAAO,SAAS;AAAA,MAEf,UAAA;AAAA,IAAA;AAAA,EAAA;AAIL,MAAI,MAAM;AACR,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA,QAAO;AAAA,QACP,KAAI;AAAA,QACJ,WAAU;AAAA,QACV,SAAS,CAAC,MAAM,EAAE,gBAAA;AAAA,QAEjB,UAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAGP;AACA,SAAO;AACT;"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { CSSProperties, ReactNode } from 'react';
|
|
2
|
+
import { AvatarKind, AvatarVariant } from './Avatar';
|
|
3
|
+
import { IconTone } from './Icon';
|
|
4
|
+
import { SizeToken } from '../lib/size';
|
|
5
|
+
export type AvatarBadgeProps = {
|
|
6
|
+
alt: string;
|
|
7
|
+
label?: ReactNode;
|
|
8
|
+
initials?: string;
|
|
9
|
+
avatarKind?: AvatarKind;
|
|
10
|
+
avatarVariant?: AvatarVariant;
|
|
11
|
+
size?: SizeToken;
|
|
12
|
+
title?: string;
|
|
13
|
+
statusIcon?: string;
|
|
14
|
+
statusTone?: IconTone;
|
|
15
|
+
statusTitle?: string;
|
|
16
|
+
comment?: ReactNode;
|
|
17
|
+
borderColor?: string;
|
|
18
|
+
className?: string;
|
|
19
|
+
badgeClassName?: string;
|
|
20
|
+
labelClassName?: string;
|
|
21
|
+
commentClassName?: string;
|
|
22
|
+
style?: CSSProperties;
|
|
23
|
+
badgeStyle?: CSSProperties;
|
|
24
|
+
};
|
|
25
|
+
export declare function AvatarBadge({ alt, label, initials, avatarKind, avatarVariant, size, title, statusIcon, statusTone, statusTitle, comment, borderColor, className, badgeClassName, labelClassName, commentClassName, style, badgeStyle, }: AvatarBadgeProps): import("react/jsx-runtime").JSX.Element;
|
|
26
|
+
//# sourceMappingURL=AvatarBadge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AvatarBadge.d.ts","sourceRoot":"","sources":["../../src/data/AvatarBadge.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACtD,OAAO,EAAU,KAAK,UAAU,EAAE,KAAK,aAAa,EAAE,MAAM,UAAU,CAAC;AACvE,OAAO,EAAQ,KAAK,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAE7C,OAAO,EAAe,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAG1D,MAAM,MAAM,gBAAgB,GAAG;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,QAAQ,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,UAAU,CAAC,EAAE,aAAa,CAAC;CAC5B,CAAC;AAEF,wBAAgB,WAAW,CAAC,EAC1B,GAAG,EACH,KAAW,EACX,QAAQ,EACR,UAAmB,EACnB,aAAyB,EACzB,IAAW,EACX,KAAK,EACL,UAAU,EACV,UAAsB,EACtB,WAAW,EACX,OAAO,EACP,WAAW,EACX,SAAS,EACT,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,KAAK,EACL,UAAU,GACX,EAAE,gBAAgB,2CA+DlB"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Avatar } from "./Avatar.js";
|
|
3
|
+
import { Icon } from "./Icon.js";
|
|
4
|
+
import { cn } from "../lib/utils.js";
|
|
5
|
+
import { resolveSize } from "../lib/size.js";
|
|
6
|
+
import { useDensityValue } from "../hooks/use-density.js";
|
|
7
|
+
function AvatarBadge({
|
|
8
|
+
alt,
|
|
9
|
+
label = alt,
|
|
10
|
+
initials,
|
|
11
|
+
avatarKind = "user",
|
|
12
|
+
avatarVariant = "duotone",
|
|
13
|
+
size = "lg",
|
|
14
|
+
title,
|
|
15
|
+
statusIcon,
|
|
16
|
+
statusTone = "neutral",
|
|
17
|
+
statusTitle,
|
|
18
|
+
comment,
|
|
19
|
+
borderColor,
|
|
20
|
+
className,
|
|
21
|
+
badgeClassName,
|
|
22
|
+
labelClassName,
|
|
23
|
+
commentClassName,
|
|
24
|
+
style,
|
|
25
|
+
badgeStyle
|
|
26
|
+
}) {
|
|
27
|
+
const density = useDensityValue();
|
|
28
|
+
const px = resolveSize(size, density);
|
|
29
|
+
return /* @__PURE__ */ jsxs(
|
|
30
|
+
"span",
|
|
31
|
+
{
|
|
32
|
+
className: cn("inline-flex max-w-[50ch] min-w-0 flex-col items-start", className),
|
|
33
|
+
style,
|
|
34
|
+
children: [
|
|
35
|
+
/* @__PURE__ */ jsxs(
|
|
36
|
+
"span",
|
|
37
|
+
{
|
|
38
|
+
className: cn(
|
|
39
|
+
"inline-flex max-w-[40ch] min-w-0 items-center gap-2 overflow-visible rounded-full border bg-background shadow-sm",
|
|
40
|
+
badgeClassName
|
|
41
|
+
),
|
|
42
|
+
style: {
|
|
43
|
+
height: px,
|
|
44
|
+
borderColor,
|
|
45
|
+
...badgeStyle
|
|
46
|
+
},
|
|
47
|
+
children: [
|
|
48
|
+
/* @__PURE__ */ jsx(
|
|
49
|
+
Avatar,
|
|
50
|
+
{
|
|
51
|
+
alt,
|
|
52
|
+
kind: avatarKind,
|
|
53
|
+
size,
|
|
54
|
+
title: title ?? alt,
|
|
55
|
+
variant: avatarVariant,
|
|
56
|
+
className: "relative z-10 -ml-px shrink-0",
|
|
57
|
+
...initials !== void 0 ? { initials } : {}
|
|
58
|
+
}
|
|
59
|
+
),
|
|
60
|
+
/* @__PURE__ */ jsx(
|
|
61
|
+
"span",
|
|
62
|
+
{
|
|
63
|
+
className: cn(
|
|
64
|
+
"min-w-0 flex-1 truncate font-medium leading-none text-foreground",
|
|
65
|
+
labelClassName
|
|
66
|
+
),
|
|
67
|
+
style: { fontSize: Math.max(11, Math.round(px * 0.32)) },
|
|
68
|
+
title: typeof label === "string" ? label : title ?? alt,
|
|
69
|
+
children: label
|
|
70
|
+
}
|
|
71
|
+
),
|
|
72
|
+
statusIcon && /* @__PURE__ */ jsx(
|
|
73
|
+
Icon,
|
|
74
|
+
{
|
|
75
|
+
name: statusIcon,
|
|
76
|
+
style: "badge",
|
|
77
|
+
size,
|
|
78
|
+
tone: statusTone,
|
|
79
|
+
className: "relative z-10 -mr-px shrink-0",
|
|
80
|
+
...statusTitle !== void 0 ? { title: statusTitle } : {}
|
|
81
|
+
}
|
|
82
|
+
)
|
|
83
|
+
]
|
|
84
|
+
}
|
|
85
|
+
),
|
|
86
|
+
comment && /* @__PURE__ */ jsx(
|
|
87
|
+
"span",
|
|
88
|
+
{
|
|
89
|
+
className: cn(
|
|
90
|
+
"mt-1 max-w-[50ch] overflow-hidden text-xs leading-snug text-muted-foreground [display:-webkit-box] [-webkit-box-orient:vertical] [-webkit-line-clamp:3]",
|
|
91
|
+
commentClassName
|
|
92
|
+
),
|
|
93
|
+
title: typeof comment === "string" ? comment : void 0,
|
|
94
|
+
children: comment
|
|
95
|
+
}
|
|
96
|
+
)
|
|
97
|
+
]
|
|
98
|
+
}
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
export {
|
|
102
|
+
AvatarBadge
|
|
103
|
+
};
|
|
104
|
+
//# sourceMappingURL=AvatarBadge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AvatarBadge.js","sources":["../../src/data/AvatarBadge.tsx"],"sourcesContent":["import type { CSSProperties, ReactNode } from \"react\";\nimport { Avatar, type AvatarKind, type AvatarVariant } from \"./Avatar\";\nimport { Icon, type IconTone } from \"./Icon\";\nimport { cn } from \"../lib/utils\";\nimport { resolveSize, type SizeToken } from \"../lib/size\";\nimport { useDensityValue } from \"../hooks/use-density\";\n\nexport type AvatarBadgeProps = {\n alt: string;\n label?: ReactNode;\n initials?: string;\n avatarKind?: AvatarKind;\n avatarVariant?: AvatarVariant;\n size?: SizeToken;\n title?: string;\n statusIcon?: string;\n statusTone?: IconTone;\n statusTitle?: string;\n comment?: ReactNode;\n borderColor?: string;\n className?: string;\n badgeClassName?: string;\n labelClassName?: string;\n commentClassName?: string;\n style?: CSSProperties;\n badgeStyle?: CSSProperties;\n};\n\nexport function AvatarBadge({\n alt,\n label = alt,\n initials,\n avatarKind = \"user\",\n avatarVariant = \"duotone\",\n size = \"lg\",\n title,\n statusIcon,\n statusTone = \"neutral\",\n statusTitle,\n comment,\n borderColor,\n className,\n badgeClassName,\n labelClassName,\n commentClassName,\n style,\n badgeStyle,\n}: AvatarBadgeProps) {\n const density = useDensityValue();\n const px = resolveSize(size, density);\n\n return (\n <span\n className={cn(\"inline-flex max-w-[50ch] min-w-0 flex-col items-start\", className)}\n style={style}\n >\n <span\n className={cn(\n \"inline-flex max-w-[40ch] min-w-0 items-center gap-2 overflow-visible rounded-full border bg-background shadow-sm\",\n badgeClassName,\n )}\n style={{\n height: px,\n borderColor,\n ...badgeStyle,\n }}\n >\n <Avatar\n alt={alt}\n kind={avatarKind}\n size={size}\n title={title ?? alt}\n variant={avatarVariant}\n className=\"relative z-10 -ml-px shrink-0\"\n {...(initials !== undefined ? { initials } : {})}\n />\n <span\n className={cn(\n \"min-w-0 flex-1 truncate font-medium leading-none text-foreground\",\n labelClassName,\n )}\n style={{ fontSize: Math.max(11, Math.round(px * 0.32)) }}\n title={typeof label === \"string\" ? label : (title ?? alt)}\n >\n {label}\n </span>\n {statusIcon && (\n <Icon\n name={statusIcon}\n style=\"badge\"\n size={size}\n tone={statusTone}\n className=\"relative z-10 -mr-px shrink-0\"\n {...(statusTitle !== undefined ? { title: statusTitle } : {})}\n />\n )}\n </span>\n {comment && (\n <span\n className={cn(\n \"mt-1 max-w-[50ch] overflow-hidden text-xs leading-snug text-muted-foreground [display:-webkit-box] [-webkit-box-orient:vertical] [-webkit-line-clamp:3]\",\n commentClassName,\n )}\n title={typeof comment === \"string\" ? comment : undefined}\n >\n {comment}\n </span>\n )}\n </span>\n );\n}\n"],"names":[],"mappings":";;;;;;AA4BO,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAqB;AACnB,QAAM,UAAU,gBAAA;AAChB,QAAM,KAAK,YAAY,MAAM,OAAO;AAEpC,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,GAAG,yDAAyD,SAAS;AAAA,MAChF;AAAA,MAEA,UAAA;AAAA,QAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA;AAAA,YAAA;AAAA,YAEF,OAAO;AAAA,cACL,QAAQ;AAAA,cACR;AAAA,cACA,GAAG;AAAA,YAAA;AAAA,YAGL,UAAA;AAAA,cAAA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC;AAAA,kBACA,MAAM;AAAA,kBACN;AAAA,kBACA,OAAO,SAAS;AAAA,kBAChB,SAAS;AAAA,kBACT,WAAU;AAAA,kBACT,GAAI,aAAa,SAAY,EAAE,aAAa,CAAA;AAAA,gBAAC;AAAA,cAAA;AAAA,cAEhD;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,WAAW;AAAA,oBACT;AAAA,oBACA;AAAA,kBAAA;AAAA,kBAEF,OAAO,EAAE,UAAU,KAAK,IAAI,IAAI,KAAK,MAAM,KAAK,IAAI,CAAC,EAAA;AAAA,kBACrD,OAAO,OAAO,UAAU,WAAW,QAAS,SAAS;AAAA,kBAEpD,UAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,cAEF,cACC;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,MAAM;AAAA,kBACN,OAAM;AAAA,kBACN;AAAA,kBACA,MAAM;AAAA,kBACN,WAAU;AAAA,kBACT,GAAI,gBAAgB,SAAY,EAAE,OAAO,YAAA,IAAgB,CAAA;AAAA,gBAAC;AAAA,cAAA;AAAA,YAC7D;AAAA,UAAA;AAAA,QAAA;AAAA,QAGH,WACC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA;AAAA,YAAA;AAAA,YAEF,OAAO,OAAO,YAAY,WAAW,UAAU;AAAA,YAE9C,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MACH;AAAA,IAAA;AAAA,EAAA;AAIR;"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { AnchorHTMLAttributes, ReactNode } from 'react';
|
|
2
|
+
import { VariantProps } from 'class-variance-authority';
|
|
3
|
+
export declare const badgeVariants: (props?: ({
|
|
4
|
+
tone?: "neutral" | "danger" | "warning" | "success" | "info" | null | undefined;
|
|
5
|
+
variant?: "outline" | "solid" | "soft" | null | undefined;
|
|
6
|
+
size?: "xs" | "sm" | "md" | "lg" | "xxs" | null | undefined;
|
|
7
|
+
} & import('class-variance-authority/types').ClassProp) | undefined) => string;
|
|
8
|
+
type LegacyBadgeVariantProps = VariantProps<typeof badgeVariants>;
|
|
9
|
+
export type BadgeTone = NonNullable<LegacyBadgeVariantProps["tone"]>;
|
|
10
|
+
export type LegacyBadgeVariant = NonNullable<LegacyBadgeVariantProps["variant"]>;
|
|
11
|
+
export type BadgeSize = NonNullable<LegacyBadgeVariantProps["size"]>;
|
|
12
|
+
export type BadgeStatus = "success" | "error" | "warning" | "info";
|
|
13
|
+
export type BadgeShape = "pill" | "rounded" | "square";
|
|
14
|
+
export type BadgeTruncate = "prefix" | "suffix" | "arn" | "image" | "path" | "url" | "auto";
|
|
15
|
+
export type RichBadgeVariant = "status" | "metric" | "custom" | "outlined" | "label";
|
|
16
|
+
export type BadgeVariant = LegacyBadgeVariant | RichBadgeVariant;
|
|
17
|
+
export type BadgeProps = {
|
|
18
|
+
tone?: BadgeTone;
|
|
19
|
+
variant?: BadgeVariant;
|
|
20
|
+
size?: BadgeSize;
|
|
21
|
+
icon?: string;
|
|
22
|
+
count?: number;
|
|
23
|
+
children?: ReactNode;
|
|
24
|
+
className?: string;
|
|
25
|
+
status?: BadgeStatus;
|
|
26
|
+
label?: ReactNode;
|
|
27
|
+
value?: ReactNode;
|
|
28
|
+
color?: string;
|
|
29
|
+
textColor?: string;
|
|
30
|
+
borderColor?: string;
|
|
31
|
+
shape?: BadgeShape;
|
|
32
|
+
href?: string;
|
|
33
|
+
target?: AnchorHTMLAttributes<HTMLAnchorElement>["target"];
|
|
34
|
+
rel?: string;
|
|
35
|
+
wrap?: boolean;
|
|
36
|
+
maxWidth?: string | number;
|
|
37
|
+
truncate?: BadgeTruncate;
|
|
38
|
+
clickToCopy?: boolean;
|
|
39
|
+
labelClassName?: string;
|
|
40
|
+
valueClassName?: string;
|
|
41
|
+
};
|
|
42
|
+
export declare function Badge({ tone, variant, size, icon, count, children, className, status, label, value, color, textColor, borderColor, shape, href, target, rel, wrap, maxWidth, truncate, clickToCopy, labelClassName, valueClassName, }: BadgeProps): import("react/jsx-runtime").JSX.Element | null;
|
|
43
|
+
export {};
|
|
44
|
+
//# sourceMappingURL=Badge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Badge.d.ts","sourceRoot":"","sources":["../../src/data/Badge.tsx"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,oBAAoB,EAEzB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAIlE,eAAO,MAAM,aAAa;;;;8EAmFzB,CAAC;AAEF,KAAK,uBAAuB,GAAG,YAAY,CAAC,OAAO,aAAa,CAAC,CAAC;AAElE,MAAM,MAAM,SAAS,GAAG,WAAW,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC,CAAC;AACrE,MAAM,MAAM,kBAAkB,GAAG,WAAW,CAAC,uBAAuB,CAAC,SAAS,CAAC,CAAC,CAAC;AACjF,MAAM,MAAM,SAAS,GAAG,WAAW,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC,CAAC;AACrE,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;AACnE,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;AACvD,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,QAAQ,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;AAC5F,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAC;AACrF,MAAM,MAAM,YAAY,GAAG,kBAAkB,GAAG,gBAAgB,CAAC;AAiFjE,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,oBAAoB,CAAC,iBAAiB,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC3D,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAgbF,wBAAgB,KAAK,CAAC,EACpB,IAAI,EACJ,OAAO,EACP,IAAW,EACX,IAAI,EACJ,KAAK,EACL,QAAQ,EACR,SAAS,EACT,MAAM,EACN,KAAK,EACL,KAAK,EACL,KAAK,EACL,SAAS,EACT,WAAW,EACX,KAAK,EACL,IAAI,EACJ,MAAgB,EAChB,GAAG,EACH,IAAY,EACZ,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,cAAc,EACd,cAAc,GACf,EAAE,UAAU,kDAqPZ"}
|