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,224 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Font preferences → CSS variables, plus the font catalog the Appearance
|
|
3
|
-
* panel offers.
|
|
4
|
-
*
|
|
5
|
-
* Strategy: system fonts only, nothing bundled. Defaults are the platform
|
|
6
|
-
* UI stack and `ui-monospace`. The picker shows a curated list filtered to
|
|
7
|
-
* what is actually installed (canvas `measureText` probe), extended by
|
|
8
|
-
* `queryLocalFonts()` when the permission is granted (main allows it for
|
|
9
|
-
* our origin). A chosen family is written as the FIRST entry of the
|
|
10
|
-
* stack, so a font that disappears later degrades to the default instead
|
|
11
|
-
* of to the browser fallback.
|
|
12
|
-
*/
|
|
13
|
-
import type { FontChoices, FontSizes } from './prefs';
|
|
14
|
-
|
|
15
|
-
/** The default font stacks: the platform UI stack and `ui-monospace`. */
|
|
16
|
-
export const FONT_STACKS = {
|
|
17
|
-
ui: `-apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, Roboto, sans-serif`,
|
|
18
|
-
mono: `ui-monospace, 'SF Mono', SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', monospace`,
|
|
19
|
-
} as const;
|
|
20
|
-
|
|
21
|
-
/** A font the picker offers. */
|
|
22
|
-
export interface FontOption {
|
|
23
|
-
/** Family name as passed to CSS. */
|
|
24
|
-
family: string;
|
|
25
|
-
/** Name shown in the picker. */
|
|
26
|
-
label: string;
|
|
27
|
-
/** Its kind, for grouping. */
|
|
28
|
-
kind: 'sans' | 'mono' | 'serif';
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Curated candidates. Order = display order within each kind. Availability
|
|
33
|
-
* is checked at runtime; missing ones are hidden from the picker.
|
|
34
|
-
*/
|
|
35
|
-
export const CURATED_FONTS: readonly FontOption[] = [
|
|
36
|
-
{ family: 'Inter', label: 'Inter', kind: 'sans' },
|
|
37
|
-
{ family: 'Geist', label: 'Geist', kind: 'sans' },
|
|
38
|
-
{ family: 'SF Pro Text', label: 'SF Pro', kind: 'sans' },
|
|
39
|
-
{ family: 'Helvetica Neue', label: 'Helvetica Neue', kind: 'sans' },
|
|
40
|
-
{ family: 'IBM Plex Sans', label: 'IBM Plex Sans', kind: 'sans' },
|
|
41
|
-
{ family: 'Source Sans 3', label: 'Source Sans', kind: 'sans' },
|
|
42
|
-
{ family: 'Roboto', label: 'Roboto', kind: 'sans' },
|
|
43
|
-
{ family: 'Segoe UI', label: 'Segoe UI', kind: 'sans' },
|
|
44
|
-
{ family: 'Avenir Next', label: 'Avenir Next', kind: 'sans' },
|
|
45
|
-
{ family: 'Atkinson Hyperlegible', label: 'Atkinson Hyperlegible', kind: 'sans' },
|
|
46
|
-
{ family: 'Iowan Old Style', label: 'Iowan Old Style', kind: 'serif' },
|
|
47
|
-
{ family: 'Charter', label: 'Charter', kind: 'serif' },
|
|
48
|
-
{ family: 'Georgia', label: 'Georgia', kind: 'serif' },
|
|
49
|
-
{ family: 'New York', label: 'New York', kind: 'serif' },
|
|
50
|
-
{ family: 'SF Mono', label: 'SF Mono', kind: 'mono' },
|
|
51
|
-
{ family: 'Menlo', label: 'Menlo', kind: 'mono' },
|
|
52
|
-
{ family: 'Monaco', label: 'Monaco', kind: 'mono' },
|
|
53
|
-
{ family: 'JetBrains Mono', label: 'JetBrains Mono', kind: 'mono' },
|
|
54
|
-
{ family: 'Fira Code', label: 'Fira Code', kind: 'mono' },
|
|
55
|
-
{ family: 'Geist Mono', label: 'Geist Mono', kind: 'mono' },
|
|
56
|
-
{ family: 'IBM Plex Mono', label: 'IBM Plex Mono', kind: 'mono' },
|
|
57
|
-
{ family: 'Source Code Pro', label: 'Source Code Pro', kind: 'mono' },
|
|
58
|
-
{ family: 'Cascadia Code', label: 'Cascadia Code', kind: 'mono' },
|
|
59
|
-
{ family: 'Berkeley Mono', label: 'Berkeley Mono', kind: 'mono' },
|
|
60
|
-
{ family: 'Iosevka', label: 'Iosevka', kind: 'mono' },
|
|
61
|
-
{ family: 'Commit Mono', label: 'Commit Mono', kind: 'mono' },
|
|
62
|
-
{ family: 'Monaspace Neon', label: 'Monaspace Neon', kind: 'mono' },
|
|
63
|
-
{ family: 'Hack', label: 'Hack', kind: 'mono' },
|
|
64
|
-
{ family: 'Consolas', label: 'Consolas', kind: 'mono' },
|
|
65
|
-
];
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* Quotes a family name for CSS when it contains spaces or punctuation.
|
|
69
|
-
*
|
|
70
|
-
* @param family - The family name.
|
|
71
|
-
*/
|
|
72
|
-
export function cssFamily(family: string): string {
|
|
73
|
-
return /^[a-zA-Z0-9-]+$/.test(family) ? family : `'${family.replace(/'/g, "\\'")}'`;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
/**
|
|
77
|
-
* A font stack with the chosen family first, so a font that disappears degrades to the default stack.
|
|
78
|
-
*
|
|
79
|
-
* @param choice - The chosen family, or `null` for the default stack.
|
|
80
|
-
* @param kind - Which default stack follows it.
|
|
81
|
-
*/
|
|
82
|
-
export function fontStack(choice: string | null, kind: 'ui' | 'mono'): string {
|
|
83
|
-
const base = FONT_STACKS[kind];
|
|
84
|
-
return choice ? `${cssFamily(choice)}, ${base}` : base;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
/** The font CSS variables {@link fontsToCssVars} writes. */
|
|
88
|
-
export type FontCssVars = Record<
|
|
89
|
-
| '--zg-font-ui'
|
|
90
|
-
| '--zg-font-chat'
|
|
91
|
-
| '--zg-font-prompt'
|
|
92
|
-
| '--zg-font-mono'
|
|
93
|
-
| '--zg-font-size-chat'
|
|
94
|
-
| '--zg-font-size-prompt'
|
|
95
|
-
| '--zg-font-size-code',
|
|
96
|
-
string
|
|
97
|
-
>;
|
|
98
|
-
|
|
99
|
-
/**
|
|
100
|
-
* The font CSS variables for the picked families and sizes.
|
|
101
|
-
*
|
|
102
|
-
* @param fonts - The families per role.
|
|
103
|
-
* @param sizes - The sizes per role.
|
|
104
|
-
*/
|
|
105
|
-
export function fontsToCssVars(fonts: FontChoices, sizes: FontSizes): FontCssVars {
|
|
106
|
-
const ui = fontStack(fonts.ui, 'ui');
|
|
107
|
-
return {
|
|
108
|
-
'--zg-font-ui': ui,
|
|
109
|
-
// Chat and prompt fall back to the UI choice (not the stylesheet default)
|
|
110
|
-
// so picking one font for the interface carries into the transcript.
|
|
111
|
-
'--zg-font-chat': fonts.chat ? fontStack(fonts.chat, 'ui') : ui,
|
|
112
|
-
'--zg-font-prompt': fonts.prompt ? fontStack(fonts.prompt, 'ui') : fonts.chat ? fontStack(fonts.chat, 'ui') : ui,
|
|
113
|
-
'--zg-font-mono': fontStack(fonts.mono, 'mono'),
|
|
114
|
-
'--zg-font-size-chat': `${sizes.chat}px`,
|
|
115
|
-
'--zg-font-size-prompt': `${sizes.prompt}px`,
|
|
116
|
-
'--zg-font-size-code': `${sizes.code}px`,
|
|
117
|
-
};
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
// ---------------------------------------------------------------------------
|
|
121
|
-
// Availability detection
|
|
122
|
-
// ---------------------------------------------------------------------------
|
|
123
|
-
|
|
124
|
-
/**
|
|
125
|
-
* A string with wide/narrow glyph mix so a substituted fallback almost
|
|
126
|
-
* always measures differently from the real face.
|
|
127
|
-
*/
|
|
128
|
-
const PROBE_TEXT = 'mmmmmmmmMMWli1O0@# fjord';
|
|
129
|
-
|
|
130
|
-
let probeCtx: CanvasRenderingContext2D | null | undefined;
|
|
131
|
-
|
|
132
|
-
function ctx(): CanvasRenderingContext2D | null {
|
|
133
|
-
if (probeCtx === undefined) {
|
|
134
|
-
probeCtx = typeof document === 'undefined' ? null : document.createElement('canvas').getContext('2d');
|
|
135
|
-
}
|
|
136
|
-
return probeCtx;
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
/**
|
|
140
|
-
* True when `family` renders differently from both generic fallbacks,
|
|
141
|
-
* i.e. the OS resolved it to an actual installed face. Cheap (three
|
|
142
|
-
* `measureText` calls), synchronous, no permission needed.
|
|
143
|
-
*
|
|
144
|
-
* @param family - The family name.
|
|
145
|
-
*/
|
|
146
|
-
export function isFontAvailable(family: string): boolean {
|
|
147
|
-
const c = ctx();
|
|
148
|
-
if (!c) {
|
|
149
|
-
return false;
|
|
150
|
-
}
|
|
151
|
-
const measure = (font: string): number => {
|
|
152
|
-
c.font = `16px ${font}`;
|
|
153
|
-
return c.measureText(PROBE_TEXT).width;
|
|
154
|
-
};
|
|
155
|
-
const quoted = cssFamily(family);
|
|
156
|
-
const sans = measure('sans-serif');
|
|
157
|
-
const mono = measure('monospace');
|
|
158
|
-
const serif = measure('serif');
|
|
159
|
-
const w1 = measure(`${quoted}, sans-serif`);
|
|
160
|
-
const w2 = measure(`${quoted}, monospace`);
|
|
161
|
-
// If the family is missing, each probe collapses to its fallback width.
|
|
162
|
-
const missing = Math.abs(w1 - sans) < 0.01 && Math.abs(w2 - mono) < 0.01;
|
|
163
|
-
if (!missing) {
|
|
164
|
-
return true;
|
|
165
|
-
}
|
|
166
|
-
// Edge: family IS the generic default (e.g. Helvetica on macOS). Check serif too.
|
|
167
|
-
return Math.abs(measure(`${quoted}, serif`) - serif) >= 0.01;
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
/** The curated fonts installed on this computer. */
|
|
171
|
-
export function availableCuratedFonts(): FontOption[] {
|
|
172
|
-
return CURATED_FONTS.filter((f) => isFontAvailable(f.family));
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
interface LocalFontData {
|
|
176
|
-
family: string;
|
|
177
|
-
style: string;
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
/**
|
|
181
|
-
* Installed families via the Local Font Access API. Resolves to `[]` when
|
|
182
|
-
* unsupported or denied. Families are de-duplicated and sorted; `kind` is
|
|
183
|
-
* guessed from the name because the API doesn't classify.
|
|
184
|
-
*/
|
|
185
|
-
export async function queryInstalledFonts(): Promise<FontOption[]> {
|
|
186
|
-
const w = window as unknown as { queryLocalFonts?: () => Promise<LocalFontData[]> };
|
|
187
|
-
if (typeof w.queryLocalFonts !== 'function') {
|
|
188
|
-
return [];
|
|
189
|
-
}
|
|
190
|
-
try {
|
|
191
|
-
const faces = await w.queryLocalFonts();
|
|
192
|
-
const families = new Set<string>();
|
|
193
|
-
for (const face of faces) {
|
|
194
|
-
if (face.family && !face.family.startsWith('.')) {
|
|
195
|
-
families.add(face.family);
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
return [...families]
|
|
199
|
-
.sort((a, b) => a.localeCompare(b))
|
|
200
|
-
.map((family) => ({ family, label: family, kind: guessKind(family) }));
|
|
201
|
-
} catch {
|
|
202
|
-
return [];
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
const MONO_HINT =
|
|
207
|
-
/mono|code|courier|consol|menlo|monaco|fira ?code|hack|iosevka|jetbrains|cascadia|source code|berkeley|plex mono|terminal|fixed/i;
|
|
208
|
-
const SERIF_HINT =
|
|
209
|
-
/serif|georgia|times|garamond|baskerville|charter|palatino|book|iowan|new york|didot|bodoni|caslon|minion|merriweather|lora|playfair/i;
|
|
210
|
-
|
|
211
|
-
/**
|
|
212
|
-
* Guesses a family's kind from its name (the Local Font Access API doesn't classify).
|
|
213
|
-
*
|
|
214
|
-
* @param family - The family name.
|
|
215
|
-
*/
|
|
216
|
-
export function guessKind(family: string): FontOption['kind'] {
|
|
217
|
-
if (MONO_HINT.test(family)) {
|
|
218
|
-
return 'mono';
|
|
219
|
-
}
|
|
220
|
-
if (SERIF_HINT.test(family) && !/sans/i.test(family)) {
|
|
221
|
-
return 'serif';
|
|
222
|
-
}
|
|
223
|
-
return 'sans';
|
|
224
|
-
}
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The appearance host: where an app keeps its appearance preferences, which
|
|
3
|
-
* themes beyond the built-in ones it offers, where the pre-paint snapshot
|
|
4
|
-
* goes and what the window does natively. An app implements it once (the
|
|
5
|
-
* desktop app over `localStorage` and IPC, a web app over `localStorage`
|
|
6
|
-
* with `createBrowserAppearanceHost`) and hands it to `AppearanceProvider`
|
|
7
|
-
* (or `AppHost.appearance`).
|
|
8
|
-
*
|
|
9
|
-
* Only `prefs` is required: a host that leaves another member out offers the
|
|
10
|
-
* built-in themes only, writes no snapshot, or leaves the window alone.
|
|
11
|
-
*/
|
|
12
|
-
import type { Readable } from '../../chat/headless/store';
|
|
13
|
-
import type { Theme } from '../../theme/themes';
|
|
14
|
-
import type { AppearanceMode, AppearanceState } from './prefs';
|
|
15
|
-
|
|
16
|
-
export type { Theme };
|
|
17
|
-
|
|
18
|
-
/** The stored preferences: read with `get`, follow with `subscribe`, change with `set`. */
|
|
19
|
-
export interface AppearancePrefs extends Readable<AppearanceState> {
|
|
20
|
-
/**
|
|
21
|
-
* Merges `update` into the preferences (or replaces them with what the function returns), stores them and tells
|
|
22
|
-
* subscribers. Equal preferences change nothing.
|
|
23
|
-
*/
|
|
24
|
-
set(update: Partial<AppearanceState> | ((prev: AppearanceState) => AppearanceState)): void;
|
|
25
|
-
/** Back to `DEFAULT_APPEARANCE`. */
|
|
26
|
-
reset(): void;
|
|
27
|
-
/** True until preferences were stored: the app's first run on this computer. */
|
|
28
|
-
isFirstRun(): boolean;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/** The pre-paint snapshot: the last applied CSS variables, replayed before any script loads. */
|
|
32
|
-
export interface BootSnapshot {
|
|
33
|
-
/** The appearance class (`.light` / `.dark`). */
|
|
34
|
-
appearance: 'light' | 'dark';
|
|
35
|
-
/** `--zg-*` name → value. */
|
|
36
|
-
vars: Record<string, string>;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/** Where the pre-paint snapshot goes. */
|
|
40
|
-
export interface AppearanceBoot {
|
|
41
|
-
/** Stores the snapshot (after every apply that changed something). */
|
|
42
|
-
write(snapshot: BootSnapshot): void;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/** What the window does natively when the appearance changes. Each member is optional. */
|
|
46
|
-
export interface AppearanceWindow {
|
|
47
|
-
/** Paints the window background shown during resize, before the page does. `#rrggbb`. */
|
|
48
|
-
setBackground?(color: string): Promise<void>;
|
|
49
|
-
/** Applies the interface scale (a zoom factor, 0.8..1.5). */
|
|
50
|
-
setZoom?(factor: number): Promise<void>;
|
|
51
|
-
/** Mirrors the mode into the native chrome (title bar, menus). */
|
|
52
|
-
setNativeTheme?(mode: AppearanceMode): Promise<void>;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/** The appearance host. Only `prefs` is required. */
|
|
56
|
-
export interface AppearanceHost {
|
|
57
|
-
/** The stored preferences. */
|
|
58
|
-
prefs: AppearancePrefs;
|
|
59
|
-
/** Themes beyond the built-in ones for a folder (its extensions'). Absent: built-in themes only. */
|
|
60
|
-
themes?(folder: string): Promise<readonly Theme[]>;
|
|
61
|
-
/** Where the pre-paint snapshot goes. Absent: none is written. */
|
|
62
|
-
boot?: AppearanceBoot;
|
|
63
|
-
/** Native window effects. Absent: the window is left alone. */
|
|
64
|
-
window?: AppearanceWindow;
|
|
65
|
-
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `zidane-ui/appearance/headless`: the React-free half of the appearance
|
|
3
|
-
* area. The `AppearanceHost` interface, the preferences model
|
|
4
|
-
* (`parseAppearance`, `DEFAULT_APPEARANCE`, `LIMITS`), the `Storage`-backed
|
|
5
|
-
* preferences and pre-paint snapshot, the font tokens and the zoom key
|
|
6
|
-
* commands (`zoomKeyCommands`).
|
|
7
|
-
*/
|
|
8
|
-
export * from './host';
|
|
9
|
-
export * from './prefs';
|
|
10
|
-
export * from './storage';
|
|
11
|
-
export * from './fonts';
|
|
12
|
-
export * from './zoom-commands';
|
|
@@ -1,252 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The appearance preferences: mode, the light/dark theme pairing, contrast,
|
|
3
|
-
* accent, fonts and sizes, interface scale, motion, panel widths, the Files
|
|
4
|
-
* tree side and the code theme per appearance. One blob, validated field by
|
|
5
|
-
* field on read (`parseAppearance`), kept by the host (`AppearanceHost.prefs`).
|
|
6
|
-
*
|
|
7
|
-
* These are properties of a window on a display, not of the agent: they are
|
|
8
|
-
* not part of zidane's shared `Settings`.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
/** Which appearance the app shows: the OS's, or always light or dark. */
|
|
12
|
-
export type AppearanceMode = 'system' | 'light' | 'dark';
|
|
13
|
-
|
|
14
|
-
/** How much the UI animates. `system` follows the OS reduced-motion preference. */
|
|
15
|
-
export type MotionPreference = 'system' | 'off' | 'reduced' | 'full';
|
|
16
|
-
|
|
17
|
-
/** The font families picked per role, as the OS names them. `null`: the stylesheet default. */
|
|
18
|
-
export interface FontChoices {
|
|
19
|
-
/** The interface font. */
|
|
20
|
-
ui: string | null;
|
|
21
|
-
/** The transcript font (default: the interface font). */
|
|
22
|
-
chat: string | null;
|
|
23
|
-
/** The prompt font (default: the transcript font). */
|
|
24
|
-
prompt: string | null;
|
|
25
|
-
/** The code font. */
|
|
26
|
-
mono: string | null;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/** Font sizes in CSS px. */
|
|
30
|
-
export interface FontSizes {
|
|
31
|
-
/** The transcript. */
|
|
32
|
-
chat: number;
|
|
33
|
-
/** The prompt. */
|
|
34
|
-
prompt: number;
|
|
35
|
-
/** Code blocks and the editor. */
|
|
36
|
-
code: number;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/** Which side of the Files tab the tree column sits on. */
|
|
40
|
-
export type FilesTreeSide = 'left' | 'right';
|
|
41
|
-
|
|
42
|
-
/** A bundled code theme id, or `'auto'`: the app theme's own mapping. */
|
|
43
|
-
export type CodeThemePick = 'auto' | (string & {});
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* Syntax colours per appearance. Only the tokens come from the code theme; the code
|
|
47
|
-
* background is always the app's, so each slot holds a theme of its type.
|
|
48
|
-
*/
|
|
49
|
-
export interface CodeThemeChoice {
|
|
50
|
-
/** The pick while the app is dark. */
|
|
51
|
-
dark: CodeThemePick;
|
|
52
|
-
/** The pick while the app is light. */
|
|
53
|
-
light: CodeThemePick;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/** 2: `filesTreeSide` defaults to the left (see `parseAppearance`). */
|
|
57
|
-
const APPEARANCE_VERSION = 2 as const;
|
|
58
|
-
|
|
59
|
-
/** Every appearance preference, as stored. */
|
|
60
|
-
export interface AppearanceState {
|
|
61
|
-
/** The blob's version. */
|
|
62
|
-
version: typeof APPEARANCE_VERSION;
|
|
63
|
-
/** System, light or dark. */
|
|
64
|
-
mode: AppearanceMode;
|
|
65
|
-
/** The theme id shown while light (registry or extension). */
|
|
66
|
-
lightTheme: string;
|
|
67
|
-
/** The theme id shown while dark (registry or extension). */
|
|
68
|
-
darkTheme: string;
|
|
69
|
-
/** 50..200, 100 = as designed. */
|
|
70
|
-
contrast: number;
|
|
71
|
-
/** `#rrggbb` replacing the theme's accent, or `null` to use the theme's own. */
|
|
72
|
-
accentOverride: string | null;
|
|
73
|
-
/** Font families per role. */
|
|
74
|
-
fonts: FontChoices;
|
|
75
|
-
/** Font sizes per role. */
|
|
76
|
-
fontSizes: FontSizes;
|
|
77
|
-
/** The interface zoom factor, 0.8..1.5. */
|
|
78
|
-
interfaceScale: number;
|
|
79
|
-
/** The motion preference. */
|
|
80
|
-
motion: MotionPreference;
|
|
81
|
-
/**
|
|
82
|
-
* Spring animations: motion settles with physics (a hint of overshoot)
|
|
83
|
-
* instead of fixed ease-out curves. Only meaningful at the Full level.
|
|
84
|
-
*/
|
|
85
|
-
springs: boolean;
|
|
86
|
-
/** Panel open/close duration in ms (sidebar, side panels), 0..400. */
|
|
87
|
-
panelMs: number;
|
|
88
|
-
/** The sidebar's drag-resized width in CSS px; persisted on drag end only. */
|
|
89
|
-
sidebarWidth: number;
|
|
90
|
-
/** The side panel's drag-resized width in CSS px; persisted on drag end only. */
|
|
91
|
-
panelWidth: number;
|
|
92
|
-
/** Which side of the Files tab the tree column sits on. */
|
|
93
|
-
filesTreeSide: FilesTreeSide;
|
|
94
|
-
/** The code theme per appearance. */
|
|
95
|
-
codeTheme: CodeThemeChoice;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
/** The preferences before the user changes anything. */
|
|
99
|
-
export const DEFAULT_APPEARANCE: AppearanceState = {
|
|
100
|
-
version: APPEARANCE_VERSION,
|
|
101
|
-
mode: 'system',
|
|
102
|
-
lightTheme: 'light',
|
|
103
|
-
darkTheme: 'default',
|
|
104
|
-
contrast: 100,
|
|
105
|
-
accentOverride: null,
|
|
106
|
-
fonts: { ui: null, chat: null, prompt: null, mono: null },
|
|
107
|
-
fontSizes: { chat: 14, prompt: 14, code: 12 },
|
|
108
|
-
interfaceScale: 1,
|
|
109
|
-
motion: 'system',
|
|
110
|
-
springs: true,
|
|
111
|
-
panelMs: 200,
|
|
112
|
-
sidebarWidth: 260,
|
|
113
|
-
panelWidth: 420,
|
|
114
|
-
filesTreeSide: 'left',
|
|
115
|
-
codeTheme: { dark: 'auto', light: 'auto' },
|
|
116
|
-
};
|
|
117
|
-
|
|
118
|
-
/** The bounds (and slider steps) of the numeric preferences. */
|
|
119
|
-
export const LIMITS = {
|
|
120
|
-
contrast: { min: 50, max: 200, step: 5 },
|
|
121
|
-
fontSize: { min: 10, max: 22, step: 1 },
|
|
122
|
-
interfaceScale: { min: 0.8, max: 1.5, step: 0.05 },
|
|
123
|
-
panelMs: { min: 0, max: 400, step: 20 },
|
|
124
|
-
sidebarWidth: { min: 220, max: 480 },
|
|
125
|
-
panelWidth: { min: 300, max: 900 },
|
|
126
|
-
} as const;
|
|
127
|
-
|
|
128
|
-
/** Options of {@link parseAppearance}. */
|
|
129
|
-
export interface ParseAppearanceOptions {
|
|
130
|
-
/**
|
|
131
|
-
* The appearance a code theme id is made for, `undefined` when unknown
|
|
132
|
-
* (`codeThemeTypeOf` from `zidane-ui/appearance`). A stored pick of the
|
|
133
|
-
* wrong type, or unknown, reads as `'auto'`. Absent: any non-empty id is kept.
|
|
134
|
-
*/
|
|
135
|
-
codeThemeType?: (id: string) => 'light' | 'dark' | undefined;
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
const clampNum = (n: unknown, min: number, max: number, fallback: number): number =>
|
|
139
|
-
typeof n === 'number' && Number.isFinite(n) ? Math.min(max, Math.max(min, n)) : fallback;
|
|
140
|
-
|
|
141
|
-
const strOrNull = (v: unknown): string | null => (typeof v === 'string' && v.trim() ? v : null);
|
|
142
|
-
|
|
143
|
-
const HEX = /^#[0-9a-f]{6}$/i;
|
|
144
|
-
|
|
145
|
-
function parseCodeThemePick(v: unknown, type: 'light' | 'dark', options: ParseAppearanceOptions): CodeThemePick {
|
|
146
|
-
if (typeof v !== 'string' || !v) return 'auto';
|
|
147
|
-
if (!options.codeThemeType) return v;
|
|
148
|
-
return options.codeThemeType(v) === type ? v : 'auto';
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
/**
|
|
152
|
-
* Validates a stored blob field by field; anything unrecognised falls back to its default.
|
|
153
|
-
*
|
|
154
|
-
* @param raw - The stored JSON.
|
|
155
|
-
* @param options - How to check code theme ids.
|
|
156
|
-
* @returns The preferences, or `undefined` when `raw` is not a known blob.
|
|
157
|
-
*/
|
|
158
|
-
export function parseAppearance(raw: string, options: ParseAppearanceOptions = {}): AppearanceState | undefined {
|
|
159
|
-
let json: unknown;
|
|
160
|
-
try {
|
|
161
|
-
json = JSON.parse(raw);
|
|
162
|
-
} catch {
|
|
163
|
-
return undefined;
|
|
164
|
-
}
|
|
165
|
-
if (!json || typeof json !== 'object') {
|
|
166
|
-
return undefined;
|
|
167
|
-
}
|
|
168
|
-
const o = json as Record<string, unknown>;
|
|
169
|
-
if (o.version !== 1 && o.version !== APPEARANCE_VERSION) {
|
|
170
|
-
return undefined;
|
|
171
|
-
}
|
|
172
|
-
const d = DEFAULT_APPEARANCE;
|
|
173
|
-
const fonts = (o.fonts ?? {}) as Record<string, unknown>;
|
|
174
|
-
const sizes = (o.fontSizes ?? {}) as Record<string, unknown>;
|
|
175
|
-
const accent = strOrNull(o.accentOverride);
|
|
176
|
-
const codeTheme = (o.codeTheme ?? {}) as Record<string, unknown>;
|
|
177
|
-
|
|
178
|
-
return {
|
|
179
|
-
version: APPEARANCE_VERSION,
|
|
180
|
-
mode: o.mode === 'light' || o.mode === 'dark' || o.mode === 'system' ? o.mode : d.mode,
|
|
181
|
-
lightTheme: strOrNull(o.lightTheme) ?? d.lightTheme,
|
|
182
|
-
darkTheme: strOrNull(o.darkTheme) ?? d.darkTheme,
|
|
183
|
-
contrast: clampNum(o.contrast, LIMITS.contrast.min, LIMITS.contrast.max, d.contrast),
|
|
184
|
-
accentOverride: accent && HEX.test(accent) ? accent.toLowerCase() : null,
|
|
185
|
-
fonts: {
|
|
186
|
-
ui: strOrNull(fonts.ui),
|
|
187
|
-
chat: strOrNull(fonts.chat),
|
|
188
|
-
prompt: strOrNull(fonts.prompt),
|
|
189
|
-
mono: strOrNull(fonts.mono),
|
|
190
|
-
},
|
|
191
|
-
fontSizes: {
|
|
192
|
-
chat: clampNum(sizes.chat, LIMITS.fontSize.min, LIMITS.fontSize.max, d.fontSizes.chat),
|
|
193
|
-
prompt: clampNum(sizes.prompt, LIMITS.fontSize.min, LIMITS.fontSize.max, d.fontSizes.prompt),
|
|
194
|
-
code: clampNum(sizes.code, LIMITS.fontSize.min, LIMITS.fontSize.max, d.fontSizes.code),
|
|
195
|
-
},
|
|
196
|
-
interfaceScale: clampNum(o.interfaceScale, LIMITS.interfaceScale.min, LIMITS.interfaceScale.max, d.interfaceScale),
|
|
197
|
-
motion:
|
|
198
|
-
o.motion === 'off' || o.motion === 'reduced' || o.motion === 'full' || o.motion === 'system'
|
|
199
|
-
? o.motion
|
|
200
|
-
: d.motion,
|
|
201
|
-
springs: typeof o.springs === 'boolean' ? o.springs : d.springs,
|
|
202
|
-
panelMs: clampNum(o.panelMs, LIMITS.panelMs.min, LIMITS.panelMs.max, d.panelMs),
|
|
203
|
-
// Version 1 blobs hold the old `'right'` default (the whole state was written on any change): left once.
|
|
204
|
-
filesTreeSide: o.version === APPEARANCE_VERSION && o.filesTreeSide === 'right' ? 'right' : 'left',
|
|
205
|
-
sidebarWidth: Math.round(
|
|
206
|
-
clampNum(o.sidebarWidth, LIMITS.sidebarWidth.min, LIMITS.sidebarWidth.max, d.sidebarWidth),
|
|
207
|
-
),
|
|
208
|
-
panelWidth: Math.round(clampNum(o.panelWidth, LIMITS.panelWidth.min, LIMITS.panelWidth.max, d.panelWidth)),
|
|
209
|
-
codeTheme: {
|
|
210
|
-
dark: parseCodeThemePick(codeTheme.dark, 'dark', options),
|
|
211
|
-
light: parseCodeThemePick(codeTheme.light, 'light', options),
|
|
212
|
-
},
|
|
213
|
-
};
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
/**
|
|
217
|
-
* The preferences with the interface scale one step up or down, or back to 1, clamped to {@link LIMITS}.
|
|
218
|
-
*
|
|
219
|
-
* @param prev - The current preferences.
|
|
220
|
-
* @param direction - `1` one step up, `-1` one step down, `0` back to 100%.
|
|
221
|
-
*/
|
|
222
|
-
export function stepInterfaceScale(prev: AppearanceState, direction: 1 | -1 | 0): AppearanceState {
|
|
223
|
-
const { min, max, step } = LIMITS.interfaceScale;
|
|
224
|
-
const raw = direction === 0 ? 1 : prev.interfaceScale + direction * step;
|
|
225
|
-
// Round to the step grid so repeated ± never drifts (0.1 + 0.05 …).
|
|
226
|
-
const snapped = Math.round(raw / step) * step;
|
|
227
|
-
return { ...prev, interfaceScale: Math.min(max, Math.max(min, Number(snapped.toFixed(2)))) };
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
/**
|
|
231
|
-
* The theme id to show: the dark slot when the mode (or the OS, under `system`) asks for dark, else the light slot.
|
|
232
|
-
*
|
|
233
|
-
* @param state - The preferences.
|
|
234
|
-
* @param prefersDark - Whether the OS prefers dark.
|
|
235
|
-
*/
|
|
236
|
-
export function activeThemeId(state: AppearanceState, prefersDark: boolean): string {
|
|
237
|
-
const wantDark = state.mode === 'dark' || (state.mode === 'system' && prefersDark);
|
|
238
|
-
return wantDark ? state.darkTheme : state.lightTheme;
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
/**
|
|
242
|
-
* The motion level a preference resolves to: `system` follows the OS, an explicit choice wins.
|
|
243
|
-
*
|
|
244
|
-
* @param pref - The stored preference.
|
|
245
|
-
* @param osReducedMotion - Whether the OS asks for reduced motion.
|
|
246
|
-
*/
|
|
247
|
-
export function resolveMotion(pref: MotionPreference, osReducedMotion: boolean): 'off' | 'reduced' | 'full' {
|
|
248
|
-
if (pref === 'system') {
|
|
249
|
-
return osReducedMotion ? 'reduced' : 'full';
|
|
250
|
-
}
|
|
251
|
-
return pref;
|
|
252
|
-
}
|
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Preferences and the pre-paint snapshot kept in a `Storage`
|
|
3
|
-
* (`localStorage`): the desktop app's and the web app's. Every storage call is
|
|
4
|
-
* guarded: a storage that throws (disabled, full, missing) reads as empty and
|
|
5
|
-
* drops writes, and the UI never notices.
|
|
6
|
-
*/
|
|
7
|
-
import type { AppearanceBoot, AppearancePrefs, BootSnapshot } from './host';
|
|
8
|
-
import { DEFAULT_APPEARANCE, parseAppearance, type AppearanceState, type ParseAppearanceOptions } from './prefs';
|
|
9
|
-
|
|
10
|
-
/** The key the preferences live under. */
|
|
11
|
-
export const APPEARANCE_STORAGE_KEY = 'zg:appearance:v1';
|
|
12
|
-
|
|
13
|
-
/** The key the pre-paint snapshot lives under. A page's inline script replays it before any bundle loads. */
|
|
14
|
-
export const BOOT_SNAPSHOT_KEY = 'zg:appearance:boot:v1';
|
|
15
|
-
|
|
16
|
-
/** The `Storage` calls the appearance stores make (`localStorage` or a double). */
|
|
17
|
-
export type AppearanceStorage = Pick<Storage, 'getItem' | 'setItem'>;
|
|
18
|
-
|
|
19
|
-
/** Options of {@link createStorageAppearancePrefs}. */
|
|
20
|
-
export interface StorageAppearancePrefsOptions extends ParseAppearanceOptions {
|
|
21
|
-
/** Where the preferences live. */
|
|
22
|
-
storage: AppearanceStorage;
|
|
23
|
-
/** The key. Default: {@link APPEARANCE_STORAGE_KEY}. */
|
|
24
|
-
key?: string;
|
|
25
|
-
/**
|
|
26
|
-
* Calls `onChange` when another window changed the stored preferences; returns the unsubscribe. Default: the
|
|
27
|
-
* `storage` event of `window`, when there is one.
|
|
28
|
-
*/
|
|
29
|
-
watch?: (key: string, onChange: () => void) => () => void;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
function watchWindow(key: string, onChange: () => void): () => void {
|
|
33
|
-
if (typeof window === 'undefined') return () => {};
|
|
34
|
-
const listener = (e: StorageEvent) => {
|
|
35
|
-
if (e.key === key) onChange();
|
|
36
|
-
};
|
|
37
|
-
window.addEventListener('storage', listener);
|
|
38
|
-
return () => window.removeEventListener('storage', listener);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Appearance preferences kept in a `Storage` under one key, read on first use and validated with `parseAppearance`.
|
|
43
|
-
* Another window's change (the `storage` event) is adopted and announced.
|
|
44
|
-
*
|
|
45
|
-
* @param options - The storage, the key and how to check code theme ids.
|
|
46
|
-
*/
|
|
47
|
-
export function createStorageAppearancePrefs(options: StorageAppearancePrefsOptions): AppearancePrefs {
|
|
48
|
-
const { storage, key = APPEARANCE_STORAGE_KEY, watch = watchWindow } = options;
|
|
49
|
-
let state: AppearanceState | undefined;
|
|
50
|
-
/** True when nothing was stored yet. */
|
|
51
|
-
let firstRun = false;
|
|
52
|
-
const listeners = new Set<() => void>();
|
|
53
|
-
|
|
54
|
-
const load = (): AppearanceState => {
|
|
55
|
-
if (!state) {
|
|
56
|
-
let stored: AppearanceState | undefined;
|
|
57
|
-
try {
|
|
58
|
-
const raw = storage.getItem(key);
|
|
59
|
-
stored = raw === null ? undefined : parseAppearance(raw, options);
|
|
60
|
-
} catch {
|
|
61
|
-
stored = undefined;
|
|
62
|
-
}
|
|
63
|
-
firstRun = stored === undefined;
|
|
64
|
-
state = stored ?? DEFAULT_APPEARANCE;
|
|
65
|
-
}
|
|
66
|
-
return state;
|
|
67
|
-
};
|
|
68
|
-
const notify = () => {
|
|
69
|
-
for (const l of [...listeners]) l();
|
|
70
|
-
};
|
|
71
|
-
|
|
72
|
-
const prefs: AppearancePrefs = {
|
|
73
|
-
get: load,
|
|
74
|
-
subscribe(onChange) {
|
|
75
|
-
listeners.add(onChange);
|
|
76
|
-
return () => {
|
|
77
|
-
listeners.delete(onChange);
|
|
78
|
-
};
|
|
79
|
-
},
|
|
80
|
-
set(update) {
|
|
81
|
-
const prev = load();
|
|
82
|
-
const next = typeof update === 'function' ? update(prev) : { ...prev, ...update, version: prev.version };
|
|
83
|
-
if (JSON.stringify(prev) === JSON.stringify(next)) return;
|
|
84
|
-
state = next;
|
|
85
|
-
firstRun = false;
|
|
86
|
-
try {
|
|
87
|
-
storage.setItem(key, JSON.stringify(next));
|
|
88
|
-
} catch {
|
|
89
|
-
// Non-fatal: the next launch falls back to the defaults.
|
|
90
|
-
}
|
|
91
|
-
notify();
|
|
92
|
-
},
|
|
93
|
-
reset() {
|
|
94
|
-
prefs.set(() => DEFAULT_APPEARANCE);
|
|
95
|
-
},
|
|
96
|
-
isFirstRun() {
|
|
97
|
-
load();
|
|
98
|
-
return firstRun;
|
|
99
|
-
},
|
|
100
|
-
};
|
|
101
|
-
|
|
102
|
-
// Another window (a standalone session window) changed the appearance: adopt it.
|
|
103
|
-
watch(key, () => {
|
|
104
|
-
state = undefined;
|
|
105
|
-
notify();
|
|
106
|
-
});
|
|
107
|
-
return prefs;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
/**
|
|
111
|
-
* The pre-paint snapshot kept in a `Storage` as a flat JSON blob (`{ appearance, vars }`), so the page's inline
|
|
112
|
-
* script needs no logic beyond `setProperty`.
|
|
113
|
-
*
|
|
114
|
-
* @param storage - Where to keep it, such as `localStorage`.
|
|
115
|
-
* @param key - The key. Default: {@link BOOT_SNAPSHOT_KEY}.
|
|
116
|
-
*/
|
|
117
|
-
export function createStorageBoot(storage: AppearanceStorage, key: string = BOOT_SNAPSHOT_KEY): AppearanceBoot {
|
|
118
|
-
return {
|
|
119
|
-
write(snapshot: BootSnapshot) {
|
|
120
|
-
try {
|
|
121
|
-
storage.setItem(key, JSON.stringify(snapshot));
|
|
122
|
-
} catch {
|
|
123
|
-
// Non-fatal: the first paint falls back to the stylesheet.
|
|
124
|
-
}
|
|
125
|
-
},
|
|
126
|
-
};
|
|
127
|
-
}
|