@adea-ai/ui 0.140.0 → 0.142.0
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/components/composites/appearance-editor/appearance-editor.js +2 -2
- package/dist/components/composites/appearance-editor/appearance-editor.js.map +1 -1
- package/dist/components/composites/catalog-browser/catalog-browser-group.js +1 -1
- package/dist/components/composites/chain-of-thought/chain-of-thought.d.ts +56 -0
- package/dist/components/composites/chain-of-thought/chain-of-thought.d.ts.map +1 -0
- package/dist/components/composites/chain-of-thought/chain-of-thought.js +117 -0
- package/dist/components/composites/chain-of-thought/chain-of-thought.js.map +1 -0
- package/dist/components/composites/chain-of-thought/index.d.ts +2 -0
- package/dist/components/composites/chain-of-thought/index.d.ts.map +1 -0
- package/dist/components/composites/chain-of-thought/index.js +2 -0
- package/dist/components/composites/chat/chat.d.ts +67 -0
- package/dist/components/composites/chat/chat.d.ts.map +1 -0
- package/dist/components/composites/chat/chat.js +179 -0
- package/dist/components/composites/chat/chat.js.map +1 -0
- package/dist/components/composites/chat/index.d.ts +2 -0
- package/dist/components/composites/chat/index.d.ts.map +1 -0
- package/dist/components/composites/chat/index.js +2 -0
- package/dist/components/composites/checkpoint/checkpoint-model.d.ts +34 -0
- package/dist/components/composites/checkpoint/checkpoint-model.d.ts.map +1 -0
- package/dist/components/composites/checkpoint/checkpoint-model.js +48 -0
- package/dist/components/composites/checkpoint/checkpoint-model.js.map +1 -0
- package/dist/components/composites/checkpoint/checkpoint.d.ts +48 -0
- package/dist/components/composites/checkpoint/checkpoint.d.ts.map +1 -0
- package/dist/components/composites/checkpoint/checkpoint.js +160 -0
- package/dist/components/composites/checkpoint/checkpoint.js.map +1 -0
- package/dist/components/composites/checkpoint/index.d.ts +3 -0
- package/dist/components/composites/checkpoint/index.d.ts.map +1 -0
- package/dist/components/composites/checkpoint/index.js +3 -0
- package/dist/components/composites/confirmation/confirmation-model.d.ts +45 -0
- package/dist/components/composites/confirmation/confirmation-model.d.ts.map +1 -0
- package/dist/components/composites/confirmation/confirmation-model.js +51 -0
- package/dist/components/composites/confirmation/confirmation-model.js.map +1 -0
- package/dist/components/composites/confirmation/confirmation.d.ts +72 -0
- package/dist/components/composites/confirmation/confirmation.d.ts.map +1 -0
- package/dist/components/composites/confirmation/confirmation.js +300 -0
- package/dist/components/composites/confirmation/confirmation.js.map +1 -0
- package/dist/components/composites/confirmation/index.d.ts +3 -0
- package/dist/components/composites/confirmation/index.d.ts.map +1 -0
- package/dist/components/composites/confirmation/index.js +3 -0
- package/dist/components/composites/context/context-model.d.ts +69 -0
- package/dist/components/composites/context/context-model.d.ts.map +1 -0
- package/dist/components/composites/context/context-model.js +122 -0
- package/dist/components/composites/context/context-model.js.map +1 -0
- package/dist/components/composites/context/context.d.ts +38 -0
- package/dist/components/composites/context/context.d.ts.map +1 -0
- package/dist/components/composites/context/context.js +234 -0
- package/dist/components/composites/context/context.js.map +1 -0
- package/dist/components/composites/context/index.d.ts +3 -0
- package/dist/components/composites/context/index.d.ts.map +1 -0
- package/dist/components/composites/context/index.js +3 -0
- package/dist/components/composites/file-tree/build-file-tree.d.ts +138 -0
- package/dist/components/composites/file-tree/build-file-tree.d.ts.map +1 -0
- package/dist/components/composites/file-tree/build-file-tree.js +325 -0
- package/dist/components/composites/file-tree/build-file-tree.js.map +1 -0
- package/dist/components/composites/file-tree/file-tree.d.ts +74 -0
- package/dist/components/composites/file-tree/file-tree.d.ts.map +1 -0
- package/dist/components/composites/file-tree/file-tree.js +389 -0
- package/dist/components/composites/file-tree/file-tree.js.map +1 -0
- package/dist/components/composites/file-tree/index.d.ts +3 -0
- package/dist/components/composites/file-tree/index.d.ts.map +1 -0
- package/dist/components/composites/file-tree/index.js +3 -0
- package/dist/components/composites/inline-citation/citation.d.ts +37 -0
- package/dist/components/composites/inline-citation/citation.d.ts.map +1 -0
- package/dist/components/composites/inline-citation/citation.js +52 -0
- package/dist/components/composites/inline-citation/citation.js.map +1 -0
- package/dist/components/composites/inline-citation/index.d.ts +3 -0
- package/dist/components/composites/inline-citation/index.d.ts.map +1 -0
- package/dist/components/composites/inline-citation/index.js +3 -0
- package/dist/components/composites/inline-citation/inline-citation.d.ts +64 -0
- package/dist/components/composites/inline-citation/inline-citation.d.ts.map +1 -0
- package/dist/components/composites/inline-citation/inline-citation.js +272 -0
- package/dist/components/composites/inline-citation/inline-citation.js.map +1 -0
- package/dist/components/composites/message-scroller/index.d.ts +3 -0
- package/dist/components/composites/message-scroller/index.d.ts.map +1 -0
- package/dist/components/composites/message-scroller/index.js +3 -0
- package/dist/components/composites/message-scroller/message-scroller.d.ts +55 -0
- package/dist/components/composites/message-scroller/message-scroller.d.ts.map +1 -0
- package/dist/components/composites/message-scroller/message-scroller.js +201 -0
- package/dist/components/composites/message-scroller/message-scroller.js.map +1 -0
- package/dist/components/composites/message-scroller/scroll-anchor.d.ts +66 -0
- package/dist/components/composites/message-scroller/scroll-anchor.d.ts.map +1 -0
- package/dist/components/composites/message-scroller/scroll-anchor.js +122 -0
- package/dist/components/composites/message-scroller/scroll-anchor.js.map +1 -0
- package/dist/components/composites/model-selector/index.d.ts +3 -0
- package/dist/components/composites/model-selector/index.d.ts.map +1 -0
- package/dist/components/composites/model-selector/index.js +3 -0
- package/dist/components/composites/model-selector/model-selector.d.ts +55 -0
- package/dist/components/composites/model-selector/model-selector.d.ts.map +1 -0
- package/dist/components/composites/model-selector/model-selector.js +490 -0
- package/dist/components/composites/model-selector/model-selector.js.map +1 -0
- package/dist/components/composites/model-selector/models.d.ts +51 -0
- package/dist/components/composites/model-selector/models.d.ts.map +1 -0
- package/dist/components/composites/model-selector/models.js +71 -0
- package/dist/components/composites/model-selector/models.js.map +1 -0
- package/dist/components/composites/plan/index.d.ts +2 -0
- package/dist/components/composites/plan/index.d.ts.map +1 -0
- package/dist/components/composites/plan/index.js +2 -0
- package/dist/components/composites/plan/plan.d.ts +61 -0
- package/dist/components/composites/plan/plan.d.ts.map +1 -0
- package/dist/components/composites/plan/plan.js +130 -0
- package/dist/components/composites/plan/plan.js.map +1 -0
- package/dist/components/composites/queue/index.d.ts +2 -0
- package/dist/components/composites/queue/index.d.ts.map +1 -0
- package/dist/components/composites/queue/index.js +2 -0
- package/dist/components/composites/queue/queue.d.ts +77 -0
- package/dist/components/composites/queue/queue.d.ts.map +1 -0
- package/dist/components/composites/queue/queue.js +271 -0
- package/dist/components/composites/queue/queue.js.map +1 -0
- package/dist/components/composites/reasoning/index.d.ts +2 -0
- package/dist/components/composites/reasoning/index.d.ts.map +1 -0
- package/dist/components/composites/reasoning/index.js +2 -0
- package/dist/components/composites/reasoning/reasoning.d.ts +62 -0
- package/dist/components/composites/reasoning/reasoning.d.ts.map +1 -0
- package/dist/components/composites/reasoning/reasoning.js +156 -0
- package/dist/components/composites/reasoning/reasoning.js.map +1 -0
- package/dist/components/composites/sources/index.d.ts +3 -0
- package/dist/components/composites/sources/index.d.ts.map +1 -0
- package/dist/components/composites/sources/index.js +3 -0
- package/dist/components/composites/sources/source.d.ts +46 -0
- package/dist/components/composites/sources/source.d.ts.map +1 -0
- package/dist/components/composites/sources/source.js +74 -0
- package/dist/components/composites/sources/source.js.map +1 -0
- package/dist/components/composites/sources/sources.d.ts +45 -0
- package/dist/components/composites/sources/sources.d.ts.map +1 -0
- package/dist/components/composites/sources/sources.js +175 -0
- package/dist/components/composites/sources/sources.js.map +1 -0
- package/dist/components/composites/stack-trace/index.d.ts +3 -0
- package/dist/components/composites/stack-trace/index.d.ts.map +1 -0
- package/dist/components/composites/stack-trace/index.js +3 -0
- package/dist/components/composites/stack-trace/parse-stack-trace.d.ts +118 -0
- package/dist/components/composites/stack-trace/parse-stack-trace.d.ts.map +1 -0
- package/dist/components/composites/stack-trace/parse-stack-trace.js +376 -0
- package/dist/components/composites/stack-trace/parse-stack-trace.js.map +1 -0
- package/dist/components/composites/stack-trace/stack-trace.d.ts +63 -0
- package/dist/components/composites/stack-trace/stack-trace.d.ts.map +1 -0
- package/dist/components/composites/stack-trace/stack-trace.js +491 -0
- package/dist/components/composites/stack-trace/stack-trace.js.map +1 -0
- package/dist/components/composites/subagent/index.d.ts +2 -0
- package/dist/components/composites/subagent/index.d.ts.map +1 -0
- package/dist/components/composites/subagent/index.js +2 -0
- package/dist/components/composites/subagent/subagent.d.ts +55 -0
- package/dist/components/composites/subagent/subagent.d.ts.map +1 -0
- package/dist/components/composites/subagent/subagent.js +138 -0
- package/dist/components/composites/subagent/subagent.js.map +1 -0
- package/dist/components/composites/suggestion/index.d.ts +2 -0
- package/dist/components/composites/suggestion/index.d.ts.map +1 -0
- package/dist/components/composites/suggestion/index.js +2 -0
- package/dist/components/composites/suggestion/suggestion.d.ts +37 -0
- package/dist/components/composites/suggestion/suggestion.d.ts.map +1 -0
- package/dist/components/composites/suggestion/suggestion.js +100 -0
- package/dist/components/composites/suggestion/suggestion.js.map +1 -0
- package/dist/components/composites/task/index.d.ts +2 -0
- package/dist/components/composites/task/index.d.ts.map +1 -0
- package/dist/components/composites/task/index.js +2 -0
- package/dist/components/composites/task/task.d.ts +96 -0
- package/dist/components/composites/task/task.d.ts.map +1 -0
- package/dist/components/composites/task/task.js +311 -0
- package/dist/components/composites/task/task.js.map +1 -0
- package/dist/components/composites/terminal/ansi.d.ts +101 -0
- package/dist/components/composites/terminal/ansi.d.ts.map +1 -0
- package/dist/components/composites/terminal/ansi.js +544 -0
- package/dist/components/composites/terminal/ansi.js.map +1 -0
- package/dist/components/composites/terminal/index.d.ts +4 -0
- package/dist/components/composites/terminal/index.d.ts.map +1 -0
- package/dist/components/composites/terminal/index.js +4 -0
- package/dist/components/composites/terminal/terminal-model.d.ts +63 -0
- package/dist/components/composites/terminal/terminal-model.d.ts.map +1 -0
- package/dist/components/composites/terminal/terminal-model.js +69 -0
- package/dist/components/composites/terminal/terminal-model.js.map +1 -0
- package/dist/components/composites/terminal/terminal.d.ts +88 -0
- package/dist/components/composites/terminal/terminal.d.ts.map +1 -0
- package/dist/components/composites/terminal/terminal.js +500 -0
- package/dist/components/composites/terminal/terminal.js.map +1 -0
- package/dist/components/composites/test-results/index.d.ts +3 -0
- package/dist/components/composites/test-results/index.d.ts.map +1 -0
- package/dist/components/composites/test-results/index.js +3 -0
- package/dist/components/composites/test-results/test-results-model.d.ts +154 -0
- package/dist/components/composites/test-results/test-results-model.d.ts.map +1 -0
- package/dist/components/composites/test-results/test-results-model.js +252 -0
- package/dist/components/composites/test-results/test-results-model.js.map +1 -0
- package/dist/components/composites/test-results/test-results.d.ts +60 -0
- package/dist/components/composites/test-results/test-results.d.ts.map +1 -0
- package/dist/components/composites/test-results/test-results.js +631 -0
- package/dist/components/composites/test-results/test-results.js.map +1 -0
- package/dist/components/composites/tool/format-tool-value.d.ts +37 -0
- package/dist/components/composites/tool/format-tool-value.d.ts.map +1 -0
- package/dist/components/composites/tool/format-tool-value.js +135 -0
- package/dist/components/composites/tool/format-tool-value.js.map +1 -0
- package/dist/components/composites/tool/index.d.ts +3 -0
- package/dist/components/composites/tool/index.d.ts.map +1 -0
- package/dist/components/composites/tool/index.js +3 -0
- package/dist/components/composites/tool/tool.d.ts +69 -0
- package/dist/components/composites/tool/tool.d.ts.map +1 -0
- package/dist/components/composites/tool/tool.js +214 -0
- package/dist/components/composites/tool/tool.js.map +1 -0
- package/dist/components/composites/update-dialog/update-dialog.js +1 -1
- package/dist/components/conversation/conversation-surface.d.ts +7 -0
- package/dist/components/conversation/conversation-surface.d.ts.map +1 -1
- package/dist/components/conversation/conversation-surface.js +2 -0
- package/dist/components/conversation/conversation-surface.js.map +1 -1
- package/dist/components/conversation/scroll-follow-core.d.ts +24 -0
- package/dist/components/conversation/scroll-follow-core.d.ts.map +1 -1
- package/dist/components/conversation/scroll-follow-core.js +23 -1
- package/dist/components/conversation/scroll-follow-core.js.map +1 -1
- package/dist/components/conversation/scroll-follow.d.ts +3 -0
- package/dist/components/conversation/scroll-follow.d.ts.map +1 -1
- package/dist/components/conversation/scroll-follow.js +80 -1
- package/dist/components/conversation/scroll-follow.js.map +1 -1
- package/dist/components/ui/attachment/attachment.d.ts +58 -0
- package/dist/components/ui/attachment/attachment.d.ts.map +1 -0
- package/dist/components/ui/attachment/attachment.js +279 -0
- package/dist/components/ui/attachment/attachment.js.map +1 -0
- package/dist/components/ui/attachment/index.d.ts +2 -0
- package/dist/components/ui/attachment/index.d.ts.map +1 -0
- package/dist/components/ui/attachment/index.js +2 -0
- package/dist/components/ui/badge/badge.d.ts +1 -1
- package/dist/components/ui/bubble/bubble.d.ts +33 -0
- package/dist/components/ui/bubble/bubble.d.ts.map +1 -0
- package/dist/components/ui/bubble/bubble.js +95 -0
- package/dist/components/ui/bubble/bubble.js.map +1 -0
- package/dist/components/ui/bubble/index.d.ts +2 -0
- package/dist/components/ui/bubble/index.d.ts.map +1 -0
- package/dist/components/ui/bubble/index.js +2 -0
- package/dist/components/ui/button/button.d.ts +1 -1
- package/dist/components/ui/code-block/code-block.d.ts +56 -3
- package/dist/components/ui/code-block/code-block.d.ts.map +1 -1
- package/dist/components/ui/code-block/code-block.js +231 -50
- package/dist/components/ui/code-block/code-block.js.map +1 -1
- package/dist/components/ui/code-block/index.d.ts +1 -1
- package/dist/components/ui/code-block/index.d.ts.map +1 -1
- package/dist/components/ui/code-block/index.js +2 -2
- package/dist/components/ui/field/number-field.d.ts +21 -4
- package/dist/components/ui/field/number-field.d.ts.map +1 -1
- package/dist/components/ui/field/number-field.js +22 -11
- package/dist/components/ui/field/number-field.js.map +1 -1
- package/dist/components/ui/marker/index.d.ts +2 -0
- package/dist/components/ui/marker/index.d.ts.map +1 -0
- package/dist/components/ui/marker/index.js +2 -0
- package/dist/components/ui/marker/marker.d.ts +35 -0
- package/dist/components/ui/marker/marker.d.ts.map +1 -0
- package/dist/components/ui/marker/marker.js +123 -0
- package/dist/components/ui/marker/marker.js.map +1 -0
- package/dist/components/ui/message/cite-ranges.d.ts +42 -0
- package/dist/components/ui/message/cite-ranges.d.ts.map +1 -0
- package/dist/components/ui/message/cite-ranges.js +105 -0
- package/dist/components/ui/message/cite-ranges.js.map +1 -0
- package/dist/components/ui/message/index.d.ts +4 -0
- package/dist/components/ui/message/index.d.ts.map +1 -0
- package/dist/components/ui/message/index.js +4 -0
- package/dist/components/ui/message/message.d.ts +95 -0
- package/dist/components/ui/message/message.d.ts.map +1 -0
- package/dist/components/ui/message/message.js +443 -0
- package/dist/components/ui/message/message.js.map +1 -0
- package/dist/components/ui/message/parse-message-text.d.ts +93 -0
- package/dist/components/ui/message/parse-message-text.d.ts.map +1 -0
- package/dist/components/ui/message/parse-message-text.js +365 -0
- package/dist/components/ui/message/parse-message-text.js.map +1 -0
- package/dist/components/ui/questionnaire/index.d.ts +2 -0
- package/dist/components/ui/questionnaire/index.d.ts.map +1 -0
- package/dist/components/ui/questionnaire/index.js +2 -0
- package/dist/components/ui/questionnaire/questionnaire.d.ts +83 -0
- package/dist/components/ui/questionnaire/questionnaire.d.ts.map +1 -0
- package/dist/components/ui/questionnaire/questionnaire.js +470 -0
- package/dist/components/ui/questionnaire/questionnaire.js.map +1 -0
- package/dist/components/ui/status-chip/status-chip.d.ts +1 -1
- package/dist/components/ui/switch/switch.js +11 -11
- package/dist/components/ui/switch/switch.js.map +1 -1
- package/dist/components/ui/trace/index.d.ts +2 -0
- package/dist/components/ui/trace/index.d.ts.map +1 -0
- package/dist/components/ui/trace/index.js +2 -0
- package/dist/components/ui/trace/trace.d.ts +72 -0
- package/dist/components/ui/trace/trace.d.ts.map +1 -0
- package/dist/components/ui/trace/trace.js +340 -0
- package/dist/components/ui/trace/trace.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +46 -5
- package/dist/r/attachment.json +25 -0
- package/dist/r/bubble.json +22 -0
- package/dist/r/chain-of-thought.json +26 -0
- package/dist/r/chat.json +24 -0
- package/dist/r/checkpoint.json +35 -0
- package/dist/r/confirmation.json +34 -0
- package/dist/r/context.json +33 -0
- package/dist/r/file-tree.json +32 -0
- package/dist/r/inline-citation.json +35 -0
- package/dist/r/marker.json +22 -0
- package/dist/r/message-scroller.json +31 -0
- package/dist/r/message.json +33 -0
- package/dist/r/model-selector.json +34 -0
- package/dist/r/plan.json +26 -0
- package/dist/r/questionnaire.json +28 -0
- package/dist/r/queue.json +26 -0
- package/dist/r/reasoning.json +26 -0
- package/dist/r/registry.json +811 -52
- package/dist/r/sources.json +32 -0
- package/dist/r/src/components/composites/chain-of-thought/chain-of-thought.tsx +141 -0
- package/dist/r/src/components/composites/chain-of-thought/index.ts +11 -0
- package/dist/r/src/components/composites/chat/chat.tsx +190 -0
- package/dist/r/src/components/composites/chat/index.ts +11 -0
- package/dist/r/src/components/composites/checkpoint/checkpoint-model.ts +71 -0
- package/dist/r/src/components/composites/checkpoint/checkpoint.tsx +214 -0
- package/dist/r/src/components/composites/checkpoint/index.ts +8 -0
- package/dist/r/src/components/composites/confirmation/confirmation-model.ts +83 -0
- package/dist/r/src/components/composites/confirmation/confirmation.tsx +311 -0
- package/dist/r/src/components/composites/confirmation/index.ts +9 -0
- package/dist/r/src/components/composites/context/context-model.ts +168 -0
- package/dist/r/src/components/composites/context/context.tsx +187 -0
- package/dist/r/src/components/composites/context/index.ts +18 -0
- package/dist/r/src/components/composites/file-tree/build-file-tree.ts +456 -0
- package/dist/r/src/components/composites/file-tree/file-tree.tsx +405 -0
- package/dist/r/src/components/composites/file-tree/index.ts +25 -0
- package/dist/r/src/components/composites/inline-citation/citation.ts +78 -0
- package/dist/r/src/components/composites/inline-citation/index.ts +9 -0
- package/dist/r/src/components/composites/inline-citation/inline-citation.tsx +285 -0
- package/dist/r/src/components/composites/message-scroller/index.ts +2 -0
- package/dist/r/src/components/composites/message-scroller/message-scroller.tsx +301 -0
- package/dist/r/src/components/composites/message-scroller/scroll-anchor.ts +170 -0
- package/dist/r/src/components/composites/model-selector/index.ts +14 -0
- package/dist/r/src/components/composites/model-selector/model-selector.tsx +420 -0
- package/dist/r/src/components/composites/model-selector/models.ts +103 -0
- package/dist/r/src/components/composites/plan/index.ts +1 -0
- package/dist/r/src/components/composites/plan/plan.tsx +155 -0
- package/dist/r/src/components/composites/queue/index.ts +10 -0
- package/dist/r/src/components/composites/queue/queue.tsx +264 -0
- package/dist/r/src/components/composites/reasoning/index.ts +1 -0
- package/dist/r/src/components/composites/reasoning/reasoning.tsx +176 -0
- package/dist/r/src/components/composites/sources/index.ts +11 -0
- package/dist/r/src/components/composites/sources/source.ts +116 -0
- package/dist/r/src/components/composites/sources/sources.tsx +163 -0
- package/dist/r/src/components/composites/stack-trace/index.ts +19 -0
- package/dist/r/src/components/composites/stack-trace/parse-stack-trace.ts +507 -0
- package/dist/r/src/components/composites/stack-trace/stack-trace.tsx +395 -0
- package/dist/r/src/components/composites/subagent/index.ts +1 -0
- package/dist/r/src/components/composites/subagent/subagent.tsx +159 -0
- package/dist/r/src/components/composites/suggestion/index.ts +1 -0
- package/dist/r/src/components/composites/suggestion/suggestion.tsx +140 -0
- package/dist/r/src/components/composites/task/index.ts +14 -0
- package/dist/r/src/components/composites/task/task.tsx +317 -0
- package/dist/r/src/components/composites/terminal/ansi.ts +674 -0
- package/dist/r/src/components/composites/terminal/index.ts +20 -0
- package/dist/r/src/components/composites/terminal/terminal-model.ts +111 -0
- package/dist/r/src/components/composites/terminal/terminal.tsx +574 -0
- package/dist/r/src/components/composites/test-results/index.ts +20 -0
- package/dist/r/src/components/composites/test-results/test-results-model.ts +368 -0
- package/dist/r/src/components/composites/test-results/test-results.tsx +586 -0
- package/dist/r/src/components/composites/tool/format-tool-value.ts +221 -0
- package/dist/r/src/components/composites/tool/index.ts +2 -0
- package/dist/r/src/components/composites/tool/tool.tsx +228 -0
- package/dist/r/src/components/conversation/conversation-surface.tsx +9 -0
- package/dist/r/src/components/conversation/scroll-follow-core.ts +31 -0
- package/dist/r/src/components/conversation/scroll-follow.ts +92 -0
- package/dist/r/src/components/ui/attachment/attachment.tsx +282 -0
- package/dist/r/src/components/ui/attachment/index.ts +10 -0
- package/dist/r/src/components/ui/bubble/bubble.tsx +86 -0
- package/dist/r/src/components/ui/bubble/index.ts +1 -0
- package/dist/r/src/components/ui/code-block/code-block.tsx +256 -26
- package/dist/r/src/components/ui/code-block/index.ts +9 -1
- package/dist/r/src/components/ui/field/number-field.tsx +51 -14
- package/dist/r/src/components/ui/marker/index.ts +1 -0
- package/dist/r/src/components/ui/marker/marker.tsx +90 -0
- package/dist/r/src/components/ui/message/cite-ranges.ts +144 -0
- package/dist/r/src/components/ui/message/index.ts +23 -0
- package/dist/r/src/components/ui/message/message.tsx +434 -0
- package/dist/r/src/components/ui/message/parse-message-text.ts +450 -0
- package/dist/r/src/components/ui/questionnaire/index.ts +10 -0
- package/dist/r/src/components/ui/questionnaire/questionnaire.tsx +446 -0
- package/dist/r/src/components/ui/trace/index.ts +9 -0
- package/dist/r/src/components/ui/trace/trace.tsx +334 -0
- package/dist/r/src/styles/base.css +34 -0
- package/dist/r/stack-trace.json +32 -0
- package/dist/r/subagent.json +27 -0
- package/dist/r/suggestion.json +24 -0
- package/dist/r/task.json +28 -0
- package/dist/r/terminal.json +35 -0
- package/dist/r/test-results.json +33 -0
- package/dist/r/tool.json +31 -0
- package/dist/r/trace.json +25 -0
- package/package.json +6 -3
- package/registry.json +811 -52
- package/src/components/composites/chain-of-thought/chain-of-thought.tsx +141 -0
- package/src/components/composites/chain-of-thought/index.ts +11 -0
- package/src/components/composites/chat/chat.tsx +190 -0
- package/src/components/composites/chat/index.ts +11 -0
- package/src/components/composites/checkpoint/checkpoint-model.ts +71 -0
- package/src/components/composites/checkpoint/checkpoint.tsx +214 -0
- package/src/components/composites/checkpoint/index.ts +8 -0
- package/src/components/composites/confirmation/confirmation-model.ts +83 -0
- package/src/components/composites/confirmation/confirmation.tsx +311 -0
- package/src/components/composites/confirmation/index.ts +9 -0
- package/src/components/composites/context/context-model.ts +168 -0
- package/src/components/composites/context/context.tsx +187 -0
- package/src/components/composites/context/index.ts +18 -0
- package/src/components/composites/file-tree/build-file-tree.ts +456 -0
- package/src/components/composites/file-tree/file-tree.tsx +405 -0
- package/src/components/composites/file-tree/index.ts +25 -0
- package/src/components/composites/inline-citation/citation.ts +78 -0
- package/src/components/composites/inline-citation/index.ts +9 -0
- package/src/components/composites/inline-citation/inline-citation.tsx +285 -0
- package/src/components/composites/message-scroller/index.ts +2 -0
- package/src/components/composites/message-scroller/message-scroller.tsx +301 -0
- package/src/components/composites/message-scroller/scroll-anchor.ts +170 -0
- package/src/components/composites/model-selector/index.ts +14 -0
- package/src/components/composites/model-selector/model-selector.tsx +420 -0
- package/src/components/composites/model-selector/models.ts +103 -0
- package/src/components/composites/plan/index.ts +1 -0
- package/src/components/composites/plan/plan.tsx +155 -0
- package/src/components/composites/queue/index.ts +10 -0
- package/src/components/composites/queue/queue.tsx +264 -0
- package/src/components/composites/reasoning/index.ts +1 -0
- package/src/components/composites/reasoning/reasoning.tsx +176 -0
- package/src/components/composites/sources/index.ts +11 -0
- package/src/components/composites/sources/source.ts +116 -0
- package/src/components/composites/sources/sources.tsx +163 -0
- package/src/components/composites/stack-trace/index.ts +19 -0
- package/src/components/composites/stack-trace/parse-stack-trace.ts +507 -0
- package/src/components/composites/stack-trace/stack-trace.tsx +395 -0
- package/src/components/composites/subagent/index.ts +1 -0
- package/src/components/composites/subagent/subagent.tsx +159 -0
- package/src/components/composites/suggestion/index.ts +1 -0
- package/src/components/composites/suggestion/suggestion.tsx +140 -0
- package/src/components/composites/task/index.ts +14 -0
- package/src/components/composites/task/task.tsx +317 -0
- package/src/components/composites/terminal/ansi.ts +674 -0
- package/src/components/composites/terminal/index.ts +20 -0
- package/src/components/composites/terminal/terminal-model.ts +111 -0
- package/src/components/composites/terminal/terminal.tsx +574 -0
- package/src/components/composites/test-results/index.ts +20 -0
- package/src/components/composites/test-results/test-results-model.ts +368 -0
- package/src/components/composites/test-results/test-results.tsx +586 -0
- package/src/components/composites/tool/format-tool-value.ts +221 -0
- package/src/components/composites/tool/index.ts +2 -0
- package/src/components/composites/tool/tool.tsx +228 -0
- package/src/components/conversation/conversation-surface.tsx +9 -0
- package/src/components/conversation/scroll-follow-core.ts +31 -0
- package/src/components/conversation/scroll-follow.ts +92 -0
- package/src/components/ui/attachment/attachment.tsx +282 -0
- package/src/components/ui/attachment/index.ts +10 -0
- package/src/components/ui/bubble/bubble.tsx +86 -0
- package/src/components/ui/bubble/index.ts +1 -0
- package/src/components/ui/code-block/code-block.tsx +256 -26
- package/src/components/ui/code-block/index.ts +9 -1
- package/src/components/ui/field/number-field.tsx +51 -14
- package/src/components/ui/marker/index.ts +1 -0
- package/src/components/ui/marker/marker.tsx +90 -0
- package/src/components/ui/message/cite-ranges.ts +144 -0
- package/src/components/ui/message/index.ts +23 -0
- package/src/components/ui/message/message.tsx +434 -0
- package/src/components/ui/message/parse-message-text.ts +450 -0
- package/src/components/ui/questionnaire/index.ts +10 -0
- package/src/components/ui/questionnaire/questionnaire.tsx +446 -0
- package/src/components/ui/trace/index.ts +9 -0
- package/src/components/ui/trace/trace.tsx +334 -0
- package/src/index.ts +26 -0
- package/src/styles/base.css +34 -0
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
import { cn } from "../../../lib/utils.js";
|
|
2
|
+
import { Button } from "../button/button.js";
|
|
3
|
+
import { className, createComponent, delegateEvents, effect, insert, memo, mergeProps, setAttribute, spread, template } from "solid-js/web";
|
|
4
|
+
import { Archive, File, FileCode, FileText, Image, LoaderCircle, TriangleAlert, X } from "lucide-solid";
|
|
5
|
+
import { Show, splitProps } from "solid-js";
|
|
6
|
+
//#region src/components/ui/attachment/attachment.tsx
|
|
7
|
+
var _tmpl$ = /*#__PURE__*/ template(`<span class="min-w-0 truncate font-medium">`);
|
|
8
|
+
var _tmpl$2 = /*#__PURE__*/ template(`<a target=_blank rel="noreferrer noopener"class="min-w-0 truncate rounded-xs font-medium outline-none hover:underline focus-visible:ring-3 focus-visible:ring-primary-subtle">`);
|
|
9
|
+
var _tmpl$3 = /*#__PURE__*/ template(`<button type=button class="min-w-0 truncate rounded-xs text-start font-medium outline-none hover:underline focus-visible:ring-3 focus-visible:ring-primary-subtle">`);
|
|
10
|
+
var _tmpl$4 = /*#__PURE__*/ template(`<span>`);
|
|
11
|
+
var _tmpl$5 = /*#__PURE__*/ template(`<img alt class="size-full object-cover">`);
|
|
12
|
+
var _tmpl$6 = /*#__PURE__*/ template(`<span class="relative grid aspect-square w-full place-items-center overflow-hidden rounded-xl border border-border bg-muted text-muted-foreground [&_svg]:size-6">`);
|
|
13
|
+
var _tmpl$7 = /*#__PURE__*/ template(`<span class="flex min-w-0 items-center gap-1">`);
|
|
14
|
+
var _tmpl$8 = /*#__PURE__*/ template(`<div data-slot=attachment>`);
|
|
15
|
+
var _tmpl$9 = /*#__PURE__*/ template(`<span class="flex min-w-0 flex-1 items-center gap-2">`);
|
|
16
|
+
var _tmpl$0 = /*#__PURE__*/ template(`<ul role=list data-slot=attachment-list>`);
|
|
17
|
+
var KIND_ICON = {
|
|
18
|
+
image: Image,
|
|
19
|
+
document: FileText,
|
|
20
|
+
code: FileCode,
|
|
21
|
+
text: FileText,
|
|
22
|
+
archive: Archive,
|
|
23
|
+
other: File
|
|
24
|
+
};
|
|
25
|
+
/** The figure as written: whole numbers from 10 up, one decimal below. */
|
|
26
|
+
var shown = (amount) => amount >= 10 ? Math.round(amount) : Math.round(amount * 10) / 10;
|
|
27
|
+
/** `1536` → `1.5 KB`. Returns nothing for a value that is not a finite size. */
|
|
28
|
+
function formatAttachmentSize(bytes) {
|
|
29
|
+
if (bytes === void 0 || !Number.isFinite(bytes) || bytes < 0) return void 0;
|
|
30
|
+
if (Math.round(bytes) < 1024) return `${Math.round(bytes)} B`;
|
|
31
|
+
const units = [
|
|
32
|
+
"KB",
|
|
33
|
+
"MB",
|
|
34
|
+
"GB",
|
|
35
|
+
"TB"
|
|
36
|
+
];
|
|
37
|
+
let value = bytes / 1024;
|
|
38
|
+
let unit = 0;
|
|
39
|
+
while (shown(value) >= 1024 && unit < units.length - 1) {
|
|
40
|
+
value /= 1024;
|
|
41
|
+
unit += 1;
|
|
42
|
+
}
|
|
43
|
+
return `${shown(value)} ${units[unit]}`;
|
|
44
|
+
}
|
|
45
|
+
/** The only sources a preview may use. */
|
|
46
|
+
function safePreviewSrc(value) {
|
|
47
|
+
if (!value) return void 0;
|
|
48
|
+
if (value.startsWith("blob:")) return value;
|
|
49
|
+
if (/^data:image\/(?:png|jpe?g|gif|webp|avif);base64,[A-Za-z0-9+/=]+$/.test(value)) return value;
|
|
50
|
+
try {
|
|
51
|
+
const url = new URL(value);
|
|
52
|
+
return url.protocol === "https:" || url.protocol === "http:" ? value : void 0;
|
|
53
|
+
} catch {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function Attachment(props) {
|
|
58
|
+
const [local, rest] = splitProps(props, [
|
|
59
|
+
"class",
|
|
60
|
+
"name",
|
|
61
|
+
"kind",
|
|
62
|
+
"size",
|
|
63
|
+
"variant",
|
|
64
|
+
"status",
|
|
65
|
+
"progress",
|
|
66
|
+
"statusLabel",
|
|
67
|
+
"previewSrc",
|
|
68
|
+
"onOpen",
|
|
69
|
+
"href",
|
|
70
|
+
"onRemove",
|
|
71
|
+
"removeLabel"
|
|
72
|
+
]);
|
|
73
|
+
const variant = () => local.variant ?? "chip";
|
|
74
|
+
const status = () => local.status ?? "ready";
|
|
75
|
+
const preview = () => local.kind === "image" ? safePreviewSrc(local.previewSrc) : void 0;
|
|
76
|
+
const Icon = () => KIND_ICON[local.kind ?? "other"];
|
|
77
|
+
const size = () => formatAttachmentSize(local.size);
|
|
78
|
+
const actionable = () => status() === "ready" || status() === "error";
|
|
79
|
+
const mark = () => {
|
|
80
|
+
if (status() === "uploading") return createComponent(LoaderCircle, {
|
|
81
|
+
"aria-hidden": "true",
|
|
82
|
+
"class": "motion-safe:animate-spin"
|
|
83
|
+
});
|
|
84
|
+
if (status() === "error") return createComponent(TriangleAlert, { "aria-hidden": "true" });
|
|
85
|
+
const Glyph = Icon();
|
|
86
|
+
return createComponent(Glyph, { "aria-hidden": "true" });
|
|
87
|
+
};
|
|
88
|
+
const label = () => (() => {
|
|
89
|
+
var _el$ = _tmpl$();
|
|
90
|
+
insert(_el$, () => local.name);
|
|
91
|
+
effect(() => setAttribute(_el$, "title", local.name));
|
|
92
|
+
return _el$;
|
|
93
|
+
})();
|
|
94
|
+
const name = () => createComponent(Show, {
|
|
95
|
+
get when() {
|
|
96
|
+
return memo(() => !!actionable())() && (local.href !== void 0 || local.onOpen !== void 0);
|
|
97
|
+
},
|
|
98
|
+
get fallback() {
|
|
99
|
+
return label();
|
|
100
|
+
},
|
|
101
|
+
get children() {
|
|
102
|
+
return createComponent(Show, {
|
|
103
|
+
get when() {
|
|
104
|
+
return local.href !== void 0;
|
|
105
|
+
},
|
|
106
|
+
get fallback() {
|
|
107
|
+
return (() => {
|
|
108
|
+
var _el$3 = _tmpl$3();
|
|
109
|
+
_el$3.$$click = () => local.onOpen?.();
|
|
110
|
+
insert(_el$3, () => local.name);
|
|
111
|
+
effect(() => setAttribute(_el$3, "title", local.name));
|
|
112
|
+
return _el$3;
|
|
113
|
+
})();
|
|
114
|
+
},
|
|
115
|
+
get children() {
|
|
116
|
+
var _el$2 = _tmpl$2();
|
|
117
|
+
insert(_el$2, () => local.name);
|
|
118
|
+
effect((_p$) => {
|
|
119
|
+
var _v$ = local.href, _v$2 = local.name;
|
|
120
|
+
_v$ !== _p$.e && setAttribute(_el$2, "href", _p$.e = _v$);
|
|
121
|
+
_v$2 !== _p$.t && setAttribute(_el$2, "title", _p$.t = _v$2);
|
|
122
|
+
return _p$;
|
|
123
|
+
}, {
|
|
124
|
+
e: void 0,
|
|
125
|
+
t: void 0
|
|
126
|
+
});
|
|
127
|
+
return _el$2;
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
const detail = () => createComponent(Show, {
|
|
133
|
+
get when() {
|
|
134
|
+
return status() !== "ready" || size();
|
|
135
|
+
},
|
|
136
|
+
get children() {
|
|
137
|
+
var _el$4 = _tmpl$4();
|
|
138
|
+
insert(_el$4, (() => {
|
|
139
|
+
var _c$ = memo(() => status() === "uploading");
|
|
140
|
+
return () => _c$() ? memo(() => local.progress === void 0)() ? "Uploading…" : `Uploading ${Math.round(local.progress)}%` : memo(() => status() === "error")() ? local.statusLabel ?? "Could not attach" : memo(() => status() === "unavailable")() ? local.statusLabel ?? "Unavailable" : size();
|
|
141
|
+
})());
|
|
142
|
+
effect((_p$) => {
|
|
143
|
+
var _v$3 = cn("shrink-0 text-xs", {
|
|
144
|
+
"text-destructive": status() === "error",
|
|
145
|
+
"text-muted-foreground": status() !== "error"
|
|
146
|
+
}), _v$4 = status() === "uploading" || status() === "error" ? "status" : void 0;
|
|
147
|
+
_v$3 !== _p$.e && className(_el$4, _p$.e = _v$3);
|
|
148
|
+
_v$4 !== _p$.t && setAttribute(_el$4, "role", _p$.t = _v$4);
|
|
149
|
+
return _p$;
|
|
150
|
+
}, {
|
|
151
|
+
e: void 0,
|
|
152
|
+
t: void 0
|
|
153
|
+
});
|
|
154
|
+
return _el$4;
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
const remove = () => createComponent(Show, {
|
|
158
|
+
get when() {
|
|
159
|
+
return local.onRemove;
|
|
160
|
+
},
|
|
161
|
+
get children() {
|
|
162
|
+
return createComponent(Button, {
|
|
163
|
+
type: "button",
|
|
164
|
+
variant: "ghost",
|
|
165
|
+
size: "icon-2xs",
|
|
166
|
+
"class": "shrink-0",
|
|
167
|
+
get ["aria-label"]() {
|
|
168
|
+
return local.removeLabel ?? `Remove ${local.name}`;
|
|
169
|
+
},
|
|
170
|
+
onClick: () => local.onRemove?.(),
|
|
171
|
+
get children() {
|
|
172
|
+
return createComponent(X, { "aria-hidden": "true" });
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
return (() => {
|
|
178
|
+
var _el$5 = _tmpl$8();
|
|
179
|
+
spread(_el$5, mergeProps({
|
|
180
|
+
get ["data-variant"]() {
|
|
181
|
+
return variant();
|
|
182
|
+
},
|
|
183
|
+
get ["data-status"]() {
|
|
184
|
+
return status();
|
|
185
|
+
},
|
|
186
|
+
get ["class"]() {
|
|
187
|
+
return cn("min-w-0 text-sm", {
|
|
188
|
+
"inline-flex max-w-full items-center gap-1.5 rounded-lg border border-border bg-card py-1 ps-2 pe-1": variant() === "chip",
|
|
189
|
+
"flex w-full max-w-sm items-center gap-2.5 rounded-xl border border-border bg-card p-2": variant() === "card",
|
|
190
|
+
"flex w-32 flex-col gap-1.5": variant() === "tile",
|
|
191
|
+
"border-destructive": status() === "error",
|
|
192
|
+
"opacity-70": status() === "unavailable"
|
|
193
|
+
}, local.class);
|
|
194
|
+
}
|
|
195
|
+
}, rest), false, true);
|
|
196
|
+
insert(_el$5, createComponent(Show, {
|
|
197
|
+
get when() {
|
|
198
|
+
return variant() === "tile";
|
|
199
|
+
},
|
|
200
|
+
get fallback() {
|
|
201
|
+
return [
|
|
202
|
+
(() => {
|
|
203
|
+
var _el$9 = _tmpl$4();
|
|
204
|
+
insert(_el$9, createComponent(Show, {
|
|
205
|
+
get when() {
|
|
206
|
+
return memo(() => !!preview())() && variant() === "card";
|
|
207
|
+
},
|
|
208
|
+
get fallback() {
|
|
209
|
+
return mark();
|
|
210
|
+
},
|
|
211
|
+
get children() {
|
|
212
|
+
var _el$0 = _tmpl$5();
|
|
213
|
+
effect(() => setAttribute(_el$0, "src", preview()));
|
|
214
|
+
return _el$0;
|
|
215
|
+
}
|
|
216
|
+
}));
|
|
217
|
+
effect(() => className(_el$9, cn("grid shrink-0 place-items-center text-muted-foreground [&_svg]:size-4", {
|
|
218
|
+
"size-9 overflow-hidden rounded-lg bg-muted": variant() === "card",
|
|
219
|
+
"text-destructive": status() === "error"
|
|
220
|
+
})));
|
|
221
|
+
return _el$9;
|
|
222
|
+
})(),
|
|
223
|
+
(() => {
|
|
224
|
+
var _el$1 = _tmpl$9();
|
|
225
|
+
insert(_el$1, name, null);
|
|
226
|
+
insert(_el$1, detail, null);
|
|
227
|
+
return _el$1;
|
|
228
|
+
})(),
|
|
229
|
+
memo(remove)
|
|
230
|
+
];
|
|
231
|
+
},
|
|
232
|
+
get children() {
|
|
233
|
+
return [
|
|
234
|
+
(() => {
|
|
235
|
+
var _el$6 = _tmpl$6();
|
|
236
|
+
insert(_el$6, createComponent(Show, {
|
|
237
|
+
get when() {
|
|
238
|
+
return preview();
|
|
239
|
+
},
|
|
240
|
+
get fallback() {
|
|
241
|
+
return mark();
|
|
242
|
+
},
|
|
243
|
+
get children() {
|
|
244
|
+
var _el$7 = _tmpl$5();
|
|
245
|
+
effect(() => setAttribute(_el$7, "src", preview()));
|
|
246
|
+
return _el$7;
|
|
247
|
+
}
|
|
248
|
+
}));
|
|
249
|
+
return _el$6;
|
|
250
|
+
})(),
|
|
251
|
+
(() => {
|
|
252
|
+
var _el$8 = _tmpl$7();
|
|
253
|
+
insert(_el$8, name, null);
|
|
254
|
+
insert(_el$8, remove, null);
|
|
255
|
+
return _el$8;
|
|
256
|
+
})(),
|
|
257
|
+
memo(() => detail())
|
|
258
|
+
];
|
|
259
|
+
}
|
|
260
|
+
}));
|
|
261
|
+
return _el$5;
|
|
262
|
+
})();
|
|
263
|
+
}
|
|
264
|
+
function AttachmentList(props) {
|
|
265
|
+
const [local, rest] = splitProps(props, ["class", "children"]);
|
|
266
|
+
return (() => {
|
|
267
|
+
var _el$10 = _tmpl$0();
|
|
268
|
+
spread(_el$10, mergeProps({ get ["class"]() {
|
|
269
|
+
return cn("m-0 flex min-w-0 list-none flex-wrap gap-2 p-0", local.class);
|
|
270
|
+
} }, rest), false, true);
|
|
271
|
+
insert(_el$10, () => local.children);
|
|
272
|
+
return _el$10;
|
|
273
|
+
})();
|
|
274
|
+
}
|
|
275
|
+
delegateEvents(["click"]);
|
|
276
|
+
//#endregion
|
|
277
|
+
export { Attachment, AttachmentList, formatAttachmentSize, safePreviewSrc };
|
|
278
|
+
|
|
279
|
+
//# sourceMappingURL=attachment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attachment.js","names":["Archive","File","FileIcon","FileCode","FileText","Image","ImageIcon","LoaderCircle","TriangleAlert","X","Show","splitProps","ComponentProps","JSX","cn","Button","AttachmentKind","AttachmentStatus","AttachmentVariant","KIND_ICON","image","document","code","text","archive","other","const","shown","amount","Math","round","formatAttachmentSize","bytes","undefined","Number","isFinite","units","value","unit","length","safePreviewSrc","startsWith","test","url","URL","protocol","AttachmentProps","Omit","name","kind","size","variant","status","progress","statusLabel","previewSrc","onOpen","href","onRemove","removeLabel","Attachment","props","local","rest","preview","Icon","actionable","mark","Element","_$createComponent","Glyph","label","_el$","_tmpl$","_$insert","_$effect","_$setAttribute","when","_$memo","fallback","children","_el$3","_tmpl$3","$$click","_el$2","_tmpl$2","_p$","_v$","_v$2","e","t","detail","_el$4","_tmpl$4","_c$","_v$3","_v$4","_$className","remove","type","aria-label","onClick","_el$5","_tmpl$8","_$spread","_$mergeProps","data-variant","data-status","class","_el$9","_el$0","_tmpl$5","_el$1","_tmpl$9","_el$6","_tmpl$6","_el$7","_el$8","_tmpl$7","AttachmentList","_el$10","_tmpl$0","_$delegateEvents","ImageIcon","FileIcon","_$createComponent","_$setAttribute","_$memo","_$className","_$mergeProps","_$delegateEvents"],"sources":["../../../../src/components/ui/attachment/attachment.tsx"],"sourcesContent":["import {\n Archive,\n File as FileIcon,\n FileCode,\n FileText,\n Image as ImageIcon,\n LoaderCircle,\n TriangleAlert,\n X,\n} from 'lucide-solid'\nimport { Show, splitProps, type ComponentProps, type JSX } from 'solid-js'\nimport { cn } from '#lib/utils'\nimport { Button } from '../button'\n\n/**\n * Attachment.\n *\n * A file that travels with a message or sits in the composer. Three\n * presentations of one thing: a `chip` (a line, for the composer and for a list\n * of many), a `card` (name, type and size, for a message's attachments), and a\n * `tile` (a preview image with the name beneath, for pictures).\n *\n * ## It only offers what works\n *\n * An attachment is a *claim that a file exists and can be handled*. This\n * component therefore draws an action only when the caller supplied the\n * handler: no `onOpen`/`href` and the name is plain text, not a dead button; no\n * `onRemove` and there is no ✕. A host whose attachments cannot be reopened (a\n * name the runtime echoed back, a file that was never stored) renders honest,\n * static chips instead of controls that do nothing.\n *\n * ## Untrusted metadata\n *\n * Name, type and size come from whoever sent the file. They are rendered as\n * text, the name is never used as a path or URL, and a preview is shown only\n * for `blob:`, `https:`/`http:` or a `data:image/*` raster source (no SVG, which\n * can carry script when opened on its own).\n *\n * `status` states the truth about the file's lifecycle in words (`uploading`,\n * `error`, `unavailable`), not by colour alone.\n */\nexport type AttachmentKind = 'image' | 'document' | 'code' | 'text' | 'archive' | 'other'\nexport type AttachmentStatus = 'ready' | 'uploading' | 'error' | 'unavailable'\nexport type AttachmentVariant = 'chip' | 'card' | 'tile'\n\nconst KIND_ICON = {\n image: ImageIcon,\n document: FileText,\n code: FileCode,\n text: FileText,\n archive: Archive,\n other: FileIcon,\n} as const\n\n/** The figure as written: whole numbers from 10 up, one decimal below. */\nconst shown = (amount: number) => (amount >= 10 ? Math.round(amount) : Math.round(amount * 10) / 10)\n\n/** `1536` → `1.5 KB`. Returns nothing for a value that is not a finite size. */\nexport function formatAttachmentSize(bytes: number | undefined): string | undefined {\n if (bytes === undefined || !Number.isFinite(bytes) || bytes < 0) return undefined\n if (Math.round(bytes) < 1024) return `${Math.round(bytes)} B`\n const units = ['KB', 'MB', 'GB', 'TB']\n // What is shown, not the raw value, decides the unit: 1023.9 KB rounds to\n // \"1024 KB\", which should read \"1 MB\".\n let value = bytes / 1024\n let unit = 0\n while (shown(value) >= 1024 && unit < units.length - 1) {\n value /= 1024\n unit += 1\n }\n return `${shown(value)} ${units[unit]}`\n}\n\n/** The only sources a preview may use. */\nexport function safePreviewSrc(value: string | undefined): string | undefined {\n if (!value) return undefined\n if (value.startsWith('blob:')) return value\n if (/^data:image\\/(?:png|jpe?g|gif|webp|avif);base64,[A-Za-z0-9+/=]+$/.test(value)) return value\n try {\n const url = new URL(value)\n return url.protocol === 'https:' || url.protocol === 'http:' ? value : undefined\n } catch {\n return undefined\n }\n}\n\nexport type AttachmentProps = Omit<ComponentProps<'div'>, 'children'> & {\n name: string\n kind?: AttachmentKind\n /** Bytes. */\n size?: number\n variant?: AttachmentVariant\n status?: AttachmentStatus\n /** 0–100 while `uploading`; omit for indeterminate. */\n progress?: number\n /** Why it failed or is unavailable, in words. */\n statusLabel?: string\n previewSrc?: string\n /** Open the file in the host. Omit and the name is not a control. */\n onOpen?: () => void\n /** Open the file by address. Omit and the name is not a link. */\n href?: string\n /** Detach it. Omit and there is no remove control. */\n onRemove?: () => void\n removeLabel?: string\n}\n\nexport function Attachment(props: AttachmentProps) {\n const [local, rest] = splitProps(props, [\n 'class',\n 'name',\n 'kind',\n 'size',\n 'variant',\n 'status',\n 'progress',\n 'statusLabel',\n 'previewSrc',\n 'onOpen',\n 'href',\n 'onRemove',\n 'removeLabel',\n ])\n const variant = () => local.variant ?? 'chip'\n const status = () => local.status ?? 'ready'\n const preview = () => (local.kind === 'image' ? safePreviewSrc(local.previewSrc) : undefined)\n const Icon = () => KIND_ICON[local.kind ?? 'other']\n const size = () => formatAttachmentSize(local.size)\n const actionable = () => status() === 'ready' || status() === 'error'\n\n const mark = (): JSX.Element => {\n if (status() === 'uploading')\n return <LoaderCircle aria-hidden=\"true\" class=\"motion-safe:animate-spin\" />\n if (status() === 'error') return <TriangleAlert aria-hidden=\"true\" />\n const Glyph = Icon()\n return <Glyph aria-hidden=\"true\" />\n }\n\n const label = (): JSX.Element => (\n <span class=\"min-w-0 truncate font-medium\" title={local.name}>\n {local.name}\n </span>\n )\n\n const name = (): JSX.Element => (\n <Show\n when={actionable() && (local.href !== undefined || local.onOpen !== undefined)}\n fallback={label()}\n >\n <Show\n when={local.href !== undefined}\n fallback={\n <button\n type=\"button\"\n class=\"min-w-0 truncate rounded-xs text-start font-medium outline-none hover:underline focus-visible:ring-3 focus-visible:ring-primary-subtle\"\n title={local.name}\n onClick={() => local.onOpen?.()}\n >\n {local.name}\n </button>\n }\n >\n <a\n href={local.href}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n class=\"min-w-0 truncate rounded-xs font-medium outline-none hover:underline focus-visible:ring-3 focus-visible:ring-primary-subtle\"\n title={local.name}\n >\n {local.name}\n </a>\n </Show>\n </Show>\n )\n\n const detail = (): JSX.Element => (\n <Show when={status() !== 'ready' || size()}>\n <span\n class={cn('shrink-0 text-xs', {\n 'text-destructive': status() === 'error',\n 'text-muted-foreground': status() !== 'error',\n })}\n role={status() === 'uploading' || status() === 'error' ? 'status' : undefined}\n >\n {status() === 'uploading'\n ? local.progress === undefined\n ? 'Uploading…'\n : `Uploading ${Math.round(local.progress)}%`\n : status() === 'error'\n ? (local.statusLabel ?? 'Could not attach')\n : status() === 'unavailable'\n ? (local.statusLabel ?? 'Unavailable')\n : size()}\n </span>\n </Show>\n )\n\n const remove = (): JSX.Element => (\n <Show when={local.onRemove}>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-2xs\"\n class=\"shrink-0\"\n aria-label={local.removeLabel ?? `Remove ${local.name}`}\n onClick={() => local.onRemove?.()}\n >\n <X aria-hidden=\"true\" />\n </Button>\n </Show>\n )\n\n return (\n <div\n data-slot=\"attachment\"\n data-variant={variant()}\n data-status={status()}\n class={cn(\n 'min-w-0 text-sm',\n {\n 'inline-flex max-w-full items-center gap-1.5 rounded-lg border border-border bg-card py-1 ps-2 pe-1':\n variant() === 'chip',\n 'flex w-full max-w-sm items-center gap-2.5 rounded-xl border border-border bg-card p-2':\n variant() === 'card',\n 'flex w-32 flex-col gap-1.5': variant() === 'tile',\n 'border-destructive': status() === 'error',\n 'opacity-70': status() === 'unavailable',\n },\n local.class\n )}\n {...rest}\n >\n <Show\n when={variant() === 'tile'}\n fallback={\n <>\n <span\n class={cn('grid shrink-0 place-items-center text-muted-foreground [&_svg]:size-4', {\n 'size-9 overflow-hidden rounded-lg bg-muted': variant() === 'card',\n 'text-destructive': status() === 'error',\n })}\n >\n <Show when={preview() && variant() === 'card'} fallback={mark()}>\n <img src={preview()} alt=\"\" class=\"size-full object-cover\" />\n </Show>\n </span>\n <span class=\"flex min-w-0 flex-1 items-center gap-2\">\n {name()}\n {detail()}\n </span>\n {remove()}\n </>\n }\n >\n <span class=\"relative grid aspect-square w-full place-items-center overflow-hidden rounded-xl border border-border bg-muted text-muted-foreground [&_svg]:size-6\">\n <Show when={preview()} fallback={mark()}>\n <img src={preview()} alt=\"\" class=\"size-full object-cover\" />\n </Show>\n </span>\n <span class=\"flex min-w-0 items-center gap-1\">\n {name()}\n {remove()}\n </span>\n {detail()}\n </Show>\n </div>\n )\n}\n\nexport function AttachmentList(props: ComponentProps<'ul'>) {\n const [local, rest] = splitProps(props, ['class', 'children'])\n return (\n <ul\n role=\"list\"\n data-slot=\"attachment-list\"\n class={cn('m-0 flex min-w-0 list-none flex-wrap gap-2 p-0', local.class)}\n {...rest}\n >\n {local.children}\n </ul>\n )\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/attachment/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,cAAc,EACd,oBAAoB,EACpB,cAAc,EACd,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,GACvB,MAAM,cAAc,CAAA"}
|
|
@@ -10,7 +10,7 @@ import { type VariantProps } from '#lib/variants';
|
|
|
10
10
|
* action.
|
|
11
11
|
*/
|
|
12
12
|
export declare const badgeVariants: (props?: ({
|
|
13
|
-
variant?: "default" | "destructive" | "success" | "warning" | "info" | "
|
|
13
|
+
variant?: "default" | "destructive" | "success" | "warning" | "info" | "secondary" | "outline" | "subtle" | "notification" | null | undefined;
|
|
14
14
|
size?: "sm" | "md" | "lg" | null | undefined;
|
|
15
15
|
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
16
16
|
type BadgeVariantProps = VariantProps<typeof badgeVariants>;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { type ComponentProps, type JSX } from 'solid-js';
|
|
2
|
+
import { type VariantProps } from '#lib/variants';
|
|
3
|
+
/**
|
|
4
|
+
* Bubble.
|
|
5
|
+
*
|
|
6
|
+
* The container for what *the person* sends. The assistant's reply is not a
|
|
7
|
+
* bubble: it is the page, set in the reading column with no surface behind it,
|
|
8
|
+
* because a reply that is a card among cards turns every long answer into a box
|
|
9
|
+
* to scroll inside. A bubble marks the one voice that is quoting itself back — a
|
|
10
|
+
* short, bounded message — so the eye can find where each turn begins.
|
|
11
|
+
*
|
|
12
|
+
* `state` is the delivery truth, not decoration: `pending` while the send is in
|
|
13
|
+
* flight, `queued` for a follow-up the runtime has not taken yet (dashed, so it
|
|
14
|
+
* reads as not yet part of the conversation), `failed` when it did not go. Each
|
|
15
|
+
* state has a word in `status`, because the border alone is not a signal.
|
|
16
|
+
*
|
|
17
|
+
* Text is rendered as text. `whitespace-pre-wrap` keeps the sender's line breaks
|
|
18
|
+
* and `overflow-wrap: anywhere` stops a pasted token or URL from widening the
|
|
19
|
+
* column; nothing here interprets markup.
|
|
20
|
+
*/
|
|
21
|
+
export declare const bubbleVariants: (props?: ({
|
|
22
|
+
tone?: "neutral" | "user" | "quiet" | null | undefined;
|
|
23
|
+
state?: "sent" | "pending" | "queued" | "failed" | null | undefined;
|
|
24
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
25
|
+
export type BubbleProps = Omit<ComponentProps<'div'>, 'children'> & VariantProps<typeof bubbleVariants> & {
|
|
26
|
+
children?: JSX.Element;
|
|
27
|
+
/** What the state means in words: "Sending…", "Queued", "Not sent". */
|
|
28
|
+
status?: JSX.Element;
|
|
29
|
+
/** Shown beside the status, e.g. a Retry button for a failed send. */
|
|
30
|
+
statusAction?: JSX.Element;
|
|
31
|
+
};
|
|
32
|
+
export declare function Bubble(props: BubbleProps): JSX.Element;
|
|
33
|
+
//# sourceMappingURL=bubble.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bubble.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/bubble/bubble.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,cAAc,EAAE,KAAK,GAAG,EAAE,MAAM,UAAU,CAAA;AAEpE,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,eAAe,CAAA;AAEtD;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,cAAc;;;8EAkB1B,CAAA;AAED,MAAM,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC,GAC/D,YAAY,CAAC,OAAO,cAAc,CAAC,GAAG;IACpC,QAAQ,CAAC,EAAE,GAAG,CAAC,OAAO,CAAA;IACtB,uEAAuE;IACvE,MAAM,CAAC,EAAE,GAAG,CAAC,OAAO,CAAA;IACpB,sEAAsE;IACtE,YAAY,CAAC,EAAE,GAAG,CAAC,OAAO,CAAA;CAC3B,CAAA;AAEH,wBAAgB,MAAM,CAAC,KAAK,EAAE,WAAW,eAkCxC"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { cn } from "../../../lib/utils.js";
|
|
2
|
+
import { cva } from "../../../lib/variants.js";
|
|
3
|
+
import { className, effect, insert, memo, mergeProps, setAttribute, spread, template } from "solid-js/web";
|
|
4
|
+
import { splitProps } from "solid-js";
|
|
5
|
+
//#region src/components/ui/bubble/bubble.tsx
|
|
6
|
+
var _tmpl$ = /*#__PURE__*/ template(`<div class="flex max-w-full min-w-0 flex-col items-end gap-1"data-slot=bubble-root><div data-slot=bubble>`);
|
|
7
|
+
var _tmpl$2 = /*#__PURE__*/ template(`<div data-slot=bubble-status>`);
|
|
8
|
+
/**
|
|
9
|
+
* Bubble.
|
|
10
|
+
*
|
|
11
|
+
* The container for what *the person* sends. The assistant's reply is not a
|
|
12
|
+
* bubble: it is the page, set in the reading column with no surface behind it,
|
|
13
|
+
* because a reply that is a card among cards turns every long answer into a box
|
|
14
|
+
* to scroll inside. A bubble marks the one voice that is quoting itself back — a
|
|
15
|
+
* short, bounded message — so the eye can find where each turn begins.
|
|
16
|
+
*
|
|
17
|
+
* `state` is the delivery truth, not decoration: `pending` while the send is in
|
|
18
|
+
* flight, `queued` for a follow-up the runtime has not taken yet (dashed, so it
|
|
19
|
+
* reads as not yet part of the conversation), `failed` when it did not go. Each
|
|
20
|
+
* state has a word in `status`, because the border alone is not a signal.
|
|
21
|
+
*
|
|
22
|
+
* Text is rendered as text. `whitespace-pre-wrap` keeps the sender's line breaks
|
|
23
|
+
* and `overflow-wrap: anywhere` stops a pasted token or URL from widening the
|
|
24
|
+
* column; nothing here interprets markup.
|
|
25
|
+
*/
|
|
26
|
+
var bubbleVariants = cva("relative w-fit max-w-full min-w-0 rounded-2xl px-3.5 py-2 font-content text-content break-words whitespace-pre-wrap [overflow-wrap:anywhere]", {
|
|
27
|
+
variants: {
|
|
28
|
+
tone: {
|
|
29
|
+
user: "bg-primary-subtle text-foreground",
|
|
30
|
+
neutral: "bg-muted text-foreground",
|
|
31
|
+
quiet: "border border-border bg-transparent text-foreground"
|
|
32
|
+
},
|
|
33
|
+
state: {
|
|
34
|
+
sent: "",
|
|
35
|
+
pending: "opacity-70",
|
|
36
|
+
queued: "border border-dashed border-border bg-transparent",
|
|
37
|
+
failed: "border border-destructive"
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
defaultVariants: {
|
|
41
|
+
tone: "user",
|
|
42
|
+
state: "sent"
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
function Bubble(props) {
|
|
46
|
+
const [local, rest] = splitProps(props, [
|
|
47
|
+
"class",
|
|
48
|
+
"tone",
|
|
49
|
+
"state",
|
|
50
|
+
"children",
|
|
51
|
+
"status",
|
|
52
|
+
"statusAction"
|
|
53
|
+
]);
|
|
54
|
+
return (() => {
|
|
55
|
+
var _el$ = _tmpl$(), _el$2 = _el$.firstChild;
|
|
56
|
+
spread(_el$2, mergeProps({
|
|
57
|
+
get ["data-state"]() {
|
|
58
|
+
return local.state ?? "sent";
|
|
59
|
+
},
|
|
60
|
+
get ["class"]() {
|
|
61
|
+
return cn(bubbleVariants({
|
|
62
|
+
tone: local.tone,
|
|
63
|
+
state: local.state
|
|
64
|
+
}), local.class);
|
|
65
|
+
}
|
|
66
|
+
}, rest), false, true);
|
|
67
|
+
insert(_el$2, () => local.children);
|
|
68
|
+
insert(_el$, (() => {
|
|
69
|
+
var _c$ = memo(() => !!(local.status !== void 0 || local.statusAction !== void 0));
|
|
70
|
+
return () => _c$() ? (() => {
|
|
71
|
+
var _el$3 = _tmpl$2();
|
|
72
|
+
insert(_el$3, () => local.status, null);
|
|
73
|
+
insert(_el$3, () => local.statusAction, null);
|
|
74
|
+
effect((_p$) => {
|
|
75
|
+
var _v$ = local.state === "failed" ? "alert" : "status", _v$2 = cn("flex items-center gap-2 text-xs", {
|
|
76
|
+
"text-destructive": local.state === "failed",
|
|
77
|
+
"text-muted-foreground": local.state !== "failed"
|
|
78
|
+
});
|
|
79
|
+
_v$ !== _p$.e && setAttribute(_el$3, "role", _p$.e = _v$);
|
|
80
|
+
_v$2 !== _p$.t && className(_el$3, _p$.t = _v$2);
|
|
81
|
+
return _p$;
|
|
82
|
+
}, {
|
|
83
|
+
e: void 0,
|
|
84
|
+
t: void 0
|
|
85
|
+
});
|
|
86
|
+
return _el$3;
|
|
87
|
+
})() : null;
|
|
88
|
+
})(), null);
|
|
89
|
+
return _el$;
|
|
90
|
+
})();
|
|
91
|
+
}
|
|
92
|
+
//#endregion
|
|
93
|
+
export { Bubble, bubbleVariants };
|
|
94
|
+
|
|
95
|
+
//# sourceMappingURL=bubble.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bubble.js","names":["splitProps","ComponentProps","JSX","cn","cva","VariantProps","bubbleVariants","variants","tone","user","neutral","quiet","state","sent","pending","queued","failed","defaultVariants","BubbleProps","Omit","children","Element","status","statusAction","Bubble","props","local","rest","_el$","_tmpl$","_el$2","firstChild","_$spread","_$mergeProps","data-state","class","_$insert","_c$","_$memo","undefined","_el$3","_tmpl$2","_$effect","_p$","_v$","_v$2","e","_$setAttribute","t","_$className","_$mergeProps","_$memo","_$setAttribute","_$className"],"sources":["../../../../src/components/ui/bubble/bubble.tsx"],"sourcesContent":["import { splitProps, type ComponentProps, type JSX } from 'solid-js'\nimport { cn } from '#lib/utils'\nimport { cva, type VariantProps } from '#lib/variants'\n\n/**\n * Bubble.\n *\n * The container for what *the person* sends. The assistant's reply is not a\n * bubble: it is the page, set in the reading column with no surface behind it,\n * because a reply that is a card among cards turns every long answer into a box\n * to scroll inside. A bubble marks the one voice that is quoting itself back — a\n * short, bounded message — so the eye can find where each turn begins.\n *\n * `state` is the delivery truth, not decoration: `pending` while the send is in\n * flight, `queued` for a follow-up the runtime has not taken yet (dashed, so it\n * reads as not yet part of the conversation), `failed` when it did not go. Each\n * state has a word in `status`, because the border alone is not a signal.\n *\n * Text is rendered as text. `whitespace-pre-wrap` keeps the sender's line breaks\n * and `overflow-wrap: anywhere` stops a pasted token or URL from widening the\n * column; nothing here interprets markup.\n */\nexport const bubbleVariants = cva(\n 'relative w-fit max-w-full min-w-0 rounded-2xl px-3.5 py-2 font-content text-content break-words whitespace-pre-wrap [overflow-wrap:anywhere]',\n {\n variants: {\n tone: {\n user: 'bg-primary-subtle text-foreground',\n neutral: 'bg-muted text-foreground',\n quiet: 'border border-border bg-transparent text-foreground',\n },\n state: {\n sent: '',\n pending: 'opacity-70',\n queued: 'border border-dashed border-border bg-transparent',\n failed: 'border border-destructive',\n },\n },\n defaultVariants: { tone: 'user', state: 'sent' },\n }\n)\n\nexport type BubbleProps = Omit<ComponentProps<'div'>, 'children'> &\n VariantProps<typeof bubbleVariants> & {\n children?: JSX.Element\n /** What the state means in words: \"Sending…\", \"Queued\", \"Not sent\". */\n status?: JSX.Element\n /** Shown beside the status, e.g. a Retry button for a failed send. */\n statusAction?: JSX.Element\n }\n\nexport function Bubble(props: BubbleProps) {\n const [local, rest] = splitProps(props, [\n 'class',\n 'tone',\n 'state',\n 'children',\n 'status',\n 'statusAction',\n ])\n return (\n <div class=\"flex max-w-full min-w-0 flex-col items-end gap-1\" data-slot=\"bubble-root\">\n <div\n data-slot=\"bubble\"\n data-state={local.state ?? 'sent'}\n class={cn(bubbleVariants({ tone: local.tone, state: local.state }), local.class)}\n {...rest}\n >\n {local.children}\n </div>\n {local.status !== undefined || local.statusAction !== undefined ? (\n <div\n data-slot=\"bubble-status\"\n role={local.state === 'failed' ? 'alert' : 'status'}\n class={cn('flex items-center gap-2 text-xs', {\n 'text-destructive': local.state === 'failed',\n 'text-muted-foreground': local.state !== 'failed',\n })}\n >\n {local.status}\n {local.statusAction}\n </div>\n ) : null}\n </div>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAsBA,IAAaM,iBAAiBF,IAC5B,gJACA;CACEG,UAAU;EACRC,MAAM;GACJC,MAAM;GACNC,SAAS;GACTC,OAAO;EACT;EACAC,OAAO;GACLC,MAAM;GACNC,SAAS;GACTC,QAAQ;GACRC,QAAQ;EACV;CACF;CACAC,iBAAiB;EAAET,MAAM;EAAQI,OAAO;CAAO;AACjD,CACF;AAWA,SAAgBY,OAAOC,OAAoB;CACzC,MAAM,CAACC,OAAOC,QAAQ3B,WAAWyB,OAAO;EACtC;EACA;EACA;EACA;EACA;EACA;CAAc,CACf;CACD,cAAA;EAAA,IAAAG,OAAAC,OAAA,GAAAC,QAAAF,KAAAG;EAAAC,OAAAF,OAAAG,WAAA;GAAA,KAAA,gBAAA;IAAA,OAIkBP,MAAMd,SAAS;GAAM;GAAA,KAAA,WAAA;IAAA,OAC1BT,GAAGG,eAAe;KAAEE,MAAMkB,MAAMlB;KAAMI,OAAOc,MAAMd;IAAM,CAAC,GAAGc,MAAMS,KAAK;GAAC;EAAA,GAC5ER,IAAI,GAAA,OAAA,IAAA;EAAAS,OAAAN,aAEPJ,MAAMN,QAAQ;EAAAgB,OAAAR,aAAA;GAAA,IAAAS,MAAAC,WAAA,CAAA,EAEhBZ,MAAMJ,WAAWiB,KAAAA,KAAab,MAAMH,iBAAiBgB,KAAAA,EAAS;GAAA,aAA9DF,IAAA,WAAA;IAAA,IAAAG,QAAAC,QAAA;IAAAL,OAAAI,aASId,MAAMJ,QAAM,IAAA;IAAAc,OAAAI,aACZd,MAAMH,cAAY,IAAA;IAAAmB,QAAAC,QAAA;KAAA,IAAAC,MAPblB,MAAMd,UAAU,WAAW,UAAU,UAAQiC,OAC5C1C,GAAG,mCAAmC;MAC3C,oBAAoBuB,MAAMd,UAAU;MACpC,yBAAyBc,MAAMd,UAAU;KAC3C,CAAC;KAACgC,QAAAD,IAAAG,KAAAC,aAAAP,OAAA,QAAAG,IAAAG,IAAAF,GAAA;KAAAC,SAAAF,IAAAK,KAAAC,UAAAT,OAAAG,IAAAK,IAAAH,IAAA;KAAA,OAAAF;IAAA,GAAA;KAAAG,GAAAP,KAAAA;KAAAS,GAAAT,KAAAA;IAAA,CAAA;IAAA,OAAAC;GAAA,EAAA,CAAA,IAKF;EAAI,EAAA,CAAA,GAAA,IAAA;EAAA,OAAAZ;CAAA,EAAA,CAAA;AAGd"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/bubble/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,KAAK,WAAW,EAAE,MAAM,UAAU,CAAA"}
|
|
@@ -18,7 +18,7 @@ import { type VariantProps } from '#lib/variants';
|
|
|
18
18
|
* `asChild` primitive, which has no Solid equivalent that preserves props.
|
|
19
19
|
*/
|
|
20
20
|
export declare const buttonVariants: (props?: ({
|
|
21
|
-
variant?: "link" | "default" | "destructive" | "success" | "toolbar" | "
|
|
21
|
+
variant?: "link" | "default" | "destructive" | "success" | "toolbar" | "secondary" | "outline" | "ghost" | "subtle" | null | undefined;
|
|
22
22
|
size?: "2xs" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl" | "icon-2xs" | "icon-xs" | "icon-sm" | "icon-md" | "icon-lg" | "icon-xl" | "icon-2xl" | null | undefined;
|
|
23
23
|
touchTarget?: "comfortable" | null | undefined;
|
|
24
24
|
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
@@ -26,8 +26,9 @@ import { type ComponentProps, type JSX } from 'solid-js';
|
|
|
26
26
|
* **The scroller is focusable and named.** A horizontally scrollable region has
|
|
27
27
|
* to be reachable by keyboard — this is axe's `scrollable-region-focusable`, and
|
|
28
28
|
* a region that scrolls but cannot be focused is a WCAG 2.1.1 failure. It is a
|
|
29
|
-
* `
|
|
30
|
-
*
|
|
29
|
+
* labelled `group` rather than a bare `tabindex`, so the tab stop announces what
|
|
30
|
+
* it is. It is deliberately not a `region` landmark: a transcript holds many
|
|
31
|
+
* blocks, often in one language, and repeated landmarks of one name are noise.
|
|
31
32
|
*
|
|
32
33
|
* **Resolving a streaming block must not move the reader.** When `complete` is
|
|
33
34
|
* false the block shows the code it has plus a generating indicator; the
|
|
@@ -35,8 +36,35 @@ import { type ComponentProps, type JSX } from 'solid-js';
|
|
|
35
36
|
* block that grows the moment its content resolves shifts everything below it.
|
|
36
37
|
* If a caller's `highlight` changes the line box, that is the caller's height to
|
|
37
38
|
* hold — `lineHeight` is a prop for exactly that reason.
|
|
39
|
+
*
|
|
40
|
+
* ## Output, not only source
|
|
41
|
+
*
|
|
42
|
+
* The same surface carries terminal output, logs and diffs inside an agent's
|
|
43
|
+
* activity, so it also:
|
|
44
|
+
*
|
|
45
|
+
* - **loads its highlighter lazily** (`loadHighlight`). The grammar is fetched
|
|
46
|
+
* only for a block that is complete and has a language, the block renders plain
|
|
47
|
+
* until it arrives, and a loader that returns nothing — an unknown language, a
|
|
48
|
+
* failed fetch — leaves the plain text in place without an error. Highlighting
|
|
49
|
+
* a block on every streamed delta would re-tokenise the whole thing per token,
|
|
50
|
+
* so a streaming block stays plain until `complete`.
|
|
51
|
+
* - **marks lines** (`lineMarks`) as added, removed, highlighted or failed. A mark
|
|
52
|
+
* is carried by a gutter glyph and by `<ins>`/`<del>` for the two that change
|
|
53
|
+
* text, never by colour alone, and the glyph is not selectable so a copied
|
|
54
|
+
* selection stays the source.
|
|
55
|
+
* - **copies the source exactly.** The copy button writes `code` as given: no
|
|
56
|
+
* trailing-newline trimming, no line numbers, no gutter glyphs, and the whole
|
|
57
|
+
* block even when only part of it is rendered (`lineLimit`).
|
|
58
|
+
* - **bounds a large render.** Past `lineLimit` lines the per-line renderer and a
|
|
59
|
+
* highlighted render show the first lines and a control to show the rest,
|
|
60
|
+
* because tens of thousands of row elements, or a tokenizer run over all of
|
|
61
|
+
* them, are a freeze, not a transcript. Which renderer is in use is decided
|
|
62
|
+
* at the time, so a highlighter that loads late takes over the bound from the
|
|
63
|
+
* per-line rows and the note below the block always describes what is drawn.
|
|
64
|
+
* The plain renderer is a single text node and needs no limit.
|
|
65
|
+
* - **comes in a small size** (`size="sm"`) for tool output inside a Trace line.
|
|
38
66
|
*/
|
|
39
|
-
export type CodeBlockProps = Omit<ComponentProps<'div'>, 'children'> & {
|
|
67
|
+
export type CodeBlockProps = Omit<ComponentProps<'div'>, 'children' | 'onCopy'> & {
|
|
40
68
|
code: string;
|
|
41
69
|
/** The language, shown in the header and used as the region's label. */
|
|
42
70
|
language?: string;
|
|
@@ -70,7 +98,32 @@ export type CodeBlockProps = Omit<ComponentProps<'div'>, 'children'> & {
|
|
|
70
98
|
* any `pre` inside `highlight` output; line numbers stay on the first visual line.
|
|
71
99
|
*/
|
|
72
100
|
wrap?: boolean;
|
|
101
|
+
/** `sm` is the compact chrome for output nested inside a Trace line. */
|
|
102
|
+
size?: 'default' | 'sm';
|
|
103
|
+
/**
|
|
104
|
+
* Marks on 1-based line numbers. Applies to the per-line renderer, which is
|
|
105
|
+
* used whenever marks or line numbers are present and no highlighter is in use,
|
|
106
|
+
* given as `highlight` or loaded by `loadHighlight`: a highlighter replaces the
|
|
107
|
+
* rows, so the marks and the gutter go with them.
|
|
108
|
+
*/
|
|
109
|
+
lineMarks?: Readonly<Record<number, CodeLineMark>>;
|
|
110
|
+
/**
|
|
111
|
+
* Resolve a highlighter for the block's language. Called once the block is
|
|
112
|
+
* complete; resolving to `undefined` (or rejecting) keeps the plain rendering.
|
|
113
|
+
*/
|
|
114
|
+
loadHighlight?: (language: string | undefined) => Promise<CodeHighlighter | undefined>;
|
|
115
|
+
/**
|
|
116
|
+
* Lines the per-line and the highlighted renderer show before offering the
|
|
117
|
+
* rest. Default 2000. The plain renderer is one text node and is not limited.
|
|
118
|
+
*/
|
|
119
|
+
lineLimit?: number;
|
|
120
|
+
/** Called after each copy attempt with whether the clipboard accepted it. */
|
|
121
|
+
onCopy?: (ok: boolean) => void;
|
|
73
122
|
};
|
|
123
|
+
export type CodeLineMark = 'add' | 'remove' | 'highlight' | 'error';
|
|
124
|
+
export type CodeHighlighter = (code: string) => JSX.Element;
|
|
125
|
+
/** Lines the per-line renderer shows before it offers the rest. */
|
|
126
|
+
export declare const CODE_BLOCK_LINE_LIMIT = 2000;
|
|
74
127
|
/** The height a block must exceed before its actions are repeated. */
|
|
75
128
|
export declare const TALL_CODE_BLOCK_PX = 480;
|
|
76
129
|
export declare function CodeBlock(props: CodeBlockProps): JSX.Element;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code-block.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/code-block/code-block.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"code-block.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/code-block/code-block.tsx"],"names":[],"mappings":"AAAA,OAAO,EAUL,KAAK,cAAc,EACnB,KAAK,GAAG,EACT,MAAM,UAAU,CAAA;AAKjB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgEG;AACH,MAAM,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,UAAU,GAAG,QAAQ,CAAC,GAAG;IAChF,IAAI,EAAE,MAAM,CAAA;IACZ,wEAAwE;IACxE,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,oFAAoF;IACpF,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,GAAG,CAAC,OAAO,CAAA;IACzC,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,0DAA0D;IAC1D,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,qDAAqD;IACrD,OAAO,CAAC,EAAE,GAAG,CAAC,OAAO,CAAA;IACrB,0DAA0D;IAC1D,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,iFAAiF;IACjF,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,8EAA8E;IAC9E,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,yEAAyE;IACzE,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IAC3B;;;;;OAKG;IACH,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,wEAAwE;IACxE,IAAI,CAAC,EAAE,SAAS,GAAG,IAAI,CAAA;IACvB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAA;IAClD;;;OAGG;IACH,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,KAAK,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CAAA;IACtF;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,6EAA6E;IAC7E,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,KAAK,IAAI,CAAA;CAC/B,CAAA;AAED,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,QAAQ,GAAG,WAAW,GAAG,OAAO,CAAA;AACnE,MAAM,MAAM,eAAe,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,GAAG,CAAC,OAAO,CAAA;AAE3D,mEAAmE;AACnE,eAAO,MAAM,qBAAqB,OAAQ,CAAA;AAE1C,sEAAsE;AACtE,eAAO,MAAM,kBAAkB,MAAM,CAAA;AAkBrC,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,eAyO9C;AAyED;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,cAAc,CAAC,MAAM,CAAC,eAYvD"}
|