@drscrewdriver/dsh-better-display 0.3.3-fork.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +259 -0
- package/DESIGN.md +72 -0
- package/LICENSE +24 -0
- package/README.en.md +55 -0
- package/README.md +55 -0
- package/THIRD_PARTY_NOTICES.md +65 -0
- package/compat/harness-rc2.json +99 -0
- package/cordis.patch.yml +5 -0
- package/cordis.yml +4 -0
- package/docs/official-rendering-bridge.md +65 -0
- package/dshx.yml +5 -0
- package/lib/client.js +49292 -0
- package/lib/client.js.map +1 -0
- package/lib/dsh-better-display.js +101 -0
- package/lib/types/client/Blocks.d.ts +49 -0
- package/lib/types/client/Blocks.d.ts.map +1 -0
- package/lib/types/client/Blocks.js +143 -0
- package/lib/types/client/Blocks.js.map +1 -0
- package/lib/types/client/ChoreographedFlow.d.ts +22 -0
- package/lib/types/client/ChoreographedFlow.d.ts.map +1 -0
- package/lib/types/client/ChoreographedFlow.js +218 -0
- package/lib/types/client/ChoreographedFlow.js.map +1 -0
- package/lib/types/client/ClosedProcessSummary.d.ts +9 -0
- package/lib/types/client/ClosedProcessSummary.d.ts.map +1 -0
- package/lib/types/client/ClosedProcessSummary.js +16 -0
- package/lib/types/client/ClosedProcessSummary.js.map +1 -0
- package/lib/types/client/DiffPanel.d.ts +13 -0
- package/lib/types/client/DiffPanel.d.ts.map +1 -0
- package/lib/types/client/DiffPanel.js +115 -0
- package/lib/types/client/DiffPanel.js.map +1 -0
- package/lib/types/client/LiveFold.d.ts +10 -0
- package/lib/types/client/LiveFold.d.ts.map +1 -0
- package/lib/types/client/LiveFold.js +39 -0
- package/lib/types/client/LiveFold.js.map +1 -0
- package/lib/types/client/McpAppFrame.d.ts +32 -0
- package/lib/types/client/McpAppFrame.d.ts.map +1 -0
- package/lib/types/client/McpAppFrame.js +193 -0
- package/lib/types/client/McpAppFrame.js.map +1 -0
- package/lib/types/client/OfficialContent.d.ts +25 -0
- package/lib/types/client/OfficialContent.d.ts.map +1 -0
- package/lib/types/client/OfficialContent.js +53 -0
- package/lib/types/client/OfficialContent.js.map +1 -0
- package/lib/types/client/Reader.d.ts +3 -0
- package/lib/types/client/Reader.d.ts.map +1 -0
- package/lib/types/client/Reader.js +603 -0
- package/lib/types/client/Reader.js.map +1 -0
- package/lib/types/client/ReasoningCard.d.ts +11 -0
- package/lib/types/client/ReasoningCard.d.ts.map +1 -0
- package/lib/types/client/ReasoningCard.js +322 -0
- package/lib/types/client/ReasoningCard.js.map +1 -0
- package/lib/types/client/SettingsSection.d.ts +37 -0
- package/lib/types/client/SettingsSection.d.ts.map +1 -0
- package/lib/types/client/SettingsSection.js +63 -0
- package/lib/types/client/SettingsSection.js.map +1 -0
- package/lib/types/client/StickyLane.d.ts +8 -0
- package/lib/types/client/StickyLane.d.ts.map +1 -0
- package/lib/types/client/StickyLane.js +39 -0
- package/lib/types/client/StickyLane.js.map +1 -0
- package/lib/types/client/TimelineRail.d.ts +10 -0
- package/lib/types/client/TimelineRail.d.ts.map +1 -0
- package/lib/types/client/TimelineRail.js +168 -0
- package/lib/types/client/TimelineRail.js.map +1 -0
- package/lib/types/client/ToolActivity.d.ts +17 -0
- package/lib/types/client/ToolActivity.d.ts.map +1 -0
- package/lib/types/client/ToolActivity.js +244 -0
- package/lib/types/client/ToolActivity.js.map +1 -0
- package/lib/types/client/TurnMetrics.d.ts +11 -0
- package/lib/types/client/TurnMetrics.d.ts.map +1 -0
- package/lib/types/client/TurnMetrics.js +44 -0
- package/lib/types/client/TurnMetrics.js.map +1 -0
- package/lib/types/client/WaitClock.d.ts +16 -0
- package/lib/types/client/WaitClock.d.ts.map +1 -0
- package/lib/types/client/WaitClock.js +29 -0
- package/lib/types/client/WaitClock.js.map +1 -0
- package/lib/types/client/WaitingClock.d.ts +15 -0
- package/lib/types/client/WaitingClock.d.ts.map +1 -0
- package/lib/types/client/WaitingClock.js +30 -0
- package/lib/types/client/WaitingClock.js.map +1 -0
- package/lib/types/client/WaitingStatus.d.ts +6 -0
- package/lib/types/client/WaitingStatus.d.ts.map +1 -0
- package/lib/types/client/WaitingStatus.js +9 -0
- package/lib/types/client/WaitingStatus.js.map +1 -0
- package/lib/types/client/conversation-scroll.d.ts +19 -0
- package/lib/types/client/conversation-scroll.d.ts.map +1 -0
- package/lib/types/client/conversation-scroll.js +25 -0
- package/lib/types/client/conversation-scroll.js.map +1 -0
- package/lib/types/client/deliverables.d.ts +24 -0
- package/lib/types/client/deliverables.d.ts.map +1 -0
- package/lib/types/client/deliverables.js +104 -0
- package/lib/types/client/deliverables.js.map +1 -0
- package/lib/types/client/entry-policy.d.ts +10 -0
- package/lib/types/client/entry-policy.d.ts.map +1 -0
- package/lib/types/client/entry-policy.js +24 -0
- package/lib/types/client/entry-policy.js.map +1 -0
- package/lib/types/client/entry.d.ts +4 -0
- package/lib/types/client/entry.d.ts.map +1 -0
- package/lib/types/client/entry.js +34 -0
- package/lib/types/client/entry.js.map +1 -0
- package/lib/types/client/fold-choreography.d.ts +40 -0
- package/lib/types/client/fold-choreography.d.ts.map +1 -0
- package/lib/types/client/fold-choreography.js +48 -0
- package/lib/types/client/fold-choreography.js.map +1 -0
- package/lib/types/client/fold-intensity.d.ts +11 -0
- package/lib/types/client/fold-intensity.d.ts.map +1 -0
- package/lib/types/client/fold-intensity.js +32 -0
- package/lib/types/client/fold-intensity.js.map +1 -0
- package/lib/types/client/index.d.ts +7 -0
- package/lib/types/client/index.d.ts.map +1 -0
- package/lib/types/client/index.js +195 -0
- package/lib/types/client/index.js.map +1 -0
- package/lib/types/client/live-turn.d.ts +58 -0
- package/lib/types/client/live-turn.d.ts.map +1 -0
- package/lib/types/client/live-turn.js +190 -0
- package/lib/types/client/live-turn.js.map +1 -0
- package/lib/types/client/markdown/MarkdownText.d.ts +41 -0
- package/lib/types/client/markdown/MarkdownText.d.ts.map +1 -0
- package/lib/types/client/markdown/MarkdownText.js +178 -0
- package/lib/types/client/markdown/MarkdownText.js.map +1 -0
- package/lib/types/client/markdown/cjkFriendlyStrong.d.ts +9 -0
- package/lib/types/client/markdown/cjkFriendlyStrong.d.ts.map +1 -0
- package/lib/types/client/markdown/cjkFriendlyStrong.js +73 -0
- package/lib/types/client/markdown/cjkFriendlyStrong.js.map +1 -0
- package/lib/types/client/markdown/incremental.d.ts +69 -0
- package/lib/types/client/markdown/incremental.d.ts.map +1 -0
- package/lib/types/client/markdown/incremental.js +108 -0
- package/lib/types/client/markdown/incremental.js.map +1 -0
- package/lib/types/client/markdown/katex.d.ts +27 -0
- package/lib/types/client/markdown/katex.d.ts.map +1 -0
- package/lib/types/client/markdown/katex.js +88 -0
- package/lib/types/client/markdown/katex.js.map +1 -0
- package/lib/types/client/markdown/mathCompatibility.d.ts +11 -0
- package/lib/types/client/markdown/mathCompatibility.d.ts.map +1 -0
- package/lib/types/client/markdown/mathCompatibility.js +293 -0
- package/lib/types/client/markdown/mathCompatibility.js.map +1 -0
- package/lib/types/client/markdown/parse.d.ts +25 -0
- package/lib/types/client/markdown/parse.d.ts.map +1 -0
- package/lib/types/client/markdown/parse.js +42 -0
- package/lib/types/client/markdown/parse.js.map +1 -0
- package/lib/types/client/markdown/render.d.ts +121 -0
- package/lib/types/client/markdown/render.d.ts.map +1 -0
- package/lib/types/client/markdown/render.js +452 -0
- package/lib/types/client/markdown/render.js.map +1 -0
- package/lib/types/client/mcp-app.d.ts +50 -0
- package/lib/types/client/mcp-app.d.ts.map +1 -0
- package/lib/types/client/mcp-app.js +328 -0
- package/lib/types/client/mcp-app.js.map +1 -0
- package/lib/types/client/message-chrome.d.ts +19 -0
- package/lib/types/client/message-chrome.d.ts.map +1 -0
- package/lib/types/client/message-chrome.js +42 -0
- package/lib/types/client/message-chrome.js.map +1 -0
- package/lib/types/client/motion.d.ts +38 -0
- package/lib/types/client/motion.d.ts.map +1 -0
- package/lib/types/client/motion.js +453 -0
- package/lib/types/client/motion.js.map +1 -0
- package/lib/types/client/native/ContextBody.d.ts +130 -0
- package/lib/types/client/native/ContextBody.d.ts.map +1 -0
- package/lib/types/client/native/ContextBody.js +398 -0
- package/lib/types/client/native/ContextBody.js.map +1 -0
- package/lib/types/client/native/ContextInjectionRow.d.ts +35 -0
- package/lib/types/client/native/ContextInjectionRow.d.ts.map +1 -0
- package/lib/types/client/native/ContextInjectionRow.js +42 -0
- package/lib/types/client/native/ContextInjectionRow.js.map +1 -0
- package/lib/types/client/native/ReferenceIcon.d.ts +16 -0
- package/lib/types/client/native/ReferenceIcon.d.ts.map +1 -0
- package/lib/types/client/native/ReferenceIcon.js +16 -0
- package/lib/types/client/native/ReferenceIcon.js.map +1 -0
- package/lib/types/client/native/tool-call-model.d.ts +58 -0
- package/lib/types/client/native/tool-call-model.d.ts.map +1 -0
- package/lib/types/client/native/tool-call-model.js +219 -0
- package/lib/types/client/native/tool-call-model.js.map +1 -0
- package/lib/types/client/native/tool-update.d.ts +23 -0
- package/lib/types/client/native/tool-update.d.ts.map +1 -0
- package/lib/types/client/native/tool-update.js +22 -0
- package/lib/types/client/native/tool-update.js.map +1 -0
- package/lib/types/client/official-slots.d.ts +71 -0
- package/lib/types/client/official-slots.d.ts.map +1 -0
- package/lib/types/client/official-slots.js +183 -0
- package/lib/types/client/official-slots.js.map +1 -0
- package/lib/types/client/open-file.d.ts +29 -0
- package/lib/types/client/open-file.d.ts.map +1 -0
- package/lib/types/client/open-file.js +71 -0
- package/lib/types/client/open-file.js.map +1 -0
- package/lib/types/client/pending-submission.d.ts +28 -0
- package/lib/types/client/pending-submission.d.ts.map +1 -0
- package/lib/types/client/pending-submission.js +28 -0
- package/lib/types/client/pending-submission.js.map +1 -0
- package/lib/types/client/platform-media.d.ts +6 -0
- package/lib/types/client/platform-media.d.ts.map +1 -0
- package/lib/types/client/platform-media.js +18 -0
- package/lib/types/client/platform-media.js.map +1 -0
- package/lib/types/client/primitive-labels.d.ts +10 -0
- package/lib/types/client/primitive-labels.d.ts.map +1 -0
- package/lib/types/client/primitive-labels.js +38 -0
- package/lib/types/client/primitive-labels.js.map +1 -0
- package/lib/types/client/projection.d.ts +41 -0
- package/lib/types/client/projection.d.ts.map +1 -0
- package/lib/types/client/projection.js +112 -0
- package/lib/types/client/projection.js.map +1 -0
- package/lib/types/client/reasoning-follow.d.ts +10 -0
- package/lib/types/client/reasoning-follow.d.ts.map +1 -0
- package/lib/types/client/reasoning-follow.js +21 -0
- package/lib/types/client/reasoning-follow.js.map +1 -0
- package/lib/types/client/resource-address.d.ts +3 -0
- package/lib/types/client/resource-address.d.ts.map +1 -0
- package/lib/types/client/resource-address.js +33 -0
- package/lib/types/client/resource-address.js.map +1 -0
- package/lib/types/client/settings-copy.d.ts +7 -0
- package/lib/types/client/settings-copy.d.ts.map +1 -0
- package/lib/types/client/settings-copy.js +53 -0
- package/lib/types/client/settings-copy.js.map +1 -0
- package/lib/types/client/settings-slots.d.ts +23 -0
- package/lib/types/client/settings-slots.d.ts.map +1 -0
- package/lib/types/client/settings-slots.js +2 -0
- package/lib/types/client/settings-slots.js.map +1 -0
- package/lib/types/client/settings.d.ts +4 -0
- package/lib/types/client/settings.d.ts.map +1 -0
- package/lib/types/client/settings.js +60 -0
- package/lib/types/client/settings.js.map +1 -0
- package/lib/types/client/skill-status.d.ts +25 -0
- package/lib/types/client/skill-status.d.ts.map +1 -0
- package/lib/types/client/skill-status.js +44 -0
- package/lib/types/client/skill-status.js.map +1 -0
- package/lib/types/client/store.d.ts +35 -0
- package/lib/types/client/store.d.ts.map +1 -0
- package/lib/types/client/store.js +37 -0
- package/lib/types/client/store.js.map +1 -0
- package/lib/types/client/stream-buffer.d.ts +37 -0
- package/lib/types/client/stream-buffer.d.ts.map +1 -0
- package/lib/types/client/stream-buffer.js +150 -0
- package/lib/types/client/stream-buffer.js.map +1 -0
- package/lib/types/client/streaming.d.ts +18 -0
- package/lib/types/client/streaming.d.ts.map +1 -0
- package/lib/types/client/streaming.js +84 -0
- package/lib/types/client/streaming.js.map +1 -0
- package/lib/types/client/timeline.d.ts +26 -0
- package/lib/types/client/timeline.d.ts.map +1 -0
- package/lib/types/client/timeline.js +48 -0
- package/lib/types/client/timeline.js.map +1 -0
- package/lib/types/client/tool-activity.d.ts +98 -0
- package/lib/types/client/tool-activity.d.ts.map +1 -0
- package/lib/types/client/tool-activity.js +301 -0
- package/lib/types/client/tool-activity.js.map +1 -0
- package/lib/types/client/types.d.ts +91 -0
- package/lib/types/client/types.d.ts.map +1 -0
- package/lib/types/client/types.js +2 -0
- package/lib/types/client/types.js.map +1 -0
- package/lib/types/client/waiting-clock.d.ts +49 -0
- package/lib/types/client/waiting-clock.d.ts.map +1 -0
- package/lib/types/client/waiting-clock.js +80 -0
- package/lib/types/client/waiting-clock.js.map +1 -0
- package/lib/types/client/word-motion.d.ts +16 -0
- package/lib/types/client/word-motion.d.ts.map +1 -0
- package/lib/types/client/word-motion.js +90 -0
- package/lib/types/client/word-motion.js.map +1 -0
- package/lib/types/client/word-timeline.d.ts +32 -0
- package/lib/types/client/word-timeline.d.ts.map +1 -0
- package/lib/types/client/word-timeline.js +119 -0
- package/lib/types/client/word-timeline.js.map +1 -0
- package/lib/types/dsh-better-display.d.ts +17 -0
- package/lib/types/dsh-better-display.d.ts.map +1 -0
- package/lib/types/dsh-better-display.js +93 -0
- package/lib/types/dsh-better-display.js.map +1 -0
- package/lib/types/skill-roots.d.ts +22 -0
- package/lib/types/skill-roots.d.ts.map +1 -0
- package/lib/types/skill-roots.js +126 -0
- package/lib/types/skill-roots.js.map +1 -0
- package/lib/types/skill-status.d.ts +36 -0
- package/lib/types/skill-status.d.ts.map +1 -0
- package/lib/types/skill-status.js +51 -0
- package/lib/types/skill-status.js.map +1 -0
- package/package.json +133 -0
- package/scripts/build-motion-fixture.mjs +26 -0
- package/scripts/check-harness-compat.mjs +71 -0
- package/scripts/link-harness-dependencies.mjs +54 -0
- package/scripts/verify-auto-fold.mjs +114 -0
- package/scripts/verify-official-bridge.mjs +121 -0
- package/scripts/verify-tool-shimmer.mjs +62 -0
- package/skills/generative-mcpapps/SKILL.md +47 -0
- package/skills/generative-mcpapps/examples/interactive_quiz.html +153 -0
- package/skills/generative-mcpapps/references/html_boilerplate.md +122 -0
- package/skills/generative-mcpapps/references/sep1865_protocol.md +54 -0
- package/src/client/Blocks.tsx +213 -0
- package/src/client/ChoreographedFlow.tsx +232 -0
- package/src/client/ClosedProcessSummary.tsx +23 -0
- package/src/client/DiffPanel.tsx +124 -0
- package/src/client/LiveFold.tsx +43 -0
- package/src/client/McpAppFrame.module.css +210 -0
- package/src/client/McpAppFrame.tsx +317 -0
- package/src/client/OfficialContent.tsx +69 -0
- package/src/client/Reader.module.css +692 -0
- package/src/client/Reader.tsx +878 -0
- package/src/client/ReasoningCard.tsx +306 -0
- package/src/client/SettingsSection.module.css +184 -0
- package/src/client/SettingsSection.tsx +194 -0
- package/src/client/StickyLane.tsx +34 -0
- package/src/client/TimelineRail.module.css +170 -0
- package/src/client/TimelineRail.tsx +262 -0
- package/src/client/ToolActivity.tsx +274 -0
- package/src/client/TurnMetrics.module.css +139 -0
- package/src/client/TurnMetrics.tsx +160 -0
- package/src/client/WaitClock.tsx +33 -0
- package/src/client/WaitingStatus.tsx +13 -0
- package/src/client/conversation-scroll.ts +28 -0
- package/src/client/deliverables.ts +122 -0
- package/src/client/entry-policy.ts +20 -0
- package/src/client/entry.tsx +40 -0
- package/src/client/fold-choreography.ts +55 -0
- package/src/client/fold-intensity.ts +36 -0
- package/src/client/index.tsx +222 -0
- package/src/client/live-turn.ts +198 -0
- package/src/client/markdown/MarkdownText.module.css +304 -0
- package/src/client/markdown/MarkdownText.tsx +195 -0
- package/src/client/markdown/cjkFriendlyStrong.ts +84 -0
- package/src/client/markdown/incremental.ts +131 -0
- package/src/client/markdown/katex.tsx +91 -0
- package/src/client/markdown/mathCompatibility.ts +350 -0
- package/src/client/markdown/parse.ts +45 -0
- package/src/client/markdown/render.tsx +647 -0
- package/src/client/markdown/upstream.json +14 -0
- package/src/client/mcp-app.ts +323 -0
- package/src/client/message-chrome.ts +47 -0
- package/src/client/motion.tsx +410 -0
- package/src/client/native/ContextBody.module.css +161 -0
- package/src/client/native/ContextBody.tsx +591 -0
- package/src/client/native/ContextInjectionRow.module.css +66 -0
- package/src/client/native/ContextInjectionRow.tsx +106 -0
- package/src/client/native/ReferenceIcon.tsx +35 -0
- package/src/client/native/tool-call-model.ts +248 -0
- package/src/client/native/tool-update.ts +32 -0
- package/src/client/native/upstream.json +41 -0
- package/src/client/official-slots.tsx +211 -0
- package/src/client/open-file.ts +94 -0
- package/src/client/pending-submission.ts +49 -0
- package/src/client/platform-media.ts +17 -0
- package/src/client/primitive-labels.ts +54 -0
- package/src/client/projection.ts +118 -0
- package/src/client/reasoning-follow.ts +28 -0
- package/src/client/settings-copy.ts +80 -0
- package/src/client/settings-slots.ts +20 -0
- package/src/client/settings.tsx +73 -0
- package/src/client/skill-status.ts +78 -0
- package/src/client/store.ts +75 -0
- package/src/client/stream-buffer.ts +136 -0
- package/src/client/streaming.tsx +70 -0
- package/src/client/style.d.ts +4 -0
- package/src/client/timeline.ts +77 -0
- package/src/client/tool-activity.ts +298 -0
- package/src/client/types.ts +89 -0
- package/src/client/waiting-clock.ts +83 -0
- package/src/client/word-motion.tsx +92 -0
- package/src/client/word-timeline.ts +113 -0
- package/src/dsh-better-display.ts +108 -0
- package/src/skill-roots.ts +138 -0
- package/src/skill-status.ts +81 -0
- package/tests/browser-auto-fold.tsx +64 -0
- package/tests/browser-closed-gap.tsx +20 -0
- package/tests/browser-motion.tsx +65 -0
- package/tests/browser-official-bridge.tsx +152 -0
- package/tests/browser-sticky-lanes.tsx +22 -0
- package/tests/browser-waiting-clock.tsx +14 -0
- package/tests/chat-flow-hook.test.ts +66 -0
- package/tests/cloud-gate.test.ts +34 -0
- package/tests/context-tool-update.test.ts +33 -0
- package/tests/conversation-scroll.test.ts +47 -0
- package/tests/deliverables.test.ts +128 -0
- package/tests/entry.test.ts +42 -0
- package/tests/fixtures/maid-composer-hide.html +31 -0
- package/tests/fold-choreography.test.ts +54 -0
- package/tests/fold-intensity.test.ts +94 -0
- package/tests/footer-precedence.test.ts +129 -0
- package/tests/history-word-regression.test.ts +16 -0
- package/tests/live-turn.test.ts +218 -0
- package/tests/mcp-apps.test.ts +157 -0
- package/tests/message-chrome.test.ts +29 -0
- package/tests/official-slots.test.ts +112 -0
- package/tests/open-file.test.ts +114 -0
- package/tests/pending-submission.test.ts +45 -0
- package/tests/platform-media.test.ts +23 -0
- package/tests/projection.test.ts +184 -0
- package/tests/reasoning-follow.test.ts +34 -0
- package/tests/settings-copy.test.ts +63 -0
- package/tests/skill-status.test.ts +137 -0
- package/tests/stock-install.test.ts +58 -0
- package/tests/stream-buffer.test.ts +102 -0
- package/tests/timeline.test.ts +59 -0
- package/tests/tool-diff.test.ts +57 -0
- package/tests/waiting-clock.test.ts +83 -0
- package/tests/word-timeline.test.ts +146 -0
- package/tsconfig.json +11 -0
- package/tsdown.config.ts +51 -0
|
@@ -0,0 +1,453 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useContext, useEffect, useLayoutEffect, useRef, useState } from 'react';
|
|
3
|
+
import css from './Reader.module.css';
|
|
4
|
+
import { StreamMotionContext } from './streaming.js';
|
|
5
|
+
const EASING = 'cubic-bezier(.22,1,.36,1)';
|
|
6
|
+
export function useMotionAllowed(enabled) {
|
|
7
|
+
const [reduced, setReduced] = useState(() => window.matchMedia('(prefers-reduced-motion: reduce)').matches);
|
|
8
|
+
useEffect(() => {
|
|
9
|
+
const query = window.matchMedia('(prefers-reduced-motion: reduce)');
|
|
10
|
+
const change = () => setReduced(query.matches);
|
|
11
|
+
query.addEventListener('change', change);
|
|
12
|
+
return () => query.removeEventListener('change', change);
|
|
13
|
+
}, []);
|
|
14
|
+
return enabled && !reduced;
|
|
15
|
+
}
|
|
16
|
+
export function usePinnedSelection(root, selector = '[data-reader-answer], [data-reader-process]') {
|
|
17
|
+
const [keys, setKeys] = useState([]);
|
|
18
|
+
useEffect(() => {
|
|
19
|
+
const update = () => {
|
|
20
|
+
const selection = document.getSelection();
|
|
21
|
+
const range = selection && !selection.isCollapsed && selection.rangeCount ? selection.getRangeAt(0) : null;
|
|
22
|
+
const next = range && root.current
|
|
23
|
+
? [...new Set(Array.from(root.current.querySelectorAll(selector))
|
|
24
|
+
.filter(element => range.intersectsNode(element))
|
|
25
|
+
.map(element => element.dataset.readerKey ?? element.dataset.readerProcessKey).filter(Boolean))]
|
|
26
|
+
: [];
|
|
27
|
+
setKeys(previous => previous.length === next.length && previous.every((key, index) => key === next[index]) ? previous : next);
|
|
28
|
+
};
|
|
29
|
+
document.addEventListener('selectionchange', update);
|
|
30
|
+
return () => document.removeEventListener('selectionchange', update);
|
|
31
|
+
}, [root, selector]);
|
|
32
|
+
return keys;
|
|
33
|
+
}
|
|
34
|
+
export function StatusText({ text, motion, shimmer = false }) {
|
|
35
|
+
const ref = useRef(null);
|
|
36
|
+
const [visible, setVisible] = useState(() => !document.hidden);
|
|
37
|
+
const [forcedColors, setForcedColors] = useState(() => window.matchMedia('(forced-colors: active)').matches);
|
|
38
|
+
const allowed = motion && visible && !forcedColors;
|
|
39
|
+
const [frame, setFrame] = useState({ text, id: 0, phase: 'idle', outgoing: null });
|
|
40
|
+
// Adjust before commit, so a new label cannot paint once before its entry state.
|
|
41
|
+
// Reuse the previous incoming key: a rapid change exits from its current pose.
|
|
42
|
+
if (frame.text !== text)
|
|
43
|
+
setFrame({
|
|
44
|
+
text, id: frame.id + 1, phase: allowed ? 'start' : 'idle',
|
|
45
|
+
outgoing: allowed ? { text: frame.text, id: frame.id } : null,
|
|
46
|
+
});
|
|
47
|
+
useEffect(() => {
|
|
48
|
+
const update = () => setVisible(!document.hidden);
|
|
49
|
+
const query = window.matchMedia('(forced-colors: active)');
|
|
50
|
+
const colors = () => setForcedColors(query.matches);
|
|
51
|
+
document.addEventListener('visibilitychange', update);
|
|
52
|
+
query.addEventListener('change', colors);
|
|
53
|
+
return () => { document.removeEventListener('visibilitychange', update); query.removeEventListener('change', colors); };
|
|
54
|
+
}, []);
|
|
55
|
+
useLayoutEffect(() => {
|
|
56
|
+
const id = frame.id;
|
|
57
|
+
const settle = () => setFrame(current => current.id === id && current.outgoing
|
|
58
|
+
? { ...current, phase: 'idle', outgoing: null } : current);
|
|
59
|
+
if (!allowed) {
|
|
60
|
+
settle();
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
if (!frame.outgoing || !ref.current)
|
|
64
|
+
return;
|
|
65
|
+
// Commit the supplied .is-enter-start pose before releasing CSS transitions.
|
|
66
|
+
ref.current.getBoundingClientRect();
|
|
67
|
+
let timer = 0;
|
|
68
|
+
const tick = requestAnimationFrame(() => {
|
|
69
|
+
setFrame(current => current.id === id ? { ...current, phase: 'running' } : current);
|
|
70
|
+
timer = window.setTimeout(settle, 200); // 150ms swap + 50ms incoming gap.
|
|
71
|
+
});
|
|
72
|
+
return () => { cancelAnimationFrame(tick); window.clearTimeout(timer); };
|
|
73
|
+
}, [frame.id, allowed]);
|
|
74
|
+
const active = shimmer && allowed;
|
|
75
|
+
const swapping = allowed && frame.outgoing !== null;
|
|
76
|
+
return _jsxs("span", { className: css.statusText, "data-reader-status": true, "data-reader-busy": shimmer, "data-ud-check": "reader-status", children: [_jsxs("span", { className: css.think, "aria-hidden": "true", "data-active": active, "data-reader-status-phase": swapping ? frame.phase : 'idle', "data-ud-motion": "reader-thinking-state", children: [_jsx("span", { className: css.thinkSizer, children: text }), swapping && _jsx("span", { className: `${css.thinkText} ${frame.phase === 'running' ? css.isExit : ''}`, "data-reader-status-copy": "outgoing", "data-text": frame.outgoing.text, children: frame.outgoing.text }, frame.outgoing.id), _jsx("span", { ref: ref, className: `${css.thinkText} ${swapping && frame.phase === 'start' ? css.isEnterStart : ''}`, "data-reader-status-copy": "current", "data-reader-shimmer": active || undefined, "data-text": text, children: text }, frame.id)] }), _jsx("span", { className: css.srOnly, role: "status", "aria-live": "polite", "aria-atomic": "true", children: text })] });
|
|
77
|
+
}
|
|
78
|
+
export function Disclosure({ open, onChange, label, controls, buttonRef, ariaLabel }) {
|
|
79
|
+
const name = ariaLabel ?? '思考与过程';
|
|
80
|
+
return _jsx("div", { className: css.disclosure, "data-reader-disclosure": true, "data-expanded": open, children: _jsxs("button", { ref: buttonRef, type: "button", className: css.disclosureButton, "aria-label": `${open ? '收起' : '展开'}${name}`, "aria-expanded": open, ...(controls ? { 'aria-controls': controls } : {}), onClick: () => onChange(!open), children: [label, _jsx("svg", { className: css.chevron, "data-open": open, viewBox: "0 0 16 16", width: "12", height: "12", "aria-hidden": "true", children: _jsx("path", { d: "m6 4 4 4-4 4" }) })] }) });
|
|
81
|
+
}
|
|
82
|
+
/** Supplemental details stay in source order beside their own narration. */
|
|
83
|
+
export function ProcessFragment({ open, motion, onRead, returnFocusTo, nodeKey, children, framed = false }) {
|
|
84
|
+
const body = useRef(null);
|
|
85
|
+
const running = useRef(null);
|
|
86
|
+
const previous = useRef(open);
|
|
87
|
+
const [present, setPresent] = useState(open);
|
|
88
|
+
useLayoutEffect(() => {
|
|
89
|
+
const element = body.current;
|
|
90
|
+
if (!element)
|
|
91
|
+
return;
|
|
92
|
+
const from = running.current ? element.getBoundingClientRect().height : previous.current ? element.scrollHeight : 0;
|
|
93
|
+
running.current?.cancel();
|
|
94
|
+
running.current = null;
|
|
95
|
+
const changed = previous.current !== open;
|
|
96
|
+
previous.current = open;
|
|
97
|
+
if (open)
|
|
98
|
+
setPresent(true);
|
|
99
|
+
if (!open && element.contains(document.activeElement))
|
|
100
|
+
returnFocusTo.current?.focus();
|
|
101
|
+
element.style.height = open ? 'auto' : '0px';
|
|
102
|
+
const target = open ? element.scrollHeight : 0;
|
|
103
|
+
if (!motion || !changed || Math.abs(from - target) < 1) {
|
|
104
|
+
setPresent(open);
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
const animation = element.animate(from > target
|
|
108
|
+
? [
|
|
109
|
+
{ offset: 0, height: `${from}px`, opacity: 1, transform: 'scaleY(1) translateY(0)' },
|
|
110
|
+
{ offset: 0.32, height: `${Math.round(from * 0.92)}px`, opacity: 0.35, transform: 'scaleY(0.96) translateY(-2px)' },
|
|
111
|
+
{ offset: 1, height: `${target}px`, opacity: 0, transform: 'scaleY(0.68) translateY(-8px)' },
|
|
112
|
+
]
|
|
113
|
+
: [
|
|
114
|
+
{ offset: 0, height: `${from}px`, opacity: 0, transform: 'scaleY(0.8) translateY(6px)' },
|
|
115
|
+
{ offset: 0.3, height: `${Math.round(target * 0.4)}px`, opacity: 0.4, transform: 'scaleY(0.92) translateY(3px)' },
|
|
116
|
+
{ offset: 1, height: `${target}px`, opacity: 1, transform: 'scaleY(1) translateY(0)' },
|
|
117
|
+
], { duration: 380, easing: 'cubic-bezier(0.16, 1, 0.3, 1)', fill: 'both' });
|
|
118
|
+
running.current = animation;
|
|
119
|
+
let settled = false;
|
|
120
|
+
const settle = () => {
|
|
121
|
+
if (settled)
|
|
122
|
+
return;
|
|
123
|
+
settled = true;
|
|
124
|
+
if (running.current === animation)
|
|
125
|
+
running.current = null;
|
|
126
|
+
animation.cancel();
|
|
127
|
+
setPresent(open);
|
|
128
|
+
};
|
|
129
|
+
animation.onfinish = settle;
|
|
130
|
+
// `fill: 'both'\` pins the opening keyframe (height 0, opacity 0), so while this
|
|
131
|
+
// animation runs the body is *invisible* no matter what the element's style says.
|
|
132
|
+
// An animation that never finishes — cancelled by a re-run, an unmount, or a
|
|
133
|
+
// compositor that drops it — would then leave the row looking like it refused to
|
|
134
|
+
// open, which is exactly the reported symptom. Cancel is only safe once the
|
|
135
|
+
// state change has been committed, so the deadline does both.
|
|
136
|
+
const deadline = window.setTimeout(settle, 380 + 240);
|
|
137
|
+
return () => {
|
|
138
|
+
window.clearTimeout(deadline);
|
|
139
|
+
running.current?.cancel();
|
|
140
|
+
};
|
|
141
|
+
}, [open, motion, returnFocusTo]);
|
|
142
|
+
if (!open && !present)
|
|
143
|
+
return null;
|
|
144
|
+
return _jsx("div", { ref: body, className: css.disclosureBody, "data-reader-process": true, "data-reader-process-key": nodeKey, "data-ud-motion": "reader-process-size", "aria-hidden": !open, onPointerDown: () => { if (open)
|
|
145
|
+
onRead(); }, onFocusCapture: () => { if (open)
|
|
146
|
+
onRead(); }, ...(!open ? { inert: '' } : {}), children: _jsx("div", { className: framed ? css.processFrame : css.processContents, children: children }) });
|
|
147
|
+
}
|
|
148
|
+
/** Retire only narration that was actually visible; historical rows stay folded. */
|
|
149
|
+
export function RetiringContent({ visible, children }) {
|
|
150
|
+
const { enabled } = useContext(StreamMotionContext);
|
|
151
|
+
const root = useRef(null);
|
|
152
|
+
const animation = useRef(null);
|
|
153
|
+
const [present, setPresent] = useState(visible);
|
|
154
|
+
const [focusHeld, setFocusHeld] = useState(false);
|
|
155
|
+
useLayoutEffect(() => {
|
|
156
|
+
const element = root.current;
|
|
157
|
+
if (visible) {
|
|
158
|
+
animation.current?.cancel();
|
|
159
|
+
animation.current = null;
|
|
160
|
+
setPresent(true);
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
if (!element)
|
|
164
|
+
return;
|
|
165
|
+
if (element.contains(document.activeElement)) {
|
|
166
|
+
setFocusHeld(true);
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
if (focusHeld)
|
|
170
|
+
return;
|
|
171
|
+
const from = element.getBoundingClientRect().height;
|
|
172
|
+
animation.current?.cancel();
|
|
173
|
+
animation.current = null;
|
|
174
|
+
if (!enabled || from < 1) {
|
|
175
|
+
setPresent(false);
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
const next = element.animate([{ height: `${from}px`, opacity: 1 }, { height: '0px', opacity: 0 }], { duration: 220, easing: EASING, fill: 'both' });
|
|
179
|
+
animation.current = next;
|
|
180
|
+
next.onfinish = () => { if (animation.current === next) {
|
|
181
|
+
animation.current = null;
|
|
182
|
+
next.cancel();
|
|
183
|
+
setPresent(false);
|
|
184
|
+
} };
|
|
185
|
+
}, [visible, enabled, focusHeld]);
|
|
186
|
+
useEffect(() => () => animation.current?.cancel(), []);
|
|
187
|
+
if (!visible && !present)
|
|
188
|
+
return null;
|
|
189
|
+
return _jsx("div", { ref: root, className: css.retiringContent, "data-reader-retiring": visible ? 'visible' : 'retiring', "data-ud-motion": "reader-progress-retire", onBlur: event => { if (!event.currentTarget.contains(event.relatedTarget))
|
|
190
|
+
setFocusHeld(false); }, children: children });
|
|
191
|
+
}
|
|
192
|
+
// DOM-only behavior: the native Session remains the sole source of business data.
|
|
193
|
+
export function useReadingScroll(root, motion) {
|
|
194
|
+
const port = useRef(null);
|
|
195
|
+
const following = useRef(true);
|
|
196
|
+
// Tracked separately from `following`: only an explicit reader action clears
|
|
197
|
+
// this, so a fold-induced scroll clamp cannot permanently drop the tail.
|
|
198
|
+
const pinned = useRef(true);
|
|
199
|
+
const anchor = useRef(null);
|
|
200
|
+
const cancelFollow = useRef(() => { });
|
|
201
|
+
const [detached, setDetached] = useState(false);
|
|
202
|
+
useLayoutEffect(() => {
|
|
203
|
+
const content = root.current;
|
|
204
|
+
if (!content)
|
|
205
|
+
return;
|
|
206
|
+
const scroll = content.closest('[data-conversation-scroll]') ?? content;
|
|
207
|
+
port.current = scroll;
|
|
208
|
+
// Browser scroll anchoring moves the viewport on its own as the transcript
|
|
209
|
+
// grows, which reads as the page freezing mid-follow.
|
|
210
|
+
const previousOverflowAnchor = scroll.style.overflowAnchor;
|
|
211
|
+
scroll.style.overflowAnchor = 'none';
|
|
212
|
+
let followFrame = 0;
|
|
213
|
+
let lastFrameAt = 0;
|
|
214
|
+
let layoutDepth = 0;
|
|
215
|
+
let lastWrittenTop = null;
|
|
216
|
+
const layoutStart = () => {
|
|
217
|
+
layoutDepth++;
|
|
218
|
+
cancelAnimationFrame(followFrame);
|
|
219
|
+
followFrame = 0;
|
|
220
|
+
capture();
|
|
221
|
+
};
|
|
222
|
+
const layoutEnd = () => {
|
|
223
|
+
layoutDepth = Math.max(0, layoutDepth - 1);
|
|
224
|
+
if (!layoutDepth && following.current && !followFrame) {
|
|
225
|
+
lastFrameAt = performance.now();
|
|
226
|
+
followFrame = requestAnimationFrame(follow);
|
|
227
|
+
}
|
|
228
|
+
};
|
|
229
|
+
cancelFollow.current = () => {
|
|
230
|
+
cancelAnimationFrame(followFrame);
|
|
231
|
+
followFrame = 0;
|
|
232
|
+
lastWrittenTop = null;
|
|
233
|
+
};
|
|
234
|
+
const selected = () => {
|
|
235
|
+
const selection = document.getSelection();
|
|
236
|
+
return selection && !selection.isCollapsed && selection.anchorNode && content.contains(selection.anchorNode);
|
|
237
|
+
};
|
|
238
|
+
// Only a focused text field suspends tail-follow. Clicking a fold control
|
|
239
|
+
// inside the reader also moves document.activeElement into `content`, and
|
|
240
|
+
// treating that as "user is busy" froze following for the rest of the turn.
|
|
241
|
+
const editingText = () => {
|
|
242
|
+
const active = document.activeElement;
|
|
243
|
+
if (!(active instanceof HTMLElement))
|
|
244
|
+
return false;
|
|
245
|
+
// The composer lives outside this subtree: focusing it must never stop
|
|
246
|
+
// the transcript from following.
|
|
247
|
+
if (!content.contains(active))
|
|
248
|
+
return false;
|
|
249
|
+
return active.isContentEditable || active.tagName === 'TEXTAREA' || active.tagName === 'INPUT';
|
|
250
|
+
};
|
|
251
|
+
const capture = () => {
|
|
252
|
+
const top = scroll.getBoundingClientRect().top;
|
|
253
|
+
const candidates = content.querySelectorAll('[data-reader-anchor]');
|
|
254
|
+
let candidate = null;
|
|
255
|
+
for (let index = 0; index < candidates.length; index++) {
|
|
256
|
+
const element = candidates[index];
|
|
257
|
+
if (element.getBoundingClientRect().bottom > top + 8) {
|
|
258
|
+
candidate = element;
|
|
259
|
+
break;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
// Record the anchor in DOCUMENT space, never viewport space. The viewport
|
|
263
|
+
// offset also changes whenever the reader scrolls, so comparing it back
|
|
264
|
+
// turned a plain scroll into an "anchor correction" that yanked the
|
|
265
|
+
// viewport back to wherever the anchor had last been captured.
|
|
266
|
+
anchor.current = candidate
|
|
267
|
+
? { element: candidate, docTop: candidate.getBoundingClientRect().top + scroll.scrollTop }
|
|
268
|
+
: null;
|
|
269
|
+
};
|
|
270
|
+
// Anchor capture is only consumed while detached; coalesce DOM scans to one per frame.
|
|
271
|
+
let captureFrame = 0;
|
|
272
|
+
const scheduleCapture = () => {
|
|
273
|
+
if (captureFrame)
|
|
274
|
+
return;
|
|
275
|
+
captureFrame = requestAnimationFrame(() => { captureFrame = 0; capture(); });
|
|
276
|
+
};
|
|
277
|
+
const atBottom = () => scroll.scrollHeight - scroll.scrollTop - scroll.clientHeight < 25;
|
|
278
|
+
// Intent to stay pinned to the bottom, tracked independently of the scroll
|
|
279
|
+
// position. A fold collapse shrinks the transcript and the browser clamps
|
|
280
|
+
// scrollTop, producing a scroll event indistinguishable from the reader
|
|
281
|
+
// scrolling up; without this the reader silently detached exactly when the
|
|
282
|
+
// turn's last content arrived, and the page stopped following.
|
|
283
|
+
pinned.current = true;
|
|
284
|
+
const onScroll = () => {
|
|
285
|
+
// While a follow animation is actively driving scroll, do not cancel following midway.
|
|
286
|
+
if (followFrame !== 0 || layoutDepth > 0)
|
|
287
|
+
return;
|
|
288
|
+
// Our easing frames must not be mistaken for a user leaving the bottom.
|
|
289
|
+
if (lastWrittenTop !== null && Math.abs(scroll.scrollTop - lastWrittenTop) < 1)
|
|
290
|
+
return;
|
|
291
|
+
// Bind the follow intent to the position observed HERE. Every scroll that
|
|
292
|
+
// reaches this point is the viewport moving under someone else's hand: a
|
|
293
|
+
// wheel, a drag, a key, or the browser clamping the offset after a shrink.
|
|
294
|
+
//
|
|
295
|
+
// The previous form inferred detaching from a strictly upward delta against
|
|
296
|
+
// lastWrittenTop, which left two holes. That baseline is nulled by
|
|
297
|
+
// cancelFollow/onWheel/onTouch/onKey, and the guard above already returned
|
|
298
|
+
// for any scroll whose delta is under 1px — so a reader parked mid-transcript
|
|
299
|
+
// by a scrollbar drag stayed following === true AND pinned === true. The next
|
|
300
|
+
// content growth then took the re-attach branch and yanked the viewport to
|
|
301
|
+
// the bottom, discarding what they were reading. Reading the position
|
|
302
|
+
// directly needs no baseline: a fold's clamp lands at the very bottom and
|
|
303
|
+
// still keeps following, while any other offset detaches.
|
|
304
|
+
const bottom = atBottom();
|
|
305
|
+
pinned.current = bottom;
|
|
306
|
+
if (!bottom) {
|
|
307
|
+
cancelAnimationFrame(followFrame);
|
|
308
|
+
followFrame = 0;
|
|
309
|
+
scheduleCapture();
|
|
310
|
+
}
|
|
311
|
+
if (!following.current) {
|
|
312
|
+
// Only an explicit return to the bottom resumes following.
|
|
313
|
+
if (bottom) {
|
|
314
|
+
following.current = true;
|
|
315
|
+
setDetached(false);
|
|
316
|
+
}
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
if (!bottom) {
|
|
320
|
+
following.current = false;
|
|
321
|
+
setDetached(true);
|
|
322
|
+
}
|
|
323
|
+
};
|
|
324
|
+
const onWheel = (event) => {
|
|
325
|
+
cancelAnimationFrame(followFrame);
|
|
326
|
+
followFrame = 0;
|
|
327
|
+
lastWrittenTop = null;
|
|
328
|
+
if (event.deltaY < 0) {
|
|
329
|
+
following.current = false;
|
|
330
|
+
setDetached(true);
|
|
331
|
+
pinned.current = false;
|
|
332
|
+
scheduleCapture();
|
|
333
|
+
}
|
|
334
|
+
};
|
|
335
|
+
const onTouch = () => {
|
|
336
|
+
cancelAnimationFrame(followFrame);
|
|
337
|
+
followFrame = 0;
|
|
338
|
+
lastWrittenTop = null;
|
|
339
|
+
};
|
|
340
|
+
const onKey = (event) => {
|
|
341
|
+
if (event.target instanceof HTMLElement && event.target.closest('textarea,input,[contenteditable=true]'))
|
|
342
|
+
return;
|
|
343
|
+
if (['PageUp', 'Home', 'ArrowUp'].includes(event.key)) {
|
|
344
|
+
cancelAnimationFrame(followFrame);
|
|
345
|
+
followFrame = 0;
|
|
346
|
+
lastWrittenTop = null;
|
|
347
|
+
following.current = false;
|
|
348
|
+
setDetached(true);
|
|
349
|
+
pinned.current = false;
|
|
350
|
+
scheduleCapture();
|
|
351
|
+
}
|
|
352
|
+
};
|
|
353
|
+
const writeTop = (top) => { scroll.scrollTop = top; lastWrittenTop = scroll.scrollTop; };
|
|
354
|
+
const follow = (now) => {
|
|
355
|
+
followFrame = 0;
|
|
356
|
+
if (!following.current || selected() || editingText())
|
|
357
|
+
return;
|
|
358
|
+
if (layoutDepth > 0)
|
|
359
|
+
return;
|
|
360
|
+
const gap = scroll.scrollHeight - scroll.clientHeight - scroll.scrollTop;
|
|
361
|
+
const delta = Math.min(48, Math.max(1, now - lastFrameAt));
|
|
362
|
+
lastFrameAt = now;
|
|
363
|
+
if (!motion || Math.abs(gap) < 1.5) {
|
|
364
|
+
writeTop(scroll.scrollHeight);
|
|
365
|
+
capture();
|
|
366
|
+
return;
|
|
367
|
+
}
|
|
368
|
+
writeTop(scroll.scrollTop + gap * (1 - Math.exp(-delta / 52)));
|
|
369
|
+
followFrame = requestAnimationFrame(follow);
|
|
370
|
+
};
|
|
371
|
+
const firstFrame = requestAnimationFrame(() => {
|
|
372
|
+
if (following.current && !selected())
|
|
373
|
+
writeTop(scroll.scrollHeight);
|
|
374
|
+
capture();
|
|
375
|
+
});
|
|
376
|
+
let lastHeight = content.scrollHeight;
|
|
377
|
+
const observer = new ResizeObserver(() => {
|
|
378
|
+
if (selected())
|
|
379
|
+
return;
|
|
380
|
+
const height = scroll.scrollHeight;
|
|
381
|
+
const grew = height > lastHeight + 1;
|
|
382
|
+
lastHeight = height;
|
|
383
|
+
// Growth while the reader intends to be at the bottom re-attaches the
|
|
384
|
+
// tail. This is the self-healing path for the clamp case above and is
|
|
385
|
+
// also what keeps the viewport moving when a turn ends.
|
|
386
|
+
if (grew && pinned.current && !editingText()) {
|
|
387
|
+
following.current = true;
|
|
388
|
+
setDetached(false);
|
|
389
|
+
}
|
|
390
|
+
if (following.current && !editingText()) {
|
|
391
|
+
// Height is already animated: no second, lagging scroll easing.
|
|
392
|
+
if (!motion || layoutDepth > 0)
|
|
393
|
+
writeTop(scroll.scrollHeight);
|
|
394
|
+
else if (!followFrame) {
|
|
395
|
+
lastFrameAt = performance.now();
|
|
396
|
+
followFrame = requestAnimationFrame(follow);
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
else if (!following.current && anchor.current?.element.isConnected) {
|
|
400
|
+
// Only a real layout change above the anchor needs compensation. A reader
|
|
401
|
+
// scroll moves the viewport offset but not the document offset, so this
|
|
402
|
+
// stays silent while the reader is scrolling and cannot snap back.
|
|
403
|
+
const delta = anchor.current.element.getBoundingClientRect().top + scroll.scrollTop - anchor.current.docTop;
|
|
404
|
+
if (Math.abs(delta) > .5)
|
|
405
|
+
writeTop(scroll.scrollTop + delta);
|
|
406
|
+
}
|
|
407
|
+
capture();
|
|
408
|
+
});
|
|
409
|
+
observer.observe(content);
|
|
410
|
+
if (scroll !== content)
|
|
411
|
+
observer.observe(scroll);
|
|
412
|
+
content.addEventListener('reader-layout-start', layoutStart);
|
|
413
|
+
content.addEventListener('reader-layout-end', layoutEnd);
|
|
414
|
+
scroll.addEventListener('scroll', onScroll, { passive: true });
|
|
415
|
+
scroll.addEventListener('wheel', onWheel, { passive: true });
|
|
416
|
+
scroll.addEventListener('touchstart', onTouch, { passive: true });
|
|
417
|
+
scroll.addEventListener('touchmove', onTouch, { passive: true });
|
|
418
|
+
scroll.addEventListener('keydown', onKey);
|
|
419
|
+
return () => {
|
|
420
|
+
cancelAnimationFrame(firstFrame);
|
|
421
|
+
cancelAnimationFrame(followFrame);
|
|
422
|
+
cancelAnimationFrame(captureFrame);
|
|
423
|
+
observer.disconnect();
|
|
424
|
+
content.removeEventListener('reader-layout-start', layoutStart);
|
|
425
|
+
content.removeEventListener('reader-layout-end', layoutEnd);
|
|
426
|
+
scroll.style.overflowAnchor = previousOverflowAnchor;
|
|
427
|
+
scroll.removeEventListener('scroll', onScroll);
|
|
428
|
+
scroll.removeEventListener('wheel', onWheel);
|
|
429
|
+
scroll.removeEventListener('touchstart', onTouch);
|
|
430
|
+
scroll.removeEventListener('touchmove', onTouch);
|
|
431
|
+
scroll.removeEventListener('keydown', onKey);
|
|
432
|
+
};
|
|
433
|
+
}, [root, motion]);
|
|
434
|
+
const jump = useCallback(() => {
|
|
435
|
+
cancelFollow.current();
|
|
436
|
+
anchor.current = null;
|
|
437
|
+
following.current = true;
|
|
438
|
+
pinned.current = true;
|
|
439
|
+
setDetached(false);
|
|
440
|
+
if (port.current) {
|
|
441
|
+
port.current.scrollTop = port.current.scrollHeight;
|
|
442
|
+
}
|
|
443
|
+
}, []);
|
|
444
|
+
const release = useCallback(() => {
|
|
445
|
+
cancelFollow.current();
|
|
446
|
+
following.current = false;
|
|
447
|
+
pinned.current = false;
|
|
448
|
+
anchor.current = null;
|
|
449
|
+
setDetached(true);
|
|
450
|
+
}, []);
|
|
451
|
+
return { detached, jump, release };
|
|
452
|
+
}
|
|
453
|
+
//# sourceMappingURL=motion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"motion.js","sourceRoot":"","sources":["../../../src/client/motion.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
import type { ContextMessageNode, KnownContextForm } from '@deepseek-ai/dsh-client-ui-conversation/client';
|
|
3
|
+
import type { TranslateNS } from '@deepseek-ai/dsh-client-ui-slots';
|
|
4
|
+
type Translate = TranslateNS<'chat'>;
|
|
5
|
+
/**
|
|
6
|
+
* Default presentation: the model-facing text as text, with its real line
|
|
7
|
+
* breaks, and the remaining source fields beneath it. This is what every form
|
|
8
|
+
* this UI version does not recognize renders as.
|
|
9
|
+
* @param props - Durable content, its source, and the locale seat.
|
|
10
|
+
* @returns The opaque context body.
|
|
11
|
+
*/
|
|
12
|
+
export declare function OpaqueBody({ content, source, t }: {
|
|
13
|
+
content: ContextMessageNode['content'];
|
|
14
|
+
source: unknown;
|
|
15
|
+
t: Translate;
|
|
16
|
+
}): ReactNode;
|
|
17
|
+
/**
|
|
18
|
+
* `instructions` form: the files this context reconciled, then their text.
|
|
19
|
+
*
|
|
20
|
+
* The text keeps its `<system-reminder>` framing verbatim — the framing is part
|
|
21
|
+
* of what the model read, so hiding it would misreport the request.
|
|
22
|
+
* @param props - Durable content, its source, and the locale seat.
|
|
23
|
+
* @returns The instructions context body, or the opaque body when the change
|
|
24
|
+
* list is unreadable.
|
|
25
|
+
*/
|
|
26
|
+
export declare function InstructionsBody({ content, source, t }: {
|
|
27
|
+
content: ContextMessageNode['content'];
|
|
28
|
+
source: unknown;
|
|
29
|
+
t: Translate;
|
|
30
|
+
}): ReactNode;
|
|
31
|
+
/**
|
|
32
|
+
* `catalog` form: the published entries as a list, read from the source rather
|
|
33
|
+
* than re-parsed out of the model-facing prose.
|
|
34
|
+
*
|
|
35
|
+
* A catalog whose source carries no usable entries falls through to the opaque
|
|
36
|
+
* body, so an older or hand-edited log still shows its text.
|
|
37
|
+
* @param props - Durable content, its source, and the locale seat.
|
|
38
|
+
* @returns The catalog context body, or the opaque body when the entry list is
|
|
39
|
+
* unreadable.
|
|
40
|
+
*/
|
|
41
|
+
export declare function CatalogBody({ content, source, t }: {
|
|
42
|
+
content: ContextMessageNode['content'];
|
|
43
|
+
source: unknown;
|
|
44
|
+
t: Translate;
|
|
45
|
+
}): ReactNode;
|
|
46
|
+
/**
|
|
47
|
+
* `snapshot` form: the named contributions this snapshot assembled, in order.
|
|
48
|
+
*
|
|
49
|
+
* The sections are the same bytes the model read, split at the boundaries the
|
|
50
|
+
* producer assembled them on, so a reader sees which subsystem contributed
|
|
51
|
+
* which state instead of one undifferentiated wall.
|
|
52
|
+
*
|
|
53
|
+
* One sentence of the model-facing text is NOT in any section: the producer's
|
|
54
|
+
* framing line declaring that this snapshot supersedes earlier ones. Unlike the
|
|
55
|
+
* `<system-reminder>` wrapper an instruction context carries — which wraps
|
|
56
|
+
* content and cannot be separated from it — that line states the form's own
|
|
57
|
+
* semantics, so the body states them as a caption instead of reprinting the
|
|
58
|
+
* joined prose beside the sections it was split from.
|
|
59
|
+
* @param props - Durable content, its source, and the locale seat.
|
|
60
|
+
* @returns The snapshot context body, or the opaque body when unreadable.
|
|
61
|
+
*/
|
|
62
|
+
export declare function SnapshotBody({ content, source, t }: {
|
|
63
|
+
content: ContextMessageNode['content'];
|
|
64
|
+
source: unknown;
|
|
65
|
+
t: Translate;
|
|
66
|
+
}): ReactNode;
|
|
67
|
+
/**
|
|
68
|
+
* `notice` form: what just happened, with the model-facing text beneath it.
|
|
69
|
+
*
|
|
70
|
+
* The one-line account also rides the collapsed row ({@link contextBody}), so a
|
|
71
|
+
* notice is usually readable without expanding at all.
|
|
72
|
+
* @param props - Durable content, its source, and the locale seat.
|
|
73
|
+
* @returns The notice context body.
|
|
74
|
+
*/
|
|
75
|
+
export declare function NoticeBody({ content, t }: {
|
|
76
|
+
content: ContextMessageNode['content'];
|
|
77
|
+
source: unknown;
|
|
78
|
+
t: Translate;
|
|
79
|
+
}): ReactNode;
|
|
80
|
+
/**
|
|
81
|
+
* `relay` form: which agent sent this, then what it said.
|
|
82
|
+
*
|
|
83
|
+
* The sender is an opaque session id; it is shown as a field rather than a
|
|
84
|
+
* label, because this client cannot resolve it to a title.
|
|
85
|
+
* @param props - Durable content, its source, and the locale seat.
|
|
86
|
+
* @returns The relay context body.
|
|
87
|
+
*/
|
|
88
|
+
export declare function RelayBody({ content, source, t }: {
|
|
89
|
+
content: ContextMessageNode['content'];
|
|
90
|
+
source: unknown;
|
|
91
|
+
t: Translate;
|
|
92
|
+
}): ReactNode;
|
|
93
|
+
/**
|
|
94
|
+
* `recall` form: which sessions this material came from and how much of each
|
|
95
|
+
* survived the read, then the material itself.
|
|
96
|
+
*
|
|
97
|
+
* Completeness is the fact a reader needs first: recalled context is bounded on
|
|
98
|
+
* the way in, so a card that hid the omitted count would overstate what the
|
|
99
|
+
* model received.
|
|
100
|
+
* @param props - Durable content, its source, and the locale seat.
|
|
101
|
+
* @returns The recall context body, or the opaque body when unreadable.
|
|
102
|
+
*/
|
|
103
|
+
export declare function RecallBody({ content, source, t }: {
|
|
104
|
+
content: ContextMessageNode['content'];
|
|
105
|
+
source: unknown;
|
|
106
|
+
t: Translate;
|
|
107
|
+
}): ReactNode;
|
|
108
|
+
/**
|
|
109
|
+
* Choose the body for one context node.
|
|
110
|
+
*
|
|
111
|
+
* Returns the form the body actually rendered as, which is not always the
|
|
112
|
+
* declared one: a declared form whose fields are unreadable falls back to
|
|
113
|
+
* opaque, and the caller labels the row with what it really shows.
|
|
114
|
+
* `summary` is the collapsed row's one-line account, which only a `notice`
|
|
115
|
+
* records: its whole point is being readable without expanding.
|
|
116
|
+
* @param form - the producer-declared form projected onto the node.
|
|
117
|
+
* @param props - durable content, its source, and the locale seat.
|
|
118
|
+
* @returns the rendered form (null for opaque), its collapsed summary, and its body.
|
|
119
|
+
*/
|
|
120
|
+
export declare function contextBody(form: ContextMessageNode['form'], props: {
|
|
121
|
+
content: ContextMessageNode['content'];
|
|
122
|
+
source: unknown;
|
|
123
|
+
t: Translate;
|
|
124
|
+
}): {
|
|
125
|
+
rendered: KnownContextForm | null;
|
|
126
|
+
summary: string | null;
|
|
127
|
+
body: ReactNode;
|
|
128
|
+
};
|
|
129
|
+
export {};
|
|
130
|
+
//# sourceMappingURL=ContextBody.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContextBody.d.ts","sourceRoot":"","sources":["../../../../src/client/native/ContextBody.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,gDAAgD,CAAA;AAE1G,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAA;AASnE,KAAK,SAAS,GAAG,WAAW,CAAC,MAAM,CAAC,CAAA;AA6IpC;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE;IACjD,OAAO,EAAE,kBAAkB,CAAC,SAAS,CAAC,CAAA;IACtC,MAAM,EAAE,OAAO,CAAA;IACf,CAAC,EAAE,SAAS,CAAA;CACb,GAAG,SAAS,CAOZ;AA2DD;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE;IACvD,OAAO,EAAE,kBAAkB,CAAC,SAAS,CAAC,CAAA;IACtC,MAAM,EAAE,OAAO,CAAA;IACf,CAAC,EAAE,SAAS,CAAA;CACb,GAAG,SAAS,CAmBZ;AAgCD;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE;IAClD,OAAO,EAAE,kBAAkB,CAAC,SAAS,CAAC,CAAA;IACtC,MAAM,EAAE,OAAO,CAAA;IACf,CAAC,EAAE,SAAS,CAAA;CACb,GAAG,SAAS,CA+BZ;AAyBD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,YAAY,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE;IACnD,OAAO,EAAE,kBAAkB,CAAC,SAAS,CAAC,CAAA;IACtC,MAAM,EAAE,OAAO,CAAA;IACf,CAAC,EAAE,SAAS,CAAA;CACb,GAAG,SAAS,CAmBZ;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE;IACzC,OAAO,EAAE,kBAAkB,CAAC,SAAS,CAAC,CAAA;IACtC,MAAM,EAAE,OAAO,CAAA;IACf,CAAC,EAAE,SAAS,CAAA;CACb,GAAG,SAAS,CAEZ;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE;IAChD,OAAO,EAAE,kBAAkB,CAAC,SAAS,CAAC,CAAA;IACtC,MAAM,EAAE,OAAO,CAAA;IACf,CAAC,EAAE,SAAS,CAAA;CACb,GAAG,SAAS,CAYZ;AAwCD;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE;IACjD,OAAO,EAAE,kBAAkB,CAAC,SAAS,CAAC,CAAA;IACtC,MAAM,EAAE,OAAO,CAAA;IACf,CAAC,EAAE,SAAS,CAAA;CACb,GAAG,SAAS,CAwBZ;AAQD;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,kBAAkB,CAAC,MAAM,CAAC,EAChC,KAAK,EAAE;IAAE,OAAO,EAAE,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,CAAC,EAAE,SAAS,CAAA;CAAE,GAC/E;IAAE,QAAQ,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,IAAI,EAAE,SAAS,CAAA;CAAE,CAsChF"}
|