@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,405 @@
|
|
|
1
|
+
import { File, Folder, FolderOpen } from 'lucide-solid'
|
|
2
|
+
import {
|
|
3
|
+
createComputed,
|
|
4
|
+
createMemo,
|
|
5
|
+
createSignal,
|
|
6
|
+
For,
|
|
7
|
+
onCleanup,
|
|
8
|
+
Show,
|
|
9
|
+
splitProps,
|
|
10
|
+
untrack,
|
|
11
|
+
type ComponentProps,
|
|
12
|
+
} from 'solid-js'
|
|
13
|
+
import { keyedRows } from '#lib/keyed-rows'
|
|
14
|
+
import { cn } from '#lib/utils'
|
|
15
|
+
import { Button } from '../../ui/button'
|
|
16
|
+
import { Badge } from '../../ui/badge'
|
|
17
|
+
import { Tree, TreeRow, type TreeItemDescriptor } from '../tree'
|
|
18
|
+
import {
|
|
19
|
+
buildFileTree,
|
|
20
|
+
clampWindow,
|
|
21
|
+
countChanges,
|
|
22
|
+
describeChanges,
|
|
23
|
+
FILE_CHANGE_LABELS,
|
|
24
|
+
flattenFileTree,
|
|
25
|
+
indexFileTree,
|
|
26
|
+
initialExpanded,
|
|
27
|
+
revealInWindow,
|
|
28
|
+
typeaheadIndex,
|
|
29
|
+
type RowWindow,
|
|
30
|
+
type FileChangeInput,
|
|
31
|
+
type FileChangeKind,
|
|
32
|
+
type FileTreeExpansion,
|
|
33
|
+
type FileTreeNode,
|
|
34
|
+
type FileTreeRow,
|
|
35
|
+
} from './build-file-tree'
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* FileTree.
|
|
39
|
+
*
|
|
40
|
+
* The files an agent changed, as a folder tree. It is for a change set — dozens
|
|
41
|
+
* to thousands of paths with an optional change kind each — and not for browsing
|
|
42
|
+
* a workspace: it has no rename, drag, or filesystem action, and it never opens
|
|
43
|
+
* anything. Reach for `Trace` lines when the agent touched two or three files, and
|
|
44
|
+
* for the shared `Tree` directly when the host owns a real file explorer.
|
|
45
|
+
*
|
|
46
|
+
* ## Built on `Tree`, and why that fits
|
|
47
|
+
*
|
|
48
|
+
* `Tree` supplies the treeitem semantics and the WAI-ARIA keyboard model (arrows,
|
|
49
|
+
* Home/End, roving tab stop) and leaves the projection to the host. A changed-file
|
|
50
|
+
* tree is small enough that the whole projection can live in memory, and the
|
|
51
|
+
* `Tree` contract for a mounted window — a complete `visibleItems` list with only
|
|
52
|
+
* some rows rendered, `onRequestReveal` to mount a row the keyboard moved to — is
|
|
53
|
+
* exactly the seam a bounded render needs, so this adds no navigation code of
|
|
54
|
+
* its own. What it adds is typeahead, which `Tree` does not provide: a typed
|
|
55
|
+
* prefix jumps to the next row whose name starts with it.
|
|
56
|
+
*
|
|
57
|
+
* ## Large trees
|
|
58
|
+
*
|
|
59
|
+
* A collapsed folder's subtree is never visited or rendered, so a 5 000-file tree
|
|
60
|
+
* costs what is visible. A tree of more than 100 files starts with only its top
|
|
61
|
+
* level open (`defaultExpanded` overrides). Past `maxRows` visible rows only a
|
|
62
|
+
* window of them is mounted, with a control above and below to move it a page at
|
|
63
|
+
* a time. The full list is what keyboard navigation walks: an arrow key at the
|
|
64
|
+
* window's edge grows it by a page, and a jump (End, Home, a typed letter) moves
|
|
65
|
+
* it to the page holding the target instead of mounting every row between, so End
|
|
66
|
+
* on a tree of thousands of open rows stays one page of work.
|
|
67
|
+
*
|
|
68
|
+
* ## Changes are claims
|
|
69
|
+
*
|
|
70
|
+
* A change kind is drawn — as a word on the row, so it is also spoken — only for a
|
|
71
|
+
* file the host gave one. A file without one is listed and nothing more is said.
|
|
72
|
+
* The summary counts what was supplied, and is silent about files with no kind.
|
|
73
|
+
* Paths that are not acceptable (`..` segments, control characters) are not drawn;
|
|
74
|
+
* their number is stated, so the list is never quietly shorter than the input.
|
|
75
|
+
*
|
|
76
|
+
* ## Selection is the host's
|
|
77
|
+
*
|
|
78
|
+
* Rows select only when `onSelect` is supplied; without it no row is selectable
|
|
79
|
+
* and `aria-selected` is not set. Enter or a click on a folder expands it; on a
|
|
80
|
+
* file it selects. Space selects either. The tree never opens a file itself — the
|
|
81
|
+
* path is untrusted text, and what it means on this machine is the host's call.
|
|
82
|
+
*/
|
|
83
|
+
export type FileTreeProps = Omit<ComponentProps<'div'>, 'children' | 'onSelect'> & {
|
|
84
|
+
/** Paths, or paths with a change kind. Both `/` and `\` separate segments. */
|
|
85
|
+
files: readonly (string | FileChangeInput)[]
|
|
86
|
+
/** The tree's accessible name. Default "Changed files". */
|
|
87
|
+
label?: string
|
|
88
|
+
/**
|
|
89
|
+
* Which folders start open: `true` all, `false` none, a number to that depth,
|
|
90
|
+
* or a list of ids. Unset opens a small tree fully and a large one at its top level.
|
|
91
|
+
*/
|
|
92
|
+
defaultExpanded?: FileTreeExpansion
|
|
93
|
+
/** Merge a folder with a single folder child into one row. Default true. */
|
|
94
|
+
compact?: boolean
|
|
95
|
+
/** The selected node's id. Meaningful only with `onSelect`. */
|
|
96
|
+
selected?: string
|
|
97
|
+
/** Make rows selectable. Omit and nothing is selectable. */
|
|
98
|
+
onSelect?: (path: string, node: FileTreeNode) => void
|
|
99
|
+
/** Height of the tree box, which scrolls past it. A number is pixels. Default `20rem`. */
|
|
100
|
+
maxHeight?: number | string
|
|
101
|
+
/** Visible rows mounted at once; more are added a page at a time. Default 500. */
|
|
102
|
+
maxRows?: number
|
|
103
|
+
/** Show the count of changes above the tree. Default true. */
|
|
104
|
+
showSummary?: boolean
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export const FILE_TREE_MAX_ROWS = 500
|
|
108
|
+
|
|
109
|
+
const CHANGE_VARIANT: Readonly<
|
|
110
|
+
Record<FileChangeKind, 'success' | 'warning' | 'destructive' | 'info'>
|
|
111
|
+
> = {
|
|
112
|
+
added: 'success',
|
|
113
|
+
modified: 'warning',
|
|
114
|
+
deleted: 'destructive',
|
|
115
|
+
renamed: 'info',
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function descriptor(row: FileTreeRow): TreeItemDescriptor {
|
|
119
|
+
return {
|
|
120
|
+
id: row.node.id,
|
|
121
|
+
parentId: row.parentId,
|
|
122
|
+
level: row.level,
|
|
123
|
+
expandable: row.node.kind === 'directory',
|
|
124
|
+
expanded: row.expanded,
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function RowContent(props: { row: FileTreeRow }) {
|
|
129
|
+
const node = () => props.row.node
|
|
130
|
+
return (
|
|
131
|
+
<>
|
|
132
|
+
<span
|
|
133
|
+
class={cn('truncate', {
|
|
134
|
+
'text-muted-foreground line-through': node().change === 'deleted',
|
|
135
|
+
})}
|
|
136
|
+
title={node().id}
|
|
137
|
+
>
|
|
138
|
+
{node().name}
|
|
139
|
+
</span>
|
|
140
|
+
<Show when={node().renamedFrom}>
|
|
141
|
+
<span class="sr-only">, renamed from {node().renamedFrom}</span>
|
|
142
|
+
</Show>
|
|
143
|
+
</>
|
|
144
|
+
)
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function RowTrailing(props: { row: FileTreeRow }) {
|
|
148
|
+
const node = () => props.row.node
|
|
149
|
+
return (
|
|
150
|
+
<>
|
|
151
|
+
<Show when={node().kind === 'file' && (node().additions || node().deletions)}>
|
|
152
|
+
<span class="font-code text-2xs tabular-nums">
|
|
153
|
+
<Show when={node().additions !== undefined}>
|
|
154
|
+
<span class="text-foreground">+{node().additions}</span>
|
|
155
|
+
</Show>{' '}
|
|
156
|
+
<Show when={node().deletions !== undefined}>
|
|
157
|
+
<span class="text-foreground">−{node().deletions}</span>
|
|
158
|
+
</Show>
|
|
159
|
+
</span>
|
|
160
|
+
</Show>
|
|
161
|
+
<Show when={node().kind === 'directory' && !props.row.expanded}>
|
|
162
|
+
<span class="text-2xs tabular-nums">
|
|
163
|
+
{node().fileCount.toLocaleString()} {node().fileCount === 1 ? 'file' : 'files'}
|
|
164
|
+
</span>
|
|
165
|
+
</Show>
|
|
166
|
+
{/* The word is the signal; the tint only helps a sighted reader find it. */}
|
|
167
|
+
<Show when={node().change}>
|
|
168
|
+
{(change) => (
|
|
169
|
+
<Badge variant={CHANGE_VARIANT[change()]} size="sm">
|
|
170
|
+
{FILE_CHANGE_LABELS[change()]}
|
|
171
|
+
</Badge>
|
|
172
|
+
)}
|
|
173
|
+
</Show>
|
|
174
|
+
</>
|
|
175
|
+
)
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
export function FileTree(props: FileTreeProps) {
|
|
179
|
+
const [local, rest] = splitProps(props, [
|
|
180
|
+
'files',
|
|
181
|
+
'label',
|
|
182
|
+
'defaultExpanded',
|
|
183
|
+
'compact',
|
|
184
|
+
'selected',
|
|
185
|
+
'onSelect',
|
|
186
|
+
'maxHeight',
|
|
187
|
+
'maxRows',
|
|
188
|
+
'showSummary',
|
|
189
|
+
'class',
|
|
190
|
+
])
|
|
191
|
+
|
|
192
|
+
const build = createMemo(() => buildFileTree(local.files, { compact: local.compact }))
|
|
193
|
+
const nodes = createMemo(() => indexFileTree(build().roots))
|
|
194
|
+
const counts = createMemo(() => countChanges(build().roots))
|
|
195
|
+
|
|
196
|
+
// Folders the tree has already decided about. A change set that grows while
|
|
197
|
+
// the agent works opens its new folders by the same rule as the first render,
|
|
198
|
+
// and never reopens one the reader closed.
|
|
199
|
+
const [expanded, setExpanded] = createSignal<ReadonlySet<string>>(new Set())
|
|
200
|
+
let seen = new Set<string>()
|
|
201
|
+
createComputed(() => {
|
|
202
|
+
const { roots, fileCount } = build()
|
|
203
|
+
const wanted = initialExpanded(roots, local.defaultExpanded, fileCount)
|
|
204
|
+
const folders = new Set<string>()
|
|
205
|
+
for (const [id, node] of nodes()) if (node.kind === 'directory') folders.add(id)
|
|
206
|
+
untrack(() => {
|
|
207
|
+
const next = new Set([...expanded()].filter((id) => folders.has(id)))
|
|
208
|
+
for (const id of wanted) if (!seen.has(id)) next.add(id)
|
|
209
|
+
seen = folders
|
|
210
|
+
setExpanded(next)
|
|
211
|
+
})
|
|
212
|
+
})
|
|
213
|
+
|
|
214
|
+
const rows = createMemo(() => flattenFileTree(build().roots, expanded()))
|
|
215
|
+
const pageSize = () => Math.max(1, Math.floor(local.maxRows ?? FILE_TREE_MAX_ROWS))
|
|
216
|
+
const [requested, setRequested] = createSignal<RowWindow>({ start: 0, end: 0 })
|
|
217
|
+
const mountedWindow = createMemo(() =>
|
|
218
|
+
clampWindow(
|
|
219
|
+
requested().end === 0 ? { start: 0, end: pageSize() } : requested(),
|
|
220
|
+
rows().length,
|
|
221
|
+
pageSize()
|
|
222
|
+
)
|
|
223
|
+
)
|
|
224
|
+
const items = createMemo(() => rows().map(descriptor))
|
|
225
|
+
const mounted = keyedRows(
|
|
226
|
+
() => rows().slice(mountedWindow().start, mountedWindow().end),
|
|
227
|
+
(row) => row.node.id
|
|
228
|
+
)
|
|
229
|
+
const rowsBefore = () => mountedWindow().start
|
|
230
|
+
const rowsAfter = () => Math.max(0, rows().length - mountedWindow().end)
|
|
231
|
+
|
|
232
|
+
const [activeId, setActiveId] = createSignal<string | null>(null)
|
|
233
|
+
const selectable = () => local.onSelect !== undefined
|
|
234
|
+
|
|
235
|
+
const toggle = (id: string, open: boolean) => {
|
|
236
|
+
setExpanded((current) => {
|
|
237
|
+
const next = new Set(current)
|
|
238
|
+
if (open) next.add(id)
|
|
239
|
+
else next.delete(id)
|
|
240
|
+
return next
|
|
241
|
+
})
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/** Mount the rows around one the keyboard is moving to, so focus can land on it. */
|
|
245
|
+
const reveal = (id: string) => {
|
|
246
|
+
const index = rows().findIndex((row) => row.node.id === id)
|
|
247
|
+
setRequested(revealInWindow(mountedWindow(), index, rows().length, pageSize()))
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
const select = (id: string) => {
|
|
251
|
+
const node = nodes().get(id)
|
|
252
|
+
if (node) local.onSelect?.(id, node)
|
|
253
|
+
}
|
|
254
|
+
const activate = (id: string) => {
|
|
255
|
+
const node = nodes().get(id)
|
|
256
|
+
if (!node) return
|
|
257
|
+
if (node.kind === 'directory') toggle(id, !expanded().has(id))
|
|
258
|
+
else select(id)
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
let container: HTMLDivElement | undefined
|
|
262
|
+
let typed = ''
|
|
263
|
+
let typedTimer: ReturnType<typeof setTimeout> | undefined
|
|
264
|
+
onCleanup(() => clearTimeout(typedTimer))
|
|
265
|
+
const typeahead = (event: KeyboardEvent) => {
|
|
266
|
+
if (
|
|
267
|
+
event.defaultPrevented ||
|
|
268
|
+
event.ctrlKey ||
|
|
269
|
+
event.metaKey ||
|
|
270
|
+
event.altKey ||
|
|
271
|
+
event.key.length !== 1 ||
|
|
272
|
+
event.key === ' '
|
|
273
|
+
) {
|
|
274
|
+
return
|
|
275
|
+
}
|
|
276
|
+
typed += event.key
|
|
277
|
+
clearTimeout(typedTimer)
|
|
278
|
+
typedTimer = setTimeout(() => (typed = ''), 700)
|
|
279
|
+
const all = rows()
|
|
280
|
+
const active = all.findIndex((row) => row.node.id === activeId())
|
|
281
|
+
const target = typeaheadIndex(
|
|
282
|
+
all.map((row) => row.node.name),
|
|
283
|
+
active,
|
|
284
|
+
typed
|
|
285
|
+
)
|
|
286
|
+
const row = all[target]
|
|
287
|
+
if (!row) return
|
|
288
|
+
event.preventDefault()
|
|
289
|
+
const id = row.node.id
|
|
290
|
+
reveal(id)
|
|
291
|
+
setActiveId(id)
|
|
292
|
+
queueMicrotask(() => {
|
|
293
|
+
for (const element of container?.querySelectorAll<HTMLElement>('[data-tree-id]') ?? []) {
|
|
294
|
+
if (element.dataset.treeId === id) {
|
|
295
|
+
element.focus()
|
|
296
|
+
break
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
})
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
const maxHeight = () =>
|
|
303
|
+
typeof local.maxHeight === 'number' ? `${local.maxHeight}px` : (local.maxHeight ?? '20rem')
|
|
304
|
+
|
|
305
|
+
return (
|
|
306
|
+
<div
|
|
307
|
+
data-slot="file-tree"
|
|
308
|
+
class={cn('flex min-w-0 flex-col gap-1', local.class)}
|
|
309
|
+
ref={(element) => (container = element)}
|
|
310
|
+
{...rest}
|
|
311
|
+
>
|
|
312
|
+
<Show when={local.showSummary !== false}>
|
|
313
|
+
<p data-slot="file-tree-summary" class="m-0 text-xs text-muted-foreground">
|
|
314
|
+
{describeChanges(counts())}
|
|
315
|
+
<Show when={build().rejected.length > 0}>
|
|
316
|
+
{' '}
|
|
317
|
+
· {build().rejected.length.toLocaleString()}{' '}
|
|
318
|
+
{build().rejected.length === 1 ? 'path' : 'paths'} ignored as not valid
|
|
319
|
+
</Show>
|
|
320
|
+
</p>
|
|
321
|
+
</Show>
|
|
322
|
+
<Show when={rows().length === 0 && local.showSummary === false}>
|
|
323
|
+
<p class="m-0 text-xs text-muted-foreground">No changed files</p>
|
|
324
|
+
</Show>
|
|
325
|
+
<Show when={rows().length > 0}>
|
|
326
|
+
{/* The listener sits on the wrapper because `Tree` owns its own keydown
|
|
327
|
+
and ignores printable keys; typeahead picks up where it stops. */}
|
|
328
|
+
<Show when={rowsBefore() > 0}>
|
|
329
|
+
<div>
|
|
330
|
+
<Button
|
|
331
|
+
variant="ghost"
|
|
332
|
+
size="2xs"
|
|
333
|
+
onClick={() =>
|
|
334
|
+
setRequested({
|
|
335
|
+
start: Math.max(0, mountedWindow().start - pageSize()),
|
|
336
|
+
end: mountedWindow().end,
|
|
337
|
+
})
|
|
338
|
+
}
|
|
339
|
+
>
|
|
340
|
+
Show {Math.min(rowsBefore(), pageSize()).toLocaleString()} earlier rows (
|
|
341
|
+
{rowsBefore().toLocaleString()} not shown)
|
|
342
|
+
</Button>
|
|
343
|
+
</div>
|
|
344
|
+
</Show>
|
|
345
|
+
<div
|
|
346
|
+
class="scroll-fade overflow-auto rounded-md"
|
|
347
|
+
style={{ 'max-height': maxHeight() }}
|
|
348
|
+
onKeyDown={typeahead}
|
|
349
|
+
>
|
|
350
|
+
<Tree
|
|
351
|
+
aria-label={local.label ?? 'Changed files'}
|
|
352
|
+
visibleItems={items()}
|
|
353
|
+
activeId={activeId()}
|
|
354
|
+
onActiveIdChange={setActiveId}
|
|
355
|
+
onExpand={toggle}
|
|
356
|
+
onActivate={(id) => activate(id)}
|
|
357
|
+
onSelectItem={(id) => select(id)}
|
|
358
|
+
onRequestReveal={reveal}
|
|
359
|
+
selectionMode={selectable() ? 'single' : undefined}
|
|
360
|
+
>
|
|
361
|
+
<For each={mounted()}>
|
|
362
|
+
{(entry) => (
|
|
363
|
+
<TreeRow
|
|
364
|
+
item={descriptor(entry.item())}
|
|
365
|
+
selected={selectable() ? local.selected === entry.item().node.id : undefined}
|
|
366
|
+
leading={
|
|
367
|
+
entry.item().node.kind === 'directory' ? (
|
|
368
|
+
entry.item().expanded ? (
|
|
369
|
+
<FolderOpen aria-hidden="true" class="text-muted-foreground" />
|
|
370
|
+
) : (
|
|
371
|
+
<Folder aria-hidden="true" class="text-muted-foreground" />
|
|
372
|
+
)
|
|
373
|
+
) : (
|
|
374
|
+
<File aria-hidden="true" class="text-muted-foreground" />
|
|
375
|
+
)
|
|
376
|
+
}
|
|
377
|
+
trailing={<RowTrailing row={entry.item()} />}
|
|
378
|
+
>
|
|
379
|
+
<RowContent row={entry.item()} />
|
|
380
|
+
</TreeRow>
|
|
381
|
+
)}
|
|
382
|
+
</For>
|
|
383
|
+
</Tree>
|
|
384
|
+
</div>
|
|
385
|
+
<Show when={rowsAfter() > 0}>
|
|
386
|
+
<div>
|
|
387
|
+
<Button
|
|
388
|
+
variant="ghost"
|
|
389
|
+
size="2xs"
|
|
390
|
+
onClick={() =>
|
|
391
|
+
setRequested({
|
|
392
|
+
start: mountedWindow().start,
|
|
393
|
+
end: Math.min(rows().length, mountedWindow().end + pageSize()),
|
|
394
|
+
})
|
|
395
|
+
}
|
|
396
|
+
>
|
|
397
|
+
Show {Math.min(rowsAfter(), pageSize()).toLocaleString()} more rows (
|
|
398
|
+
{rowsAfter().toLocaleString()} not shown)
|
|
399
|
+
</Button>
|
|
400
|
+
</div>
|
|
401
|
+
</Show>
|
|
402
|
+
</Show>
|
|
403
|
+
</div>
|
|
404
|
+
)
|
|
405
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export { FileTree, FILE_TREE_MAX_ROWS, type FileTreeProps } from './file-tree'
|
|
2
|
+
export {
|
|
3
|
+
buildFileTree,
|
|
4
|
+
clampWindow,
|
|
5
|
+
countChanges,
|
|
6
|
+
describeChanges,
|
|
7
|
+
FILE_CHANGE_LABELS,
|
|
8
|
+
FILE_TREE_AUTO_EXPAND_LIMIT,
|
|
9
|
+
FILE_TREE_MAX_DEPTH,
|
|
10
|
+
flattenFileTree,
|
|
11
|
+
indexFileTree,
|
|
12
|
+
initialExpanded,
|
|
13
|
+
normalizePath,
|
|
14
|
+
revealInWindow,
|
|
15
|
+
typeaheadIndex,
|
|
16
|
+
type BuildFileTreeOptions,
|
|
17
|
+
type ChangeCounts,
|
|
18
|
+
type FileChangeInput,
|
|
19
|
+
type FileChangeKind,
|
|
20
|
+
type FileTreeBuild,
|
|
21
|
+
type FileTreeExpansion,
|
|
22
|
+
type FileTreeNode,
|
|
23
|
+
type FileTreeRow,
|
|
24
|
+
type RowWindow,
|
|
25
|
+
} from './build-file-tree'
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { boundText, sourceHost, sourceTitle, type Source } from '../sources/source'
|
|
2
|
+
|
|
3
|
+
/** Characters of a host or title that fit in a badge before it is clipped. */
|
|
4
|
+
const LABEL_LIMIT = 24
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* The text on a citation badge.
|
|
8
|
+
*
|
|
9
|
+
* A 1-based `index` wins, because a number is what the sentence's own markers
|
|
10
|
+
* and the Sources list use. Without one the badge shows the source's host (read
|
|
11
|
+
* from the parsed URL, so it cannot be spoofed by a title), then a clipped title,
|
|
12
|
+
* and only then a neutral word — never an invented number.
|
|
13
|
+
*/
|
|
14
|
+
export function citationLabel(index: number | undefined, source: Source | undefined): string {
|
|
15
|
+
if (index !== undefined && Number.isInteger(index) && index >= 1 && index <= 9999) {
|
|
16
|
+
return String(index)
|
|
17
|
+
}
|
|
18
|
+
if (source === undefined) return 'source'
|
|
19
|
+
const host = sourceHost(source.url)
|
|
20
|
+
if (host !== undefined) return boundText(host, LABEL_LIMIT)
|
|
21
|
+
return boundText(source.title, LABEL_LIMIT) || 'source'
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* The badge's accessible name. The visible label is a number or a host, which
|
|
26
|
+
* says nothing on its own, so the name carries the title and host: a screen-reader
|
|
27
|
+
* or voice-control user learns what is cited without opening the popover.
|
|
28
|
+
*/
|
|
29
|
+
export function citationName(sources: readonly Source[], index: number | undefined): string {
|
|
30
|
+
const first = sources[0]
|
|
31
|
+
if (first === undefined) return 'Citation'
|
|
32
|
+
const label = citationLabel(index, first)
|
|
33
|
+
if (sources.length > 1) return `Sources ${label} and ${sources.length - 1} more`
|
|
34
|
+
const host = sourceHost(first.url)
|
|
35
|
+
const title = sourceTitle(first)
|
|
36
|
+
return host !== undefined && host !== title
|
|
37
|
+
? `Source ${label}: ${title}, ${host}`
|
|
38
|
+
: `Source ${label}: ${title}`
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/** Wrap a position into 0..count-1, so Previous on the first source goes to the last. */
|
|
42
|
+
export function wrapIndex(position: number, count: number): number {
|
|
43
|
+
if (count <= 0) return 0
|
|
44
|
+
return ((position % count) + count) % count
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* How a citation's popover is open.
|
|
49
|
+
*
|
|
50
|
+
* - `peek` is a hover or keyboard-focus preview: it does not take focus, and it
|
|
51
|
+
* goes away when the pointer or focus does.
|
|
52
|
+
* - `pinned` is a deliberate open (click, tap, Enter, Space): focus moves into
|
|
53
|
+
* the popover so its link and Previous/Next are reachable, and it stays until
|
|
54
|
+
* Escape, an outside press, or the badge is pressed again.
|
|
55
|
+
*
|
|
56
|
+
* A popover that only opened on hover would exclude keyboard and touch readers;
|
|
57
|
+
* one that only opened on press would make pointer users click to glance at a
|
|
58
|
+
* source. This is the smallest model that serves both, and it is a pure function
|
|
59
|
+
* so the awkward transitions (hover then click must pin, not toggle shut) are
|
|
60
|
+
* tested rather than argued about.
|
|
61
|
+
*/
|
|
62
|
+
export type CitationMode = 'closed' | 'peek' | 'pinned'
|
|
63
|
+
export type CitationEvent = 'enter' | 'leave' | 'focus' | 'blur' | 'press' | 'dismiss'
|
|
64
|
+
|
|
65
|
+
export function nextCitationMode(mode: CitationMode, event: CitationEvent): CitationMode {
|
|
66
|
+
switch (event) {
|
|
67
|
+
case 'press':
|
|
68
|
+
return mode === 'pinned' ? 'closed' : 'pinned'
|
|
69
|
+
case 'dismiss':
|
|
70
|
+
return 'closed'
|
|
71
|
+
case 'enter':
|
|
72
|
+
case 'focus':
|
|
73
|
+
return mode === 'closed' ? 'peek' : mode
|
|
74
|
+
case 'leave':
|
|
75
|
+
case 'blur':
|
|
76
|
+
return mode === 'peek' ? 'closed' : mode
|
|
77
|
+
}
|
|
78
|
+
}
|