@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,140 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createContext,
|
|
3
|
+
createUniqueId,
|
|
4
|
+
Show,
|
|
5
|
+
splitProps,
|
|
6
|
+
useContext,
|
|
7
|
+
type ComponentProps,
|
|
8
|
+
} from 'solid-js'
|
|
9
|
+
import { cn } from '#lib/utils'
|
|
10
|
+
import { Button } from '../../ui/button'
|
|
11
|
+
import { boundText } from '../sources/source'
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Suggestions.
|
|
15
|
+
*
|
|
16
|
+
* A row of one-click prompts: each chip is the text that will be sent, so choosing
|
|
17
|
+
* one is a single decision and never "fill the composer, then still have to press
|
|
18
|
+
* send". What a chip *does* with its text — send it, drop it in the composer —
|
|
19
|
+
* is the host's `onSelect`; this component only reports which one was chosen.
|
|
20
|
+
*
|
|
21
|
+
* - **Layout.** `wrap` (default) lets chips flow onto further lines, which is the
|
|
22
|
+
* right behaviour at a narrow width. `scroll` keeps a single line that scrolls
|
|
23
|
+
* sideways, for a bar above a composer that must not grow; the chips are real
|
|
24
|
+
* buttons, so keyboard focus scrolls them into view and nothing depends on a
|
|
25
|
+
* pointer to reach the overflow.
|
|
26
|
+
* - **Long text is clipped, not hidden.** A chip is one line and truncates; the
|
|
27
|
+
* full text is the button's accessible name and its `title`.
|
|
28
|
+
* - **The host owns authority.** No `onSelect`, or a `disabledReason`, disables
|
|
29
|
+
* every chip and says why in words under the row. Chips use `aria-disabled`
|
|
30
|
+
* rather than `disabled`, so a keyboard or screen-reader user can still reach
|
|
31
|
+
* them and hear the reason instead of finding a row that is silently skipped.
|
|
32
|
+
*/
|
|
33
|
+
export type SuggestionsProps = Omit<ComponentProps<'div'>, 'onSelect'> & {
|
|
34
|
+
/** The row's accessible name. */
|
|
35
|
+
label?: string
|
|
36
|
+
layout?: 'wrap' | 'scroll'
|
|
37
|
+
/** Called with the chosen chip's text. Without it every chip is disabled. */
|
|
38
|
+
onSelect?: (text: string) => void
|
|
39
|
+
/** Why the chips cannot be used right now. Implies disabled. */
|
|
40
|
+
disabledReason?: string
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
type SuggestionsContext = {
|
|
44
|
+
select: (text: string) => void
|
|
45
|
+
blocked: () => boolean
|
|
46
|
+
reasonId: () => string | undefined
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const SuggestionsContext = createContext<SuggestionsContext>()
|
|
50
|
+
|
|
51
|
+
export function Suggestions(props: SuggestionsProps) {
|
|
52
|
+
const [local, rest] = splitProps(props, [
|
|
53
|
+
'class',
|
|
54
|
+
'label',
|
|
55
|
+
'layout',
|
|
56
|
+
'onSelect',
|
|
57
|
+
'disabledReason',
|
|
58
|
+
'children',
|
|
59
|
+
])
|
|
60
|
+
const uid = createUniqueId()
|
|
61
|
+
const reasonId = `${uid}-reason`
|
|
62
|
+
const reason = () =>
|
|
63
|
+
local.disabledReason
|
|
64
|
+
? boundText(local.disabledReason, 240)
|
|
65
|
+
: local.onSelect === undefined
|
|
66
|
+
? 'Suggestions are not available here.'
|
|
67
|
+
: undefined
|
|
68
|
+
|
|
69
|
+
return (
|
|
70
|
+
<SuggestionsContext.Provider
|
|
71
|
+
value={{
|
|
72
|
+
select: (text) => local.onSelect?.(text),
|
|
73
|
+
blocked: () => reason() !== undefined,
|
|
74
|
+
reasonId: () => (reason() ? reasonId : undefined),
|
|
75
|
+
}}
|
|
76
|
+
>
|
|
77
|
+
<div data-slot="suggestions" class="flex min-w-0 flex-col gap-1.5">
|
|
78
|
+
<div
|
|
79
|
+
role="group"
|
|
80
|
+
aria-label={local.label ?? 'Suggested prompts'}
|
|
81
|
+
class={cn(
|
|
82
|
+
'flex min-w-0 gap-2',
|
|
83
|
+
{
|
|
84
|
+
'flex-wrap': local.layout !== 'scroll',
|
|
85
|
+
// Padding below keeps the focus ring of a chip from being clipped by the scroller.
|
|
86
|
+
'flex-nowrap overflow-x-auto p-1 [&>*]:shrink-0': local.layout === 'scroll',
|
|
87
|
+
},
|
|
88
|
+
local.class
|
|
89
|
+
)}
|
|
90
|
+
{...rest}
|
|
91
|
+
>
|
|
92
|
+
{local.children}
|
|
93
|
+
</div>
|
|
94
|
+
<Show when={reason()}>
|
|
95
|
+
<p id={reasonId} role="status" class="m-0 text-xs text-muted-foreground">
|
|
96
|
+
{reason()}
|
|
97
|
+
</p>
|
|
98
|
+
</Show>
|
|
99
|
+
</div>
|
|
100
|
+
</SuggestionsContext.Provider>
|
|
101
|
+
)
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export type SuggestionProps = Omit<ComponentProps<'button'>, 'onSelect' | 'children'> & {
|
|
105
|
+
/** The text that is sent when the chip is chosen. Also the chip's name. */
|
|
106
|
+
text: string
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export function Suggestion(props: SuggestionProps) {
|
|
110
|
+
const [local, rest] = splitProps(props, ['class', 'text', 'onClick'])
|
|
111
|
+
const context = useContext(SuggestionsContext)
|
|
112
|
+
// A chip outside a `Suggestions` row has no handler to call: inert and honest.
|
|
113
|
+
const blocked = () => context === undefined || context.blocked()
|
|
114
|
+
const text = () => boundText(local.text, 400)
|
|
115
|
+
|
|
116
|
+
return (
|
|
117
|
+
<Button
|
|
118
|
+
type="button"
|
|
119
|
+
variant="outline"
|
|
120
|
+
size="sm"
|
|
121
|
+
data-slot="suggestion"
|
|
122
|
+
title={text().length > 40 ? text() : undefined}
|
|
123
|
+
aria-disabled={blocked() || undefined}
|
|
124
|
+
aria-describedby={context?.reasonId()}
|
|
125
|
+
class={cn('max-w-full', local.class)}
|
|
126
|
+
onClick={(event) => {
|
|
127
|
+
if (blocked()) {
|
|
128
|
+
event.preventDefault()
|
|
129
|
+
return
|
|
130
|
+
}
|
|
131
|
+
if (typeof local.onClick === 'function') local.onClick(event)
|
|
132
|
+
// The host's own string, untouched: only the label is clipped, never what is sent.
|
|
133
|
+
context?.select(local.text)
|
|
134
|
+
}}
|
|
135
|
+
{...rest}
|
|
136
|
+
>
|
|
137
|
+
<span class="truncate">{text()}</span>
|
|
138
|
+
</Button>
|
|
139
|
+
)
|
|
140
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export {
|
|
2
|
+
Task,
|
|
3
|
+
TaskItemList,
|
|
4
|
+
TaskItemRow,
|
|
5
|
+
TASK_ITEM_STATUS_LABELS,
|
|
6
|
+
taskProgress,
|
|
7
|
+
taskProgressLabel,
|
|
8
|
+
type TaskFile,
|
|
9
|
+
type TaskItem,
|
|
10
|
+
type TaskItemListProps,
|
|
11
|
+
type TaskItemRowProps,
|
|
12
|
+
type TaskItemStatus,
|
|
13
|
+
type TaskProps,
|
|
14
|
+
} from './task'
|
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Check,
|
|
3
|
+
CircleAlert,
|
|
4
|
+
CircleDashed,
|
|
5
|
+
CircleSlash,
|
|
6
|
+
ListChecks,
|
|
7
|
+
LoaderCircle,
|
|
8
|
+
} from 'lucide-solid'
|
|
9
|
+
import {
|
|
10
|
+
createMemo,
|
|
11
|
+
createSignal,
|
|
12
|
+
For,
|
|
13
|
+
Index,
|
|
14
|
+
Show,
|
|
15
|
+
splitProps,
|
|
16
|
+
type ComponentProps,
|
|
17
|
+
type JSX,
|
|
18
|
+
} from 'solid-js'
|
|
19
|
+
import { cn } from '#lib/utils'
|
|
20
|
+
import { Attachment, AttachmentList, type AttachmentKind } from '../../ui/attachment'
|
|
21
|
+
import { Button } from '../../ui/button'
|
|
22
|
+
import { ScrollArea } from '../../ui/scroll-area'
|
|
23
|
+
import { TraceLine, type TraceLineProps } from '../../ui/trace'
|
|
24
|
+
|
|
25
|
+
// A function child runs once, when the content mounts (see `deferred` in `tool.tsx`).
|
|
26
|
+
const deferred = (render: () => JSX.Element) => render as unknown as JSX.Element
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Task.
|
|
30
|
+
*
|
|
31
|
+
* One piece of work the agent is doing, as a `TraceLine` that opens onto its
|
|
32
|
+
* items: a title, then a list in which each item is a sentence, optionally a
|
|
33
|
+
* status, and optionally the files it touched. Reach for `Plan` when the list is
|
|
34
|
+
* a proposal the person approves, for `Queue` when it is the agent's running
|
|
35
|
+
* todo list, and for a `Trace` of tool calls when the items are things that
|
|
36
|
+
* *ran* — a Task item is a statement about work, not a record of a call.
|
|
37
|
+
*
|
|
38
|
+
* ## Items wrap; lines do not
|
|
39
|
+
*
|
|
40
|
+
* A `TraceLine` truncates its title to one row, which is right for "Read
|
|
41
|
+
* src/app.tsx" and wrong for "Backfill locale from profile.language, falling
|
|
42
|
+
* back to en". Items are therefore their own rows with the same mark and colour
|
|
43
|
+
* vocabulary as a Trace line but wrapping text, clamped to three lines so a
|
|
44
|
+
* pasted paragraph cannot take the column. `TaskItemRow` and `TaskItemList` are
|
|
45
|
+
* exported because `Plan` and `Queue` are built from them.
|
|
46
|
+
*
|
|
47
|
+
* ## Status is a claim
|
|
48
|
+
*
|
|
49
|
+
* An item shows a mark and speaks a word only when the host supplied `status`.
|
|
50
|
+
* The "2 of 4 done" in the header is derived from those statuses and appears
|
|
51
|
+
* only if at least one item has one; items without a status are counted in the
|
|
52
|
+
* total and not in "done" (see `taskProgress`). A task with no items is a plain
|
|
53
|
+
* line: there is nothing to open, and an empty disclosure is a control that
|
|
54
|
+
* does nothing.
|
|
55
|
+
*
|
|
56
|
+
* ## Files are untrusted metadata
|
|
57
|
+
*
|
|
58
|
+
* File chips are `Attachment` chips with no handlers, so they are text: a name
|
|
59
|
+
* is never a link or a path. Past six, the rest sit behind one toggle button
|
|
60
|
+
* whose label changes in place, so keyboard focus survives opening and closing
|
|
61
|
+
* it.
|
|
62
|
+
*/
|
|
63
|
+
export type TaskItemStatus = 'complete' | 'active' | 'pending' | 'failed' | 'skipped'
|
|
64
|
+
|
|
65
|
+
export type TaskFile = Readonly<{
|
|
66
|
+
name: string
|
|
67
|
+
kind?: AttachmentKind
|
|
68
|
+
/** Bytes. */
|
|
69
|
+
size?: number
|
|
70
|
+
}>
|
|
71
|
+
|
|
72
|
+
export type TaskItem = Readonly<{
|
|
73
|
+
/** Only needed for the host's own bookkeeping; rows are kept by position. */
|
|
74
|
+
id?: string
|
|
75
|
+
text: string
|
|
76
|
+
description?: string
|
|
77
|
+
status?: TaskItemStatus
|
|
78
|
+
files?: readonly TaskFile[]
|
|
79
|
+
}>
|
|
80
|
+
|
|
81
|
+
/** The words spoken for each item status. */
|
|
82
|
+
export const TASK_ITEM_STATUS_LABELS: Readonly<Record<TaskItemStatus, string>> = {
|
|
83
|
+
complete: 'Completed',
|
|
84
|
+
active: 'In progress',
|
|
85
|
+
pending: 'Pending',
|
|
86
|
+
failed: 'Failed',
|
|
87
|
+
skipped: 'Skipped',
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/** Visible files per item before the rest go behind a toggle. */
|
|
91
|
+
const VISIBLE_FILES = 6
|
|
92
|
+
/** Characters of item text kept; the rest of a pasted wall is not a todo. */
|
|
93
|
+
const MAX_TEXT = 1_000
|
|
94
|
+
|
|
95
|
+
function bound(text: string, max: number): string {
|
|
96
|
+
return text.length > max ? `${text.slice(0, max)}…` : text
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* How many items are done, or nothing at all when no item carries a status.
|
|
101
|
+
* Items without a status count toward the total: the host did not say they were
|
|
102
|
+
* finished, so they are not.
|
|
103
|
+
*/
|
|
104
|
+
export function taskProgress(
|
|
105
|
+
items: readonly Pick<TaskItem, 'status'>[]
|
|
106
|
+
): Readonly<{ done: number; total: number }> | undefined {
|
|
107
|
+
if (!items.some((item) => item.status !== undefined)) return undefined
|
|
108
|
+
return {
|
|
109
|
+
done: items.filter((item) => item.status === 'complete').length,
|
|
110
|
+
total: items.length,
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/** `2 of 4 done`, in words. */
|
|
115
|
+
export function taskProgressLabel(progress: { done: number; total: number }): string {
|
|
116
|
+
return `${progress.done} of ${progress.total} done`
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
function ItemMark(props: { status?: TaskItemStatus }) {
|
|
120
|
+
return (
|
|
121
|
+
<span
|
|
122
|
+
aria-hidden="true"
|
|
123
|
+
data-slot="task-item-mark"
|
|
124
|
+
class={cn('mt-0.5 grid size-4 shrink-0 place-items-center [&_svg]:size-3.5', {
|
|
125
|
+
'text-muted-foreground': props.status !== 'active' && props.status !== 'failed',
|
|
126
|
+
'text-info': props.status === 'active',
|
|
127
|
+
'text-destructive': props.status === 'failed',
|
|
128
|
+
})}
|
|
129
|
+
>
|
|
130
|
+
<Show
|
|
131
|
+
when={props.status}
|
|
132
|
+
fallback={<span class="size-1 rounded-full bg-muted-foreground/60" />}
|
|
133
|
+
>
|
|
134
|
+
{(status) => (
|
|
135
|
+
<>
|
|
136
|
+
<Show when={status() === 'complete'}>
|
|
137
|
+
<Check />
|
|
138
|
+
</Show>
|
|
139
|
+
<Show when={status() === 'active'}>
|
|
140
|
+
<LoaderCircle class="motion-safe:animate-spin" />
|
|
141
|
+
</Show>
|
|
142
|
+
<Show when={status() === 'pending'}>
|
|
143
|
+
<CircleDashed />
|
|
144
|
+
</Show>
|
|
145
|
+
<Show when={status() === 'failed'}>
|
|
146
|
+
<CircleAlert />
|
|
147
|
+
</Show>
|
|
148
|
+
<Show when={status() === 'skipped'}>
|
|
149
|
+
<CircleSlash />
|
|
150
|
+
</Show>
|
|
151
|
+
</>
|
|
152
|
+
)}
|
|
153
|
+
</Show>
|
|
154
|
+
</span>
|
|
155
|
+
)
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
export type TaskItemRowProps = Omit<ComponentProps<'li'>, 'children'> & {
|
|
159
|
+
text: string
|
|
160
|
+
description?: string
|
|
161
|
+
status?: TaskItemStatus
|
|
162
|
+
files?: readonly TaskFile[]
|
|
163
|
+
/** Spoken in place of the default status word. */
|
|
164
|
+
statusLabel?: string
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
export function TaskItemRow(props: TaskItemRowProps) {
|
|
168
|
+
const [local, rest] = splitProps(props, [
|
|
169
|
+
'class',
|
|
170
|
+
'text',
|
|
171
|
+
'description',
|
|
172
|
+
'status',
|
|
173
|
+
'files',
|
|
174
|
+
'statusLabel',
|
|
175
|
+
])
|
|
176
|
+
const [showAllFiles, setShowAllFiles] = createSignal(false)
|
|
177
|
+
const files = () => local.files ?? []
|
|
178
|
+
const shownFiles = () => (showAllFiles() ? files() : files().slice(0, VISIBLE_FILES))
|
|
179
|
+
const hiddenFiles = () => files().length - VISIBLE_FILES
|
|
180
|
+
const text = () => bound(local.text, MAX_TEXT)
|
|
181
|
+
|
|
182
|
+
return (
|
|
183
|
+
<li
|
|
184
|
+
data-slot="task-item"
|
|
185
|
+
data-status={local.status}
|
|
186
|
+
class={cn('flex min-w-0 gap-2 rounded-md px-1.5 py-0.5', local.class)}
|
|
187
|
+
{...rest}
|
|
188
|
+
>
|
|
189
|
+
<ItemMark status={local.status} />
|
|
190
|
+
<div class="flex min-w-0 flex-1 flex-col gap-1">
|
|
191
|
+
<p
|
|
192
|
+
title={text()}
|
|
193
|
+
class={cn(
|
|
194
|
+
'm-0 line-clamp-3 text-sm [overflow-wrap:anywhere] whitespace-pre-wrap text-foreground',
|
|
195
|
+
{
|
|
196
|
+
'text-muted-foreground': local.status === 'complete' || local.status === 'skipped',
|
|
197
|
+
'text-destructive': local.status === 'failed',
|
|
198
|
+
}
|
|
199
|
+
)}
|
|
200
|
+
>
|
|
201
|
+
{text()}
|
|
202
|
+
<Show when={local.status}>
|
|
203
|
+
{(status) => (
|
|
204
|
+
<span class="sr-only"> {local.statusLabel ?? TASK_ITEM_STATUS_LABELS[status()]}</span>
|
|
205
|
+
)}
|
|
206
|
+
</Show>
|
|
207
|
+
</p>
|
|
208
|
+
<Show when={local.description}>
|
|
209
|
+
{(description) => (
|
|
210
|
+
<p class="m-0 line-clamp-3 text-xs [overflow-wrap:anywhere] text-muted-foreground/80">
|
|
211
|
+
{bound(description(), MAX_TEXT)}
|
|
212
|
+
</p>
|
|
213
|
+
)}
|
|
214
|
+
</Show>
|
|
215
|
+
<Show when={files().length > 0}>
|
|
216
|
+
<AttachmentList aria-label="Files" class="gap-1">
|
|
217
|
+
<For each={shownFiles()}>
|
|
218
|
+
{(file) => (
|
|
219
|
+
<li class="min-w-0 max-w-full">
|
|
220
|
+
<Attachment variant="chip" name={file.name} kind={file.kind} size={file.size} />
|
|
221
|
+
</li>
|
|
222
|
+
)}
|
|
223
|
+
</For>
|
|
224
|
+
<Show when={hiddenFiles() > 0}>
|
|
225
|
+
<li class="flex items-center">
|
|
226
|
+
<Button
|
|
227
|
+
type="button"
|
|
228
|
+
variant="ghost"
|
|
229
|
+
size="2xs"
|
|
230
|
+
aria-expanded={showAllFiles()}
|
|
231
|
+
onClick={() => setShowAllFiles((value) => !value)}
|
|
232
|
+
>
|
|
233
|
+
{showAllFiles() ? 'Show fewer files' : `Show ${hiddenFiles()} more files`}
|
|
234
|
+
</Button>
|
|
235
|
+
</li>
|
|
236
|
+
</Show>
|
|
237
|
+
</AttachmentList>
|
|
238
|
+
</Show>
|
|
239
|
+
</div>
|
|
240
|
+
</li>
|
|
241
|
+
)
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
export type TaskItemListProps = Omit<ComponentProps<'div'>, 'children'> & {
|
|
245
|
+
/** The list's accessible name. A scrolling region without one is an unlabelled tab stop. */
|
|
246
|
+
label: string
|
|
247
|
+
children?: JSX.Element
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* The items, bounded. Two hundred todo items must scroll inside their line and
|
|
252
|
+
* not push the answer out of view; the region is keyboard-focusable and named,
|
|
253
|
+
* which is what makes the overflow reachable without a pointer.
|
|
254
|
+
*/
|
|
255
|
+
export function TaskItemList(props: TaskItemListProps) {
|
|
256
|
+
const [local, rest] = splitProps(props, ['class', 'label', 'children'])
|
|
257
|
+
return (
|
|
258
|
+
<ScrollArea
|
|
259
|
+
role="region"
|
|
260
|
+
aria-label={local.label}
|
|
261
|
+
class={cn('max-h-72', local.class)}
|
|
262
|
+
{...rest}
|
|
263
|
+
>
|
|
264
|
+
<ul role="list" class="m-0 flex list-none flex-col gap-0.5 p-0">
|
|
265
|
+
{local.children}
|
|
266
|
+
</ul>
|
|
267
|
+
</ScrollArea>
|
|
268
|
+
)
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
export type TaskProps = Omit<
|
|
272
|
+
TraceLineProps,
|
|
273
|
+
'description' | 'href' | 'onSelect' | 'selectHaspopup' | 'children'
|
|
274
|
+
> & {
|
|
275
|
+
items: readonly TaskItem[]
|
|
276
|
+
/** The item list's accessible name. Defaults to the title when it is a string. */
|
|
277
|
+
itemsLabel?: string
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
export function Task(props: TaskProps) {
|
|
281
|
+
const [local, rest] = splitProps(props, ['items', 'itemsLabel', 'icon', 'meta', 'title'])
|
|
282
|
+
const progress = createMemo(() => taskProgress(local.items))
|
|
283
|
+
const derivedMeta = () => {
|
|
284
|
+
const value = progress()
|
|
285
|
+
return value ? taskProgressLabel(value) : undefined
|
|
286
|
+
}
|
|
287
|
+
const label = () =>
|
|
288
|
+
local.itemsLabel ?? (typeof local.title === 'string' ? `${local.title} items` : 'Task items')
|
|
289
|
+
|
|
290
|
+
// A function child is only run when the content mounts, so a collapsed task
|
|
291
|
+
// with hundreds of items renders none of them.
|
|
292
|
+
const list = () => (
|
|
293
|
+
<TaskItemList label={label()}>
|
|
294
|
+
<Index each={local.items}>
|
|
295
|
+
{(item) => (
|
|
296
|
+
<TaskItemRow
|
|
297
|
+
text={item().text}
|
|
298
|
+
description={item().description}
|
|
299
|
+
status={item().status}
|
|
300
|
+
files={item().files}
|
|
301
|
+
/>
|
|
302
|
+
)}
|
|
303
|
+
</Index>
|
|
304
|
+
</TaskItemList>
|
|
305
|
+
)
|
|
306
|
+
|
|
307
|
+
return (
|
|
308
|
+
<TraceLine
|
|
309
|
+
icon={local.icon ?? <ListChecks />}
|
|
310
|
+
title={local.title}
|
|
311
|
+
meta={local.meta ?? derivedMeta()}
|
|
312
|
+
{...rest}
|
|
313
|
+
>
|
|
314
|
+
{local.items.length > 0 ? deferred(list) : undefined}
|
|
315
|
+
</TraceLine>
|
|
316
|
+
)
|
|
317
|
+
}
|