zidane-ui 9.1.1 → 9.1.3
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/README.md +2 -0
- package/dist/adapters/index.js +1 -1
- package/dist/adapters/server-transcript-members.d.ts +1 -1
- package/dist/adapters/server-transcript-members.js +19 -1
- package/dist/app/ModalProvider.d.ts +3 -1
- package/dist/app/ModalProvider.js +15 -9
- package/dist/approvals/headless/index.js +1 -1
- package/dist/chat/HostTranscript.d.ts +3 -1
- package/dist/chat/HostTranscript.js +5 -3
- package/dist/chat/Transcript.js +1 -1
- package/dist/chat/composer/ComposerEditor.js +1 -1
- package/dist/chat/composer/index.js +1 -1
- package/dist/chat/composer/use-composer-stores.js +1 -1
- package/dist/chat/headless/block-runs.d.ts +57 -0
- package/dist/chat/headless/block-runs.js +123 -0
- package/dist/chat/headless/composer/index.js +2 -2
- package/dist/chat/headless/fixture-transcript.d.ts +6 -1
- package/dist/chat/headless/fixture-transcript.js +49 -0
- package/dist/chat/headless/host.d.ts +3 -0
- package/dist/chat/headless/index.d.ts +2 -1
- package/dist/chat/headless/index.js +12 -11
- package/dist/chat/headless/labels.d.ts +42 -0
- package/dist/chat/headless/labels.js +42 -0
- package/dist/chat/headless/session-list.d.ts +27 -0
- package/dist/chat/headless/sidebar/index.js +1 -1
- package/dist/chat/headless/sidebar/labels.d.ts +27 -0
- package/dist/chat/headless/streams/index.js +1 -1
- package/dist/chat/headless/streams/live-events.js +2 -1
- package/dist/chat/headless/streams/session-streams.js +2 -2
- package/dist/chat/headless/streams/store.js +2 -2
- package/dist/chat/headless/transcript/batch.d.ts +21 -1
- package/dist/chat/headless/transcript/batch.js +55 -10
- package/dist/chat/headless/transcript/collapse.js +18 -3
- package/dist/chat/headless/transcript/fold.js +26 -10
- package/dist/chat/headless/transcript/index.js +1 -1
- package/dist/chat/headless/transcript/rows.d.ts +7 -1
- package/dist/chat/index.d.ts +6 -1
- package/dist/chat/index.js +7 -2
- package/dist/chat/testing/contract.d.ts +6 -1
- package/dist/chat/testing/contract.js +30 -3
- package/dist/chat/transcript/AnsiText.d.ts +27 -0
- package/dist/chat/transcript/AnsiText.js +73 -0
- package/dist/chat/transcript/CodemodeScript.d.ts +33 -0
- package/dist/chat/transcript/CodemodeScript.js +212 -0
- package/dist/chat/transcript/LiveOutput.d.ts +21 -0
- package/dist/chat/transcript/LiveOutput.js +42 -0
- package/dist/chat/transcript/TranscriptRow.js +19 -2
- package/dist/chat/transcript/actions.d.ts +6 -0
- package/dist/chat/transcript/index.d.ts +6 -1
- package/dist/chat/transcript/index.js +6 -1
- package/dist/chat/transcript/markdown.js +9 -0
- package/dist/chat/transcript/renderers.d.ts +7 -0
- package/dist/chat/transcript/script-input.d.ts +17 -0
- package/dist/chat/transcript/script-input.js +16 -0
- package/dist/chat/transcript/shell-block-scope.d.ts +29 -0
- package/dist/chat/transcript/shell-block-scope.js +18 -0
- package/dist/chat/transcript/shell-block.d.ts +27 -0
- package/dist/chat/transcript/shell-block.js +306 -0
- package/dist/chat/transcript/tool-parts.d.ts +18 -6
- package/dist/chat/transcript/tool-parts.js +15 -5
- package/dist/chat/transcript/tool-payload.js +6 -3
- package/dist/chat/transcript/tool-row.js +155 -96
- package/dist/chat/transcript/user-bash.js +3 -2
- package/dist/code/HighlightedCode.js +3 -69
- package/dist/code/highlight-lines.d.ts +24 -0
- package/dist/code/highlight-lines.js +41 -0
- package/dist/code/use-highlighted-html.d.ts +5 -0
- package/dist/code/use-highlighted-html.js +75 -0
- package/dist/core.css +6 -2
- package/dist/dist/{index-CGbOWa7y.d.ts → index-WlE93Q6d.d.ts} +101 -3
- package/dist/extensions/ExtensionSettingsSidebar.js +19 -3
- package/dist/extensions/kit.d.ts +1 -1
- package/dist/git/BranchMenu.d.ts +1 -7
- package/dist/git/BranchMenu.js +17 -40
- package/dist/git/headless/labels.d.ts +0 -2
- package/dist/git/headless/labels.js +0 -2
- package/dist/index.d.ts +4 -3
- package/dist/index.js +2 -1
- package/dist/onboarding/index.js +1 -1
- package/dist/onboarding/steps/ConnectStep.js +1 -1
- package/dist/onboarding/steps/ExtensionsStep.js +1 -1
- package/dist/onboarding/steps/ReadyStep.js +1 -1
- package/dist/onboarding/steps/connect/ProviderPanel.js +1 -1
- package/dist/session/headless/index.js +2 -2
- package/dist/settings/SettingsShell.d.ts +3 -1
- package/dist/settings/SettingsShell.js +15 -8
- package/dist/settings/headless/catalog.js +5 -0
- package/dist/settings/headless/layout.js +2 -1
- package/dist/settings/headless/registry.d.ts +2 -0
- package/dist/settings/headless/search.d.ts +1 -1
- package/dist/settings/sections/environments/EnvironmentsSection.js +1 -1
- package/dist/settings/sections/extensions/ExtensionsSection.js +2 -2
- package/dist/settings/sections/models/ModelRows.js +1 -1
- package/dist/settings/sections/models/model-test.js +1 -1
- package/dist/styles.css +291 -2
- package/dist/terminal/TerminalProvider.d.ts +3 -1
- package/dist/terminal/TerminalProvider.js +5 -1
- package/dist/terminal/headless/store.d.ts +10 -0
- package/dist/terminal/headless/store.js +16 -0
- package/dist/terminal/index.d.ts +2 -2
- package/dist/terminal/index.js +2 -2
- package/dist/theme/runtime-icons.d.ts +50 -0
- package/dist/theme/runtime-icons.js +95 -0
- package/package.json +3 -6
- package/src/styles/primitives.css +5 -2
- package/src/styles/transcript.css +281 -0
- package/src/adapters/browser-appearance-host.ts +0 -51
- package/src/adapters/browser-keybindings-host.ts +0 -48
- package/src/adapters/browser-workspace-host.ts +0 -92
- package/src/adapters/closable-client.ts +0 -34
- package/src/adapters/extension-modules.ts +0 -360
- package/src/adapters/index.ts +0 -35
- package/src/adapters/live-events.ts +0 -6
- package/src/adapters/live.ts +0 -270
- package/src/adapters/run-host.ts +0 -238
- package/src/adapters/server-approvals-host.ts +0 -102
- package/src/adapters/server-client.ts +0 -15
- package/src/adapters/server-composer-host.ts +0 -459
- package/src/adapters/server-extensions-host.ts +0 -979
- package/src/adapters/server-files-host.ts +0 -287
- package/src/adapters/server-git-host.ts +0 -289
- package/src/adapters/server-host.ts +0 -489
- package/src/adapters/server-machines-host.ts +0 -283
- package/src/adapters/server-oauth-flow.ts +0 -133
- package/src/adapters/server-onboarding-host.ts +0 -363
- package/src/adapters/server-palette-host.ts +0 -134
- package/src/adapters/server-session-host.ts +0 -241
- package/src/adapters/server-settings-accounts.ts +0 -212
- package/src/adapters/server-settings-host.ts +0 -120
- package/src/adapters/server-settings-models.ts +0 -46
- package/src/adapters/server-settings-performance.ts +0 -58
- package/src/adapters/server-settings-sections.ts +0 -222
- package/src/adapters/server-sidebar-host.ts +0 -59
- package/src/adapters/server-terminal-host.ts +0 -124
- package/src/adapters/server-transcript-members.ts +0 -131
- package/src/adapters/sse-host.ts +0 -264
- package/src/adapters/sse-parser.ts +0 -82
- package/src/adapters/sse-protocol.ts +0 -118
- package/src/adapters/stream-pacer.ts +0 -122
- package/src/adapters/worker-host.ts +0 -192
- package/src/adapters/worker-protocol.ts +0 -97
- package/src/app/AppHostProvider.tsx +0 -135
- package/src/app/ModalProvider.tsx +0 -731
- package/src/app/headless/app-host.ts +0 -61
- package/src/app/headless/index.ts +0 -6
- package/src/app/headless/resource.ts +0 -444
- package/src/app/index.ts +0 -9
- package/src/app/testing/index.ts +0 -90
- package/src/app/useConfirm.tsx +0 -65
- package/src/app/useResource.ts +0 -30
- package/src/appearance/AppearanceProvider.tsx +0 -383
- package/src/appearance/apply.ts +0 -69
- package/src/appearance/headless/fixture-host.ts +0 -111
- package/src/appearance/headless/fonts.ts +0 -224
- package/src/appearance/headless/host.ts +0 -65
- package/src/appearance/headless/index.ts +0 -12
- package/src/appearance/headless/prefs.ts +0 -252
- package/src/appearance/headless/storage.ts +0 -127
- package/src/appearance/headless/zoom-commands.ts +0 -21
- package/src/appearance/index.ts +0 -11
- package/src/appearance/testing/contract.ts +0 -210
- package/src/appearance/testing/index.ts +0 -6
- package/src/approvals/ApprovalBar.tsx +0 -234
- package/src/approvals/ApprovalConcern.tsx +0 -33
- package/src/approvals/ApprovalShell.tsx +0 -69
- package/src/approvals/ApprovalsProvider.tsx +0 -110
- package/src/approvals/FileEditApproval.tsx +0 -310
- package/src/approvals/HunkPreviews.tsx +0 -225
- package/src/approvals/SafelistPanel.tsx +0 -149
- package/src/approvals/headless/fixture-host.ts +0 -73
- package/src/approvals/headless/fixtures.ts +0 -86
- package/src/approvals/headless/heads.ts +0 -81
- package/src/approvals/headless/host.ts +0 -80
- package/src/approvals/headless/index.ts +0 -12
- package/src/approvals/headless/labels.ts +0 -67
- package/src/approvals/headless/pending.ts +0 -91
- package/src/approvals/headless/preview.ts +0 -94
- package/src/approvals/headless/safelist.ts +0 -63
- package/src/approvals/index.ts +0 -13
- package/src/approvals/key-scope.ts +0 -33
- package/src/approvals/testing/contract.ts +0 -230
- package/src/approvals/testing/index.ts +0 -7
- package/src/brands/marks.ts +0 -298
- package/src/chat/ChatProvider.tsx +0 -60
- package/src/chat/DaemonOrb.tsx +0 -107
- package/src/chat/HostBadge.tsx +0 -71
- package/src/chat/HostStatusDot.tsx +0 -53
- package/src/chat/HostTranscript.tsx +0 -101
- package/src/chat/PdfPreview.tsx +0 -65
- package/src/chat/RunEstimateChip.tsx +0 -168
- package/src/chat/SessionFilterMenu.tsx +0 -397
- package/src/chat/SessionGroupHeader.tsx +0 -177
- package/src/chat/SessionHostHeader.tsx +0 -66
- package/src/chat/SessionList.tsx +0 -413
- package/src/chat/SessionListRow.tsx +0 -296
- package/src/chat/SessionStreamsProvider.tsx +0 -253
- package/src/chat/StatusDot.tsx +0 -128
- package/src/chat/TextPreview.tsx +0 -121
- package/src/chat/Throbber.tsx +0 -270
- package/src/chat/Transcript.tsx +0 -523
- package/src/chat/composer/AgentPicker.tsx +0 -155
- package/src/chat/composer/AgentPickerDialog.tsx +0 -99
- package/src/chat/composer/ApprovalDock.tsx +0 -64
- package/src/chat/composer/ArchivedBanner.tsx +0 -44
- package/src/chat/composer/AttachmentTiles.tsx +0 -211
- package/src/chat/composer/Composer.tsx +0 -500
- package/src/chat/composer/ComposerBadges.tsx +0 -339
- package/src/chat/composer/ComposerControls.tsx +0 -243
- package/src/chat/composer/ComposerEditor.tsx +0 -101
- package/src/chat/composer/ComposerHostProvider.tsx +0 -46
- package/src/chat/composer/ComposerShell.tsx +0 -129
- package/src/chat/composer/ContextBreakdown.tsx +0 -382
- package/src/chat/composer/ContextOrb.tsx +0 -176
- package/src/chat/composer/ConversationBadges.tsx +0 -168
- package/src/chat/composer/DockCard.tsx +0 -126
- package/src/chat/composer/EffortPickerDialog.tsx +0 -184
- package/src/chat/composer/HostComposer.tsx +0 -135
- package/src/chat/composer/HostContextOrb.tsx +0 -94
- package/src/chat/composer/HostModelChainList.tsx +0 -102
- package/src/chat/composer/HostPicker.tsx +0 -97
- package/src/chat/composer/HostPickers.tsx +0 -320
- package/src/chat/composer/ImageModelList.tsx +0 -151
- package/src/chat/composer/ModelChainList.tsx +0 -442
- package/src/chat/composer/ModelChainParts.tsx +0 -247
- package/src/chat/composer/ModelChainRow.tsx +0 -191
- package/src/chat/composer/ModelChainRows.tsx +0 -223
- package/src/chat/composer/ModelChainTooltip.tsx +0 -121
- package/src/chat/composer/ModelFacts.tsx +0 -204
- package/src/chat/composer/ModelOptionsPicker.tsx +0 -257
- package/src/chat/composer/ModelPicker.tsx +0 -513
- package/src/chat/composer/ModelPickerDialog.tsx +0 -99
- package/src/chat/composer/ModelProviderPills.tsx +0 -141
- package/src/chat/composer/PickerPill.tsx +0 -41
- package/src/chat/composer/ProjectMenu.tsx +0 -187
- package/src/chat/composer/PromptHistoryProvider.tsx +0 -214
- package/src/chat/composer/RetryPill.tsx +0 -47
- package/src/chat/composer/RunStatusChip.tsx +0 -150
- package/src/chat/composer/ScopeToggle.tsx +0 -94
- package/src/chat/composer/SelectTurnHint.tsx +0 -40
- package/src/chat/composer/SendButton.tsx +0 -89
- package/src/chat/composer/ServerScopeToggle.tsx +0 -188
- package/src/chat/composer/attachment-ingest.ts +0 -413
- package/src/chat/composer/attachments.tsx +0 -176
- package/src/chat/composer/badge-order.ts +0 -65
- package/src/chat/composer/composer-bus.ts +0 -317
- package/src/chat/composer/index.ts +0 -63
- package/src/chat/composer/load-composer-editor.ts +0 -25
- package/src/chat/composer/model-catalog.ts +0 -424
- package/src/chat/composer/model-list-layout.ts +0 -118
- package/src/chat/composer/prompt-history-nav.ts +0 -60
- package/src/chat/composer/scope-side.ts +0 -7
- package/src/chat/composer/suggestion-extension.ts +0 -113
- package/src/chat/composer/suggestions.tsx +0 -115
- package/src/chat/composer/use-agent-profiles.ts +0 -97
- package/src/chat/composer/use-cache-hints.ts +0 -93
- package/src/chat/composer/use-composer-stores.ts +0 -140
- package/src/chat/composer/use-draft-target.ts +0 -317
- package/src/chat/composer/use-new-session-defaults.ts +0 -201
- package/src/chat/composer/use-provider-ready-poll.ts +0 -35
- package/src/chat/composer/use-run-meter.ts +0 -140
- package/src/chat/composer/use-send-prompt.ts +0 -188
- package/src/chat/composer/use-session-meters.ts +0 -109
- package/src/chat/composer/use-sustained-work.ts +0 -74
- package/src/chat/composer/useAttachmentIngest.ts +0 -116
- package/src/chat/composer/useModelListSpy.ts +0 -19
- package/src/chat/headless/badge-refs.ts +0 -76
- package/src/chat/headless/chip-labels.ts +0 -40
- package/src/chat/headless/chip-settle.ts +0 -53
- package/src/chat/headless/chip-views.ts +0 -215
- package/src/chat/headless/composer/attachment-dedupe.ts +0 -50
- package/src/chat/headless/composer/commands.ts +0 -16
- package/src/chat/headless/composer/composer-sources.ts +0 -150
- package/src/chat/headless/composer/conversation-badges.ts +0 -227
- package/src/chat/headless/composer/draft-sync.ts +0 -199
- package/src/chat/headless/composer/editor-markdown.ts +0 -137
- package/src/chat/headless/composer/ghost-autocomplete.ts +0 -381
- package/src/chat/headless/composer/host-chrome.ts +0 -197
- package/src/chat/headless/composer/host.ts +0 -250
- package/src/chat/headless/composer/index.ts +0 -17
- package/src/chat/headless/composer/labels-chrome.ts +0 -83
- package/src/chat/headless/composer/labels-editor.ts +0 -44
- package/src/chat/headless/composer/labels.ts +0 -18
- package/src/chat/headless/composer/live-cost.ts +0 -67
- package/src/chat/headless/composer/model-knobs.ts +0 -179
- package/src/chat/headless/composer/model-names.ts +0 -145
- package/src/chat/headless/composer/model-picker-prefs.ts +0 -90
- package/src/chat/headless/composer/models.ts +0 -86
- package/src/chat/headless/composer/new-session-defaults.ts +0 -68
- package/src/chat/headless/composer/prompt-suggestions.ts +0 -72
- package/src/chat/headless/composer/remember-model-pick.ts +0 -132
- package/src/chat/headless/composer/run-meter.ts +0 -228
- package/src/chat/headless/composer-modes.ts +0 -170
- package/src/chat/headless/draft-scope.ts +0 -136
- package/src/chat/headless/draft-target.ts +0 -87
- package/src/chat/headless/extension-sources.ts +0 -64
- package/src/chat/headless/file-chip.ts +0 -175
- package/src/chat/headless/fixture-host.ts +0 -294
- package/src/chat/headless/fixture-transcript.ts +0 -125
- package/src/chat/headless/fixtures/demo-transcript-all-kinds.ts +0 -233
- package/src/chat/headless/fixtures/demo-transcript.ts +0 -244
- package/src/chat/headless/host.ts +0 -264
- package/src/chat/headless/hosts.ts +0 -55
- package/src/chat/headless/index.ts +0 -31
- package/src/chat/headless/labels.ts +0 -373
- package/src/chat/headless/markdown-chunks.ts +0 -134
- package/src/chat/headless/path-resolver.ts +0 -178
- package/src/chat/headless/prompt-origin.ts +0 -90
- package/src/chat/headless/reference-store.ts +0 -285
- package/src/chat/headless/send-flow.ts +0 -347
- package/src/chat/headless/session-list.ts +0 -400
- package/src/chat/headless/sidebar/activity.ts +0 -179
- package/src/chat/headless/sidebar/badges.ts +0 -190
- package/src/chat/headless/sidebar/compaction.ts +0 -98
- package/src/chat/headless/sidebar/directory.ts +0 -1046
- package/src/chat/headless/sidebar/dot-state.ts +0 -36
- package/src/chat/headless/sidebar/environment.ts +0 -70
- package/src/chat/headless/sidebar/estimates.ts +0 -146
- package/src/chat/headless/sidebar/host.ts +0 -41
- package/src/chat/headless/sidebar/index.ts +0 -18
- package/src/chat/headless/sidebar/labels.ts +0 -161
- package/src/chat/headless/sidebar/notifications.ts +0 -61
- package/src/chat/headless/sidebar/pinned-projects.ts +0 -51
- package/src/chat/headless/sidebar/pinned-sessions.ts +0 -27
- package/src/chat/headless/sidebar/project-icons.ts +0 -116
- package/src/chat/headless/sidebar/query.ts +0 -621
- package/src/chat/headless/sidebar/rows.ts +0 -427
- package/src/chat/headless/sidebar/types.ts +0 -96
- package/src/chat/headless/sidebar/view.ts +0 -367
- package/src/chat/headless/site-icons.ts +0 -51
- package/src/chat/headless/smooth-stream.ts +0 -76
- package/src/chat/headless/store.ts +0 -62
- package/src/chat/headless/streams/actions.ts +0 -85
- package/src/chat/headless/streams/index.ts +0 -25
- package/src/chat/headless/streams/live-events.ts +0 -124
- package/src/chat/headless/streams/merge.ts +0 -60
- package/src/chat/headless/streams/pacer.ts +0 -189
- package/src/chat/headless/streams/prompt-previews.ts +0 -64
- package/src/chat/headless/streams/scheduler.ts +0 -36
- package/src/chat/headless/streams/selectors.ts +0 -76
- package/src/chat/headless/streams/session-streams.ts +0 -407
- package/src/chat/headless/streams/store.ts +0 -1107
- package/src/chat/headless/streams/transcript.ts +0 -41
- package/src/chat/headless/streams/types.ts +0 -84
- package/src/chat/headless/transcript/batch.ts +0 -429
- package/src/chat/headless/transcript/collapse.ts +0 -789
- package/src/chat/headless/transcript/fold-actions.ts +0 -269
- package/src/chat/headless/transcript/fold-attachments.ts +0 -78
- package/src/chat/headless/transcript/fold.ts +0 -382
- package/src/chat/headless/transcript/index.ts +0 -41
- package/src/chat/headless/transcript/nesting.ts +0 -73
- package/src/chat/headless/transcript/pairing.ts +0 -124
- package/src/chat/headless/transcript/rows.ts +0 -377
- package/src/chat/headless/transcript/run-failures.ts +0 -72
- package/src/chat/headless/transcript/select-stops.ts +0 -151
- package/src/chat/headless/transcript/tool-media.ts +0 -42
- package/src/chat/headless/transcript-host.ts +0 -180
- package/src/chat/headless/transcript-labels.ts +0 -12
- package/src/chat/headless/turn-labels.ts +0 -28
- package/src/chat/headless/turn-prompt.ts +0 -32
- package/src/chat/index.ts +0 -31
- package/src/chat/interactions/HostInteractions.tsx +0 -76
- package/src/chat/interactions/InboxPanel.tsx +0 -226
- package/src/chat/interactions/InteractionCard.tsx +0 -111
- package/src/chat/interactions/PlanCard.tsx +0 -186
- package/src/chat/interactions/QuestionField.tsx +0 -336
- package/src/chat/interactions/QuestionForm.tsx +0 -283
- package/src/chat/interactions/card-ui.tsx +0 -86
- package/src/chat/interactions/hooks.ts +0 -49
- package/src/chat/interactions/index.ts +0 -8
- package/src/chat/provider-color.ts +0 -71
- package/src/chat/rich-composer/MentionList.tsx +0 -238
- package/src/chat/rich-composer/RichComposer.tsx +0 -1071
- package/src/chat/rich-composer/badge-decorations.ts +0 -157
- package/src/chat/rich-composer/composer-controls.tsx +0 -102
- package/src/chat/rich-composer/composer-extensions.ts +0 -388
- package/src/chat/rich-composer/composer-keys.ts +0 -416
- package/src/chat/rich-composer/ghost-plugin.ts +0 -89
- package/src/chat/rich-composer/index.ts +0 -3
- package/src/chat/rich-composer/mention-popover.ts +0 -336
- package/src/chat/rich-composer/slash-completion.ts +0 -143
- package/src/chat/rich-composer/use-composer-bus.ts +0 -57
- package/src/chat/rich-composer/use-composer-editor.ts +0 -216
- package/src/chat/rich-composer/use-composer-sources.ts +0 -90
- package/src/chat/rich-composer/use-draft-mirror.ts +0 -398
- package/src/chat/rich-composer/use-editor-handover.ts +0 -45
- package/src/chat/rich-composer/use-extension-composer.ts +0 -80
- package/src/chat/rich-composer/use-ghost-lifecycle.ts +0 -265
- package/src/chat/rich-composer/use-prompt-ghost.ts +0 -90
- package/src/chat/rich-composer/use-staged-attachments.ts +0 -65
- package/src/chat/sidebar/MainSessionRow.tsx +0 -102
- package/src/chat/sidebar/ProjectIcon.tsx +0 -399
- package/src/chat/sidebar/RowChips.tsx +0 -98
- package/src/chat/sidebar/SessionSidebar.tsx +0 -1039
- package/src/chat/sidebar/SidebarDecoration.tsx +0 -93
- package/src/chat/sidebar/SidebarFilterMenu.tsx +0 -270
- package/src/chat/sidebar/SidebarFooter.tsx +0 -244
- package/src/chat/sidebar/SidebarFrame.tsx +0 -154
- package/src/chat/sidebar/SidebarGroupHeader.tsx +0 -263
- package/src/chat/sidebar/SidebarHostProvider.tsx +0 -51
- package/src/chat/sidebar/SidebarRowView.tsx +0 -151
- package/src/chat/sidebar/SidebarSearchRow.tsx +0 -66
- package/src/chat/sidebar/SidebarSessionRow.tsx +0 -317
- package/src/chat/sidebar/SidebarToggleButton.tsx +0 -48
- package/src/chat/sidebar/SpaceSwitcher.tsx +0 -341
- package/src/chat/sidebar/SpacesSection.tsx +0 -259
- package/src/chat/sidebar/collapsed.ts +0 -61
- package/src/chat/sidebar/index.ts +0 -109
- package/src/chat/sidebar/session-menu.ts +0 -441
- package/src/chat/sidebar/sidebar-focus-hold.ts +0 -56
- package/src/chat/sidebar/sidebar-live.tsx +0 -666
- package/src/chat/sidebar/use-main-session.ts +0 -32
- package/src/chat/sidebar/useAgentNames.ts +0 -12
- package/src/chat/sidebar/useCompactionProgress.ts +0 -24
- package/src/chat/sidebar/usePinnedProjects.ts +0 -36
- package/src/chat/sidebar/useSaveViewAsSpace.ts +0 -42
- package/src/chat/sidebar/useSessionActivity.ts +0 -24
- package/src/chat/sidebar/useSessionBadges.ts +0 -26
- package/src/chat/sidebar/useSessionDirectoryView.ts +0 -128
- package/src/chat/sidebar/useSessionSearch.ts +0 -94
- package/src/chat/sidebar/useSidebarKeyboardNav.ts +0 -167
- package/src/chat/sidebar/useSidebarLabels.ts +0 -10
- package/src/chat/testing/composer.contract.ts +0 -508
- package/src/chat/testing/contract.ts +0 -634
- package/src/chat/testing/fixture-composer-chrome.ts +0 -159
- package/src/chat/testing/fixture-composer-host.ts +0 -147
- package/src/chat/testing/fixture-sidebar-host.ts +0 -99
- package/src/chat/testing/index.ts +0 -12
- package/src/chat/testing/sidebar.contract.ts +0 -196
- package/src/chat/transcript/BadgeMenu.tsx +0 -241
- package/src/chat/transcript/CardMarkdown.tsx +0 -102
- package/src/chat/transcript/ChipCard.tsx +0 -187
- package/src/chat/transcript/ChipCards.tsx +0 -100
- package/src/chat/transcript/DiffLines.tsx +0 -122
- package/src/chat/transcript/EarlierHistory.tsx +0 -136
- package/src/chat/transcript/EditDiffBlock.tsx +0 -176
- package/src/chat/transcript/FileChip.tsx +0 -361
- package/src/chat/transcript/ImageGenerationBlock.tsx +0 -239
- package/src/chat/transcript/InlineChipText.tsx +0 -57
- package/src/chat/transcript/InteractionToolBody.tsx +0 -211
- package/src/chat/transcript/LazyRow.tsx +0 -311
- package/src/chat/transcript/MermaidDiagram.tsx +0 -484
- package/src/chat/transcript/PromptEcho.tsx +0 -171
- package/src/chat/transcript/PromptOriginLabel.tsx +0 -44
- package/src/chat/transcript/ProseMarkdown.tsx +0 -168
- package/src/chat/transcript/ReferenceText.tsx +0 -198
- package/src/chat/transcript/SelectCursor.tsx +0 -118
- package/src/chat/transcript/SelectTurnHint.tsx +0 -81
- package/src/chat/transcript/SelectTurnProvider.tsx +0 -150
- package/src/chat/transcript/SubagentBlock.tsx +0 -224
- package/src/chat/transcript/TranscriptRow.tsx +0 -362
- package/src/chat/transcript/TranscriptSearch.tsx +0 -171
- package/src/chat/transcript/TurnMenu.tsx +0 -217
- package/src/chat/transcript/actions.tsx +0 -77
- package/src/chat/transcript/badges.tsx +0 -155
- package/src/chat/transcript/chip-details.ts +0 -169
- package/src/chat/transcript/chip-resolve.ts +0 -56
- package/src/chat/transcript/extension-renderers.tsx +0 -148
- package/src/chat/transcript/fold-attachments.tsx +0 -221
- package/src/chat/transcript/fold-status.tsx +0 -112
- package/src/chat/transcript/fold-worker.tsx +0 -160
- package/src/chat/transcript/fold.tsx +0 -522
- package/src/chat/transcript/frame.tsx +0 -326
- package/src/chat/transcript/index.ts +0 -66
- package/src/chat/transcript/markdown-cache.ts +0 -84
- package/src/chat/transcript/markdown-context.ts +0 -52
- package/src/chat/transcript/markdown.tsx +0 -351
- package/src/chat/transcript/messages.tsx +0 -169
- package/src/chat/transcript/notices.tsx +0 -508
- package/src/chat/transcript/prompt-lines.tsx +0 -55
- package/src/chat/transcript/prompt.tsx +0 -258
- package/src/chat/transcript/prose.tsx +0 -171
- package/src/chat/transcript/recent-map.ts +0 -32
- package/src/chat/transcript/references.ts +0 -108
- package/src/chat/transcript/remark-references.ts +0 -157
- package/src/chat/transcript/remark-refs.ts +0 -176
- package/src/chat/transcript/renderer-slots.tsx +0 -35
- package/src/chat/transcript/renderers.tsx +0 -251
- package/src/chat/transcript/row-estimate.ts +0 -158
- package/src/chat/transcript/run-rows.tsx +0 -291
- package/src/chat/transcript/site-icons.ts +0 -27
- package/src/chat/transcript/thumbnails.ts +0 -146
- package/src/chat/transcript/tool-batch.tsx +0 -102
- package/src/chat/transcript/tool-details.tsx +0 -31
- package/src/chat/transcript/tool-media.tsx +0 -132
- package/src/chat/transcript/tool-parts.tsx +0 -358
- package/src/chat/transcript/tool-payload.tsx +0 -76
- package/src/chat/transcript/tool-row.tsx +0 -496
- package/src/chat/transcript/turn-commands.ts +0 -101
- package/src/chat/transcript/use-transcript-rows.ts +0 -195
- package/src/chat/transcript/useComposerSearch.ts +0 -106
- package/src/chat/transcript/useSelectTurnKeys.ts +0 -204
- package/src/chat/transcript/useSettledReveal.ts +0 -57
- package/src/chat/transcript/useStickToBottom.ts +0 -600
- package/src/chat/transcript/useTranscriptFind.ts +0 -70
- package/src/chat/transcript/useTranscriptFindKey.ts +0 -52
- package/src/chat/transcript/useTranscriptScroll.ts +0 -163
- package/src/chat/transcript/useTranscriptSearch.tsx +0 -382
- package/src/chat/transcript/useTranscriptSelectionCopy.ts +0 -63
- package/src/chat/transcript/useWheelHoverPause.ts +0 -79
- package/src/chat/transcript/user-bash.tsx +0 -134
- package/src/chat/transcript-options.ts +0 -51
- package/src/chat/useChatLabels.ts +0 -14
- package/src/code/CodeHighlightProvider.tsx +0 -87
- package/src/code/HighlightedCode.tsx +0 -156
- package/src/code/code-themes.ts +0 -187
- package/src/code/editor/CodeCompletion.tsx +0 -719
- package/src/code/editor/CodeEditor.tsx +0 -480
- package/src/code/editor/CodeHover.tsx +0 -429
- package/src/code/editor/DiagnosticAnnotation.tsx +0 -73
- package/src/code/editor/DiagnosticsChip.tsx +0 -85
- package/src/code/editor/DiffView.tsx +0 -197
- package/src/code/editor/EditorColumn.tsx +0 -256
- package/src/code/editor/FileIcon.tsx +0 -89
- package/src/code/editor/FileTabPill.tsx +0 -101
- package/src/code/editor/FileTree.tsx +0 -414
- package/src/code/editor/FileView.tsx +0 -462
- package/src/code/editor/HighlightWorkers.tsx +0 -84
- package/src/code/editor/LanguageEditor.tsx +0 -210
- package/src/code/editor/_vendor/tree-icon-colors.ts +0 -72
- package/src/code/editor/diagnostics.ts +0 -140
- package/src/code/editor/edit-session.ts +0 -32
- package/src/code/editor/environment.tsx +0 -88
- package/src/code/editor/find/FindBar.tsx +0 -126
- package/src/code/editor/find/find-highlight.ts +0 -138
- package/src/code/editor/find/find-model.ts +0 -123
- package/src/code/editor/find/settle-scroll.ts +0 -77
- package/src/code/editor/find/useFind.ts +0 -203
- package/src/code/editor/fs-adapter.ts +0 -37
- package/src/code/editor/index.ts +0 -36
- package/src/code/editor/language.ts +0 -31
- package/src/code/editor/patch-parse.ts +0 -176
- package/src/code/editor/patch-parse.worker.ts +0 -12
- package/src/code/editor/pierre-theme.ts +0 -155
- package/src/code/editor/prime-diff.ts +0 -37
- package/src/code/editor/reveal.ts +0 -58
- package/src/code/editor/scroll-reach.ts +0 -28
- package/src/code/editor/useCodeDocument.ts +0 -226
- package/src/code/editor/useDefinition.ts +0 -159
- package/src/code/editor/useDetachCleanup.ts +0 -36
- package/src/code/editor/useFileDocument.ts +0 -87
- package/src/code/editor/useRevealLine.ts +0 -92
- package/src/code/editor/word-at.ts +0 -145
- package/src/code/highlight.worker.ts +0 -16
- package/src/code/highlighter.ts +0 -181
- package/src/code/highlights.ts +0 -51
- package/src/code/mermaid-lexer.ts +0 -331
- package/src/code/shiki-theme.ts +0 -46
- package/src/components/BrandMark.tsx +0 -118
- package/src/components/Breadcrumb.tsx +0 -105
- package/src/components/BrowserChrome.tsx +0 -189
- package/src/components/BrowserSignIn.tsx +0 -210
- package/src/components/ChoiceCards.tsx +0 -170
- package/src/components/CodeFrame.tsx +0 -225
- package/src/components/ConfirmDialog.tsx +0 -119
- package/src/components/CopyButton.tsx +0 -85
- package/src/components/EditableTitle.tsx +0 -199
- package/src/components/ErrorBoundary.tsx +0 -208
- package/src/components/Form.tsx +0 -593
- package/src/components/Highlighted.tsx +0 -68
- package/src/components/HowItWorks.tsx +0 -123
- package/src/components/IconButton.tsx +0 -101
- package/src/components/IconToggle.tsx +0 -71
- package/src/components/Keycap.tsx +0 -334
- package/src/components/Lightbox.tsx +0 -257
- package/src/components/LoadError.tsx +0 -45
- package/src/components/MediaNav.tsx +0 -85
- package/src/components/Menu.tsx +0 -435
- package/src/components/Overlay.tsx +0 -327
- package/src/components/PanelEmpty.tsx +0 -80
- package/src/components/PanelRows.tsx +0 -107
- package/src/components/PreviewWindow.tsx +0 -53
- package/src/components/ReorderTabs.tsx +0 -103
- package/src/components/RowActionsMenu.tsx +0 -383
- package/src/components/SegmentSpinner.tsx +0 -88
- package/src/components/Segmented.tsx +0 -126
- package/src/components/StepFrame.tsx +0 -151
- package/src/components/Stepper.tsx +0 -157
- package/src/components/Surface.tsx +0 -191
- package/src/components/SwatchPicker.tsx +0 -147
- package/src/components/SwitchGlyph.tsx +0 -56
- package/src/components/TabPill.tsx +0 -188
- package/src/components/ThemeThumb.tsx +0 -52
- package/src/components/ToggleCard.tsx +0 -120
- package/src/components/Tooltip.tsx +0 -288
- package/src/components/ZoomableImage.tsx +0 -322
- package/src/components/button.ts +0 -120
- package/src/components/floating/FloatingSurface.tsx +0 -158
- package/src/components/floating/HoverCard.tsx +0 -143
- package/src/components/floating/Popover.tsx +0 -166
- package/src/components/floating/useAnchoredPosition.ts +0 -186
- package/src/components/floating/usePopover.ts +0 -158
- package/src/components/image-clipboard.ts +0 -70
- package/src/components/keyboard-layout.ts +0 -115
- package/src/components/palette/PaletteList.tsx +0 -432
- package/src/components/palette/PalettePanel.tsx +0 -338
- package/src/components/palette/palette-layout.ts +0 -86
- package/src/components/report-error.ts +0 -142
- package/src/components/zoom.ts +0 -133
- package/src/extensions/ExtensionComponent.tsx +0 -167
- package/src/extensions/ExtensionDialogHost.tsx +0 -445
- package/src/extensions/ExtensionRenderer.tsx +0 -100
- package/src/extensions/ExtensionScreen.tsx +0 -122
- package/src/extensions/ExtensionSettingsPage.tsx +0 -112
- package/src/extensions/ExtensionSettingsPages.tsx +0 -44
- package/src/extensions/ExtensionSettingsSidebar.tsx +0 -373
- package/src/extensions/ExtensionSlot.tsx +0 -213
- package/src/extensions/ExtensionWebview.tsx +0 -104
- package/src/extensions/ExtensionsProvider.tsx +0 -124
- package/src/extensions/SettingsWireForm.tsx +0 -182
- package/src/extensions/headless/dialog-queue.ts +0 -92
- package/src/extensions/headless/effect-channel.ts +0 -50
- package/src/extensions/headless/effect-router.ts +0 -107
- package/src/extensions/headless/fixture-host.ts +0 -381
- package/src/extensions/headless/host.ts +0 -398
- package/src/extensions/headless/index.ts +0 -17
- package/src/extensions/headless/labels.ts +0 -64
- package/src/extensions/headless/links.ts +0 -56
- package/src/extensions/headless/select.ts +0 -249
- package/src/extensions/headless/webview-bridge.ts +0 -127
- package/src/extensions/headless/wire.ts +0 -175
- package/src/extensions/hooks.ts +0 -209
- package/src/extensions/index.ts +0 -25
- package/src/extensions/kit.ts +0 -79
- package/src/extensions/links.tsx +0 -165
- package/src/extensions/testing/contract.ts +0 -382
- package/src/extensions/testing/index.ts +0 -6
- package/src/extensions/useExtensionsLabels.ts +0 -14
- package/src/files/CodeViewer.tsx +0 -289
- package/src/files/DiffFileViewer.tsx +0 -143
- package/src/files/DiffsTab.tsx +0 -581
- package/src/files/EditorColumn.tsx +0 -453
- package/src/files/EditorEnvironmentRoot.tsx +0 -63
- package/src/files/FilesDiagnosticsChip.tsx +0 -32
- package/src/files/FilesProvider.tsx +0 -58
- package/src/files/FilesTab.tsx +0 -441
- package/src/files/MediaDiff.tsx +0 -61
- package/src/files/MediaView.tsx +0 -170
- package/src/files/ReviewDraft.tsx +0 -88
- package/src/files/ReviewableDiff.tsx +0 -72
- package/src/files/SearchPanel.tsx +0 -325
- package/src/files/TreeColumn.tsx +0 -229
- package/src/files/code-excerpt.ts +0 -265
- package/src/files/code-menu.ts +0 -53
- package/src/files/drafts-store.ts +0 -192
- package/src/files/file-actions.ts +0 -152
- package/src/files/headless/editor-prefs.ts +0 -230
- package/src/files/headless/entries.ts +0 -172
- package/src/files/headless/fixture-host.ts +0 -260
- package/src/files/headless/host.ts +0 -387
- package/src/files/headless/index.ts +0 -14
- package/src/files/headless/labels.ts +0 -123
- package/src/files/headless/lsp-edits.ts +0 -58
- package/src/files/headless/media.ts +0 -57
- package/src/files/headless/name-match.ts +0 -38
- package/src/files/headless/search.ts +0 -23
- package/src/files/headless/view.ts +0 -114
- package/src/files/headless/workspace-diff.ts +0 -82
- package/src/files/index.ts +0 -25
- package/src/files/lazy-tabs.tsx +0 -41
- package/src/files/session-patch.ts +0 -45
- package/src/files/tab-hooks.ts +0 -37
- package/src/files/testing/contract.ts +0 -279
- package/src/files/testing/demo.ts +0 -36
- package/src/files/testing/index.ts +0 -7
- package/src/files/useCodeReview.tsx +0 -177
- package/src/files/useDiagnostics.ts +0 -59
- package/src/files/useDiagnosticsRun.ts +0 -86
- package/src/files/useEntryActions.ts +0 -280
- package/src/files/useFilesDiagnostics.ts +0 -51
- package/src/files/useFilesLabels.ts +0 -14
- package/src/files/useFolderChanges.ts +0 -38
- package/src/files/useLsp.ts +0 -181
- package/src/files/useOpenFiles.ts +0 -402
- package/src/files/useWorkspace.ts +0 -148
- package/src/files/working-tree-diff.ts +0 -142
- package/src/git/BranchMenu.tsx +0 -988
- package/src/git/GitBar.tsx +0 -297
- package/src/git/GitProvider.tsx +0 -50
- package/src/git/ImportRepoDialog.tsx +0 -390
- package/src/git/MoveSessionDialog.tsx +0 -396
- package/src/git/RemoteFolderPicker.tsx +0 -475
- package/src/git/SyncChip.tsx +0 -275
- package/src/git/WherePicker.tsx +0 -358
- package/src/git/headless/environment.ts +0 -132
- package/src/git/headless/host.ts +0 -353
- package/src/git/headless/index.ts +0 -14
- package/src/git/headless/labels.ts +0 -230
- package/src/git/headless/move.ts +0 -101
- package/src/git/headless/remote-clone.ts +0 -44
- package/src/git/headless/status-reads.ts +0 -77
- package/src/git/headless/switcher.ts +0 -215
- package/src/git/headless/sync.ts +0 -71
- package/src/git/index.ts +0 -17
- package/src/git/testing/contract.ts +0 -551
- package/src/git/testing/index.ts +0 -537
- package/src/git/useEnvironmentChoices.ts +0 -50
- package/src/git/useGitBar.ts +0 -180
- package/src/hooks/keyed-store.ts +0 -65
- package/src/hooks/useDisplayPath.tsx +0 -93
- package/src/hooks/useHydrated.ts +0 -16
- package/src/hooks/useMinuteTick.ts +0 -49
- package/src/hooks/useNearViewport.ts +0 -111
- package/src/hooks/usePersistedState.ts +0 -98
- package/src/hooks/useResizeDrag.ts +0 -240
- package/src/hooks/useTabDrag.ts +0 -88
- package/src/index.ts +0 -119
- package/src/keybindings/KeyCommands.tsx +0 -123
- package/src/keybindings/KeyHint.tsx +0 -78
- package/src/keybindings/KeybindingsProvider.tsx +0 -231
- package/src/keybindings/headless/catalog.ts +0 -360
- package/src/keybindings/headless/commands.ts +0 -77
- package/src/keybindings/headless/fixture-host.ts +0 -51
- package/src/keybindings/headless/host.ts +0 -29
- package/src/keybindings/headless/index.ts +0 -13
- package/src/keybindings/headless/key-scope.ts +0 -91
- package/src/keybindings/headless/labels.ts +0 -14
- package/src/keybindings/headless/overrides.ts +0 -64
- package/src/keybindings/index.ts +0 -15
- package/src/keybindings/load-once.ts +0 -11
- package/src/keybindings/match.ts +0 -48
- package/src/keybindings/press.ts +0 -80
- package/src/keybindings/testing/contract.ts +0 -139
- package/src/keybindings/testing/index.ts +0 -6
- package/src/keybindings/useHelpKey.ts +0 -35
- package/src/keybindings/useKeybindingsLabels.ts +0 -14
- package/src/labels.tsx +0 -175
- package/src/machines/AddServerForm.tsx +0 -151
- package/src/machines/Banners.tsx +0 -172
- package/src/machines/DaemonMenu.tsx +0 -413
- package/src/machines/HostCapabilities.tsx +0 -245
- package/src/machines/HostSignIn.tsx +0 -63
- package/src/machines/HostSyncPanel.tsx +0 -275
- package/src/machines/HostsSection.tsx +0 -312
- package/src/machines/MachinesProvider.tsx +0 -164
- package/src/machines/ServerCard.tsx +0 -347
- package/src/machines/ServerMachinesPanel.tsx +0 -547
- package/src/machines/ServerUpdatePanel.tsx +0 -160
- package/src/machines/SyncAccounts.tsx +0 -148
- package/src/machines/SyncMarker.tsx +0 -87
- package/src/machines/SyncOutcomeBadge.tsx +0 -84
- package/src/machines/TokensPanel.tsx +0 -249
- package/src/machines/headless/fixture-host.ts +0 -519
- package/src/machines/headless/fixtures.ts +0 -164
- package/src/machines/headless/host.ts +0 -381
- package/src/machines/headless/index.ts +0 -13
- package/src/machines/headless/labels.ts +0 -364
- package/src/machines/headless/messages.ts +0 -209
- package/src/machines/headless/presence.ts +0 -110
- package/src/machines/headless/settings-focus.ts +0 -25
- package/src/machines/headless/stores.ts +0 -137
- package/src/machines/headless/sync.ts +0 -207
- package/src/machines/index.ts +0 -29
- package/src/machines/settings-section.tsx +0 -37
- package/src/machines/testing/contract.ts +0 -617
- package/src/machines/testing/index.ts +0 -7
- package/src/machines/testing/sync.contract.ts +0 -260
- package/src/motion/SwapIcon.tsx +0 -29
- package/src/motion/collapse.ts +0 -21
- package/src/motion/grow.tsx +0 -86
- package/src/motion/layout-animating.ts +0 -50
- package/src/motion/presence.ts +0 -191
- package/src/motion/provider.tsx +0 -63
- package/src/motion/reduced.ts +0 -36
- package/src/motion/roll.tsx +0 -131
- package/src/motion/shimmer.ts +0 -15
- package/src/motion/size.tsx +0 -192
- package/src/motion/springs.ts +0 -413
- package/src/motion/swap.tsx +0 -216
- package/src/motion/title-text.tsx +0 -74
- package/src/onboarding/ConnectProviderCard.tsx +0 -49
- package/src/onboarding/OnboardingFlow.tsx +0 -176
- package/src/onboarding/OnboardingProvider.tsx +0 -209
- package/src/onboarding/OnboardingStepFrame.tsx +0 -80
- package/src/onboarding/conversation.tsx +0 -196
- package/src/onboarding/demos/autonomy.tsx +0 -154
- package/src/onboarding/demos/extensions.tsx +0 -183
- package/src/onboarding/demos/features.tsx +0 -488
- package/src/onboarding/demos/how-it-works.tsx +0 -698
- package/src/onboarding/demos/index.ts +0 -11
- package/src/onboarding/demos/parts.tsx +0 -133
- package/src/onboarding/demos/tour.tsx +0 -217
- package/src/onboarding/headless/controller.ts +0 -110
- package/src/onboarding/headless/fixture-host.ts +0 -269
- package/src/onboarding/headless/fixtures.ts +0 -486
- package/src/onboarding/headless/host.ts +0 -176
- package/src/onboarding/headless/index.ts +0 -8
- package/src/onboarding/headless/labels.ts +0 -282
- package/src/onboarding/index.ts +0 -21
- package/src/onboarding/marks.tsx +0 -107
- package/src/onboarding/preview-attachments.ts +0 -39
- package/src/onboarding/skills/SkillSourceBrowser.tsx +0 -128
- package/src/onboarding/skills/parts.tsx +0 -464
- package/src/onboarding/sources/SourceBrowser.tsx +0 -400
- package/src/onboarding/steps/AutonomyStep.tsx +0 -128
- package/src/onboarding/steps/ConnectStep.tsx +0 -104
- package/src/onboarding/steps/ConnectorsStep.tsx +0 -222
- package/src/onboarding/steps/ConversationStep.tsx +0 -132
- package/src/onboarding/steps/ExtensionsStep.tsx +0 -113
- package/src/onboarding/steps/FeatureExample.tsx +0 -46
- package/src/onboarding/steps/FeaturesStep.tsx +0 -88
- package/src/onboarding/steps/ImportStep.tsx +0 -156
- package/src/onboarding/steps/LookStep.tsx +0 -276
- package/src/onboarding/steps/ReadyStep.tsx +0 -278
- package/src/onboarding/steps/SkillsStep.tsx +0 -45
- package/src/onboarding/steps/StepSection.tsx +0 -63
- package/src/onboarding/steps/Tradeoff.tsx +0 -45
- package/src/onboarding/steps/WelcomeStep.tsx +0 -147
- package/src/onboarding/steps/connect/KeyForm.tsx +0 -112
- package/src/onboarding/steps/connect/ProviderPanel.tsx +0 -149
- package/src/onboarding/steps/connect/ProviderReady.tsx +0 -171
- package/src/onboarding/steps/connect/ready-text.ts +0 -17
- package/src/onboarding/steps/index.ts +0 -12
- package/src/onboarding/steps/tasks.tsx +0 -84
- package/src/onboarding/testing/contract.ts +0 -472
- package/src/onboarding/testing/index.ts +0 -7
- package/src/onboarding/tutorials.tsx +0 -45
- package/src/onboarding/useSignIn.ts +0 -58
- package/src/palette/CommandPalette.tsx +0 -59
- package/src/palette/PaletteDialog.tsx +0 -186
- package/src/palette/PaletteProvider.tsx +0 -149
- package/src/palette/PaletteRows.tsx +0 -208
- package/src/palette/app-sources.ts +0 -62
- package/src/palette/headless/app-sources.ts +0 -515
- package/src/palette/headless/gather.ts +0 -50
- package/src/palette/headless/host.ts +0 -129
- package/src/palette/headless/index.ts +0 -15
- package/src/palette/headless/labels.ts +0 -124
- package/src/palette/headless/rank-protocol.ts +0 -23
- package/src/palette/headless/recents.ts +0 -35
- package/src/palette/headless/session-sources.ts +0 -218
- package/src/palette/headless/sources.ts +0 -313
- package/src/palette/headless/store.ts +0 -105
- package/src/palette/index.ts +0 -17
- package/src/palette/rank.worker.ts +0 -30
- package/src/palette/setup.ts +0 -19
- package/src/palette/testing/contract.ts +0 -250
- package/src/palette/testing/index.ts +0 -152
- package/src/palette/useConversationSearch.ts +0 -115
- package/src/palette/usePaletteController.ts +0 -229
- package/src/palette/useRankedItems.ts +0 -122
- package/src/path.ts +0 -199
- package/src/server/demo-tools.ts +0 -34
- package/src/server/environment.ts +0 -118
- package/src/server/index.ts +0 -7
- package/src/server/scripted-provider.ts +0 -174
- package/src/server/sse-handler.ts +0 -457
- package/src/server/testing/index.ts +0 -7
- package/src/session/ArtifactRowChips.tsx +0 -260
- package/src/session/ArtifactsPanel.tsx +0 -426
- package/src/session/DiffFileTree.tsx +0 -173
- package/src/session/PanelAttention.tsx +0 -131
- package/src/session/ProjectHome.tsx +0 -733
- package/src/session/ProviderUsageProvider.tsx +0 -113
- package/src/session/QueueTab.tsx +0 -669
- package/src/session/RunningWorkDialog.tsx +0 -178
- package/src/session/SessionCacheFacts.tsx +0 -190
- package/src/session/SessionDetailsDialog.tsx +0 -627
- package/src/session/SessionHeader.tsx +0 -242
- package/src/session/SessionProvider.tsx +0 -98
- package/src/session/SessionShell.tsx +0 -77
- package/src/session/SideChat.tsx +0 -320
- package/src/session/TodoList.tsx +0 -123
- package/src/session/TodosPanel.tsx +0 -279
- package/src/session/TurnDetailsDialog.tsx +0 -299
- package/src/session/UsagePanel.tsx +0 -358
- package/src/session/WelcomeScreen.tsx +0 -88
- package/src/session/headless/artifacts.ts +0 -101
- package/src/session/headless/diff-tree.ts +0 -167
- package/src/session/headless/fixture-host.ts +0 -362
- package/src/session/headless/home-layout.ts +0 -276
- package/src/session/headless/host.ts +0 -263
- package/src/session/headless/index.ts +0 -23
- package/src/session/headless/keyed.ts +0 -72
- package/src/session/headless/labels.ts +0 -337
- package/src/session/headless/queue-attachments.ts +0 -73
- package/src/session/headless/queue.ts +0 -122
- package/src/session/headless/running-work.ts +0 -85
- package/src/session/headless/session-actions.ts +0 -198
- package/src/session/headless/session-diffs.ts +0 -136
- package/src/session/headless/side.ts +0 -63
- package/src/session/headless/todos.ts +0 -62
- package/src/session/headless/usage-format.ts +0 -19
- package/src/session/headless/usage.ts +0 -407
- package/src/session/index.ts +0 -31
- package/src/session/modal-shell.tsx +0 -24
- package/src/session/testing/contract.ts +0 -588
- package/src/session/testing/demo.ts +0 -224
- package/src/session/testing/index.ts +0 -7
- package/src/session/useSessionLabels.ts +0 -14
- package/src/session/useUsageSummary.ts +0 -82
- package/src/settings/SettingsHeadingText.tsx +0 -54
- package/src/settings/SettingsHostSwitcher.tsx +0 -93
- package/src/settings/SettingsNav.tsx +0 -198
- package/src/settings/SettingsProvider.tsx +0 -127
- package/src/settings/SettingsRowsPage.tsx +0 -218
- package/src/settings/SettingsShell.tsx +0 -337
- package/src/settings/SettingsTutorial.tsx +0 -55
- package/src/settings/headless/catalog.ts +0 -570
- package/src/settings/headless/claude-import.ts +0 -61
- package/src/settings/headless/enabled.ts +0 -44
- package/src/settings/headless/fixture-accounts.ts +0 -260
- package/src/settings/headless/fixture-host.ts +0 -162
- package/src/settings/headless/fixture-models.ts +0 -51
- package/src/settings/headless/fixture-performance.ts +0 -350
- package/src/settings/headless/fixture-sections.ts +0 -391
- package/src/settings/headless/host.ts +0 -127
- package/src/settings/headless/index.ts +0 -22
- package/src/settings/headless/labels.ts +0 -63
- package/src/settings/headless/layout-sections.ts +0 -41
- package/src/settings/headless/layout.ts +0 -732
- package/src/settings/headless/mcp.ts +0 -319
- package/src/settings/headless/models.ts +0 -51
- package/src/settings/headless/page-counts.ts +0 -40
- package/src/settings/headless/performance.ts +0 -524
- package/src/settings/headless/providers.ts +0 -117
- package/src/settings/headless/registry.ts +0 -62
- package/src/settings/headless/resource.ts +0 -75
- package/src/settings/headless/search.ts +0 -142
- package/src/settings/headless/sections-host.ts +0 -340
- package/src/settings/index.ts +0 -32
- package/src/settings/rows.tsx +0 -152
- package/src/settings/section.tsx +0 -165
- package/src/settings/sections/appearance/AppearanceSection.tsx +0 -667
- package/src/settings/sections/appearance/labels.ts +0 -77
- package/src/settings/sections/claude-import/ClaudeImportDialog.tsx +0 -258
- package/src/settings/sections/claude-import/labels.ts +0 -42
- package/src/settings/sections/claude-import/use-claude-import-available.ts +0 -35
- package/src/settings/sections/descriptors.tsx +0 -261
- package/src/settings/sections/editor/EditorSection.tsx +0 -521
- package/src/settings/sections/editor/labels.ts +0 -84
- package/src/settings/sections/enabled-list/EnabledListSection.tsx +0 -112
- package/src/settings/sections/enabled-list/labels.ts +0 -37
- package/src/settings/sections/environments/EnvironmentsSection.tsx +0 -549
- package/src/settings/sections/environments/labels.ts +0 -31
- package/src/settings/sections/extensions/ChangeOriginDialog.tsx +0 -218
- package/src/settings/sections/extensions/CreateExtensionDialog.tsx +0 -210
- package/src/settings/sections/extensions/ExtensionConfigRows.tsx +0 -508
- package/src/settings/sections/extensions/ExtensionOptionsSection.tsx +0 -356
- package/src/settings/sections/extensions/ExtensionPicksBar.tsx +0 -112
- package/src/settings/sections/extensions/ExtensionSourceBrowser.tsx +0 -244
- package/src/settings/sections/extensions/ExtensionsSection.tsx +0 -665
- package/src/settings/sections/extensions/create-labels.ts +0 -31
- package/src/settings/sections/extensions/labels.ts +0 -64
- package/src/settings/sections/extensions/options-labels.ts +0 -34
- package/src/settings/sections/host-catalog/HostCatalogSection.tsx +0 -457
- package/src/settings/sections/host-catalog/labels.ts +0 -44
- package/src/settings/sections/index.ts +0 -60
- package/src/settings/sections/instructions/InstructionsSection.tsx +0 -385
- package/src/settings/sections/instructions/labels.ts +0 -33
- package/src/settings/sections/keybindings/KeybindingsSection.tsx +0 -124
- package/src/settings/sections/keybindings/labels.ts +0 -72
- package/src/settings/sections/keybindings/rows.ts +0 -103
- package/src/settings/sections/logs/LogsSection.tsx +0 -153
- package/src/settings/sections/logs/labels.ts +0 -20
- package/src/settings/sections/mcp/McpAddForm.tsx +0 -245
- package/src/settings/sections/mcp/McpSection.tsx +0 -358
- package/src/settings/sections/mcp/McpServerRow.tsx +0 -404
- package/src/settings/sections/mcp/labels.ts +0 -193
- package/src/settings/sections/models/AgentDefaults.tsx +0 -365
- package/src/settings/sections/models/ModelListPicker.tsx +0 -265
- package/src/settings/sections/models/ModelPickField.tsx +0 -220
- package/src/settings/sections/models/ModelRows.tsx +0 -381
- package/src/settings/sections/models/SpacesDefaultsSection.tsx +0 -102
- package/src/settings/sections/models/labels.ts +0 -119
- package/src/settings/sections/models/model-test.tsx +0 -125
- package/src/settings/sections/performance/PerfSparkline.tsx +0 -64
- package/src/settings/sections/performance/PerformanceHud.tsx +0 -110
- package/src/settings/sections/performance/PerformanceSection.tsx +0 -770
- package/src/settings/sections/performance/labels.ts +0 -114
- package/src/settings/sections/performance/use-perf-monitor.ts +0 -26
- package/src/settings/sections/plugins/PluginsSection.tsx +0 -151
- package/src/settings/sections/plugins/labels.ts +0 -23
- package/src/settings/sections/providers/CredentialSources.tsx +0 -237
- package/src/settings/sections/providers/ProvidersSection.tsx +0 -389
- package/src/settings/sections/providers/ServerProvidersSection.tsx +0 -244
- package/src/settings/sections/providers/ServerSignIn.tsx +0 -137
- package/src/settings/sections/providers/labels.ts +0 -160
- package/src/settings/sections/shared/catalog.tsx +0 -265
- package/src/settings/sections/shared/labels.ts +0 -31
- package/src/settings/sections/skills/SkillList.tsx +0 -494
- package/src/settings/sections/skills/SkillsSection.tsx +0 -249
- package/src/settings/sections/skills/labels.ts +0 -54
- package/src/settings/sections/use-section-labels.ts +0 -10
- package/src/settings/testing/accounts-demo.ts +0 -110
- package/src/settings/testing/accounts.contract.ts +0 -319
- package/src/settings/testing/claude-import.contract.ts +0 -93
- package/src/settings/testing/contract.ts +0 -192
- package/src/settings/testing/extension-options.contract.ts +0 -163
- package/src/settings/testing/index.ts +0 -11
- package/src/settings/testing/models.contract.ts +0 -135
- package/src/settings/testing/performance.contract.ts +0 -219
- package/src/settings/testing/sections.contract.ts +0 -306
- package/src/terminal/HostTerminalSurface.tsx +0 -917
- package/src/terminal/TerminalDrawer.tsx +0 -228
- package/src/terminal/TerminalPanel.tsx +0 -740
- package/src/terminal/TerminalProvider.tsx +0 -201
- package/src/terminal/TerminalSurface.tsx +0 -262
- package/src/terminal/box-glyphs.ts +0 -333
- package/src/terminal/ghostty.ts +0 -116
- package/src/terminal/grid-size.ts +0 -46
- package/src/terminal/headless/fixture-host.ts +0 -250
- package/src/terminal/headless/host.ts +0 -99
- package/src/terminal/headless/index.ts +0 -11
- package/src/terminal/headless/labels.ts +0 -69
- package/src/terminal/headless/layout.ts +0 -57
- package/src/terminal/headless/links.ts +0 -227
- package/src/terminal/headless/order.ts +0 -28
- package/src/terminal/headless/output-cursor.ts +0 -66
- package/src/terminal/headless/recent.ts +0 -20
- package/src/terminal/headless/replay.ts +0 -45
- package/src/terminal/headless/scope.ts +0 -60
- package/src/terminal/headless/store.ts +0 -637
- package/src/terminal/index.ts +0 -40
- package/src/terminal/keys.ts +0 -34
- package/src/terminal/testing/contract.ts +0 -274
- package/src/terminal/testing/demo.ts +0 -40
- package/src/terminal/testing/index.ts +0 -7
- package/src/terminal/theme.ts +0 -110
- package/src/terminal/useTerminalLabels.ts +0 -14
- package/src/theme/accents.ts +0 -46
- package/src/theme/color.ts +0 -450
- package/src/theme/css-vars.ts +0 -187
- package/src/theme/derive.ts +0 -700
- package/src/theme/from-theme.ts +0 -52
- package/src/theme/stylesheet.ts +0 -55
- package/src/theme/themes.ts +0 -767
- package/src/theme/without-transitions.ts +0 -18
- package/src/uno.ts +0 -167
- package/src/workspace/LayoutBudget.tsx +0 -143
- package/src/workspace/PanelContentView.tsx +0 -523
- package/src/workspace/PanelCorner.tsx +0 -111
- package/src/workspace/PanelGroups.tsx +0 -264
- package/src/workspace/PanelHome.tsx +0 -71
- package/src/workspace/PanelItems.tsx +0 -368
- package/src/workspace/PanelStrip.tsx +0 -316
- package/src/workspace/SidePanel.tsx +0 -240
- package/src/workspace/TabParking.tsx +0 -120
- package/src/workspace/WorkspaceProvider.tsx +0 -558
- package/src/workspace/dnd/engine.ts +0 -371
- package/src/workspace/dnd/hooks.ts +0 -72
- package/src/workspace/dnd/index.ts +0 -57
- package/src/workspace/dnd/parking.tsx +0 -181
- package/src/workspace/extension-tabs.tsx +0 -174
- package/src/workspace/frame-motion.ts +0 -160
- package/src/workspace/headless/contents.ts +0 -125
- package/src/workspace/headless/host.ts +0 -129
- package/src/workspace/headless/index.ts +0 -33
- package/src/workspace/headless/labels.ts +0 -44
- package/src/workspace/headless/layout-memory.ts +0 -649
- package/src/workspace/headless/layouts.ts +0 -224
- package/src/workspace/headless/open-target.ts +0 -125
- package/src/workspace/headless/ops.ts +0 -163
- package/src/workspace/headless/panel-focus.ts +0 -58
- package/src/workspace/headless/panel-tree.ts +0 -259
- package/src/workspace/headless/resolve.ts +0 -146
- package/src/workspace/headless/reveal-at.ts +0 -27
- package/src/workspace/headless/strip-drop.ts +0 -81
- package/src/workspace/headless/tree.ts +0 -480
- package/src/workspace/headless/view.ts +0 -164
- package/src/workspace/index.ts +0 -23
- package/src/workspace/panel-group-keys.ts +0 -36
- package/src/workspace/panel-visibility.ts +0 -28
- package/src/workspace/tab-scopes.ts +0 -245
- package/src/workspace/testing/contract.ts +0 -282
- package/src/workspace/testing/index.ts +0 -140
- package/src/workspace/use-split-drag.ts +0 -73
- package/src/workspace/useScopeLayout.ts +0 -26
- package/src/workspace/useViewport.ts +0 -22
- package/src/workspace/useWorkspaceLabels.ts +0 -14
- package/src/workspace/workspace-key-commands.ts +0 -108
- /package/dist/dist/{types-bDQagoiL.d.ts → types-2HrgolQz.d.ts} +0 -0
|
@@ -1,413 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Attachment-ingest helpers, shared by the kit's `Composer` and the desktop
|
|
3
|
-
* app's own composers: reading a file in through the shared rule
|
|
4
|
-
* (`planAttachment`), the paste-folding rule and text previews, unit-tested
|
|
5
|
-
* in isolation.
|
|
6
|
-
*
|
|
7
|
-
* Touches no React APIs. DOM use is limited to `FileReader` / `crypto`, and
|
|
8
|
-
* to an image element and a canvas when an image needs converting.
|
|
9
|
-
*/
|
|
10
|
-
import {
|
|
11
|
-
ATTACHMENT_SNIFF_BYTES,
|
|
12
|
-
type AttachmentRefusal,
|
|
13
|
-
formatBytes,
|
|
14
|
-
MAX_IMAGE_ATTACHMENT_BYTES,
|
|
15
|
-
planAttachment,
|
|
16
|
-
} from 'zidane/chat/pure';
|
|
17
|
-
|
|
18
|
-
import type { ComposerAttachment } from '../headless/composer/host';
|
|
19
|
-
import type { ChatAttachment } from '../headless/host';
|
|
20
|
-
import type { ChatLabels } from '../headless/labels';
|
|
21
|
-
|
|
22
|
-
export type { ComposerAttachment };
|
|
23
|
-
|
|
24
|
-
export { formatBytes, MAX_FILE_ATTACHMENT_BYTES, MAX_IMAGE_ATTACHMENT_BYTES } from 'zidane/chat/pure';
|
|
25
|
-
|
|
26
|
-
/** A file {@link readAttachment} did not attach, and why. */
|
|
27
|
-
export class AttachmentRefusedError extends Error {
|
|
28
|
-
constructor(
|
|
29
|
-
/** The file's name, for the notice. */
|
|
30
|
-
readonly fileName: string,
|
|
31
|
-
/** Why it was refused (`empty`, `too-large` with the size and limit, …). */
|
|
32
|
-
readonly refusal: AttachmentRefusal,
|
|
33
|
-
) {
|
|
34
|
-
super(`Attachment refused (${refusal.reason}): ${fileName}`);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* The sentence a composer shows for a file it did not attach.
|
|
40
|
-
*
|
|
41
|
-
* @param fileName - The file's name.
|
|
42
|
-
* @param error - What {@link readAttachment} rejected with.
|
|
43
|
-
* @param labels - The chat labels to word it with.
|
|
44
|
-
*/
|
|
45
|
-
export function attachmentErrorText(fileName: string, error: unknown, labels: ChatLabels): string {
|
|
46
|
-
if (!(error instanceof AttachmentRefusedError)) return labels.attachmentReadFailed(fileName);
|
|
47
|
-
const { refusal } = error;
|
|
48
|
-
switch (refusal.reason) {
|
|
49
|
-
case 'empty':
|
|
50
|
-
return labels.attachmentEmpty(fileName);
|
|
51
|
-
case 'too-large':
|
|
52
|
-
return labels.attachmentTooLarge(fileName, formatBytes(refusal.size), formatBytes(refusal.limit));
|
|
53
|
-
case 'export-pdf':
|
|
54
|
-
return labels.attachmentExportPdf(fileName);
|
|
55
|
-
case 'unreadable-image':
|
|
56
|
-
return labels.attachmentUnreadableImage(fileName);
|
|
57
|
-
case 'unsupported':
|
|
58
|
-
return labels.attachmentUnsupported(fileName);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* A PDF attachment: previewed in the browser's own PDF viewer.
|
|
64
|
-
*
|
|
65
|
-
* @param att - The attachment; only its media type is read.
|
|
66
|
-
*/
|
|
67
|
-
export function isPdfAttachment(att: Pick<ChatAttachment, 'mediaType'>): boolean {
|
|
68
|
-
return att.mediaType.toLowerCase() === 'application/pdf';
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
/**
|
|
72
|
-
* Line threshold above which a multiline paste folds into a `.txt`
|
|
73
|
-
* attachment. It matches the TUI (`planTextPaste` in src/tui/prompt/paste.ts
|
|
74
|
-
* uses `lines.length > 10` after trimming leading and trailing blank lines).
|
|
75
|
-
* Short multiline pastes (stack traces, paragraphs) stay inline so the
|
|
76
|
-
* user can edit them; anything longer arrives at the model as a
|
|
77
|
-
* discrete document part instead of a wall of prompt text.
|
|
78
|
-
*/
|
|
79
|
-
export const PASTE_FOLD_LINE_THRESHOLD = 10;
|
|
80
|
-
|
|
81
|
-
/**
|
|
82
|
-
* Character ceiling for SINGLE-line (or few-line) pastes. In the GUI a
|
|
83
|
-
* 50 KB one-liner soft-wraps into a screenful of editor, so a paste of
|
|
84
|
-
* this many characters folds too. The TUI's own ceiling is higher
|
|
85
|
-
* (`PASTE_INLINE_MAX_CHARS` in src/tui/prompt/paste.ts, 10,000).
|
|
86
|
-
*/
|
|
87
|
-
export const PASTE_FOLD_CHAR_THRESHOLD = 4092;
|
|
88
|
-
|
|
89
|
-
/**
|
|
90
|
-
* Should a plain-text paste become a `.txt` attachment chip instead of
|
|
91
|
-
* inline editor text? Mirrors the TUI's rule (line count after CRLF
|
|
92
|
-
* normalisation + trim) with a lower character ceiling on top.
|
|
93
|
-
*
|
|
94
|
-
* @param text - The pasted plain text.
|
|
95
|
-
*/
|
|
96
|
-
export function shouldFoldPasteToAttachment(text: string): boolean {
|
|
97
|
-
if (text.length >= PASTE_FOLD_CHAR_THRESHOLD) {
|
|
98
|
-
return true;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
return text.replace(/\r\n?/g, '\n').trim().split('\n').length > PASTE_FOLD_LINE_THRESHOLD;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
* Reads a file into a {@link ComposerAttachment} with a `data:` URL, as the
|
|
106
|
-
* shared rule says (`planAttachment`): images, PDFs and text attach; an image
|
|
107
|
-
* in another format, or over the image cap, is re-encoded to fit. Rejects with
|
|
108
|
-
* an {@link AttachmentRefusedError} for a file the rule refuses (or an image
|
|
109
|
-
* that cannot be decoded), and with the read error when the file cannot be read.
|
|
110
|
-
*
|
|
111
|
-
* @param file - The file the user pasted, dropped, or picked.
|
|
112
|
-
*/
|
|
113
|
-
export async function readAttachment(file: File): Promise<ComposerAttachment> {
|
|
114
|
-
const name = file.name || 'pasted-image.png';
|
|
115
|
-
const head = new TextDecoder().decode(await file.slice(0, ATTACHMENT_SNIFF_BYTES).arrayBuffer());
|
|
116
|
-
const plan = planAttachment({ name, mediaType: file.type, size: file.size, head });
|
|
117
|
-
if (plan.kind === 'refuse') throw new AttachmentRefusedError(name, plan);
|
|
118
|
-
if (plan.kind === 'convert-image') {
|
|
119
|
-
const converted = await convertImage(file, plan.mediaType).catch(() => null);
|
|
120
|
-
if (!converted) throw new AttachmentRefusedError(name, { reason: 'unreadable-image' });
|
|
121
|
-
return toComposerAttachment(converted, renameForType(name, converted.type), converted.type);
|
|
122
|
-
}
|
|
123
|
-
return toComposerAttachment(file, name, plan.mediaType);
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
/** The data URL's header carries `mediaType`: the send path reads the type from there. */
|
|
127
|
-
async function toComposerAttachment(blob: Blob, name: string, mediaType: string): Promise<ComposerAttachment> {
|
|
128
|
-
const typed = blob.type === mediaType ? blob : new Blob([blob], { type: mediaType });
|
|
129
|
-
const dataUrl = await new Promise<string>((resolve, reject) => {
|
|
130
|
-
const reader = new FileReader();
|
|
131
|
-
reader.onload = () => resolve(reader.result as string);
|
|
132
|
-
reader.onerror = () => reject(reader.error);
|
|
133
|
-
reader.readAsDataURL(typed);
|
|
134
|
-
});
|
|
135
|
-
return { id: crypto.randomUUID(), name, mediaType, dataUrl, size: typed.size };
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
/** Largest edge a converted image keeps (Anthropic's ceiling). */
|
|
139
|
-
const MAX_IMAGE_EDGE = 8000;
|
|
140
|
-
|
|
141
|
-
/**
|
|
142
|
-
* Decode an image and encode it again, as PNG (JPEG for a JPEG: a photo grows
|
|
143
|
-
* as PNG), scaled down until it fits the image cap. An animated GIF or WebP
|
|
144
|
-
* keeps its first frame. Rejects when the image cannot be decoded (HEIC and
|
|
145
|
-
* TIFF in Chromium) or there is no DOM to draw it in.
|
|
146
|
-
*/
|
|
147
|
-
async function convertImage(file: Blob, sourceType: string): Promise<Blob> {
|
|
148
|
-
const url = URL.createObjectURL(file);
|
|
149
|
-
try {
|
|
150
|
-
const image = new Image();
|
|
151
|
-
image.src = url;
|
|
152
|
-
await image.decode();
|
|
153
|
-
// An SVG without a size of its own has none.
|
|
154
|
-
const width = image.naturalWidth || 1024;
|
|
155
|
-
const height = image.naturalHeight || 1024;
|
|
156
|
-
const type = sourceType === 'image/jpeg' ? 'image/jpeg' : 'image/png';
|
|
157
|
-
let scale = Math.min(1, MAX_IMAGE_EDGE / Math.max(width, height));
|
|
158
|
-
for (let attempt = 0; attempt < 6; attempt += 1) {
|
|
159
|
-
const canvas = document.createElement('canvas');
|
|
160
|
-
canvas.width = Math.max(1, Math.round(width * scale));
|
|
161
|
-
canvas.height = Math.max(1, Math.round(height * scale));
|
|
162
|
-
const context = canvas.getContext('2d');
|
|
163
|
-
if (!context) throw new Error('No 2D canvas');
|
|
164
|
-
context.drawImage(image, 0, 0, canvas.width, canvas.height);
|
|
165
|
-
const blob = await new Promise<Blob | null>((resolve) => canvas.toBlob(resolve, type, 0.9));
|
|
166
|
-
if (!blob) throw new Error('Image encoding failed');
|
|
167
|
-
if (blob.size <= MAX_IMAGE_ATTACHMENT_BYTES) return blob;
|
|
168
|
-
// Bytes grow with the area: shrink both edges by the square root of the overshoot, and a bit more.
|
|
169
|
-
scale *= Math.min(0.9, Math.sqrt(MAX_IMAGE_ATTACHMENT_BYTES / blob.size) * 0.95);
|
|
170
|
-
}
|
|
171
|
-
throw new Error('Image does not fit the cap');
|
|
172
|
-
} finally {
|
|
173
|
-
URL.revokeObjectURL(url);
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
/** `scan.heic` re-encoded as PNG is `scan.png`. */
|
|
178
|
-
function renameForType(name: string, type: string): string {
|
|
179
|
-
const ext = type === 'image/jpeg' ? 'jpg' : 'png';
|
|
180
|
-
const dot = name.lastIndexOf('.');
|
|
181
|
-
const current = dot > 0 ? name.slice(dot + 1).toLowerCase() : '';
|
|
182
|
-
if (current === ext || (ext === 'jpg' && current === 'jpeg')) return name;
|
|
183
|
-
return `${dot > 0 ? name.slice(0, dot) : name}.${ext}`;
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
/**
|
|
187
|
-
* Map an attachment to a Shiki language id. Extension wins; falls back
|
|
188
|
-
* to MIME hints (`+json`, `+xml`, `text/markdown`); unknown →
|
|
189
|
-
* `plaintext` so the preview still renders, just without colour.
|
|
190
|
-
*
|
|
191
|
-
* @param att - The attachment's `name` and `mediaType`.
|
|
192
|
-
*/
|
|
193
|
-
export function detectLanguage(att: Pick<ChatAttachment, 'mediaType' | 'name'>): string {
|
|
194
|
-
const name = att.name.toLowerCase();
|
|
195
|
-
const dot = name.lastIndexOf('.');
|
|
196
|
-
const ext = dot >= 0 ? name.slice(dot + 1) : name;
|
|
197
|
-
|
|
198
|
-
const byExt: Record<string, string> = {
|
|
199
|
-
ts: 'ts',
|
|
200
|
-
tsx: 'tsx',
|
|
201
|
-
js: 'js',
|
|
202
|
-
jsx: 'jsx',
|
|
203
|
-
mjs: 'js',
|
|
204
|
-
cjs: 'js',
|
|
205
|
-
json: 'json',
|
|
206
|
-
jsonc: 'jsonc',
|
|
207
|
-
md: 'md',
|
|
208
|
-
markdown: 'md',
|
|
209
|
-
yaml: 'yaml',
|
|
210
|
-
yml: 'yaml',
|
|
211
|
-
toml: 'toml',
|
|
212
|
-
xml: 'xml',
|
|
213
|
-
html: 'html',
|
|
214
|
-
htm: 'html',
|
|
215
|
-
css: 'css',
|
|
216
|
-
scss: 'scss',
|
|
217
|
-
sass: 'sass',
|
|
218
|
-
less: 'less',
|
|
219
|
-
py: 'python',
|
|
220
|
-
rb: 'ruby',
|
|
221
|
-
go: 'go',
|
|
222
|
-
rs: 'rust',
|
|
223
|
-
java: 'java',
|
|
224
|
-
c: 'c',
|
|
225
|
-
h: 'c',
|
|
226
|
-
cc: 'cpp',
|
|
227
|
-
cpp: 'cpp',
|
|
228
|
-
hpp: 'cpp',
|
|
229
|
-
cs: 'csharp',
|
|
230
|
-
swift: 'swift',
|
|
231
|
-
kt: 'kotlin',
|
|
232
|
-
kts: 'kotlin',
|
|
233
|
-
sh: 'bash',
|
|
234
|
-
bash: 'bash',
|
|
235
|
-
zsh: 'bash',
|
|
236
|
-
fish: 'fish',
|
|
237
|
-
sql: 'sql',
|
|
238
|
-
vue: 'vue',
|
|
239
|
-
svelte: 'svelte',
|
|
240
|
-
dockerfile: 'docker',
|
|
241
|
-
ini: 'ini',
|
|
242
|
-
cfg: 'ini',
|
|
243
|
-
conf: 'ini',
|
|
244
|
-
env: 'bash',
|
|
245
|
-
csv: 'csv',
|
|
246
|
-
};
|
|
247
|
-
|
|
248
|
-
if (name === 'dockerfile' || name.endsWith('/dockerfile')) {
|
|
249
|
-
return 'docker';
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
if (byExt[ext]) {
|
|
253
|
-
return byExt[ext];
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
const mime = att.mediaType.toLowerCase();
|
|
257
|
-
|
|
258
|
-
if (mime === 'application/json' || mime.endsWith('+json')) {
|
|
259
|
-
return 'json';
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
if (mime === 'application/xml' || mime.endsWith('+xml')) {
|
|
263
|
-
return 'xml';
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
if (mime === 'text/markdown') {
|
|
267
|
-
return 'md';
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
if (mime === 'text/html') {
|
|
271
|
-
return 'html';
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
if (mime === 'text/css') {
|
|
275
|
-
return 'css';
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
if (mime === 'application/javascript' || mime === 'text/javascript') {
|
|
279
|
-
return 'js';
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
return 'plaintext';
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
/**
|
|
286
|
-
* Treat as text any attachment whose MIME is in the `text/*` family,
|
|
287
|
-
* or one of the structured-text types we routinely encounter (JSON,
|
|
288
|
-
* XML, common script languages that browsers tag as `application/*`).
|
|
289
|
-
* Falls back to an extension allowlist for files the OS picker
|
|
290
|
-
* presents without a MIME — extensionless dotfiles and a handful of
|
|
291
|
-
* common code extensions land here so the preview is useful.
|
|
292
|
-
*
|
|
293
|
-
* @param att - The attachment's `name` and `mediaType`.
|
|
294
|
-
*/
|
|
295
|
-
export function isTextLike(att: Pick<ChatAttachment, 'mediaType' | 'name'>): boolean {
|
|
296
|
-
const mime = att.mediaType.toLowerCase();
|
|
297
|
-
|
|
298
|
-
if (mime.startsWith('text/')) {
|
|
299
|
-
return true;
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
if (
|
|
303
|
-
mime === 'application/json' ||
|
|
304
|
-
mime === 'application/xml' ||
|
|
305
|
-
mime === 'application/javascript' ||
|
|
306
|
-
mime === 'application/typescript' ||
|
|
307
|
-
mime.endsWith('+json') ||
|
|
308
|
-
mime.endsWith('+xml')
|
|
309
|
-
) {
|
|
310
|
-
return true;
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
const name = att.name.toLowerCase();
|
|
314
|
-
const dot = name.lastIndexOf('.');
|
|
315
|
-
const ext = dot >= 0 ? name.slice(dot + 1) : '';
|
|
316
|
-
const TEXT_EXTS = new Set([
|
|
317
|
-
'txt',
|
|
318
|
-
'md',
|
|
319
|
-
'markdown',
|
|
320
|
-
'json',
|
|
321
|
-
'jsonc',
|
|
322
|
-
'yaml',
|
|
323
|
-
'yml',
|
|
324
|
-
'toml',
|
|
325
|
-
'xml',
|
|
326
|
-
'csv',
|
|
327
|
-
'tsv',
|
|
328
|
-
'log',
|
|
329
|
-
'ini',
|
|
330
|
-
'cfg',
|
|
331
|
-
'conf',
|
|
332
|
-
'env',
|
|
333
|
-
'js',
|
|
334
|
-
'jsx',
|
|
335
|
-
'ts',
|
|
336
|
-
'tsx',
|
|
337
|
-
'mjs',
|
|
338
|
-
'cjs',
|
|
339
|
-
'py',
|
|
340
|
-
'rb',
|
|
341
|
-
'go',
|
|
342
|
-
'rs',
|
|
343
|
-
'java',
|
|
344
|
-
'c',
|
|
345
|
-
'h',
|
|
346
|
-
'cc',
|
|
347
|
-
'cpp',
|
|
348
|
-
'hpp',
|
|
349
|
-
'cs',
|
|
350
|
-
'swift',
|
|
351
|
-
'kt',
|
|
352
|
-
'kts',
|
|
353
|
-
'sh',
|
|
354
|
-
'bash',
|
|
355
|
-
'zsh',
|
|
356
|
-
'fish',
|
|
357
|
-
'sql',
|
|
358
|
-
'html',
|
|
359
|
-
'htm',
|
|
360
|
-
'css',
|
|
361
|
-
'scss',
|
|
362
|
-
'sass',
|
|
363
|
-
'less',
|
|
364
|
-
'vue',
|
|
365
|
-
'svelte',
|
|
366
|
-
'gitignore',
|
|
367
|
-
'gitattributes',
|
|
368
|
-
'dockerfile',
|
|
369
|
-
'editorconfig',
|
|
370
|
-
'lock',
|
|
371
|
-
]);
|
|
372
|
-
|
|
373
|
-
return TEXT_EXTS.has(ext) || (ext === '' && name.startsWith('.'));
|
|
374
|
-
}
|
|
375
|
-
|
|
376
|
-
/**
|
|
377
|
-
* Decodes a `data:` URL's payload as UTF-8 text. Returns an empty string when the URL has no payload and a placeholder message when decoding fails.
|
|
378
|
-
*
|
|
379
|
-
* @param dataUrl - The `data:` URL to decode.
|
|
380
|
-
*/
|
|
381
|
-
export function decodeDataUrlAsText(dataUrl: string): string {
|
|
382
|
-
try {
|
|
383
|
-
const commaIndex = dataUrl.indexOf(',');
|
|
384
|
-
|
|
385
|
-
if (commaIndex === -1) {
|
|
386
|
-
return '';
|
|
387
|
-
}
|
|
388
|
-
|
|
389
|
-
const header = dataUrl.slice(0, commaIndex);
|
|
390
|
-
const payload = dataUrl.slice(commaIndex + 1);
|
|
391
|
-
|
|
392
|
-
if (header.includes(';base64')) {
|
|
393
|
-
const binary = atob(payload);
|
|
394
|
-
const bytes = new Uint8Array(binary.length);
|
|
395
|
-
|
|
396
|
-
for (let i = 0; i < binary.length; i += 1) {
|
|
397
|
-
bytes[i] = binary.charCodeAt(i);
|
|
398
|
-
}
|
|
399
|
-
|
|
400
|
-
return new TextDecoder('utf-8', { fatal: false }).decode(bytes);
|
|
401
|
-
}
|
|
402
|
-
|
|
403
|
-
return decodeURIComponent(payload);
|
|
404
|
-
} catch {
|
|
405
|
-
return '[Unable to decode file as text]';
|
|
406
|
-
}
|
|
407
|
-
}
|
|
408
|
-
|
|
409
|
-
/** ISO-stamped filename for a paste-as-attachment write. */
|
|
410
|
-
export function pastedTextFilename(): string {
|
|
411
|
-
const stamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19);
|
|
412
|
-
return `pasted-${stamp}.txt`;
|
|
413
|
-
}
|
|
@@ -1,176 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The composer's staged attachments: one 80px tile each (an image thumbnail,
|
|
3
|
-
* or a file's icon over its name), a remove button on hover or focus, and the gallery the kit's Lightbox opens from a tile.
|
|
4
|
-
* The desktop app's tiles, in look; its Shiki previews stay in the app (text
|
|
5
|
-
* previews here are plain). Also the notice about files the composer refused.
|
|
6
|
-
*/
|
|
7
|
-
import type { ComponentType, CSSProperties, ReactNode } from 'react';
|
|
8
|
-
|
|
9
|
-
import { IconButton } from '../../components/IconButton';
|
|
10
|
-
import type { LightboxItem } from '../../components/Lightbox';
|
|
11
|
-
import { PdfPreview } from '../PdfPreview';
|
|
12
|
-
import { TextPreview } from '../TextPreview';
|
|
13
|
-
import { type TextPreviewSlotProps, useTranscriptRenderers } from '../transcript/renderers';
|
|
14
|
-
import { AttachmentIcon } from '../transcript/prompt';
|
|
15
|
-
import { useChatLabels } from '../useChatLabels';
|
|
16
|
-
import { type ComposerAttachment, formatBytes, isPdfAttachment, isTextLike } from './attachment-ingest';
|
|
17
|
-
|
|
18
|
-
// Images and files share one box, so a mixed row stays even.
|
|
19
|
-
const TILE = 'zg-tray border-0 rounded-zg-md w-20 h-20';
|
|
20
|
-
const FILE_TILE = `${TILE} flex flex-col items-center justify-center gap-1.5 px-1.5 py-2 overflow-hidden`;
|
|
21
|
-
|
|
22
|
-
const isImage = (att: ComposerAttachment) => att.mediaType.startsWith('image/');
|
|
23
|
-
|
|
24
|
-
/** A file tile that opens a preview: text, or a PDF. */
|
|
25
|
-
const isPreviewableFile = (att: ComposerAttachment) => isTextLike(att) || isPdfAttachment(att);
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Every previewable attachment as one gallery: images, PDFs in the browser's viewer, and text as its decoded preview.
|
|
29
|
-
*
|
|
30
|
-
* @param attachments - The composer's attachments. Images, PDFs and text-like files are included; other files are skipped.
|
|
31
|
-
* @param Preview - What a text file opens as (default: the kit's `TextPreview`).
|
|
32
|
-
*/
|
|
33
|
-
export function attachmentLightboxItems(
|
|
34
|
-
attachments: readonly ComposerAttachment[],
|
|
35
|
-
Preview: ComponentType<TextPreviewSlotProps> = TextPreview,
|
|
36
|
-
): LightboxItem[] {
|
|
37
|
-
return attachments
|
|
38
|
-
.filter((att) => isImage(att) || isPreviewableFile(att))
|
|
39
|
-
.map<LightboxItem>((att) =>
|
|
40
|
-
isImage(att)
|
|
41
|
-
? { key: att.id, name: att.name, src: att.dataUrl }
|
|
42
|
-
: isPdfAttachment(att)
|
|
43
|
-
? { key: att.id, name: att.name, body: () => <PdfPreview src={att.dataUrl} name={att.name} /> }
|
|
44
|
-
: {
|
|
45
|
-
key: att.id,
|
|
46
|
-
name: att.name,
|
|
47
|
-
body: () => <Preview name={att.name} mediaType={att.mediaType} size={att.size} src={att.dataUrl} />,
|
|
48
|
-
},
|
|
49
|
-
);
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
/** Props for {@link AttachmentNotices}. */
|
|
53
|
-
export interface AttachmentNoticesProps {
|
|
54
|
-
/** One sentence per refused file. */
|
|
55
|
-
notices: readonly string[];
|
|
56
|
-
/** Called when the user closes the notice. */
|
|
57
|
-
onDismiss(): void;
|
|
58
|
-
/** Where it sits. Default: inset in the composer card, above the tiles. */
|
|
59
|
-
className?: string;
|
|
60
|
-
/** Inline styles on the root element, merged after the component's own. */
|
|
61
|
-
style?: CSSProperties;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* The files the composer just refused, one line each, until dismissed. Nothing renders without any.
|
|
66
|
-
*
|
|
67
|
-
* @param props - The `notices` to show, `onDismiss`, called by the close button, and an optional `className`.
|
|
68
|
-
*/
|
|
69
|
-
export function AttachmentNotices({ notices, onDismiss, className = 'mx-2 mb-2', style }: AttachmentNoticesProps) {
|
|
70
|
-
const labels = useChatLabels();
|
|
71
|
-
if (notices.length === 0) return null;
|
|
72
|
-
return (
|
|
73
|
-
<div
|
|
74
|
-
role="status"
|
|
75
|
-
aria-label={labels.attachmentNotices}
|
|
76
|
-
className={`zg-tray flex items-start gap-2 pl-2.5 pr-1 py-1 rounded-zg-md text-zg-label text-[var(--zg-text)] ${className}`}
|
|
77
|
-
style={style}
|
|
78
|
-
data-testid="attachment-notices"
|
|
79
|
-
>
|
|
80
|
-
<span aria-hidden className="i-ph-warning-circle shrink-0 mt-[5px] text-zg-danger" />
|
|
81
|
-
<div className="flex-1 min-w-0 flex flex-col py-[3px]">
|
|
82
|
-
{notices.map((notice) => (
|
|
83
|
-
<span key={notice} className="break-words">
|
|
84
|
-
{notice}
|
|
85
|
-
</span>
|
|
86
|
-
))}
|
|
87
|
-
</div>
|
|
88
|
-
<IconButton icon="i-ph-x" label={labels.dismiss} size="sm" onClick={onDismiss} />
|
|
89
|
-
</div>
|
|
90
|
-
);
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
/** Props for {@link AttachmentTiles}. */
|
|
94
|
-
export interface AttachmentTilesProps {
|
|
95
|
-
/** The attachments to show. With none, nothing renders. */
|
|
96
|
-
attachments: readonly ComposerAttachment[];
|
|
97
|
-
/** Called with the attachment id when the user removes a tile. */
|
|
98
|
-
onRemove(id: string): void;
|
|
99
|
-
/** Called with the attachment id and the clicked element when the user opens a preview. Only images, PDFs and text-like files can be opened. */
|
|
100
|
-
onOpen(id: string, origin: HTMLElement): void;
|
|
101
|
-
/** Extra classes on the root element. */
|
|
102
|
-
className?: string;
|
|
103
|
-
/** Inline styles on the root element, merged after the component's own. */
|
|
104
|
-
style?: CSSProperties;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
/**
|
|
108
|
-
* Renders the composer's attachments as a row of tiles: image thumbnails and file tiles, each with a remove button.
|
|
109
|
-
*
|
|
110
|
-
* @param props - Tiles props: `attachments`, `onRemove`, and `onOpen`.
|
|
111
|
-
*/
|
|
112
|
-
export function AttachmentTiles({ attachments, onRemove, onOpen, className, style }: AttachmentTilesProps) {
|
|
113
|
-
const labels = useChatLabels();
|
|
114
|
-
const { attachmentLabel } = useTranscriptRenderers();
|
|
115
|
-
if (attachments.length === 0) return null;
|
|
116
|
-
return (
|
|
117
|
-
<ul
|
|
118
|
-
className={['zg-composer-attachments list-none p-0', className].filter(Boolean).join(' ')}
|
|
119
|
-
style={style}
|
|
120
|
-
aria-label={labels.attachments}
|
|
121
|
-
>
|
|
122
|
-
{attachments.map((att) => {
|
|
123
|
-
const parts = attachmentLabel(att.name);
|
|
124
|
-
return (
|
|
125
|
-
<li key={att.id} className="zg-composer-attachment" data-testid="composer-attachment">
|
|
126
|
-
{isImage(att) ? (
|
|
127
|
-
<button
|
|
128
|
-
type="button"
|
|
129
|
-
onClick={(e) => onOpen(att.id, e.currentTarget)}
|
|
130
|
-
aria-label={labels.viewAttachment(att.name)}
|
|
131
|
-
className={`${TILE} zg-focus-ring block p-0 overflow-hidden cursor-zoom-in`}
|
|
132
|
-
>
|
|
133
|
-
<img src={att.dataUrl} alt="" className="w-full h-full object-cover" />
|
|
134
|
-
</button>
|
|
135
|
-
) : isPreviewableFile(att) ? (
|
|
136
|
-
<button
|
|
137
|
-
type="button"
|
|
138
|
-
onClick={(e) => onOpen(att.id, e.currentTarget)}
|
|
139
|
-
aria-label={labels.viewAttachment(att.name)}
|
|
140
|
-
title={labels.attachmentTitle(att.name, formatBytes(att.size))}
|
|
141
|
-
className={`${FILE_TILE} zg-focus-ring cursor-zoom-in`}
|
|
142
|
-
>
|
|
143
|
-
<FileFace name={parts.name} icon={<AttachmentIcon parts={parts} className="text-lg" />} />
|
|
144
|
-
</button>
|
|
145
|
-
) : (
|
|
146
|
-
// Nothing to preview: a plain tile, not a button that would offer a view it cannot give.
|
|
147
|
-
<div title={labels.attachmentTitle(att.name, formatBytes(att.size))} className={FILE_TILE}>
|
|
148
|
-
<FileFace name={parts.name} icon={<AttachmentIcon parts={parts} className="text-lg" />} />
|
|
149
|
-
</div>
|
|
150
|
-
)}
|
|
151
|
-
<button
|
|
152
|
-
type="button"
|
|
153
|
-
onClick={() => onRemove(att.id)}
|
|
154
|
-
aria-label={labels.removeAttachment(att.name)}
|
|
155
|
-
className="zg-composer-attachment-remove zg-raised border absolute -top-1.5 -right-1.5 w-5 h-5 p-0 rounded-full flex items-center justify-center text-[var(--zg-text-muted)] hover:text-[var(--zg-text)] cursor-pointer"
|
|
156
|
-
>
|
|
157
|
-
<span aria-hidden className="i-ph-x text-xs" />
|
|
158
|
-
</button>
|
|
159
|
-
</li>
|
|
160
|
-
);
|
|
161
|
-
})}
|
|
162
|
-
</ul>
|
|
163
|
-
);
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
/** A file tile's face: the icon, then the name on up to two lines (a long name breaks anywhere). */
|
|
167
|
-
function FileFace({ name, icon }: { name: string; icon: ReactNode }) {
|
|
168
|
-
return (
|
|
169
|
-
<>
|
|
170
|
-
{icon}
|
|
171
|
-
<span className="zg-line-clamp-2 max-w-full text-center text-zg-meta leading-tight break-all text-[var(--zg-text)]">
|
|
172
|
-
{name}
|
|
173
|
-
</span>
|
|
174
|
-
</>
|
|
175
|
-
);
|
|
176
|
-
}
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The order of the composer's badges (`ComposerBadges`): each badge's
|
|
3
|
-
* default slot (`order`, lower first), and the order the user dragged,
|
|
4
|
-
* stored by the app as a list of ids. React-free.
|
|
5
|
-
*
|
|
6
|
-
* The saved list only permutes the badges it names: a badge it does not
|
|
7
|
-
* name (new since the user last moved one) shows at its default slot, so a
|
|
8
|
-
* request that just arrived is never sent to the end of the strip.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
/** What ordering needs of a badge: its id and its default slot. */
|
|
12
|
-
export interface OrderedBadge {
|
|
13
|
-
/** Stable id of the badge. */
|
|
14
|
-
id: string;
|
|
15
|
-
/** Default left-to-right slot, lower first. Default 100. */
|
|
16
|
-
order?: number;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
/** The default slot of a badge without an `order`. */
|
|
20
|
-
export const DEFAULT_BADGE_ORDER = 100;
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Badges in the order to show them: sorted by `order` (stable for ties),
|
|
24
|
-
* then the saved order applied over the slots of the badges it names.
|
|
25
|
-
*
|
|
26
|
-
* @param badges - The badges to show, in any order.
|
|
27
|
-
* @param saved - The user's order, as ids (stale and unknown ids are ignored).
|
|
28
|
-
* @returns A new array, in display order.
|
|
29
|
-
*/
|
|
30
|
-
export function orderComposerBadges<T extends OrderedBadge>(badges: readonly T[], saved: readonly string[] = []): T[] {
|
|
31
|
-
const sorted = badges
|
|
32
|
-
.map((badge, index) => ({ badge, index }))
|
|
33
|
-
.sort(
|
|
34
|
-
(a, b) => (a.badge.order ?? DEFAULT_BADGE_ORDER) - (b.badge.order ?? DEFAULT_BADGE_ORDER) || a.index - b.index,
|
|
35
|
-
)
|
|
36
|
-
.map(({ badge }) => badge);
|
|
37
|
-
if (saved.length === 0) return sorted;
|
|
38
|
-
const rank = new Map(saved.map((id, i) => [id, i] as const));
|
|
39
|
-
const named = sorted.filter((b) => rank.has(b.id)).sort((a, b) => rank.get(a.id)! - rank.get(b.id)!);
|
|
40
|
-
let next = 0;
|
|
41
|
-
return sorted.map((badge) => (rank.has(badge.id) ? named[next++]! : badge));
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* The order to save after the user moved badges: the order shown now, with
|
|
46
|
-
* each saved id that is not shown kept right after the shown badge it
|
|
47
|
-
* followed, so it comes back in its place.
|
|
48
|
-
*
|
|
49
|
-
* @param saved - The order saved so far.
|
|
50
|
-
* @param shown - Every badge shown, in the new order.
|
|
51
|
-
* @returns The order to save.
|
|
52
|
-
*/
|
|
53
|
-
export function mergeBadgeOrder(saved: readonly string[], shown: readonly string[]): string[] {
|
|
54
|
-
const visible = new Set(shown);
|
|
55
|
-
// Hidden ids, grouped under the shown id they followed (`null`: before any).
|
|
56
|
-
const after = new Map<string | null, string[]>();
|
|
57
|
-
let anchor: string | null = null;
|
|
58
|
-
for (const id of saved) {
|
|
59
|
-
if (visible.has(id)) anchor = id;
|
|
60
|
-
else after.set(anchor, [...(after.get(anchor) ?? []), id]);
|
|
61
|
-
}
|
|
62
|
-
const out = [...(after.get(null) ?? [])];
|
|
63
|
-
for (const id of new Set(shown)) out.push(id, ...(after.get(id) ?? []));
|
|
64
|
-
return out;
|
|
65
|
-
}
|