@flanksource/clicky-ui 0.2.14 → 0.2.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chat.cjs +20 -0
- package/dist/chat.cjs.map +1 -0
- package/dist/chat.d.ts +2 -0
- package/dist/chat.d.ts.map +1 -0
- package/dist/chat.js +20 -0
- package/dist/chat.js.map +1 -0
- package/dist/components/Combobox.cjs +5 -3
- package/dist/components/Combobox.cjs.map +1 -1
- package/dist/components/Combobox.d.ts +2 -0
- package/dist/components/Combobox.d.ts.map +1 -1
- package/dist/components/Combobox.js +5 -3
- package/dist/components/Combobox.js.map +1 -1
- package/dist/components/DateTimePicker.cjs +3 -1
- package/dist/components/DateTimePicker.cjs.map +1 -1
- package/dist/components/DateTimePicker.d.ts +5 -1
- package/dist/components/DateTimePicker.d.ts.map +1 -1
- package/dist/components/DateTimePicker.js +3 -1
- package/dist/components/DateTimePicker.js.map +1 -1
- package/dist/components/FilterBar.cjs +8 -41
- package/dist/components/FilterBar.cjs.map +1 -1
- package/dist/components/FilterBar.d.ts +0 -2
- package/dist/components/FilterBar.d.ts.map +1 -1
- package/dist/components/FilterBar.js +3 -36
- package/dist/components/FilterBar.js.map +1 -1
- package/dist/components/FormatOptionsDropdown.cjs +2 -18
- package/dist/components/FormatOptionsDropdown.cjs.map +1 -1
- package/dist/components/FormatOptionsDropdown.d.ts +1 -17
- package/dist/components/FormatOptionsDropdown.d.ts.map +1 -1
- package/dist/components/FormatOptionsDropdown.js +1 -17
- package/dist/components/FormatOptionsDropdown.js.map +1 -1
- package/dist/components/JsonSchemaForm.cjs +128 -12
- package/dist/components/JsonSchemaForm.cjs.map +1 -1
- package/dist/components/JsonSchemaForm.d.ts +1 -1
- package/dist/components/JsonSchemaForm.d.ts.map +1 -1
- package/dist/components/JsonSchemaForm.js +131 -15
- package/dist/components/JsonSchemaForm.js.map +1 -1
- package/dist/components/SecretKeySelector.cjs +0 -1
- package/dist/components/SecretKeySelector.cjs.map +1 -1
- package/dist/components/SecretKeySelector.d.ts +0 -2
- package/dist/components/SecretKeySelector.d.ts.map +1 -1
- package/dist/components/SecretKeySelector.js +1 -2
- package/dist/components/SecretKeySelector.js.map +1 -1
- package/dist/components/TreePickerField.cjs +137 -0
- package/dist/components/TreePickerField.cjs.map +1 -0
- package/dist/components/TreePickerField.d.ts +30 -0
- package/dist/components/TreePickerField.d.ts.map +1 -0
- package/dist/components/TreePickerField.js +137 -0
- package/dist/components/TreePickerField.js.map +1 -0
- package/dist/components/WorkloadPicker.cjs +6 -81
- package/dist/components/WorkloadPicker.cjs.map +1 -1
- package/dist/components/WorkloadPicker.d.ts +1 -20
- package/dist/components/WorkloadPicker.d.ts.map +1 -1
- package/dist/components/WorkloadPicker.js +3 -78
- package/dist/components/WorkloadPicker.js.map +1 -1
- package/dist/components/button-variants.cjs +30 -0
- package/dist/components/button-variants.cjs.map +1 -0
- package/dist/components/button-variants.d.ts +5 -0
- package/dist/components/button-variants.d.ts.map +1 -0
- package/dist/components/button-variants.js +30 -0
- package/dist/components/button-variants.js.map +1 -0
- package/dist/components/button.cjs +11 -82
- package/dist/components/button.cjs.map +1 -1
- package/dist/components/button.d.ts +1 -5
- package/dist/components/button.d.ts.map +1 -1
- package/dist/components/button.js +5 -76
- package/dist/components/button.js.map +1 -1
- package/dist/components/filter-bar-utils.cjs +37 -0
- package/dist/components/filter-bar-utils.cjs.map +1 -0
- package/dist/components/filter-bar-utils.d.ts +4 -0
- package/dist/components/filter-bar-utils.d.ts.map +1 -0
- package/dist/components/filter-bar-utils.js +37 -0
- package/dist/components/filter-bar-utils.js.map +1 -0
- package/dist/components/format-options.cjs +20 -0
- package/dist/components/format-options.cjs.map +1 -0
- package/dist/components/format-options.d.ts +18 -0
- package/dist/components/format-options.d.ts.map +1 -0
- package/dist/components/format-options.js +20 -0
- package/dist/components/format-options.js.map +1 -0
- package/dist/components/json-schema-form-array.cjs +13 -17
- package/dist/components/json-schema-form-array.cjs.map +1 -1
- package/dist/components/json-schema-form-array.d.ts +1 -2
- package/dist/components/json-schema-form-array.d.ts.map +1 -1
- package/dist/components/json-schema-form-array.js +3 -7
- package/dist/components/json-schema-form-array.js.map +1 -1
- package/dist/components/json-schema-form-fields.cjs +90 -232
- package/dist/components/json-schema-form-fields.cjs.map +1 -1
- package/dist/components/json-schema-form-fields.d.ts +51 -6
- package/dist/components/json-schema-form-fields.d.ts.map +1 -1
- package/dist/components/json-schema-form-fields.js +82 -224
- package/dist/components/json-schema-form-fields.js.map +1 -1
- package/dist/components/json-schema-form-object.cjs +149 -0
- package/dist/components/json-schema-form-object.cjs.map +1 -0
- package/dist/components/json-schema-form-object.d.ts +10 -0
- package/dist/components/json-schema-form-object.d.ts.map +1 -0
- package/dist/components/json-schema-form-object.js +149 -0
- package/dist/components/json-schema-form-object.js.map +1 -0
- package/dist/components/json-schema-form-preferences.cjs +41 -0
- package/dist/components/json-schema-form-preferences.cjs.map +1 -0
- package/dist/components/json-schema-form-preferences.d.ts +10 -0
- package/dist/components/json-schema-form-preferences.d.ts.map +1 -0
- package/dist/components/json-schema-form-preferences.js +41 -0
- package/dist/components/json-schema-form-preferences.js.map +1 -0
- package/dist/components/json-schema-form-render.cjs +43 -72
- package/dist/components/json-schema-form-render.cjs.map +1 -1
- package/dist/components/json-schema-form-render.d.ts +5 -33
- package/dist/components/json-schema-form-render.d.ts.map +1 -1
- package/dist/components/json-schema-form-render.js +41 -70
- package/dist/components/json-schema-form-render.js.map +1 -1
- package/dist/components/json-schema-form-resolve.cjs +9 -1
- package/dist/components/json-schema-form-resolve.cjs.map +1 -1
- package/dist/components/json-schema-form-resolve.d.ts.map +1 -1
- package/dist/components/json-schema-form-resolve.js +9 -1
- package/dist/components/json-schema-form-resolve.js.map +1 -1
- package/dist/components/json-schema-form-types.d.ts +58 -1
- package/dist/components/json-schema-form-types.d.ts.map +1 -1
- package/dist/components/json-schema-form-utils.cjs +96 -0
- package/dist/components/json-schema-form-utils.cjs.map +1 -0
- package/dist/components/json-schema-form-utils.d.ts +17 -0
- package/dist/components/json-schema-form-utils.d.ts.map +1 -0
- package/dist/components/json-schema-form-utils.js +96 -0
- package/dist/components/json-schema-form-utils.js.map +1 -0
- package/dist/components/loading.cjs +109 -0
- package/dist/components/loading.cjs.map +1 -0
- package/dist/components/loading.d.ts +27 -0
- package/dist/components/loading.d.ts.map +1 -0
- package/dist/components/loading.js +109 -0
- package/dist/components/loading.js.map +1 -0
- package/dist/components/workload-picker-utils.cjs +88 -0
- package/dist/components/workload-picker-utils.cjs.map +1 -0
- package/dist/components/workload-picker-utils.d.ts +34 -0
- package/dist/components/workload-picker-utils.d.ts.map +1 -0
- package/dist/components/workload-picker-utils.js +88 -0
- package/dist/components/workload-picker-utils.js.map +1 -0
- package/dist/components.cjs +18 -6
- package/dist/components.cjs.map +1 -1
- package/dist/components.d.ts +10 -3
- package/dist/components.d.ts.map +1 -1
- package/dist/components.js +16 -4
- package/dist/components.js.map +1 -1
- package/dist/data/Badge.cjs +11 -91
- package/dist/data/Badge.cjs.map +1 -1
- package/dist/data/Badge.d.ts +1 -5
- package/dist/data/Badge.d.ts.map +1 -1
- package/dist/data/Badge.js +11 -91
- package/dist/data/Badge.js.map +1 -1
- package/dist/data/Clicky.cjs +4 -3
- package/dist/data/Clicky.cjs.map +1 -1
- package/dist/data/Clicky.d.ts.map +1 -1
- package/dist/data/Clicky.js +4 -3
- package/dist/data/Clicky.js.map +1 -1
- package/dist/data/DataTable.cjs +161 -156
- package/dist/data/DataTable.cjs.map +1 -1
- package/dist/data/DataTable.d.ts +25 -4
- package/dist/data/DataTable.d.ts.map +1 -1
- package/dist/data/DataTable.js +140 -135
- package/dist/data/DataTable.js.map +1 -1
- package/dist/data/FilterPill.cjs +3 -0
- package/dist/data/FilterPill.cjs.map +1 -1
- package/dist/data/FilterPill.d.ts.map +1 -1
- package/dist/data/FilterPill.js +3 -0
- package/dist/data/FilterPill.js.map +1 -1
- package/dist/data/Icon.cjs +7 -7
- package/dist/data/Icon.cjs.map +1 -1
- package/dist/data/Icon.js +7 -7
- package/dist/data/Icon.js.map +1 -1
- package/dist/data/LogDetails.cjs +5 -14
- package/dist/data/LogDetails.cjs.map +1 -1
- package/dist/data/LogDetails.d.ts +8 -4
- package/dist/data/LogDetails.d.ts.map +1 -1
- package/dist/data/LogDetails.js +4 -13
- package/dist/data/LogDetails.js.map +1 -1
- package/dist/data/LogsTable.cjs +6 -165
- package/dist/data/LogsTable.cjs.map +1 -1
- package/dist/data/LogsTable.d.ts +2 -15
- package/dist/data/LogsTable.d.ts.map +1 -1
- package/dist/data/LogsTable.js +6 -165
- package/dist/data/LogsTable.js.map +1 -1
- package/dist/data/TimeseriesPanel.axes.cjs.map +1 -1
- package/dist/data/TimeseriesPanel.axes.js.map +1 -1
- package/dist/data/TreeNode.cjs +13 -7
- package/dist/data/TreeNode.cjs.map +1 -1
- package/dist/data/TreeNode.d.ts.map +1 -1
- package/dist/data/TreeNode.js +13 -7
- package/dist/data/TreeNode.js.map +1 -1
- package/dist/data/badge-variants.cjs +85 -0
- package/dist/data/badge-variants.cjs.map +1 -0
- package/dist/data/badge-variants.d.ts +6 -0
- package/dist/data/badge-variants.d.ts.map +1 -0
- package/dist/data/badge-variants.js +85 -0
- package/dist/data/badge-variants.js.map +1 -0
- package/dist/data/cache-browser/CacheBrowser.cjs +59 -0
- package/dist/data/cache-browser/CacheBrowser.cjs.map +1 -0
- package/dist/data/cache-browser/CacheBrowser.d.ts +26 -0
- package/dist/data/cache-browser/CacheBrowser.d.ts.map +1 -0
- package/dist/data/cache-browser/CacheBrowser.js +59 -0
- package/dist/data/cache-browser/CacheBrowser.js.map +1 -0
- package/dist/data/cache-browser/CacheDetailPanel.cjs +193 -0
- package/dist/data/cache-browser/CacheDetailPanel.cjs.map +1 -0
- package/dist/data/cache-browser/CacheDetailPanel.d.ts +20 -0
- package/dist/data/cache-browser/CacheDetailPanel.d.ts.map +1 -0
- package/dist/data/cache-browser/CacheDetailPanel.js +193 -0
- package/dist/data/cache-browser/CacheDetailPanel.js.map +1 -0
- package/dist/data/cache-browser/CacheStatsOverview.cjs +126 -0
- package/dist/data/cache-browser/CacheStatsOverview.cjs.map +1 -0
- package/dist/data/cache-browser/CacheStatsOverview.d.ts +17 -0
- package/dist/data/cache-browser/CacheStatsOverview.d.ts.map +1 -0
- package/dist/data/cache-browser/CacheStatsOverview.js +126 -0
- package/dist/data/cache-browser/CacheStatsOverview.js.map +1 -0
- package/dist/data/cache-browser/CacheTree.cjs +189 -0
- package/dist/data/cache-browser/CacheTree.cjs.map +1 -0
- package/dist/data/cache-browser/CacheTree.d.ts +27 -0
- package/dist/data/cache-browser/CacheTree.d.ts.map +1 -0
- package/dist/data/cache-browser/CacheTree.js +189 -0
- package/dist/data/cache-browser/CacheTree.js.map +1 -0
- package/dist/data/cache-browser/CacheValue.cjs +86 -0
- package/dist/data/cache-browser/CacheValue.cjs.map +1 -0
- package/dist/data/cache-browser/CacheValue.d.ts +11 -0
- package/dist/data/cache-browser/CacheValue.d.ts.map +1 -0
- package/dist/data/cache-browser/CacheValue.js +86 -0
- package/dist/data/cache-browser/CacheValue.js.map +1 -0
- package/dist/data/cache-browser/adapter.cjs +52 -0
- package/dist/data/cache-browser/adapter.cjs.map +1 -0
- package/dist/data/cache-browser/adapter.d.ts +48 -0
- package/dist/data/cache-browser/adapter.d.ts.map +1 -0
- package/dist/data/cache-browser/adapter.js +52 -0
- package/dist/data/cache-browser/adapter.js.map +1 -0
- package/dist/data/cache-browser/api.cjs +42 -0
- package/dist/data/cache-browser/api.cjs.map +1 -0
- package/dist/data/cache-browser/api.d.ts +33 -0
- package/dist/data/cache-browser/api.d.ts.map +1 -0
- package/dist/data/cache-browser/api.js +42 -0
- package/dist/data/cache-browser/api.js.map +1 -0
- package/dist/data/cache-browser/index.d.ts +9 -0
- package/dist/data/cache-browser/index.d.ts.map +1 -0
- package/dist/data/cache-browser/types.cjs +7 -0
- package/dist/data/cache-browser/types.cjs.map +1 -0
- package/dist/data/cache-browser/types.d.ts +78 -0
- package/dist/data/cache-browser/types.d.ts.map +1 -0
- package/dist/data/cache-browser/types.js +7 -0
- package/dist/data/cache-browser/types.js.map +1 -0
- package/dist/data/cells/TagList.cjs +4 -101
- package/dist/data/cells/TagList.cjs.map +1 -1
- package/dist/data/cells/TagList.d.ts +1 -49
- package/dist/data/cells/TagList.d.ts.map +1 -1
- package/dist/data/cells/TagList.js +3 -100
- package/dist/data/cells/TagList.js.map +1 -1
- package/dist/data/cells/Timestamp.cjs +3 -192
- package/dist/data/cells/Timestamp.cjs.map +1 -1
- package/dist/data/cells/Timestamp.d.ts +1 -50
- package/dist/data/cells/Timestamp.d.ts.map +1 -1
- package/dist/data/cells/Timestamp.js +2 -191
- package/dist/data/cells/Timestamp.js.map +1 -1
- package/dist/data/cells/tag-utils.cjs +103 -0
- package/dist/data/cells/tag-utils.cjs.map +1 -0
- package/dist/data/cells/tag-utils.d.ts +51 -0
- package/dist/data/cells/tag-utils.d.ts.map +1 -0
- package/dist/data/cells/tag-utils.js +103 -0
- package/dist/data/cells/tag-utils.js.map +1 -0
- package/dist/data/cells/timestamp-format.cjs +193 -0
- package/dist/data/cells/timestamp-format.cjs.map +1 -0
- package/dist/data/cells/timestamp-format.d.ts +51 -0
- package/dist/data/cells/timestamp-format.d.ts.map +1 -0
- package/dist/data/cells/timestamp-format.js +193 -0
- package/dist/data/cells/timestamp-format.js.map +1 -0
- package/dist/data/chat/Chat.cjs +48 -0
- package/dist/data/chat/Chat.cjs.map +1 -0
- package/dist/data/chat/Chat.d.ts +26 -0
- package/dist/data/chat/Chat.d.ts.map +1 -0
- package/dist/data/chat/Chat.fixtures.d.ts +6 -0
- package/dist/data/chat/Chat.fixtures.d.ts.map +1 -0
- package/dist/data/chat/Chat.js +48 -0
- package/dist/data/chat/Chat.js.map +1 -0
- package/dist/data/chat/Conversation.cjs +34 -0
- package/dist/data/chat/Conversation.cjs.map +1 -0
- package/dist/data/chat/Conversation.d.ts +11 -0
- package/dist/data/chat/Conversation.d.ts.map +1 -0
- package/dist/data/chat/Conversation.js +34 -0
- package/dist/data/chat/Conversation.js.map +1 -0
- package/dist/data/chat/Message.cjs +44 -0
- package/dist/data/chat/Message.cjs.map +1 -0
- package/dist/data/chat/Message.d.ts +10 -0
- package/dist/data/chat/Message.d.ts.map +1 -0
- package/dist/data/chat/Message.js +44 -0
- package/dist/data/chat/Message.js.map +1 -0
- package/dist/data/chat/PromptInput.cjs +61 -0
- package/dist/data/chat/PromptInput.cjs.map +1 -0
- package/dist/data/chat/PromptInput.d.ts +16 -0
- package/dist/data/chat/PromptInput.d.ts.map +1 -0
- package/dist/data/chat/PromptInput.js +61 -0
- package/dist/data/chat/PromptInput.js.map +1 -0
- package/dist/data/chat/ToolCall.cjs +92 -0
- package/dist/data/chat/ToolCall.cjs.map +1 -0
- package/dist/data/chat/ToolCall.d.ts +14 -0
- package/dist/data/chat/ToolCall.d.ts.map +1 -0
- package/dist/data/chat/ToolCall.js +92 -0
- package/dist/data/chat/ToolCall.js.map +1 -0
- package/dist/data/chat/clickyOperationsToTools.cjs +73 -0
- package/dist/data/chat/clickyOperationsToTools.cjs.map +1 -0
- package/dist/data/chat/clickyOperationsToTools.d.ts +10 -0
- package/dist/data/chat/clickyOperationsToTools.d.ts.map +1 -0
- package/dist/data/chat/clickyOperationsToTools.js +73 -0
- package/dist/data/chat/clickyOperationsToTools.js.map +1 -0
- package/dist/data/chat/index.d.ts +8 -0
- package/dist/data/chat/index.d.ts.map +1 -0
- package/dist/data/chat/types.cjs +18 -0
- package/dist/data/chat/types.cjs.map +1 -0
- package/dist/data/chat/types.d.ts +41 -0
- package/dist/data/chat/types.d.ts.map +1 -0
- package/dist/data/chat/types.js +18 -0
- package/dist/data/chat/types.js.map +1 -0
- package/dist/data/data-table-utils.cjs +55 -0
- package/dist/data/data-table-utils.cjs.map +1 -0
- package/dist/data/data-table-utils.d.ts +24 -0
- package/dist/data/data-table-utils.d.ts.map +1 -0
- package/dist/data/data-table-utils.js +55 -0
- package/dist/data/data-table-utils.js.map +1 -0
- package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs +2 -1
- package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs.map +1 -1
- package/dist/data/diagnostics/DiagnosticsDetailPanel.d.ts.map +1 -1
- package/dist/data/diagnostics/DiagnosticsDetailPanel.js +3 -2
- package/dist/data/diagnostics/DiagnosticsDetailPanel.js.map +1 -1
- package/dist/data/diagnostics/GoroutineCard.cjs +3 -22
- package/dist/data/diagnostics/GoroutineCard.cjs.map +1 -1
- package/dist/data/diagnostics/GoroutineCard.d.ts +0 -2
- package/dist/data/diagnostics/GoroutineCard.d.ts.map +1 -1
- package/dist/data/diagnostics/GoroutineCard.js +2 -21
- package/dist/data/diagnostics/GoroutineCard.js.map +1 -1
- package/dist/data/diagnostics/ThreadCard.cjs +3 -38
- package/dist/data/diagnostics/ThreadCard.cjs.map +1 -1
- package/dist/data/diagnostics/ThreadCard.d.ts +0 -2
- package/dist/data/diagnostics/ThreadCard.d.ts.map +1 -1
- package/dist/data/diagnostics/ThreadCard.js +2 -37
- package/dist/data/diagnostics/ThreadCard.js.map +1 -1
- package/dist/data/diagnostics/state-styles.cjs +59 -0
- package/dist/data/diagnostics/state-styles.cjs.map +1 -0
- package/dist/data/diagnostics/state-styles.d.ts +5 -0
- package/dist/data/diagnostics/state-styles.d.ts.map +1 -0
- package/dist/data/diagnostics/state-styles.js +59 -0
- package/dist/data/diagnostics/state-styles.js.map +1 -0
- package/dist/data/logs-normalize.cjs +166 -0
- package/dist/data/logs-normalize.cjs.map +1 -0
- package/dist/data/logs-normalize.d.ts +16 -0
- package/dist/data/logs-normalize.d.ts.map +1 -0
- package/dist/data/logs-normalize.js +166 -0
- package/dist/data/logs-normalize.js.map +1 -0
- package/dist/data/task-status.cjs +19 -19
- package/dist/data/task-status.cjs.map +1 -1
- package/dist/data/task-status.js +19 -19
- package/dist/data/task-status.js.map +1 -1
- package/dist/data/version-info.cjs +3 -3
- package/dist/data/version-info.js +3 -3
- package/dist/data.cjs +43 -18
- package/dist/data.cjs.map +1 -1
- package/dist/data.d.ts +11 -5
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +30 -5
- package/dist/data.js.map +1 -1
- package/dist/hooks/density-provider.cjs +38 -0
- package/dist/hooks/density-provider.cjs.map +1 -0
- package/dist/hooks/density-provider.d.ts +20 -0
- package/dist/hooks/density-provider.d.ts.map +1 -0
- package/dist/hooks/density-provider.js +38 -0
- package/dist/hooks/density-provider.js.map +1 -0
- package/dist/hooks/theme-provider.cjs +43 -0
- package/dist/hooks/theme-provider.cjs.map +1 -0
- package/dist/hooks/theme-provider.d.ts +9 -0
- package/dist/hooks/theme-provider.d.ts.map +1 -0
- package/dist/hooks/theme-provider.js +43 -0
- package/dist/hooks/theme-provider.js.map +1 -0
- package/dist/hooks/use-density.cjs +8 -37
- package/dist/hooks/use-density.cjs.map +1 -1
- package/dist/hooks/use-density.d.ts +5 -20
- package/dist/hooks/use-density.d.ts.map +1 -1
- package/dist/hooks/use-density.js +9 -38
- package/dist/hooks/use-density.js.map +1 -1
- package/dist/hooks/use-theme.cjs +10 -43
- package/dist/hooks/use-theme.cjs.map +1 -1
- package/dist/hooks/use-theme.d.ts +6 -9
- package/dist/hooks/use-theme.d.ts.map +1 -1
- package/dist/hooks/use-theme.js +11 -44
- package/dist/hooks/use-theme.js.map +1 -1
- package/dist/hooks.cjs +5 -2
- package/dist/hooks.cjs.map +1 -1
- package/dist/hooks.d.ts +4 -2
- package/dist/hooks.d.ts.map +1 -1
- package/dist/hooks.js +5 -2
- package/dist/hooks.js.map +1 -1
- package/dist/icons/changeIconAliases.cjs +13 -13
- package/dist/icons/changeIconAliases.cjs.map +1 -1
- package/dist/icons/changeIconAliases.d.ts.map +1 -1
- package/dist/icons/changeIconAliases.js +13 -13
- package/dist/icons/changeIconAliases.js.map +1 -1
- package/dist/index.cjs +71 -30
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +53 -12
- package/dist/index.js.map +1 -1
- package/dist/overlay/DropdownMenu.cjs +2 -0
- package/dist/overlay/DropdownMenu.cjs.map +1 -1
- package/dist/overlay/DropdownMenu.d.ts +3 -1
- package/dist/overlay/DropdownMenu.d.ts.map +1 -1
- package/dist/overlay/DropdownMenu.js +2 -0
- package/dist/overlay/DropdownMenu.js.map +1 -1
- package/dist/overlay/Modal.cjs +11 -4
- package/dist/overlay/Modal.cjs.map +1 -1
- package/dist/overlay/Modal.d.ts +1 -1
- package/dist/overlay/Modal.d.ts.map +1 -1
- package/dist/overlay/Modal.js +11 -4
- package/dist/overlay/Modal.js.map +1 -1
- package/dist/overlay/modalStack.cjs +35 -0
- package/dist/overlay/modalStack.cjs.map +1 -0
- package/dist/overlay/modalStack.d.ts +13 -0
- package/dist/overlay/modalStack.d.ts.map +1 -0
- package/dist/overlay/modalStack.js +35 -0
- package/dist/overlay/modalStack.js.map +1 -0
- package/dist/rpc/AcceptPicker.cjs +2 -18
- package/dist/rpc/AcceptPicker.cjs.map +1 -1
- package/dist/rpc/AcceptPicker.d.ts +1 -41
- package/dist/rpc/AcceptPicker.d.ts.map +1 -1
- package/dist/rpc/AcceptPicker.js +2 -18
- package/dist/rpc/AcceptPicker.js.map +1 -1
- package/dist/rpc/CommandOutput.cjs +1 -1
- package/dist/rpc/CommandOutput.cjs.map +1 -1
- package/dist/rpc/CommandOutput.js +1 -1
- package/dist/rpc/CommandOutput.js.map +1 -1
- package/dist/rpc/EndpointList.cjs +1 -1
- package/dist/rpc/EndpointList.cjs.map +1 -1
- package/dist/rpc/EndpointList.js +1 -1
- package/dist/rpc/EndpointList.js.map +1 -1
- package/dist/rpc/OperationCatalog.cjs +23 -41
- package/dist/rpc/OperationCatalog.cjs.map +1 -1
- package/dist/rpc/OperationCatalog.d.ts.map +1 -1
- package/dist/rpc/OperationCatalog.js +24 -42
- package/dist/rpc/OperationCatalog.js.map +1 -1
- package/dist/rpc/OperationCommandPage.cjs.map +1 -1
- package/dist/rpc/OperationCommandPage.d.ts.map +1 -1
- package/dist/rpc/OperationCommandPage.js.map +1 -1
- package/dist/rpc/accept-options.cjs +20 -0
- package/dist/rpc/accept-options.cjs.map +1 -0
- package/dist/rpc/accept-options.d.ts +42 -0
- package/dist/rpc/accept-options.d.ts.map +1 -0
- package/dist/rpc/accept-options.js +20 -0
- package/dist/rpc/accept-options.js.map +1 -0
- package/dist/rpc/classify.cjs +15 -4
- package/dist/rpc/classify.cjs.map +1 -1
- package/dist/rpc/classify.d.ts.map +1 -1
- package/dist/rpc/classify.js +15 -4
- package/dist/rpc/classify.js.map +1 -1
- package/dist/rpc/clickyMetadata.cjs +13 -3
- package/dist/rpc/clickyMetadata.cjs.map +1 -1
- package/dist/rpc/clickyMetadata.d.ts +2 -0
- package/dist/rpc/clickyMetadata.d.ts.map +1 -1
- package/dist/rpc/clickyMetadata.js +14 -4
- package/dist/rpc/clickyMetadata.js.map +1 -1
- package/dist/rpc.cjs +3 -2
- package/dist/rpc.cjs.map +1 -1
- package/dist/rpc.d.ts +2 -1
- package/dist/rpc.d.ts.map +1 -1
- package/dist/rpc.js +2 -1
- package/dist/rpc.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +16 -1
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
function parseTimestamp(value) {
|
|
2
|
+
if (value == null) return null;
|
|
3
|
+
if (value instanceof Date) return Number.isNaN(value.getTime()) ? null : value;
|
|
4
|
+
if (typeof value === "number") {
|
|
5
|
+
const ms = value < 1e12 ? value * 1e3 : value;
|
|
6
|
+
const d = new Date(ms);
|
|
7
|
+
return Number.isNaN(d.getTime()) ? null : d;
|
|
8
|
+
}
|
|
9
|
+
if (typeof value === "string") {
|
|
10
|
+
const trimmed = value.trim();
|
|
11
|
+
if (!trimmed) return null;
|
|
12
|
+
const d = new Date(trimmed);
|
|
13
|
+
return Number.isNaN(d.getTime()) ? null : d;
|
|
14
|
+
}
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
const UNIT_MS = {
|
|
18
|
+
s: 1e3,
|
|
19
|
+
m: 6e4,
|
|
20
|
+
h: 36e5,
|
|
21
|
+
d: 864e5,
|
|
22
|
+
w: 6048e5
|
|
23
|
+
};
|
|
24
|
+
const RELATIVE_PATTERN = /^now\s*([+-])\s*(\d+)\s*([smhdwMqy])$/;
|
|
25
|
+
const ANCHORED_PATTERN = /^now\/([wMqy])(?:\s*([+-])\s*(\d+)\s*([wMqy]))?$/;
|
|
26
|
+
function resolveDateMath(value, now = /* @__PURE__ */ new Date()) {
|
|
27
|
+
if (value == null) return null;
|
|
28
|
+
if (typeof value === "string") {
|
|
29
|
+
const trimmed = value.trim();
|
|
30
|
+
if (!trimmed) return null;
|
|
31
|
+
if (trimmed.toLowerCase() === "now") return new Date(now.getTime());
|
|
32
|
+
const anchoredMatch = trimmed.match(ANCHORED_PATTERN);
|
|
33
|
+
if (anchoredMatch) {
|
|
34
|
+
const [, anchor, sign, amount, unit] = anchoredMatch;
|
|
35
|
+
let anchored = startOfPeriod(now, anchor);
|
|
36
|
+
if (sign && amount && unit) {
|
|
37
|
+
anchored = addPeriod(anchored, unit, Number(amount) * (sign === "-" ? -1 : 1));
|
|
38
|
+
}
|
|
39
|
+
return anchored;
|
|
40
|
+
}
|
|
41
|
+
const match = trimmed.match(RELATIVE_PATTERN);
|
|
42
|
+
if (match) {
|
|
43
|
+
const [, sign, amount, unit] = match;
|
|
44
|
+
const calendarUnit = unit;
|
|
45
|
+
if (isCalendarUnit(calendarUnit)) {
|
|
46
|
+
return addPeriod(now, calendarUnit, Number(amount) * (sign === "-" ? -1 : 1));
|
|
47
|
+
}
|
|
48
|
+
const unitMs = UNIT_MS[calendarUnit.toLowerCase()];
|
|
49
|
+
if (!unitMs) return null;
|
|
50
|
+
const delta = Number(amount) * unitMs * (sign === "-" ? -1 : 1);
|
|
51
|
+
return new Date(now.getTime() + delta);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return parseTimestamp(value);
|
|
55
|
+
}
|
|
56
|
+
function isCalendarUnit(unit) {
|
|
57
|
+
return unit === "M" || unit === "q" || unit === "y";
|
|
58
|
+
}
|
|
59
|
+
function startOfPeriod(date, unit) {
|
|
60
|
+
const year = date.getUTCFullYear();
|
|
61
|
+
const month = date.getUTCMonth();
|
|
62
|
+
const day = date.getUTCDate();
|
|
63
|
+
if (unit === "w") {
|
|
64
|
+
const start = new Date(Date.UTC(year, month, day));
|
|
65
|
+
const dayOfWeek = start.getUTCDay();
|
|
66
|
+
const daysSinceMonday = (dayOfWeek + 6) % 7;
|
|
67
|
+
start.setUTCDate(start.getUTCDate() - daysSinceMonday);
|
|
68
|
+
return start;
|
|
69
|
+
}
|
|
70
|
+
if (unit === "M") return new Date(Date.UTC(year, month, 1));
|
|
71
|
+
if (unit === "q") return new Date(Date.UTC(year, Math.floor(month / 3) * 3, 1));
|
|
72
|
+
if (unit === "y") return new Date(Date.UTC(year, 0, 1));
|
|
73
|
+
return new Date(date.getTime());
|
|
74
|
+
}
|
|
75
|
+
function addPeriod(date, unit, amount) {
|
|
76
|
+
const next = new Date(date.getTime());
|
|
77
|
+
if (unit === "w") {
|
|
78
|
+
next.setUTCDate(next.getUTCDate() + amount * 7);
|
|
79
|
+
} else if (unit === "M") {
|
|
80
|
+
next.setUTCMonth(next.getUTCMonth() + amount);
|
|
81
|
+
} else if (unit === "q") {
|
|
82
|
+
next.setUTCMonth(next.getUTCMonth() + amount * 3);
|
|
83
|
+
} else if (unit === "y") {
|
|
84
|
+
next.setUTCFullYear(next.getUTCFullYear() + amount);
|
|
85
|
+
} else {
|
|
86
|
+
const unitMs = UNIT_MS[unit.toLowerCase()];
|
|
87
|
+
if (unitMs) next.setTime(next.getTime() + amount * unitMs);
|
|
88
|
+
}
|
|
89
|
+
return next;
|
|
90
|
+
}
|
|
91
|
+
const MS_PER_MINUTE = 6e4;
|
|
92
|
+
const MS_PER_DAY = 864e5;
|
|
93
|
+
function chooseTimestampFormat(values) {
|
|
94
|
+
if (values.length === 0) return "iso";
|
|
95
|
+
let min = Infinity;
|
|
96
|
+
let max = -Infinity;
|
|
97
|
+
for (const d of values) {
|
|
98
|
+
const t = d.getTime();
|
|
99
|
+
if (t < min) min = t;
|
|
100
|
+
if (t > max) max = t;
|
|
101
|
+
}
|
|
102
|
+
const span = max - min;
|
|
103
|
+
if (span <= MS_PER_MINUTE) return "relative";
|
|
104
|
+
const minDate = new Date(min);
|
|
105
|
+
const maxDate = new Date(max);
|
|
106
|
+
if (minDate.getFullYear() === maxDate.getFullYear() && minDate.getMonth() === maxDate.getMonth() && minDate.getDate() === maxDate.getDate()) {
|
|
107
|
+
return "time";
|
|
108
|
+
}
|
|
109
|
+
if (minDate.getFullYear() === maxDate.getFullYear() && span <= MS_PER_DAY * 365) {
|
|
110
|
+
return "short";
|
|
111
|
+
}
|
|
112
|
+
return "iso";
|
|
113
|
+
}
|
|
114
|
+
function formatTimestamp(date, format, now = /* @__PURE__ */ new Date()) {
|
|
115
|
+
switch (format) {
|
|
116
|
+
case "relative":
|
|
117
|
+
return formatRelativeTime(date, now);
|
|
118
|
+
case "time":
|
|
119
|
+
return date.toLocaleTimeString(void 0, {
|
|
120
|
+
hour: "2-digit",
|
|
121
|
+
minute: "2-digit",
|
|
122
|
+
second: "2-digit"
|
|
123
|
+
});
|
|
124
|
+
case "short":
|
|
125
|
+
return date.toLocaleString(void 0, {
|
|
126
|
+
month: "short",
|
|
127
|
+
day: "numeric",
|
|
128
|
+
hour: "2-digit",
|
|
129
|
+
minute: "2-digit"
|
|
130
|
+
});
|
|
131
|
+
case "iso":
|
|
132
|
+
default:
|
|
133
|
+
return formatIso(date);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
function formatIso(date) {
|
|
137
|
+
const yyyy = date.getFullYear();
|
|
138
|
+
const mm = String(date.getMonth() + 1).padStart(2, "0");
|
|
139
|
+
const dd = String(date.getDate()).padStart(2, "0");
|
|
140
|
+
const hh = String(date.getHours()).padStart(2, "0");
|
|
141
|
+
const min = String(date.getMinutes()).padStart(2, "0");
|
|
142
|
+
return `${yyyy}-${mm}-${dd} ${hh}:${min}`;
|
|
143
|
+
}
|
|
144
|
+
function formatRelativeTime(date, now = /* @__PURE__ */ new Date()) {
|
|
145
|
+
const diffMs = now.getTime() - date.getTime();
|
|
146
|
+
const future = diffMs < 0;
|
|
147
|
+
const abs = Math.abs(diffMs);
|
|
148
|
+
const sec = Math.round(abs / 1e3);
|
|
149
|
+
let value;
|
|
150
|
+
if (sec < 1) value = "just now";
|
|
151
|
+
else if (sec < 60) value = `${sec}s`;
|
|
152
|
+
else if (sec < 3600) value = `${Math.round(sec / 60)}m`;
|
|
153
|
+
else if (sec < 86400) value = `${Math.round(sec / 3600)}h`;
|
|
154
|
+
else value = `${Math.round(sec / 86400)}d`;
|
|
155
|
+
if (value === "just now") return value;
|
|
156
|
+
return future ? `in ${value}` : `${value} ago`;
|
|
157
|
+
}
|
|
158
|
+
function formatDateTimeRelative(value, now = /* @__PURE__ */ new Date()) {
|
|
159
|
+
const parsed = parseTimestamp(value);
|
|
160
|
+
if (!parsed) return typeof value === "string" ? value : "";
|
|
161
|
+
const absolute = parsed.toLocaleString(void 0, {
|
|
162
|
+
year: "numeric",
|
|
163
|
+
month: "short",
|
|
164
|
+
day: "numeric",
|
|
165
|
+
hour: "2-digit",
|
|
166
|
+
minute: "2-digit"
|
|
167
|
+
});
|
|
168
|
+
const relative = formatRelativeTime(parsed, now);
|
|
169
|
+
return relative === "just now" ? absolute : `${absolute} (${relative})`;
|
|
170
|
+
}
|
|
171
|
+
function modeToFormat(mode, dataFormat) {
|
|
172
|
+
switch (mode) {
|
|
173
|
+
case "absolute":
|
|
174
|
+
return "iso";
|
|
175
|
+
case "relative":
|
|
176
|
+
return "relative";
|
|
177
|
+
case "time":
|
|
178
|
+
return "time";
|
|
179
|
+
case "auto":
|
|
180
|
+
default:
|
|
181
|
+
return dataFormat;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
export {
|
|
185
|
+
chooseTimestampFormat,
|
|
186
|
+
formatDateTimeRelative,
|
|
187
|
+
formatRelativeTime,
|
|
188
|
+
formatTimestamp,
|
|
189
|
+
modeToFormat,
|
|
190
|
+
parseTimestamp,
|
|
191
|
+
resolveDateMath
|
|
192
|
+
};
|
|
193
|
+
//# sourceMappingURL=timestamp-format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timestamp-format.js","sources":["../../../src/data/cells/timestamp-format.ts"],"sourcesContent":["import type { TimeRangePresetGroup } from \"../../components/TimeRange\";\n\nexport type TimestampMode = \"auto\" | \"absolute\" | \"relative\" | \"time\";\n\nexport type TimestampFormat = \"relative\" | \"time\" | \"short\" | \"iso\";\n\nexport type TimestampOptions = {\n /** Rendering mode for timestamp cells. */\n mode?: TimestampMode;\n /** Show the full timestamp in a tooltip even for absolute/ISO formats. */\n alwaysShowFullOnHover?: boolean;\n /**\n * When the column is on a DataTable with `autoFilter`, DataTable mounts a\n * \"Time range\" picker (matching the trace UI) and filters rows whose\n * timestamp falls outside the selected range. Set `false` to suppress.\n */\n autoRangeFilter?: boolean;\n /** Override the trace-style preset list (\"Last 15 minutes\", etc.). */\n rangePresets?: Array<{ label: string; from: string; to: string } | TimeRangePresetGroup>;\n /** Enable absolute date+time input and timezone selection for range filters. */\n timeEnabled?: boolean;\n /** Default timezone used when encoding absolute date+time range values. */\n timeZone?: string;\n /** Selectable timezones shown when `timeEnabled` is true. */\n timeZones?: string[];\n /**\n * Default range applied on first render. Either side may use date-math\n * (`now-24h`, `now`) or any value parseable by `parseTimestamp`.\n */\n defaultRange?: { from?: string; to?: string };\n};\n\nexport function parseTimestamp(value: unknown): Date | null {\n if (value == null) return null;\n if (value instanceof Date) return Number.isNaN(value.getTime()) ? null : value;\n\n if (typeof value === \"number\") {\n const ms = value < 1e12 ? value * 1000 : value;\n const d = new Date(ms);\n return Number.isNaN(d.getTime()) ? null : d;\n }\n\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n if (!trimmed) return null;\n const d = new Date(trimmed);\n return Number.isNaN(d.getTime()) ? null : d;\n }\n\n return null;\n}\n\nconst UNIT_MS: Record<string, number> = {\n s: 1_000,\n m: 60_000,\n h: 3_600_000,\n d: 86_400_000,\n w: 604_800_000,\n};\n\nconst RELATIVE_PATTERN = /^now\\s*([+-])\\s*(\\d+)\\s*([smhdwMqy])$/;\nconst ANCHORED_PATTERN = /^now\\/([wMqy])(?:\\s*([+-])\\s*(\\d+)\\s*([wMqy]))?$/;\n\n/**\n * Resolves date-math strings to an absolute Date. Recognised forms:\n * - \"now\"\n * - \"now-15m\", \"now-1h\", \"now+30s\", \"now-7d\", \"now-2w\" (units: s/m/h/d/w/M/q/y)\n * - \"now/w\", \"now/M\", \"now/q\", \"now/y\" with optional calendar offsets\n * - any value parseable by `parseTimestamp` (ISO, epoch ms/s, Date)\n * Returns null for unparseable input.\n */\nexport function resolveDateMath(value: unknown, now: Date = new Date()): Date | null {\n if (value == null) return null;\n\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n if (!trimmed) return null;\n\n if (trimmed.toLowerCase() === \"now\") return new Date(now.getTime());\n\n const anchoredMatch = trimmed.match(ANCHORED_PATTERN);\n if (anchoredMatch) {\n const [, anchor, sign, amount, unit] = anchoredMatch;\n let anchored = startOfPeriod(now, anchor!);\n if (sign && amount && unit) {\n anchored = addPeriod(anchored, unit, Number(amount) * (sign === \"-\" ? -1 : 1));\n }\n return anchored;\n }\n\n const match = trimmed.match(RELATIVE_PATTERN);\n if (match) {\n const [, sign, amount, unit] = match;\n const calendarUnit = unit!;\n if (isCalendarUnit(calendarUnit)) {\n return addPeriod(now, calendarUnit, Number(amount) * (sign === \"-\" ? -1 : 1));\n }\n const unitMs = UNIT_MS[calendarUnit.toLowerCase()];\n if (!unitMs) return null;\n const delta = Number(amount) * unitMs * (sign === \"-\" ? -1 : 1);\n return new Date(now.getTime() + delta);\n }\n }\n\n return parseTimestamp(value);\n}\n\nfunction isCalendarUnit(unit: string) {\n return unit === \"M\" || unit === \"q\" || unit === \"y\";\n}\n\nfunction startOfPeriod(date: Date, unit: string) {\n const year = date.getUTCFullYear();\n const month = date.getUTCMonth();\n const day = date.getUTCDate();\n\n if (unit === \"w\") {\n const start = new Date(Date.UTC(year, month, day));\n const dayOfWeek = start.getUTCDay();\n const daysSinceMonday = (dayOfWeek + 6) % 7;\n start.setUTCDate(start.getUTCDate() - daysSinceMonday);\n return start;\n }\n if (unit === \"M\") return new Date(Date.UTC(year, month, 1));\n if (unit === \"q\") return new Date(Date.UTC(year, Math.floor(month / 3) * 3, 1));\n if (unit === \"y\") return new Date(Date.UTC(year, 0, 1));\n return new Date(date.getTime());\n}\n\nfunction addPeriod(date: Date, unit: string, amount: number) {\n const next = new Date(date.getTime());\n if (unit === \"w\") {\n next.setUTCDate(next.getUTCDate() + amount * 7);\n } else if (unit === \"M\") {\n next.setUTCMonth(next.getUTCMonth() + amount);\n } else if (unit === \"q\") {\n next.setUTCMonth(next.getUTCMonth() + amount * 3);\n } else if (unit === \"y\") {\n next.setUTCFullYear(next.getUTCFullYear() + amount);\n } else {\n const unitMs = UNIT_MS[unit.toLowerCase()];\n if (unitMs) next.setTime(next.getTime() + amount * unitMs);\n }\n return next;\n}\n\nconst MS_PER_MINUTE = 60_000;\nconst MS_PER_DAY = 86_400_000;\n\nexport function chooseTimestampFormat(values: Date[]): TimestampFormat {\n if (values.length === 0) return \"iso\";\n\n let min = Infinity;\n let max = -Infinity;\n for (const d of values) {\n const t = d.getTime();\n if (t < min) min = t;\n if (t > max) max = t;\n }\n const span = max - min;\n\n if (span <= MS_PER_MINUTE) return \"relative\";\n\n const minDate = new Date(min);\n const maxDate = new Date(max);\n\n if (\n minDate.getFullYear() === maxDate.getFullYear() &&\n minDate.getMonth() === maxDate.getMonth() &&\n minDate.getDate() === maxDate.getDate()\n ) {\n return \"time\";\n }\n\n if (minDate.getFullYear() === maxDate.getFullYear() && span <= MS_PER_DAY * 365) {\n return \"short\";\n }\n\n return \"iso\";\n}\n\nexport function formatTimestamp(\n date: Date,\n format: TimestampFormat,\n now: Date = new Date(),\n): string {\n switch (format) {\n case \"relative\":\n return formatRelativeTime(date, now);\n case \"time\":\n return date.toLocaleTimeString(undefined, {\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n });\n case \"short\":\n return date.toLocaleString(undefined, {\n month: \"short\",\n day: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n case \"iso\":\n default:\n return formatIso(date);\n }\n}\n\nfunction formatIso(date: Date): string {\n const yyyy = date.getFullYear();\n const mm = String(date.getMonth() + 1).padStart(2, \"0\");\n const dd = String(date.getDate()).padStart(2, \"0\");\n const hh = String(date.getHours()).padStart(2, \"0\");\n const min = String(date.getMinutes()).padStart(2, \"0\");\n return `${yyyy}-${mm}-${dd} ${hh}:${min}`;\n}\n\n// formatRelativeTime renders a compact \"30s ago\" / \"in 5m\" / \"just now\" string.\nexport function formatRelativeTime(date: Date, now: Date = new Date()): string {\n const diffMs = now.getTime() - date.getTime();\n const future = diffMs < 0;\n const abs = Math.abs(diffMs);\n const sec = Math.round(abs / 1000);\n\n let value: string;\n if (sec < 1) value = \"just now\";\n else if (sec < 60) value = `${sec}s`;\n else if (sec < 3600) value = `${Math.round(sec / 60)}m`;\n else if (sec < 86400) value = `${Math.round(sec / 3600)}h`;\n else value = `${Math.round(sec / 86400)}d`;\n\n if (value === \"just now\") return value;\n return future ? `in ${value}` : `${value} ago`;\n}\n\n// formatDateTimeRelative renders a value as an absolute locale date+time plus a\n// parenthesised relative hint, e.g. \"Apr 15, 2026, 12:00 PM (2h ago)\". It is the\n// shared \"locale + relative\" presentation used for date-typed values across the\n// form, filter, and combobox surfaces. Unparseable strings pass through\n// unchanged (so a template token or freeform value is preserved); nullish input\n// yields an empty string. The hint is dropped when the value reads \"just now\".\nexport function formatDateTimeRelative(value: unknown, now: Date = new Date()): string {\n const parsed = parseTimestamp(value);\n if (!parsed) return typeof value === \"string\" ? value : \"\";\n const absolute = parsed.toLocaleString(undefined, {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n const relative = formatRelativeTime(parsed, now);\n return relative === \"just now\" ? absolute : `${absolute} (${relative})`;\n}\n\nexport function modeToFormat(mode: TimestampMode, dataFormat: TimestampFormat): TimestampFormat {\n switch (mode) {\n case \"absolute\":\n return \"iso\";\n case \"relative\":\n return \"relative\";\n case \"time\":\n return \"time\";\n case \"auto\":\n default:\n return dataFormat;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const jsxRuntime = require("react/jsx-runtime");
|
|
4
|
+
const react = require("react");
|
|
5
|
+
const react$1 = require("@ai-sdk/react");
|
|
6
|
+
const ai = require("ai");
|
|
7
|
+
const utils = require("../../lib/utils.cjs");
|
|
8
|
+
const Conversation = require("./Conversation.cjs");
|
|
9
|
+
const PromptInput = require("./PromptInput.cjs");
|
|
10
|
+
function Chat({
|
|
11
|
+
api = "/api/chat",
|
|
12
|
+
model,
|
|
13
|
+
reasoningEffort,
|
|
14
|
+
body,
|
|
15
|
+
transport,
|
|
16
|
+
initialMessages,
|
|
17
|
+
placeholder,
|
|
18
|
+
emptyState,
|
|
19
|
+
className
|
|
20
|
+
}) {
|
|
21
|
+
const resolvedTransport = react.useMemo(() => {
|
|
22
|
+
if (transport) {
|
|
23
|
+
return transport;
|
|
24
|
+
}
|
|
25
|
+
return new ai.DefaultChatTransport({
|
|
26
|
+
api,
|
|
27
|
+
body: { ...body, ...model ? { model } : {}, ...reasoningEffort ? { reasoningEffort } : {} }
|
|
28
|
+
});
|
|
29
|
+
}, [transport, api, body, model, reasoningEffort]);
|
|
30
|
+
const { messages, sendMessage, status, stop } = react$1.useChat({
|
|
31
|
+
transport: resolvedTransport,
|
|
32
|
+
...initialMessages ? { messages: initialMessages } : {}
|
|
33
|
+
});
|
|
34
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: utils.cn("flex h-full flex-col", className), children: [
|
|
35
|
+
/* @__PURE__ */ jsxRuntime.jsx(Conversation.Conversation, { messages, emptyState }),
|
|
36
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "p-4 pt-0", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
37
|
+
PromptInput.PromptInput,
|
|
38
|
+
{
|
|
39
|
+
status,
|
|
40
|
+
onStop: () => void stop(),
|
|
41
|
+
placeholder,
|
|
42
|
+
onSubmit: (text) => void sendMessage({ text })
|
|
43
|
+
}
|
|
44
|
+
) })
|
|
45
|
+
] });
|
|
46
|
+
}
|
|
47
|
+
exports.Chat = Chat;
|
|
48
|
+
//# sourceMappingURL=Chat.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Chat.cjs","sources":["../../../src/data/chat/Chat.tsx"],"sourcesContent":["import { useMemo } from \"react\";\nimport { useChat } from \"@ai-sdk/react\";\nimport { DefaultChatTransport, type ChatTransport, type UIMessage } from \"ai\";\nimport { cn } from \"../../lib/utils\";\nimport { Conversation } from \"./Conversation\";\nimport { PromptInput } from \"./PromptInput\";\n\nexport type ChatProps = {\n /** Endpoint that speaks the AI SDK v6 UI Message Stream protocol.\n * Ignored when `transport` is supplied. Defaults to \"/api/chat\". */\n api?: string;\n /** Selected `provider/model` id, forwarded in the request body. */\n model?: string;\n /** Reasoning effort (`low` | `medium` | `high`), forwarded in the request body. */\n reasoningEffort?: string;\n /** Extra fields merged into every request body (e.g. tool scoping). */\n body?: Record<string, unknown>;\n /** Pre-built transport. Supply a mock in stories/tests; otherwise a\n * DefaultChatTransport is constructed from `api`/`body`. */\n transport?: ChatTransport<UIMessage>;\n /** Initial messages to seed the conversation. */\n initialMessages?: UIMessage[];\n placeholder?: string;\n emptyState?: React.ReactNode;\n className?: string;\n};\n\n/** Self-contained AI chat: a streaming conversation log over a prompt input,\n * driven by the AI SDK `useChat` hook against a v6-compatible `/api/chat`. The\n * backend owns model selection and tool execution; `model`, `reasoningEffort`\n * and `body` are forwarded in the request body for it to honor. */\nexport function Chat({\n api = \"/api/chat\",\n model,\n reasoningEffort,\n body,\n transport,\n initialMessages,\n placeholder,\n emptyState,\n className,\n}: ChatProps) {\n const resolvedTransport = useMemo<ChatTransport<UIMessage>>(() => {\n if (transport) {\n return transport;\n }\n return new DefaultChatTransport({\n api,\n body: { ...body, ...(model ? { model } : {}), ...(reasoningEffort ? { reasoningEffort } : {}) },\n });\n }, [transport, api, body, model, reasoningEffort]);\n\n const { messages, sendMessage, status, stop } = useChat<UIMessage>({\n transport: resolvedTransport,\n ...(initialMessages ? { messages: initialMessages } : {}),\n });\n\n return (\n <div className={cn(\"flex h-full flex-col\", className)}>\n <Conversation messages={messages} emptyState={emptyState} />\n <div className=\"p-4 pt-0\">\n <PromptInput\n status={status}\n onStop={() => void stop()}\n placeholder={placeholder}\n onSubmit={(text) => void sendMessage({ text })}\n />\n </div>\n </div>\n );\n}\n"],"names":["useMemo","DefaultChatTransport","useChat","cn","jsx","Conversation","PromptInput"],"mappings":";;;;;;;;;AA+BO,SAAS,KAAK;AAAA,EACnB,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAc;AACZ,QAAM,oBAAoBA,MAAAA,QAAkC,MAAM;AAChE,QAAI,WAAW;AACb,aAAO;AAAA,IACT;AACA,WAAO,IAAIC,GAAAA,qBAAqB;AAAA,MAC9B;AAAA,MACA,MAAM,EAAE,GAAG,MAAM,GAAI,QAAQ,EAAE,UAAU,CAAA,GAAK,GAAI,kBAAkB,EAAE,gBAAA,IAAoB,CAAA,EAAC;AAAA,IAAG,CAC/F;AAAA,EACH,GAAG,CAAC,WAAW,KAAK,MAAM,OAAO,eAAe,CAAC;AAEjD,QAAM,EAAE,UAAU,aAAa,QAAQ,KAAA,IAASC,QAAAA,QAAmB;AAAA,IACjE,WAAW;AAAA,IACX,GAAI,kBAAkB,EAAE,UAAU,oBAAoB,CAAA;AAAA,EAAC,CACxD;AAED,yCACG,OAAA,EAAI,WAAWC,MAAAA,GAAG,wBAAwB,SAAS,GAClD,UAAA;AAAA,IAAAC,2BAAAA,IAACC,aAAAA,cAAA,EAAa,UAAoB,WAAA,CAAwB;AAAA,IAC1DD,2BAAAA,IAAC,OAAA,EAAI,WAAU,YACb,UAAAA,2BAAAA;AAAAA,MAACE,YAAAA;AAAAA,MAAA;AAAA,QACC;AAAA,QACA,QAAQ,MAAM,KAAK,KAAA;AAAA,QACnB;AAAA,QACA,UAAU,CAAC,SAAS,KAAK,YAAY,EAAE,MAAM;AAAA,MAAA;AAAA,IAAA,EAC/C,CACF;AAAA,EAAA,GACF;AAEJ;;"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { ChatTransport, UIMessage } from 'ai';
|
|
2
|
+
export type ChatProps = {
|
|
3
|
+
/** Endpoint that speaks the AI SDK v6 UI Message Stream protocol.
|
|
4
|
+
* Ignored when `transport` is supplied. Defaults to "/api/chat". */
|
|
5
|
+
api?: string;
|
|
6
|
+
/** Selected `provider/model` id, forwarded in the request body. */
|
|
7
|
+
model?: string;
|
|
8
|
+
/** Reasoning effort (`low` | `medium` | `high`), forwarded in the request body. */
|
|
9
|
+
reasoningEffort?: string;
|
|
10
|
+
/** Extra fields merged into every request body (e.g. tool scoping). */
|
|
11
|
+
body?: Record<string, unknown>;
|
|
12
|
+
/** Pre-built transport. Supply a mock in stories/tests; otherwise a
|
|
13
|
+
* DefaultChatTransport is constructed from `api`/`body`. */
|
|
14
|
+
transport?: ChatTransport<UIMessage>;
|
|
15
|
+
/** Initial messages to seed the conversation. */
|
|
16
|
+
initialMessages?: UIMessage[];
|
|
17
|
+
placeholder?: string;
|
|
18
|
+
emptyState?: React.ReactNode;
|
|
19
|
+
className?: string;
|
|
20
|
+
};
|
|
21
|
+
/** Self-contained AI chat: a streaming conversation log over a prompt input,
|
|
22
|
+
* driven by the AI SDK `useChat` hook against a v6-compatible `/api/chat`. The
|
|
23
|
+
* backend owns model selection and tool execution; `model`, `reasoningEffort`
|
|
24
|
+
* and `body` are forwarded in the request body for it to honor. */
|
|
25
|
+
export declare function Chat({ api, model, reasoningEffort, body, transport, initialMessages, placeholder, emptyState, className, }: ChatProps): import("react/jsx-runtime").JSX.Element;
|
|
26
|
+
//# sourceMappingURL=Chat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Chat.d.ts","sourceRoot":"","sources":["../../../src/data/chat/Chat.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAwB,KAAK,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,IAAI,CAAC;AAK9E,MAAM,MAAM,SAAS,GAAG;IACtB;yEACqE;IACrE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,mEAAmE;IACnE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mFAAmF;IACnF,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,uEAAuE;IACvE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B;iEAC6D;IAC7D,SAAS,CAAC,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;IACrC,iDAAiD;IACjD,eAAe,CAAC,EAAE,SAAS,EAAE,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;oEAGoE;AACpE,wBAAgB,IAAI,CAAC,EACnB,GAAiB,EACjB,KAAK,EACL,eAAe,EACf,IAAI,EACJ,SAAS,EACT,eAAe,EACf,WAAW,EACX,UAAU,EACV,SAAS,GACV,EAAE,SAAS,2CA6BX"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { ChatTransport, UIMessage } from 'ai';
|
|
2
|
+
/** A mock ChatTransport that replies with a markdown text turn, then a tool
|
|
3
|
+
* round-trip turn on the next submission. Use in stories/tests to drive the
|
|
4
|
+
* Chat UI without a backend. */
|
|
5
|
+
export declare function mockChatTransport(delayMs?: number): ChatTransport<UIMessage>;
|
|
6
|
+
//# sourceMappingURL=Chat.fixtures.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Chat.fixtures.d.ts","sourceRoot":"","sources":["../../../src/data/chat/Chat.fixtures.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAkB,MAAM,IAAI,CAAC;AAyDnE;;iCAEiC;AACjC,wBAAgB,iBAAiB,CAAC,OAAO,SAAM,GAAG,aAAa,CAAC,SAAS,CAAC,CAWzE"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useMemo } from "react";
|
|
3
|
+
import { useChat } from "@ai-sdk/react";
|
|
4
|
+
import { DefaultChatTransport } from "ai";
|
|
5
|
+
import { cn } from "../../lib/utils.js";
|
|
6
|
+
import { Conversation } from "./Conversation.js";
|
|
7
|
+
import { PromptInput } from "./PromptInput.js";
|
|
8
|
+
function Chat({
|
|
9
|
+
api = "/api/chat",
|
|
10
|
+
model,
|
|
11
|
+
reasoningEffort,
|
|
12
|
+
body,
|
|
13
|
+
transport,
|
|
14
|
+
initialMessages,
|
|
15
|
+
placeholder,
|
|
16
|
+
emptyState,
|
|
17
|
+
className
|
|
18
|
+
}) {
|
|
19
|
+
const resolvedTransport = useMemo(() => {
|
|
20
|
+
if (transport) {
|
|
21
|
+
return transport;
|
|
22
|
+
}
|
|
23
|
+
return new DefaultChatTransport({
|
|
24
|
+
api,
|
|
25
|
+
body: { ...body, ...model ? { model } : {}, ...reasoningEffort ? { reasoningEffort } : {} }
|
|
26
|
+
});
|
|
27
|
+
}, [transport, api, body, model, reasoningEffort]);
|
|
28
|
+
const { messages, sendMessage, status, stop } = useChat({
|
|
29
|
+
transport: resolvedTransport,
|
|
30
|
+
...initialMessages ? { messages: initialMessages } : {}
|
|
31
|
+
});
|
|
32
|
+
return /* @__PURE__ */ jsxs("div", { className: cn("flex h-full flex-col", className), children: [
|
|
33
|
+
/* @__PURE__ */ jsx(Conversation, { messages, emptyState }),
|
|
34
|
+
/* @__PURE__ */ jsx("div", { className: "p-4 pt-0", children: /* @__PURE__ */ jsx(
|
|
35
|
+
PromptInput,
|
|
36
|
+
{
|
|
37
|
+
status,
|
|
38
|
+
onStop: () => void stop(),
|
|
39
|
+
placeholder,
|
|
40
|
+
onSubmit: (text) => void sendMessage({ text })
|
|
41
|
+
}
|
|
42
|
+
) })
|
|
43
|
+
] });
|
|
44
|
+
}
|
|
45
|
+
export {
|
|
46
|
+
Chat
|
|
47
|
+
};
|
|
48
|
+
//# sourceMappingURL=Chat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Chat.js","sources":["../../../src/data/chat/Chat.tsx"],"sourcesContent":["import { useMemo } from \"react\";\nimport { useChat } from \"@ai-sdk/react\";\nimport { DefaultChatTransport, type ChatTransport, type UIMessage } from \"ai\";\nimport { cn } from \"../../lib/utils\";\nimport { Conversation } from \"./Conversation\";\nimport { PromptInput } from \"./PromptInput\";\n\nexport type ChatProps = {\n /** Endpoint that speaks the AI SDK v6 UI Message Stream protocol.\n * Ignored when `transport` is supplied. Defaults to \"/api/chat\". */\n api?: string;\n /** Selected `provider/model` id, forwarded in the request body. */\n model?: string;\n /** Reasoning effort (`low` | `medium` | `high`), forwarded in the request body. */\n reasoningEffort?: string;\n /** Extra fields merged into every request body (e.g. tool scoping). */\n body?: Record<string, unknown>;\n /** Pre-built transport. Supply a mock in stories/tests; otherwise a\n * DefaultChatTransport is constructed from `api`/`body`. */\n transport?: ChatTransport<UIMessage>;\n /** Initial messages to seed the conversation. */\n initialMessages?: UIMessage[];\n placeholder?: string;\n emptyState?: React.ReactNode;\n className?: string;\n};\n\n/** Self-contained AI chat: a streaming conversation log over a prompt input,\n * driven by the AI SDK `useChat` hook against a v6-compatible `/api/chat`. The\n * backend owns model selection and tool execution; `model`, `reasoningEffort`\n * and `body` are forwarded in the request body for it to honor. */\nexport function Chat({\n api = \"/api/chat\",\n model,\n reasoningEffort,\n body,\n transport,\n initialMessages,\n placeholder,\n emptyState,\n className,\n}: ChatProps) {\n const resolvedTransport = useMemo<ChatTransport<UIMessage>>(() => {\n if (transport) {\n return transport;\n }\n return new DefaultChatTransport({\n api,\n body: { ...body, ...(model ? { model } : {}), ...(reasoningEffort ? { reasoningEffort } : {}) },\n });\n }, [transport, api, body, model, reasoningEffort]);\n\n const { messages, sendMessage, status, stop } = useChat<UIMessage>({\n transport: resolvedTransport,\n ...(initialMessages ? { messages: initialMessages } : {}),\n });\n\n return (\n <div className={cn(\"flex h-full flex-col\", className)}>\n <Conversation messages={messages} emptyState={emptyState} />\n <div className=\"p-4 pt-0\">\n <PromptInput\n status={status}\n onStop={() => void stop()}\n placeholder={placeholder}\n onSubmit={(text) => void sendMessage({ text })}\n />\n </div>\n </div>\n );\n}\n"],"names":[],"mappings":";;;;;;;AA+BO,SAAS,KAAK;AAAA,EACnB,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAc;AACZ,QAAM,oBAAoB,QAAkC,MAAM;AAChE,QAAI,WAAW;AACb,aAAO;AAAA,IACT;AACA,WAAO,IAAI,qBAAqB;AAAA,MAC9B;AAAA,MACA,MAAM,EAAE,GAAG,MAAM,GAAI,QAAQ,EAAE,UAAU,CAAA,GAAK,GAAI,kBAAkB,EAAE,gBAAA,IAAoB,CAAA,EAAC;AAAA,IAAG,CAC/F;AAAA,EACH,GAAG,CAAC,WAAW,KAAK,MAAM,OAAO,eAAe,CAAC;AAEjD,QAAM,EAAE,UAAU,aAAa,QAAQ,KAAA,IAAS,QAAmB;AAAA,IACjE,WAAW;AAAA,IACX,GAAI,kBAAkB,EAAE,UAAU,oBAAoB,CAAA;AAAA,EAAC,CACxD;AAED,8BACG,OAAA,EAAI,WAAW,GAAG,wBAAwB,SAAS,GAClD,UAAA;AAAA,IAAA,oBAAC,cAAA,EAAa,UAAoB,WAAA,CAAwB;AAAA,IAC1D,oBAAC,OAAA,EAAI,WAAU,YACb,UAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA,QAAQ,MAAM,KAAK,KAAA;AAAA,QACnB;AAAA,QACA,UAAU,CAAC,SAAS,KAAK,YAAY,EAAE,MAAM;AAAA,MAAA;AAAA,IAAA,EAC/C,CACF;AAAA,EAAA,GACF;AAEJ;"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const jsxRuntime = require("react/jsx-runtime");
|
|
4
|
+
const react = require("react");
|
|
5
|
+
const utils = require("../../lib/utils.cjs");
|
|
6
|
+
const Message = require("./Message.cjs");
|
|
7
|
+
function Conversation({ messages, emptyState, className }) {
|
|
8
|
+
const scrollRef = react.useRef(null);
|
|
9
|
+
const pinnedRef = react.useRef(true);
|
|
10
|
+
const onScroll = () => {
|
|
11
|
+
const el = scrollRef.current;
|
|
12
|
+
if (!el) return;
|
|
13
|
+
const distance = el.scrollHeight - el.scrollTop - el.clientHeight;
|
|
14
|
+
pinnedRef.current = distance < 32;
|
|
15
|
+
};
|
|
16
|
+
react.useEffect(() => {
|
|
17
|
+
const el = scrollRef.current;
|
|
18
|
+
if (el && pinnedRef.current) {
|
|
19
|
+
el.scrollTop = el.scrollHeight;
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
23
|
+
"div",
|
|
24
|
+
{
|
|
25
|
+
ref: scrollRef,
|
|
26
|
+
onScroll,
|
|
27
|
+
role: "log",
|
|
28
|
+
className: utils.cn("relative flex-1 overflow-y-auto", className),
|
|
29
|
+
children: messages.length === 0 && emptyState ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex size-full flex-col items-center justify-center gap-3 p-8 text-center", children: emptyState }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col gap-8 p-4", children: messages.map((message) => /* @__PURE__ */ jsxRuntime.jsx(Message.Message, { message }, message.id)) })
|
|
30
|
+
}
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
exports.Conversation = Conversation;
|
|
34
|
+
//# sourceMappingURL=Conversation.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Conversation.cjs","sources":["../../../src/data/chat/Conversation.tsx"],"sourcesContent":["import { useEffect, useRef } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { Message } from \"./Message\";\nimport type { UIMessage } from \"./types\";\n\nexport type ConversationProps = {\n messages: UIMessage[];\n /** Shown when there are no messages yet. */\n emptyState?: React.ReactNode;\n className?: string;\n};\n\n/** A scrollable message log that sticks to the bottom as new content streams\n * in, unless the user has scrolled up. */\nexport function Conversation({ messages, emptyState, className }: ConversationProps) {\n const scrollRef = useRef<HTMLDivElement>(null);\n const pinnedRef = useRef(true);\n\n const onScroll = () => {\n const el = scrollRef.current;\n if (!el) return;\n const distance = el.scrollHeight - el.scrollTop - el.clientHeight;\n pinnedRef.current = distance < 32;\n };\n\n useEffect(() => {\n const el = scrollRef.current;\n if (el && pinnedRef.current) {\n el.scrollTop = el.scrollHeight;\n }\n });\n\n return (\n <div\n ref={scrollRef}\n onScroll={onScroll}\n role=\"log\"\n className={cn(\"relative flex-1 overflow-y-auto\", className)}\n >\n {messages.length === 0 && emptyState ? (\n <div className=\"flex size-full flex-col items-center justify-center gap-3 p-8 text-center\">\n {emptyState}\n </div>\n ) : (\n <div className=\"flex flex-col gap-8 p-4\">\n {messages.map((message) => (\n <Message key={message.id} message={message} />\n ))}\n </div>\n )}\n </div>\n );\n}\n"],"names":["useRef","useEffect","jsx","cn","Message"],"mappings":";;;;;;AAcO,SAAS,aAAa,EAAE,UAAU,YAAY,aAAgC;AACnF,QAAM,YAAYA,MAAAA,OAAuB,IAAI;AAC7C,QAAM,YAAYA,MAAAA,OAAO,IAAI;AAE7B,QAAM,WAAW,MAAM;AACrB,UAAM,KAAK,UAAU;AACrB,QAAI,CAAC,GAAI;AACT,UAAM,WAAW,GAAG,eAAe,GAAG,YAAY,GAAG;AACrD,cAAU,UAAU,WAAW;AAAA,EACjC;AAEAC,QAAAA,UAAU,MAAM;AACd,UAAM,KAAK,UAAU;AACrB,QAAI,MAAM,UAAU,SAAS;AAC3B,SAAG,YAAY,GAAG;AAAA,IACpB;AAAA,EACF,CAAC;AAED,SACEC,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAK;AAAA,MACL;AAAA,MACA,MAAK;AAAA,MACL,WAAWC,MAAAA,GAAG,mCAAmC,SAAS;AAAA,MAEzD,UAAA,SAAS,WAAW,KAAK,aACxBD,2BAAAA,IAAC,SAAI,WAAU,6EACZ,UAAA,WAAA,CACH,IAEAA,2BAAAA,IAAC,OAAA,EAAI,WAAU,2BACZ,UAAA,SAAS,IAAI,CAAC,YACbA,+BAACE,QAAAA,WAAyB,QAAA,GAAZ,QAAQ,EAAsB,CAC7C,EAAA,CACH;AAAA,IAAA;AAAA,EAAA;AAIR;;"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { UIMessage } from './types';
|
|
2
|
+
export type ConversationProps = {
|
|
3
|
+
messages: UIMessage[];
|
|
4
|
+
/** Shown when there are no messages yet. */
|
|
5
|
+
emptyState?: React.ReactNode;
|
|
6
|
+
className?: string;
|
|
7
|
+
};
|
|
8
|
+
/** A scrollable message log that sticks to the bottom as new content streams
|
|
9
|
+
* in, unless the user has scrolled up. */
|
|
10
|
+
export declare function Conversation({ messages, emptyState, className }: ConversationProps): import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
//# sourceMappingURL=Conversation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Conversation.d.ts","sourceRoot":"","sources":["../../../src/data/chat/Conversation.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEzC,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,EAAE,SAAS,EAAE,CAAC;IACtB,4CAA4C;IAC5C,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;2CAC2C;AAC3C,wBAAgB,YAAY,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,iBAAiB,2CAsClF"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useRef, useEffect } from "react";
|
|
3
|
+
import { cn } from "../../lib/utils.js";
|
|
4
|
+
import { Message } from "./Message.js";
|
|
5
|
+
function Conversation({ messages, emptyState, className }) {
|
|
6
|
+
const scrollRef = useRef(null);
|
|
7
|
+
const pinnedRef = useRef(true);
|
|
8
|
+
const onScroll = () => {
|
|
9
|
+
const el = scrollRef.current;
|
|
10
|
+
if (!el) return;
|
|
11
|
+
const distance = el.scrollHeight - el.scrollTop - el.clientHeight;
|
|
12
|
+
pinnedRef.current = distance < 32;
|
|
13
|
+
};
|
|
14
|
+
useEffect(() => {
|
|
15
|
+
const el = scrollRef.current;
|
|
16
|
+
if (el && pinnedRef.current) {
|
|
17
|
+
el.scrollTop = el.scrollHeight;
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
return /* @__PURE__ */ jsx(
|
|
21
|
+
"div",
|
|
22
|
+
{
|
|
23
|
+
ref: scrollRef,
|
|
24
|
+
onScroll,
|
|
25
|
+
role: "log",
|
|
26
|
+
className: cn("relative flex-1 overflow-y-auto", className),
|
|
27
|
+
children: messages.length === 0 && emptyState ? /* @__PURE__ */ jsx("div", { className: "flex size-full flex-col items-center justify-center gap-3 p-8 text-center", children: emptyState }) : /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-8 p-4", children: messages.map((message) => /* @__PURE__ */ jsx(Message, { message }, message.id)) })
|
|
28
|
+
}
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
export {
|
|
32
|
+
Conversation
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=Conversation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Conversation.js","sources":["../../../src/data/chat/Conversation.tsx"],"sourcesContent":["import { useEffect, useRef } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { Message } from \"./Message\";\nimport type { UIMessage } from \"./types\";\n\nexport type ConversationProps = {\n messages: UIMessage[];\n /** Shown when there are no messages yet. */\n emptyState?: React.ReactNode;\n className?: string;\n};\n\n/** A scrollable message log that sticks to the bottom as new content streams\n * in, unless the user has scrolled up. */\nexport function Conversation({ messages, emptyState, className }: ConversationProps) {\n const scrollRef = useRef<HTMLDivElement>(null);\n const pinnedRef = useRef(true);\n\n const onScroll = () => {\n const el = scrollRef.current;\n if (!el) return;\n const distance = el.scrollHeight - el.scrollTop - el.clientHeight;\n pinnedRef.current = distance < 32;\n };\n\n useEffect(() => {\n const el = scrollRef.current;\n if (el && pinnedRef.current) {\n el.scrollTop = el.scrollHeight;\n }\n });\n\n return (\n <div\n ref={scrollRef}\n onScroll={onScroll}\n role=\"log\"\n className={cn(\"relative flex-1 overflow-y-auto\", className)}\n >\n {messages.length === 0 && emptyState ? (\n <div className=\"flex size-full flex-col items-center justify-center gap-3 p-8 text-center\">\n {emptyState}\n </div>\n ) : (\n <div className=\"flex flex-col gap-8 p-4\">\n {messages.map((message) => (\n <Message key={message.id} message={message} />\n ))}\n </div>\n )}\n </div>\n );\n}\n"],"names":[],"mappings":";;;;AAcO,SAAS,aAAa,EAAE,UAAU,YAAY,aAAgC;AACnF,QAAM,YAAY,OAAuB,IAAI;AAC7C,QAAM,YAAY,OAAO,IAAI;AAE7B,QAAM,WAAW,MAAM;AACrB,UAAM,KAAK,UAAU;AACrB,QAAI,CAAC,GAAI;AACT,UAAM,WAAW,GAAG,eAAe,GAAG,YAAY,GAAG;AACrD,cAAU,UAAU,WAAW;AAAA,EACjC;AAEA,YAAU,MAAM;AACd,UAAM,KAAK,UAAU;AACrB,QAAI,MAAM,UAAU,SAAS;AAC3B,SAAG,YAAY,GAAG;AAAA,IACpB;AAAA,EACF,CAAC;AAED,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAK;AAAA,MACL;AAAA,MACA,MAAK;AAAA,MACL,WAAW,GAAG,mCAAmC,SAAS;AAAA,MAEzD,UAAA,SAAS,WAAW,KAAK,aACxB,oBAAC,SAAI,WAAU,6EACZ,UAAA,WAAA,CACH,IAEA,oBAAC,OAAA,EAAI,WAAU,2BACZ,UAAA,SAAS,IAAI,CAAC,YACb,oBAAC,WAAyB,QAAA,GAAZ,QAAQ,EAAsB,CAC7C,EAAA,CACH;AAAA,IAAA;AAAA,EAAA;AAIR;"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const jsxRuntime = require("react/jsx-runtime");
|
|
4
|
+
const utils = require("../../lib/utils.cjs");
|
|
5
|
+
const Markdown = require("../Markdown.cjs");
|
|
6
|
+
const ToolCall = require("./ToolCall.cjs");
|
|
7
|
+
const types = require("./types.cjs");
|
|
8
|
+
function Message({ message, className }) {
|
|
9
|
+
const isUser = message.role === "user";
|
|
10
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
11
|
+
"div",
|
|
12
|
+
{
|
|
13
|
+
className: utils.cn(
|
|
14
|
+
"group flex w-full max-w-[95%] flex-col gap-2",
|
|
15
|
+
isUser ? "ml-auto items-end" : "items-start",
|
|
16
|
+
className
|
|
17
|
+
),
|
|
18
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
19
|
+
"div",
|
|
20
|
+
{
|
|
21
|
+
className: utils.cn(
|
|
22
|
+
"flex w-fit min-w-0 max-w-full flex-col gap-2 overflow-hidden text-sm",
|
|
23
|
+
isUser && "rounded-lg bg-secondary px-4 py-3 text-secondary-foreground"
|
|
24
|
+
),
|
|
25
|
+
children: message.parts.map((part, i) => /* @__PURE__ */ jsxRuntime.jsx(MessagePart, { part, isUser }, `${message.id}-${i}`))
|
|
26
|
+
}
|
|
27
|
+
)
|
|
28
|
+
}
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
function MessagePart({ part, isUser }) {
|
|
32
|
+
if (part.type === "text") {
|
|
33
|
+
if (isUser) {
|
|
34
|
+
return /* @__PURE__ */ jsxRuntime.jsx("span", { className: "whitespace-pre-wrap break-words", children: part.text });
|
|
35
|
+
}
|
|
36
|
+
return /* @__PURE__ */ jsxRuntime.jsx(Markdown.Markdown, { text: part.text });
|
|
37
|
+
}
|
|
38
|
+
if (types.isDynamicToolPart(part) || types.isTypedToolPart(part)) {
|
|
39
|
+
return /* @__PURE__ */ jsxRuntime.jsx(ToolCall.ToolCall, { part });
|
|
40
|
+
}
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
exports.Message = Message;
|
|
44
|
+
//# sourceMappingURL=Message.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Message.cjs","sources":["../../../src/data/chat/Message.tsx"],"sourcesContent":["import { cn } from \"../../lib/utils\";\nimport { Markdown } from \"../Markdown\";\nimport { ToolCall } from \"./ToolCall\";\nimport type { UIMessage } from \"./types\";\nimport { isDynamicToolPart, isTypedToolPart, type AnyToolPart } from \"./types\";\n\nexport type MessageProps = {\n message: UIMessage;\n className?: string;\n};\n\n/** Renders one chat message. User messages are right-aligned bubbles; assistant\n * messages render text parts as markdown and tool parts as collapsible tool\n * calls, in document order. */\nexport function Message({ message, className }: MessageProps) {\n const isUser = message.role === \"user\";\n return (\n <div\n className={cn(\n \"group flex w-full max-w-[95%] flex-col gap-2\",\n isUser ? \"ml-auto items-end\" : \"items-start\",\n className,\n )}\n >\n <div\n className={cn(\n \"flex w-fit min-w-0 max-w-full flex-col gap-2 overflow-hidden text-sm\",\n isUser && \"rounded-lg bg-secondary px-4 py-3 text-secondary-foreground\",\n )}\n >\n {message.parts.map((part, i) => (\n <MessagePart key={`${message.id}-${i}`} part={part} isUser={isUser} />\n ))}\n </div>\n </div>\n );\n}\n\nfunction MessagePart({ part, isUser }: { part: UIMessage[\"parts\"][number]; isUser: boolean }) {\n if (part.type === \"text\") {\n if (isUser) {\n return <span className=\"whitespace-pre-wrap break-words\">{part.text}</span>;\n }\n return <Markdown text={part.text} />;\n }\n if (isDynamicToolPart(part) || isTypedToolPart(part)) {\n return <ToolCall part={part as AnyToolPart} />;\n }\n return null;\n}\n"],"names":["jsx","cn","Markdown","isDynamicToolPart","isTypedToolPart","ToolCall"],"mappings":";;;;;;;AAcO,SAAS,QAAQ,EAAE,SAAS,aAA2B;AAC5D,QAAM,SAAS,QAAQ,SAAS;AAChC,SACEA,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWC,MAAAA;AAAAA,QACT;AAAA,QACA,SAAS,sBAAsB;AAAA,QAC/B;AAAA,MAAA;AAAA,MAGF,UAAAD,2BAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAWC,MAAAA;AAAAA,YACT;AAAA,YACA,UAAU;AAAA,UAAA;AAAA,UAGX,kBAAQ,MAAM,IAAI,CAAC,MAAM,MACxBD,2BAAAA,IAAC,aAAA,EAAuC,MAAY,OAAA,GAAlC,GAAG,QAAQ,EAAE,IAAI,CAAC,EAAgC,CACrE;AAAA,QAAA;AAAA,MAAA;AAAA,IACH;AAAA,EAAA;AAGN;AAEA,SAAS,YAAY,EAAE,MAAM,UAAiE;AAC5F,MAAI,KAAK,SAAS,QAAQ;AACxB,QAAI,QAAQ;AACV,aAAOA,2BAAAA,IAAC,QAAA,EAAK,WAAU,mCAAmC,eAAK,MAAK;AAAA,IACtE;AACA,WAAOA,2BAAAA,IAACE,SAAAA,UAAA,EAAS,MAAM,KAAK,KAAA,CAAM;AAAA,EACpC;AACA,MAAIC,MAAAA,kBAAkB,IAAI,KAAKC,MAAAA,gBAAgB,IAAI,GAAG;AACpD,WAAOJ,+BAACK,SAAAA,YAAS,MAA2B;AAAA,EAC9C;AACA,SAAO;AACT;;"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { UIMessage } from './types';
|
|
2
|
+
export type MessageProps = {
|
|
3
|
+
message: UIMessage;
|
|
4
|
+
className?: string;
|
|
5
|
+
};
|
|
6
|
+
/** Renders one chat message. User messages are right-aligned bubbles; assistant
|
|
7
|
+
* messages render text parts as markdown and tool parts as collapsible tool
|
|
8
|
+
* calls, in document order. */
|
|
9
|
+
export declare function Message({ message, className }: MessageProps): import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
//# sourceMappingURL=Message.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Message.d.ts","sourceRoot":"","sources":["../../../src/data/chat/Message.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAGzC,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,SAAS,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;gCAEgC;AAChC,wBAAgB,OAAO,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,YAAY,2CAsB3D"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { cn } from "../../lib/utils.js";
|
|
3
|
+
import { Markdown } from "../Markdown.js";
|
|
4
|
+
import { ToolCall } from "./ToolCall.js";
|
|
5
|
+
import { isDynamicToolPart, isTypedToolPart } from "./types.js";
|
|
6
|
+
function Message({ message, className }) {
|
|
7
|
+
const isUser = message.role === "user";
|
|
8
|
+
return /* @__PURE__ */ jsx(
|
|
9
|
+
"div",
|
|
10
|
+
{
|
|
11
|
+
className: cn(
|
|
12
|
+
"group flex w-full max-w-[95%] flex-col gap-2",
|
|
13
|
+
isUser ? "ml-auto items-end" : "items-start",
|
|
14
|
+
className
|
|
15
|
+
),
|
|
16
|
+
children: /* @__PURE__ */ jsx(
|
|
17
|
+
"div",
|
|
18
|
+
{
|
|
19
|
+
className: cn(
|
|
20
|
+
"flex w-fit min-w-0 max-w-full flex-col gap-2 overflow-hidden text-sm",
|
|
21
|
+
isUser && "rounded-lg bg-secondary px-4 py-3 text-secondary-foreground"
|
|
22
|
+
),
|
|
23
|
+
children: message.parts.map((part, i) => /* @__PURE__ */ jsx(MessagePart, { part, isUser }, `${message.id}-${i}`))
|
|
24
|
+
}
|
|
25
|
+
)
|
|
26
|
+
}
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
function MessagePart({ part, isUser }) {
|
|
30
|
+
if (part.type === "text") {
|
|
31
|
+
if (isUser) {
|
|
32
|
+
return /* @__PURE__ */ jsx("span", { className: "whitespace-pre-wrap break-words", children: part.text });
|
|
33
|
+
}
|
|
34
|
+
return /* @__PURE__ */ jsx(Markdown, { text: part.text });
|
|
35
|
+
}
|
|
36
|
+
if (isDynamicToolPart(part) || isTypedToolPart(part)) {
|
|
37
|
+
return /* @__PURE__ */ jsx(ToolCall, { part });
|
|
38
|
+
}
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
export {
|
|
42
|
+
Message
|
|
43
|
+
};
|
|
44
|
+
//# sourceMappingURL=Message.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Message.js","sources":["../../../src/data/chat/Message.tsx"],"sourcesContent":["import { cn } from \"../../lib/utils\";\nimport { Markdown } from \"../Markdown\";\nimport { ToolCall } from \"./ToolCall\";\nimport type { UIMessage } from \"./types\";\nimport { isDynamicToolPart, isTypedToolPart, type AnyToolPart } from \"./types\";\n\nexport type MessageProps = {\n message: UIMessage;\n className?: string;\n};\n\n/** Renders one chat message. User messages are right-aligned bubbles; assistant\n * messages render text parts as markdown and tool parts as collapsible tool\n * calls, in document order. */\nexport function Message({ message, className }: MessageProps) {\n const isUser = message.role === \"user\";\n return (\n <div\n className={cn(\n \"group flex w-full max-w-[95%] flex-col gap-2\",\n isUser ? \"ml-auto items-end\" : \"items-start\",\n className,\n )}\n >\n <div\n className={cn(\n \"flex w-fit min-w-0 max-w-full flex-col gap-2 overflow-hidden text-sm\",\n isUser && \"rounded-lg bg-secondary px-4 py-3 text-secondary-foreground\",\n )}\n >\n {message.parts.map((part, i) => (\n <MessagePart key={`${message.id}-${i}`} part={part} isUser={isUser} />\n ))}\n </div>\n </div>\n );\n}\n\nfunction MessagePart({ part, isUser }: { part: UIMessage[\"parts\"][number]; isUser: boolean }) {\n if (part.type === \"text\") {\n if (isUser) {\n return <span className=\"whitespace-pre-wrap break-words\">{part.text}</span>;\n }\n return <Markdown text={part.text} />;\n }\n if (isDynamicToolPart(part) || isTypedToolPart(part)) {\n return <ToolCall part={part as AnyToolPart} />;\n }\n return null;\n}\n"],"names":[],"mappings":";;;;;AAcO,SAAS,QAAQ,EAAE,SAAS,aAA2B;AAC5D,QAAM,SAAS,QAAQ,SAAS;AAChC,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,SAAS,sBAAsB;AAAA,QAC/B;AAAA,MAAA;AAAA,MAGF,UAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAW;AAAA,YACT;AAAA,YACA,UAAU;AAAA,UAAA;AAAA,UAGX,kBAAQ,MAAM,IAAI,CAAC,MAAM,MACxB,oBAAC,aAAA,EAAuC,MAAY,OAAA,GAAlC,GAAG,QAAQ,EAAE,IAAI,CAAC,EAAgC,CACrE;AAAA,QAAA;AAAA,MAAA;AAAA,IACH;AAAA,EAAA;AAGN;AAEA,SAAS,YAAY,EAAE,MAAM,UAAiE;AAC5F,MAAI,KAAK,SAAS,QAAQ;AACxB,QAAI,QAAQ;AACV,aAAO,oBAAC,QAAA,EAAK,WAAU,mCAAmC,eAAK,MAAK;AAAA,IACtE;AACA,WAAO,oBAAC,UAAA,EAAS,MAAM,KAAK,KAAA,CAAM;AAAA,EACpC;AACA,MAAI,kBAAkB,IAAI,KAAK,gBAAgB,IAAI,GAAG;AACpD,WAAO,oBAAC,YAAS,MAA2B;AAAA,EAC9C;AACA,SAAO;AACT;"}
|