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,731 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The app's modal layer: a single-slot overlay paired with a `useModal()` hook.
|
|
3
|
-
*
|
|
4
|
-
* Single-slot contract: only one modal is open at a time; opening a
|
|
5
|
-
* second modal replaces the first; `Escape` or scrim click closes the
|
|
6
|
-
* active modal. An app's keyboard handler can call `modal.isOpen`
|
|
7
|
-
* to suppress global shortcuts while a modal owns input.
|
|
8
|
-
*
|
|
9
|
-
* Two presentations share the slot: `dialog` (scrim + centred panel, the
|
|
10
|
-
* default) and `screen` (a full-window layer, used by Settings). Both count
|
|
11
|
-
* as "open" for every guard, both mark the background inert, both close on
|
|
12
|
-
* Escape, so a surface can switch presentation without touching callers.
|
|
13
|
-
*
|
|
14
|
-
* The modal body is rendered inline (not in a Portal): there are no overflow
|
|
15
|
-
* boundaries to escape, and theme tokens reach it naturally.
|
|
16
|
-
*
|
|
17
|
-
* Per-modal `aria-labelledby` is wired via the `MODAL_TITLE_ID` contract
|
|
18
|
-
* exported below: every modal content shell sets `id={MODAL_TITLE_ID}` on
|
|
19
|
-
* its title element, and the scrim references it back via `aria-labelledby`.
|
|
20
|
-
*
|
|
21
|
-
* One stacked layer sits above the slot (`openLayer`): a short dialog such
|
|
22
|
-
* as a confirm that must not replace the surface it was asked from (Settings,
|
|
23
|
-
* session details). Esc, a scrim click and closing the slot all dismiss it.
|
|
24
|
-
*
|
|
25
|
-
* Window chrome: a desktop app whose window draws native controls over the
|
|
26
|
-
* page (macOS traffic lights) passes `chromeInset`, the band `ScreenShell`
|
|
27
|
-
* keeps clear, in device-independent pixels (divided by `--zg-zoom` when the
|
|
28
|
-
* app sets it).
|
|
29
|
-
*/
|
|
30
|
-
import {
|
|
31
|
-
createContext,
|
|
32
|
-
useCallback,
|
|
33
|
-
useContext,
|
|
34
|
-
useEffect,
|
|
35
|
-
useLayoutEffect,
|
|
36
|
-
useMemo,
|
|
37
|
-
useRef,
|
|
38
|
-
useState,
|
|
39
|
-
type CSSProperties,
|
|
40
|
-
type ReactNode,
|
|
41
|
-
} from 'react';
|
|
42
|
-
|
|
43
|
-
import { AnimatePresence, motion, useIsPresent } from 'motion/react';
|
|
44
|
-
import { useAppearanceState } from '../appearance/AppearanceProvider';
|
|
45
|
-
import { buttonClass } from '../components/button';
|
|
46
|
-
import { ErrorBoundary, ErrorDetails, type ErrorFallbackProps } from '../components/ErrorBoundary';
|
|
47
|
-
import { IconButton } from '../components/IconButton';
|
|
48
|
-
import { Keycap } from '../components/Keycap';
|
|
49
|
-
import { useLabels } from '../labels';
|
|
50
|
-
import { useWithFade } from '../motion/springs';
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* Stable id contract — every `<ModalShell>` stamps this id onto its
|
|
54
|
-
* title `<h2>` so the scrim can reference it via `aria-labelledby`.
|
|
55
|
-
* Only one modal is open at a time, so a static id is collision-free.
|
|
56
|
-
*/
|
|
57
|
-
export const MODAL_TITLE_ID = 'zg-modal-title';
|
|
58
|
-
|
|
59
|
-
/** How the slot presents its surface: a centred dialog over a scrim, or the whole window. */
|
|
60
|
-
export type ModalVariant = 'dialog' | 'screen';
|
|
61
|
-
|
|
62
|
-
/** Options of {@link ModalContextValue.openLayer}. */
|
|
63
|
-
export interface LayerOptions {
|
|
64
|
-
/** Called when the layer is dismissed from outside (Esc, scrim, slot closed, replaced). */
|
|
65
|
-
onDismiss: () => void;
|
|
66
|
-
/** Id of the layer's own title element. */
|
|
67
|
-
labelledBy: string;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
/** Options of {@link ModalContextValue.open}. */
|
|
71
|
-
export interface ModalOpenOptions {
|
|
72
|
-
/** `dialog` (default) or `screen`. */
|
|
73
|
-
variant?: ModalVariant;
|
|
74
|
-
/** Names the surface, so it can tell "still mine" ({@link ModalContextValue.activeId}) and close only itself. */
|
|
75
|
-
id?: string;
|
|
76
|
-
/**
|
|
77
|
-
* The dialog scrim: `blur` (default) frosts the window behind a dialog you
|
|
78
|
-
* stay in; `dim` only darkens it, for a quick surface (the palette) that
|
|
79
|
-
* comes and goes with a key and must never cost a frame.
|
|
80
|
-
*/
|
|
81
|
-
scrim?: ModalScrimKind;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
/** The dialog scrim: `blur` frosts the window behind, `dim` only darkens it. */
|
|
85
|
-
export type ModalScrimKind = 'blur' | 'dim';
|
|
86
|
-
|
|
87
|
-
interface ModalSlot {
|
|
88
|
-
node: ReactNode;
|
|
89
|
-
variant: ModalVariant;
|
|
90
|
-
id: string | null;
|
|
91
|
-
scrim: ModalScrimKind;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
/** What {@link useModal} returns. */
|
|
95
|
-
export interface ModalContextValue {
|
|
96
|
-
/** A slot surface or a stacked layer is up. */
|
|
97
|
-
isOpen: boolean;
|
|
98
|
-
/**
|
|
99
|
-
* Whose surface fills the slot. Callers that pass `id` on `open` can tell
|
|
100
|
-
* "still mine" from "replaced by another modal" without relying on an
|
|
101
|
-
* unmount, which StrictMode simulates in development.
|
|
102
|
-
*/
|
|
103
|
-
activeId: string | null;
|
|
104
|
-
/** Show `node` in the slot, replacing what is there. */
|
|
105
|
-
open: (node: ReactNode, options?: ModalOpenOptions) => void;
|
|
106
|
-
/** Close the slot; with `id`, only while that surface still owns it (a self-close). */
|
|
107
|
-
close: (id?: string) => void;
|
|
108
|
-
/**
|
|
109
|
-
* What Esc and a scrim click call instead of `close` (a shell registers its `onClose`); `null` clears it.
|
|
110
|
-
* With `owner`, `null` clears only while `owner` is still the handler: a surface that leaves after the
|
|
111
|
-
* next one registered never clears that one's.
|
|
112
|
-
*/
|
|
113
|
-
setDismissHandler: (handler: (() => void) | null, owner?: () => void) => void;
|
|
114
|
-
/** Shows `node` above the current slot without replacing it. */
|
|
115
|
-
openLayer: (node: ReactNode, options: LayerOptions) => void;
|
|
116
|
-
/** Removes the layer without calling its `onDismiss`. */
|
|
117
|
-
closeLayer: () => void;
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
const ModalContext = createContext<ModalContextValue | null>(null);
|
|
121
|
-
|
|
122
|
-
/** The band native window chrome covers, in device-independent pixels. */
|
|
123
|
-
export interface ModalChromeInset {
|
|
124
|
-
/** Height of the top band (the traffic lights' row). */
|
|
125
|
-
top: number;
|
|
126
|
-
/** Width kept clear at the start of that band; 0 for none. */
|
|
127
|
-
leading: number;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
const NO_CHROME: ModalChromeInset = { top: 44, leading: 0 };
|
|
131
|
-
const ChromeContext = createContext<ModalChromeInset>(NO_CHROME);
|
|
132
|
-
|
|
133
|
-
/** A length in device-independent pixels, constant on screen under page zoom (`--zg-zoom`, 1 without it). */
|
|
134
|
-
const chromePx = (dip: number) => `calc(${dip}px / var(--zg-zoom, 1))`;
|
|
135
|
-
|
|
136
|
-
/** Props for {@link ModalProvider}. */
|
|
137
|
-
export interface ModalProviderProps {
|
|
138
|
-
/** Native window chrome over the page; absent: a 44px band with nothing to keep clear. */
|
|
139
|
-
chromeInset?: ModalChromeInset;
|
|
140
|
-
/** The app: inert while a modal is open. */
|
|
141
|
-
children: ReactNode;
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
/**
|
|
145
|
-
* Holds the modal slot and its stacked layer, and renders them above `children` (see the top of this file).
|
|
146
|
-
*
|
|
147
|
-
* @param props - The `children` and an optional `chromeInset`.
|
|
148
|
-
*/
|
|
149
|
-
export function ModalProvider({ chromeInset = NO_CHROME, children }: ModalProviderProps) {
|
|
150
|
-
const [slot, setSlot] = useState<ModalSlot | null>(null);
|
|
151
|
-
const content = slot?.node ?? null;
|
|
152
|
-
const dismissHandlerRef = useRef<(() => void) | null>(null);
|
|
153
|
-
const [layer, setLayer] = useState<({ node: ReactNode } & LayerOptions) | null>(null);
|
|
154
|
-
// Kept in step by every setter below (each assigns it before `setLayer`).
|
|
155
|
-
const layerRef = useRef(layer);
|
|
156
|
-
const dismissLayer = useCallback(() => {
|
|
157
|
-
const current = layerRef.current;
|
|
158
|
-
if (current) {
|
|
159
|
-
layerRef.current = null;
|
|
160
|
-
setLayer(null);
|
|
161
|
-
current.onDismiss();
|
|
162
|
-
}
|
|
163
|
-
}, []);
|
|
164
|
-
const openLayer = useCallback(
|
|
165
|
-
(node: ReactNode, options: LayerOptions) => {
|
|
166
|
-
dismissLayer();
|
|
167
|
-
const next = { node, ...options };
|
|
168
|
-
layerRef.current = next;
|
|
169
|
-
setLayer(next);
|
|
170
|
-
},
|
|
171
|
-
[dismissLayer],
|
|
172
|
-
);
|
|
173
|
-
const closeLayer = useCallback(() => {
|
|
174
|
-
layerRef.current = null;
|
|
175
|
-
setLayer(null);
|
|
176
|
-
}, []);
|
|
177
|
-
|
|
178
|
-
/*
|
|
179
|
-
* Exit presence is motion's (`AnimatePresence` below): a closed surface
|
|
180
|
-
* stays mounted while it animates out (`data-state="closing"`), then goes.
|
|
181
|
-
* Surfaces are keyed by variant, so opening anything while one is leaving
|
|
182
|
-
* takes the slot back in place.
|
|
183
|
-
*/
|
|
184
|
-
const slotRef = useRef(slot);
|
|
185
|
-
// The committed slot, for `close` to tell a stale self-close (read in callbacks only).
|
|
186
|
-
// eslint-disable-next-line react-hooks/refs
|
|
187
|
-
slotRef.current = slot;
|
|
188
|
-
const open = useCallback(
|
|
189
|
-
(node: ReactNode, options?: ModalOpenOptions) => {
|
|
190
|
-
dismissLayer();
|
|
191
|
-
setSlot({
|
|
192
|
-
node,
|
|
193
|
-
variant: options?.variant ?? 'dialog',
|
|
194
|
-
id: options?.id ?? null,
|
|
195
|
-
scrim: options?.scrim ?? 'blur',
|
|
196
|
-
});
|
|
197
|
-
},
|
|
198
|
-
[dismissLayer],
|
|
199
|
-
);
|
|
200
|
-
const close = useCallback(
|
|
201
|
-
(id?: unknown) => {
|
|
202
|
-
// A surface closing ITSELF names its id: once another modal has taken the
|
|
203
|
-
// slot (its leaving copy is still animating out), that close is stale.
|
|
204
|
-
// Only a string counts: `onClose={modal.close}` hands an event here.
|
|
205
|
-
if (typeof id === 'string' && slotRef.current?.id !== id) return;
|
|
206
|
-
dismissLayer();
|
|
207
|
-
setSlot(null);
|
|
208
|
-
},
|
|
209
|
-
[dismissLayer],
|
|
210
|
-
);
|
|
211
|
-
const setDismissHandler = useCallback((handler: (() => void) | null, owner?: () => void) => {
|
|
212
|
-
if (handler === null && owner !== undefined && dismissHandlerRef.current !== owner) return;
|
|
213
|
-
dismissHandlerRef.current = handler;
|
|
214
|
-
}, []);
|
|
215
|
-
const dismiss = useCallback(() => {
|
|
216
|
-
if (dismissHandlerRef.current) {
|
|
217
|
-
dismissHandlerRef.current();
|
|
218
|
-
return;
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
close();
|
|
222
|
-
}, [close]);
|
|
223
|
-
|
|
224
|
-
/*
|
|
225
|
-
* Global Esc handler — captured at the document level so the active
|
|
226
|
-
* modal always gets first dibs on Escape regardless of which element
|
|
227
|
-
* currently has focus. A layout effect: it is in place in the commit that
|
|
228
|
-
* shows the modal, so an Esc pressed as soon as it is on screen reaches it.
|
|
229
|
-
*/
|
|
230
|
-
useLayoutEffect(() => {
|
|
231
|
-
if (!content && !layer) {
|
|
232
|
-
return;
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
const onKey = (event: KeyboardEvent) => {
|
|
236
|
-
if (event.key === 'Escape') {
|
|
237
|
-
event.preventDefault();
|
|
238
|
-
if (layerRef.current) {
|
|
239
|
-
dismissLayer();
|
|
240
|
-
return;
|
|
241
|
-
}
|
|
242
|
-
dismiss();
|
|
243
|
-
}
|
|
244
|
-
};
|
|
245
|
-
document.addEventListener('keydown', onKey);
|
|
246
|
-
|
|
247
|
-
return () => document.removeEventListener('keydown', onKey);
|
|
248
|
-
}, [content, layer, dismiss, dismissLayer]);
|
|
249
|
-
|
|
250
|
-
const isOpen = content !== null || layer !== null;
|
|
251
|
-
/*
|
|
252
|
-
* Inert restyles the whole background (Chromium recomputes every element's
|
|
253
|
-
* style under it), so it lands a frame after the modal paints instead of
|
|
254
|
-
* in that frame. Focus is in the modal by then; the scrim takes the pointer.
|
|
255
|
-
*/
|
|
256
|
-
const [backgroundInert, setBackgroundInert] = useState(false);
|
|
257
|
-
useEffect(() => {
|
|
258
|
-
if (!isOpen) return undefined;
|
|
259
|
-
let live = true;
|
|
260
|
-
requestAnimationFrame(() => requestAnimationFrame(() => live && setBackgroundInert(true)));
|
|
261
|
-
return () => {
|
|
262
|
-
live = false;
|
|
263
|
-
setBackgroundInert(false);
|
|
264
|
-
};
|
|
265
|
-
}, [isOpen]);
|
|
266
|
-
|
|
267
|
-
const value = useMemo<ModalContextValue>(
|
|
268
|
-
() => ({ isOpen, activeId: slot?.id ?? null, open, close, setDismissHandler, openLayer, closeLayer }),
|
|
269
|
-
[isOpen, slot?.id, open, close, setDismissHandler, openLayer, closeLayer],
|
|
270
|
-
);
|
|
271
|
-
|
|
272
|
-
return (
|
|
273
|
-
<ChromeContext.Provider value={chromeInset}>
|
|
274
|
-
<ModalContext.Provider value={value}>
|
|
275
|
-
{/*
|
|
276
|
-
* `inert` while a modal is open — the ROOT gate for every background
|
|
277
|
-
* input path. Window-level keydown handlers gate themselves on
|
|
278
|
-
* `modal.isOpen`, but that can't stop NATIVE activation: focus stays
|
|
279
|
-
* on (or Tabs to) background buttons behind the scrim, where
|
|
280
|
-
* Enter/Space click them directly (e.g. a sidebar session row —
|
|
281
|
-
* switching the conversation under an open Settings modal). Inert
|
|
282
|
-
* removes the whole background subtree from focus/click/tab order in
|
|
283
|
-
* one place instead of per-widget gates. `display: contents` keeps
|
|
284
|
-
* the wrapper out of layout.
|
|
285
|
-
*
|
|
286
|
-
* ENGINE DEPENDENCY: `inert` on a `display: contents` element has
|
|
287
|
-
* had inconsistent Chromium/WebKit behavior historically. The
|
|
288
|
-
* settings.test.ts e2e regression ("conversations don't switch
|
|
289
|
-
* while Settings is open") is the CANARY — if an Electron upgrade
|
|
290
|
-
* breaks it, move `inert` onto a real block wrapper instead.
|
|
291
|
-
* Side effect, accepted: background text selection is disabled
|
|
292
|
-
* while any modal (incl. ask_user interactions) is open.
|
|
293
|
-
*/}
|
|
294
|
-
<div className="contents" inert={isOpen && backgroundInert}>
|
|
295
|
-
{children}
|
|
296
|
-
</div>
|
|
297
|
-
<AnimatePresence>
|
|
298
|
-
{slot?.variant === 'dialog' && (
|
|
299
|
-
<ModalScrim key="dialog" covered={layer !== null} kind={slot.scrim} onDismiss={dismiss}>
|
|
300
|
-
<ErrorBoundary
|
|
301
|
-
region="Dialog"
|
|
302
|
-
resetKey={slot.node}
|
|
303
|
-
fallback={(props) => <ModalCrash {...props} onClose={close} />}
|
|
304
|
-
>
|
|
305
|
-
{slot.node}
|
|
306
|
-
</ErrorBoundary>
|
|
307
|
-
</ModalScrim>
|
|
308
|
-
)}
|
|
309
|
-
{slot?.variant === 'screen' && (
|
|
310
|
-
<ModalScreen key="screen" covered={layer !== null}>
|
|
311
|
-
<ErrorBoundary
|
|
312
|
-
region="Screen"
|
|
313
|
-
resetKey={slot.node}
|
|
314
|
-
fallback={(props) => (
|
|
315
|
-
<div className="flex w-full h-full items-center justify-center">
|
|
316
|
-
<ModalCrash {...props} onClose={close} />
|
|
317
|
-
</div>
|
|
318
|
-
)}
|
|
319
|
-
>
|
|
320
|
-
{slot.node}
|
|
321
|
-
</ErrorBoundary>
|
|
322
|
-
</ModalScreen>
|
|
323
|
-
)}
|
|
324
|
-
</AnimatePresence>
|
|
325
|
-
<AnimatePresence>
|
|
326
|
-
{layer && (
|
|
327
|
-
<ModalScrim key="layer" onDismiss={dismissLayer} labelledBy={layer.labelledBy}>
|
|
328
|
-
<ErrorBoundary
|
|
329
|
-
region="Dialog"
|
|
330
|
-
resetKey={layer.node}
|
|
331
|
-
fallback={(props) => <ModalCrash {...props} onClose={dismissLayer} titleId={layer.labelledBy} />}
|
|
332
|
-
>
|
|
333
|
-
{layer.node}
|
|
334
|
-
</ErrorBoundary>
|
|
335
|
-
</ModalScrim>
|
|
336
|
-
)}
|
|
337
|
-
</AnimatePresence>
|
|
338
|
-
</ModalContext.Provider>
|
|
339
|
-
</ChromeContext.Provider>
|
|
340
|
-
);
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
/**
|
|
344
|
-
* A modal that threw: the same panel and Esc / scrim / close, with the
|
|
345
|
-
* message, so the user is never left with a scrim over nothing. Not
|
|
346
|
-
* `ModalShell`: that one takes the slot's dismiss handler, which belongs to
|
|
347
|
-
* the slot even when the crash is in the stacked layer.
|
|
348
|
-
*/
|
|
349
|
-
function ModalCrash({
|
|
350
|
-
error,
|
|
351
|
-
componentStack,
|
|
352
|
-
reset,
|
|
353
|
-
onClose,
|
|
354
|
-
titleId = MODAL_TITLE_ID,
|
|
355
|
-
}: ErrorFallbackProps & { onClose: () => void; titleId?: string }) {
|
|
356
|
-
const labels = useLabels();
|
|
357
|
-
return (
|
|
358
|
-
// eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions -- keeps a press inside the panel from the scrim
|
|
359
|
-
<div
|
|
360
|
-
role="alert"
|
|
361
|
-
data-zg-error-boundary="modal"
|
|
362
|
-
className="zg-modal-panel zg-float w-[480px] max-w-[92vw] max-h-[85vh] flex flex-col overflow-hidden"
|
|
363
|
-
onMouseDown={(event) => event.stopPropagation()}
|
|
364
|
-
>
|
|
365
|
-
<header className="flex items-start gap-2 px-5 py-3.5 border-b border-[var(--zg-hairline)]">
|
|
366
|
-
<h2 id={titleId} className="flex-1 min-w-0 self-center text-sm font-semibold text-[var(--zg-text)] m-0">
|
|
367
|
-
{labels.modalFailed}
|
|
368
|
-
</h2>
|
|
369
|
-
<IconButton icon="i-ph-x" label={labels.close} size="lg" onClick={onClose} className="-mr-2" />
|
|
370
|
-
</header>
|
|
371
|
-
<div className="flex-1 min-h-0 overflow-y-auto px-5 py-4 text-zg-label text-[var(--zg-text-muted)]">
|
|
372
|
-
<ErrorDetails error={error} componentStack={componentStack} />
|
|
373
|
-
</div>
|
|
374
|
-
<footer className="shrink-0 flex justify-end gap-2 px-5 py-3 bg-[var(--zg-tray)]">
|
|
375
|
-
<button type="button" className={buttonClass({ size: 'sm' })} onClick={reset}>
|
|
376
|
-
{labels.errorTryAgain}
|
|
377
|
-
</button>
|
|
378
|
-
<button type="button" className={buttonClass({ size: 'sm', variant: 'primary' })} onClick={onClose}>
|
|
379
|
-
{labels.close}
|
|
380
|
-
</button>
|
|
381
|
-
</footer>
|
|
382
|
-
</div>
|
|
383
|
-
);
|
|
384
|
-
}
|
|
385
|
-
|
|
386
|
-
/** The modal layer, or `null` outside a {@link ModalProvider} (a component that can do without it). */
|
|
387
|
-
export function useOptionalModal(): ModalContextValue | null {
|
|
388
|
-
return useContext(ModalContext);
|
|
389
|
-
}
|
|
390
|
-
|
|
391
|
-
/** The modal layer of the nearest {@link ModalProvider}; throws outside one. */
|
|
392
|
-
export function useModal(): ModalContextValue {
|
|
393
|
-
const ctx = useContext(ModalContext);
|
|
394
|
-
|
|
395
|
-
if (!ctx) {
|
|
396
|
-
throw new Error('useModal must be used within ModalProvider');
|
|
397
|
-
}
|
|
398
|
-
|
|
399
|
-
return ctx;
|
|
400
|
-
}
|
|
401
|
-
|
|
402
|
-
/*
|
|
403
|
-
* ---------------------------------------------------------------------------
|
|
404
|
-
* Presentational helpers — Scrim + ModalShell
|
|
405
|
-
* ---------------------------------------------------------------------------
|
|
406
|
-
*/
|
|
407
|
-
|
|
408
|
-
/*
|
|
409
|
-
* Enter is CSS on the shared curves (the scrim fades on `fade`, the screen
|
|
410
|
-
* moves on `panel` and the caller's `.zg-modal-panel` on `pop`, each fading on
|
|
411
|
-
* `fade`): the opening frame runs no animation JS, so opening stays within a
|
|
412
|
-
* frame. Exit is motion's: AnimatePresence keeps the surface mounted (inert,
|
|
413
|
-
* `data-state="closing"`) while it leaves on `exit` + `fade-out`; with motion
|
|
414
|
-
* off both are instant.
|
|
415
|
-
*/
|
|
416
|
-
function ModalScrim({
|
|
417
|
-
onDismiss,
|
|
418
|
-
covered = false,
|
|
419
|
-
kind = 'blur',
|
|
420
|
-
labelledBy = MODAL_TITLE_ID,
|
|
421
|
-
children,
|
|
422
|
-
}: {
|
|
423
|
-
onDismiss: () => void;
|
|
424
|
-
kind?: ModalScrimKind;
|
|
425
|
-
/** A stacked layer is open above; this one waits, inert. */
|
|
426
|
-
covered?: boolean;
|
|
427
|
-
labelledBy?: string;
|
|
428
|
-
children: ReactNode;
|
|
429
|
-
}) {
|
|
430
|
-
const closing = !useIsPresent();
|
|
431
|
-
const exit = useWithFade('exit');
|
|
432
|
-
return (
|
|
433
|
-
<motion.div
|
|
434
|
-
// Enter is CSS (`zg-fade-in` on `fade`): no JS on the opening frame.
|
|
435
|
-
initial={false}
|
|
436
|
-
exit={{ opacity: 0, transition: exit }}
|
|
437
|
-
className="zg-modal-scrim"
|
|
438
|
-
data-scrim={kind}
|
|
439
|
-
data-state={closing ? 'closing' : 'open'}
|
|
440
|
-
inert={closing || covered}
|
|
441
|
-
role="dialog"
|
|
442
|
-
aria-modal="true"
|
|
443
|
-
aria-labelledby={labelledBy}
|
|
444
|
-
onMouseDown={(event) => {
|
|
445
|
-
/*
|
|
446
|
-
* Click on the backdrop only — clicks inside the modal body shouldn't
|
|
447
|
-
* dismiss. Compare currentTarget so child clicks (which bubble up)
|
|
448
|
-
* don't accidentally trigger close.
|
|
449
|
-
*/
|
|
450
|
-
if (event.target === event.currentTarget) {
|
|
451
|
-
onDismiss();
|
|
452
|
-
}
|
|
453
|
-
}}
|
|
454
|
-
>
|
|
455
|
-
{children}
|
|
456
|
-
</motion.div>
|
|
457
|
-
);
|
|
458
|
-
}
|
|
459
|
-
|
|
460
|
-
/**
|
|
461
|
-
* Full-window layer for the `screen` variant. No scrim, no click-outside:
|
|
462
|
-
* the surface IS the window until Escape / its own back button closes it.
|
|
463
|
-
*/
|
|
464
|
-
function ModalScreen({ covered = false, children }: { covered?: boolean; children: ReactNode }) {
|
|
465
|
-
const closing = !useIsPresent();
|
|
466
|
-
const exit = useWithFade('exit');
|
|
467
|
-
return (
|
|
468
|
-
<motion.div
|
|
469
|
-
// Enter is CSS (`zg-screen-in` on `panel` + `zg-fade-in`); motion owns the exit.
|
|
470
|
-
initial={false}
|
|
471
|
-
exit={{ opacity: 0, scale: 0.99, transition: exit }}
|
|
472
|
-
className="zg-modal-screen"
|
|
473
|
-
data-state={closing ? 'closing' : 'open'}
|
|
474
|
-
inert={closing || covered}
|
|
475
|
-
role="dialog"
|
|
476
|
-
aria-modal="true"
|
|
477
|
-
aria-labelledby={MODAL_TITLE_ID}
|
|
478
|
-
>
|
|
479
|
-
{children}
|
|
480
|
-
</motion.div>
|
|
481
|
-
);
|
|
482
|
-
}
|
|
483
|
-
|
|
484
|
-
/** Props for {@link ModalShell}. */
|
|
485
|
-
export interface ModalShellProps {
|
|
486
|
-
/** Plain string for most modals; a ReactNode lets a modal animate its own
|
|
487
|
-
heading content (Settings crossfades the active tab's label in place). */
|
|
488
|
-
title: ReactNode;
|
|
489
|
-
/** A line under the title. */
|
|
490
|
-
description?: ReactNode;
|
|
491
|
-
/** The close button and Esc. */
|
|
492
|
-
onClose: () => void;
|
|
493
|
-
|
|
494
|
-
/**
|
|
495
|
-
* Optional back-navigation handler. When set, the header renders a
|
|
496
|
-
* chevron-left button to the left of the title. Used by the surfaces
|
|
497
|
-
* Settings opens (Safelist, the Claude Code import) so the sub-modal can
|
|
498
|
-
* return to Settings instead of dead-ending on close. `onClose` is still
|
|
499
|
-
* called for the X button and Esc.
|
|
500
|
-
*/
|
|
501
|
-
onBack?: () => void;
|
|
502
|
-
|
|
503
|
-
/** Optional element rendered in the bottom-right corner (e.g. primary action). */
|
|
504
|
-
footer?: ReactNode;
|
|
505
|
-
/** The body. */
|
|
506
|
-
children: ReactNode;
|
|
507
|
-
|
|
508
|
-
/**
|
|
509
|
-
* Size preset, by panel width: `medium` 560px for forms / pickers;
|
|
510
|
-
* `large` 760px for content-rich surfaces (the model picker, the
|
|
511
|
-
* safelist); `xlarge` 920px for diff-heavy modals (the file-edit review, `chat/composer/ApprovalDock.tsx`);
|
|
512
|
-
* `xxlarge` 1040px for workspace-style surfaces with their own internal
|
|
513
|
-
* navigation. It also raises the height cap from 85vh to 88vh. Every
|
|
514
|
-
* preset is clamped by `max-w-[92vw]` on narrower windows.
|
|
515
|
-
*/
|
|
516
|
-
size?: 'medium' | 'large' | 'xlarge' | 'xxlarge';
|
|
517
|
-
|
|
518
|
-
/**
|
|
519
|
-
* When false, the shell body clips instead of scrolling and the child
|
|
520
|
-
* owns its scroll containers. For modals with an internal fixed rail +
|
|
521
|
-
* scrolling panel (Settings): a scrolling shell body would drag the rail
|
|
522
|
-
* along whenever the content outgrows the viewport. Default true.
|
|
523
|
-
*/
|
|
524
|
-
scrollBody?: boolean;
|
|
525
|
-
/** Extra classes on the panel. */
|
|
526
|
-
className?: string;
|
|
527
|
-
/** Inline styles on the panel. */
|
|
528
|
-
style?: CSSProperties;
|
|
529
|
-
}
|
|
530
|
-
|
|
531
|
-
const SIZE_CLS: Record<NonNullable<ModalShellProps['size']>, string> = {
|
|
532
|
-
medium: 'w-[560px] max-h-[85vh]',
|
|
533
|
-
large: 'w-[760px] max-h-[85vh]',
|
|
534
|
-
xlarge: 'w-[920px] max-h-[85vh]',
|
|
535
|
-
xxlarge: 'w-[1040px] max-h-[88vh]',
|
|
536
|
-
};
|
|
537
|
-
|
|
538
|
-
/**
|
|
539
|
-
* Makes a shell's `onClose` the dismiss handler while the shell is present, reading the latest
|
|
540
|
-
* `onClose` through a ref. A closed surface stays mounted while it animates out: it drops its handler
|
|
541
|
-
* as it starts leaving, and never takes it back from the surface that replaced it (the effect is keyed
|
|
542
|
-
* on presence and the stable setter, not on the modal value or `onClose`'s identity).
|
|
543
|
-
*
|
|
544
|
-
* Both run as layout effects: in the commit that shows a surface (a new one, or new content in the
|
|
545
|
-
* shell already there), Esc and the scrim already call that surface's `onClose`. As passive effects
|
|
546
|
-
* they ran later, and an Esc pressed in between closed the surface it replaced.
|
|
547
|
-
*/
|
|
548
|
-
function useDismissHandler(setDismissHandler: ModalContextValue['setDismissHandler'], onClose: () => void): void {
|
|
549
|
-
const present = useIsPresent();
|
|
550
|
-
const onCloseRef = useRef(onClose);
|
|
551
|
-
useLayoutEffect(() => {
|
|
552
|
-
onCloseRef.current = onClose;
|
|
553
|
-
});
|
|
554
|
-
useLayoutEffect(() => {
|
|
555
|
-
if (!present) return;
|
|
556
|
-
const handler = () => onCloseRef.current();
|
|
557
|
-
setDismissHandler(handler);
|
|
558
|
-
return () => setDismissHandler(null, handler);
|
|
559
|
-
}, [setDismissHandler, present]);
|
|
560
|
-
}
|
|
561
|
-
|
|
562
|
-
/**
|
|
563
|
-
* Standard modal shell — title row + body + optional footer. Every modal in
|
|
564
|
-
* the app uses this so spacing, borders, and the close-X stay consistent.
|
|
565
|
-
*
|
|
566
|
-
* @param props - The title, body, footer, size and close handlers.
|
|
567
|
-
*/
|
|
568
|
-
export function ModalShell({
|
|
569
|
-
title,
|
|
570
|
-
description,
|
|
571
|
-
onClose,
|
|
572
|
-
onBack,
|
|
573
|
-
footer,
|
|
574
|
-
children,
|
|
575
|
-
size = 'medium',
|
|
576
|
-
scrollBody = true,
|
|
577
|
-
className,
|
|
578
|
-
style,
|
|
579
|
-
}: ModalShellProps) {
|
|
580
|
-
const modal = useModal();
|
|
581
|
-
const labels = useLabels();
|
|
582
|
-
const sizeCls = SIZE_CLS[size];
|
|
583
|
-
|
|
584
|
-
useDismissHandler(modal.setDismissHandler, onClose);
|
|
585
|
-
|
|
586
|
-
return (
|
|
587
|
-
// eslint-disable-next-line jsx-a11y/no-static-element-interactions -- keeps a press inside the panel from the scrim
|
|
588
|
-
<div
|
|
589
|
-
className={`zg-modal-panel zg-float ${sizeCls} max-w-[92vw] flex flex-col overflow-hidden${className ? ` ${className}` : ''}`}
|
|
590
|
-
style={style}
|
|
591
|
-
onMouseDown={(e) => e.stopPropagation()}
|
|
592
|
-
>
|
|
593
|
-
<header className="flex items-start gap-2 px-5 py-3.5 border-b border-[var(--zg-hairline)]">
|
|
594
|
-
{onBack && (
|
|
595
|
-
<IconButton icon="i-ph-caret-left" label={labels.modalBack} size="lg" onClick={onBack} className="-ml-2" />
|
|
596
|
-
)}
|
|
597
|
-
<div className="flex-1 min-w-0 self-center">
|
|
598
|
-
<h2 id={MODAL_TITLE_ID} className="text-sm font-semibold text-[var(--zg-text)] m-0 zg-balance">
|
|
599
|
-
{title}
|
|
600
|
-
</h2>
|
|
601
|
-
{description && <p className="text-xs text-[var(--zg-text-muted)] mt-0.5 m-0 zg-pretty">{description}</p>}
|
|
602
|
-
</div>
|
|
603
|
-
<IconButton icon="i-ph-x" label={labels.close} size="lg" onClick={onClose} className="-mr-2" />
|
|
604
|
-
</header>
|
|
605
|
-
<div className={`flex-1 min-h-0 px-5 py-4 ${scrollBody ? 'overflow-y-auto' : 'overflow-hidden flex flex-col'}`}>
|
|
606
|
-
{children}
|
|
607
|
-
</div>
|
|
608
|
-
{footer && <footer className="shrink-0 px-5 py-3 bg-[var(--zg-tray)]">{footer}</footer>}
|
|
609
|
-
</div>
|
|
610
|
-
);
|
|
611
|
-
}
|
|
612
|
-
|
|
613
|
-
/*
|
|
614
|
-
* ---------------------------------------------------------------------------
|
|
615
|
-
* ScreenShell: layout for the `screen` variant
|
|
616
|
-
* ---------------------------------------------------------------------------
|
|
617
|
-
*/
|
|
618
|
-
|
|
619
|
-
/** Props for {@link ScreenShell}. */
|
|
620
|
-
export interface ScreenShellProps {
|
|
621
|
-
/** Heading for the main column (stamped with MODAL_TITLE_ID). */
|
|
622
|
-
title: ReactNode;
|
|
623
|
-
/** A line under the heading. */
|
|
624
|
-
description?: ReactNode;
|
|
625
|
-
/** Label for the back affordance in the left column, e.g. "Settings". */
|
|
626
|
-
screenLabel: string;
|
|
627
|
-
/** The back button and Esc. */
|
|
628
|
-
onClose: () => void;
|
|
629
|
-
/** Left column: `search` shares the title row; `nav` fills the rest. */
|
|
630
|
-
aside: { search?: ReactNode; nav: ReactNode };
|
|
631
|
-
/** Pinned to the bottom of the left column. */
|
|
632
|
-
asideFooter?: ReactNode;
|
|
633
|
-
/** Right-aligned controls on the main header row. */
|
|
634
|
-
headerActions?: ReactNode;
|
|
635
|
-
/** The main column's body. */
|
|
636
|
-
children: ReactNode;
|
|
637
|
-
/** Extra classes on the root. */
|
|
638
|
-
className?: string;
|
|
639
|
-
/** Inline styles on the root. */
|
|
640
|
-
style?: CSSProperties;
|
|
641
|
-
}
|
|
642
|
-
|
|
643
|
-
/**
|
|
644
|
-
* Two-column full-window shell mirroring the chat layout: a sidebar-width
|
|
645
|
-
* left column on the tray tone (traffic-light spacer, back button,
|
|
646
|
-
* then whatever navigation the surface provides) and a main column with a
|
|
647
|
-
* heading row over the content. Escape and the back button both call
|
|
648
|
-
* `onClose`.
|
|
649
|
-
*
|
|
650
|
-
* @param props - The heading, the left column, the body and `onClose`.
|
|
651
|
-
*/
|
|
652
|
-
export function ScreenShell({
|
|
653
|
-
title,
|
|
654
|
-
description,
|
|
655
|
-
screenLabel,
|
|
656
|
-
onClose,
|
|
657
|
-
aside,
|
|
658
|
-
asideFooter,
|
|
659
|
-
headerActions,
|
|
660
|
-
children,
|
|
661
|
-
className,
|
|
662
|
-
style,
|
|
663
|
-
}: ScreenShellProps) {
|
|
664
|
-
const modal = useModal();
|
|
665
|
-
const labels = useLabels();
|
|
666
|
-
const chrome = useContext(ChromeContext);
|
|
667
|
-
// Mirrors the chat sidebar's (user-resized) width so the two columns line up.
|
|
668
|
-
const { sidebarWidth } = useAppearanceState();
|
|
669
|
-
|
|
670
|
-
useDismissHandler(modal.setDismissHandler, onClose);
|
|
671
|
-
|
|
672
|
-
return (
|
|
673
|
-
<div className={`flex w-full h-full min-h-0${className ? ` ${className}` : ''}`} style={style}>
|
|
674
|
-
<aside
|
|
675
|
-
className="zg-screen-aside shrink-0 flex flex-col h-full bg-[var(--zg-tray)]"
|
|
676
|
-
style={{ width: sidebarWidth }}
|
|
677
|
-
>
|
|
678
|
-
{/* Row 1: the window-chrome band (`chromeInset`). Back + label sit right after
|
|
679
|
-
what it keeps clear (the desktop app's traffic lights). */}
|
|
680
|
-
<div className="zg-drag shrink-0 flex items-center pr-2" style={{ height: chromePx(chrome.top) }}>
|
|
681
|
-
{chrome.leading > 0 && <span aria-hidden className="shrink-0" style={{ width: chromePx(chrome.leading) }} />}
|
|
682
|
-
<button
|
|
683
|
-
type="button"
|
|
684
|
-
onClick={onClose}
|
|
685
|
-
aria-label={labels.screenBack(screenLabel)}
|
|
686
|
-
className="zg-no-drag zg-menu-row zg-press-subtle !w-auto h-7 !min-h-0 !gap-1 !pl-1 !pr-1.5 font-medium"
|
|
687
|
-
>
|
|
688
|
-
<span className="i-ph-caret-left text-sm text-[var(--zg-text-muted)]" aria-hidden />
|
|
689
|
-
<span className="truncate">{screenLabel}</span>
|
|
690
|
-
<Keycap className="ml-1.5">{labels.screenBackKey}</Keycap>
|
|
691
|
-
</button>
|
|
692
|
-
</div>
|
|
693
|
-
{/* Row 2: shares its height with the main title row so the search
|
|
694
|
-
field and the section title sit on one line. The tray tone is the
|
|
695
|
-
divider on this side, so no rule. */}
|
|
696
|
-
<div className="zg-screen-toprow shrink-0 flex items-center px-3">
|
|
697
|
-
<div className="w-full">{aside.search}</div>
|
|
698
|
-
</div>
|
|
699
|
-
<div className="flex-1 min-h-0 flex flex-col px-2 pt-3">{aside.nav}</div>
|
|
700
|
-
{asideFooter && <div className="shrink-0 px-2 pb-2">{asideFooter}</div>}
|
|
701
|
-
</aside>
|
|
702
|
-
|
|
703
|
-
<section className="flex-1 min-w-0 min-h-0 flex flex-col">
|
|
704
|
-
{/* One header block spanning both aside rows (lights band + search
|
|
705
|
-
row); the title sits at the bottom so it lines up with the search
|
|
706
|
-
field and the shared rule, with the drag band above it. */}
|
|
707
|
-
<header
|
|
708
|
-
className="zg-drag zg-screen-header shrink-0 flex items-end gap-3 px-6 pb-3 border-b border-[var(--zg-hairline)]"
|
|
709
|
-
style={{ height: `calc(${chrome.top}px / var(--zg-zoom, 1) + 56px)` }}
|
|
710
|
-
>
|
|
711
|
-
{/* Header spans the full width; only the body content is measured. */}
|
|
712
|
-
<div className="flex-1 min-w-0 flex items-end gap-3">
|
|
713
|
-
<div className="flex-1 min-w-0">
|
|
714
|
-
<h2
|
|
715
|
-
id={MODAL_TITLE_ID}
|
|
716
|
-
className="text-sm font-semibold leading-tight text-[var(--zg-text)] m-0 zg-balance"
|
|
717
|
-
>
|
|
718
|
-
{title}
|
|
719
|
-
</h2>
|
|
720
|
-
{description && (
|
|
721
|
-
<p className="text-xs leading-tight text-[var(--zg-text-muted)] mt-0.5 m-0 truncate">{description}</p>
|
|
722
|
-
)}
|
|
723
|
-
</div>
|
|
724
|
-
{headerActions && <div className="zg-no-drag flex items-center gap-2 shrink-0 pb-0.5">{headerActions}</div>}
|
|
725
|
-
</div>
|
|
726
|
-
</header>
|
|
727
|
-
<div className="flex-1 min-h-0 flex flex-col overflow-hidden">{children}</div>
|
|
728
|
-
</section>
|
|
729
|
-
</div>
|
|
730
|
-
);
|
|
731
|
-
}
|